fixed material track report, Mona_Services HTTP call, and COC file generation
This commit is contained in:
committed by
Infineon\StieberD
parent
7762b129af
commit
a8a9e91d04
@ -1,57 +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
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
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
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
@ -1,85 +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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,152 +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
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
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
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
@ -1,415 +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
|
||||
|
||||
|
||||
|
||||
|
||||
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
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,139 +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
|
||||
|
||||
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
|
||||
|
||||
|
@ -1,140 +1,140 @@
|
||||
Function Dakota_Test_Events(CtrlEntId, Event, @PARAMS)
|
||||
/***********************************************************************************************************************
|
||||
|
||||
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 Infineon.
|
||||
|
||||
Name : NDW_Main_Events
|
||||
|
||||
Description : This function acts as a commuter module for all events related to this window.
|
||||
|
||||
Notes : Commuter Modules are automatically called from the Promoted_Events function which is called by the
|
||||
application-specific promoted event handler. This makes it possible to add QuickEvents that need to
|
||||
execute Basic+ logic without having use the Form Designer to make the association, although this is
|
||||
limited to the events which are currently promoted.
|
||||
|
||||
If the form needs to call the commuter module directly then the QuickEvent parameters should be
|
||||
formatted like this:
|
||||
|
||||
'@SELF','@EVENT',['@PARAM1','@PARAMx']
|
||||
|
||||
Parameters :
|
||||
CtrlEntId [in] -- The fully qualified name of the control calling the promoted event
|
||||
Event [in] -- The event being executed. See the Notes section regarding "PRE" events
|
||||
Param1-15 [in] -- Additional event parameter holders
|
||||
EventFlow [out] -- Set to 1 or 0 so the calling event knows whether or not to chain forward. See comments in
|
||||
EVENT_SETUP insert
|
||||
|
||||
History : (Date, Initials, Notes)
|
||||
05/08/18 dmb Created initial commuter module.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
#Window DAKOTA_TEST
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert EVENT_SETUP
|
||||
|
||||
|
||||
SubclassInfo = Form_Services('FindSubclassControl')
|
||||
Subclass = SubclassInfo<1>
|
||||
|
||||
// Update the arguments so that the OpenInsight OLE event will treate the ActiveX event as a native event handler.
|
||||
If Event EQ 'OLE' then
|
||||
Transfer Event to OIEvent
|
||||
Transfer Param1 to Event
|
||||
Transfer Param2 to Param1
|
||||
Transfer Param3 to Param2
|
||||
Transfer Param4 to Param3
|
||||
Transfer Param5 to Param4
|
||||
Transfer Param6 to Param5
|
||||
Transfer Param7 to Param6
|
||||
Transfer Param8 to Param7
|
||||
end
|
||||
|
||||
|
||||
GoToEvent Event for CtrlEntID
|
||||
|
||||
Return EventFlow else EVENT_CONTINUE$
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Events
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Event WINDOW.CREATE(CreateParam)
|
||||
|
||||
Gosub Setup_OLE_Controls
|
||||
|
||||
end event
|
||||
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Setup_OLE_Controls:
|
||||
|
||||
Qualify = ''
|
||||
Qualify<1> = 1
|
||||
Qualify<4> = 0
|
||||
|
||||
FontArray = ''
|
||||
ColorFill = ''
|
||||
FontArray<1, 1, 2> = 11
|
||||
Send_Message(@Window : '.OLE_WIP_STATUS', 'QUALIFY_EVENT', 'OLE.OnClick', Qualify)
|
||||
Set_Property(@Window:".OLE_WIP_STATUS", "OLE.Font", FontArray)
|
||||
ColorFill<1> = "White"
|
||||
ColorFill<2> = "White"
|
||||
ColorFill<3> = "White"
|
||||
ColorFill<5> = "White"
|
||||
Set_Property(@Window:".OLE_WIP_STATUS", "OLE.ForeColor", ColorFill)
|
||||
ColorFill = ''
|
||||
ColorFill<1> = "Vertical(Gradient(RGB(10, 130, 118), (10, 130, 118)),Border(RGB(10, 130, 118)),Rounded(1))"
|
||||
ColorFill<2> = "Vertical(Gradient(RGB(10, 130, 118) L=40, RGB(10, 130, 118) L=40), Border(RGB(10, 130, 118)),Rounded(1))"
|
||||
ColorFill<3> = "Vertical(Gradient(RGB(10, 130, 118) L=20, RGB(10, 130, 118) L=20), Border(RGB(10, 130, 118)),Rounded(1))"
|
||||
ColorFill<5> = "Vertical(Gradient(RGB(10, 130, 118), (10, 130, 118)),Border(RGB(10, 130, 118)),Rounded(1))"
|
||||
Set_Property(@Window : '.OLE_WIP_STATUS', "OLE.Background", ColorFill)
|
||||
Set_Property(@Window:".OLE_WIP_STATUS", "OLE.Caption", "WIP Status")
|
||||
|
||||
ColorFill = ''
|
||||
Send_Message(@Window : '.OLE_RDS', 'QUALIFY_EVENT', 'OLE.OnClick', Qualify)
|
||||
Set_Property(@Window:".OLE_RDS", "OLE.Font", FontArray)
|
||||
ColorFill<1> = "White"
|
||||
ColorFill<2> = "White"
|
||||
ColorFill<3> = "White"
|
||||
ColorFill<5> = "White"
|
||||
Set_Property(@Window:".OLE_RDS", "OLE.ForeColor", ColorFill)
|
||||
ColorFill = ''
|
||||
ColorFill<1> = "Vertical(Gradient(RGB(10, 130, 118), (10, 130, 118)),Border(RGB(10, 130, 118)),Rounded(1))"
|
||||
ColorFill<2> = "Vertical(Gradient(RGB(10, 130, 118) L=40, RGB(10, 130, 118) L=40), Border(RGB(10, 130, 118)),Rounded(1))"
|
||||
ColorFill<3> = "Vertical(Gradient(RGB(10, 130, 118) L=20, RGB(10, 130, 118) L=20), Border(RGB(10, 130, 118)),Rounded(1))"
|
||||
ColorFill<5> = "Vertical(Gradient(RGB(10, 130, 118), (10, 130, 118)),Border(RGB(10, 130, 118)),Rounded(1))"
|
||||
Set_Property(@Window : '.OLE_RDS', "OLE.Background", ColorFill)
|
||||
Set_Property(@Window:".OLE_RDS", "OLE.Caption", "RDS")
|
||||
|
||||
ColorFill = ''
|
||||
Send_Message(@Window : '.OLE_WM_OUT', 'QUALIFY_EVENT', 'OLE.OnClick', Qualify)
|
||||
Set_Property(@Window:".OLE_WM_OUT", "OLE.Font", FontArray)
|
||||
ColorFill<1> = "White"
|
||||
ColorFill<2> = "White"
|
||||
ColorFill<3> = "White"
|
||||
ColorFill<5> = "White"
|
||||
Set_Property(@Window:".OLE_WM_OUT", "OLE.ForeColor", ColorFill)
|
||||
ColorFill = ''
|
||||
ColorFill<1> = "Vertical(Gradient(RGB(10, 130, 118), (10, 130, 118)),Border(RGB(10, 130, 118)),Rounded(1))"
|
||||
ColorFill<2> = "Vertical(Gradient(RGB(10, 130, 118) L=40, RGB(10, 130, 118) L=40), Border(RGB(10, 130, 118)),Rounded(1))"
|
||||
ColorFill<3> = "Vertical(Gradient(RGB(10, 130, 118) L=20, RGB(10, 130, 118) L=20), Border(RGB(10, 130, 118)),Rounded(1))"
|
||||
ColorFill<5> = "Vertical(Gradient(RGB(10, 130, 118), (10, 130, 118)),Border(RGB(10, 130, 118)),Rounded(1))"
|
||||
Set_Property(@Window : '.OLE_WM_OUT', "OLE.Background", ColorFill)
|
||||
Set_Property(@Window:".OLE_WM_OUT", "OLE.Caption", "WM Out")
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Function Dakota_Test_Events(CtrlEntId, Event, @PARAMS)
|
||||
/***********************************************************************************************************************
|
||||
|
||||
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 Infineon.
|
||||
|
||||
Name : NDW_Main_Events
|
||||
|
||||
Description : This function acts as a commuter module for all events related to this window.
|
||||
|
||||
Notes : Commuter Modules are automatically called from the Promoted_Events function which is called by the
|
||||
application-specific promoted event handler. This makes it possible to add QuickEvents that need to
|
||||
execute Basic+ logic without having use the Form Designer to make the association, although this is
|
||||
limited to the events which are currently promoted.
|
||||
|
||||
If the form needs to call the commuter module directly then the QuickEvent parameters should be
|
||||
formatted like this:
|
||||
|
||||
'@SELF','@EVENT',['@PARAM1','@PARAMx']
|
||||
|
||||
Parameters :
|
||||
CtrlEntId [in] -- The fully qualified name of the control calling the promoted event
|
||||
Event [in] -- The event being executed. See the Notes section regarding "PRE" events
|
||||
Param1-15 [in] -- Additional event parameter holders
|
||||
EventFlow [out] -- Set to 1 or 0 so the calling event knows whether or not to chain forward. See comments in
|
||||
EVENT_SETUP insert
|
||||
|
||||
History : (Date, Initials, Notes)
|
||||
05/08/18 dmb Created initial commuter module.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
#Window DAKOTA_TEST
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert EVENT_SETUP
|
||||
|
||||
|
||||
SubclassInfo = Form_Services('FindSubclassControl')
|
||||
Subclass = SubclassInfo<1>
|
||||
|
||||
// Update the arguments so that the OpenInsight OLE event will treate the ActiveX event as a native event handler.
|
||||
If Event EQ 'OLE' then
|
||||
Transfer Event to OIEvent
|
||||
Transfer Param1 to Event
|
||||
Transfer Param2 to Param1
|
||||
Transfer Param3 to Param2
|
||||
Transfer Param4 to Param3
|
||||
Transfer Param5 to Param4
|
||||
Transfer Param6 to Param5
|
||||
Transfer Param7 to Param6
|
||||
Transfer Param8 to Param7
|
||||
end
|
||||
|
||||
|
||||
GoToEvent Event for CtrlEntID
|
||||
|
||||
Return EventFlow else EVENT_CONTINUE$
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Events
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Event WINDOW.CREATE(CreateParam)
|
||||
|
||||
Gosub Setup_OLE_Controls
|
||||
|
||||
end event
|
||||
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Setup_OLE_Controls:
|
||||
|
||||
Qualify = ''
|
||||
Qualify<1> = 1
|
||||
Qualify<4> = 0
|
||||
|
||||
FontArray = ''
|
||||
ColorFill = ''
|
||||
FontArray<1, 1, 2> = 11
|
||||
Send_Message(@Window : '.OLE_WIP_STATUS', 'QUALIFY_EVENT', 'OLE.OnClick', Qualify)
|
||||
Set_Property(@Window:".OLE_WIP_STATUS", "OLE.Font", FontArray)
|
||||
ColorFill<1> = "White"
|
||||
ColorFill<2> = "White"
|
||||
ColorFill<3> = "White"
|
||||
ColorFill<5> = "White"
|
||||
Set_Property(@Window:".OLE_WIP_STATUS", "OLE.ForeColor", ColorFill)
|
||||
ColorFill = ''
|
||||
ColorFill<1> = "Vertical(Gradient(RGB(10, 130, 118), (10, 130, 118)),Border(RGB(10, 130, 118)),Rounded(1))"
|
||||
ColorFill<2> = "Vertical(Gradient(RGB(10, 130, 118) L=40, RGB(10, 130, 118) L=40), Border(RGB(10, 130, 118)),Rounded(1))"
|
||||
ColorFill<3> = "Vertical(Gradient(RGB(10, 130, 118) L=20, RGB(10, 130, 118) L=20), Border(RGB(10, 130, 118)),Rounded(1))"
|
||||
ColorFill<5> = "Vertical(Gradient(RGB(10, 130, 118), (10, 130, 118)),Border(RGB(10, 130, 118)),Rounded(1))"
|
||||
Set_Property(@Window : '.OLE_WIP_STATUS', "OLE.Background", ColorFill)
|
||||
Set_Property(@Window:".OLE_WIP_STATUS", "OLE.Caption", "WIP Status")
|
||||
|
||||
ColorFill = ''
|
||||
Send_Message(@Window : '.OLE_RDS', 'QUALIFY_EVENT', 'OLE.OnClick', Qualify)
|
||||
Set_Property(@Window:".OLE_RDS", "OLE.Font", FontArray)
|
||||
ColorFill<1> = "White"
|
||||
ColorFill<2> = "White"
|
||||
ColorFill<3> = "White"
|
||||
ColorFill<5> = "White"
|
||||
Set_Property(@Window:".OLE_RDS", "OLE.ForeColor", ColorFill)
|
||||
ColorFill = ''
|
||||
ColorFill<1> = "Vertical(Gradient(RGB(10, 130, 118), (10, 130, 118)),Border(RGB(10, 130, 118)),Rounded(1))"
|
||||
ColorFill<2> = "Vertical(Gradient(RGB(10, 130, 118) L=40, RGB(10, 130, 118) L=40), Border(RGB(10, 130, 118)),Rounded(1))"
|
||||
ColorFill<3> = "Vertical(Gradient(RGB(10, 130, 118) L=20, RGB(10, 130, 118) L=20), Border(RGB(10, 130, 118)),Rounded(1))"
|
||||
ColorFill<5> = "Vertical(Gradient(RGB(10, 130, 118), (10, 130, 118)),Border(RGB(10, 130, 118)),Rounded(1))"
|
||||
Set_Property(@Window : '.OLE_RDS', "OLE.Background", ColorFill)
|
||||
Set_Property(@Window:".OLE_RDS", "OLE.Caption", "RDS")
|
||||
|
||||
ColorFill = ''
|
||||
Send_Message(@Window : '.OLE_WM_OUT', 'QUALIFY_EVENT', 'OLE.OnClick', Qualify)
|
||||
Set_Property(@Window:".OLE_WM_OUT", "OLE.Font", FontArray)
|
||||
ColorFill<1> = "White"
|
||||
ColorFill<2> = "White"
|
||||
ColorFill<3> = "White"
|
||||
ColorFill<5> = "White"
|
||||
Set_Property(@Window:".OLE_WM_OUT", "OLE.ForeColor", ColorFill)
|
||||
ColorFill = ''
|
||||
ColorFill<1> = "Vertical(Gradient(RGB(10, 130, 118), (10, 130, 118)),Border(RGB(10, 130, 118)),Rounded(1))"
|
||||
ColorFill<2> = "Vertical(Gradient(RGB(10, 130, 118) L=40, RGB(10, 130, 118) L=40), Border(RGB(10, 130, 118)),Rounded(1))"
|
||||
ColorFill<3> = "Vertical(Gradient(RGB(10, 130, 118) L=20, RGB(10, 130, 118) L=20), Border(RGB(10, 130, 118)),Rounded(1))"
|
||||
ColorFill<5> = "Vertical(Gradient(RGB(10, 130, 118), (10, 130, 118)),Border(RGB(10, 130, 118)),Rounded(1))"
|
||||
Set_Property(@Window : '.OLE_WM_OUT', "OLE.Background", ColorFill)
|
||||
Set_Property(@Window:".OLE_WM_OUT", "OLE.Caption", "WM Out")
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -258,6 +258,7 @@ RETURN
|
||||
TxShipments:
|
||||
* * * * * * *
|
||||
|
||||
|
||||
CtrlEntID = @WINDOW:'.TX_SHIP'
|
||||
|
||||
ShipNos = Get_Property(@WINDOW:'.TX_SHIP','DEFPROP')<COL$SHIP_NO>
|
||||
|
@ -1,97 +1,97 @@
|
||||
Function Engineinfo_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 : Engineinfo_API
|
||||
|
||||
Description : API logic for the Engineinfo 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 Engineinfo[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Engineinfo.POST
|
||||
- Engineinfo.ID.PUT
|
||||
- Engineinfo.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 xxx Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert API_SETUP
|
||||
$insert HTTP_INSERTS
|
||||
$insert ENGINE_HEALTH_EQUATES
|
||||
|
||||
Declare function System_Healthcheck_Services
|
||||
|
||||
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 remotehealthcheck.HEAD
|
||||
API remotehealthcheck.GET
|
||||
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
|
||||
API engineinfo.HEAD
|
||||
API engineinfo.GET
|
||||
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
|
||||
API engineinfo.ID.HEAD
|
||||
API engineinfo.ID.GET
|
||||
|
||||
EngineID = EndpointSegment
|
||||
If RowExists('APP_INFO', EngineID) then
|
||||
EngineHealthInfo = System_Healthcheck_Services('GetEngineHealthInfo', EngineID)
|
||||
If Error_Services('NoError') then
|
||||
EngineJSON = System_Healthcheck_Services('ConvertEngineHealthInfoToJSON', EngineHealthInfo, FullEndpointURL)
|
||||
ResponseCode = 200
|
||||
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||
HTTP_Services('SetResponseBody', EngineJSON, False$, 'application/hal+json')
|
||||
HTTP_Services('SetResponseStatus', ResponseCode)
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 500, Error_Services('GetMessage'))
|
||||
end
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 401, 'Invalid Engine ID.')
|
||||
end
|
||||
|
||||
end api
|
||||
|
||||
Function Engineinfo_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 : Engineinfo_API
|
||||
|
||||
Description : API logic for the Engineinfo 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 Engineinfo[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Engineinfo.POST
|
||||
- Engineinfo.ID.PUT
|
||||
- Engineinfo.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 xxx Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert API_SETUP
|
||||
$insert HTTP_INSERTS
|
||||
$insert ENGINE_HEALTH_EQUATES
|
||||
|
||||
Declare function System_Healthcheck_Services
|
||||
|
||||
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 remotehealthcheck.HEAD
|
||||
API remotehealthcheck.GET
|
||||
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
|
||||
API engineinfo.HEAD
|
||||
API engineinfo.GET
|
||||
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
|
||||
API engineinfo.ID.HEAD
|
||||
API engineinfo.ID.GET
|
||||
|
||||
EngineID = EndpointSegment
|
||||
If RowExists('APP_INFO', EngineID) then
|
||||
EngineHealthInfo = System_Healthcheck_Services('GetEngineHealthInfo', EngineID)
|
||||
If Error_Services('NoError') then
|
||||
EngineJSON = System_Healthcheck_Services('ConvertEngineHealthInfoToJSON', EngineHealthInfo, FullEndpointURL)
|
||||
ResponseCode = 200
|
||||
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||
HTTP_Services('SetResponseBody', EngineJSON, False$, 'application/hal+json')
|
||||
HTTP_Services('SetResponseStatus', ResponseCode)
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 500, Error_Services('GetMessage'))
|
||||
end
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 401, 'Invalid Engine ID.')
|
||||
end
|
||||
|
||||
end api
|
||||
|
||||
|
@ -1,72 +1,72 @@
|
||||
Function Healthinfo_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 : Healthinfo_API
|
||||
|
||||
Description : API logic for the Healthinfo 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 Healthinfo[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Healthinfo.POST
|
||||
- Healthinfo.ID.PUT
|
||||
- Healthinfo.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 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', 200, 'This is a valid endpoint but a web API handler has not yet been created.')
|
||||
end
|
||||
|
||||
Return Response OR ''
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Endpoint Handlers
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
API remotehealthcheck.HEAD
|
||||
API remotehealthcheck.GET
|
||||
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
|
||||
API healthinfo.HEAD
|
||||
API healthinfo.GET
|
||||
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
Function Healthinfo_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 : Healthinfo_API
|
||||
|
||||
Description : API logic for the Healthinfo 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 Healthinfo[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Healthinfo.POST
|
||||
- Healthinfo.ID.PUT
|
||||
- Healthinfo.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 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', 200, 'This is a valid endpoint but a web API handler has not yet been created.')
|
||||
end
|
||||
|
||||
Return Response OR ''
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Endpoint Handlers
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
API remotehealthcheck.HEAD
|
||||
API remotehealthcheck.GET
|
||||
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
|
||||
API healthinfo.HEAD
|
||||
API healthinfo.GET
|
||||
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
|
@ -39,6 +39,27 @@ Return Response or ""
|
||||
// SERVICES
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Service UpdateYesterdayAvail()
|
||||
Today = 20702
|
||||
DataArray = ''
|
||||
//ASM Reactors
|
||||
ASMRecordKey = 'ASM*': Today
|
||||
ASMUptimeRec = Reactor_Services('GetReactorUptimeMetricsByTypeAndTimeSpan', Today, Today + 1, 'ASM')
|
||||
Database_Services('WriteDataRow', 'REACTOR_DAILY_UPTIME', ASMRecordKey, ASMUptimeRec, True$, False$, True$)
|
||||
//HTR Reactors
|
||||
HTRRecordKey = 'HTR*': Today
|
||||
HTRUptimeRec = Reactor_Services('GetReactorUptimeMetricsByTypeAndTimeSpan', Today, Today + 1, 'HTR')
|
||||
Database_Services('WriteDataRow', 'REACTOR_DAILY_UPTIME', HTRRecordKey, HTRUptimeRec, True$, False$, True$)
|
||||
//EPP Reactors
|
||||
EPPRecordKey = 'EPP*': Today
|
||||
EPPUptimeRec = Reactor_Services('GetReactorUptimeMetricsByTypeAndTimeSpan', Today, Today + 1, 'EPP')
|
||||
Database_Services('WriteDataRow', 'REACTOR_DAILY_UPTIME', EPPRecordKey, EPPUptimeRec, True$, False$, True$)
|
||||
//All Reactors
|
||||
ALLRecordKey = 'ALL*': Today
|
||||
ALLUptimeRec = Reactor_Services('GetReactorUptimeMetricsByTypeAndTimeSpan', Today, Today + 1, 'ALL')
|
||||
Database_Services('WriteDataRow', 'REACTOR_DAILY_UPTIME', ALLRecordKey, ALLUptimeRec, True$, False$, True$)
|
||||
end service
|
||||
|
||||
Service GetReactorNumbersByType()
|
||||
Debug
|
||||
test = Reactor_Services('GetReactorNumbers', 'ASM')
|
||||
|
@ -1,167 +1,167 @@
|
||||
Function Lock_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 : Lock_API
|
||||
|
||||
Description : API logic for the Lock 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 Lock[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Lock.POST
|
||||
- Lock.ID.PUT
|
||||
- Lock.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 djm Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert API_SETUP
|
||||
$insert HTTP_INSERTS
|
||||
|
||||
Declare function Database_Services, Oi_Wizard_Services, Memberof, Lock_Services
|
||||
Declare subroutine Lock_Services
|
||||
|
||||
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 Lock.HEAD
|
||||
|
||||
|
||||
// GET Method removed until RTI_LH_Info(CMD_LOCKS_INFO$, '') is fixed ////////////////////////////////
|
||||
|
||||
* API Lock.GET
|
||||
*
|
||||
* OIWizardID = ''
|
||||
* Cookies = HTTP_Services('GetHTTPCookie')
|
||||
* For each Cookie in Cookies using ';'
|
||||
* Key = Trim(Field(Cookie, '=', 1))
|
||||
* If Key EQ 'sessionID' then
|
||||
* OIWizardID = Field(Cookie, '=', 2)
|
||||
* end
|
||||
* If Key EQ 'userID' then
|
||||
* CurrUser = Field(Cookie, '=', 2)
|
||||
* end
|
||||
* Next Cookie
|
||||
*
|
||||
* ValidSession = OI_Wizard_Services('ValidateSession', OIWizardID)
|
||||
*
|
||||
* If ValidSession then
|
||||
*
|
||||
* Allowed = Lock_Services("GetLockPermissions", CurrUser)
|
||||
*
|
||||
* If Allowed NE FALSE$ then
|
||||
*
|
||||
* StatusCode = 200
|
||||
* LockJSON = Lock_Services("GetAllowedLocks", CurrUser)
|
||||
*
|
||||
* If Error_Services('NoError') then
|
||||
* HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||
* HTTP_Services('SetResponseBody', LockJSON, False$, 'application/hal+json')
|
||||
* If Assigned(Message) then
|
||||
* HTTP_Services('SetResponseStatus', StatusCode, Message)
|
||||
* end else
|
||||
* HTTP_Services('SetResponseStatus', StatusCode)
|
||||
* end
|
||||
* end else
|
||||
* Message = Error_Services('GetMessage')
|
||||
* HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
|
||||
* end
|
||||
* End Else
|
||||
* HTTP_Services('SetResponseStatus', 403, 'User is not permitted to access this resource.')
|
||||
* end
|
||||
* End else
|
||||
* HTTP_Services('SetResponseStatus', 401, 'User must be signed in to access this resource.')
|
||||
* end
|
||||
*
|
||||
* end api
|
||||
|
||||
|
||||
API Lock.POST
|
||||
|
||||
OIWizardID = ''
|
||||
Cookies = HTTP_Services('GetHTTPCookie')
|
||||
For each Cookie in Cookies using ';'
|
||||
Key = Trim(Field(Cookie, '=', 1))
|
||||
If Key EQ 'sessionID' then
|
||||
OIWizardID = Field(Cookie, '=', 2)
|
||||
end
|
||||
If Key EQ 'userID' then
|
||||
CurrUser = Field(Cookie, '=', 2)
|
||||
end
|
||||
Next Cookie
|
||||
|
||||
ValidSession = OI_Wizard_Services('ValidateSession', OIWizardID)
|
||||
|
||||
If ValidSession then
|
||||
Allowed = Lock_Services("GetLockPermissions", CurrUser)
|
||||
|
||||
If Allowed NE FALSE$ then
|
||||
StatusCode = ''
|
||||
Body = HTTP_Services('GetHTTPPostString', True$)
|
||||
// The POST string will have been encoded so use percent (URL) decoding.
|
||||
DecodedJSON = HTTP_Services('DecodePercentString', Body)
|
||||
If SRP_JSON(objBody, 'Parse', Body) EQ '' then
|
||||
Table = SRP_JSON(objBody, 'GetValue', 'table')
|
||||
Key = SRP_JSON(objBody, 'GetValue', 'key')
|
||||
SRP_JSON(objBody, 'Release')
|
||||
end
|
||||
|
||||
If (Table NE '') AND (Key NE '') then
|
||||
Result = Lock_Services("AttemptUnlock",CurrUser, Table, Key)
|
||||
If Result EQ TRUE$ then
|
||||
HTTP_Services('SetResponseStatus', 200, 'Record successfully unlocked.')
|
||||
Lock_Services("LogUnlockRequest", Table, Key, CurrUser, TRUE$)
|
||||
end else
|
||||
ErrCode = Error_Services('GetMessage')
|
||||
HTTP_Services('SetResponseStatus', 500, ErrCode)
|
||||
Lock_Services("LogUnlockRequest", Table, Key, CurrUser, FALSE$)
|
||||
end
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 400, 'The table or key property is missing.')
|
||||
end
|
||||
End Else
|
||||
HTTP_Services('SetResponseStatus', 403, 'User is not permitted to access this resource.')
|
||||
end
|
||||
End else
|
||||
HTTP_Services('SetResponseStatus', 401, 'User must be signed in to access this resource.')
|
||||
end
|
||||
|
||||
end api
|
||||
|
||||
|
||||
|
||||
|
||||
Function Lock_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 : Lock_API
|
||||
|
||||
Description : API logic for the Lock 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 Lock[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Lock.POST
|
||||
- Lock.ID.PUT
|
||||
- Lock.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 djm Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert API_SETUP
|
||||
$insert HTTP_INSERTS
|
||||
|
||||
Declare function Database_Services, Oi_Wizard_Services, Memberof, Lock_Services
|
||||
Declare subroutine Lock_Services
|
||||
|
||||
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 Lock.HEAD
|
||||
|
||||
|
||||
// GET Method removed until RTI_LH_Info(CMD_LOCKS_INFO$, '') is fixed ////////////////////////////////
|
||||
|
||||
* API Lock.GET
|
||||
*
|
||||
* OIWizardID = ''
|
||||
* Cookies = HTTP_Services('GetHTTPCookie')
|
||||
* For each Cookie in Cookies using ';'
|
||||
* Key = Trim(Field(Cookie, '=', 1))
|
||||
* If Key EQ 'sessionID' then
|
||||
* OIWizardID = Field(Cookie, '=', 2)
|
||||
* end
|
||||
* If Key EQ 'userID' then
|
||||
* CurrUser = Field(Cookie, '=', 2)
|
||||
* end
|
||||
* Next Cookie
|
||||
*
|
||||
* ValidSession = OI_Wizard_Services('ValidateSession', OIWizardID)
|
||||
*
|
||||
* If ValidSession then
|
||||
*
|
||||
* Allowed = Lock_Services("GetLockPermissions", CurrUser)
|
||||
*
|
||||
* If Allowed NE FALSE$ then
|
||||
*
|
||||
* StatusCode = 200
|
||||
* LockJSON = Lock_Services("GetAllowedLocks", CurrUser)
|
||||
*
|
||||
* If Error_Services('NoError') then
|
||||
* HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||
* HTTP_Services('SetResponseBody', LockJSON, False$, 'application/hal+json')
|
||||
* If Assigned(Message) then
|
||||
* HTTP_Services('SetResponseStatus', StatusCode, Message)
|
||||
* end else
|
||||
* HTTP_Services('SetResponseStatus', StatusCode)
|
||||
* end
|
||||
* end else
|
||||
* Message = Error_Services('GetMessage')
|
||||
* HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
|
||||
* end
|
||||
* End Else
|
||||
* HTTP_Services('SetResponseStatus', 403, 'User is not permitted to access this resource.')
|
||||
* end
|
||||
* End else
|
||||
* HTTP_Services('SetResponseStatus', 401, 'User must be signed in to access this resource.')
|
||||
* end
|
||||
*
|
||||
* end api
|
||||
|
||||
|
||||
API Lock.POST
|
||||
|
||||
OIWizardID = ''
|
||||
Cookies = HTTP_Services('GetHTTPCookie')
|
||||
For each Cookie in Cookies using ';'
|
||||
Key = Trim(Field(Cookie, '=', 1))
|
||||
If Key EQ 'sessionID' then
|
||||
OIWizardID = Field(Cookie, '=', 2)
|
||||
end
|
||||
If Key EQ 'userID' then
|
||||
CurrUser = Field(Cookie, '=', 2)
|
||||
end
|
||||
Next Cookie
|
||||
|
||||
ValidSession = OI_Wizard_Services('ValidateSession', OIWizardID)
|
||||
|
||||
If ValidSession then
|
||||
Allowed = Lock_Services("GetLockPermissions", CurrUser)
|
||||
|
||||
If Allowed NE FALSE$ then
|
||||
StatusCode = ''
|
||||
Body = HTTP_Services('GetHTTPPostString', True$)
|
||||
// The POST string will have been encoded so use percent (URL) decoding.
|
||||
DecodedJSON = HTTP_Services('DecodePercentString', Body)
|
||||
If SRP_JSON(objBody, 'Parse', Body) EQ '' then
|
||||
Table = SRP_JSON(objBody, 'GetValue', 'table')
|
||||
Key = SRP_JSON(objBody, 'GetValue', 'key')
|
||||
SRP_JSON(objBody, 'Release')
|
||||
end
|
||||
|
||||
If (Table NE '') AND (Key NE '') then
|
||||
Result = Lock_Services("AttemptUnlock",CurrUser, Table, Key)
|
||||
If Result EQ TRUE$ then
|
||||
HTTP_Services('SetResponseStatus', 200, 'Record successfully unlocked.')
|
||||
Lock_Services("LogUnlockRequest", Table, Key, CurrUser, TRUE$)
|
||||
end else
|
||||
ErrCode = Error_Services('GetMessage')
|
||||
HTTP_Services('SetResponseStatus', 500, ErrCode)
|
||||
Lock_Services("LogUnlockRequest", Table, Key, CurrUser, FALSE$)
|
||||
end
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 400, 'The table or key property is missing.')
|
||||
end
|
||||
End Else
|
||||
HTTP_Services('SetResponseStatus', 403, 'User is not permitted to access this resource.')
|
||||
end
|
||||
End else
|
||||
HTTP_Services('SetResponseStatus', 401, 'User must be signed in to access this resource.')
|
||||
end
|
||||
|
||||
end api
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,372 +1,372 @@
|
||||
Compile function Lock_Services(@Service, @Params)
|
||||
/***********************************************************************************************************************
|
||||
|
||||
Name : Lock_Services
|
||||
|
||||
Description : Handler program for all Lock services.
|
||||
|
||||
Notes : Application errors should be logged using the Error Services module. There are a few methodological
|
||||
assumptions built into way errors are managed which are important to understand in order to properly
|
||||
work with Error Services:
|
||||
|
||||
- The term 'top' refers to the originating procedure of a call stack and the term 'bottom' refers to
|
||||
the last routine (or the current routine) within a call stack. Within the OpenInsight Debugger
|
||||
this will appear backwards since the originating procedure always appears at the bottom of the
|
||||
list and the current routine appears at the top of the list. We are using this orientation because
|
||||
it is common to refer to the process of calling other procedures as 'drilling down'.
|
||||
|
||||
- The reason for defining the orientation of the call stack is because Error_Services allows for
|
||||
multiple error conditions to be appended to an original error. In most cases this will happen when
|
||||
a procedure at the bottom of the stack generates an error condition and then returns to its
|
||||
calling procedure. This higher level procedure can optionally add more information relevant to
|
||||
itself. This continues as the call stack 'bubbles' its way back to the top to where the
|
||||
originating procedure is waiting.
|
||||
|
||||
- Native OpenInsight commands that handle errors (e.g., Set_Status, Set_FSError, Set_EventStatus)
|
||||
preserve their error state until explicitly cleared. This can hinder the normal execution of code
|
||||
since subsequent procedures (usually SSPs) will fail if a pre-existing error condition exists.
|
||||
Our philosophy is that error conditions should automatically be cleared before a new procedure
|
||||
is executed to avoid this problem. However, the nature of Basic+ does not make this easy to
|
||||
automate for any given stored procedure. Therefore, if a stored procedure wants to conform to our
|
||||
philosophy then it should include a call into the 'Clear' service request at the top of the
|
||||
program. Alternatively this can be done through a common insert (see SERVICE_SETUP for example.)
|
||||
|
||||
- Service modules will use the SERVICE_SETUP insert and therefore automatically clear out any
|
||||
error conditions that were set before.
|
||||
|
||||
Parameters :
|
||||
Service [in] -- Name of the service being requested
|
||||
Param1-10 [in/out] -- Additional request parameter holders
|
||||
Response [out] -- Response to be sent back to the Controller (MCP) or requesting procedure
|
||||
|
||||
Metadata :
|
||||
|
||||
History : (Date, Initials, Notes)
|
||||
3/18/24 djm Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
#pragma precomp SRP_PreCompiler
|
||||
$insert LOGICAL
|
||||
$Insert SERVICE_SETUP
|
||||
$Insert UNLOCK_REQUESTS_EQUATES
|
||||
$Insert REACT_RUN_EQUATES
|
||||
$Insert WO_MAT_EQUATES
|
||||
$Insert WM_OUT_EQUATES
|
||||
$Insert RDS_EQUATES
|
||||
$Insert RDS_LAYER_EQUATES
|
||||
|
||||
Declare function Database_Services, Oi_Wizard_Services, Memberof, Lock_Services, SRP_Json, List_Volume_Sub, Datetime
|
||||
Declare subroutine SRP_Json, Database_Services
|
||||
|
||||
|
||||
GoToService
|
||||
|
||||
Return Response or ""
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// SERVICES
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// GetLockPermissions
|
||||
//
|
||||
// CurrUser - [Required]
|
||||
//
|
||||
// Returns LockPermissionLevel 0 - No lock access, 1 - Lock access to unprotected tables, or 2 - Lock access to all tables.
|
||||
//
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service GetLockPermissions(CurrUser)
|
||||
|
||||
LockPermissionLevel = 0
|
||||
OIAdmin = Memberof(CurrUser, 'OI_ADMIN')
|
||||
SupervisorLead = MemberOf(CurrUser, 'LEAD') OR MemberOf(CurrUser, 'SUPERVISOR')
|
||||
If OIAdmin then
|
||||
LockPermissionLevel = 2
|
||||
end else
|
||||
If SupervisorLead then
|
||||
LockPermissionLevel = 1
|
||||
end
|
||||
end
|
||||
Response = LockPermissionLevel
|
||||
|
||||
End Service
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// GetAllowedLocks
|
||||
//
|
||||
// CurrUser - [Required]
|
||||
//
|
||||
// Returns an array of accessible locks based on user LockPermissionLevel
|
||||
//
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service GetAllowedLocks(CurrUser)
|
||||
|
||||
LockPermissionLevel = Lock_Services('GetLockPermissions', CurrUser)
|
||||
LockJSON = ''
|
||||
|
||||
If LockPermissionLevel NE 0 then
|
||||
|
||||
LockList = Database_Services('GetUserLocks')
|
||||
If Error_Services('NoError') then
|
||||
If SRP_JSON(objJSON, 'New', 'Object') then
|
||||
If SRP_JSON(LockArray, 'New', 'Array') then
|
||||
For each Row in LockList using @FM setting fPos
|
||||
If Row<0,3> = "Rev30536" then Row<0,3> = 'RDS*LSL2'
|
||||
If Field(Row<0,3>, "*", 2) EQ 'LSL2' OR LockPermissionLevel EQ 2 then
|
||||
If SRP_JSON(objRow, 'New', 'Object') then
|
||||
SRP_JSON(objRow, 'SetValue', 'ComputerName', Row<0, 1>)
|
||||
SRP_JSON(objRow, 'SetValue', 'Volume', Row<0, 2>)
|
||||
If Field(Row<0,3>, "*", 2) EQ 'LSL2' then Row<0,3> = Field(Row<0,3>, "*", 1)
|
||||
SRP_JSON(objRow, 'SetValue', 'OSFile', Row<0, 3>)
|
||||
SRP_JSON(objRow, 'SetValue', 'RecordKey', Row<0, 4>, "String")
|
||||
SRP_JSON(objRow, 'SetValue', 'Exclusive', Row<0, 5>)
|
||||
SRP_JSON(objRow, 'SetValue', 'REVFile', Row<0, 6>)
|
||||
SRP_JSON(LockArray, 'Add', objRow)
|
||||
SRP_JSON(objRow, 'Release')
|
||||
end
|
||||
End
|
||||
Next Row
|
||||
SRP_JSON(objJSON, 'Set', 'Locks', LockArray)
|
||||
SRP_JSON(LockArray, 'Release')
|
||||
end
|
||||
LockJSON = SRP_JSON(objJSON, 'Stringify', 'Styled')
|
||||
SRP_JSON(objJSON, 'Release')
|
||||
end
|
||||
end
|
||||
End
|
||||
|
||||
Response = LockJSON
|
||||
|
||||
End Service
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// AttemptUnlock
|
||||
//
|
||||
// CurrUser - [Required]
|
||||
// LotType - [Required]
|
||||
// Key - [Required]
|
||||
//
|
||||
// Returns either 1 for success, or error message
|
||||
//
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Service AttemptUnlock(CurrUser, LotType, Key)
|
||||
|
||||
LockPermissionLevel = Lock_Services('GetLockPermissions', CurrUser)
|
||||
If LockPermissionLevel NE 0 then
|
||||
If LotType EQ 'RDS' or LotType EQ 'WM_OUT' then
|
||||
If Xlate(LotType, Key, '', 'X', '') NE '' then
|
||||
LockArray = Lock_Services('GetChildRecords', LotType, Key)
|
||||
LockCount = DCount(LockArray<1>, @VM)
|
||||
For I = 1 to LockCount
|
||||
Table = LockArray<1,I>
|
||||
KeyID = LockArray<2,I>
|
||||
Resp = Database_Services('UnlockKeyID', Table, KeyID)
|
||||
Next I
|
||||
If Error_Services('NoError') Then
|
||||
Response = TRUE$
|
||||
end else
|
||||
Response = FALSE$
|
||||
Error_Services('Add', 'Records failed to unlock.')
|
||||
end
|
||||
end else
|
||||
Response = FALSE$
|
||||
Error_Services('Add', 'This record does not exist.')
|
||||
end
|
||||
End Else
|
||||
Response = FALSE$
|
||||
Error_Services('Add', 'LotType must be either RDS or WM_OUT.')
|
||||
end
|
||||
end else
|
||||
Response = FALSE$
|
||||
Error_Services('Add', 'User is not permitted to access this resource.')
|
||||
end
|
||||
|
||||
End Service
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// GetChildRecords
|
||||
//
|
||||
// LotType - [Required]
|
||||
// Key - [Required]
|
||||
//
|
||||
// Returns an array of associated child records for unlocking
|
||||
//
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Service GetChildRecords(LotType, Key)
|
||||
|
||||
RecordArray = ''
|
||||
|
||||
Begin Case
|
||||
|
||||
Case LotType EQ 'RDS'
|
||||
RDSRec = Xlate('RDS', Key, '', 'X', '')
|
||||
If RDSRec NE '' then
|
||||
//Add RDS key
|
||||
RecordArray<1> = LotType
|
||||
RecordArray<2> = Key
|
||||
//Get REACT_RUN record
|
||||
ReactRunRec = Xlate('REACT_RUN', Key, '', 'X', '')
|
||||
//Get and Add CLEAN_INSP keys
|
||||
CINos = ReactRunRec<REACT_RUN_CI_NO$>
|
||||
If CINos NE '' then
|
||||
CICount = Dcount(CINos, @VM)
|
||||
For I = 1 to CICount
|
||||
If CINos<I> NE '' then
|
||||
RecordArray<1,-1> = 'CLEAN_INSP'
|
||||
RecordArray<2,-1> = CINos<I>
|
||||
end
|
||||
Next I
|
||||
end
|
||||
//Get and Add RDS_TEST keys
|
||||
RDSLayerKeys = ReactRunRec<REACT_RUN_RDS_LAYER_KEYS$>
|
||||
If RDSLayerKeys NE '' then
|
||||
LayerKeyCount = DCount(RDSLayerKeys, @VM)
|
||||
For K = 1 to LayerKeyCount
|
||||
RDSTestKeys = Xlate('RDS_LAYER', RDSLayerKeys<K>, 'RDS_TEST_KEYS', 'X', '')
|
||||
If RDSTestKeys NE '' then
|
||||
RDSTestCount = DCount(RDSTestKeys, @VM)
|
||||
For L = 1 to RDSTestCount
|
||||
If RDSTestKeys<K,L> NE '' then
|
||||
RecordArray<1,-1> = 'RDS_TEST'
|
||||
RecordArray<2,-1> = RDSTestKeys<K,L>
|
||||
end
|
||||
Next L
|
||||
end
|
||||
Next K
|
||||
end
|
||||
//Get WO_MAT key
|
||||
WONo = RDSRec<RDS_WO$>
|
||||
CassNo = RDSRec<RDS_CASS_NO$>
|
||||
WOMatKey = WONo : '*' : CassNo
|
||||
//Get and Add WO_MAT_QA
|
||||
WOMatQA = Xlate('WO_MAT_QA', WOMatKey, '', 'X', '')
|
||||
If WOMatQA NE '' then
|
||||
RecordArray<1,-1> = 'WO_MAT_QA'
|
||||
RecordArray<2,-1> = WOMatKey
|
||||
End
|
||||
//Get and Add NCR keys
|
||||
NCRKeys = Xlate('WO_MAT', WOMatKey, 'NCR_KEYS', 'X', '')
|
||||
If NCRKeys NE '' then
|
||||
NCRCount = Dcount(NCRKeys, @VM)
|
||||
For J = 1 to NCRCount
|
||||
If NCRKeys<J> NE '' then
|
||||
RecordArray<1,-1> = 'NCR'
|
||||
RecordArray<2,-1> = NCRKeys<J>
|
||||
end
|
||||
Next J
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'This RDS does not exist.')
|
||||
Return
|
||||
end
|
||||
|
||||
Case LotType EQ 'WM_OUT'
|
||||
WMOutRec = Xlate('WM_OUT', Key, '', 'X', '')
|
||||
If WMOutRec NE '' then
|
||||
//Add WM_OUT key
|
||||
RecordArray<1> = LotType
|
||||
RecordArray<2> = Key
|
||||
//Get and Add CLEAN_INSP keys
|
||||
CINos = WMOutRec<WM_OUT_CI_NO$>
|
||||
If CINos NE '' then
|
||||
CICount = Dcount(CINos, @VM)
|
||||
For I = 1 to CICount
|
||||
If CINos<I> NE '' then
|
||||
RecordArray<1,-1> = 'CLEAN_INSP'
|
||||
RecordArray<2,-1> = CINos<I>
|
||||
end
|
||||
Next I
|
||||
end
|
||||
//Get WO_MAT key
|
||||
WONo = FIELD(Key,'*',1)
|
||||
CassNo = FIELD(Key,'*',3)
|
||||
WOMatKey = WONo : '*' : CassNo
|
||||
//Get and Add WO_MAT_QA key
|
||||
WOMatQA = Xlate('WO_MAT_QA', WOMatKey, '', 'X', '')
|
||||
If WOMatQA NE '' then
|
||||
RecordArray<1,-1> = 'WO_MAT_QA'
|
||||
RecordArray<2,-1> = WOMatKey
|
||||
End
|
||||
//Get and Add NCR keys
|
||||
NCRKeys = Xlate('WO_MAT', WOMatKey, 'NCR_KEYS', 'X', '')
|
||||
If NCRKeys NE '' then
|
||||
NCRCount = Dcount(NCRKeys, @VM)
|
||||
For J = 1 to NCRCount
|
||||
If NCRKeys<J> NE '' then
|
||||
RecordArray<1,-1> = 'NCR'
|
||||
RecordArray<2,-1> = NCRKeys<J>
|
||||
end
|
||||
Next J
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'This WM_OUT does not exist.')
|
||||
end
|
||||
|
||||
Case OTHERWISE$
|
||||
Error_Services('Add', 'LotType must be either RDS or WM_OUT.')
|
||||
return
|
||||
|
||||
End Case
|
||||
|
||||
If RecordArray NE '' then
|
||||
Response = RecordArray
|
||||
end
|
||||
|
||||
End Service
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// GetUnprotectedTables
|
||||
//
|
||||
// Returns an array of unprotected tables
|
||||
//
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service GetUnprotectedTables()
|
||||
|
||||
TableArray = List_Volume_Sub('LSL', '', 'TABLE_NAME', 'TABLE_NAME')
|
||||
UnprotectedArray = ''
|
||||
For Each Table in TableArray Using @FM
|
||||
If Table[1,1] NE '!' AND Table[1,5] NE 'DICT.' then
|
||||
UnprotectedArray<-1> = Table
|
||||
end
|
||||
Next Table
|
||||
|
||||
Response = UnprotectedArray
|
||||
|
||||
End Service
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// LogUnlockRequest
|
||||
//
|
||||
// CurrUser - [Required]
|
||||
// TableName - [Required]
|
||||
// RecordKey - [Required]
|
||||
// Success - [Required]
|
||||
//
|
||||
// Creates an UNLOCK_REQUESTS record to log unlock attempts.
|
||||
//
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service LogUnlockRequest(TableName, RecordKey, CurrUser, Success)
|
||||
|
||||
NewRequestRec = ''
|
||||
CurrDateTime = Datetime()
|
||||
RecordID = CurrDateTime :'*': TableName
|
||||
NewRequestRec<UNLOCK_REQUESTS_RECORD_KEY$> = RecordKey
|
||||
NewRequestRec<UNLOCK_REQUESTS_USER_NAME$> = CurrUser
|
||||
NewRequestRec<UNLOCK_REQUESTS_SUCCESS$> = Success
|
||||
Database_Services('WriteDataRow', 'UNLOCK_REQUESTS', RecordID, NewRequestRec, 1, 0, 0)
|
||||
|
||||
End Service
|
||||
|
||||
|
||||
|
||||
|
||||
Compile function Lock_Services(@Service, @Params)
|
||||
/***********************************************************************************************************************
|
||||
|
||||
Name : Lock_Services
|
||||
|
||||
Description : Handler program for all Lock services.
|
||||
|
||||
Notes : Application errors should be logged using the Error Services module. There are a few methodological
|
||||
assumptions built into way errors are managed which are important to understand in order to properly
|
||||
work with Error Services:
|
||||
|
||||
- The term 'top' refers to the originating procedure of a call stack and the term 'bottom' refers to
|
||||
the last routine (or the current routine) within a call stack. Within the OpenInsight Debugger
|
||||
this will appear backwards since the originating procedure always appears at the bottom of the
|
||||
list and the current routine appears at the top of the list. We are using this orientation because
|
||||
it is common to refer to the process of calling other procedures as 'drilling down'.
|
||||
|
||||
- The reason for defining the orientation of the call stack is because Error_Services allows for
|
||||
multiple error conditions to be appended to an original error. In most cases this will happen when
|
||||
a procedure at the bottom of the stack generates an error condition and then returns to its
|
||||
calling procedure. This higher level procedure can optionally add more information relevant to
|
||||
itself. This continues as the call stack 'bubbles' its way back to the top to where the
|
||||
originating procedure is waiting.
|
||||
|
||||
- Native OpenInsight commands that handle errors (e.g., Set_Status, Set_FSError, Set_EventStatus)
|
||||
preserve their error state until explicitly cleared. This can hinder the normal execution of code
|
||||
since subsequent procedures (usually SSPs) will fail if a pre-existing error condition exists.
|
||||
Our philosophy is that error conditions should automatically be cleared before a new procedure
|
||||
is executed to avoid this problem. However, the nature of Basic+ does not make this easy to
|
||||
automate for any given stored procedure. Therefore, if a stored procedure wants to conform to our
|
||||
philosophy then it should include a call into the 'Clear' service request at the top of the
|
||||
program. Alternatively this can be done through a common insert (see SERVICE_SETUP for example.)
|
||||
|
||||
- Service modules will use the SERVICE_SETUP insert and therefore automatically clear out any
|
||||
error conditions that were set before.
|
||||
|
||||
Parameters :
|
||||
Service [in] -- Name of the service being requested
|
||||
Param1-10 [in/out] -- Additional request parameter holders
|
||||
Response [out] -- Response to be sent back to the Controller (MCP) or requesting procedure
|
||||
|
||||
Metadata :
|
||||
|
||||
History : (Date, Initials, Notes)
|
||||
3/18/24 djm Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
#pragma precomp SRP_PreCompiler
|
||||
$insert LOGICAL
|
||||
$Insert SERVICE_SETUP
|
||||
$Insert UNLOCK_REQUESTS_EQUATES
|
||||
$Insert REACT_RUN_EQUATES
|
||||
$Insert WO_MAT_EQUATES
|
||||
$Insert WM_OUT_EQUATES
|
||||
$Insert RDS_EQUATES
|
||||
$Insert RDS_LAYER_EQUATES
|
||||
|
||||
Declare function Database_Services, Oi_Wizard_Services, Memberof, Lock_Services, SRP_Json, List_Volume_Sub, Datetime
|
||||
Declare subroutine SRP_Json, Database_Services
|
||||
|
||||
|
||||
GoToService
|
||||
|
||||
Return Response or ""
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// SERVICES
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// GetLockPermissions
|
||||
//
|
||||
// CurrUser - [Required]
|
||||
//
|
||||
// Returns LockPermissionLevel 0 - No lock access, 1 - Lock access to unprotected tables, or 2 - Lock access to all tables.
|
||||
//
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service GetLockPermissions(CurrUser)
|
||||
|
||||
LockPermissionLevel = 0
|
||||
OIAdmin = Memberof(CurrUser, 'OI_ADMIN')
|
||||
SupervisorLead = MemberOf(CurrUser, 'LEAD') OR MemberOf(CurrUser, 'SUPERVISOR')
|
||||
If OIAdmin then
|
||||
LockPermissionLevel = 2
|
||||
end else
|
||||
If SupervisorLead then
|
||||
LockPermissionLevel = 1
|
||||
end
|
||||
end
|
||||
Response = LockPermissionLevel
|
||||
|
||||
End Service
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// GetAllowedLocks
|
||||
//
|
||||
// CurrUser - [Required]
|
||||
//
|
||||
// Returns an array of accessible locks based on user LockPermissionLevel
|
||||
//
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service GetAllowedLocks(CurrUser)
|
||||
|
||||
LockPermissionLevel = Lock_Services('GetLockPermissions', CurrUser)
|
||||
LockJSON = ''
|
||||
|
||||
If LockPermissionLevel NE 0 then
|
||||
|
||||
LockList = Database_Services('GetUserLocks')
|
||||
If Error_Services('NoError') then
|
||||
If SRP_JSON(objJSON, 'New', 'Object') then
|
||||
If SRP_JSON(LockArray, 'New', 'Array') then
|
||||
For each Row in LockList using @FM setting fPos
|
||||
If Row<0,3> = "Rev30536" then Row<0,3> = 'RDS*LSL2'
|
||||
If Field(Row<0,3>, "*", 2) EQ 'LSL2' OR LockPermissionLevel EQ 2 then
|
||||
If SRP_JSON(objRow, 'New', 'Object') then
|
||||
SRP_JSON(objRow, 'SetValue', 'ComputerName', Row<0, 1>)
|
||||
SRP_JSON(objRow, 'SetValue', 'Volume', Row<0, 2>)
|
||||
If Field(Row<0,3>, "*", 2) EQ 'LSL2' then Row<0,3> = Field(Row<0,3>, "*", 1)
|
||||
SRP_JSON(objRow, 'SetValue', 'OSFile', Row<0, 3>)
|
||||
SRP_JSON(objRow, 'SetValue', 'RecordKey', Row<0, 4>, "String")
|
||||
SRP_JSON(objRow, 'SetValue', 'Exclusive', Row<0, 5>)
|
||||
SRP_JSON(objRow, 'SetValue', 'REVFile', Row<0, 6>)
|
||||
SRP_JSON(LockArray, 'Add', objRow)
|
||||
SRP_JSON(objRow, 'Release')
|
||||
end
|
||||
End
|
||||
Next Row
|
||||
SRP_JSON(objJSON, 'Set', 'Locks', LockArray)
|
||||
SRP_JSON(LockArray, 'Release')
|
||||
end
|
||||
LockJSON = SRP_JSON(objJSON, 'Stringify', 'Styled')
|
||||
SRP_JSON(objJSON, 'Release')
|
||||
end
|
||||
end
|
||||
End
|
||||
|
||||
Response = LockJSON
|
||||
|
||||
End Service
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// AttemptUnlock
|
||||
//
|
||||
// CurrUser - [Required]
|
||||
// LotType - [Required]
|
||||
// Key - [Required]
|
||||
//
|
||||
// Returns either 1 for success, or error message
|
||||
//
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Service AttemptUnlock(CurrUser, LotType, Key)
|
||||
|
||||
LockPermissionLevel = Lock_Services('GetLockPermissions', CurrUser)
|
||||
If LockPermissionLevel NE 0 then
|
||||
If LotType EQ 'RDS' or LotType EQ 'WM_OUT' then
|
||||
If Xlate(LotType, Key, '', 'X', '') NE '' then
|
||||
LockArray = Lock_Services('GetChildRecords', LotType, Key)
|
||||
LockCount = DCount(LockArray<1>, @VM)
|
||||
For I = 1 to LockCount
|
||||
Table = LockArray<1,I>
|
||||
KeyID = LockArray<2,I>
|
||||
Resp = Database_Services('UnlockKeyID', Table, KeyID)
|
||||
Next I
|
||||
If Error_Services('NoError') Then
|
||||
Response = TRUE$
|
||||
end else
|
||||
Response = FALSE$
|
||||
Error_Services('Add', 'Records failed to unlock.')
|
||||
end
|
||||
end else
|
||||
Response = FALSE$
|
||||
Error_Services('Add', 'This record does not exist.')
|
||||
end
|
||||
End Else
|
||||
Response = FALSE$
|
||||
Error_Services('Add', 'LotType must be either RDS or WM_OUT.')
|
||||
end
|
||||
end else
|
||||
Response = FALSE$
|
||||
Error_Services('Add', 'User is not permitted to access this resource.')
|
||||
end
|
||||
|
||||
End Service
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// GetChildRecords
|
||||
//
|
||||
// LotType - [Required]
|
||||
// Key - [Required]
|
||||
//
|
||||
// Returns an array of associated child records for unlocking
|
||||
//
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Service GetChildRecords(LotType, Key)
|
||||
|
||||
RecordArray = ''
|
||||
|
||||
Begin Case
|
||||
|
||||
Case LotType EQ 'RDS'
|
||||
RDSRec = Xlate('RDS', Key, '', 'X', '')
|
||||
If RDSRec NE '' then
|
||||
//Add RDS key
|
||||
RecordArray<1> = LotType
|
||||
RecordArray<2> = Key
|
||||
//Get REACT_RUN record
|
||||
ReactRunRec = Xlate('REACT_RUN', Key, '', 'X', '')
|
||||
//Get and Add CLEAN_INSP keys
|
||||
CINos = ReactRunRec<REACT_RUN_CI_NO$>
|
||||
If CINos NE '' then
|
||||
CICount = Dcount(CINos, @VM)
|
||||
For I = 1 to CICount
|
||||
If CINos<I> NE '' then
|
||||
RecordArray<1,-1> = 'CLEAN_INSP'
|
||||
RecordArray<2,-1> = CINos<I>
|
||||
end
|
||||
Next I
|
||||
end
|
||||
//Get and Add RDS_TEST keys
|
||||
RDSLayerKeys = ReactRunRec<REACT_RUN_RDS_LAYER_KEYS$>
|
||||
If RDSLayerKeys NE '' then
|
||||
LayerKeyCount = DCount(RDSLayerKeys, @VM)
|
||||
For K = 1 to LayerKeyCount
|
||||
RDSTestKeys = Xlate('RDS_LAYER', RDSLayerKeys<K>, 'RDS_TEST_KEYS', 'X', '')
|
||||
If RDSTestKeys NE '' then
|
||||
RDSTestCount = DCount(RDSTestKeys, @VM)
|
||||
For L = 1 to RDSTestCount
|
||||
If RDSTestKeys<K,L> NE '' then
|
||||
RecordArray<1,-1> = 'RDS_TEST'
|
||||
RecordArray<2,-1> = RDSTestKeys<K,L>
|
||||
end
|
||||
Next L
|
||||
end
|
||||
Next K
|
||||
end
|
||||
//Get WO_MAT key
|
||||
WONo = RDSRec<RDS_WO$>
|
||||
CassNo = RDSRec<RDS_CASS_NO$>
|
||||
WOMatKey = WONo : '*' : CassNo
|
||||
//Get and Add WO_MAT_QA
|
||||
WOMatQA = Xlate('WO_MAT_QA', WOMatKey, '', 'X', '')
|
||||
If WOMatQA NE '' then
|
||||
RecordArray<1,-1> = 'WO_MAT_QA'
|
||||
RecordArray<2,-1> = WOMatKey
|
||||
End
|
||||
//Get and Add NCR keys
|
||||
NCRKeys = Xlate('WO_MAT', WOMatKey, 'NCR_KEYS', 'X', '')
|
||||
If NCRKeys NE '' then
|
||||
NCRCount = Dcount(NCRKeys, @VM)
|
||||
For J = 1 to NCRCount
|
||||
If NCRKeys<J> NE '' then
|
||||
RecordArray<1,-1> = 'NCR'
|
||||
RecordArray<2,-1> = NCRKeys<J>
|
||||
end
|
||||
Next J
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'This RDS does not exist.')
|
||||
Return
|
||||
end
|
||||
|
||||
Case LotType EQ 'WM_OUT'
|
||||
WMOutRec = Xlate('WM_OUT', Key, '', 'X', '')
|
||||
If WMOutRec NE '' then
|
||||
//Add WM_OUT key
|
||||
RecordArray<1> = LotType
|
||||
RecordArray<2> = Key
|
||||
//Get and Add CLEAN_INSP keys
|
||||
CINos = WMOutRec<WM_OUT_CI_NO$>
|
||||
If CINos NE '' then
|
||||
CICount = Dcount(CINos, @VM)
|
||||
For I = 1 to CICount
|
||||
If CINos<I> NE '' then
|
||||
RecordArray<1,-1> = 'CLEAN_INSP'
|
||||
RecordArray<2,-1> = CINos<I>
|
||||
end
|
||||
Next I
|
||||
end
|
||||
//Get WO_MAT key
|
||||
WONo = FIELD(Key,'*',1)
|
||||
CassNo = FIELD(Key,'*',3)
|
||||
WOMatKey = WONo : '*' : CassNo
|
||||
//Get and Add WO_MAT_QA key
|
||||
WOMatQA = Xlate('WO_MAT_QA', WOMatKey, '', 'X', '')
|
||||
If WOMatQA NE '' then
|
||||
RecordArray<1,-1> = 'WO_MAT_QA'
|
||||
RecordArray<2,-1> = WOMatKey
|
||||
End
|
||||
//Get and Add NCR keys
|
||||
NCRKeys = Xlate('WO_MAT', WOMatKey, 'NCR_KEYS', 'X', '')
|
||||
If NCRKeys NE '' then
|
||||
NCRCount = Dcount(NCRKeys, @VM)
|
||||
For J = 1 to NCRCount
|
||||
If NCRKeys<J> NE '' then
|
||||
RecordArray<1,-1> = 'NCR'
|
||||
RecordArray<2,-1> = NCRKeys<J>
|
||||
end
|
||||
Next J
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'This WM_OUT does not exist.')
|
||||
end
|
||||
|
||||
Case OTHERWISE$
|
||||
Error_Services('Add', 'LotType must be either RDS or WM_OUT.')
|
||||
return
|
||||
|
||||
End Case
|
||||
|
||||
If RecordArray NE '' then
|
||||
Response = RecordArray
|
||||
end
|
||||
|
||||
End Service
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// GetUnprotectedTables
|
||||
//
|
||||
// Returns an array of unprotected tables
|
||||
//
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service GetUnprotectedTables()
|
||||
|
||||
TableArray = List_Volume_Sub('LSL', '', 'TABLE_NAME', 'TABLE_NAME')
|
||||
UnprotectedArray = ''
|
||||
For Each Table in TableArray Using @FM
|
||||
If Table[1,1] NE '!' AND Table[1,5] NE 'DICT.' then
|
||||
UnprotectedArray<-1> = Table
|
||||
end
|
||||
Next Table
|
||||
|
||||
Response = UnprotectedArray
|
||||
|
||||
End Service
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// LogUnlockRequest
|
||||
//
|
||||
// CurrUser - [Required]
|
||||
// TableName - [Required]
|
||||
// RecordKey - [Required]
|
||||
// Success - [Required]
|
||||
//
|
||||
// Creates an UNLOCK_REQUESTS record to log unlock attempts.
|
||||
//
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service LogUnlockRequest(TableName, RecordKey, CurrUser, Success)
|
||||
|
||||
NewRequestRec = ''
|
||||
CurrDateTime = Datetime()
|
||||
RecordID = CurrDateTime :'*': TableName
|
||||
NewRequestRec<UNLOCK_REQUESTS_RECORD_KEY$> = RecordKey
|
||||
NewRequestRec<UNLOCK_REQUESTS_USER_NAME$> = CurrUser
|
||||
NewRequestRec<UNLOCK_REQUESTS_SUCCESS$> = Success
|
||||
Database_Services('WriteDataRow', 'UNLOCK_REQUESTS', RecordID, NewRequestRec, 1, 0, 0)
|
||||
|
||||
End Service
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,206 +1,206 @@
|
||||
Function MAKEUP_WAFERS_Actions(Action, CalcColName, FSList, Handle, Name, FMC, Record, Status, OrigRecord, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
/***********************************************************************************************************************
|
||||
|
||||
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 Infineon.
|
||||
|
||||
Name : Makeup_Wafers_Actions
|
||||
|
||||
Description : Handles calculated columns and MFS calls for the current table.
|
||||
|
||||
Notes : This function uses @ID, @RECORD, and @DICT to make sure {ColumnName} references work correctly.
|
||||
If called from outside of a calculated column these will need to be set and restored.
|
||||
|
||||
Parameters :
|
||||
Action [in] -- Name of the action to be taken
|
||||
CalcColName [in] -- Name of the calculated column that needs to be processed. Normally this should only be
|
||||
populated when the CalcField action is being used.
|
||||
FSList [in] -- The list of MFSs and the BFS name for the current file or volume. This is an @SVM
|
||||
delimited array, with the current MFS name as the first value in the array, and the BFS
|
||||
name as the last value. Normally set by a calling MFS.
|
||||
Handle [in] -- The file handle of the file or media map being accessed. Note, this does contain the
|
||||
entire handle structure that the Basic+ Open statement would provide. Normally set by a
|
||||
calling MFS.
|
||||
Name [in] -- The name (key) of the record or file being accessed. Normally set by a calling MFS.
|
||||
FMC [in] -- Various functions. Normally set by a calling MFS.
|
||||
Record [in] -- The entire record (for record-oriented functions) or a newly-created handle (for
|
||||
"get handle" functions). Normally set by a calling MFS.
|
||||
Status [in/out] -- Indicator of the success or failure of an action. Normally set by the calling MFS but
|
||||
for some actions can be set by the action handler to indicate failure.
|
||||
OrigRecord [in] -- Original content of the record being processed by the current action. This is
|
||||
automatically being assigned by the WRITE_RECORD and DELETE_RECORD actions within
|
||||
BASE_MFS.
|
||||
Param1-10 [in/out] -- Additional request parameter holders
|
||||
ActionFlow [out] -- Used to control the action chain (see the ACTION_SETUP insert for more information.)
|
||||
Can also be used to return a special value, such as the results of the CalcField
|
||||
method.
|
||||
|
||||
History : (Date, Initials, Notes)
|
||||
07/09/24 djs Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert FILE.SYSTEM.EQUATES
|
||||
$insert ACTION_SETUP
|
||||
$insert MAKEUP_WAFERS_EQUATES
|
||||
|
||||
Declare function SRP_Date
|
||||
|
||||
If KeyID then GoSub Initialize_System_Variables
|
||||
|
||||
Begin Case
|
||||
|
||||
Case Action _EQC 'CalculateColumn' ; GoSub CalculateColumn
|
||||
Case Action _EQC 'READ_RECORD_PRE' ; GoSub READ_RECORD_PRE
|
||||
Case Action _EQC 'READ_RECORD' ; GoSub READ_RECORD
|
||||
Case Action _EQC 'READONLY_RECORD_PRE' ; GoSub READONLY_RECORD_PRE
|
||||
Case Action _EQC 'READONLY_RECORD' ; GoSub READONLY_RECORD
|
||||
Case Action _EQC 'WRITE_RECORD_PRE' ; GoSub WRITE_RECORD_PRE
|
||||
Case Action _EQC 'WRITE_RECORD' ; GoSub WRITE_RECORD
|
||||
Case Action _EQC 'DELETE_RECORD_PRE' ; GoSub DELETE_RECORD_PRE
|
||||
Case Action _EQC 'DELETE_RECORD' ; GoSub DELETE_RECORD
|
||||
Case Otherwise$ ; Status = 'Invalid Action'
|
||||
|
||||
End Case
|
||||
|
||||
If KeyID then GoSub Restore_System_Variables
|
||||
|
||||
If Assigned(ActionFlow) else ActionFlow = ACTION_CONTINUE$
|
||||
|
||||
Return ActionFlow
|
||||
|
||||
|
||||
// ----- Calculated Columns --------------------------------------------------------------------------------------------
|
||||
//
|
||||
// The typical structure of a calculated column will look like this:
|
||||
//
|
||||
// Declare function TableName_Actions
|
||||
//
|
||||
// A = {COL1} ; * Reference as many data columns in this way to ensure the dictionary dependency is generated.
|
||||
//
|
||||
// @ANS = TableName_Actions('CalcField', 'CalcColName')
|
||||
//
|
||||
// ---------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
CalculateColumn:
|
||||
|
||||
// Make sure the ActionFlow return variable is cleared in case nothing is calculated.
|
||||
ActionFlow = ''
|
||||
|
||||
Begin Case
|
||||
Case CalcColName EQ 'EXAMPLE' ; GoSub EXAMPLE
|
||||
End Case
|
||||
|
||||
return
|
||||
|
||||
|
||||
EXAMPLE:
|
||||
|
||||
ActionFlow = ''
|
||||
|
||||
return
|
||||
|
||||
|
||||
// ----- MFS calls -----------------------------------------------------------------------------------------------------
|
||||
|
||||
READ_RECORD_PRE:
|
||||
// In order to stop a record from being read in this action these lines of code must be used:
|
||||
//
|
||||
// OrigFileError = 100 : @FM : KeyID
|
||||
// Status = 0
|
||||
// Record = ''
|
||||
// ActionFlow = ACTION_STOP$
|
||||
return
|
||||
|
||||
|
||||
READ_RECORD:
|
||||
// In order to stop a record from being read in this action these lines of code must be used:
|
||||
//
|
||||
// OrigFileError = 100 : @FM : KeyID
|
||||
// Status = 0
|
||||
// Record = ''
|
||||
return
|
||||
|
||||
READONLY_RECORD_PRE:
|
||||
// In order to stop a record from being read in this action these lines of code must be used:
|
||||
//
|
||||
// OrigFileError = 100 : @FM : KeyID
|
||||
// Status = 0
|
||||
// Record = ''
|
||||
// ActionFlow = ACTION_STOP$
|
||||
return
|
||||
|
||||
READONLY_RECORD:
|
||||
// In order to stop a record from being read in this action these lines of code must be used:
|
||||
//
|
||||
// OrigFileError = 100 : @FM : KeyID
|
||||
// Status = 0
|
||||
// Record = ''
|
||||
return
|
||||
|
||||
WRITE_RECORD_PRE:
|
||||
|
||||
SaveRecord<MAKEUP_WAFERS.EXPIRED$> = ( {UNLOAD_DTM} LT SRP_Date('AddYears', Date(), -3) )
|
||||
|
||||
return
|
||||
|
||||
WRITE_RECORD:
|
||||
return
|
||||
|
||||
DELETE_RECORD_PRE:
|
||||
return
|
||||
|
||||
DELETE_RECORD:
|
||||
return
|
||||
|
||||
|
||||
// ----- Internal Methods ----------------------------------------------------------------------------------------------
|
||||
|
||||
Initialize_System_Variables:
|
||||
// Save these for restoration later
|
||||
SaveDict = @DICT
|
||||
SaveID = @ID
|
||||
SaveRecord = @RECORD
|
||||
OrigFileError = @FILE.ERROR
|
||||
|
||||
// Now make sure @DICT, ID, and @RECORD are populated
|
||||
CurrentDictName = ''
|
||||
If @DICT then
|
||||
DictHandle = @DICT<1, 2>
|
||||
Locate DictHandle in @TABLES(5) Using @FM Setting fPos then
|
||||
CurrentDictName = Field(@TABLES(0), @FM, fPos, 1)
|
||||
end
|
||||
end
|
||||
|
||||
If CurrentDictName NE DictName then
|
||||
Open DictName to @DICT else Status = 'Unable to initialize @DICT'
|
||||
end
|
||||
|
||||
@ID = KeyID
|
||||
If Record else
|
||||
// Record might not have been passed in. Read the record from the database table just to make sure.
|
||||
@FILE.ERROR = ''
|
||||
Open TableName to hTable then
|
||||
FullFSList = hTable[1, 'F' : @VM]
|
||||
BFS = FullFSList[-1, 'B' : @SVM]
|
||||
LastHandle = hTable[-1, 'B' : \0D\]
|
||||
FileHandle = \0D\ : LastHandle[1, @VM]
|
||||
|
||||
Call @BFS(READO.RECORD, BFS, FileHandle, KeyID, FMC, Record, ReadOStatus)
|
||||
end
|
||||
end
|
||||
@RECORD = Record
|
||||
return
|
||||
|
||||
Restore_System_Variables:
|
||||
Transfer SaveDict to @DICT
|
||||
Transfer SaveID to @ID
|
||||
Transfer SaveRecord to @RECORD
|
||||
@FILE.ERROR = OrigFileError
|
||||
return
|
||||
|
||||
|
||||
|
||||
Function MAKEUP_WAFERS_Actions(Action, CalcColName, FSList, Handle, Name, FMC, Record, Status, OrigRecord, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
/***********************************************************************************************************************
|
||||
|
||||
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 Infineon.
|
||||
|
||||
Name : Makeup_Wafers_Actions
|
||||
|
||||
Description : Handles calculated columns and MFS calls for the current table.
|
||||
|
||||
Notes : This function uses @ID, @RECORD, and @DICT to make sure {ColumnName} references work correctly.
|
||||
If called from outside of a calculated column these will need to be set and restored.
|
||||
|
||||
Parameters :
|
||||
Action [in] -- Name of the action to be taken
|
||||
CalcColName [in] -- Name of the calculated column that needs to be processed. Normally this should only be
|
||||
populated when the CalcField action is being used.
|
||||
FSList [in] -- The list of MFSs and the BFS name for the current file or volume. This is an @SVM
|
||||
delimited array, with the current MFS name as the first value in the array, and the BFS
|
||||
name as the last value. Normally set by a calling MFS.
|
||||
Handle [in] -- The file handle of the file or media map being accessed. Note, this does contain the
|
||||
entire handle structure that the Basic+ Open statement would provide. Normally set by a
|
||||
calling MFS.
|
||||
Name [in] -- The name (key) of the record or file being accessed. Normally set by a calling MFS.
|
||||
FMC [in] -- Various functions. Normally set by a calling MFS.
|
||||
Record [in] -- The entire record (for record-oriented functions) or a newly-created handle (for
|
||||
"get handle" functions). Normally set by a calling MFS.
|
||||
Status [in/out] -- Indicator of the success or failure of an action. Normally set by the calling MFS but
|
||||
for some actions can be set by the action handler to indicate failure.
|
||||
OrigRecord [in] -- Original content of the record being processed by the current action. This is
|
||||
automatically being assigned by the WRITE_RECORD and DELETE_RECORD actions within
|
||||
BASE_MFS.
|
||||
Param1-10 [in/out] -- Additional request parameter holders
|
||||
ActionFlow [out] -- Used to control the action chain (see the ACTION_SETUP insert for more information.)
|
||||
Can also be used to return a special value, such as the results of the CalcField
|
||||
method.
|
||||
|
||||
History : (Date, Initials, Notes)
|
||||
07/09/24 djs Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert FILE.SYSTEM.EQUATES
|
||||
$insert ACTION_SETUP
|
||||
$insert MAKEUP_WAFERS_EQUATES
|
||||
|
||||
Declare function SRP_Date
|
||||
|
||||
If KeyID then GoSub Initialize_System_Variables
|
||||
|
||||
Begin Case
|
||||
|
||||
Case Action _EQC 'CalculateColumn' ; GoSub CalculateColumn
|
||||
Case Action _EQC 'READ_RECORD_PRE' ; GoSub READ_RECORD_PRE
|
||||
Case Action _EQC 'READ_RECORD' ; GoSub READ_RECORD
|
||||
Case Action _EQC 'READONLY_RECORD_PRE' ; GoSub READONLY_RECORD_PRE
|
||||
Case Action _EQC 'READONLY_RECORD' ; GoSub READONLY_RECORD
|
||||
Case Action _EQC 'WRITE_RECORD_PRE' ; GoSub WRITE_RECORD_PRE
|
||||
Case Action _EQC 'WRITE_RECORD' ; GoSub WRITE_RECORD
|
||||
Case Action _EQC 'DELETE_RECORD_PRE' ; GoSub DELETE_RECORD_PRE
|
||||
Case Action _EQC 'DELETE_RECORD' ; GoSub DELETE_RECORD
|
||||
Case Otherwise$ ; Status = 'Invalid Action'
|
||||
|
||||
End Case
|
||||
|
||||
If KeyID then GoSub Restore_System_Variables
|
||||
|
||||
If Assigned(ActionFlow) else ActionFlow = ACTION_CONTINUE$
|
||||
|
||||
Return ActionFlow
|
||||
|
||||
|
||||
// ----- Calculated Columns --------------------------------------------------------------------------------------------
|
||||
//
|
||||
// The typical structure of a calculated column will look like this:
|
||||
//
|
||||
// Declare function TableName_Actions
|
||||
//
|
||||
// A = {COL1} ; * Reference as many data columns in this way to ensure the dictionary dependency is generated.
|
||||
//
|
||||
// @ANS = TableName_Actions('CalcField', 'CalcColName')
|
||||
//
|
||||
// ---------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
CalculateColumn:
|
||||
|
||||
// Make sure the ActionFlow return variable is cleared in case nothing is calculated.
|
||||
ActionFlow = ''
|
||||
|
||||
Begin Case
|
||||
Case CalcColName EQ 'EXAMPLE' ; GoSub EXAMPLE
|
||||
End Case
|
||||
|
||||
return
|
||||
|
||||
|
||||
EXAMPLE:
|
||||
|
||||
ActionFlow = ''
|
||||
|
||||
return
|
||||
|
||||
|
||||
// ----- MFS calls -----------------------------------------------------------------------------------------------------
|
||||
|
||||
READ_RECORD_PRE:
|
||||
// In order to stop a record from being read in this action these lines of code must be used:
|
||||
//
|
||||
// OrigFileError = 100 : @FM : KeyID
|
||||
// Status = 0
|
||||
// Record = ''
|
||||
// ActionFlow = ACTION_STOP$
|
||||
return
|
||||
|
||||
|
||||
READ_RECORD:
|
||||
// In order to stop a record from being read in this action these lines of code must be used:
|
||||
//
|
||||
// OrigFileError = 100 : @FM : KeyID
|
||||
// Status = 0
|
||||
// Record = ''
|
||||
return
|
||||
|
||||
READONLY_RECORD_PRE:
|
||||
// In order to stop a record from being read in this action these lines of code must be used:
|
||||
//
|
||||
// OrigFileError = 100 : @FM : KeyID
|
||||
// Status = 0
|
||||
// Record = ''
|
||||
// ActionFlow = ACTION_STOP$
|
||||
return
|
||||
|
||||
READONLY_RECORD:
|
||||
// In order to stop a record from being read in this action these lines of code must be used:
|
||||
//
|
||||
// OrigFileError = 100 : @FM : KeyID
|
||||
// Status = 0
|
||||
// Record = ''
|
||||
return
|
||||
|
||||
WRITE_RECORD_PRE:
|
||||
|
||||
SaveRecord<MAKEUP_WAFERS.EXPIRED$> = ( {UNLOAD_DTM} LT SRP_Date('AddYears', Date(), -3) )
|
||||
|
||||
return
|
||||
|
||||
WRITE_RECORD:
|
||||
return
|
||||
|
||||
DELETE_RECORD_PRE:
|
||||
return
|
||||
|
||||
DELETE_RECORD:
|
||||
return
|
||||
|
||||
|
||||
// ----- Internal Methods ----------------------------------------------------------------------------------------------
|
||||
|
||||
Initialize_System_Variables:
|
||||
// Save these for restoration later
|
||||
SaveDict = @DICT
|
||||
SaveID = @ID
|
||||
SaveRecord = @RECORD
|
||||
OrigFileError = @FILE.ERROR
|
||||
|
||||
// Now make sure @DICT, ID, and @RECORD are populated
|
||||
CurrentDictName = ''
|
||||
If @DICT then
|
||||
DictHandle = @DICT<1, 2>
|
||||
Locate DictHandle in @TABLES(5) Using @FM Setting fPos then
|
||||
CurrentDictName = Field(@TABLES(0), @FM, fPos, 1)
|
||||
end
|
||||
end
|
||||
|
||||
If CurrentDictName NE DictName then
|
||||
Open DictName to @DICT else Status = 'Unable to initialize @DICT'
|
||||
end
|
||||
|
||||
@ID = KeyID
|
||||
If Record else
|
||||
// Record might not have been passed in. Read the record from the database table just to make sure.
|
||||
@FILE.ERROR = ''
|
||||
Open TableName to hTable then
|
||||
FullFSList = hTable[1, 'F' : @VM]
|
||||
BFS = FullFSList[-1, 'B' : @SVM]
|
||||
LastHandle = hTable[-1, 'B' : \0D\]
|
||||
FileHandle = \0D\ : LastHandle[1, @VM]
|
||||
|
||||
Call @BFS(READO.RECORD, BFS, FileHandle, KeyID, FMC, Record, ReadOStatus)
|
||||
end
|
||||
end
|
||||
@RECORD = Record
|
||||
return
|
||||
|
||||
Restore_System_Variables:
|
||||
Transfer SaveDict to @DICT
|
||||
Transfer SaveID to @ID
|
||||
Transfer SaveRecord to @RECORD
|
||||
@FILE.ERROR = OrigFileError
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
@ -1,46 +1,46 @@
|
||||
Compile Function MITCHEM_TEST_Events(CtrlEntId, Event, @PARAMS)
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
#window MITCHEM_TEST
|
||||
|
||||
Declare function Get_Property, Reactor_Services, Database_Services
|
||||
Declare subroutine Set_Property, RList, Msg , Reactor_Services, End_Window, Post_Event
|
||||
|
||||
$Insert APP_INSERTS
|
||||
$Insert EVENT_SETUP
|
||||
$Insert REACTOR_EQUATES
|
||||
$insert logical
|
||||
$Insert RLIST_EQUATES
|
||||
$Insert REACTOR_MODES_EQUATES
|
||||
$Insert REACT_MODE_NG_EQUATES
|
||||
$Insert MSG_EQUATES
|
||||
|
||||
// Update the arguments so that the OpenInsight OLE event will treate the ActiveX event as a native event handler.
|
||||
If Event EQ 'OLE' then
|
||||
Transfer Event to OIEvent
|
||||
Transfer Param1 to Event
|
||||
Transfer Param2 to Param1
|
||||
Transfer Param3 to Param2
|
||||
Transfer Param4 to Param3
|
||||
Transfer Param5 to Param4
|
||||
Transfer Param6 to Param5
|
||||
Transfer Param7 to Param6
|
||||
Transfer Param8 to Param7
|
||||
end
|
||||
|
||||
GoToEvent Event for CtrlEntId else
|
||||
// Event not implemented
|
||||
end
|
||||
|
||||
Return EventFlow or 1
|
||||
|
||||
|
||||
Event WINDOW.CREATE(CreateParam)
|
||||
debug
|
||||
Set_Property(@Window, 'BACKCOLOR', -2)
|
||||
Color = Get_Property(@Window:'.EB_SPEC_SUBSTRATE', 'BACKCOLOR')
|
||||
//Set_Property(@Window:'.EB_SPEC_SUBSTRATE', 'BACKCOLOR', -2)
|
||||
Color = Get_Property(@Window:'.EB_SPEC_SUBSTRATE', 'BACKCOLOR')
|
||||
EventFlow = 1
|
||||
|
||||
End Event
|
||||
Compile Function MITCHEM_TEST_Events(CtrlEntId, Event, @PARAMS)
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
#window MITCHEM_TEST
|
||||
|
||||
Declare function Get_Property, Reactor_Services, Database_Services
|
||||
Declare subroutine Set_Property, RList, Msg , Reactor_Services, End_Window, Post_Event
|
||||
|
||||
$Insert APP_INSERTS
|
||||
$Insert EVENT_SETUP
|
||||
$Insert REACTOR_EQUATES
|
||||
$insert logical
|
||||
$Insert RLIST_EQUATES
|
||||
$Insert REACTOR_MODES_EQUATES
|
||||
$Insert REACT_MODE_NG_EQUATES
|
||||
$Insert MSG_EQUATES
|
||||
|
||||
// Update the arguments so that the OpenInsight OLE event will treate the ActiveX event as a native event handler.
|
||||
If Event EQ 'OLE' then
|
||||
Transfer Event to OIEvent
|
||||
Transfer Param1 to Event
|
||||
Transfer Param2 to Param1
|
||||
Transfer Param3 to Param2
|
||||
Transfer Param4 to Param3
|
||||
Transfer Param5 to Param4
|
||||
Transfer Param6 to Param5
|
||||
Transfer Param7 to Param6
|
||||
Transfer Param8 to Param7
|
||||
end
|
||||
|
||||
GoToEvent Event for CtrlEntId else
|
||||
// Event not implemented
|
||||
end
|
||||
|
||||
Return EventFlow or 1
|
||||
|
||||
|
||||
Event WINDOW.CREATE(CreateParam)
|
||||
debug
|
||||
Set_Property(@Window, 'BACKCOLOR', -2)
|
||||
Color = Get_Property(@Window:'.EB_SPEC_SUBSTRATE', 'BACKCOLOR')
|
||||
//Set_Property(@Window:'.EB_SPEC_SUBSTRATE', 'BACKCOLOR', -2)
|
||||
Color = Get_Property(@Window:'.EB_SPEC_SUBSTRATE', 'BACKCOLOR')
|
||||
EventFlow = 1
|
||||
|
||||
End Event
|
||||
|
@ -1,138 +1,138 @@
|
||||
Function Monaengines_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 : Monaengines_API
|
||||
|
||||
Description : API logic for the Monaengines 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 Monaengines[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Monaengines.POST
|
||||
- Monaengines.ID.PUT
|
||||
- Monaengines.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 xxx Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert API_SETUP
|
||||
$insert HTTP_INSERTS
|
||||
$insert ENGINE_HEALTH_EQUATES
|
||||
|
||||
Equ Comma$ to ','
|
||||
|
||||
Declare function System_Healthcheck_Services, Environment_Services, Logging_Services
|
||||
Declare subroutine Logging_Services
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Healthchecks\Engines\MonA'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
LogTime = Oconv(Time(), 'MTS')
|
||||
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Mona_Engine_Health_Check_Log.csv'
|
||||
Headers = 'Logging DTM' : @FM : 'EngineID' : @FM : 'ResponseCode' : @FM : 'Message' : @FM : 'Requester'
|
||||
objLogMonaEngines = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
|
||||
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
||||
|
||||
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 monaengines.HEAD
|
||||
API monaengines.GET
|
||||
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
|
||||
API monaengines.ID.HEAD
|
||||
API monaengines.ID.GET
|
||||
|
||||
//Returns status of a defined engine
|
||||
EngineID = EndpointSegment
|
||||
If RowExists('APP_INFO', EngineID) then
|
||||
EngineHealthInfo = System_Healthcheck_Services('GetEngineHealthInfo', EngineID)
|
||||
If Error_Services('NoError') then
|
||||
Healthy = EngineHealthInfo<ENGINE_HEALTH_HEALTH_STATUS$>
|
||||
If Healthy then
|
||||
ResponseCode = 200
|
||||
Message = 'Engine is healthy'
|
||||
HTTP_Services('SetResponseStatus', ResponseCode, Message)
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = EngineID
|
||||
LogData<3> = ResponseCode
|
||||
LogData<4> = Message
|
||||
LogData<5> = FullEndpointURL
|
||||
Logging_Services('AppendLog', objLogMonaEngines, LogData, @RM, @FM)
|
||||
end else
|
||||
ResponseCode = 418
|
||||
Message = 'Engine is unhealthy.'
|
||||
HTTP_Services('SetResponseStatus', ResponseCode, Message)
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = EngineID
|
||||
LogData<3> = ResponseCode
|
||||
LogData<4> = Message
|
||||
LogData<5> = FullEndpointURL
|
||||
Logging_Services('AppendLog', objLogMonaEngines, LogData, @RM, @FM)
|
||||
end
|
||||
end else
|
||||
ResponseCode = 500
|
||||
Message = Error_Services('GetMessage')
|
||||
HTTP_Services('SetResponseStatus', ResponseCode, Message)
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = EngineID
|
||||
LogData<3> = ResponseCode
|
||||
LogData<4> = Message
|
||||
LogData<5> = FullEndpointURL
|
||||
Logging_Services('AppendLog', objLogMonaEngines, LogData, @RM, @FM)
|
||||
end
|
||||
end else
|
||||
ResponseCode = 404
|
||||
Message = 'Invalid Engine ID'
|
||||
HTTP_Services('SetResponseStatus', ResponseCode, 'Invalid Engine ID.')
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = EngineID
|
||||
LogData<3> = ResponseCode
|
||||
LogData<4> = Message
|
||||
LogData<5> = FullEndpointURL
|
||||
Logging_Services('AppendLog', objLogMonaEngines, LogData, @RM, @FM)
|
||||
end
|
||||
|
||||
end api
|
||||
|
||||
Function Monaengines_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 : Monaengines_API
|
||||
|
||||
Description : API logic for the Monaengines 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 Monaengines[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Monaengines.POST
|
||||
- Monaengines.ID.PUT
|
||||
- Monaengines.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 xxx Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert API_SETUP
|
||||
$insert HTTP_INSERTS
|
||||
$insert ENGINE_HEALTH_EQUATES
|
||||
|
||||
Equ Comma$ to ','
|
||||
|
||||
Declare function System_Healthcheck_Services, Environment_Services, Logging_Services
|
||||
Declare subroutine Logging_Services
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Healthchecks\Engines\MonA'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
LogTime = Oconv(Time(), 'MTS')
|
||||
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Mona_Engine_Health_Check_Log.csv'
|
||||
Headers = 'Logging DTM' : @FM : 'EngineID' : @FM : 'ResponseCode' : @FM : 'Message' : @FM : 'Requester'
|
||||
objLogMonaEngines = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
|
||||
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
||||
|
||||
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 monaengines.HEAD
|
||||
API monaengines.GET
|
||||
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
|
||||
API monaengines.ID.HEAD
|
||||
API monaengines.ID.GET
|
||||
|
||||
//Returns status of a defined engine
|
||||
EngineID = EndpointSegment
|
||||
If RowExists('APP_INFO', EngineID) then
|
||||
EngineHealthInfo = System_Healthcheck_Services('GetEngineHealthInfo', EngineID)
|
||||
If Error_Services('NoError') then
|
||||
Healthy = EngineHealthInfo<ENGINE_HEALTH_HEALTH_STATUS$>
|
||||
If Healthy then
|
||||
ResponseCode = 200
|
||||
Message = 'Engine is healthy'
|
||||
HTTP_Services('SetResponseStatus', ResponseCode, Message)
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = EngineID
|
||||
LogData<3> = ResponseCode
|
||||
LogData<4> = Message
|
||||
LogData<5> = FullEndpointURL
|
||||
Logging_Services('AppendLog', objLogMonaEngines, LogData, @RM, @FM)
|
||||
end else
|
||||
ResponseCode = 418
|
||||
Message = 'Engine is unhealthy.'
|
||||
HTTP_Services('SetResponseStatus', ResponseCode, Message)
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = EngineID
|
||||
LogData<3> = ResponseCode
|
||||
LogData<4> = Message
|
||||
LogData<5> = FullEndpointURL
|
||||
Logging_Services('AppendLog', objLogMonaEngines, LogData, @RM, @FM)
|
||||
end
|
||||
end else
|
||||
ResponseCode = 500
|
||||
Message = Error_Services('GetMessage')
|
||||
HTTP_Services('SetResponseStatus', ResponseCode, Message)
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = EngineID
|
||||
LogData<3> = ResponseCode
|
||||
LogData<4> = Message
|
||||
LogData<5> = FullEndpointURL
|
||||
Logging_Services('AppendLog', objLogMonaEngines, LogData, @RM, @FM)
|
||||
end
|
||||
end else
|
||||
ResponseCode = 404
|
||||
Message = 'Invalid Engine ID'
|
||||
HTTP_Services('SetResponseStatus', ResponseCode, 'Invalid Engine ID.')
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = EngineID
|
||||
LogData<3> = ResponseCode
|
||||
LogData<4> = Message
|
||||
LogData<5> = FullEndpointURL
|
||||
Logging_Services('AppendLog', objLogMonaEngines, LogData, @RM, @FM)
|
||||
end
|
||||
|
||||
end api
|
||||
|
||||
|
@ -1,64 +1,64 @@
|
||||
Function Mona_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 : Mona_API
|
||||
|
||||
Description : API logic for the Mona 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 Mona[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Mona.POST
|
||||
- Mona.ID.PUT
|
||||
- Mona.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 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', 200, 'This is a valid endpoint but a web API handler has not yet been created.')
|
||||
end
|
||||
|
||||
Return Response OR ''
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Endpoint Handlers
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
API mona.HEAD
|
||||
API mona.GET
|
||||
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
Function Mona_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 : Mona_API
|
||||
|
||||
Description : API logic for the Mona 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 Mona[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Mona.POST
|
||||
- Mona.ID.PUT
|
||||
- Mona.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 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', 200, 'This is a valid endpoint but a web API handler has not yet been created.')
|
||||
end
|
||||
|
||||
Return Response OR ''
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Endpoint Handlers
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
API mona.HEAD
|
||||
API mona.GET
|
||||
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
|
@ -159,7 +159,8 @@ Service SendBufferedAverageMetric(MonaResource, MetricName, MetricValue)
|
||||
|
||||
retries = retries - 1
|
||||
|
||||
response = Httpclient_Services('SendHTTPRequest', 'POST', ApiUrl, 'Content-Type':@VM:'application/json':@FM:'Accept':@VM:'*/*', RequestBodyJson, '', '', False$, True$, '')
|
||||
response = Httpclient_Services('SendHTTPRequest', 'POST', ApiUrl, 'Content-Type':@VM:'application/json':@FM:'Accept':@VM:'*/*', RequestBodyJson, '', '', False$, False$, '')
|
||||
|
||||
If response EQ '"Request queued for processing"' then
|
||||
isSuccessful = True$
|
||||
end
|
||||
@ -167,5 +168,3 @@ Service SendBufferedAverageMetric(MonaResource, MetricName, MetricValue)
|
||||
|
||||
end service
|
||||
|
||||
|
||||
|
||||
|
@ -1,187 +1,187 @@
|
||||
Compile function NDW_LOAD_UNLOAD_EXTRA_EVENTS(CtrlEntId, Event, @PARAMS)
|
||||
#pragma precomp SRP_PreCompiler
|
||||
#window NDW_LOAD_UNLOAD_EXTRA
|
||||
|
||||
Declare subroutine End_Dialog, Post_Event, Database_Services, Error_Services, Msg
|
||||
Declare subroutine Set_Property, Rds_Services
|
||||
Declare function Database_Services, Error_Services
|
||||
Declare function Get_Property
|
||||
|
||||
$Insert EVENT_SETUP
|
||||
$Insert LOGICAL
|
||||
$Insert RDS_EQUATES
|
||||
|
||||
GoToEvent Event for CtrlEntId else
|
||||
// Event not implemented
|
||||
end
|
||||
|
||||
Return EventFlow or 1
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// EVENT HANDLERS
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Event WINDOW.CREATE(CreateParam)
|
||||
ResponseValue = Set_Property(@Window, '@responsevalue', 0)
|
||||
RDSNo = CreateParam
|
||||
If RowExists('RDS', RDSNo) then
|
||||
Set_Property(@Window : '.EDL_RDS', 'TEXT', RDSNo)
|
||||
GoSub Refresh
|
||||
end else
|
||||
ResponseValue = Set_Property(@Window, '@responsevalue', 0)
|
||||
Post_Event(@Window, 'CLOSE')
|
||||
end
|
||||
|
||||
End Event
|
||||
|
||||
Event WINDOW.CLOSE(CancelFlag)
|
||||
ResponseValue = Get_Property(@Window, '@responsevalue')
|
||||
End_Dialog(@Window, ResponseValue)
|
||||
end event
|
||||
|
||||
//Signature buttons
|
||||
|
||||
Event PUB_SIGN_UNLOAD_EX_1.CLICK()
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
Rds_Services('SignUnloadExtra1', RDSNo, @USER4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Unload Extra 1 Signed!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
GoSub Refresh
|
||||
end event
|
||||
|
||||
Event PUB_SIGN_LOAD_EX_1.CLICK()
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
Rds_Services('SignLoadExtra1', RDSNo, @USER4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Load Extra 1 Signed!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
GoSub Refresh
|
||||
end event
|
||||
|
||||
Event PUB_SIGN_UNLOAD_EX_2.CLICK()
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
Rds_Services('SignUnloadExtra2', RDSNo, @USER4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Unload Extra 2 Signed!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
GoSub Refresh
|
||||
end event
|
||||
|
||||
Event PUB_SIGN_LOAD_EX_2.CLICK()
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
Rds_Services('SignLoadExtra2', RDSNo, @USER4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Load Extra 2 Signed!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
GoSub Refresh
|
||||
end event
|
||||
|
||||
//Clear Signature Buttons
|
||||
|
||||
Event PUB_CLEAR_UNLOAD_EX_1.CLICK()
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
Rds_Services('UnsignUnloadExtra1', RDSNo, @User4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Unload Extra 1 unsigned!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
GoSub Refresh
|
||||
end event
|
||||
|
||||
Event PUB_CLEAR_LOAD_EX_1.CLICK()
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
Rds_Services('UnsignLoadExtra1', RDSNo, @User4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Load Extra 1 unsigned!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
GoSub Refresh
|
||||
end event
|
||||
|
||||
Event PUB_CLEAR_UNLOAD_EX_2.CLICK()
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
Rds_Services('UnsignUnloadExtra2', RDSNo, @User4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Unload Extra 2 unsigned!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
GoSub Refresh
|
||||
end event
|
||||
|
||||
Event PUB_CLEAR_LOAD_EX_2.CLICK()
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
Rds_Services('UnsignLoadExtra2', RDSNo, @User4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Load Extra 2 unsigned!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
GoSub Refresh
|
||||
end event
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// INTERNAL GO-SUBS
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
***************
|
||||
Refresh:
|
||||
***************
|
||||
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
If RowExists('RDS', RDSNo) then
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||
//Unload Extra 1
|
||||
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
|
||||
UnloadExtra1UserFirstLast = xlate( 'LSL_USERS', UnloadExtra1Signature, 'FIRST_LAST', 'X' )
|
||||
UnloadExtra1Date = OConv(RDSRec<RDS_OP_OUT_EX1_DATE$>, 'D')
|
||||
UnloadExtra1Time = Oconv(RDSRec<RDS_OP_OUT_EX1_TIME$>, 'MT')
|
||||
//Load Extra 1
|
||||
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
|
||||
LoadExtra1UserFirstLast = xlate( 'LSL_USERS', LoadExtra1Signature, 'FIRST_LAST', 'X' )
|
||||
LoadExtra1Date = Oconv(RDSRec<RDS_OP_IN_EX2_DATE$>, 'D')
|
||||
LoadExtra1Time = Oconv(RDSRec<RDS_OP_IN_EX2_TIME$>, 'MT')
|
||||
//Unload Extra 2
|
||||
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
|
||||
UnloadExtra2UserFirstLast = xlate( 'LSL_USERS', UnloadExtra2Signature, 'FIRST_LAST', 'X' )
|
||||
UnloadExtra2Date = Oconv(RDSRec<RDS_OP_OUT_EX2_DATE$>, 'D')
|
||||
UnloadExtra2Time = Oconv(RDSRec<RDS_OP_OUT_EX2_TIME$>, 'MT')
|
||||
//Load Extra 2
|
||||
LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$>
|
||||
LoadExtra2UserFirstLast = xlate( 'LSL_USERS', LoadExtra2Signature, 'FIRST_LAST', 'X' )
|
||||
LoadExtra2Date = Oconv(RDSRec<RDS_OP_IN_EX3_DATE$>, 'D')
|
||||
LoadExtra2Time = Oconv(RDSRec<RDS_OP_IN_EX3_TIME$>, 'MT')
|
||||
|
||||
//Populate text fields
|
||||
Set_Property(@Window : '.EDL_UNLOAD_EX_1_USER', 'TEXT', UnloadExtra1UserFirstLast)
|
||||
Set_Property(@Window : '.EDL_UNLOAD_EX_1_DATE', 'TEXT', UnloadExtra1Date)
|
||||
Set_Property(@Window : '.EDL_UNLOAD_EX_1_TIME', 'TEXT', UnloadExtra1Time)
|
||||
Set_Property(@Window : '.EDL_LOAD_EX_1_USER', 'TEXT', LoadExtra1UserFirstLast)
|
||||
Set_Property(@Window : '.EDL_LOAD_EX_1_DATE', 'TEXT', LoadExtra1Date)
|
||||
Set_Property(@Window : '.EDL_LOAD_EX_1_TIME', 'TEXT', LoadExtra1Time)
|
||||
Set_Property(@Window : '.EDL_UNLOAD_EX_2_USER', 'TEXT', UnloadExtra2UserFirstLast)
|
||||
Set_Property(@Window : '.EDL_UNLOAD_EX_2_DATE', 'TEXT', UnloadExtra2Date)
|
||||
Set_Property(@Window : '.EDL_UNLOAD_EX_2_TIME', 'TEXT', UnloadExtra2Time)
|
||||
Set_Property(@Window : '.EDL_LOAD_EX_2_USER', 'TEXT', LoadExtra2UserFirstLast)
|
||||
Set_Property(@Window : '.EDL_LOAD_EX_2_DATE', 'TEXT', LoadExtra2Date)
|
||||
Set_Property(@Window : '.EDL_LOAD_EX_2_TIME', 'TEXT', LoadExtra2Time)
|
||||
end else
|
||||
ResponseValue = Set_Property(@Window, '@responsevalue', 0)
|
||||
Post_Event(@Window, 'CLOSE')
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
|
||||
Compile function NDW_LOAD_UNLOAD_EXTRA_EVENTS(CtrlEntId, Event, @PARAMS)
|
||||
#pragma precomp SRP_PreCompiler
|
||||
#window NDW_LOAD_UNLOAD_EXTRA
|
||||
|
||||
Declare subroutine End_Dialog, Post_Event, Database_Services, Error_Services, Msg
|
||||
Declare subroutine Set_Property, Rds_Services
|
||||
Declare function Database_Services, Error_Services
|
||||
Declare function Get_Property
|
||||
|
||||
$Insert EVENT_SETUP
|
||||
$Insert LOGICAL
|
||||
$Insert RDS_EQUATES
|
||||
|
||||
GoToEvent Event for CtrlEntId else
|
||||
// Event not implemented
|
||||
end
|
||||
|
||||
Return EventFlow or 1
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// EVENT HANDLERS
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Event WINDOW.CREATE(CreateParam)
|
||||
ResponseValue = Set_Property(@Window, '@responsevalue', 0)
|
||||
RDSNo = CreateParam
|
||||
If RowExists('RDS', RDSNo) then
|
||||
Set_Property(@Window : '.EDL_RDS', 'TEXT', RDSNo)
|
||||
GoSub Refresh
|
||||
end else
|
||||
ResponseValue = Set_Property(@Window, '@responsevalue', 0)
|
||||
Post_Event(@Window, 'CLOSE')
|
||||
end
|
||||
|
||||
End Event
|
||||
|
||||
Event WINDOW.CLOSE(CancelFlag)
|
||||
ResponseValue = Get_Property(@Window, '@responsevalue')
|
||||
End_Dialog(@Window, ResponseValue)
|
||||
end event
|
||||
|
||||
//Signature buttons
|
||||
|
||||
Event PUB_SIGN_UNLOAD_EX_1.CLICK()
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
Rds_Services('SignUnloadExtra1', RDSNo, @USER4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Unload Extra 1 Signed!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
GoSub Refresh
|
||||
end event
|
||||
|
||||
Event PUB_SIGN_LOAD_EX_1.CLICK()
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
Rds_Services('SignLoadExtra1', RDSNo, @USER4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Load Extra 1 Signed!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
GoSub Refresh
|
||||
end event
|
||||
|
||||
Event PUB_SIGN_UNLOAD_EX_2.CLICK()
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
Rds_Services('SignUnloadExtra2', RDSNo, @USER4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Unload Extra 2 Signed!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
GoSub Refresh
|
||||
end event
|
||||
|
||||
Event PUB_SIGN_LOAD_EX_2.CLICK()
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
Rds_Services('SignLoadExtra2', RDSNo, @USER4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Load Extra 2 Signed!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
GoSub Refresh
|
||||
end event
|
||||
|
||||
//Clear Signature Buttons
|
||||
|
||||
Event PUB_CLEAR_UNLOAD_EX_1.CLICK()
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
Rds_Services('UnsignUnloadExtra1', RDSNo, @User4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Unload Extra 1 unsigned!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
GoSub Refresh
|
||||
end event
|
||||
|
||||
Event PUB_CLEAR_LOAD_EX_1.CLICK()
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
Rds_Services('UnsignLoadExtra1', RDSNo, @User4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Load Extra 1 unsigned!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
GoSub Refresh
|
||||
end event
|
||||
|
||||
Event PUB_CLEAR_UNLOAD_EX_2.CLICK()
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
Rds_Services('UnsignUnloadExtra2', RDSNo, @User4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Unload Extra 2 unsigned!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
GoSub Refresh
|
||||
end event
|
||||
|
||||
Event PUB_CLEAR_LOAD_EX_2.CLICK()
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
Rds_Services('UnsignLoadExtra2', RDSNo, @User4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Load Extra 2 unsigned!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
GoSub Refresh
|
||||
end event
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// INTERNAL GO-SUBS
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
***************
|
||||
Refresh:
|
||||
***************
|
||||
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
If RowExists('RDS', RDSNo) then
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||
//Unload Extra 1
|
||||
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
|
||||
UnloadExtra1UserFirstLast = xlate( 'LSL_USERS', UnloadExtra1Signature, 'FIRST_LAST', 'X' )
|
||||
UnloadExtra1Date = OConv(RDSRec<RDS_OP_OUT_EX1_DATE$>, 'D')
|
||||
UnloadExtra1Time = Oconv(RDSRec<RDS_OP_OUT_EX1_TIME$>, 'MT')
|
||||
//Load Extra 1
|
||||
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
|
||||
LoadExtra1UserFirstLast = xlate( 'LSL_USERS', LoadExtra1Signature, 'FIRST_LAST', 'X' )
|
||||
LoadExtra1Date = Oconv(RDSRec<RDS_OP_IN_EX2_DATE$>, 'D')
|
||||
LoadExtra1Time = Oconv(RDSRec<RDS_OP_IN_EX2_TIME$>, 'MT')
|
||||
//Unload Extra 2
|
||||
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
|
||||
UnloadExtra2UserFirstLast = xlate( 'LSL_USERS', UnloadExtra2Signature, 'FIRST_LAST', 'X' )
|
||||
UnloadExtra2Date = Oconv(RDSRec<RDS_OP_OUT_EX2_DATE$>, 'D')
|
||||
UnloadExtra2Time = Oconv(RDSRec<RDS_OP_OUT_EX2_TIME$>, 'MT')
|
||||
//Load Extra 2
|
||||
LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$>
|
||||
LoadExtra2UserFirstLast = xlate( 'LSL_USERS', LoadExtra2Signature, 'FIRST_LAST', 'X' )
|
||||
LoadExtra2Date = Oconv(RDSRec<RDS_OP_IN_EX3_DATE$>, 'D')
|
||||
LoadExtra2Time = Oconv(RDSRec<RDS_OP_IN_EX3_TIME$>, 'MT')
|
||||
|
||||
//Populate text fields
|
||||
Set_Property(@Window : '.EDL_UNLOAD_EX_1_USER', 'TEXT', UnloadExtra1UserFirstLast)
|
||||
Set_Property(@Window : '.EDL_UNLOAD_EX_1_DATE', 'TEXT', UnloadExtra1Date)
|
||||
Set_Property(@Window : '.EDL_UNLOAD_EX_1_TIME', 'TEXT', UnloadExtra1Time)
|
||||
Set_Property(@Window : '.EDL_LOAD_EX_1_USER', 'TEXT', LoadExtra1UserFirstLast)
|
||||
Set_Property(@Window : '.EDL_LOAD_EX_1_DATE', 'TEXT', LoadExtra1Date)
|
||||
Set_Property(@Window : '.EDL_LOAD_EX_1_TIME', 'TEXT', LoadExtra1Time)
|
||||
Set_Property(@Window : '.EDL_UNLOAD_EX_2_USER', 'TEXT', UnloadExtra2UserFirstLast)
|
||||
Set_Property(@Window : '.EDL_UNLOAD_EX_2_DATE', 'TEXT', UnloadExtra2Date)
|
||||
Set_Property(@Window : '.EDL_UNLOAD_EX_2_TIME', 'TEXT', UnloadExtra2Time)
|
||||
Set_Property(@Window : '.EDL_LOAD_EX_2_USER', 'TEXT', LoadExtra2UserFirstLast)
|
||||
Set_Property(@Window : '.EDL_LOAD_EX_2_DATE', 'TEXT', LoadExtra2Date)
|
||||
Set_Property(@Window : '.EDL_LOAD_EX_2_TIME', 'TEXT', LoadExtra2Time)
|
||||
end else
|
||||
ResponseValue = Set_Property(@Window, '@responsevalue', 0)
|
||||
Post_Event(@Window, 'CLOSE')
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
@ -148,8 +148,9 @@ Event WINDOW.CREATE(CreateParam)
|
||||
|
||||
If (AccessLevel EQ -1) OR (AccessLevel EQ '') then
|
||||
Set_Property(@Window, '@CLOSE', 1)
|
||||
Post_Event(@Window, 'CLOSE')
|
||||
// This prevents OI from throwing an error message if the cancel button is pressed on the LOGON form.
|
||||
If (Server EQ 'MESST5201') or (Server EQ 'MESST5202') then Utility("DESTROY", "SYSTEM")
|
||||
//If (Server EQ 'MESST5201') or (Server EQ 'MESST5202') then Utility("DESTROY", "SYSTEM")
|
||||
end
|
||||
|
||||
If AccessLevel GE 0 then
|
||||
|
@ -1,149 +1,149 @@
|
||||
Compile function NDW_MANUAL_WAFER_COUNT_EVENTS(CtrlEntId, Event, @PARAMS)
|
||||
/***********************************************************************************************************************
|
||||
|
||||
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 Infineon.
|
||||
|
||||
Name : NDW_Manual_Wafer_Count_Events
|
||||
|
||||
Description : This function acts as a commuter module for all events related to this window.
|
||||
|
||||
Notes : Commuter Modules are automatically called from the Promoted_Events function which is called by the
|
||||
application-specific promoted event handler. This makes it possible to add QuickEvents that need to
|
||||
execute Basic+ logic without having use the Form Designer to make the association, although this is
|
||||
limited to the events which are currently promoted.
|
||||
|
||||
If the form needs to call the commuter module directly then the QuickEvent parameters should be
|
||||
formatted like this:
|
||||
|
||||
'@SELF','@EVENT',['@PARAM1','@PARAMx']
|
||||
|
||||
Parameters :
|
||||
CtrlEntId [in] -- The fully qualified name of the control calling the promoted event
|
||||
Event [in] -- The event being executed. See the Notes section regarding "PRE" events
|
||||
Param1-15 [in] -- Additional event parameter holders
|
||||
EventFlow [out] -- Set to 1 or 0 so the calling event knows whether or not to chain forward. See comments in
|
||||
EVENT_SETUP insert
|
||||
|
||||
History : (Date, Initials, Notes)
|
||||
04/12/24 djs Created initial commuter module.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
#window NDW_MANUAL_WAFER_COUNT
|
||||
|
||||
$Insert EVENT_SETUP
|
||||
$Insert APP_INSERTS
|
||||
$Insert MSG_EQUATES
|
||||
|
||||
Equ MSG_WIDTH$ to 650
|
||||
Equ Comma$ to ','
|
||||
|
||||
Declare function Environment_Services, Logging_Services, Datetime
|
||||
Declare subroutine Set_Property, Logging_Services
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WaferCounter'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
LogTime = Oconv(Time(), 'MTS')
|
||||
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Wafer Counter Verify Log.csv'
|
||||
Headers = 'Logging DTM':@FM:'Logging Text'
|
||||
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
|
||||
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
||||
|
||||
// Update the arguments so that the OpenInsight OLE event will treate the ActiveX event as a native event handler.
|
||||
If Event EQ 'OLE' then
|
||||
Transfer Event to OIEvent
|
||||
Transfer Param1 to Event
|
||||
Transfer Param2 to Param1
|
||||
Transfer Param3 to Param2
|
||||
Transfer Param4 to Param3
|
||||
Transfer Param5 to Param4
|
||||
Transfer Param6 to Param5
|
||||
Transfer Param7 to Param6
|
||||
Transfer Param8 to Param7
|
||||
end
|
||||
|
||||
GoToEvent Event for CtrlEntID
|
||||
|
||||
Return EventFlow else EVENT_CONTINUE$
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// EVENT HANDLERS
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Event WINDOW.CREATE(CreateParam)
|
||||
|
||||
If CreateParam NE '' then
|
||||
|
||||
Set_Property(@Window, '@EXPECTED_QTY', CreateParam)
|
||||
List = ''
|
||||
For SlotIndex = 0 to 25
|
||||
List<SlotIndex + 1> = SlotIndex
|
||||
Next SlotIndex
|
||||
Set_Property(@Window:'.CBO_WAFER_COUNT', 'LIST', List)
|
||||
|
||||
end else
|
||||
|
||||
ErrorMsg = 'Wafer counter error. Null expected quantity passed in.'
|
||||
LogData = ''
|
||||
LogData<1> = OConv(Datetime(), 'DT2/^H')
|
||||
LogData<2> = @User4
|
||||
LogData<3> = ErrorMsg
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||
|
||||
MsgStruct = ''
|
||||
MsgStruct<MTEXTWIDTH$> = MSG_WIDTH$
|
||||
Msg(@Window, MsgStruct, 'PROCESS_ERROR', '', ErrorMsg)
|
||||
End_Dialog(@Window, '')
|
||||
end
|
||||
|
||||
End Event
|
||||
|
||||
|
||||
Event CBO_WAFER_COUNT.CHANGED(NewData)
|
||||
|
||||
Set_Property(@Window:'.PUB_OK', 'ENABLED', (NewData NE '') )
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event PUB_OK.CLICK()
|
||||
|
||||
ExpectedQty = Get_Property(@Window, '@EXPECTED_QTY')
|
||||
WaferCount = Get_Property(@Window:'.CBO_WAFER_COUNT', 'TEXT')
|
||||
If ExpectedQty EQ WaferCount then
|
||||
LogData = ''
|
||||
LogData<1> = OConv(Datetime(), 'DT2/^H')
|
||||
LogData<2> = @User4
|
||||
LogData<3> = 'Expected quantity equals entered quantity. Proceeding...'
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||
|
||||
End_Dialog(@Window, WaferCount)
|
||||
end else
|
||||
ErrorMsg = 'Wafer counter error. Expected quantity "':ExpectedQty:'" does not match entered quantity "':WaferCount:'".'
|
||||
LogData = ''
|
||||
LogData<1> = OConv(Datetime(), 'DT2/^H')
|
||||
LogData<2> = @User4
|
||||
LogData<3> = ErrorMsg
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||
MsgStruct = ''
|
||||
MsgStruct<MTEXTWIDTH$> = MSG_WIDTH$
|
||||
Msg(@Window, MsgStruct, 'PROCESS_ERROR', '', ErrorMsg)
|
||||
end
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event PUB_CANCEL.CLICK()
|
||||
|
||||
LogData = ''
|
||||
LogData<1> = OConv(Datetime(), 'DT2/^H')
|
||||
LogData<2> = @User4
|
||||
LogData<3> = 'Manual verification process canceled'
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||
End_Dialog(@Window, '')
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Compile function NDW_MANUAL_WAFER_COUNT_EVENTS(CtrlEntId, Event, @PARAMS)
|
||||
/***********************************************************************************************************************
|
||||
|
||||
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 Infineon.
|
||||
|
||||
Name : NDW_Manual_Wafer_Count_Events
|
||||
|
||||
Description : This function acts as a commuter module for all events related to this window.
|
||||
|
||||
Notes : Commuter Modules are automatically called from the Promoted_Events function which is called by the
|
||||
application-specific promoted event handler. This makes it possible to add QuickEvents that need to
|
||||
execute Basic+ logic without having use the Form Designer to make the association, although this is
|
||||
limited to the events which are currently promoted.
|
||||
|
||||
If the form needs to call the commuter module directly then the QuickEvent parameters should be
|
||||
formatted like this:
|
||||
|
||||
'@SELF','@EVENT',['@PARAM1','@PARAMx']
|
||||
|
||||
Parameters :
|
||||
CtrlEntId [in] -- The fully qualified name of the control calling the promoted event
|
||||
Event [in] -- The event being executed. See the Notes section regarding "PRE" events
|
||||
Param1-15 [in] -- Additional event parameter holders
|
||||
EventFlow [out] -- Set to 1 or 0 so the calling event knows whether or not to chain forward. See comments in
|
||||
EVENT_SETUP insert
|
||||
|
||||
History : (Date, Initials, Notes)
|
||||
04/12/24 djs Created initial commuter module.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
#window NDW_MANUAL_WAFER_COUNT
|
||||
|
||||
$Insert EVENT_SETUP
|
||||
$Insert APP_INSERTS
|
||||
$Insert MSG_EQUATES
|
||||
|
||||
Equ MSG_WIDTH$ to 650
|
||||
Equ Comma$ to ','
|
||||
|
||||
Declare function Environment_Services, Logging_Services, Datetime
|
||||
Declare subroutine Set_Property, Logging_Services
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WaferCounter'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
LogTime = Oconv(Time(), 'MTS')
|
||||
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Wafer Counter Verify Log.csv'
|
||||
Headers = 'Logging DTM':@FM:'Logging Text'
|
||||
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
|
||||
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
||||
|
||||
// Update the arguments so that the OpenInsight OLE event will treate the ActiveX event as a native event handler.
|
||||
If Event EQ 'OLE' then
|
||||
Transfer Event to OIEvent
|
||||
Transfer Param1 to Event
|
||||
Transfer Param2 to Param1
|
||||
Transfer Param3 to Param2
|
||||
Transfer Param4 to Param3
|
||||
Transfer Param5 to Param4
|
||||
Transfer Param6 to Param5
|
||||
Transfer Param7 to Param6
|
||||
Transfer Param8 to Param7
|
||||
end
|
||||
|
||||
GoToEvent Event for CtrlEntID
|
||||
|
||||
Return EventFlow else EVENT_CONTINUE$
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// EVENT HANDLERS
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Event WINDOW.CREATE(CreateParam)
|
||||
|
||||
If CreateParam NE '' then
|
||||
|
||||
Set_Property(@Window, '@EXPECTED_QTY', CreateParam)
|
||||
List = ''
|
||||
For SlotIndex = 0 to 25
|
||||
List<SlotIndex + 1> = SlotIndex
|
||||
Next SlotIndex
|
||||
Set_Property(@Window:'.CBO_WAFER_COUNT', 'LIST', List)
|
||||
|
||||
end else
|
||||
|
||||
ErrorMsg = 'Wafer counter error. Null expected quantity passed in.'
|
||||
LogData = ''
|
||||
LogData<1> = OConv(Datetime(), 'DT2/^H')
|
||||
LogData<2> = @User4
|
||||
LogData<3> = ErrorMsg
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||
|
||||
MsgStruct = ''
|
||||
MsgStruct<MTEXTWIDTH$> = MSG_WIDTH$
|
||||
Msg(@Window, MsgStruct, 'PROCESS_ERROR', '', ErrorMsg)
|
||||
End_Dialog(@Window, '')
|
||||
end
|
||||
|
||||
End Event
|
||||
|
||||
|
||||
Event CBO_WAFER_COUNT.CHANGED(NewData)
|
||||
|
||||
Set_Property(@Window:'.PUB_OK', 'ENABLED', (NewData NE '') )
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event PUB_OK.CLICK()
|
||||
|
||||
ExpectedQty = Get_Property(@Window, '@EXPECTED_QTY')
|
||||
WaferCount = Get_Property(@Window:'.CBO_WAFER_COUNT', 'TEXT')
|
||||
If ExpectedQty EQ WaferCount then
|
||||
LogData = ''
|
||||
LogData<1> = OConv(Datetime(), 'DT2/^H')
|
||||
LogData<2> = @User4
|
||||
LogData<3> = 'Expected quantity equals entered quantity. Proceeding...'
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||
|
||||
End_Dialog(@Window, WaferCount)
|
||||
end else
|
||||
ErrorMsg = 'Wafer counter error. Expected quantity "':ExpectedQty:'" does not match entered quantity "':WaferCount:'".'
|
||||
LogData = ''
|
||||
LogData<1> = OConv(Datetime(), 'DT2/^H')
|
||||
LogData<2> = @User4
|
||||
LogData<3> = ErrorMsg
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||
MsgStruct = ''
|
||||
MsgStruct<MTEXTWIDTH$> = MSG_WIDTH$
|
||||
Msg(@Window, MsgStruct, 'PROCESS_ERROR', '', ErrorMsg)
|
||||
end
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event PUB_CANCEL.CLICK()
|
||||
|
||||
LogData = ''
|
||||
LogData<1> = OConv(Datetime(), 'DT2/^H')
|
||||
LogData<2> = @User4
|
||||
LogData<3> = 'Manual verification process canceled'
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||
End_Dialog(@Window, '')
|
||||
|
||||
end event
|
||||
|
||||
|
||||
|
@ -1,120 +1,120 @@
|
||||
Compile function NDW_PM_OVERRIDE_EVENTS(CtrlEntId, Event, @PARAMS)
|
||||
/***********************************************************************************************************************
|
||||
|
||||
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 Infineon.
|
||||
|
||||
Name : NDW_PM_Override_Events
|
||||
|
||||
Description : This function acts as a commuter module for all events related to this window.
|
||||
|
||||
Notes : Commuter Modules are automatically called from the Promoted_Events function which is called by the
|
||||
application-specific promoted event handler. This makes it possible to add QuickEvents that need to
|
||||
execute Basic+ logic without having use the Form Designer to make the association, although this is
|
||||
limited to the events which are currently promoted.
|
||||
|
||||
If the form needs to call the commuter module directly then the QuickEvent parameters should be
|
||||
formatted like this:
|
||||
|
||||
'@SELF','@EVENT',['@PARAM1','@PARAMx']
|
||||
|
||||
Parameters :
|
||||
CtrlEntId [in] -- The fully qualified name of the control calling the promoted event
|
||||
Event [in] -- The event being executed. See the Notes section regarding "PRE" events
|
||||
Param1-15 [in] -- Additional event parameter holders
|
||||
EventFlow [out] -- Set to 1 or 0 so the calling event knows whether or not to chain forward. See comments in
|
||||
EVENT_SETUP insert
|
||||
|
||||
History : (Date, Initials, Notes)
|
||||
06/25/24 djs Created initial commuter module.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
#pragma precomp SRP_PreCompiler
|
||||
#window NDW_PM_OVERRIDE
|
||||
|
||||
$Insert APP_INSERTS
|
||||
$Insert EVENT_SETUP
|
||||
$Insert REACTOR_LOG_EQUATES
|
||||
$insert MESSAGE_BOX_EQUATES
|
||||
|
||||
Declare subroutine Placedialog, Message_Box
|
||||
|
||||
// Update the arguments so that the OpenInsight OLE event will treate the ActiveX event as a native event handler.
|
||||
If Event EQ 'OLE' then
|
||||
Transfer Event to OIEvent
|
||||
Transfer Param1 to Event
|
||||
Transfer Param2 to Param1
|
||||
Transfer Param3 to Param2
|
||||
Transfer Param4 to Param3
|
||||
Transfer Param5 to Param4
|
||||
Transfer Param6 to Param5
|
||||
Transfer Param7 to Param6
|
||||
Transfer Param8 to Param7
|
||||
end
|
||||
|
||||
GoToEvent Event for CtrlEntId else
|
||||
// Event not implemented
|
||||
end
|
||||
|
||||
Return EventFlow or 1
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// EVENT HANDLERS
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Event WINDOW.CREATE(CreateParam)
|
||||
|
||||
RlNo = CreateParam
|
||||
PmOrderTypes = Xlate('REACTOR_LOG', RLNo, REACTOR_LOG_CHECKLIST_TYPE$, 'X')
|
||||
for each PmOrderType in PmOrderTypes using @VM setting dummy
|
||||
Begin Case
|
||||
Case PmOrderType _EQC 'ASM_HTR_TUBE_CHANGE'
|
||||
Set_Property(@Window:'.CHB_ASM_HTR_TUBE_CHANGE', 'ENABLED', True$)
|
||||
Case PmOrderType _EQC 'SEMIANNUAL_PM'
|
||||
Set_Property(@Window:'.CHB_SEMIANNUAL_PM', 'ENABLED', True$)
|
||||
Case PmOrderType _EQC 'ANNUAL_PM'
|
||||
Set_Property(@Window:'.CHB_ANNUAL_PM', 'ENABLED', True$)
|
||||
Case Otherwise$
|
||||
Null
|
||||
End Case
|
||||
Next PmOrderType
|
||||
|
||||
Placedialog(-2, -2)
|
||||
|
||||
End Event
|
||||
|
||||
|
||||
Event PUB_SUBMIT.CLICK()
|
||||
|
||||
OverrideData = ''
|
||||
SelectedTypes = ''
|
||||
If Get_Property(@Window:'.CHB_ASM_HTR_TUBE_CHANGE', 'CHECK') then SelectedTypes<0, -1> = "ASM_HTR_TUBE_CHANGE"
|
||||
If Get_Property(@Window:'.CHB_SEMIANNUAL_PM', 'CHECK') then SelectedTypes<0, -1> = 'SEMIANNUAL_PM'
|
||||
If Get_Property(@Window:'.CHB_ANNUAL_PM', 'CHECK') then SelectedTypes<0, -1> = 'ANNUAL_PM'
|
||||
|
||||
If SelectedTypes EQ '' then
|
||||
Message_Box(@Window, "You must select at least one PM type!", "Error", MSG_ICON_EXCLAM$)
|
||||
return
|
||||
end else
|
||||
OverrideData<1, 1> = SelectedTypes
|
||||
end
|
||||
|
||||
OverrideData<2, 1> = Get_Property(@Window:'.EDB_COMMENT', 'TEXT')
|
||||
|
||||
If OverrideData<2, 1> EQ '' or Len(OverrideData<2, 1>) LT 4 then
|
||||
Message_Box(@Window, "Your comment must be at least 4 characters!", "Error", MSG_ICON_EXCLAM$)
|
||||
return
|
||||
end
|
||||
|
||||
End_Dialog(@Window, OverrideData)
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event PUB_CANCEL.CLICK()
|
||||
|
||||
End_Dialog(@Window, '')
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Compile function NDW_PM_OVERRIDE_EVENTS(CtrlEntId, Event, @PARAMS)
|
||||
/***********************************************************************************************************************
|
||||
|
||||
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 Infineon.
|
||||
|
||||
Name : NDW_PM_Override_Events
|
||||
|
||||
Description : This function acts as a commuter module for all events related to this window.
|
||||
|
||||
Notes : Commuter Modules are automatically called from the Promoted_Events function which is called by the
|
||||
application-specific promoted event handler. This makes it possible to add QuickEvents that need to
|
||||
execute Basic+ logic without having use the Form Designer to make the association, although this is
|
||||
limited to the events which are currently promoted.
|
||||
|
||||
If the form needs to call the commuter module directly then the QuickEvent parameters should be
|
||||
formatted like this:
|
||||
|
||||
'@SELF','@EVENT',['@PARAM1','@PARAMx']
|
||||
|
||||
Parameters :
|
||||
CtrlEntId [in] -- The fully qualified name of the control calling the promoted event
|
||||
Event [in] -- The event being executed. See the Notes section regarding "PRE" events
|
||||
Param1-15 [in] -- Additional event parameter holders
|
||||
EventFlow [out] -- Set to 1 or 0 so the calling event knows whether or not to chain forward. See comments in
|
||||
EVENT_SETUP insert
|
||||
|
||||
History : (Date, Initials, Notes)
|
||||
06/25/24 djs Created initial commuter module.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
#pragma precomp SRP_PreCompiler
|
||||
#window NDW_PM_OVERRIDE
|
||||
|
||||
$Insert APP_INSERTS
|
||||
$Insert EVENT_SETUP
|
||||
$Insert REACTOR_LOG_EQUATES
|
||||
$insert MESSAGE_BOX_EQUATES
|
||||
|
||||
Declare subroutine Placedialog, Message_Box
|
||||
|
||||
// Update the arguments so that the OpenInsight OLE event will treate the ActiveX event as a native event handler.
|
||||
If Event EQ 'OLE' then
|
||||
Transfer Event to OIEvent
|
||||
Transfer Param1 to Event
|
||||
Transfer Param2 to Param1
|
||||
Transfer Param3 to Param2
|
||||
Transfer Param4 to Param3
|
||||
Transfer Param5 to Param4
|
||||
Transfer Param6 to Param5
|
||||
Transfer Param7 to Param6
|
||||
Transfer Param8 to Param7
|
||||
end
|
||||
|
||||
GoToEvent Event for CtrlEntId else
|
||||
// Event not implemented
|
||||
end
|
||||
|
||||
Return EventFlow or 1
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// EVENT HANDLERS
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Event WINDOW.CREATE(CreateParam)
|
||||
|
||||
RlNo = CreateParam
|
||||
PmOrderTypes = Xlate('REACTOR_LOG', RLNo, REACTOR_LOG_CHECKLIST_TYPE$, 'X')
|
||||
for each PmOrderType in PmOrderTypes using @VM setting dummy
|
||||
Begin Case
|
||||
Case PmOrderType _EQC 'ASM_HTR_TUBE_CHANGE'
|
||||
Set_Property(@Window:'.CHB_ASM_HTR_TUBE_CHANGE', 'ENABLED', True$)
|
||||
Case PmOrderType _EQC 'SEMIANNUAL_PM'
|
||||
Set_Property(@Window:'.CHB_SEMIANNUAL_PM', 'ENABLED', True$)
|
||||
Case PmOrderType _EQC 'ANNUAL_PM'
|
||||
Set_Property(@Window:'.CHB_ANNUAL_PM', 'ENABLED', True$)
|
||||
Case Otherwise$
|
||||
Null
|
||||
End Case
|
||||
Next PmOrderType
|
||||
|
||||
Placedialog(-2, -2)
|
||||
|
||||
End Event
|
||||
|
||||
|
||||
Event PUB_SUBMIT.CLICK()
|
||||
|
||||
OverrideData = ''
|
||||
SelectedTypes = ''
|
||||
If Get_Property(@Window:'.CHB_ASM_HTR_TUBE_CHANGE', 'CHECK') then SelectedTypes<0, -1> = "ASM_HTR_TUBE_CHANGE"
|
||||
If Get_Property(@Window:'.CHB_SEMIANNUAL_PM', 'CHECK') then SelectedTypes<0, -1> = 'SEMIANNUAL_PM'
|
||||
If Get_Property(@Window:'.CHB_ANNUAL_PM', 'CHECK') then SelectedTypes<0, -1> = 'ANNUAL_PM'
|
||||
|
||||
If SelectedTypes EQ '' then
|
||||
Message_Box(@Window, "You must select at least one PM type!", "Error", MSG_ICON_EXCLAM$)
|
||||
return
|
||||
end else
|
||||
OverrideData<1, 1> = SelectedTypes
|
||||
end
|
||||
|
||||
OverrideData<2, 1> = Get_Property(@Window:'.EDB_COMMENT', 'TEXT')
|
||||
|
||||
If OverrideData<2, 1> EQ '' or Len(OverrideData<2, 1>) LT 4 then
|
||||
Message_Box(@Window, "Your comment must be at least 4 characters!", "Error", MSG_ICON_EXCLAM$)
|
||||
return
|
||||
end
|
||||
|
||||
End_Dialog(@Window, OverrideData)
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event PUB_CANCEL.CLICK()
|
||||
|
||||
End_Dialog(@Window, '')
|
||||
|
||||
end event
|
||||
|
||||
|
||||
|
@ -1,189 +1,189 @@
|
||||
Function NDW_Remove_Supplements_Events(CtrlEntId, Event, @PARAMS)
|
||||
/***********************************************************************************************************************
|
||||
|
||||
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 Infineon.
|
||||
|
||||
Name : NDW_Remove_Supplements_Events
|
||||
|
||||
Description : This function acts as a commuter module for all events related to this window.
|
||||
|
||||
Notes : Commuter Modules are automatically called from the Promoted_Events function which is called by the
|
||||
application-specific promoted event handler. This makes it possible to add QuickEvents that need to
|
||||
execute Basic+ logic without having use the Form Designer to make the association, although this is
|
||||
limited to the events which are currently promoted.
|
||||
|
||||
If the form needs to call the commuter module directly then the QuickEvent parameters should be
|
||||
formatted like this:
|
||||
|
||||
'@SELF','@EVENT',['@PARAM1','@PARAMx']
|
||||
|
||||
Parameters :
|
||||
CtrlEntId [in] -- The fully qualified name of the control calling the promoted event
|
||||
Event [in] -- The event being executed. See the Notes section regarding "PRE" events
|
||||
Param1-15 [in] -- Additional event parameter holders
|
||||
EventFlow [out] -- Set to 1 or 0 so the calling event knows whether or not to chain forward. See comments in
|
||||
EVENT_SETUP insert
|
||||
|
||||
History : (Date, Initials, Notes)
|
||||
05/24/18 djs Created initial commuter module.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
#Window NDW_ADD_SUPPLEMENT
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert EVENT_SETUP
|
||||
$insert MSG_EQUATES
|
||||
$Insert SUPPLEMENTS_EQUATES
|
||||
|
||||
Declare subroutine SRP_Show_Window, Supplement_Services
|
||||
Declare function SRP_Array, Supplement_Services
|
||||
|
||||
SubclassInfo = Form_Services('FindSubclassControl')
|
||||
Subclass = SubclassInfo<1>
|
||||
|
||||
// Update the arguments so that the OpenInsight OLE event will treate the ActiveX event as a native event handler.
|
||||
If Event EQ 'OLE' then
|
||||
Transfer Event to OIEvent
|
||||
Transfer Param1 to Event
|
||||
Transfer Param2 to Param1
|
||||
Transfer Param3 to Param2
|
||||
* Transfer Param4 to Param3
|
||||
* Transfer Param5 to Param4
|
||||
* Transfer Param6 to Param5
|
||||
* Transfer Param7 to Param6
|
||||
* Transfer Param8 to Param7
|
||||
end
|
||||
|
||||
GoToEvent Event for CtrlEntID
|
||||
|
||||
Return EventFlow else EVENT_CONTINUE$
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Events
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Event WINDOW.CREATE(CreateParam)
|
||||
|
||||
Result = ''
|
||||
SupplInst = ''
|
||||
GoSub Setup_OLE_Controls
|
||||
If CreateParam NE '' then
|
||||
Gosub PopulateStages
|
||||
Set_Property(@Window : '.CMB_STAGE', 'LIST', StageList)
|
||||
Set_Property(@Window : '.CMB_STAGE', 'SELPOS', 1)
|
||||
Set_Property(@Window : '.PUB_OK', 'ENABLED', True$)
|
||||
end
|
||||
|
||||
Gosub CheckForSupplements
|
||||
SRP_Show_Window(@Window, '', 'C', 'C', 1, '', False$, False$, FormSize)
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event WINDOW.CLOSE(CancelFlag)
|
||||
|
||||
Result = ''
|
||||
Result<1> = False$
|
||||
End_Dialog(@Window, Result)
|
||||
|
||||
end event
|
||||
|
||||
Event CMB_STAGE.CHANGED(CreateParam)
|
||||
|
||||
Gosub CheckForSupplements
|
||||
|
||||
end event
|
||||
|
||||
|
||||
|
||||
Event PUB_OK.CLICK()
|
||||
|
||||
Removal = ''
|
||||
StageSel = Get_Property(@Window : '.CMB_STAGE', 'TEXT')
|
||||
StageSel = Field(StageSel, '-', 2)
|
||||
For Each RDSKey in @ReCur1 Using @VM
|
||||
Removal = Supplement_Services('DeleteSupplementByLotStage', @USER4, 'RDS', RDSKey, StageSel)
|
||||
Next RDSKey
|
||||
|
||||
If Error_Services('NoError') then
|
||||
Result = True$
|
||||
End else
|
||||
|
||||
End
|
||||
End_Dialog(@Window, Result)
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event PUB_CANCEL.CLICK()
|
||||
|
||||
Result = ''
|
||||
Result<1> = False$
|
||||
End_Dialog(@Window, Result)
|
||||
|
||||
end event
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Setup_OLE_Controls:
|
||||
|
||||
Qualify = ''
|
||||
Qualify<1> = 1
|
||||
Qualify<4> = 0
|
||||
|
||||
return
|
||||
|
||||
PopulateStages:
|
||||
|
||||
DraftStageList = ''
|
||||
PlainTextStages = ''
|
||||
RDSList = SRP_Array("Rotate", CreateParam)
|
||||
@ReCur1 = RDSList<5>
|
||||
|
||||
For Each RDSKey in @ReCur1 Using @VM
|
||||
RDSStageList = Supplement_Services('GetStagesForLot', 'RDS', RDSKey)
|
||||
RDSStageList2 = RDSStageList<2> :@FM: RDSStageList<1>
|
||||
RDSStageList3 = SRP_Array("Rotate", RDSStageList2)
|
||||
DraftStageList := RDSStageList3 :@FM
|
||||
Next RDSKey
|
||||
Swap @VM with ' -' in DraftStageList
|
||||
StageList = SRP_Array('Clean', DraftStageList, "TrimAndMakeUnique", @FM)
|
||||
return
|
||||
|
||||
|
||||
|
||||
CheckForSupplements:
|
||||
|
||||
SuppFound = ''
|
||||
StageSel = Get_Property(@Window : '.CMB_STAGE', 'TEXT')
|
||||
Stage = Field(StageSel, '-', 2)
|
||||
For Each RDSKey in @ReCur1 Using @VM
|
||||
SuppFound = Supplement_Services('GetSupplementsForLot', 'RDS', RDSKey, Stage)
|
||||
Until SuppFound NE False$
|
||||
Next RDSKey
|
||||
If SuppFound NE False$ then
|
||||
SuppText = Xlate('SUPPLEMENTS', SuppFound, SUPPLEMENTS_SUPPL_TEXT$, 'X', '')
|
||||
If SuppText NE '' then
|
||||
Set_Property(@Window : '.EDL_SUPPL_INST', 'TEXT', SuppText)
|
||||
Set_Property(@Window : '.PUB_OK', 'ENABLED', True$)
|
||||
end else
|
||||
Set_Property(@Window : '.EDL_SUPPL_INST', 'TEXT', '')
|
||||
Set_Property(@Window : '.PUB_OK', 'ENABLED', False$)
|
||||
end
|
||||
end else
|
||||
Set_Property(@Window : '.EDL_SUPPL_INST', 'TEXT', '')
|
||||
Set_Property(@Window : '.PUB_OK', 'ENABLED', False$)
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
Function NDW_Remove_Supplements_Events(CtrlEntId, Event, @PARAMS)
|
||||
/***********************************************************************************************************************
|
||||
|
||||
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 Infineon.
|
||||
|
||||
Name : NDW_Remove_Supplements_Events
|
||||
|
||||
Description : This function acts as a commuter module for all events related to this window.
|
||||
|
||||
Notes : Commuter Modules are automatically called from the Promoted_Events function which is called by the
|
||||
application-specific promoted event handler. This makes it possible to add QuickEvents that need to
|
||||
execute Basic+ logic without having use the Form Designer to make the association, although this is
|
||||
limited to the events which are currently promoted.
|
||||
|
||||
If the form needs to call the commuter module directly then the QuickEvent parameters should be
|
||||
formatted like this:
|
||||
|
||||
'@SELF','@EVENT',['@PARAM1','@PARAMx']
|
||||
|
||||
Parameters :
|
||||
CtrlEntId [in] -- The fully qualified name of the control calling the promoted event
|
||||
Event [in] -- The event being executed. See the Notes section regarding "PRE" events
|
||||
Param1-15 [in] -- Additional event parameter holders
|
||||
EventFlow [out] -- Set to 1 or 0 so the calling event knows whether or not to chain forward. See comments in
|
||||
EVENT_SETUP insert
|
||||
|
||||
History : (Date, Initials, Notes)
|
||||
05/24/18 djs Created initial commuter module.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
#Window NDW_ADD_SUPPLEMENT
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert EVENT_SETUP
|
||||
$insert MSG_EQUATES
|
||||
$Insert SUPPLEMENTS_EQUATES
|
||||
|
||||
Declare subroutine SRP_Show_Window, Supplement_Services
|
||||
Declare function SRP_Array, Supplement_Services
|
||||
|
||||
SubclassInfo = Form_Services('FindSubclassControl')
|
||||
Subclass = SubclassInfo<1>
|
||||
|
||||
// Update the arguments so that the OpenInsight OLE event will treate the ActiveX event as a native event handler.
|
||||
If Event EQ 'OLE' then
|
||||
Transfer Event to OIEvent
|
||||
Transfer Param1 to Event
|
||||
Transfer Param2 to Param1
|
||||
Transfer Param3 to Param2
|
||||
* Transfer Param4 to Param3
|
||||
* Transfer Param5 to Param4
|
||||
* Transfer Param6 to Param5
|
||||
* Transfer Param7 to Param6
|
||||
* Transfer Param8 to Param7
|
||||
end
|
||||
|
||||
GoToEvent Event for CtrlEntID
|
||||
|
||||
Return EventFlow else EVENT_CONTINUE$
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Events
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Event WINDOW.CREATE(CreateParam)
|
||||
|
||||
Result = ''
|
||||
SupplInst = ''
|
||||
GoSub Setup_OLE_Controls
|
||||
If CreateParam NE '' then
|
||||
Gosub PopulateStages
|
||||
Set_Property(@Window : '.CMB_STAGE', 'LIST', StageList)
|
||||
Set_Property(@Window : '.CMB_STAGE', 'SELPOS', 1)
|
||||
Set_Property(@Window : '.PUB_OK', 'ENABLED', True$)
|
||||
end
|
||||
|
||||
Gosub CheckForSupplements
|
||||
SRP_Show_Window(@Window, '', 'C', 'C', 1, '', False$, False$, FormSize)
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event WINDOW.CLOSE(CancelFlag)
|
||||
|
||||
Result = ''
|
||||
Result<1> = False$
|
||||
End_Dialog(@Window, Result)
|
||||
|
||||
end event
|
||||
|
||||
Event CMB_STAGE.CHANGED(CreateParam)
|
||||
|
||||
Gosub CheckForSupplements
|
||||
|
||||
end event
|
||||
|
||||
|
||||
|
||||
Event PUB_OK.CLICK()
|
||||
|
||||
Removal = ''
|
||||
StageSel = Get_Property(@Window : '.CMB_STAGE', 'TEXT')
|
||||
StageSel = Field(StageSel, '-', 2)
|
||||
For Each RDSKey in @ReCur1 Using @VM
|
||||
Removal = Supplement_Services('DeleteSupplementByLotStage', @USER4, 'RDS', RDSKey, StageSel)
|
||||
Next RDSKey
|
||||
|
||||
If Error_Services('NoError') then
|
||||
Result = True$
|
||||
End else
|
||||
|
||||
End
|
||||
End_Dialog(@Window, Result)
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event PUB_CANCEL.CLICK()
|
||||
|
||||
Result = ''
|
||||
Result<1> = False$
|
||||
End_Dialog(@Window, Result)
|
||||
|
||||
end event
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Setup_OLE_Controls:
|
||||
|
||||
Qualify = ''
|
||||
Qualify<1> = 1
|
||||
Qualify<4> = 0
|
||||
|
||||
return
|
||||
|
||||
PopulateStages:
|
||||
|
||||
DraftStageList = ''
|
||||
PlainTextStages = ''
|
||||
RDSList = SRP_Array("Rotate", CreateParam)
|
||||
@ReCur1 = RDSList<5>
|
||||
|
||||
For Each RDSKey in @ReCur1 Using @VM
|
||||
RDSStageList = Supplement_Services('GetStagesForLot', 'RDS', RDSKey)
|
||||
RDSStageList2 = RDSStageList<2> :@FM: RDSStageList<1>
|
||||
RDSStageList3 = SRP_Array("Rotate", RDSStageList2)
|
||||
DraftStageList := RDSStageList3 :@FM
|
||||
Next RDSKey
|
||||
Swap @VM with ' -' in DraftStageList
|
||||
StageList = SRP_Array('Clean', DraftStageList, "TrimAndMakeUnique", @FM)
|
||||
return
|
||||
|
||||
|
||||
|
||||
CheckForSupplements:
|
||||
|
||||
SuppFound = ''
|
||||
StageSel = Get_Property(@Window : '.CMB_STAGE', 'TEXT')
|
||||
Stage = Field(StageSel, '-', 2)
|
||||
For Each RDSKey in @ReCur1 Using @VM
|
||||
SuppFound = Supplement_Services('GetSupplementsForLot', 'RDS', RDSKey, Stage)
|
||||
Until SuppFound NE False$
|
||||
Next RDSKey
|
||||
If SuppFound NE False$ then
|
||||
SuppText = Xlate('SUPPLEMENTS', SuppFound, SUPPLEMENTS_SUPPL_TEXT$, 'X', '')
|
||||
If SuppText NE '' then
|
||||
Set_Property(@Window : '.EDL_SUPPL_INST', 'TEXT', SuppText)
|
||||
Set_Property(@Window : '.PUB_OK', 'ENABLED', True$)
|
||||
end else
|
||||
Set_Property(@Window : '.EDL_SUPPL_INST', 'TEXT', '')
|
||||
Set_Property(@Window : '.PUB_OK', 'ENABLED', False$)
|
||||
end
|
||||
end else
|
||||
Set_Property(@Window : '.EDL_SUPPL_INST', 'TEXT', '')
|
||||
Set_Property(@Window : '.PUB_OK', 'ENABLED', False$)
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -429,21 +429,23 @@ SAPCreate:
|
||||
SendReason = 'Initial Tx (Auto)'
|
||||
SendDtm = ICONV(OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS'),'DT')
|
||||
SendUser = @User4
|
||||
TaskID = RTI_Task_Submit('', 'PRINT_SHIPMENT_DEV', ShipNo, ShipRec, 1, True$)
|
||||
* TaskID = RTI_Task_Submit('', 'PRINT_SHIPMENT_DEV', ShipNo, ShipRec, 1, True$)
|
||||
|
||||
Logging_Services('AppendLog', objLog, LoggingDTM : @FM : WONo : @FM: ShipNo : @FM : ' Called PRINT_SHIPMENT_DEV Task. TaskID : ' : TaskID, @RM, @FM, '')
|
||||
If TaskID NE 0 then
|
||||
Done = False$
|
||||
TaskResponse = ''
|
||||
Loop
|
||||
Status = RTI_Task_Status(TaskID, TaskResponse)
|
||||
If (Status EQ 'COMPLETED') OR (Status EQ 'ERROR') then Done = True$
|
||||
Until Done
|
||||
Repeat
|
||||
end else
|
||||
// Track if task id wasn't created at all.
|
||||
end
|
||||
Logging_Services('AppendLog', objLog, LoggingDTM : @FM : WONo : @FM: ShipNo : @FM : ' Finished PRINT_SHIPMENT_DEV Task. Status : ' : Status, @RM, @FM, '')
|
||||
Print_Shipment_Dev(ShipNo, ShipRec, True$, True$)
|
||||
|
||||
* Logging_Services('AppendLog', objLog, LoggingDTM : @FM : WONo : @FM: ShipNo : @FM : ' Called PRINT_SHIPMENT_DEV Task. TaskID : ' : TaskID, @RM, @FM, '')
|
||||
* If TaskID NE 0 then
|
||||
* Done = False$
|
||||
* TaskResponse = ''
|
||||
* Loop
|
||||
* Status = RTI_Task_Status(TaskID, TaskResponse)
|
||||
* If (Status EQ 'COMPLETED') OR (Status EQ 'ERROR') then Done = True$
|
||||
* Until Done
|
||||
* Repeat
|
||||
* end else
|
||||
* // Track if task id wasn't created at all.
|
||||
* end
|
||||
* Logging_Services('AppendLog', objLog, LoggingDTM : @FM : WONo : @FM: ShipNo : @FM : ' Finished PRINT_SHIPMENT_DEV Task. Status : ' : Status, @RM, @FM, '')
|
||||
StatusError = Get_Status(errCode)
|
||||
Logging_Services('AppendLog', objLog, LoggingDTM : @FM : WONo : @FM: ShipNo : @FM : ' GetStatus PRINT_SHIPMENT_DEV Task. ErrCode : ' : ErrCode, @RM, @FM, '')
|
||||
If (Index(errCode, 'SHELLEXECUTE', 1)) NE 0 then StatusError = 0
|
||||
|
@ -1,79 +1,79 @@
|
||||
Function Pm_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 : Pm_API
|
||||
|
||||
Description : API logic for the Pm 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 Pm[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Pm.POST
|
||||
- Pm.ID.PUT
|
||||
- Pm.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)
|
||||
06/05/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
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
API pm.HEAD
|
||||
API pm.GET
|
||||
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
|
||||
API pm.ID.HEAD
|
||||
API pm.ID.GET
|
||||
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
|
||||
API pm.ID.POST
|
||||
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
Function Pm_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 : Pm_API
|
||||
|
||||
Description : API logic for the Pm 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 Pm[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Pm.POST
|
||||
- Pm.ID.PUT
|
||||
- Pm.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)
|
||||
06/05/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
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
API pm.HEAD
|
||||
API pm.GET
|
||||
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
|
||||
API pm.ID.HEAD
|
||||
API pm.ID.GET
|
||||
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
|
||||
API pm.ID.POST
|
||||
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
|
@ -1,64 +1,64 @@
|
||||
Function Pm_spec_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 : Pm_spec_API
|
||||
|
||||
Description : API logic for the Pm_spec 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 Pm_spec[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Pm_spec.POST
|
||||
- Pm_spec.ID.PUT
|
||||
- Pm_spec.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)
|
||||
06/05/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
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
API pm_spec.HEAD
|
||||
API pm_spec.GET
|
||||
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
Function Pm_spec_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 : Pm_spec_API
|
||||
|
||||
Description : API logic for the Pm_spec 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 Pm_spec[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Pm_spec.POST
|
||||
- Pm_spec.ID.PUT
|
||||
- Pm_spec.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)
|
||||
06/05/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
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
API pm_spec.HEAD
|
||||
API pm_spec.GET
|
||||
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
|
@ -1,154 +1,154 @@
|
||||
Compile function PM_Spec_Services(@Service, @Params)
|
||||
/***********************************************************************************************************************
|
||||
|
||||
Name : PM_Spec_Services
|
||||
|
||||
Description : Handler program for all PM_SPEC services.
|
||||
|
||||
Notes : Application errors should be logged using the Error Services module. There are a few methodological
|
||||
assumptions built into way errors are managed which are important to understand in order to properly
|
||||
work with Error Services:
|
||||
|
||||
- The term 'top' refers to the originating procedure of a call stack and the term 'bottom' refers to
|
||||
the last routine (or the current routine) within a call stack. Within the OpenInsight Debugger
|
||||
this will appear backwards since the originating procedure always appears at the bottom of the
|
||||
list and the current routine appears at the top of the list. We are using this orientation because
|
||||
it is common to refer to the process of calling other procedures as 'drilling down'.
|
||||
|
||||
- The reason for defining the orientation of the call stack is because Error_Services allows for
|
||||
multiple error conditions to be appended to an original error. In most cases this will happen when
|
||||
a procedure at the bottom of the stack generates an error condition and then returns to its
|
||||
calling procedure. This higher level procedure can optionally add more information relevant to
|
||||
itself. This continues as the call stack 'bubbles' its way back to the top to where the
|
||||
originating procedure is waiting.
|
||||
|
||||
- Native OpenInsight commands that handle errors (e.g., Set_Status, Set_FSError, Set_EventStatus)
|
||||
preserve their error state until explicitly cleared. This can hinder the normal execution of code
|
||||
since subsequent procedures (usually SSPs) will fail if a pre-existing error condition exists.
|
||||
Our philosophy is that error conditions should automatically be cleared before a new procedure
|
||||
is executed to avoid this problem. However, the nature of Basic+ does not make this easy to
|
||||
automate for any given stored procedure. Therefore, if a stored procedure wants to conform to our
|
||||
philosophy then it should include a call into the 'Clear' service request at the top of the
|
||||
program. Alternatively this can be done through a common insert (see SERVICE_SETUP for example.)
|
||||
|
||||
- Service modules will use the SERVICE_SETUP insert and therefore automatically clear out any
|
||||
error conditions that were set before.
|
||||
|
||||
Parameters :
|
||||
Service [in] -- Name of the service being requested
|
||||
Param1-10 [in/out] -- Additional request parameter holders
|
||||
Response [out] -- Response to be sent back to the Controller (MCP) or requesting procedure
|
||||
|
||||
Metadata :
|
||||
|
||||
History : (Date, Initials, Notes)
|
||||
03/29/24 djs Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$Insert APP_INSERTS
|
||||
$Insert SERVICE_SETUP
|
||||
$Insert PM_EQUATES
|
||||
$Insert PM_SPEC_EQUATES
|
||||
$Insert TOOL_EQUATES
|
||||
|
||||
// Reduce Modes
|
||||
Equ NEW_EXIST$ To 0
|
||||
Equ NEXT_CUR$ To 1
|
||||
Equ ADD_EXIST$ To 2
|
||||
|
||||
Declare subroutine Error_Services, Reduce, Push.Select, Pop.Select
|
||||
|
||||
GoToService
|
||||
|
||||
Return Response or ""
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Service Parameter Options
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
Options BOOLEAN = True$, False$
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// SERVICES
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Service UpdatePMCompDtm(PMSpecID)
|
||||
|
||||
F1 = ''
|
||||
F2 = ''
|
||||
F3 = ''
|
||||
F4 = ''
|
||||
Push.Select(F1, F2, F3, F4)
|
||||
ErrorMsg = ''
|
||||
If (PMSpecID NE '') then
|
||||
If RowExists('PM_SPEC', PMSpecID) then
|
||||
TableName = "PM"
|
||||
Flag = ""
|
||||
Done = False$
|
||||
CursorVar = ""
|
||||
GoSub ClearCursors
|
||||
SortList = "#COMP_DTM"
|
||||
ReduceScript = "WITH {PMS_ID} EQ ":PMSpecID
|
||||
Mode = NEXT_CUR$
|
||||
Reduce(ReduceScript, SortList, Mode, TableName, CursorVar, Flag)
|
||||
If Flag then
|
||||
Select TableName By SortList Using CursorVar then
|
||||
Open TableName To FileVar then
|
||||
Loop
|
||||
ReadNext Key Using CursorVar By AT else Done = TRUE$
|
||||
Until Done
|
||||
Read Rec From FileVar, Key then
|
||||
NewStopDtm = Rec<PM_COMP_DTM$>
|
||||
Done = True$
|
||||
Open 'PM_SPEC' to hPMSpec then
|
||||
WriteV NewStopDtm on hPMSpec, PMSpecID, PM_SPEC_LAST_PM_COMP_DTM$ else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error writing LAST_PM_COMP_DTM on PM_SPEC record ':PMSpecID:'.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error opening PM_SPEC table.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error reading PM record ':Key:'.'
|
||||
end
|
||||
Repeat
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error opening PM table.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error calling Select on PM table.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error calling Reduce on PM table.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. PM_SPEC record ':PMSpecID:' does not exist!'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Null PMSpecID passed into service!'
|
||||
end
|
||||
|
||||
Pop.Select(F1, F2, F3, F4)
|
||||
If ErrorMsg NE '' then
|
||||
Error_Services('Add', ErrorMsg)
|
||||
Response = False$
|
||||
end else
|
||||
Repsponse = True$
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
ClearCursors:
|
||||
|
||||
For counter = 0 To 8
|
||||
ClearSelect counter
|
||||
Next counter
|
||||
|
||||
return
|
||||
|
||||
|
||||
Compile function PM_Spec_Services(@Service, @Params)
|
||||
/***********************************************************************************************************************
|
||||
|
||||
Name : PM_Spec_Services
|
||||
|
||||
Description : Handler program for all PM_SPEC services.
|
||||
|
||||
Notes : Application errors should be logged using the Error Services module. There are a few methodological
|
||||
assumptions built into way errors are managed which are important to understand in order to properly
|
||||
work with Error Services:
|
||||
|
||||
- The term 'top' refers to the originating procedure of a call stack and the term 'bottom' refers to
|
||||
the last routine (or the current routine) within a call stack. Within the OpenInsight Debugger
|
||||
this will appear backwards since the originating procedure always appears at the bottom of the
|
||||
list and the current routine appears at the top of the list. We are using this orientation because
|
||||
it is common to refer to the process of calling other procedures as 'drilling down'.
|
||||
|
||||
- The reason for defining the orientation of the call stack is because Error_Services allows for
|
||||
multiple error conditions to be appended to an original error. In most cases this will happen when
|
||||
a procedure at the bottom of the stack generates an error condition and then returns to its
|
||||
calling procedure. This higher level procedure can optionally add more information relevant to
|
||||
itself. This continues as the call stack 'bubbles' its way back to the top to where the
|
||||
originating procedure is waiting.
|
||||
|
||||
- Native OpenInsight commands that handle errors (e.g., Set_Status, Set_FSError, Set_EventStatus)
|
||||
preserve their error state until explicitly cleared. This can hinder the normal execution of code
|
||||
since subsequent procedures (usually SSPs) will fail if a pre-existing error condition exists.
|
||||
Our philosophy is that error conditions should automatically be cleared before a new procedure
|
||||
is executed to avoid this problem. However, the nature of Basic+ does not make this easy to
|
||||
automate for any given stored procedure. Therefore, if a stored procedure wants to conform to our
|
||||
philosophy then it should include a call into the 'Clear' service request at the top of the
|
||||
program. Alternatively this can be done through a common insert (see SERVICE_SETUP for example.)
|
||||
|
||||
- Service modules will use the SERVICE_SETUP insert and therefore automatically clear out any
|
||||
error conditions that were set before.
|
||||
|
||||
Parameters :
|
||||
Service [in] -- Name of the service being requested
|
||||
Param1-10 [in/out] -- Additional request parameter holders
|
||||
Response [out] -- Response to be sent back to the Controller (MCP) or requesting procedure
|
||||
|
||||
Metadata :
|
||||
|
||||
History : (Date, Initials, Notes)
|
||||
03/29/24 djs Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$Insert APP_INSERTS
|
||||
$Insert SERVICE_SETUP
|
||||
$Insert PM_EQUATES
|
||||
$Insert PM_SPEC_EQUATES
|
||||
$Insert TOOL_EQUATES
|
||||
|
||||
// Reduce Modes
|
||||
Equ NEW_EXIST$ To 0
|
||||
Equ NEXT_CUR$ To 1
|
||||
Equ ADD_EXIST$ To 2
|
||||
|
||||
Declare subroutine Error_Services, Reduce, Push.Select, Pop.Select
|
||||
|
||||
GoToService
|
||||
|
||||
Return Response or ""
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Service Parameter Options
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
Options BOOLEAN = True$, False$
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// SERVICES
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Service UpdatePMCompDtm(PMSpecID)
|
||||
|
||||
F1 = ''
|
||||
F2 = ''
|
||||
F3 = ''
|
||||
F4 = ''
|
||||
Push.Select(F1, F2, F3, F4)
|
||||
ErrorMsg = ''
|
||||
If (PMSpecID NE '') then
|
||||
If RowExists('PM_SPEC', PMSpecID) then
|
||||
TableName = "PM"
|
||||
Flag = ""
|
||||
Done = False$
|
||||
CursorVar = ""
|
||||
GoSub ClearCursors
|
||||
SortList = "#COMP_DTM"
|
||||
ReduceScript = "WITH {PMS_ID} EQ ":PMSpecID
|
||||
Mode = NEXT_CUR$
|
||||
Reduce(ReduceScript, SortList, Mode, TableName, CursorVar, Flag)
|
||||
If Flag then
|
||||
Select TableName By SortList Using CursorVar then
|
||||
Open TableName To FileVar then
|
||||
Loop
|
||||
ReadNext Key Using CursorVar By AT else Done = TRUE$
|
||||
Until Done
|
||||
Read Rec From FileVar, Key then
|
||||
NewStopDtm = Rec<PM_COMP_DTM$>
|
||||
Done = True$
|
||||
Open 'PM_SPEC' to hPMSpec then
|
||||
WriteV NewStopDtm on hPMSpec, PMSpecID, PM_SPEC_LAST_PM_COMP_DTM$ else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error writing LAST_PM_COMP_DTM on PM_SPEC record ':PMSpecID:'.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error opening PM_SPEC table.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error reading PM record ':Key:'.'
|
||||
end
|
||||
Repeat
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error opening PM table.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error calling Select on PM table.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error calling Reduce on PM table.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. PM_SPEC record ':PMSpecID:' does not exist!'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Null PMSpecID passed into service!'
|
||||
end
|
||||
|
||||
Pop.Select(F1, F2, F3, F4)
|
||||
If ErrorMsg NE '' then
|
||||
Error_Services('Add', ErrorMsg)
|
||||
Response = False$
|
||||
end else
|
||||
Repsponse = True$
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
ClearCursors:
|
||||
|
||||
For counter = 0 To 8
|
||||
ClearSelect counter
|
||||
Next counter
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
@ -1,90 +1,90 @@
|
||||
Compile function PROVE_IN_OVERRIDE_EVENTS(CtrlEntId, Event, @PARAMS)
|
||||
#pragma precomp SRP_PreCompiler
|
||||
#window PROVE_IN_OVERRIDE
|
||||
|
||||
$Insert APP_INSERTS
|
||||
$Insert REACTOR_EQUATES
|
||||
$insert Message_Box_Equates
|
||||
|
||||
Declare subroutine Placedialog, Message_Box
|
||||
|
||||
GoToEvent Event for CtrlEntId else
|
||||
// Event not implemented
|
||||
end
|
||||
|
||||
Return EventFlow or 1
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// EVENT HANDLERS
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Event WINDOW.CREATE(CreateParam)
|
||||
ReactNo = CreateParam
|
||||
|
||||
Placedialog(-2, -2)
|
||||
|
||||
ProveInTypes = Xlate('REACTOR', ReactNo, REACTOR_PROVE_IN_TYPE$, 'X')
|
||||
for each ProveInType in ProveInTypes using @VM setting dummy
|
||||
Begin Case
|
||||
Case ProveInType _EQC 'changeover'
|
||||
Set_Property(@Window:'.CHB_CHANGEOVER', 'ENABLED', True$)
|
||||
Case ProveInType _EQC 'initiate_idle'
|
||||
Set_Property(@Window:'.CHB_IDLE_SHUTDOWN', 'ENABLED', True$)
|
||||
Case ProveInType _EQC 'idle'
|
||||
Set_Property(@Window:'.CHB_IDLE_STARTUP', 'ENABLED', True$)
|
||||
Case ProveInType _EQC 'intrusive_maint'
|
||||
Set_Property(@Window:'.CHB_INTRUSIVE_MAINT', 'ENABLED', True$)
|
||||
Case Otherwise$
|
||||
Null
|
||||
End Case
|
||||
Next ProveInType
|
||||
End Event
|
||||
|
||||
Event PUB_SUBMIT.CLICK()
|
||||
OverrideData = ''
|
||||
|
||||
SelectedTypes = ''
|
||||
If Get_Property(@Window:'.CHB_CHANGEOVER', 'CHECK') then
|
||||
SelectedTypes = "CHANGEOVER"
|
||||
end
|
||||
If Get_Property(@Window:'.CHB_IDLE_SHUTDOWN', 'CHECK') then
|
||||
If SelectedTypes NE '' then
|
||||
SelectedTypes := @VM
|
||||
end
|
||||
SelectedTypes := 'INITIATE_IDLE'
|
||||
end
|
||||
If Get_Property(@Window:'.CHB_IDLE_STARTUP', 'CHECK') then
|
||||
If SelectedTypes NE '' then
|
||||
SelectedTypes := @VM
|
||||
end
|
||||
SelectedTypes := 'IDLE'
|
||||
end
|
||||
If Get_Property(@Window:'.CHB_INTRUSIVE_MAINT', 'CHECK') then
|
||||
If SelectedTypes NE '' then
|
||||
SelectedTypes := @VM
|
||||
end
|
||||
SelectedTypes := 'INTRUSIVE_MAINT'
|
||||
end
|
||||
|
||||
If SelectedTypes EQ '' then
|
||||
Message_Box(@Window, "You must select at least one prove in type!", "Error", MSG_ICON_EXCLAM$)
|
||||
return
|
||||
end else
|
||||
OverrideData<1, 1> = SelectedTypes
|
||||
end
|
||||
|
||||
OverrideData<2, 1> = Get_Property(@Window:'.EDB_COMMENT', 'TEXT')
|
||||
|
||||
If OverrideData<2, 1> EQ '' or Len(OverrideData<2, 1>) LT 4 then
|
||||
Message_Box(@Window, "Your comment must be at least 4 characters!", "Error", MSG_ICON_EXCLAM$)
|
||||
return
|
||||
end
|
||||
|
||||
End_Dialog(@Window, OverrideData)
|
||||
end event
|
||||
|
||||
Event PUB_CANCEL.CLICK()
|
||||
End_Dialog(@Window, '')
|
||||
end event
|
||||
|
||||
|
||||
Compile function PROVE_IN_OVERRIDE_EVENTS(CtrlEntId, Event, @PARAMS)
|
||||
#pragma precomp SRP_PreCompiler
|
||||
#window PROVE_IN_OVERRIDE
|
||||
|
||||
$Insert APP_INSERTS
|
||||
$Insert REACTOR_EQUATES
|
||||
$insert Message_Box_Equates
|
||||
|
||||
Declare subroutine Placedialog, Message_Box
|
||||
|
||||
GoToEvent Event for CtrlEntId else
|
||||
// Event not implemented
|
||||
end
|
||||
|
||||
Return EventFlow or 1
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// EVENT HANDLERS
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Event WINDOW.CREATE(CreateParam)
|
||||
ReactNo = CreateParam
|
||||
|
||||
Placedialog(-2, -2)
|
||||
|
||||
ProveInTypes = Xlate('REACTOR', ReactNo, REACTOR_PROVE_IN_TYPE$, 'X')
|
||||
for each ProveInType in ProveInTypes using @VM setting dummy
|
||||
Begin Case
|
||||
Case ProveInType _EQC 'changeover'
|
||||
Set_Property(@Window:'.CHB_CHANGEOVER', 'ENABLED', True$)
|
||||
Case ProveInType _EQC 'initiate_idle'
|
||||
Set_Property(@Window:'.CHB_IDLE_SHUTDOWN', 'ENABLED', True$)
|
||||
Case ProveInType _EQC 'idle'
|
||||
Set_Property(@Window:'.CHB_IDLE_STARTUP', 'ENABLED', True$)
|
||||
Case ProveInType _EQC 'intrusive_maint'
|
||||
Set_Property(@Window:'.CHB_INTRUSIVE_MAINT', 'ENABLED', True$)
|
||||
Case Otherwise$
|
||||
Null
|
||||
End Case
|
||||
Next ProveInType
|
||||
End Event
|
||||
|
||||
Event PUB_SUBMIT.CLICK()
|
||||
OverrideData = ''
|
||||
|
||||
SelectedTypes = ''
|
||||
If Get_Property(@Window:'.CHB_CHANGEOVER', 'CHECK') then
|
||||
SelectedTypes = "CHANGEOVER"
|
||||
end
|
||||
If Get_Property(@Window:'.CHB_IDLE_SHUTDOWN', 'CHECK') then
|
||||
If SelectedTypes NE '' then
|
||||
SelectedTypes := @VM
|
||||
end
|
||||
SelectedTypes := 'INITIATE_IDLE'
|
||||
end
|
||||
If Get_Property(@Window:'.CHB_IDLE_STARTUP', 'CHECK') then
|
||||
If SelectedTypes NE '' then
|
||||
SelectedTypes := @VM
|
||||
end
|
||||
SelectedTypes := 'IDLE'
|
||||
end
|
||||
If Get_Property(@Window:'.CHB_INTRUSIVE_MAINT', 'CHECK') then
|
||||
If SelectedTypes NE '' then
|
||||
SelectedTypes := @VM
|
||||
end
|
||||
SelectedTypes := 'INTRUSIVE_MAINT'
|
||||
end
|
||||
|
||||
If SelectedTypes EQ '' then
|
||||
Message_Box(@Window, "You must select at least one prove in type!", "Error", MSG_ICON_EXCLAM$)
|
||||
return
|
||||
end else
|
||||
OverrideData<1, 1> = SelectedTypes
|
||||
end
|
||||
|
||||
OverrideData<2, 1> = Get_Property(@Window:'.EDB_COMMENT', 'TEXT')
|
||||
|
||||
If OverrideData<2, 1> EQ '' or Len(OverrideData<2, 1>) LT 4 then
|
||||
Message_Box(@Window, "Your comment must be at least 4 characters!", "Error", MSG_ICON_EXCLAM$)
|
||||
return
|
||||
end
|
||||
|
||||
End_Dialog(@Window, OverrideData)
|
||||
end event
|
||||
|
||||
Event PUB_CANCEL.CLICK()
|
||||
End_Dialog(@Window, '')
|
||||
end event
|
||||
|
||||
|
||||
|
@ -1,106 +1,106 @@
|
||||
Function Reactorloadings_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 : Reactorloadings_API
|
||||
|
||||
Description : API logic for the Reactorloadings 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 Reactorloadings[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Reactorloadings.POST
|
||||
- Reactorloadings.ID.PUT
|
||||
- Reactorloadings.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)
|
||||
05/22/24 xxx Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
Declare function Oi_Wizard_Services, Memberof, Oi_Wizard_Services
|
||||
Declare subroutine Reactor_Services, Oi_Wizard_Services
|
||||
|
||||
$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
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
API reactorloadings.POST
|
||||
OIWizardID = ''
|
||||
CurrUser = ''
|
||||
Cookies = HTTP_Services('GetHTTPCookie')
|
||||
For each Cookie in Cookies using ';'
|
||||
Key = Trim(Field(Cookie, '=', 1))
|
||||
If Key EQ 'sessionID' then
|
||||
OIWizardID = Field(Cookie, '=', 2)
|
||||
end
|
||||
Next Cookie
|
||||
|
||||
If OIWizardID NE '' then
|
||||
// Call validate session to extend session expiry
|
||||
OI_Wizard_Services('ValidateSession', OIWizardID)
|
||||
CurrUser = Xlate('OI_WIZARD', OIWizardID, 'EMPLOYEE_ID', 'X')
|
||||
end
|
||||
|
||||
ValidSession = OI_Wizard_Services('ValidateSession', OIWizardID)
|
||||
|
||||
If ValidSession then
|
||||
If Memberof(CurrUser, 'OI_ADMIN') OR Memberof(CurrUser, 'LEAD') OR Memberof(CurrUser, 'SUPERVISOR') then
|
||||
Body = HTTP_Services('GetHTTPPostString', True$)
|
||||
// The POST string will have been encoded so use percent (URL) decoding.
|
||||
DecodedJSON = HTTP_Services('DecodePercentString', Body)
|
||||
If SRP_JSON(objBody, 'Parse', Body) EQ '' then
|
||||
rdsNo = SRP_JSON(objBody, 'GetValue', 'rdsNo')
|
||||
reactorNo = SRP_JSON(objBody, 'GetValue', 'reactorNo')
|
||||
SRP_JSON(objBody, 'Release')
|
||||
end
|
||||
|
||||
Reactor_Services('RemoveRDSFromReactorLoad', rdsNo, reactorNo, CurrUser)
|
||||
If Error_Services('NoError') then
|
||||
HTTP_Services('SetResponseStatus', 200, 'RDS Successfully removed.')
|
||||
end else
|
||||
ErrCode = Error_Services('GetMessage')
|
||||
HTTP_Services('SetResponseStatus', 500, ErrCode)
|
||||
end
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 503, 'User is not authorized!')
|
||||
end
|
||||
End else
|
||||
HTTP_Services('SetResponseStatus', 401, 'User must be signed in to access this resource.')
|
||||
end
|
||||
|
||||
end api
|
||||
|
||||
Function Reactorloadings_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 : Reactorloadings_API
|
||||
|
||||
Description : API logic for the Reactorloadings 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 Reactorloadings[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Reactorloadings.POST
|
||||
- Reactorloadings.ID.PUT
|
||||
- Reactorloadings.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)
|
||||
05/22/24 xxx Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
Declare function Oi_Wizard_Services, Memberof, Oi_Wizard_Services
|
||||
Declare subroutine Reactor_Services, Oi_Wizard_Services
|
||||
|
||||
$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
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
API reactorloadings.POST
|
||||
OIWizardID = ''
|
||||
CurrUser = ''
|
||||
Cookies = HTTP_Services('GetHTTPCookie')
|
||||
For each Cookie in Cookies using ';'
|
||||
Key = Trim(Field(Cookie, '=', 1))
|
||||
If Key EQ 'sessionID' then
|
||||
OIWizardID = Field(Cookie, '=', 2)
|
||||
end
|
||||
Next Cookie
|
||||
|
||||
If OIWizardID NE '' then
|
||||
// Call validate session to extend session expiry
|
||||
OI_Wizard_Services('ValidateSession', OIWizardID)
|
||||
CurrUser = Xlate('OI_WIZARD', OIWizardID, 'EMPLOYEE_ID', 'X')
|
||||
end
|
||||
|
||||
ValidSession = OI_Wizard_Services('ValidateSession', OIWizardID)
|
||||
|
||||
If ValidSession then
|
||||
If Memberof(CurrUser, 'OI_ADMIN') OR Memberof(CurrUser, 'LEAD') OR Memberof(CurrUser, 'SUPERVISOR') then
|
||||
Body = HTTP_Services('GetHTTPPostString', True$)
|
||||
// The POST string will have been encoded so use percent (URL) decoding.
|
||||
DecodedJSON = HTTP_Services('DecodePercentString', Body)
|
||||
If SRP_JSON(objBody, 'Parse', Body) EQ '' then
|
||||
rdsNo = SRP_JSON(objBody, 'GetValue', 'rdsNo')
|
||||
reactorNo = SRP_JSON(objBody, 'GetValue', 'reactorNo')
|
||||
SRP_JSON(objBody, 'Release')
|
||||
end
|
||||
|
||||
Reactor_Services('RemoveRDSFromReactorLoad', rdsNo, reactorNo, CurrUser)
|
||||
If Error_Services('NoError') then
|
||||
HTTP_Services('SetResponseStatus', 200, 'RDS Successfully removed.')
|
||||
end else
|
||||
ErrCode = Error_Services('GetMessage')
|
||||
HTTP_Services('SetResponseStatus', 500, ErrCode)
|
||||
end
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 503, 'User is not authorized!')
|
||||
end
|
||||
End else
|
||||
HTTP_Services('SetResponseStatus', 401, 'User must be signed in to access this resource.')
|
||||
end
|
||||
|
||||
end api
|
||||
|
||||
|
@ -3287,7 +3287,7 @@ Service CreateReactorProveInOrder(ReactNo, ProveInType)
|
||||
|
||||
Retries = Retries - 1
|
||||
|
||||
HttpResponseJson = Httpclient_Services('SendHTTPRequest', 'POST', ProveInUrl, 'Accept':@VM:'*/*', '', '', '', '', '', '')
|
||||
HttpResponseJson = Httpclient_Services('SendHTTPRequest', 'POST', ProveInUrl, 'Accept':@VM:'*/*', '', '', '', False$, False$, '')
|
||||
If HttpResponseJson NE '' then
|
||||
ObjResponseJson = ''
|
||||
If SRP_JSON(ObjResponseJson, 'Parse', HttpResponseJson) EQ '' then
|
||||
@ -3340,6 +3340,7 @@ Service CreateReactorProveInOrder(ReactNo, ProveInType)
|
||||
end service
|
||||
|
||||
Service GetReactorProveInStatus(ReactNo)
|
||||
|
||||
Headers = 'Logging DTM' : @FM : 'Machine' : @FM : 'Log'
|
||||
ColumnWidths = 20 : @FM : 15 : @FM : 300
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\ReactorProveIn'
|
||||
@ -3386,7 +3387,7 @@ Service GetReactorProveInStatus(ReactNo)
|
||||
|
||||
Retries = Retries - 1
|
||||
|
||||
HttpResponseJson = Httpclient_Services('SendHTTPRequest', 'GET', ProveInUrl, 'Accept':@VM:'*/*', '', '', '', '', '', '')
|
||||
HttpResponseJson = Httpclient_Services('SendHTTPRequest', 'GET', ProveInUrl, 'Accept':@VM:'*/*', '', '', '', False$, False$, '')
|
||||
If HttpResponseJson NE '' then
|
||||
ObjResponseJson = ''
|
||||
If SRP_JSON(ObjResponseJson, 'Parse', HttpResponseJson) EQ '' then
|
||||
@ -3488,7 +3489,7 @@ Service CancelReactorProveIn(ReactNo, OrderId)
|
||||
|
||||
Retries = Retries - 1
|
||||
|
||||
HttpResponseJson = Httpclient_Services('SendHTTPRequest', 'PUT', ProveInUrl, 'Accept':@VM:'*/*', '', '', '', '', '', '')
|
||||
HttpResponseJson = Httpclient_Services('SendHTTPRequest', 'PUT', ProveInUrl, 'Accept':@VM:'*/*', '', '', '', False$, False$, '')
|
||||
If HttpResponseJson NE '' then
|
||||
ObjResponseJson = ''
|
||||
If SRP_JSON(ObjResponseJson, 'Parse', HttpResponseJson) EQ '' then
|
||||
|
@ -1,254 +1,254 @@
|
||||
Function REACT_ITEM_Actions(Action, CalcColName, FSList, Handle, Name, FMC, Record, Status, OrigRecord, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)
|
||||
/***********************************************************************************************************************
|
||||
|
||||
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 Infineon.
|
||||
|
||||
Name : RDS_Actions
|
||||
|
||||
Description : Handles calculated columns and MFS calls for the current table.
|
||||
|
||||
Notes : This function uses @ID, @RECORD, and @DICT to make sure {ColumnName} references work correctly.
|
||||
If called from outside of a calculated column these will need to be set and restored.
|
||||
|
||||
Parameters :
|
||||
Action [in] -- Name of the action to be taken
|
||||
CalcColName [in] -- Name of the calculated column that needs to be processed. Normally this should only be
|
||||
populated when the CalcField action is being used.
|
||||
FSList [in] -- The list of MFSs and the BFS name for the current file or volume. This is an @SVM
|
||||
delimited array, with the current MFS name as the first value in the array, and the BFS
|
||||
name as the last value. Normally set by a calling MFS.
|
||||
Handle [in] -- The file handle of the file or media map being accessed. Note, this does contain the
|
||||
entire handle structure that the Basic+ Open statement would provide. Normally set by a
|
||||
calling MFS.
|
||||
Name [in] -- The name (key) of the record or file being accessed. Normally set by a calling MFS.
|
||||
FMC [in] -- Various functions. Normally set by a calling MFS.
|
||||
Record [in] -- The entire record (for record-oriented functions) or a newly-created handle (for
|
||||
"get handle" functions). Normally set by a calling MFS.
|
||||
Status [in/out] -- Indicator of the success or failure of an action. Normally set by the calling MFS but
|
||||
for some actions can be set by the action handler to indicate failure.
|
||||
OrigRecord [in] -- Original content of the record being processed by the current action. This is
|
||||
automatically being assigned by the WRITE_RECORD and DELETE_RECORD actions within
|
||||
BASE_MFS.
|
||||
Param1-10 [in/out] -- Additional request parameter holders
|
||||
ActionFlow [out] -- Used to control the action chain (see the ACTION_SETUP insert for more information.)
|
||||
Can also be used to return a special value, such as the results of the CalcField
|
||||
method.
|
||||
|
||||
History : (Date, Initials, Notes)
|
||||
04/10/18 dmb Original programmer.
|
||||
10/04/18 djs Added a trigger within the WRITE_RECORD event, which fires when the reactor number has
|
||||
changed. When this occurs the related RDS_LAYER records for this RDS record are populated
|
||||
with the most recent associated TOOL_PARMS record. (related by PSN and Reactor)
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$Insert FILE.SYSTEM.EQUATES
|
||||
$Insert ACTION_SETUP
|
||||
$Insert RDS_EQUATES
|
||||
$Insert CLEAN_INSP_EQUATES
|
||||
$Insert COMPANY_EQUATES
|
||||
$Insert RDS_LAYER_EQUATES
|
||||
$Insert TOOL_PARMS_EQUATES
|
||||
$Insert RLIST_EQUATES
|
||||
$Insert APP_INSERTS
|
||||
$Insert QA_MET_EQUATES
|
||||
$Insert PRS_STAGE_EQUATES
|
||||
$Insert WO_MAT_EQUATES
|
||||
$Insert WO_MAT_QA_EQUATES
|
||||
|
||||
Equ COMMA$ to ','
|
||||
|
||||
Declare function Error_Services, Database_Services, obj_RDS_Test, Logging_Services, Environment_Services, SRP_Math
|
||||
Declare function Tool_Parms_Services, Signature_Services, obj_WO_Mat_QA, Datetime, Override_Services, obj_WO_Mat
|
||||
Declare subroutine Error_Services, Database_Services, Logging_Services, Set_Status, Schedule_Services_Dev
|
||||
Declare subroutine Work_Order_Services, Material_Services, Set_FSError
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
If KeyID then GoSub Initialize_System_Variables
|
||||
|
||||
Begin Case
|
||||
|
||||
Case Action _EQC 'CalculateColumn' ; GoSub CalculateColumn
|
||||
Case Action _EQC 'READ_RECORD_PRE' ; GoSub READ_RECORD_PRE
|
||||
Case Action _EQC 'READ_RECORD' ; GoSub READ_RECORD
|
||||
Case Action _EQC 'READONLY_RECORD_PRE' ; GoSub READONLY_RECORD_PRE
|
||||
Case Action _EQC 'READONLY_RECORD' ; GoSub READONLY_RECORD
|
||||
Case Action _EQC 'WRITE_RECORD_PRE' ; GoSub WRITE_RECORD_PRE
|
||||
Case Action _EQC 'WRITE_RECORD' ; GoSub WRITE_RECORD
|
||||
Case Action _EQC 'DELETE_RECORD_PRE' ; GoSub DELETE_RECORD_PRE
|
||||
Case Action _EQC 'DELETE_RECORD' ; GoSub DELETE_RECORD
|
||||
Case Otherwise$ ; Status = 'Invalid Action'
|
||||
|
||||
End Case
|
||||
|
||||
If KeyID then GoSub Restore_System_Variables
|
||||
|
||||
If Assigned(ActionFlow) else ActionFlow = ACTION_CONTINUE$
|
||||
|
||||
Return ActionFlow
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Calculated Columns
|
||||
//
|
||||
// The typical structure of a calculated column will look like this:
|
||||
//
|
||||
// Declare function Database_Services
|
||||
//
|
||||
// @ANS = Database_Services('CalculateColumn')
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
CalculateColumn:
|
||||
|
||||
// Make sure the ActionFlow return variable is cleared in case nothing is calculated.
|
||||
ActionFlow = ''
|
||||
|
||||
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
// ----- MFS calls -----------------------------------------------------------------------------------------------------
|
||||
|
||||
READ_RECORD_PRE:
|
||||
// In order to stop a record from being read in this action these lines of code must be used:
|
||||
//
|
||||
// OrigFileError = 100 : @FM : KeyID
|
||||
// Status = 0
|
||||
// Record = ''
|
||||
// ActionFlow = ACTION_STOP$
|
||||
|
||||
|
||||
return
|
||||
|
||||
READ_RECORD:
|
||||
|
||||
// In order to stop a record from being read in this action these lines of code must be used:
|
||||
//
|
||||
// OrigFileError = 100 : @FM : KeyID
|
||||
// Status = 0
|
||||
// Record = ''
|
||||
|
||||
return
|
||||
|
||||
READONLY_RECORD_PRE:
|
||||
// In order to stop a record from being read in this action these lines of code must be used:
|
||||
//
|
||||
// OrigFileError = 100 : @FM : KeyID
|
||||
// Status = 0
|
||||
// Record = ''
|
||||
// ActionFlow = ACTION_STOP$
|
||||
return
|
||||
|
||||
READONLY_RECORD:
|
||||
// In order to stop a record from being read in this action these lines of code must be used:
|
||||
//
|
||||
// OrigFileError = 100 : @FM : KeyID
|
||||
// Status = 0
|
||||
// Record = ''
|
||||
return
|
||||
|
||||
WRITE_RECORD_PRE:
|
||||
|
||||
ErrMsg = ''
|
||||
|
||||
//Req'd parameter checks
|
||||
ItemType = {RI_TYPE}
|
||||
|
||||
If ItemType EQ '' then
|
||||
ErrMsg := 'Item Type was not specified. '
|
||||
end
|
||||
|
||||
If ErrMsg NE '' then
|
||||
Error_Services('Add', 'Error Saving Reactor Item: ' : ErrMsg)
|
||||
OrigFileError = 104:': Error Saving Reactor Item: ' : ErrMsg
|
||||
Status = 0
|
||||
Record = ''
|
||||
ActionFlow = ACTION_STOP$
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
WRITE_RECORD:
|
||||
|
||||
|
||||
|
||||
return
|
||||
|
||||
DELETE_RECORD_PRE:
|
||||
|
||||
|
||||
return
|
||||
|
||||
DELETE_RECORD:
|
||||
return
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
ClearCursors:
|
||||
For counter = 0 to 8
|
||||
ClearSelect counter
|
||||
Next counter
|
||||
return
|
||||
|
||||
|
||||
Initialize_System_Variables:
|
||||
|
||||
// Save these for restoration later
|
||||
SaveDict = @DICT
|
||||
SaveID = @ID
|
||||
SaveRecord = @RECORD
|
||||
OrigFileError = @FILE.ERROR
|
||||
|
||||
// Now make sure @DICT, ID, and @RECORD are populated
|
||||
CurrentDictName = ''
|
||||
If @DICT then
|
||||
DictHandle = @DICT<1, 2>
|
||||
Locate DictHandle in @TABLES(5) Using @FM Setting fPos then
|
||||
CurrentDictName = Field(@TABLES(0), @FM, fPos, 1)
|
||||
end
|
||||
end
|
||||
|
||||
If CurrentDictName NE DictName then
|
||||
Open DictName to @DICT else Status = 'Unable to initialize @DICT'
|
||||
end
|
||||
|
||||
@ID = KeyID
|
||||
If Record else
|
||||
// Record might not have been passed in. Read the record from the database table just to make sure.
|
||||
@FILE.ERROR = ''
|
||||
Open TableName to hTable then
|
||||
FullFSList = hTable[1, 'F' : @VM]
|
||||
BFS = FullFSList[-1, 'B' : @SVM]
|
||||
LastHandle = hTable[-1, 'B' : \0D\]
|
||||
FileHandle = \0D\ : LastHandle[1, @VM]
|
||||
|
||||
Call @BFS(READO.RECORD, BFS, FileHandle, KeyID, FMC, Record, ReadOStatus)
|
||||
end
|
||||
end
|
||||
@RECORD = Record
|
||||
|
||||
return
|
||||
|
||||
|
||||
Restore_System_Variables:
|
||||
|
||||
Transfer SaveDict to @DICT
|
||||
Transfer SaveID to @ID
|
||||
Transfer SaveRecord to @RECORD
|
||||
@FILE.ERROR = OrigFileError
|
||||
|
||||
return
|
||||
|
||||
|
||||
Function REACT_ITEM_Actions(Action, CalcColName, FSList, Handle, Name, FMC, Record, Status, OrigRecord, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)
|
||||
/***********************************************************************************************************************
|
||||
|
||||
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 Infineon.
|
||||
|
||||
Name : RDS_Actions
|
||||
|
||||
Description : Handles calculated columns and MFS calls for the current table.
|
||||
|
||||
Notes : This function uses @ID, @RECORD, and @DICT to make sure {ColumnName} references work correctly.
|
||||
If called from outside of a calculated column these will need to be set and restored.
|
||||
|
||||
Parameters :
|
||||
Action [in] -- Name of the action to be taken
|
||||
CalcColName [in] -- Name of the calculated column that needs to be processed. Normally this should only be
|
||||
populated when the CalcField action is being used.
|
||||
FSList [in] -- The list of MFSs and the BFS name for the current file or volume. This is an @SVM
|
||||
delimited array, with the current MFS name as the first value in the array, and the BFS
|
||||
name as the last value. Normally set by a calling MFS.
|
||||
Handle [in] -- The file handle of the file or media map being accessed. Note, this does contain the
|
||||
entire handle structure that the Basic+ Open statement would provide. Normally set by a
|
||||
calling MFS.
|
||||
Name [in] -- The name (key) of the record or file being accessed. Normally set by a calling MFS.
|
||||
FMC [in] -- Various functions. Normally set by a calling MFS.
|
||||
Record [in] -- The entire record (for record-oriented functions) or a newly-created handle (for
|
||||
"get handle" functions). Normally set by a calling MFS.
|
||||
Status [in/out] -- Indicator of the success or failure of an action. Normally set by the calling MFS but
|
||||
for some actions can be set by the action handler to indicate failure.
|
||||
OrigRecord [in] -- Original content of the record being processed by the current action. This is
|
||||
automatically being assigned by the WRITE_RECORD and DELETE_RECORD actions within
|
||||
BASE_MFS.
|
||||
Param1-10 [in/out] -- Additional request parameter holders
|
||||
ActionFlow [out] -- Used to control the action chain (see the ACTION_SETUP insert for more information.)
|
||||
Can also be used to return a special value, such as the results of the CalcField
|
||||
method.
|
||||
|
||||
History : (Date, Initials, Notes)
|
||||
04/10/18 dmb Original programmer.
|
||||
10/04/18 djs Added a trigger within the WRITE_RECORD event, which fires when the reactor number has
|
||||
changed. When this occurs the related RDS_LAYER records for this RDS record are populated
|
||||
with the most recent associated TOOL_PARMS record. (related by PSN and Reactor)
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$Insert FILE.SYSTEM.EQUATES
|
||||
$Insert ACTION_SETUP
|
||||
$Insert RDS_EQUATES
|
||||
$Insert CLEAN_INSP_EQUATES
|
||||
$Insert COMPANY_EQUATES
|
||||
$Insert RDS_LAYER_EQUATES
|
||||
$Insert TOOL_PARMS_EQUATES
|
||||
$Insert RLIST_EQUATES
|
||||
$Insert APP_INSERTS
|
||||
$Insert QA_MET_EQUATES
|
||||
$Insert PRS_STAGE_EQUATES
|
||||
$Insert WO_MAT_EQUATES
|
||||
$Insert WO_MAT_QA_EQUATES
|
||||
|
||||
Equ COMMA$ to ','
|
||||
|
||||
Declare function Error_Services, Database_Services, obj_RDS_Test, Logging_Services, Environment_Services, SRP_Math
|
||||
Declare function Tool_Parms_Services, Signature_Services, obj_WO_Mat_QA, Datetime, Override_Services, obj_WO_Mat
|
||||
Declare subroutine Error_Services, Database_Services, Logging_Services, Set_Status, Schedule_Services_Dev
|
||||
Declare subroutine Work_Order_Services, Material_Services, Set_FSError
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
If KeyID then GoSub Initialize_System_Variables
|
||||
|
||||
Begin Case
|
||||
|
||||
Case Action _EQC 'CalculateColumn' ; GoSub CalculateColumn
|
||||
Case Action _EQC 'READ_RECORD_PRE' ; GoSub READ_RECORD_PRE
|
||||
Case Action _EQC 'READ_RECORD' ; GoSub READ_RECORD
|
||||
Case Action _EQC 'READONLY_RECORD_PRE' ; GoSub READONLY_RECORD_PRE
|
||||
Case Action _EQC 'READONLY_RECORD' ; GoSub READONLY_RECORD
|
||||
Case Action _EQC 'WRITE_RECORD_PRE' ; GoSub WRITE_RECORD_PRE
|
||||
Case Action _EQC 'WRITE_RECORD' ; GoSub WRITE_RECORD
|
||||
Case Action _EQC 'DELETE_RECORD_PRE' ; GoSub DELETE_RECORD_PRE
|
||||
Case Action _EQC 'DELETE_RECORD' ; GoSub DELETE_RECORD
|
||||
Case Otherwise$ ; Status = 'Invalid Action'
|
||||
|
||||
End Case
|
||||
|
||||
If KeyID then GoSub Restore_System_Variables
|
||||
|
||||
If Assigned(ActionFlow) else ActionFlow = ACTION_CONTINUE$
|
||||
|
||||
Return ActionFlow
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Calculated Columns
|
||||
//
|
||||
// The typical structure of a calculated column will look like this:
|
||||
//
|
||||
// Declare function Database_Services
|
||||
//
|
||||
// @ANS = Database_Services('CalculateColumn')
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
CalculateColumn:
|
||||
|
||||
// Make sure the ActionFlow return variable is cleared in case nothing is calculated.
|
||||
ActionFlow = ''
|
||||
|
||||
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
// ----- MFS calls -----------------------------------------------------------------------------------------------------
|
||||
|
||||
READ_RECORD_PRE:
|
||||
// In order to stop a record from being read in this action these lines of code must be used:
|
||||
//
|
||||
// OrigFileError = 100 : @FM : KeyID
|
||||
// Status = 0
|
||||
// Record = ''
|
||||
// ActionFlow = ACTION_STOP$
|
||||
|
||||
|
||||
return
|
||||
|
||||
READ_RECORD:
|
||||
|
||||
// In order to stop a record from being read in this action these lines of code must be used:
|
||||
//
|
||||
// OrigFileError = 100 : @FM : KeyID
|
||||
// Status = 0
|
||||
// Record = ''
|
||||
|
||||
return
|
||||
|
||||
READONLY_RECORD_PRE:
|
||||
// In order to stop a record from being read in this action these lines of code must be used:
|
||||
//
|
||||
// OrigFileError = 100 : @FM : KeyID
|
||||
// Status = 0
|
||||
// Record = ''
|
||||
// ActionFlow = ACTION_STOP$
|
||||
return
|
||||
|
||||
READONLY_RECORD:
|
||||
// In order to stop a record from being read in this action these lines of code must be used:
|
||||
//
|
||||
// OrigFileError = 100 : @FM : KeyID
|
||||
// Status = 0
|
||||
// Record = ''
|
||||
return
|
||||
|
||||
WRITE_RECORD_PRE:
|
||||
|
||||
ErrMsg = ''
|
||||
|
||||
//Req'd parameter checks
|
||||
ItemType = {RI_TYPE}
|
||||
|
||||
If ItemType EQ '' then
|
||||
ErrMsg := 'Item Type was not specified. '
|
||||
end
|
||||
|
||||
If ErrMsg NE '' then
|
||||
Error_Services('Add', 'Error Saving Reactor Item: ' : ErrMsg)
|
||||
OrigFileError = 104:': Error Saving Reactor Item: ' : ErrMsg
|
||||
Status = 0
|
||||
Record = ''
|
||||
ActionFlow = ACTION_STOP$
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
WRITE_RECORD:
|
||||
|
||||
|
||||
|
||||
return
|
||||
|
||||
DELETE_RECORD_PRE:
|
||||
|
||||
|
||||
return
|
||||
|
||||
DELETE_RECORD:
|
||||
return
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
ClearCursors:
|
||||
For counter = 0 to 8
|
||||
ClearSelect counter
|
||||
Next counter
|
||||
return
|
||||
|
||||
|
||||
Initialize_System_Variables:
|
||||
|
||||
// Save these for restoration later
|
||||
SaveDict = @DICT
|
||||
SaveID = @ID
|
||||
SaveRecord = @RECORD
|
||||
OrigFileError = @FILE.ERROR
|
||||
|
||||
// Now make sure @DICT, ID, and @RECORD are populated
|
||||
CurrentDictName = ''
|
||||
If @DICT then
|
||||
DictHandle = @DICT<1, 2>
|
||||
Locate DictHandle in @TABLES(5) Using @FM Setting fPos then
|
||||
CurrentDictName = Field(@TABLES(0), @FM, fPos, 1)
|
||||
end
|
||||
end
|
||||
|
||||
If CurrentDictName NE DictName then
|
||||
Open DictName to @DICT else Status = 'Unable to initialize @DICT'
|
||||
end
|
||||
|
||||
@ID = KeyID
|
||||
If Record else
|
||||
// Record might not have been passed in. Read the record from the database table just to make sure.
|
||||
@FILE.ERROR = ''
|
||||
Open TableName to hTable then
|
||||
FullFSList = hTable[1, 'F' : @VM]
|
||||
BFS = FullFSList[-1, 'B' : @SVM]
|
||||
LastHandle = hTable[-1, 'B' : \0D\]
|
||||
FileHandle = \0D\ : LastHandle[1, @VM]
|
||||
|
||||
Call @BFS(READO.RECORD, BFS, FileHandle, KeyID, FMC, Record, ReadOStatus)
|
||||
end
|
||||
end
|
||||
@RECORD = Record
|
||||
|
||||
return
|
||||
|
||||
|
||||
Restore_System_Variables:
|
||||
|
||||
Transfer SaveDict to @DICT
|
||||
Transfer SaveID to @ID
|
||||
Transfer SaveRecord to @RECORD
|
||||
@FILE.ERROR = OrigFileError
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
@ -1,64 +1,64 @@
|
||||
Function Remotehealthcheck_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 : Remotehealthcheck_API
|
||||
|
||||
Description : API logic for the Remotehealthcheck 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 Remotehealthcheck[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Remotehealthcheck.POST
|
||||
- Remotehealthcheck.ID.PUT
|
||||
- Remotehealthcheck.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 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', 200, 'This is a valid endpoint but a web API handler has not yet been created.')
|
||||
end
|
||||
|
||||
Return Response OR ''
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Endpoint Handlers
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
API remotehealthcheck.HEAD
|
||||
API remotehealthcheck.GET
|
||||
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
Function Remotehealthcheck_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 : Remotehealthcheck_API
|
||||
|
||||
Description : API logic for the Remotehealthcheck 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 Remotehealthcheck[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Remotehealthcheck.POST
|
||||
- Remotehealthcheck.ID.PUT
|
||||
- Remotehealthcheck.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 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', 200, 'This is a valid endpoint but a web API handler has not yet been created.')
|
||||
end
|
||||
|
||||
Return Response OR ''
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Endpoint Handlers
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
API remotehealthcheck.HEAD
|
||||
API remotehealthcheck.GET
|
||||
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
|
@ -77,7 +77,6 @@ Return Response or ""
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Service CalculateMaterialTrackData(RptColumns, LocationFilter, NoMatFlag)
|
||||
|
||||
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
|
||||
Lock hSysLists, ServiceKeyID then
|
||||
|
||||
@ -131,7 +130,7 @@ Service CalculateMaterialTrackData(RptColumns, LocationFilter, NoMatFlag)
|
||||
PrevReactNo = ''
|
||||
PrevWO = ''
|
||||
|
||||
SelectSent = 'SELECT SCHED_DET_NG WITH STOP_DTM GE ':Today:' BY REACT_NO'
|
||||
SelectSent = 'SELECT SCHED_DET_NG WITH STOP_DTM GE "':OCONV(Today, 'DT'):'" BY REACT_NO'
|
||||
|
||||
RList(SelectSent,TARGET_ACTIVELIST$,'','','')
|
||||
IF Get_Status(errCode) THEN
|
||||
@ -432,7 +431,7 @@ DETAIL:
|
||||
WPDAdjusted = Epi_Part_Services('GetAdjustedWafersPerDayScheduler', EpiPartNo, S.React_Type)
|
||||
If WPDAdjusted NE '' then
|
||||
CPDAdjusted = SRP_Math('CEILING', (WPDAdjusted/25) )
|
||||
CassInCR = DCount(KittCassList, ',') + DCount(PTICassList, ',') + DCount(LoadedCassList, ',')
|
||||
CassInCR = DCount(KitCassList, ',') + DCount(PTICassList, ',') + DCount(LoadedCassList, ',')
|
||||
CassNeeded = CassInCR - CPDAdjusted
|
||||
end
|
||||
end
|
||||
|
@ -149,7 +149,7 @@ Service GetMaterialTrackReport(RptColumns, LocationFilter, NoMatFlag)
|
||||
PrevReactNo = ''
|
||||
PrevWO = ''
|
||||
|
||||
SelectSent = 'SELECT SCHED_DET_NG WITH STOP_DTM GE ':Today:' BY REACT_NO'
|
||||
SelectSent = 'SELECT SCHED_DET_NG WITH STOP_DTM GE "':OCONV(Today, 'DT'):'" BY REACT_NO'
|
||||
|
||||
RList(SelectSent,TARGET_ACTIVELIST$,'','','')
|
||||
IF Get_Status(errCode) THEN
|
||||
@ -461,7 +461,7 @@ DETAIL:
|
||||
WPDAdjusted = Epi_Part_Services('GetAdjustedWafersPerDayScheduler', EpiPartNo, S.React_Type)
|
||||
If WPDAdjusted NE '' then
|
||||
CPDAdjusted = SRP_Math('CEILING', (WPDAdjusted/25) )
|
||||
CassInCR = DCount(KittCassList, ',') + DCount(PTICassList, ',') + DCount(LoadedCassList, ',')
|
||||
CassInCR = DCount(KitCassList, ',') + DCount(PTICassList, ',') + DCount(LoadedCassList, ',')
|
||||
CassNeeded = CassInCR - CPDAdjusted
|
||||
end
|
||||
end
|
||||
|
@ -218,7 +218,7 @@ end service
|
||||
// Calculates and stores the current inbound pending count for SAP.
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service SetInboundPending()
|
||||
|
||||
|
||||
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
|
||||
Lock hSysLists, ServiceKeyID then
|
||||
|
||||
@ -387,7 +387,7 @@ end service
|
||||
// Gets the incoming SAP transactions and processes them.
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service GetInboundTransactions()
|
||||
|
||||
|
||||
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
|
||||
Lock hSysLists, ServiceKeyID then
|
||||
SAPHoldStartDateTime = SAP_Services('GetSAPHoldStartDateTime')
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,23 +1,23 @@
|
||||
Compile subroutine ScrapeOEngineInit(void)
|
||||
#pragma SRP_Precompiler
|
||||
|
||||
$Insert ENVIRON_CONSTANTS
|
||||
|
||||
Declare subroutine Set_Env, GetEngineVersion
|
||||
Declare function RTI_Xlate_Controller
|
||||
|
||||
Version = ''
|
||||
GetEngineVersion(Version)
|
||||
MajorVersion = Version[1, 'F.']
|
||||
If MajorVersion GE 10 then
|
||||
// Stopgap performance fix for OI 10.2.2 RC1. Revelation will re-enable caching by default in 10.2.2 RC2.
|
||||
// Do not invoke this in OI 9 as the function does not exist!
|
||||
rv = RTI_Xlate_Controller('EnableCache')
|
||||
end
|
||||
|
||||
Set_Env(ENV_DEBUGGER_ENABLED$, 2, 1)
|
||||
Set_Env(ENV_DEBUGGER_INTERCEPT_PROC$,'SCRAPE_ENGINE_DEBUGGER_INTERCEPT',1)
|
||||
|
||||
return
|
||||
|
||||
|
||||
Compile subroutine ScrapeOEngineInit(void)
|
||||
#pragma SRP_Precompiler
|
||||
|
||||
$Insert ENVIRON_CONSTANTS
|
||||
|
||||
Declare subroutine Set_Env, GetEngineVersion
|
||||
Declare function RTI_Xlate_Controller
|
||||
|
||||
Version = ''
|
||||
GetEngineVersion(Version)
|
||||
MajorVersion = Version[1, 'F.']
|
||||
If MajorVersion GE 10 then
|
||||
// Stopgap performance fix for OI 10.2.2 RC1. Revelation will re-enable caching by default in 10.2.2 RC2.
|
||||
// Do not invoke this in OI 9 as the function does not exist!
|
||||
rv = RTI_Xlate_Controller('EnableCache')
|
||||
end
|
||||
|
||||
Set_Env(ENV_DEBUGGER_ENABLED$, 2, 1)
|
||||
Set_Env(ENV_DEBUGGER_INTERCEPT_PROC$,'SCRAPE_ENGINE_DEBUGGER_INTERCEPT',1)
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
@ -1,48 +1,48 @@
|
||||
Subroutine Scrape_Engine_Debugger_Intercept(Void)
|
||||
/***********************************************************************************************************************
|
||||
|
||||
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 : Scrape_Engine_Debugger_Intercept
|
||||
|
||||
Description : Handler program for the HTTP Debugger service module.
|
||||
|
||||
Notes : Service handler for HTTP Requests that abort due to a Runtime Error and the Debugger Intercept
|
||||
has been enabled.
|
||||
|
||||
Parameters :
|
||||
|
||||
Metadata :
|
||||
|
||||
History : (Date, Initials, Notes)
|
||||
07/25/23 djs Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert RTI_DEBUG_COMMON
|
||||
|
||||
Declare function Environment_Services, Logging_Services
|
||||
Declare subroutine Logging_Services
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Scrape'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
LogTime = Oconv(Time(), 'MTS')
|
||||
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' OEngine Log.csv'
|
||||
Headers = 'Stored Proc Status' : @FM : 'Stored Proc Status Code' : @FM : 'Current Program' : @FM : 'Call Depth' : @FM : 'Line No' : @FM : 'Call Stack'
|
||||
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
|
||||
LogData = ''
|
||||
LogData<1> = SPStatus@
|
||||
LogData<2> = SPStatCode@
|
||||
LogData<3> = Curr_Program@
|
||||
LogData<4> = CallDepth@
|
||||
LogData<5> = LineNo@
|
||||
LogData<6> = CallStack@
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, '', '', '')
|
||||
|
||||
Return
|
||||
|
||||
|
||||
Subroutine Scrape_Engine_Debugger_Intercept(Void)
|
||||
/***********************************************************************************************************************
|
||||
|
||||
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 : Scrape_Engine_Debugger_Intercept
|
||||
|
||||
Description : Handler program for the HTTP Debugger service module.
|
||||
|
||||
Notes : Service handler for HTTP Requests that abort due to a Runtime Error and the Debugger Intercept
|
||||
has been enabled.
|
||||
|
||||
Parameters :
|
||||
|
||||
Metadata :
|
||||
|
||||
History : (Date, Initials, Notes)
|
||||
07/25/23 djs Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert RTI_DEBUG_COMMON
|
||||
|
||||
Declare function Environment_Services, Logging_Services
|
||||
Declare subroutine Logging_Services
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Scrape'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
LogTime = Oconv(Time(), 'MTS')
|
||||
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' OEngine Log.csv'
|
||||
Headers = 'Stored Proc Status' : @FM : 'Stored Proc Status Code' : @FM : 'Current Program' : @FM : 'Call Depth' : @FM : 'Line No' : @FM : 'Call Stack'
|
||||
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
|
||||
LogData = ''
|
||||
LogData<1> = SPStatus@
|
||||
LogData<2> = SPStatCode@
|
||||
LogData<3> = Curr_Program@
|
||||
LogData<4> = CallDepth@
|
||||
LogData<5> = LineNo@
|
||||
LogData<6> = CallStack@
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, '', '', '')
|
||||
|
||||
Return
|
||||
|
||||
|
||||
|
@ -1,131 +1,131 @@
|
||||
Function Scrubber_pm_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 : Scrubber_pm_API
|
||||
|
||||
Description : API logic for the Scrubber_pm 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 Scrubber_pm[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Scrubber_pm.POST
|
||||
- Scrubber_pm.ID.PUT
|
||||
- Scrubber_pm.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)
|
||||
06/05/24 xxx Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
Declare Subroutine Pm_Services, Http_Services, Logging_Services
|
||||
Declare function Error_Services, Logging_Services, Environment_Services, Datetime
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert API_SETUP
|
||||
$insert HTTP_INSERTS
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Scrubbers\API'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
LogTime = Oconv(Time(), 'MTS')
|
||||
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Tool Log.csv'
|
||||
Headers = 'Logging DTM' : @FM : 'ScrubberID' : @FM : 'Notes' : @FM : 'Message'
|
||||
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
|
||||
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
||||
|
||||
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 scrubber_pm.POST
|
||||
Body = HTTP_Services('GetHTTPPostString')
|
||||
If Body NE '' then
|
||||
// The POST string will have been encoded so use percent (URL) decoding.
|
||||
PMJson = HTTP_Services('DecodePercentString', Body)
|
||||
ParseResponse = SRP_JSON(objJson, 'PARSE', PMJson)
|
||||
If (ParseResponse EQ '') then
|
||||
EquipmentID = SRP_JSON(objJson, 'GetValue', 'EquipmentId')
|
||||
User = SRP_JSON(objJson, 'GetValue', 'User')
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 400, 'Unable to parse the JSON data from the request.')
|
||||
end
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 400, 'JSON object is missing in the body of the request.')
|
||||
end
|
||||
|
||||
end api
|
||||
|
||||
|
||||
API scrubber_pm.HEAD
|
||||
API scrubber_pm.GET
|
||||
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
|
||||
API scrubber_pm.ID.HEAD
|
||||
API scrubber_pm.ID.GET
|
||||
|
||||
ScrubberID = EndpointSegment
|
||||
IF RowExists('TOOL', ScrubberID) then
|
||||
Pm_Services('CompleteScrubberPM', ScrubberID)
|
||||
If Error_Services('HasError') then
|
||||
ErrMsg = Error_Services('GetMessage')
|
||||
HTTP_Services('SetResponseStatus', 500, ErrMsg)
|
||||
LogData = ''
|
||||
LogData<1> = OConv(Datetime(), 'DT2/^H')
|
||||
LogData<2> = ScrubberID
|
||||
LogData<3> = 'Error'
|
||||
LogData<4> = ErrMsg
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||
end else
|
||||
LogData = ''
|
||||
LogData<1> = OConv(Datetime(), 'DT2/^H')
|
||||
LogData<2> = ScrubberID
|
||||
LogData<3> = 'Success'
|
||||
LogData<4> = 'Scrubber PM Completion was successful'
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||
end
|
||||
end else
|
||||
ErrMsg = 'Scrubber does not exist!'
|
||||
HTTP_Services('SetResponseStatus', 500, ErrMsg)
|
||||
LogData = ''
|
||||
LogData<1> = OConv(Datetime(), 'DT2/^H')
|
||||
LogData<2> = ScrubberID
|
||||
LogData<3> = 'Error'
|
||||
LogData<4> = ErrMsg
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||
end
|
||||
end api
|
||||
|
||||
|
||||
Function Scrubber_pm_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 : Scrubber_pm_API
|
||||
|
||||
Description : API logic for the Scrubber_pm 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 Scrubber_pm[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Scrubber_pm.POST
|
||||
- Scrubber_pm.ID.PUT
|
||||
- Scrubber_pm.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)
|
||||
06/05/24 xxx Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
Declare Subroutine Pm_Services, Http_Services, Logging_Services
|
||||
Declare function Error_Services, Logging_Services, Environment_Services, Datetime
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert API_SETUP
|
||||
$insert HTTP_INSERTS
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Scrubbers\API'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
LogTime = Oconv(Time(), 'MTS')
|
||||
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Tool Log.csv'
|
||||
Headers = 'Logging DTM' : @FM : 'ScrubberID' : @FM : 'Notes' : @FM : 'Message'
|
||||
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
|
||||
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
||||
|
||||
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 scrubber_pm.POST
|
||||
Body = HTTP_Services('GetHTTPPostString')
|
||||
If Body NE '' then
|
||||
// The POST string will have been encoded so use percent (URL) decoding.
|
||||
PMJson = HTTP_Services('DecodePercentString', Body)
|
||||
ParseResponse = SRP_JSON(objJson, 'PARSE', PMJson)
|
||||
If (ParseResponse EQ '') then
|
||||
EquipmentID = SRP_JSON(objJson, 'GetValue', 'EquipmentId')
|
||||
User = SRP_JSON(objJson, 'GetValue', 'User')
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 400, 'Unable to parse the JSON data from the request.')
|
||||
end
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 400, 'JSON object is missing in the body of the request.')
|
||||
end
|
||||
|
||||
end api
|
||||
|
||||
|
||||
API scrubber_pm.HEAD
|
||||
API scrubber_pm.GET
|
||||
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
|
||||
API scrubber_pm.ID.HEAD
|
||||
API scrubber_pm.ID.GET
|
||||
|
||||
ScrubberID = EndpointSegment
|
||||
IF RowExists('TOOL', ScrubberID) then
|
||||
Pm_Services('CompleteScrubberPM', ScrubberID)
|
||||
If Error_Services('HasError') then
|
||||
ErrMsg = Error_Services('GetMessage')
|
||||
HTTP_Services('SetResponseStatus', 500, ErrMsg)
|
||||
LogData = ''
|
||||
LogData<1> = OConv(Datetime(), 'DT2/^H')
|
||||
LogData<2> = ScrubberID
|
||||
LogData<3> = 'Error'
|
||||
LogData<4> = ErrMsg
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||
end else
|
||||
LogData = ''
|
||||
LogData<1> = OConv(Datetime(), 'DT2/^H')
|
||||
LogData<2> = ScrubberID
|
||||
LogData<3> = 'Success'
|
||||
LogData<4> = 'Scrubber PM Completion was successful'
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||
end
|
||||
end else
|
||||
ErrMsg = 'Scrubber does not exist!'
|
||||
HTTP_Services('SetResponseStatus', 500, ErrMsg)
|
||||
LogData = ''
|
||||
LogData<1> = OConv(Datetime(), 'DT2/^H')
|
||||
LogData<2> = ScrubberID
|
||||
LogData<3> = 'Error'
|
||||
LogData<4> = ErrMsg
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||
end
|
||||
end api
|
||||
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,106 +1,106 @@
|
||||
Compile function System_Healthcheck_Services(@Service, @Params)
|
||||
#pragma precomp SRP_PreCompiler
|
||||
$insert LOGICAL
|
||||
$Insert ENGINE_HEALTH_EQUATES
|
||||
|
||||
Declare Subroutine Error_Services, SRP_Json
|
||||
Declare function System_Healthcheck_Services, Error_Services, SRP_Datetime, SRP_Json
|
||||
|
||||
GoToService
|
||||
|
||||
Return Response or ""
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// SERVICES
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Service GetEngineLastRunDTM(EngineID)
|
||||
If EngineID NE '' then
|
||||
If RowExists('APP_INFO', EngineID) then
|
||||
Open "APP_INFO" To AITable then
|
||||
LastRunDTM = ''
|
||||
ReadV LastRunDTM From AITable, EngineID, 1 Then
|
||||
If LastRunDTM NE '' then
|
||||
Response = LastRunDTM
|
||||
end else
|
||||
Error_Services('Add', 'Error in System_Healthcheck_Services -> GetEngineLastRunDTM: Last Run Time not found')
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Error in System_Healthcheck_Services -> GetEngineLastRunDTM: Error reading specified engine record')
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Error in System_Healthcheck_Services -> GetEngineLastRunDTM: Unable to open APP_INFO table')
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Error in System_Healthcheck_Services -> GetEngineLastRunDTM: No engine record found')
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Error in System_Healthcheck_Services -> GetEngineLastRunDTM: No Engine ID entered')
|
||||
end
|
||||
End Service
|
||||
|
||||
Service GetEngineHealthInfo(EngineID)
|
||||
EngineHealthInfo = ''
|
||||
If EngineID NE '' then
|
||||
If RowExists('APP_INFO', EngineID) then
|
||||
LastRunDTM = System_HealthCheck_Services('GetEngineLastRunDTM', EngineID)
|
||||
If Error_Services('NoError') then
|
||||
CurrDTM = SRP_Datetime('Now')
|
||||
EngineHealthThreshold = XLATE('APP_INFO', 'ENGINE_HEALTH_THRESHOLD_MINUTES', 1, 'X')
|
||||
MinutesSinceLastRun = SRP_Datetime('MinuteSpan', LastRunDTM, CurrDTM)
|
||||
Healthy = MinutesSinceLastRun LT EngineHealthThreshold
|
||||
EngineHealthInfo<ENGINE_HEALTH_ENGINE_ID$> = EngineID
|
||||
EngineHealthInfo<ENGINE_HEALTH_LAST_RUN_DTM$> = LastRunDTM
|
||||
EngineHealthInfo<ENGINE_HEALTH_MINUTES_SINCE_LAST_RUN$> = MinutesSinceLastRun
|
||||
EngineHealthInfo<ENGINE_HEALTH_HEALTH_STATUS$> = Healthy
|
||||
Response = EngineHealthInfo
|
||||
end else
|
||||
Error_Services('Add', Error_Services('GetMessage'))
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Error in System_Healthcheck_Services -> GetEngineHealth: No engine record found')
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Error in System_Healthcheck_Services -> GetEngineHealth: No Engine ID entered')
|
||||
end
|
||||
end service
|
||||
|
||||
Service ConvertEngineHealthInfoToJSON(EngineHealthInfo, ItemURL)
|
||||
objJSON = ''
|
||||
If SRP_JSON(objJSON, 'New', 'Object') then
|
||||
objEngine = ''
|
||||
If SRP_JSON(objEngine, 'New', 'Object') then
|
||||
SRP_JSON(objEngine, 'SetValue', 'EngineID', EngineHealthInfo<ENGINE_HEALTH_ENGINE_ID$>)
|
||||
SRP_JSON(objEngine, 'SetValue', 'LastRunDTM', EngineHealthInfo<ENGINE_HEALTH_LAST_RUN_DTM$>)
|
||||
SRP_JSON(objEngine, 'SetValue', 'MinutesSinceLastRun', EngineHealthInfo<ENGINE_HEALTH_MINUTES_SINCE_LAST_RUN$>)
|
||||
SRP_JSON(objEngine, 'SetValue', 'Healthy', EngineHealthInfo<ENGINE_HEALTH_HEALTH_STATUS$>)
|
||||
SRP_JSON(objJSON, 'Set', 'Engine', objEngine)
|
||||
SRP_JSON(objEngine, 'Release')
|
||||
end
|
||||
|
||||
If itemURL NE '' then
|
||||
objLinks = ''
|
||||
If SRP_JSON(objLinks, 'New', 'Object') then
|
||||
objLink = ''
|
||||
If SRP_JSON(objLink, 'New', 'Object') then
|
||||
SRP_JSON(objLink, 'SetValue', 'href', ItemURL, 'String')
|
||||
SRP_JSON(objLink, 'SetValue', 'title', 'Self', 'String')
|
||||
SRP_JSON(objLinks, 'Set', 'self', objLink)
|
||||
SRP_JSON(objLink, 'Release')
|
||||
end
|
||||
SRP_JSON(objJSON, 'Set', '_links', objLinks)
|
||||
SRP_JSON(objLinks, 'Release')
|
||||
end
|
||||
SRP_JSON(objJSON, 'SetValue', '_class', 'resource')
|
||||
end
|
||||
JSON = SRP_JSON(objJSON, 'Stringify', 'Styled')
|
||||
SRP_JSON(objJSON, 'Release')
|
||||
end else
|
||||
Error_Services('Add', 'Error creating JSON Object')
|
||||
end
|
||||
Response = JSON
|
||||
end service
|
||||
|
||||
|
||||
|
||||
|
||||
Compile function System_Healthcheck_Services(@Service, @Params)
|
||||
#pragma precomp SRP_PreCompiler
|
||||
$insert LOGICAL
|
||||
$Insert ENGINE_HEALTH_EQUATES
|
||||
|
||||
Declare Subroutine Error_Services, SRP_Json
|
||||
Declare function System_Healthcheck_Services, Error_Services, SRP_Datetime, SRP_Json
|
||||
|
||||
GoToService
|
||||
|
||||
Return Response or ""
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// SERVICES
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Service GetEngineLastRunDTM(EngineID)
|
||||
If EngineID NE '' then
|
||||
If RowExists('APP_INFO', EngineID) then
|
||||
Open "APP_INFO" To AITable then
|
||||
LastRunDTM = ''
|
||||
ReadV LastRunDTM From AITable, EngineID, 1 Then
|
||||
If LastRunDTM NE '' then
|
||||
Response = LastRunDTM
|
||||
end else
|
||||
Error_Services('Add', 'Error in System_Healthcheck_Services -> GetEngineLastRunDTM: Last Run Time not found')
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Error in System_Healthcheck_Services -> GetEngineLastRunDTM: Error reading specified engine record')
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Error in System_Healthcheck_Services -> GetEngineLastRunDTM: Unable to open APP_INFO table')
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Error in System_Healthcheck_Services -> GetEngineLastRunDTM: No engine record found')
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Error in System_Healthcheck_Services -> GetEngineLastRunDTM: No Engine ID entered')
|
||||
end
|
||||
End Service
|
||||
|
||||
Service GetEngineHealthInfo(EngineID)
|
||||
EngineHealthInfo = ''
|
||||
If EngineID NE '' then
|
||||
If RowExists('APP_INFO', EngineID) then
|
||||
LastRunDTM = System_HealthCheck_Services('GetEngineLastRunDTM', EngineID)
|
||||
If Error_Services('NoError') then
|
||||
CurrDTM = SRP_Datetime('Now')
|
||||
EngineHealthThreshold = XLATE('APP_INFO', 'ENGINE_HEALTH_THRESHOLD_MINUTES', 1, 'X')
|
||||
MinutesSinceLastRun = SRP_Datetime('MinuteSpan', LastRunDTM, CurrDTM)
|
||||
Healthy = MinutesSinceLastRun LT EngineHealthThreshold
|
||||
EngineHealthInfo<ENGINE_HEALTH_ENGINE_ID$> = EngineID
|
||||
EngineHealthInfo<ENGINE_HEALTH_LAST_RUN_DTM$> = LastRunDTM
|
||||
EngineHealthInfo<ENGINE_HEALTH_MINUTES_SINCE_LAST_RUN$> = MinutesSinceLastRun
|
||||
EngineHealthInfo<ENGINE_HEALTH_HEALTH_STATUS$> = Healthy
|
||||
Response = EngineHealthInfo
|
||||
end else
|
||||
Error_Services('Add', Error_Services('GetMessage'))
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Error in System_Healthcheck_Services -> GetEngineHealth: No engine record found')
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Error in System_Healthcheck_Services -> GetEngineHealth: No Engine ID entered')
|
||||
end
|
||||
end service
|
||||
|
||||
Service ConvertEngineHealthInfoToJSON(EngineHealthInfo, ItemURL)
|
||||
objJSON = ''
|
||||
If SRP_JSON(objJSON, 'New', 'Object') then
|
||||
objEngine = ''
|
||||
If SRP_JSON(objEngine, 'New', 'Object') then
|
||||
SRP_JSON(objEngine, 'SetValue', 'EngineID', EngineHealthInfo<ENGINE_HEALTH_ENGINE_ID$>)
|
||||
SRP_JSON(objEngine, 'SetValue', 'LastRunDTM', EngineHealthInfo<ENGINE_HEALTH_LAST_RUN_DTM$>)
|
||||
SRP_JSON(objEngine, 'SetValue', 'MinutesSinceLastRun', EngineHealthInfo<ENGINE_HEALTH_MINUTES_SINCE_LAST_RUN$>)
|
||||
SRP_JSON(objEngine, 'SetValue', 'Healthy', EngineHealthInfo<ENGINE_HEALTH_HEALTH_STATUS$>)
|
||||
SRP_JSON(objJSON, 'Set', 'Engine', objEngine)
|
||||
SRP_JSON(objEngine, 'Release')
|
||||
end
|
||||
|
||||
If itemURL NE '' then
|
||||
objLinks = ''
|
||||
If SRP_JSON(objLinks, 'New', 'Object') then
|
||||
objLink = ''
|
||||
If SRP_JSON(objLink, 'New', 'Object') then
|
||||
SRP_JSON(objLink, 'SetValue', 'href', ItemURL, 'String')
|
||||
SRP_JSON(objLink, 'SetValue', 'title', 'Self', 'String')
|
||||
SRP_JSON(objLinks, 'Set', 'self', objLink)
|
||||
SRP_JSON(objLink, 'Release')
|
||||
end
|
||||
SRP_JSON(objJSON, 'Set', '_links', objLinks)
|
||||
SRP_JSON(objLinks, 'Release')
|
||||
end
|
||||
SRP_JSON(objJSON, 'SetValue', '_class', 'resource')
|
||||
end
|
||||
JSON = SRP_JSON(objJSON, 'Stringify', 'Styled')
|
||||
SRP_JSON(objJSON, 'Release')
|
||||
end else
|
||||
Error_Services('Add', 'Error creating JSON Object')
|
||||
end
|
||||
Response = JSON
|
||||
end service
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -86,13 +86,13 @@ Testing:
|
||||
* DebuggerOn = Get_Env(AttributeList)
|
||||
* DebuggerOn = AttributeList
|
||||
|
||||
TickCount = GetTickCount()
|
||||
Response = 'Hello World2! Ticks: ':TickCount:' Debugger is off'
|
||||
OSWrite Response on 'D:\tmp\HelloWorld2.txt'
|
||||
* TickCount = GetTickCount()
|
||||
* Response = 'Hello World2! Ticks: ':TickCount:' Debugger is off'
|
||||
* OSWrite Response on 'D:\tmp\HelloWorld2.txt'
|
||||
*
|
||||
* Response = Param1
|
||||
|
||||
Response = Param1
|
||||
|
||||
return Response
|
||||
return
|
||||
|
||||
* Testing:
|
||||
*
|
||||
|
@ -94,29 +94,32 @@ $Insert PS_EQUATES
|
||||
|
||||
Main:
|
||||
debug
|
||||
|
||||
TaskID = RTI_Task_Submit('', 'TEST_DANIEL2', '', '', '')
|
||||
|
||||
* Slots = Xlate('WM_OUT', '173011*1*2', 'SLOT_WAFER_ID', 'X')
|
||||
* RDSNos = Xlate('WM_OUT', '173011*1*3', 'RDS', 'X')
|
||||
|
||||
WONo = 172637
|
||||
WOStep = 1
|
||||
CassNo = 30
|
||||
WMOKey = WONo:'*':WOStep:'*':CassNo
|
||||
WOMatKey = WONo:'*':CassNo
|
||||
NCRNos = Xlate('WM_OUT', WMOKey, 'SLOT_NCR', 'X')
|
||||
NumScrapSlots = 0
|
||||
If NCRNos NE '' then
|
||||
For each NCRNo in NCRNos using @VM
|
||||
NumScrapSlots += (NCRNo NE '')
|
||||
Next NCRNo
|
||||
end
|
||||
|
||||
SchedCassQty = XLATE('WO_MAT', WOMatKey, 'WAFER_QTY', 'X')
|
||||
|
||||
If NumScrapSlots GE SchedCassQty then
|
||||
FullBoxReject = True$
|
||||
end else
|
||||
FullBoxReject = False$
|
||||
end
|
||||
* WONo = 172637
|
||||
* WOStep = 1
|
||||
* CassNo = 30
|
||||
* WMOKey = WONo:'*':WOStep:'*':CassNo
|
||||
* WOMatKey = WONo:'*':CassNo
|
||||
* NCRNos = Xlate('WM_OUT', WMOKey, 'SLOT_NCR', 'X')
|
||||
* NumScrapSlots = 0
|
||||
* If NCRNos NE '' then
|
||||
* For each NCRNo in NCRNos using @VM
|
||||
* NumScrapSlots += (NCRNo NE '')
|
||||
* Next NCRNo
|
||||
* end
|
||||
*
|
||||
* SchedCassQty = XLATE('WO_MAT', WOMatKey, 'WAFER_QTY', 'X')
|
||||
*
|
||||
* If NumScrapSlots GE SchedCassQty then
|
||||
* FullBoxReject = True$
|
||||
* end else
|
||||
* FullBoxReject = False$
|
||||
* end
|
||||
|
||||
* Version = ''
|
||||
* GetEngineVersion(Version)
|
||||
@ -124,7 +127,7 @@ Main:
|
||||
* rv = RTI_Xlate_Controller('EnableCache')
|
||||
* end
|
||||
|
||||
return
|
||||
return TaskID
|
||||
|
||||
* Path = Drive()
|
||||
* UNCPath = SRP_Path("PathToUnc", Path)
|
||||
|
@ -1,57 +1,57 @@
|
||||
Compile function Test_Wafer_Counter(@Test)
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$Insert APP_INSERTS
|
||||
|
||||
Declare function Wafer_Counter_Services, Error_Services
|
||||
|
||||
// TODO: Code to run before each test goes here
|
||||
|
||||
GotoTest
|
||||
|
||||
// TODO: Code to run after each test goes here
|
||||
|
||||
Return TestResult or 1
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// TESTS
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Test Test1
|
||||
|
||||
FileData = 'T25':CRLF$:'P1FFFFFF'
|
||||
Value = Wafer_Counter_Services('ConvertWaferData', FileData)
|
||||
If Error_Services('HasError') then Value = Error_Services('GetMessage')
|
||||
Assert Value equals 1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1
|
||||
|
||||
End Test
|
||||
|
||||
Test Test2
|
||||
|
||||
FileData = 'T00':CRLF$:'P0000000'
|
||||
Value = Wafer_Counter_Services('ConvertWaferData', FileData)
|
||||
If Error_Services('HasError') then Value = Error_Services('GetMessage')
|
||||
Assert Value equals 0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0
|
||||
|
||||
End Test
|
||||
|
||||
Test Test3
|
||||
|
||||
FileData = 'T12':CRLF$:'P0AAAAAA'
|
||||
Value = Wafer_Counter_Services('ConvertWaferData', FileData)
|
||||
If Error_Services('HasError') then Value = Error_Services('GetMessage')
|
||||
Assert Value equals 0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0
|
||||
|
||||
end test
|
||||
|
||||
Test Test4
|
||||
|
||||
FileData = 'T13':CRLF$:'P1555555'
|
||||
Value = Wafer_Counter_Services('ConvertWaferData', FileData)
|
||||
If Error_Services('HasError') then Value = Error_Services('GetMessage')
|
||||
Assert Value equals 1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1
|
||||
|
||||
end test
|
||||
|
||||
|
||||
|
||||
Compile function Test_Wafer_Counter(@Test)
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$Insert APP_INSERTS
|
||||
|
||||
Declare function Wafer_Counter_Services, Error_Services
|
||||
|
||||
// TODO: Code to run before each test goes here
|
||||
|
||||
GotoTest
|
||||
|
||||
// TODO: Code to run after each test goes here
|
||||
|
||||
Return TestResult or 1
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// TESTS
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Test Test1
|
||||
|
||||
FileData = 'T25':CRLF$:'P1FFFFFF'
|
||||
Value = Wafer_Counter_Services('ConvertWaferData', FileData)
|
||||
If Error_Services('HasError') then Value = Error_Services('GetMessage')
|
||||
Assert Value equals 1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1:@VM:1
|
||||
|
||||
End Test
|
||||
|
||||
Test Test2
|
||||
|
||||
FileData = 'T00':CRLF$:'P0000000'
|
||||
Value = Wafer_Counter_Services('ConvertWaferData', FileData)
|
||||
If Error_Services('HasError') then Value = Error_Services('GetMessage')
|
||||
Assert Value equals 0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0:@VM:0
|
||||
|
||||
End Test
|
||||
|
||||
Test Test3
|
||||
|
||||
FileData = 'T12':CRLF$:'P0AAAAAA'
|
||||
Value = Wafer_Counter_Services('ConvertWaferData', FileData)
|
||||
If Error_Services('HasError') then Value = Error_Services('GetMessage')
|
||||
Assert Value equals 0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0
|
||||
|
||||
end test
|
||||
|
||||
Test Test4
|
||||
|
||||
FileData = 'T13':CRLF$:'P1555555'
|
||||
Value = Wafer_Counter_Services('ConvertWaferData', FileData)
|
||||
If Error_Services('HasError') then Value = Error_Services('GetMessage')
|
||||
Assert Value equals 1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:1
|
||||
|
||||
end test
|
||||
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user