pre cutover push

This commit is contained in:
Infineon\StieberD
2024-09-04 20:33:41 -07:00
parent 6ea6969f4b
commit 7762b129af
2072 changed files with 130000 additions and 95295 deletions

View File

@ -71,8 +71,6 @@ Service GetADGroups(Username, Domain)
AccountMgmtDllPath = DotNetDir:'System.DirectoryServices.AccountManagement.dll'
Set_Property.Net(DotNetHandle, "AssemblyName", AccountMgmtDllPath)
If Not(Get_Status(errCode)) then
Params = 'Domain':@FM:'Infineon'
ParamTypes = 'System.DirectoryServices.AccountManagement.ContextType':@FM:'System.String'
objPC = Create_Class.Net(DotNetHandle, "System.DirectoryServices.AccountManagement.PrincipalContext", 0, Params, ParamTypes)
@ -142,4 +140,3 @@ Service GetComputerDomain()
end service

View File

@ -137,4 +137,3 @@ return 0

View File

@ -137,4 +137,3 @@ GOTO READRECORD
*
END

View File

@ -164,4 +164,3 @@ write '' on SysListsTable, ListsId else
return 0
end
RETURN 0

View File

@ -26,4 +26,3 @@ begin case
status() = invalid_msg$
end case
return

View File

@ -108,4 +108,3 @@ StartStop:
END
return

View File

@ -59,4 +59,3 @@ End
Return Status

57
LSL2/STPROC/ADMIN_API.txt Normal file
View File

@ -0,0 +1,57 @@
Function Admin_API(@API)
/***********************************************************************************************************************
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
permission from SRP Computer Solutions, Inc.
Name : Admin_API
Description : API logic for the Admin resource.
Notes : All web APIs should include the API_SETUP insert. This will provide several useful variables:
HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.)
APIURL - The URL for the API entry point (e.g., api.mysite.com/v1).
FullEndpointURL - The URL submitted by the client, including query params.
FullEndpointURLNoQuery - The URL submitted by the client, excluding query params.
EndpointSegment - The URL endpoint segment.
ParentURL - The URL path preceeding the current endpoint.
CurrentAPI - The name of this stored procedure.
Parameters :
API [in] -- Web API to process. Format is [APIPattern].[HTTPMethod]:
- APIPattern must follow this structure Admin[.ID.[<Property>]]
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
Examples:
- Admin.POST
- Admin.ID.PUT
- Admin.ID.firstName.GET
Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API
services do not rely upon anything being returned in the response. This is what the
various services like SetResponseBody and SetResponseStatus services are for. A response
value is only helpful if the developers want to use it for debug purposes.
History : (Date, Initials, Notes)
03/14/24 xxx Original programmer.
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
$insert APP_INSERTS
$insert API_SETUP
$insert HTTP_INSERTS
GoToAPI else
// The specific resource endpoint doesn't have a API handler yet.
HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.')
end
Return Response OR ''
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Endpoint Handlers
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@ -7,4 +7,3 @@ $insert logical
$insert lsl_users_equ
Valid = xlate( 'LSL_USERS', UserToCheck, lsl_users_admin_user$, 'X' )
return Valid

View File

@ -57,4 +57,3 @@ For Each Domain in Domains using ','
Next Domain
Set_Property(@Window : '.TABLE_1', 'LIST', List)
return 0

View File

@ -0,0 +1,85 @@
Compile function Archive_Services(@Service, @Params)
#pragma precomp SRP_PreCompiler
$insert LOGICAL
$insert APP_INSERTS
EQU COMMA$ To ','
Declare subroutine Change_Log_Services, Logging_Services
Declare function SRP_Datetime, Logging_Services, Environment_Services, Datetime
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Archive'
LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS')
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ArchiveService.csv'
Headers = 'Logging DTM' : @FM : 'Message' : @FM : 'Cutoff Date'
objLogArchiveService = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
GoToService
Return Response or ""
//-----------------------------------------------------------------------------
// SERVICES
//-----------------------------------------------------------------------------
Service ArchiveRecords()
Errors = ''
StatusMessage = 'Starting Archive Script.'
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = StatusMessage
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
//Archive Change Log Records
GoSub ChangeLogArchive
//Finish
Locate True$ in Errors using @FM setting ePos then
StatusMessage = 'Archive script complete. Errors detected. Check individual archive logs for more info.'
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = StatusMessage
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
end else
StatusMessage = 'Archive script complete. No errors detected.'
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = StatusMessage
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
end
End Service
Service DearchiveRecord(Table, ID)
end service
ChangeLogArchive:
StatusMessage = 'Starting Change_Log Archive Script.'
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = StatusMessage
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
ChangeLogArchiveDate = SRP_Datetime('AddYears', Datetime(), -1)
Change_Log_Services('ArchiveChangeLogRecByDate', ChangeLogArchiveDate)
If Error_Services('NoError') then
StatusMessage = 'Starting Change_Log Archive Script.'
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = StatusMessage
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
end else
StatusMessage = 'Error in Change_Log Archive Script.'
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = StatusMessage
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
Errors<-1> = True$
end
return

View File

@ -33,4 +33,3 @@ for j = 1 to NumValues
next k
next j

View File

@ -105,4 +105,3 @@ end else
end
osclose DosTableVar
return 0

View File

@ -28,4 +28,3 @@ begin case
status() = invalid_msg$
end case
return

View File

@ -207,4 +207,3 @@ Main_Process:
end
return

View File

@ -262,4 +262,3 @@ Remove_Arev_Table_Name:
CALL @NEXTFS(CODE, FS, Real_Handle, NAME, FMC, RECORD, STATUS)
return

View File

@ -0,0 +1,152 @@
Function Authentication_API(@API)
/***********************************************************************************************************************
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
permission from SRP Computer Solutions, Inc.
Name : Authentication_API
Description : API logic for the Authentication resource.
Notes : All web APIs should include the API_SETUP insert. This will provide several useful variables:
HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.)
APIURL - The URL for the API entry point (e.g., api.mysite.com/v1).
FullEndpointURL - The URL submitted by the client, including query params.
FullEndpointURLNoQuery - The URL submitted by the client, excluding query params.
EndpointSegment - The URL endpoint segment.
ParentURL - The URL path preceeding the current endpoint.
CurrentAPI - The name of this stored procedure.
Parameters :
API [in] -- Web API to process. Format is [APIPattern].[HTTPMethod]:
- APIPattern must follow this structure Authentication[.ID.[<Property>]]
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
Examples:
- Authentication.POST
- Authentication.ID.PUT
- Authentication.ID.firstName.GET
Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API
services do not rely upon anything being returned in the response. This is what the
various services like SetResponseBody and SetResponseStatus services are for. A response
value is only helpful if the developers want to use it for debug purposes.
History : (Date, Initials, Notes)
07/17/24 djs Original programmer.
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
$insert APP_INSERTS
$insert API_SETUP
$insert HTTP_INSERTS
$insert LSL_USERS_EQUATES
Equ USERNAME$ To 1
Equ GROUP$ To 2
Equ PASSWORD$ To 3
Equ CONTEXT$ To 4
Declare function Database_Services, MemberOf
GoToAPI else
// The specific resource endpoint doesn't have a API handler yet.
HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.')
end
Return Response OR ''
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Endpoint Handlers
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
API authentication.POST
Body = HTTP_Services('GetHTTPPostString')
If Body NE '' then
// The POST string will have been encoded so use percent (URL) decoding
AuthJson = HTTP_Services('DecodePercentString', Body)
hAuthJson = ''
ParseResponse = SRP_JSON(hAuthJson, 'PARSE', AuthJson)
If (ParseResponse EQ '') then
Username = SRP_JSON(hAuthJson, 'GetValue', 'Username')
Password = SRP_JSON(hAuthJson, 'GetValue', 'Password')
Groups = ''
hGroups = SRP_JSON(hAuthJson, 'get', 'Groups')
If hGroups then
ElementHandles = SRP_JSON(hGroups, 'GetElements', @VM)
If ElementHandles NE '' then
For each ElementHandle in ElementHandles using @VM
Groups<0, -1> = SRP_JSON(ElementHandle, 'GetValue')
SRP_JSON(ElementHandle, 'Release')
Next ElementHandle
end
SRP_JSON(hGroups, 'Release')
end
SRP_JSON(hAuthJson, 'Release')
// Validate Credentials
UserRec = Database_Services('ReadDataRow', 'LSL_USERS', Username)
If Error_Services('NoError') then
Credentials = ''
Credentials<USERNAME$> = Username
Credentials<PASSWORD$> = UserRec<LSL_USERS_PASSWORD$>
Credentials<GROUP$> = UserRec<LSL_USERS_GROUPS$>
Member = False$
Group = ''
If Groups NE '' then
For each Group in Groups using @VM
Member = MemberOf(Credentials<USERNAME$>, Group)
Until Member EQ True$
Next Group
end else
Member = True$
end
Begin Case
Case (Password EQ Credentials<PASSWORD$>) AND (Member EQ True$)
// Return 200, authentication successful
StatusCode = 200
Message = 'Authentication successful'
HTTP_Services('SetResponseStatus', 200, Message)
Case (Password EQ Credentials<PASSWORD$>) AND (Member EQ False$)
// Return 401, not a member of required groups
NumGroups = DCount(Groups, @VM)
If NumGroups GT 1 then
Swap @VM with ' or ' in Groups
Message = 'User is not a member of the ' : Groups : ' groups.'
end else
Message = 'User is not a member of the ' : Group : ' group.'
end
HTTP_Services('SetResponseStatus', 401, 'Authentication failed. ':Message)
Case Password NE Credentials<PASSWORD$>
// Return 401, unable to validate password
Message = 'Unable to validate username. Please re-enter.'
HTTP_Services('SetResponseStatus', 401, 'Authentication failed. ':Message)
Case Otherwise$
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Unhandled case.')
End Case
end else
// Error reading user record
ErrorMsg = Error_Services('GetMessage')
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': ErrorMsg)
end
end else
HTTP_Services('SetResponseStatus', 400, 'Error in the ' : CurrentAPI : ' API. Error parsing JSON.')
end
end else
HTTP_Services('SetResponseStatus', 400, 'Error in the ' : CurrentAPI : ' API. Empty request.')
end
end api
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@ -0,0 +1,415 @@
Compile function Automated_Workflow_Services(@Service, @Params)
/*
Initial Author: Jonathan Ouellette
This service module has a catalogued list of functions to quickly and easily perform certain functions related to lot
processing.
1. CreateAWO - Imitates the process of getting data from SAP and processing the WO start in OI.
2. RouteWO - Imitates routing of a WO, AKA selecting a ProdVer and Assigning the WO to a reactor Type
3. PrescribeWafers - Imitates creating the child lots for a WO, AKA creating WO_MAT records
4. ReleaseCassettes - Assigns raw substrates to the WO_MAT records. RDS for non-epipro is created at this point.
5. PerformPTI - Imitates Receiving operator moving the lot into the fab.
6. Perform1VER - Performs the 1VER operation for an RDS.
7. PerformLoad - Performs the load operation for an RDS.
8. PerformUnload - Performs the unload operation for a non-epipro RDS.
9. EnterRecipeParms - Used in conjunction with PerformLoad. Used to enter the parameters for the Reactor Recipe upon load
typically this is the first load of a Work Order.
10. VerifyRecipeParms - Used in conjunction with PerformLoad. Used to verify the current recipe setpoints for an RDS load.
*/
#pragma precomp SRP_PreCompiler
Declare function Gan_Services, Obj_Notes_Sent, msg, Check_Notes, Jonathan_Services, Database_Services, SRP_Datetime
Declare function Lsl_Users_Services, SRP_Time, RList, Error_Services, Obj_Wo_Mat, Pm_Services, Date_Services, Test_Run_Services
Declare function Reactor_Services, Reactor_Log_Services, obj_react_item, Utility, Environment_Services, obj_wo_log, Qa_Services
Declare subroutine Start_Window, RList, Set_Status, Database_Services, Obj_Sap, Sap_Services, Btree.Extract, Qa_Services
Declare subroutine Reactor_Services, Obj_Wo_Log, obj_wo_mat, Work_Order_Services, Material_Movement_Services, Automated_Workflow_Services
Declare subroutine Override_Services, Obj_Wo_Mat_Log, obj_post_log, Obj_Sap
$insert LOGICAL
$insert NOTE_PTRS_EQU
$insert MSG_EQUATES
$Insert APP_INSERTS
$Insert RLIST_EQUATES
$Insert WO_LOG_EQUATES
$Insert RDS_EQUATES
$Insert WO_STEP_EQUATES
$Insert WO_MAT_QA_EQUATES
$Insert REACT_RUN_EQUATES
$Insert RDS_LAYER_EQUATES
$Insert RDS_TEST_EQUATES
$Insert PM_EQUATES
$Insert PM_SPEC_EQUATES
$Insert WO_MAT_EQUATES
$Insert WM_OUT_EQUATES
$Insert TEST_RUN_EQUATES
$Insert TEST_RUN_WAFER_EQUATES
$Insert TEST_WAFER_PROD_EQUATES
$Insert TEST_RUN_TYPE_EQUATES
$Insert EPI_PART_EQUATES
$Insert POPUP_EQUATES
$Insert REACTOR_EQUATES
GoToService
Return Response or ""
//-----------------------------------------------------------------------------
// SERVICES
//-----------------------------------------------------------------------------
Service CreatAWO()
//Step 1: Start a WO WOLogFileIn variable emulates what an SAP file would have
/*
ProdOrdNo = FileIn<1,1>
CustPONo = FileIn<1,2>
PromiseShipDt = FileIn<1,3>
EpiPartNo = FileIn<1,4>
SubPartNo = FileIn<1,5>
SubRevNo = FileIn<1,6>
WOQty = FileIn<1,7>
VendCd = FileIn<1,8>
*/
WOLogFileIn = 'M124567.1':@VM:'NA':@VM:'02/29/2024':@VM:'400149S':@VM:'827906':@VM:'1.0':@VM:'150':@VM:'NA'
RetVal = obj_WO_LOG('SAPCreate',WOLogFileIn)
Response = RetVal
end service
Service RouteWO(WO_No)
//Step 2: Route a WO with a Product Version
WOLogRec = Database_Services('ReadDataRow', 'WO_LOG', WO_No)
EpiPartNo = WOLogRec<WO_LOG_EPI_PART_NO$>
If EpiPartNo NE '' then
AllProdVerNos = XLATE('EPI_PART',EpiPartNo,EPI_PART_PROD_VER_NO$,'X')
TypeOver = ''
TypeOver<PDISPLAY$> = AllProdVerNos
TypeOver<PSELECT$> = 1
TypeOver<PMODE$> = 'K'
SelectedProdVerNo = Popup(@WINDOW,TypeOver,'PROD_VER')
If SelectedProdVerNo NE '' then
obj_WO_Log('Route',WO_No:@RM:SelectedProdVerNo)
end
end
end service
Service PrescribeWafers(WONo, AmountToRX)
//Step 3: prescribe wafers. This is the same as assigning lot numbers to individual lots of raw material. AKA creating WO_MAT records
/*
a. User clicks the PUB_RX button on the WO_LOG form.
b. Opens WO Receipt form
c. Users clicks on WO's Due in
d. User selects or enters a WO.
e. User clicks scan codes, opens
*/
debug
ProdVerNo = XLATE('WO_LOG', WONo, 'PROD_VER_NO', 'X')
ReactType = XLATE('WO_LOG', WONo, 'REACT_TYPE', 'X')
CassLotNo = '123456789'
CustPartNo = XLATE('WO_LOG', WONo, 'CUST_PART_NO', 'X')
CassQty = 25
NumCassToRX = AmountToRX / 25
ExistingWOMatList = XLATE('WO_LOG', WONo, 'WO_MAT_KEY', 'X')
LastCassNo = 0
for each cass in ExistingWOMatList using @VM setting iPos
thisCassNo = FIELD(cass, '*', 2)
if thisCassNo GT LastCassNo then LastCassNo = thisCassNo
Next cass
for i = 1 to NumCassToRX
NextCassNo = LastCassNo + 1
LastCassNo = nextCassNo
Parms = WONo:@RM
Parms := NextCassNo:@RM
Parms := ProdVerNo:@RM
Parms := CassLotNo:@RM
Parms := CassQty:@RM
Parms := CustPartNo:@RM ;* This is the CUSTOMER part No
Parms := 1:@RM
Parms := ReactType:@RM ;* 3 character Reactor Type Code
Parms := '':@RM
Parms := 'SR':@RM ;* Warehouse = 'SR' - Shipping/Receiving Area
Parms := 'RB':@RM ;* Location = 'RB' - Receiving Bench
Parms := OCONV(SRP_Datetime('Now'), 'DT/4'):@RM
Parms := 'JONATHAN_O':@RM
Parms := '':@RM
Parms := '':@RM
Parms := '':@RM ;* Added 8/18/2009 JCH
Parms := '':@RM ;* Added 12/16/2009 JCH
Parms := 25:@RM ;* Added 11/4/2009 JCH
Parms := 0:@RM ;* Added 05/14/2010 JCH
Parms := '':@RM ;* Added 07/14/2011 for SAP Project JCH
Parms := 25 ; // Added 02/01/2018 dmb
obj_WO_Mat('Create',Parms)
If Error_Services('NoError') then
WOLogRec = Database_Services('ReadDataRow', 'WO_LOG', WONo)
WOLogRec<WO_LOG_WO_MAT_KEY$, -1> = WONo : '*' : LastCassNo
Database_Services('WriteDataRow', 'WO_LOG', WONo, WOLogRec, 1, 0, 1)
end
Next i
Work_Order_Services('UpdateReceivedQty', WONo)
end service
Service ReleaseCassettes(WONo)
//Step 4: User clicks release cassettes(PUB_RELEASE) from WO_LOG form
Work_Order_Services('ReleaseCassettes', WONo)
//Can get RDS number at this point
end service
Service PerformPTI(CassID)
//Step 5: User performs a PTI scan to tag lot into the fab.
Warehouse = '1K'
Location = 'PTI'
Material_Movement_Services('SaveRecord', CassID, Warehouse, Location, @USER4)
end service
* Service BatchProcessLotList()
* RDSList = ''
*
* RDSList<1> = 627134
* RDSList<2> = 627135
* RDSList<3> = 627136
* RDSList<4> = 627132
* RDSList<5> = 627133
*
* for each rds in RDSList using @FM
* //Automated_Workflow_Services('Perform1VER', rds, 63, 25)
* Automated_Workflow_Services('PerformUnload', rds)
* Next rds
* end service
Service Perform1VER(CassID, ReactorID, WfrQty)
//Step 6
If RowExists('RDS', CassID) AND ReactorID NE '' then
ReadyToSign = QA_Services('PreEpiSignatureReady', CassID, @User4, WfrQty, ReactorID)
If (ReadyToSign EQ True$) then
QA_Services('SignPreEpiStage', CassID, @USER4, WfrQty, ReactorID)
end
end
end service
Service PerformLoad(CassID, WfrInQty, LorRLL)
//Step 7
If RowExists('RDS', CassID) then
ReadyToSign = Qa_Services('LoadSignatureReady', CassID, @User4, WfrInQty, LorRLL, 0)
If ReadyToSign then
Qa_Services('SignLoadStage', CassID, @User4, WfrInQty, LorRLL, 0)
end else
ErrorReason = Error_Services('GetMessage')
Begin Case
Case ErrorReason EQ 'Process Error: Recipe parameters have not been entered.'
//Get the expected parameters and enter them. This is in the RDS_Layer Record
//First lets get limits from the RDS Layer Record(s)
RDSLayerKeys = XLATE('RDS', CassID, RDS_RDS_LAYER_KEYS$, 'X')
for each RDSLayerKey in RDSLayerKeys using @VM setting rlPos
Automated_Workflow_Services('EnterRecipeParams', RDSLayerKey)
If Error_Services('NoError') then
Automated_Workflow_Services('PerformLoad', CassID, WfrInQty, LorRLL)
end else
//Die
Return
end
Next RDSLayerKey
Case ErrorReason EQ 'RDS layer parameters must be reviewed for accuracy and acknowledged before the load operation can be signed.'
Automated_Workflow_Services('VerifyRecipeParams', CassID)
If Error_Services('NoError') then
Automated_Workflow_Services('PerformLoad', CassID, WfrInQty, LorRLL)
end else
//Die
Return
end
End Case
end
end
end service
Service PerformUnload(RDSNo)
//Step 8
If RDSNo NE '' then
Reactor = XLATE('RDS', RDSNo, 'REACTOR', 'X')
If Reactor NE '' then
ReadyToSign = QA_Services('UnloadSignatureReady', RDSNo, @User4, Reactor)
If Error_Services('HasError') then
If ErrorMsg EQ 'Cassette runtime exceeds three days! An override by a LEAD or SUPERVISOR is required.' then
Override_Services('SetOverride', 'RDS', RDSNo, 'UNLOAD_DTM', @USER4)
ReadyToSign = True$
end
end
If ReadyToSign then
QA_Services('SignUnloadStage', RDSNo, @User4)
end
end else
Error_Services('Add', 'No Reactor assigned to RDS!')
end
end else
Error_Services('Add', 'No RDS No. Supplied!')
end
end service
Service PerformFQA(RDSNo)
ToolID = ''
WHCd = 'CR'
LocCD = 'QA'
Tag = ''
SigDt = Date()
SigTm = Time()
WONo = XLATE('RDS', RDSNo, RDS_WO$, 'X')
CassNo = XLATE('RDS', RDSNo, RDS_CASS_NO$, 'X')
Equ COL$LOG_FILE to 1
Equ COL$LOG_DTM to 2
Equ COL$ACTION to 3
Equ COL$WH_CD to 4
Equ COL$LOC_CD to 5
Equ COL$WO_NOS to 6
Equ COL$CASS_NOS to 7
Equ COL$USER_ID to 8
Equ COL$TAGS to 9
Equ COL$TOOL_ID to 10
EventParms = ''
EventParms<COL$LOG_FILE> = 'WO_MAT'
EventParms<COL$LOG_DTM> = SigDt:' ':SigTm
EventParms<COL$ACTION> = 1:'QA'
EventParms<COL$WH_CD> = 'CR'
EventParms<COL$LOC_CD> = 'QA'
EventParms<COL$WO_NOS> = WONo
EventParms<COL$CASS_NOS> = CassNo
EventParms<COL$USER_ID> = @USER4
EventParms<COL$TAGS> = ''
EventParms<COL$TOOL_ID> = ''
CONVERT @FM TO @RM IN EventParms
obj_WO_Mat_Log('Create',EventParms) ;* * * * * INV EVENT LOG * * * * *
Obj_Post_Log('POST')
Qa_Services('SignFQAStage', RDSNo, @USER4)
end service
Service EnterRecipeParams(RDSLayerKey)
RDSLayerRec = Database_Services('ReadDataRow', 'RDS_LAYER', RDSLayerKey)
If RDSLayerRec NE '' then
If RDSLayerRec<RDS_LAYER_EPI_TIME_MIN$> NE '' AND RDSLayerRec<RDS_LAYER_EPI_TIME_MAX$> NE '' then
//Epi Deposit Time
RDSLayerRec<RDS_LAYER_EPI_TIME$> = ((RDSLayerRec<RDS_LAYER_EPI_TIME_MAX$> - RDSLayerRec<RDS_LAYER_EPI_TIME_MIN$>) / 2) + RDSLayerRec<RDS_LAYER_EPI_TIME_MIN$>
end
If RDSLayerRec<RDS_LAYER_DILUENT_MIN$> NE '' AND RDSLayerRec<RDS_LAYER_DILUENT_MAX$> NE '' then
//Diluent
RDSLayerRec<RDS_LAYER_DILUENT_ADJ_PARAM$> = ((RDSLayerRec<RDS_LAYER_DILUENT_MAX$> - RDSLayerRec<RDS_LAYER_DILUENT_MIN$>) / 2) + RDSLayerRec<RDS_LAYER_DILUENT_MIN$>
end
If RDSLayerRec<RDS_LAYER_DOPANT_FLOW_MIN$> NE '' AND RDSLayerRec<RDS_LAYER_DOPANT_FLOW_MAX$> NE '' then
//Dopant Flow
RDSLayerRec<RDS_LAYER_DOPANT_FLOW$> = ((RDSLayerRec<RDS_LAYER_DOPANT_FLOW_MAX$> - RDSLayerRec<RDS_LAYER_DOPANT_FLOW_MIN$>) / 2) + RDSLayerRec<RDS_LAYER_DOPANT_FLOW_MIN$>
end
If RDSLayerRec<RDS_LAYER_HCL_FLOW_MIN$> NE '' AND RDSLayerRec<RDS_LAYER_HCL_FLOW_MAX$> NE '' then
//HCL Flow
RDSLayerRec<RDS_LAYER_HCL_FLOW$> = ((RDSLayerRec<RDS_LAYER_HCL_FLOW_MAX$> - RDSLayerRec<RDS_LAYER_HCL_FLOW_MIN$>) / 2) + RDSLayerRec<RDS_LAYER_HCL_FLOW_MIN$>
end
If RDSLayerRec<RDS_LAYER_BAKE_TIME_MIN$> NE '' AND RDSLayerRec<RDS_LAYER_BAKE_TIME_MAX$> NE '' then
//Bake Time
RDSLayerRec<RDS_LAYER_BAKE_TIME$> = ((RDSLayerRec<RDS_LAYER_BAKE_TIME_MAX$> - RDSLayerRec<RDS_LAYER_BAKE_TIME_MIN$>) / 2) + RDSLayerRec<RDS_LAYER_BAKE_TIME_MIN$>
end
If RDSLayerRec<RDS_LAYER_EPI_H2_FLOW_MIN$> NE '' AND RDSLayerRec<RDS_LAYER_EPI_H2_FLOW_MAX$> NE '' then
//H2 Flow
RDSLayerRec<RDS_LAYER_EPI_H2_FLOW$> = ((RDSLayerRec<RDS_LAYER_EPI_H2_FLOW_MAX$> - RDSLayerRec<RDS_LAYER_EPI_H2_FLOW_MIN$>) / 2) + RDSLayerRec<RDS_LAYER_EPI_H2_FLOW_MIN$>
end
If RDSLayerRec<RDS_LAYER_TCS_FLOW_MIN$> NE '' AND RDSLayerRec<RDS_LAYER_TCS_FLOW_MAX$> NE '' then
//TCS Flow
RDSLayerRec<RDS_LAYER_TCS_FLOW$> = ((RDSLayerRec<RDS_LAYER_TCS_FLOW_MAX$> - RDSLayerRec<RDS_LAYER_TCS_FLOW_MIN$>) / 2) + RDSLayerRec<RDS_LAYER_TCS_FLOW_MIN$>
end
If RDSLayerRec<RDS_LAYER_DCS_FLOW_MIN$> NE '' AND RDSLayerRec<RDS_LAYER_DCS_FLOW_MAX$> NE '' then
//DCS Flow
RDSLayerRec<RDS_LAYER_DCS_FLOW$> = ((RDSLayerRec<RDS_LAYER_DCS_FLOW_MAX$> - RDSLayerRec<RDS_LAYER_DCS_FLOW_MIN$>) / 2) + RDSLayerRec<RDS_LAYER_DCS_FLOW_MIN$>
end
If RDSLayerRec<RDS_LAYER_AUX1_MIN$> NE '' AND RDSLayerRec<RDS_LAYER_AUX1_MAX$> NE '' then
//AUX 1
RDSLayerRec<RDS_LAYER_AUX1$> = ((RDSLayerRec<RDS_LAYER_AUX1_MAX$> - RDSLayerRec<RDS_LAYER_AUX1_MIN$>) / 2) + RDSLayerRec<RDS_LAYER_AUX1_MIN$>
end
If RDSLayerRec<RDS_LAYER_AUX2_MIN$> NE '' AND RDSLayerRec<RDS_LAYER_AUX2_MAX$> NE '' then
//AUX2
RDSLayerRec<RDS_LAYER_AUX2$> = ((RDSLayerRec<RDS_LAYER_AUX2_MAX$> - RDSLayerRec<RDS_LAYER_AUX2_MIN$>) / 2) + RDSLayerRec<RDS_LAYER_AUX2_MIN$>
end
If RDSLayerRec<RDS_LAYER_F_OFFSET_MIN$> NE '' AND RDSLayerRec<RDS_LAYER_F_OFFSET_MAX$> NE '' then
//F_OFFSET
RDSLayerRec<RDS_LAYER_F_OFFSET$> = ((RDSLayerRec<RDS_LAYER_F_OFFSET_MAX$> - RDSLayerRec<RDS_LAYER_F_OFFSET_MIN$>) / 2) + RDSLayerRec<RDS_LAYER_F_OFFSET_MIN$>
end
If RDSLayerRec<RDS_LAYER_S_OFFSET_MIN$> NE '' AND RDSLayerRec<RDS_LAYER_S_OFFSET_MAX$> NE '' then
//S_OFFSET
RDSLayerRec<RDS_LAYER_S_OFFSET$> = ((RDSLayerRec<RDS_LAYER_S_OFFSET_MAX$> - RDSLayerRec<RDS_LAYER_S_OFFSET_MIN$>) / 2) + RDSLayerRec<RDS_LAYER_S_OFFSET_MIN$>
end
If RDSLayerRec<RDS_LAYER_R_OFFSET_MIN$> NE '' AND RDSLayerRec<RDS_LAYER_R_OFFSET_MAX$> NE '' then
//R OFFSET
RDSLayerRec<RDS_LAYER_R_OFFSET$> = ((RDSLayerRec<RDS_LAYER_R_OFFSET_MAX$> - RDSLayerRec<RDS_LAYER_R_OFFSET_MIN$>) / 2) + RDSLayerRec<RDS_LAYER_R_OFFSET_MIN$>
end
If RDSLayerRec<RDS_LAYER_ETCH1_MIN$> NE '' AND RDSLayerRec<RDS_LAYER_ETCH1_MAX$> NE '' then
//ETCH 1
RDSLayerRec<RDS_LAYER_ETCH1$> = ((RDSLayerRec<RDS_LAYER_ETCH1_MAX$> - RDSLayerRec<RDS_LAYER_ETCH1_MIN$>) / 2) + RDSLayerRec<RDS_LAYER_ETCH1_MIN$>
end
If RDSLayerRec<RDS_LAYER_ETCH2_MIN$> NE '' AND RDSLayerRec<RDS_LAYER_ETCH2_MAX$> NE '' then
//ETCH 2
RDSLayerRec<RDS_LAYER_ETCH2$> = ((RDSLayerRec<RDS_LAYER_ETCH2_MAX$> - RDSLayerRec<RDS_LAYER_ETCH2_MIN$>) / 2) + RDSLayerRec<RDS_LAYER_ETCH2_MIN$>
end
If RDSLayerRec<RDS_LAYER_ETCH3_MIN$> NE '' AND RDSLayerRec<RDS_LAYER_ETCH3_MAX$> NE '' then
//ETCH 3
RDSLayerRec<RDS_LAYER_ETCH3$> = ((RDSLayerRec<RDS_LAYER_ETCH3_MAX$> - RDSLayerRec<RDS_LAYER_ETCH3_MIN$>) / 2) + RDSLayerRec<RDS_LAYER_ETCH3_MIN$>
end
If RDSLayerRec<RDS_LAYER_UL_TEMP_MIN$> NE '' AND RDSLayerRec<RDS_LAYER_UL_TEMP_MAX$> NE '' then
//UL_TEMP
RDSLayerRec<RDS_LAYER_UL_TEMP$> = ((RDSLayerRec<RDS_LAYER_UL_TEMP_MAX$> - RDSLayerRec<RDS_LAYER_UL_TEMP_MIN$>) / 2) + RDSLayerRec<RDS_LAYER_UL_TEMP_MIN$>
end
If RDSLayerRec<RDS_LAYER_SUSC_ETCH_MIN$> NE '' AND RDSLayerRec<RDS_LAYER_SUSC_ETCH_MAX$> NE '' then
//Susceptor Etch
RDSLayerRec<RDS_LAYER_SUSC_ETCH$> = ((RDSLayerRec<RDS_LAYER_SUSC_ETCH_MAX$> - RDSLayerRec<RDS_LAYER_SUSC_ETCH_MIN$>) / 2) + RDSLayerRec<RDS_LAYER_SUSC_ETCH_MIN$>
end
Database_Services('WriteDataRow', 'RDS_LAYER', RDSLayerKey, RDSLayerRec, True$, False$, True$)
end
end service
Service VerifyRecipeParams(RDSNo)
//Used to verify exisiting recipe params. This is if they are already set.
IF RDSNo NE '' then
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
RDSRec<RDS_RDS_LAYER_ACK$> = True$
Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$)
end else
Error_Services('Add', 'RDS No was blank!!!')
end
end service
Service SendCassComp(WoMatKey)
Sap_Services('RetransmitCassComp', WoMatKey)
obj_sap('SendOutbound')
end service

View File

@ -261,4 +261,3 @@ RETURN

View File

@ -31,4 +31,3 @@ begin case
status() = invalid_msg$
end case
return

View File

@ -68,4 +68,3 @@ NEXT I
END

View File

@ -481,4 +481,3 @@ Bail:
* * * * * * *
RETURN

View File

@ -37,4 +37,3 @@ begin case
status() = invalid_conv$
end case
return

View File

@ -12,4 +12,3 @@ if DateOut and DateIn then
end
return Tot

View File

@ -92,7 +92,7 @@ FOR I = 1 to RdsCnt
END
NEXT I
if @UserName EQ 'DAN_CR' Then Debug
//DPC - 3/11/2020 - hack to account for formatting/conversion issue in Thick Vals from RDS_Test
IF ThickAvgCount > 0 THEN
StatThickAvg = (ThickAvgSum/ThickAvgCount)*10

View File

@ -201,4 +201,3 @@ RETURN

View File

@ -185,4 +185,3 @@ Service GetCalibListData(CalibType=CALIB_TYPES, SelectActive=BOOLEAN)
End Service

View File

@ -72,7 +72,7 @@ Create:
* * * * * * *
IF MemberOf(@USER4,'CALIBRATION') OR @USERNAME = 'BRYCE_BARB' ELSE
IF MemberOf(@USER4,'CALIBRATION') ELSE
ErrMsg('Only authorized personnel may update the Calibration List.')
End_Window(@WINDOW)
RETURN

View File

@ -28,4 +28,3 @@ begin case
status() = invalid_msg$
end case
return

View File

@ -26,4 +26,3 @@ begin case
status() = invalid_msg$
end case
return

View File

@ -141,4 +141,3 @@ write '' on SysListsTable, ListsId else
end
return 0

View File

@ -204,4 +204,3 @@ GOTO READRECORD
*
END

View File

@ -200,4 +200,3 @@ write '' on SysListsTable, ListsId else
end
RETURN 0

View File

@ -30,4 +30,3 @@ begin case
status() = invalid_msg$
end case
return

View File

@ -32,4 +32,3 @@ begin case
status() = invalid_msg$
end case
return

View File

@ -36,4 +36,3 @@ Event SIGN_BUTTON.CLICK()
end event

View File

@ -0,0 +1,139 @@
Function Changelog_API(@API)
/***********************************************************************************************************************
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
permission from SRP Computer Solutions, Inc.
Name : Changelog_API
Description : API logic for the Changelog resource.
Notes : All web APIs should include the API_SETUP insert. This will provide several useful variables:
HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.)
APIURL - The URL for the API entry point (e.g., api.mysite.com/v1).
FullEndpointURL - The URL submitted by the client, including query params.
FullEndpointURLNoQuery - The URL submitted by the client, excluding query params.
EndpointSegment - The URL endpoint segment.
ParentURL - The URL path preceeding the current endpoint.
CurrentAPI - The name of this stored procedure.
Parameters :
API [in] -- Web API to process. Format is [APIPattern].[HTTPMethod]:
- APIPattern must follow this structure Changelog[.ID.[<Property>]]
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
Examples:
- Changelog.POST
- Changelog.ID.PUT
- Changelog.ID.firstName.GET
Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API
services do not rely upon anything being returned in the response. This is what the
various services like SetResponseBody and SetResponseStatus services are for. A response
value is only helpful if the developers want to use it for debug purposes.
History : (Date, Initials, Notes)
07/24/24 xxx Original programmer.
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
Declare function Datetime, SRP_Datetime, Change_Log_Services, Environment_Services, Logging_Services
Declare subroutine Logging_Services
$insert APP_INSERTS
$insert API_SETUP
$insert HTTP_INSERTS
EQU Comma$ to ','
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\API\Admin\ChangeLog'
LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS')
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ChangeLogArchiveService.csv'
Headers = 'Logging DTM' : @FM : 'From IP Address' : @FM : 'Message'
objLogChangeLogAPI = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
RequesterIPAddr = HTTP_Services('GetHTTPRemoteAddr')
GoToAPI else
// The specific resource endpoint doesn't have a API handler yet.
HTTP_Services('SetResponseStatus', 200, 'This is a valid endpoint but a web API handler has not yet been created.')
end
Return Response OR ''
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Endpoint Handlers
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
API changelog.HEAD
API changelog.GET
StartDtm = Http_Services('GetQueryField', 'FromDatetime')
ToDtm = Http_Services('GetQueryField', 'ToDatetime')
StartDtm = IConv(StartDtm, 'DT')
ToDtm = IConv(ToDtm, 'DT')
If StartDtm EQ '' then
StartDtm = SRP_Datetime('AddDays', Datetime(), -60)
end
If ToDtm EQ '' then
ToDtm = Datetime()
end
EntityName = Http_Services('GetQueryField', 'EntityName')
UserId = Http_Services('GetQueryField', 'UserID')
ChangeLogIDs = Change_Log_Services('GetChangeLogRecIDs', EntityName, StartDtm, ToDtm, UserId)
If Error_Services('NoError') then
GoSub CreateHALCollection
end else
ErrorMsg = Error_Services('GetMessage')
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = RequesterIPAddr
LogData<3> = ErrorMsg
Logging_Services('AppendLog', objLogChangeLogAPI, LogData, @RM, @FM)
HTTP_Services('SetResponseStatus', 500, 'Error Getting change log records from change_log table.')
end
end api
CreateHALCollection:
hJsonCollection = ''
hChangeLogArray = ''
hChangeLogObj = ''
hChangeLog = ''
hChangeLogJson = ''
Abort = False$
If SRP_JSON(hJSONCollection, 'New', 'Object') then
If SRP_JSON(hChangeLogArray, 'New', 'Array') then
For each ChangeLogID in ChangeLogIDs using @VM setting fPos
//rdsJSON = Rds_Services('ConvertRecordToJSON', rds, '' ,FullEndpointURL:'/':rds)
ChangeLogJson = Change_Log_Services('ConvertRecordToJSON', ChangeLogID)
If Error_Services('NoError') then
If (SRP_JSON(hChangeLog, 'Parse', ChangeLogJson) EQ '') then
SRP_JSON(hChangeLogArray, 'Add', hChangeLog)
SRP_JSON(hChangeLog, 'Release')
end
end else
Abort = True$
end
Until Abort
Next rds
If Abort EQ False$ then
SRP_JSON(hJSONCollection, 'Set', 'ChangeLogRecords', hChangeLogArray)
end
SRP_JSON(hChangeLogArray, 'Release')
end
JSONCollection = SRP_JSON(hJSONCollection, 'Stringify', 'Styled')
SRP_JSON(hJSONCollection, 'Release')
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
HTTP_Services('SetResponseBody', JSONCollection, False$, 'application/hal+json')
HTTP_Services('SetResponseStatus', 200)
end
return

View File

@ -75,4 +75,3 @@ Bail:
END

View File

@ -7,69 +7,221 @@ FUNCTION CHANGE_LOG_SERVICES(@Service, @Params)
$Insert LOGICAL
$insert SERVICE_SETUP
$Insert REVDOTNETEQUATES
$Insert CHANGE_LOG_EQUATES
$Insert APP_INSERTS
EQU COMMA$ to ','
Declare function Repository, Get_Repos_Entities, SRP_DateTime, SRP_Array, Get_Status, Set_Status, Errmsg, Datetime
Declare subroutine Set_Status, Errmsg, Error_Services
Declare Function Database_Services
Declare Function Environment_Services
Declare subroutine Set_Status, Errmsg, Error_Services, Database_Services, Btree.Extract, Logging_Services, Change_Log_Services, SRP_Json
Declare Function Database_Services, Rti_Createguid, Logging_Services
Declare Function Environment_Services, SRP_Path, SRP_Json
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Archive\Change_Log'
LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS')
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ChangeLogArchiveService.csv'
Headers = 'Logging DTM' : @FM : 'Message' : @FM : 'Record ID' : @FM : 'Record Date'
objLogChangeLogArchive = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
GoToService else
Error_Services('Add', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
end
Return Response OR ''
//Write to sharepoint
Service WriteToSharePoint()
Service WriteChangeLog()
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
Lock hSysLists, ServiceKeyID then
//Define the dotNet version
DotNetHandle = StartDotNet("","4.0")
//Specify the DLL
rv = Set_Property.NET(DotNetHandle, "AssemblyName", "D:\Apps\OICurrent\IFXAPI\SharePoint\SharePointTools.dll")
//Create_Class.NET(//Define the classes
SPApi = Create_Class.NET(DotNetHandle, "SharePointTools.ExportToSharePoint", 0)
//Set report start time to the past 30 minutes.
StartDateTime = Datetime()
StartDateTime = SRP_DateTime("AddMinutes", StartDateTime, -15)
//StartDateTime = SRP_DateTime('AddDays', StartDateTime, -7)
//Pull in a list of all existing entities
AllEntityIDs = Get_Repos_Entities('LSL2', '', '', 0, 1, 0, '')
EntityList = ''
Server = Environment_Services('GetServer')
IF Server EQ 'MESSA005' then
Environment = 'PROD'
end else
Environment = 'DEV'
end
Environment = 'DEV'
IF Server EQ 'MESSA005' OR Server EQ 'MESSA01EC' then Environment = 'PROD'
For Each EntityID in AllEntityIDs using @FM
ChangeLogRec = ''
Set_Status(0)
statList = ''
Entity = Repository('GET', EntityID)
time = Entity<25>
If time GE StartDateTime then
time = OCONV(time,'DT4/^H')
(application, entityType, entityClass, entityName) using '*' = EntityID
updatedBy = Entity<26>
IF entityType NE 'STPROCDBG' AND entityType NE 'STPROCEXE' then
SharePointLog = Send_Message.NET(SPApi, "SendToList",time:@FM:application:@FM:entityType:@FM:entityClass:@FM:entityName:@FM:updatedBy:@FM:Environment, "System.String":@FM:"System.String":@FM:"System.String":@FM:"System.String":@FM:"System.String":@FM:"System.String":@FM:"System.String")
(Application, EntityType, EntityClass, EntityName) using '*' = EntityID
UpdatedBy = Entity<26>
IF entityType EQ 'STPROC' then
NewChangeLogRecID = Rti_Createguid()
ChangeLogRec<CHANGE_LOG_CHANGE_DTM$> = Time
ChangeLogRec<CHANGE_LOG_APPLICATION$> = Application
ChangeLogRec<CHANGE_LOG_ENTITY_TYPE$> = EntityType
ChangeLogRec<CHANGE_LOG_ENTITY_CLASS$> = EntityClass
ChangeLogRec<CHANGE_LOG_ENTITY_NAME$> = EntityName
ChangeLogRec<CHANGE_LOG_UPDATED_BY$> = UpdatedBy
ChangeLogRec<CHANGE_LOG_ENVIRONMENT$> = Environment
Database_Services('WriteDataRow', 'CHANGE_LOG',NewChangeLogRecID, ChangeLogRec, True$, False$, True$)
end
end
test1='test'
Next EntityID
end
Unlock hSysLists, ServiceKeyID else Null
end service
Service GetChangeLogRecIDs(EntityName, StartDtm, EndDtm, UserId)
//This will be the main entry point
Table = 'CHANGE_LOG'
Open 'DICT ':Table To @DICT then
Query = ''
If StartDtm NE '' then
Query := 'CHANGE_DTM':@VM:'>=': StartDtm
end else
Query := 'CHANGE_DTM':@VM:'>0'; *Need a default value.
end
If EndDtm NE '' then
Query<-1> = 'CHANGE_DTM':@VM:'<=': EndDtm
end
If EntityName NE '' then
Query<-1> = 'ENTITY_NAME':@VM:EntityName
end
If UserId NE '' then
Query<-1> = 'UPDATED_BY':@VM:UserId
end
KeyList = ''
Option = ''
Flag = ''
Btree.Extract(Query, Table, @DICT, KeyList, Option, Flag)
Response = KeyList
end else
Error_Services('Add', 'Error Opening CHANGE_LOG Dictionary')
end
end service
Service ArchiveChangeLogRecByDate(StartDTM)
If StartDTM NE '' then
Table = 'CHANGE_LOG'
Open 'DICT ':Table To @DICT then
Query = ''
If StartDtm NE '' then
Query := 'CHANGE_DTM':@VM:'<='StartDtm:@FM
end
KeyList = ''
Option = ''
Flag = ''
Btree.Extract(Query, Table, @DICT, KeyList, Option, Flag)
If KeyList NE '' then
for each ChangeLogRecID in Keylist using @FM
Change_Log_Services('ArchiveChangeLogRecById', ChangeLogRecID)
If Error_Services('NoError') then
Change_Log_Services('DeleteChangeLogRec', ChangeLogRecID)
end else
ErrMsg = Error_Services('GetMessage')
Error_Services('Add', ErrMsg)
end
Next ChangeLogID
end else
ErrorMsg = 'No Change Log Keys found to archive.'
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = ErrorMsg
LogData<3> = ''
LogData<4> = ''
Logging_Services('AppendLog', objLogChangeLogArchive, LogData, @RM, @FM)
end
end else
Error_Services('Add', 'Error Opening CHANGE_LOG Dictionary')
end
end else
Error_Services('Add', 'Error Opening CHANGE_LOG Dictionary')
end
end service
Service ArchiveChangeLogRecByID(ChangeLogRecID)
//For now output the record to a CSV file on the HDD. Eventually right to SQL Server
If RowExists('CHANGE_LOG', ChangeLogRecID) then
ChangeLogRec = Database_Services('ReadDataRow', 'CHANGE_LOG', ChangeLogRecID)
If Error_Services('NoError') then
swap @VM with ',' in ChangeLogRec
swap @FM with CRLF$ in ChangeLogRec
ArchivePath = Environment_Services('GetApplicationRootPath') : '\Archive\CHANGE_LOG'
FileName = ChangeLogRecID : '.csv'
FullSavePath = ArchivePath : '\' : FileName
OSWrite ChangeLogRec To FullSavePath
If SRP_Path('Exists', FullSavePath) then
SuccessMsg = 'Successfully saved CHANGE_LOG archive record.'
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = SuccessMsg
LogData<3> = ChangeLogRecID
LogData<4> = ''
Logging_Services('AppendLog', objLogChangeLogArchive, LogData, @RM, @FM)
Error_Services('Add', ErrorMsg)
end else
ErrorMsg = 'Attempt to archive CHANGE_LOG record ' : ChangeLogRecID : ' failed. Error verifying archived file.'
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = ErrorMsg
LogData<3> = ChangeLogRecID
LogData<4> = ''
Logging_Services('AppendLog', objLogChangeLogArchive, LogData, @RM, @FM)
Error_Services('Add', ErrorMsg)
end
end else
ErrorMsg = 'Attempt to archive CHANGE_LOG record ' : ChangeLogRecID : ' failed. Error while attempting to read record.'
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = ErrorMsg
LogData<3> = ChangeLogRecID
LogData<4> = ''
Logging_Services('AppendLog', objLogChangeLogArchive, LogData, @RM, @FM)
Error_Services('Add', ErrorMsg)
end
end else
ErrorMsg = 'Attempt to archive CHANGE_LOG record ' : ChangeLogRecID : ' failed. Record does not exist.'
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = ErrorMsg
LogData<3> = ChangeLogRecID
LogData<4> = ''
Logging_Services('AppendLog', objLogChangeLogArchive, LogData, @RM, @FM)
Error_Services('Add', ErrorMsg)
end
end service
Service DeleteChangeLogRec(ChangeLogRecID)
end service
Service ConvertRecordToJson(ChangeLogRecID)
JSON = ''
If ChangeLogRecID NE '' then
If RowExists('CHANGE_LOG', ChangeLogRecID) then
ChangeLogRec = Database_Services('ReadDataRow', 'CHANGE_LOG', ChangeLogRecID)
objChangeLog = ''
objJson = ''
If SRP_JSON(objJson, 'New', 'Object') then
SRP_JSON(objJson, 'SetValue', 'CHANGE_DTM', OConv(ChangeLogRec<CHANGE_LOG_CHANGE_DTM$>, 'DT'))
SRP_JSON(objJson, 'SetValue', 'APPLICATION', ChangeLogRec<CHANGE_LOG_APPLICATION$>)
SRP_JSON(objJson, 'SetValue', 'ENTITY_TYPE', ChangeLogRec<CHANGE_LOG_ENTITY_TYPE$>)
SRP_JSON(objJson, 'SetValue', 'ENTITY_CLASS', ChangeLogRec<CHANGE_LOG_ENTITY_CLASS$>)
SRP_JSON(objJson, 'SetValue', 'ENTITY_NAME', ChangeLogRec<CHANGE_LOG_ENTITY_NAME$>)
SRP_JSON(objJson, 'SetValue', 'UPDATED_BY', ChangeLogRec<CHANGE_LOG_UPDATED_BY$>)
SRP_JSON(objJson, 'SetValue', 'ENVIRONMENT', ChangeLogRec<CHANGE_LOG_ENVIRONMENT$>)
SRP_JSON(objJson, 'Set', 'ChangeLogRec', objChangeLog)
JSON = SRP_JSON(objJson, 'Stringify', 'Styled')
SRP_JSON(objJson, 'Release')
end else
Error_Services('Add', 'Error in Change_Log_Services -> ConvertRecordToJson : Error Creating Json object')
end
end else
Error_Services('Add', 'Error in Change_Log_Services -> ConvertRecordToJson : Change_Log with record with ID ' : ChangeLogRecID : ' did not exist ')
end
end else
Error_Services('Add', 'Error in Change_Log_Services -> ConvertRecordToJson : Null Change_Log ID passed into routine')
end
Response = JSON
end service

View File

@ -137,4 +137,3 @@ RETURN

View File

@ -153,4 +153,3 @@ end service

View File

@ -22,4 +22,3 @@ if xlate( 'NOTE_PTRS', @user4, 'NEW_MESSAGES', 'X' ) then
end
Return 0

View File

@ -12,18 +12,21 @@ COMPILE FUNCTION Clean_Insp(EntID,Event,Parm1,Parm2,Parm3,Parm4,Parm5)
and SignScan subroutines
04/23/2021 - djs - Updated SIGN_ROTR_ACCEPTANCE.CLICK event to not block acceptance signatures when a 100%
failure scan is required.
05/13/2024 - djs - Replaced Ole Tab control (OLE_TAB_ROTR) with a groupbox control (ROTR_GROUP) to mitigate
form behavior bugs in OI 10 post migration.
06/13/2024 djm Add new stage-specific supplement system.
*/
DECLARE SUBROUTINE Set_Property, End_Dialog, Send_Event, Set_Status, Center_Window, Post_Event, Comm_RDS
DECLARE SUBROUTINE ErrMsg, Send_Message, Set_Property, Send_Event, Btree.Extract, obj_AppWindow, Signature_Services
DECLARE SUBROUTINE obj_Notes, Security_Err_Msg, End_Window, Forward_Event, Start_Window, Create_Note
DECLARE SUBROUTINE obj_WO_Mat_Log, obj_WO_Mat, obj_Clean_Insp, Unlock, Lock, Database_Services, Yield
DECLARE SUBROUTINE Override_Log_Services, Dialog_Box, obj_WO_Wfr
DECLARE SUBROUTINE Override_Log_Services, Dialog_Box, obj_WO_Wfr, Error_Services
DECLARE FUNCTION Get_Property, Get_Status, Dialog_Box, Utility, Popup, Collect.Ixvals, Environment_Services
DECLARE FUNCTION Send_Message, Msg, Security_Check, obj_React_Run_CI, Select_Into, MemberOf, Database_Services
DECLARE FUNCTION Start_Window, Create_Dialog, Database_Services, Set_Property, Error_Services, SRP_DateTime
DECLARE FUNCTION obj_NCR, SRP_Array
DECLARE FUNCTION obj_NCR, SRP_Array, Supplement_Services
$INSERT LOGICAL
$INSERT MSG_EQUATES
@ -67,19 +70,19 @@ EQU COL$INSP_SPEC_SPOTS TO 9
EQU COL$INSP_SPEC_FOV TO 10
EQU COL$INSP_SPEC_BL_DEFECTS TO 11
EQU COL$INSP_TOOL TO 2 ;* Added INSP_TOOL column 10/29/2012 JCH
EQU COL$INSP_LPD TO 3
EQU COL$INSP_SCRATCHES TO 4
EQU COL$INSP_SCRATCH_LEN TO 5
EQU COL$INSP_PITS TO 6
EQU COL$INSP_MOUNDS TO 7
EQU COL$INSP_STACK_FAULTS TO 8
EQU COL$INSP_SPIKES TO 9
EQU COL$INSP_SPOTS TO 10
EQU COL$INSP_FOV TO 11
EQU COL$INSP_BL_DEFECTS TO 12
EQU COL$INSP_SIG TO 13
EQU COL$INSP_SIG_DTM TO 14
EQU COL$INSP_TOOL TO 2 ;* Added INSP_TOOL column 10/29/2012 JCH
EQU COL$INSP_LPD TO 3
EQU COL$INSP_SCRATCHES TO 4
EQU COL$INSP_SCRATCH_LEN TO 5
EQU COL$INSP_PITS TO 6
EQU COL$INSP_MOUNDS TO 7
EQU COL$INSP_STACK_FAULTS TO 8
EQU COL$INSP_SPIKES TO 9
EQU COL$INSP_SPOTS TO 10
EQU COL$INSP_FOV TO 11
EQU COL$INSP_BL_DEFECTS TO 12
EQU COL$INSP_SIG TO 13
EQU COL$INSP_SIG_DTM TO 14
EQU COL$INSP_SPEC_BSIDE_SCRATCHES TO 1
EQU COL$INSP_SPEC_BSIDE_SCRATCH_LEN TO 2
@ -159,19 +162,18 @@ BEGIN CASE
CASE Event[1,3] = 'QBF' ; GOSUB Refresh
END CASE
CASE EntID = @WINDOW:'.SIGN_CLEAN' AND Event = 'CLICK' ; GOSUB SignClean
CASE EntID = @WINDOW:'.SIGN_INSP' AND Event = 'CLICK' ; GOSUB SignInsp
CASE EntID = @WINDOW:'.SIGN_SCAN' AND Event = 'CLICK' ; GOSUB SignScan
CASE EntID = @WINDOW:'.SIGN_ROTR_ACCEPTANCE' AND Event = 'CLICK' ; GOSUB SIGN_ROTR_ACCEPTANCE.CLICK
CASE EntID = @WINDOW:'.BTN_WAFER_DETAILS' AND Event = 'CLICK' ; GOSUB BTN_WAFER_DETAILS.CLICK
CASE EntID = @WINDOW:'.SCAN_RESULTS' AND Event = 'CHAR' ; GOSUB SCAN_RESULTS.CHAR
CASE EntID = @WINDOW:'.SCAN_RESULTS' AND Event = 'POSCHANGED'; GOSUB SCAN_RESULTS.POSCHANGED
CASE EntID = @WINDOW:'.SPEC_BRIGHTLIGHT' AND Event = 'CLICK' ; GOSUB Refresh
CASE EntID = @WINDOW:'.SPEC_MICROSCOPE' AND Event = 'CLICK' ; GOSUB Refresh
CASE EntID = @WINDOW:'.CHK_EDGE' AND Event = 'CLICK' ; GOSUB Refresh
CASE EntID = @WINDOW:'.REFRESH_SPEC' AND Event = 'CLICK' ; GOSUB RefreshSpec
CASE EntID = @WINDOW:'.CI_TAB' AND Event = 'CLICK' ; GOSUB Page
*CASE FIELD(EntID,'.',2) = 'ROTR_ACTION' AND Event = 'CLICK' ; GOSUB Refresh
CASE EntID = @WINDOW:'.SIGN_CLEAN' AND Event = 'CLICK' ; GOSUB SignClean
CASE EntID = @WINDOW:'.SIGN_INSP' AND Event = 'CLICK' ; GOSUB SignInsp
CASE EntID = @WINDOW:'.SIGN_SCAN' AND Event = 'CLICK' ; GOSUB SignScan
CASE EntID = @WINDOW:'.SIGN_ROTR_ACCEPTANCE' AND Event = 'CLICK' ; GOSUB SIGN_ROTR_ACCEPTANCE.CLICK
CASE EntID = @WINDOW:'.BTN_WAFER_DETAILS' AND Event = 'CLICK' ; GOSUB BTN_WAFER_DETAILS.CLICK
CASE EntID = @WINDOW:'.SCAN_RESULTS' AND Event = 'CHAR' ; GOSUB SCAN_RESULTS.CHAR
CASE EntID = @WINDOW:'.SCAN_RESULTS' AND Event = 'POSCHANGED' ; GOSUB SCAN_RESULTS.POSCHANGED
CASE EntID = @WINDOW:'.SPEC_BRIGHTLIGHT' AND Event = 'CLICK' ; GOSUB Refresh
CASE EntID = @WINDOW:'.SPEC_MICROSCOPE' AND Event = 'CLICK' ; GOSUB Refresh
CASE EntID = @WINDOW:'.CHK_EDGE' AND Event = 'CLICK' ; GOSUB Refresh
CASE EntID = @WINDOW:'.REFRESH_SPEC' AND Event = 'CLICK' ; GOSUB RefreshSpec
CASE EntID = @WINDOW:'.CI_TAB' AND Event = 'CLICK' ; GOSUB Page
CASE EntID = @WINDOW:'.INSP_RESULTS' AND Event = 'POSCHANGED' ; GOSUB InspPC
CASE EntID = @WINDOW:'.INSP_RESULTS_BSIDE' AND Event = 'POSCHANGED' ; GOSUB BSideInspPC
@ -218,7 +220,7 @@ Create:
CleanStyles<COL$CLEAN_SRD_NO> = BitOr(CleanStyles<COL$CLEAN_SRD_NO>,DTCS_DROPDOWN$)
Send_Message(@WINDOW:'.CLEAN_RESULTS','COLSTYLE',0,CleanStyles) ;* Set Styles
* Setup Inspection Section
InspStyles = Send_Message(@WINDOW:'.INSP_RESULTS','COLSTYLE',0,'')
@ -227,9 +229,6 @@ Create:
Send_Message(@WINDOW:'.INSP_RESULTS','COLSTYLE',0,InspStyles)
* InspTools = XLATE('TOOL_CLASS','MICROSCOPE',TOOL_CLASS_TOOL$,'X') ;* Microscope class tools
* InspTools := @VM:XLATE('TOOL_CLASS','BRIGHTLIGHT',TOOL_CLASS_TOOL$,'X') ;* Brightlight tools
* InspTools := @VM:Xlate('TOOL_CLASS', 'FF/LIGHT', TOOL_CLASS_TOOL$, 'X') ;* Edge inspection tools
InspTools = 'SCOPE':@VM:'FF EDGE INSP':@VM:'SCOPE/FF EDGE INSP'
Send_Message(@WINDOW:'.INSP_RESULTS','COLFORMAT',COL$INSP_TOOL,InspTools)
@ -253,17 +252,11 @@ Create:
Set_Property(@WINDOW:'.REFRESH_SPEC','VISIBLE',0)
END
Ctrl = @Window : '.OLE_TAB_ROTR'
Set_Property(Ctrl, 'OLE.AllowXPTheme', 0)
CIKey = Get_Property(@Window : '.CI_NO', 'TEXT')
ReactorNo = Xlate('CLEAN_INSP', CIKey, 'REACT_NO', 'X')
// ROTR Development Code - 12/03/18 - djs --------------------------------------------------------------------------
Stage = Get_Property(@Window : '.STAGE', 'TEXT')
If Stage EQ 'LWI' then
* ROTREnabled = Xlate('REACTOR', ReactorNo, 'ENABLE_ROTR', 'X')
* If (ROTREnabled EQ True$) then
CanEdit = Memberof(@USER4, 'ENGINEERING') or Memberof(@USER4, 'LEAD') or Memberof(@USER4, 'SUPERVISOR') |
or Memberof(@USER4, 'FINAL_QA') or Memberof(@USER4, 'ROTR_OVERRIDE')
// Check if manual entry lock is temporarily disabled for all users due to ROTR queue overflow.
@ -281,11 +274,8 @@ Create:
ScanStyles<COL$SCAN_TOOL> = BitAnd(ScanStyles<COL$SCAN_TOOL>, BitNot(DTCS_DROPDOWN$) )
ScanStyles = Send_Message(@Window : '.SCAN_RESULTS', 'COLSTYLE', 0, ScanStyles)
end
* end
end
* GOSUB Refresh
RETURN
@ -319,9 +309,10 @@ Clear:
Send_Event(@WINDOW,'PAGE',1)
* * * * * * *
* * * * * * *
Refresh:
* * * * * * *
CIKey = Get_Property(@WINDOW:'.CI_NO', 'TEXT')
// Hide or show the Cass No label and edit line based on the whether the reactor is EpiPro or not. - 04/10/2018 - dmb
WONo = Get_Property(@Window : '.WO_NO', 'TEXT')
@ -337,27 +328,8 @@ Refresh:
Stage = Get_Property(@WINDOW:'.STAGE','TEXT')
Ctrls = @WINDOW:'.ROTR_GROUP':@RM ; Props = 'VISIBLE':@RM
Ctrls := @WINDOW:'.ROTR_ACTION':@RM ; Props := 'VISIBLE':@RM
*Ctrls := @WINDOW:'.ROTR_ACTION.NONE':@RM ; Props := 'VISIBLE':@RM
*Ctrls := @WINDOW:'.ROTR_ACTION.PASS':@RM ; Props := 'VISIBLE':@RM
*Ctrls := @WINDOW:'.ROTR_ACTION.FAIL':@RM ; Props := 'VISIBLE':@RM
*Ctrls := @WINDOW:'.ROTR_ACTION.WAIVED':@RM ; Props := 'VISIBLE':@RM
Ctrls := @WINDOW:'.SURF_SCAN_GROUP' ; Props := 'TEXT'
IF Stage = 'LWI' THEN
Vals = STR('1':@RM,5)
Vals := 'Surface Scan / ROTR'
END ELSE
Vals = STR('0':@RM,5)
Vals := 'Surface Scan'
END
* Set_Property(Ctrls,Props,Vals)
* * * * *
Ctrls = @WINDOW:'.STAGE':@RM ; Props = 'TEXT':@RM
Ctrls := @WINDOW:'.SPEC_FWI_LWI':@RM ; Props := 'TEXT':@RM
Ctrls := @WINDOW:'.SPEC_CLEAN_TOOL_REP':@RM ; Props := 'DEFPROP':@RM
@ -395,55 +367,6 @@ Refresh:
SpecCleanTools[-1,1] = ''
REPEAT
/*
InspSpecStyles = Send_Message(@WINDOW:'.SPEC_INSP','COLSTYLE',0,'')
InspStyles = Send_Message(@WINDOW:'.INSP_RESULTS','COLSTYLE',0,'')
IF SpecBrightlight = 1 THEN
FOR Col = COL$INSP_SPEC_LPD TO COL$INSP_SPEC_SCRATCH_LEN
InspSpecStyles<Col> = BitAnd(InspSpecStyles<Col>,BitNot(HIDDEN$)) ;* Show Specs
NEXT Col
FOR Col = COL$INSP_LPD TO COL$INSP_SCRATCH_LEN
InspStyles<Col> = BitAnd(InspStyles<Col>, BitNot(HIDDEN$)) ;* Show Results
NEXT Col
END ELSE
FOR Col = COL$INSP_SPEC_LPD TO COL$INSP_SPEC_SCRATCH_LEN
InspSpecStyles<Col> = BitOr(InspSpecStyles<Col>,HIDDEN$) ;* Hide Specs
NEXT Col
FOR Col = COL$INSP_LPD TO COL$INSP_SCRATCH_LEN
InspStyles<Col> = BitOr(InspStyles<Col>, HIDDEN$) ;* Hide Results
NEXT Col
END
IF SpecMicroscope = 1 THEN
FOR Col = COL$INSP_SPEC_PITS TO COL$INSP_SPEC_BL_DEFECTS
InspSpecStyles<Col> = BitAnd(InspSpecStyles<Col>,BitNot(HIDDEN$))
NEXT Col
FOR Col = COL$INSP_PITS TO COL$INSP_BL_DEFECTS
InspStyles<Col> = BitAnd(InspStyles<Col>, BitNot(HIDDEN$))
NEXT Col
END ELSE
FOR Col = COL$INSP_SPEC_PITS TO COL$INSP_SPEC_BL_DEFECTS
InspSpecStyles<Col> = BitOr(InspSpecStyles<Col>,HIDDEN$)
NEXT Col
FOR Col = COL$INSP_PITS TO COL$INSP_BL_DEFECTS
InspStyles<Col> = BitOr(InspStyles<Col>, HIDDEN$)
NEXT Col
END
Send_Message(@WINDOW:'.SPEC_INSP','COLSTYLE',0,InspSpecStyles)
Send_Message(@WINDOW:'.INSP_RESULTS','COLSTYLE',0,InspStyles)
*/
ScanRecipes = Get_Property(@WINDOW:'.SPEC_SURFSCAN','ARRAY')<COL$SCAN_SPEC_SURF_RECIPE$> ;* 1/22/2013 JCH ***********
Send_Message(@WINDOW:'.SCAN_RESULTS','COLFORMAT',COL$SCAN_RECIPE,ScanRecipes)
@ -469,9 +392,7 @@ Refresh:
CASE 1 ; LabelText = 'Cleaning && Inspection'
END CASE
Set_Property(@WINDOW:'.WINDOW_LABEL_FIX','TEXT',LabelText)
Ctrls = @WINDOW:'.SPEC_CLEAN_SUBOXIDE':@RM ; Props = 'CHECK':@RM
Ctrls := @WINDOW:'.SPEC_CLEAN_TOOL':@RM ; Props := 'TEXT':@RM
Ctrls := @WINDOW:'.SPEC_CLEAN_AKRION_RECIPE':@RM ; Props := 'TEXT':@RM
@ -531,7 +452,6 @@ Refresh:
InspReq = Xlate('CLEAN_INSP', CIKey, 'INSP_REQ', 'X')
end
* InspReq = Xlate('CLEAN_INSP', CIKey, 'INSP_REQ', 'X')
If InspReq EQ False$ then
Set_Property(@WINDOW:'.INSP_RESULT_GROUP', 'TEXT', 'Visual Inspection Not Required')
end
@ -552,65 +472,23 @@ Refresh:
ReqBackColor = CI_GROUP_BLUE$
IF CleanSigReq THEN
Vals = 1:@RM:STR(ReqBackColor:@RM,6)
END ELSE
Vals = 1:@RM:STR(DefBack:@RM,6)
END
IF InspSigReq THEN
Vals := 1:@RM:STR(ReqBackColor:@RM,5)
END ELSE
Vals := 1:@RM:STR(DefBack:@RM,5)
END
IF SurfScanSigReq THEN
Vals := 1:@RM:STR(ReqBackColor:@RM,2)
END ELSE
Vals := 1:@RM:STR(DefBack:@RM,2)
END
IF Vals[-1,1] = @RM THEN Vals[-1,1] = ''
Ctrls = @WINDOW:'.CLEANS_GROUP':@RM ; Props = 'ENABLED':@RM
Ctrls := @WINDOW:'.CLEANS_GROUP':@RM ; Props := 'BACKCOLOR':@RM
Ctrls := @WINDOW:'.CLEAN_RESULTS_GROUP':@RM ; Props := 'BACKCOLOR':@RM
Ctrls := @WINDOW:'.SPEC_CLEAN_REQ':@RM ; Props := 'BACKCOLOR':@RM
Ctrls := @WINDOW:'.SPEC_CLEAN_SUBOXIDE':@RM ; Props := 'BACKCOLOR':@RM
Ctrls := @WINDOW:'.SPEC_CLEAN_TOOL_LABEL':@RM ; Props := 'BACKCOLOR':@RM
Ctrls := @WINDOW:'.SPEC_CLEAN_RECIPE_LABEL':@RM ; Props := 'BACKCOLOR':@RM
Ctrls := @WINDOW:'.INSP_RESULT_GROUP':@RM ; Props := 'ENABLED':@RM
Ctrls := @WINDOW:'.INSP_RESULT_GROUP':@RM ; Props := 'BACKCOLOR':@RM
Ctrls := @WINDOW:'.SPEC_INSP_REQ':@RM ; Props := 'BACKCOLOR':@RM ;* Checkbox
Ctrls := @WINDOW:'.SPEC_BRIGHTLIGHT':@RM ; Props := 'BACKCOLOR':@RM ;* Checkbox (currently hidden and not used)
Ctrls := @WINDOW:'.SPEC_MICROSCOPE':@RM ; Props := 'BACKCOLOR':@RM ;* Checkbox
Ctrls := @WINDOW:'.CHK_EDGE':@RM ; Props := 'BACKCOLOR':@RM ;* Checkbox
Ctrls := @WINDOW:'.BACKSIDE_LABEL':@RM ; Props := 'BACKCOLOR':@RM ;* Backside Label
Ctrls := @WINDOW:'.SURF_SCAN_GROUP':@RM ; Props := 'ENABLED':@RM
Ctrls := @WINDOW:'.SURF_SCAN_GROUP':@RM ; Props := 'BACKCOLOR':@RM
Ctrls := @WINDOW:'.SPEC_SURFSCAN_REQ' ; Props := 'BACKCOLOR'
Set_Property(Ctrls,Props,Vals)
* ROTR 2/1/2012
RotrAction = Get_Property(@WINDOW:'.ROTR_ACTION','TEXT')
BEGIN CASE
CASE RotrAction = 'Passed'
RBackColor = GREEN$ ;*LS1_GREEN$
BypassEnabled = False$
RBackColor = GREEN$ ;*LS1_GREEN$
BypassEnabled = False$
CASE RotrAction = 'Failed'
RBackColor = RED$
BypassEnabled = MemberOf(@USER4, 'ENGINEERING') OR MemberOf(@USER4, 'LEAD') OR MemberOf(@USER4, 'SUPERVISOR') OR MemberOf(@USER4, 'OI_ADMIN') OR MemberOf(@USER4, 'ROTR_OVERRIDE')
RBackColor = RED$
BypassEnabled = MemberOf(@USER4, 'ENGINEERING') OR MemberOf(@USER4, 'LEAD') OR MemberOf(@USER4, 'SUPERVISOR') OR MemberOf(@USER4, 'OI_ADMIN') OR MemberOf(@USER4, 'ROTR_OVERRIDE')
CASE RotrAction = 'Waived'
RBackColor = YELLOW$ ;*CMB_YELLOW$
BypassEnabled = False$
RBackColor = YELLOW$ ;*CMB_YELLOW$
BypassEnabled = False$
CASE RotrAction = 'Accepted'
RBackColor = ORANGE$
BypassEnabled = False$
RBackColor = ORANGE$
BypassEnabled = False$
CASE 1
IF SurfScanSigReq THEN
RBackColor = ReqBackColor
@ -620,17 +498,15 @@ Refresh:
BypassEnabled = False$
END CASE
Ctrls = @WINDOW:'.ROTR_GROUP':@FM ; Props = 'BACKCOLOR':@FM ; Vals = RBackColor:@FM
Ctrls = @WINDOW:'.OLE_TAB_ROTR':@FM ; Props = 'OLE.CustomPaneColor':@FM ; Vals = RBackColor:@FM
* Ctrls := @WINDOW:'.ROTR_ACTION':@FM ; Props := 'BACKCOLOR':@FM ; Vals := RBackColor:@FM
* Ctrls := @WINDOW:'.ROTR_ACTION.NONE':@FM ; Props := 'BACKCOLOR':@FM ; Vals := RBackColor:@FM
* Ctrls := @WINDOW:'.ROTR_ACTION.PASS':@FM ; Props := 'BACKCOLOR':@FM ; Vals := RBackColor:@FM
* Ctrls := @WINDOW:'.ROTR_ACTION.FAIL':@FM ; Props := 'BACKCOLOR':@FM ; Vals := RBackColor:@FM
* Ctrls := @WINDOW:'.ROTR_ACTION.WAIVED':@FM ; Props := 'BACKCOLOR':@FM ; Vals := RBackColor:@FM
Ctrls := @WINDOW:'.ROTR_ACTION':@FM ; Props := 'ENABLED':@FM ; Vals := 0:@FM
Ctrls := @WINDOW:'.EDL_ROTR_REASON':@FM ; Props := 'ENABLED':@FM ; Vals := 0:@FM
Ctrls := @WINDOW:'.SIGN_ROTR_ACCEPTANCE':@FM ; Props := 'ENABLED':@FM ; Vals := BypassEnabled:@FM
Ctrls := @WINDOW ; Props := 'REDRAW' ; Vals := 1
Ctrls = @WINDOW:'.ROTR_STATUS_LABEL':@FM ; Props = 'BACKCOLOR':@FM ; Vals = RBackColor:@FM
Ctrls := @WINDOW:'.ROTR_REASON_LABEL':@FM ; Props := 'BACKCOLOR':@FM ; Vals := RBackColor:@FM
Ctrls := @WINDOW:'.SIGN_ROTR_SIGNATURE_LABEL':@FM ; Props := 'BACKCOLOR':@FM ; Vals := RBackColor:@FM
Ctrls := @WINDOW:'.SIGN_ROTR_REASON_LABEL':@FM ; Props := 'BACKCOLOR':@FM ; Vals := RBackColor:@FM
Ctrls := @WINDOW:'.ROTR_GROUP':@FM ; Props := 'BACKCOLOR':@FM ; Vals := RBackColor:@FM
Ctrls := @WINDOW:'.ROTR_ACTION':@FM ; Props := 'ENABLED':@FM ; Vals := 0:@FM
Ctrls := @WINDOW:'.EDL_ROTR_REASON':@FM ; Props := 'ENABLED':@FM ; Vals := 0:@FM
Ctrls := @WINDOW:'.SIGN_ROTR_ACCEPTANCE':@FM ; Props := 'ENABLED':@FM ; Vals := BypassEnabled:@FM
Ctrls := @WINDOW ; Props := 'REDRAW' ; Vals := 1
Convert @FM to @RM in Ctrls
Convert @FM to @RM in Props
@ -638,8 +514,6 @@ Refresh:
Set_Property(Ctrls,Props,Vals)
Set_Property(@Window:'.OLE_PIC_ROTR', 'OLE.BackgroundColor', RBackColor)
*
IF Get_Property(@WINDOW:'.SPC_DTM','DEFPROP') = '' THEN
Set_Property(@WINDOW:'.SEND_SPC','TEXT','Send to SPC')
END ELSE
@ -757,43 +631,6 @@ Refresh:
SurfResults[COL1(),99] = ''
REPEAT
/*
OutOfSpec = 0 ;* Set Flag
IF SSurfRecipes NE '' THEN
ResCnt = COUNT(SurfResults,@FM) + (SurfResults NE '')
FOR I = 1 TO ResCnt
ResRecipe = SurfResults<I,COL$SCAN_RECIPE>
LOCATE ResRecipe IN SSurfRecipes USING @VM SETTING Pos THEN
SSurfDefect = SSurfDefects<1,Pos>
SSurfHaze = SSurfHazes<1,Pos>
* 8/9/2013 JCH - Added check for presence of Spec data before checking for out of spec condition
IF SSurfDefect NE '' THEN
IF SurfResults<1,COL$SCAN_SUM_OF_DEF_AVG> > SSurfDefect THEN OutOfSpec = 1
END
IF SSurfHaze NE '' THEN
IF SurfResults<1,COL$SCAN_HAZE_AVG_AVG> > SSurfHaze THEN OutOfSpec = 1
END
END
NEXT I
END
IF OutOfSpec = 1 THEN
Set_Property(@WINDOW:'.SCAN_RESULTS','BACKCOLOR',RED$)
END ELSE
Set_Property(@WINDOW:'.SCAN_RESULTS','BACKCOLOR',WHITE$)
END
*/
CurrRec = Get_Property(@Window, 'RECORD')
ScanResults = CurrRec<CLEAN_INSP_SCAN_RESULT$>
CtrlName = @WINDOW:'.SCAN_RESULTS'
@ -830,8 +667,6 @@ Refresh:
Set_Property(Ctrls,Props,Vals)
* Turn edit table symbolic column backgrounds to green **************************************************
ETSymbolics = Get_Property(@WINDOW,'@ET_SYMBOLICS') ;* Loaded during 'Create' in obj_Appwindow
@ -909,15 +744,6 @@ RETURN
Delete:
* * * * * * *
/*
IF Security_Check('Order',Delete$) THEN
Result = 1 ;* Proceed with delete
END ELSE
Security_Err_Msg('Order',Delete$)
Result = 0 ;* Stop event chain
END
*/
RETURN
@ -980,15 +806,25 @@ SignClean:
IF SigRow NE '' AND CtrlList<SelectedRow,COL$CLEAN_SIG> = '' THEN
If ( (SelectedRow EQ 1) and (ReactType NE 'EPP') ) then
If SelectedRow EQ 1 then
WOMatKey = WONo:'*':CassNo
Signature_Services('CheckSigOrder', WOMatKey, SigStage)
Signature_Services('CheckSigOrder', WOMatKey, SigStage, RDSNo)
If Error_Services('HasError') then
ErrMsg(Error_Services('GetMessage'))
return
end
end
// Add check for supplement signatures
ValidStages = Supplement_Services('GetStagesForLot', 'RDS', RDSNo)
If Count(ValidStages, SigStage) NE 0 then
UnacknowledgedSupp = Supplement_Services('UnacknowledgedSupplementCheck', 'RDS', RDSNo, SigStage)
If UnacknowledgedSupp NE FALSE$ then
Response = Dialog_Box('NDW_RDS_SUPP_SIG', @Window, RDSNo :@FM: SigStage :@FM: FALSE$)
If Response EQ False$ then return
end
End
IF MemberOf(@USER4, 'OI_SUPERUSER') THEN
Valid = 1
END ELSE
@ -1184,9 +1020,9 @@ SignInsp:
IF SigRow NE '' AND CtrlList<SelectedRow,COL$INSP_SIG> = '' THEN
If ( (SelectedRow EQ 1) and (ReactType NE 'EPP') ) then
If SelectedRow EQ 1 then
WOMatKey = WONo:'*':CassNo
Signature_Services('CheckSigOrder', WOMatKey, SigStage, False$)
Signature_Services('CheckSigOrder', WOMatKey, SigStage, False$, RDSNo)
If Error_Services('HasError') then
ErrMsg(Error_Services('GetMessage'))
return
@ -1194,6 +1030,16 @@ SignInsp:
END ;* End of check for 1st Signature row
// Add check for supplement signatures
ValidStages = Supplement_Services('GetStagesForLot', 'RDS', RDSNo)
If Count(ValidStages, SigStage) NE 0 then
UnacknowledgedSupp = Supplement_Services('UnacknowledgedSupplementCheck', 'RDS', RDSNo, SigStage)
If UnacknowledgedSupp NE FALSE$ then
Response = Dialog_Box('NDW_RDS_SUPP_SIG', @Window, RDSNo :@FM: SigStage :@FM: FALSE$)
If Response EQ False$ then return
end
End
// Check if edge inspection is prescribed. If so, prompt user whether or not edge defects are present.
If EdgeInspReq then
// If edge defects are present, present user with a wafer selection dialog and create an NCR for those wafers.
@ -1674,8 +1520,6 @@ SignInsp:
RETURN
* * * * * * *
SignScan:
* * * * * * *
@ -1738,15 +1582,25 @@ SignScan:
IF SigRow NE '' AND CtrlList<SelectedRow,COL$SCAN_SIG> = '' AND CtrlList<SelectedRow,COL$SCAN_SIG_DTM> = '' THEN
If ( (SelectedRow EQ 1) and (ReactType NE 'EPP') ) then
If SelectedRow EQ 1 then
WOMatKey = WONo:'*':CassNo
Signature_Services('CheckSigOrder', WOMatKey, SigStage, False$)
Signature_Services('CheckSigOrder', WOMatKey, SigStage, False$, RDSNo)
If Error_Services('HasError') then
ErrMsg(Error_Services('GetMessage'))
return
end
end
// Add check for supplement signatures
ValidStages = Supplement_Services('GetStagesForLot', 'RDS', RDSNo)
If Count(ValidStages, SigStage) NE 0 then
UnacknowledgedSupp = Supplement_Services('UnacknowledgedSupplementCheck', 'RDS', RDSNo, SigStage)
If UnacknowledgedSupp NE FALSE$ then
Response = Dialog_Box('NDW_RDS_SUPP_SIG', @Window, RDSNo :@FM: SigStage :@FM: FALSE$)
If Response EQ False$ then return
end
End
// This checks to see if manually entered data is authorized to be signed.
IF (SigRow NE '') AND (CtrlList<SelectedRow,COL$SCAN_TEST_RUN_DTM> = '') AND (Stage NE 'POST') THEN
Authorized = MemberOf(@USER4, 'ENGINEERING') OR MemberOf(@USER4, 'LEAD') OR MemberOf(@USER4, 'SUPERVISOR') OR MemberOf(@USER4, 'ROTR_OVERRIDE')
@ -1836,35 +1690,6 @@ RETURN
SIGN_ROTR_ACCEPTANCE.CLICK:
// ROTR Development Code - 11/21/18 - djs --------------------------------------------------------------------------
* Stage = Get_Property(@Window : '.STAGE', 'TEXT')
* If Stage EQ 'LWI' then
* CIKey = Get_Property(@Window : '.CI_NO', 'TEXT')
* ReactorNo = Xlate('CLEAN_INSP', CIKey, 'REACT_NO', 'X')
* ROTREnabled = Xlate('REACTOR', ReactorNo, 'ENABLE_ROTR', 'X')
* If (ROTREnabled EQ True$) then
* ROTRReason = Get_Property(@Window : '.EDL_ROTR_REASON', 'TEXT')
* ErrorMsg = ''
* RDSNo = Get_Property(@Window : '.RDS_NO', 'TEXT')
* PostCINo = Xlate('RDS', RDSNo, 'POST_CI_NO', 'X')
* PostCleanSig = Xlate('CLEAN_INSP', PostCINo, 'CLEAN_SIG', 'X')
* Begin Case
* Case ( (ROTRReason EQ 'Wafer fail limit met - 100% scan required') and (PostCleanSig EQ '') )
* ErrorMsg = 'A 100% scan must be run or a post clean must be completed in order to accept ROTR.'
* Case ROTRReason EQ 'ROTR awaiting processing'
* ErrorMsg = 'ROTR cannot be accepted until after ROTR data has finished processing.'
* Case Otherwise$
* Null
* // Allow ROTR acceptance
* End Case
* If ErrorMsg NE '' then
* Msg(@Window, '', 'OK', '', ROTRReason:@FM:ErrorMsg)
* return
* end
* end
* end
// -----------------------------------------------------------------------------------------------------------------
Valid = Dialog_Box( 'QUOTE_SIG_PWD_ENTRY', @WINDOW, @USER4:@VM:XLATE( 'LSL_USERS', @USER4, LSL_USERS_PASSWORD$, 'X' ) )
If Valid EQ True$ then
OrigReason = Get_Property(@Window : '.SIGN_ROTR_REASON', 'DEFPROP')
@ -1882,14 +1707,11 @@ return
SCAN_RESULTS.CHAR:
// ROTR Development Code - 11/21/18 - djs --------------------------------------------------------------------------
Stage = Get_Property(@Window : '.STAGE', 'TEXT')
If Stage EQ 'LWI' then
CtrlEntID = 'SCAN_RESULTS'
CIKey = Get_Property(@Window : '.CI_NO', 'TEXT')
ReactorNo = Xlate('CLEAN_INSP', CIKey, 'REACT_NO', 'X')
* ROTREnabled = Xlate('REACTOR', ReactorNo, 'ENABLE_ROTR', 'X')
* If (ROTREnabled EQ True$) then
CanEdit = Get_Property(@Window, '@CAN_EDIT')
If Not(CanEdit) then
PrevFocusID = Get_Property (@Window, "PREVFOCUS")
@ -1934,21 +1756,19 @@ SCAN_RESULTS.CHAR:
ScanStyles<COL$SCAN_TOOL> = BitOr(ScanStyles<COL$SCAN_TOOL>, DTCS_DROPDOWN$ )
ScanStyles = Send_Message(@Window : '.SCAN_RESULTS', 'COLSTYLE', 0, ScanStyles)
end
* end
end
****************Logging Manual Data Entry********************
TableContents = Get_Property(@Window:'.SCAN_RESULTS', 'ARRAY')
ToolID = TableContents<COL$SCAN_TOOL, 1>
IF ToolID NE '' then
Date = SRP_DateTime('Now')
EpochStart = 00732
EpochTime = SRP_DateTime('SecondSpan',EpochStart, Date)
RDSNo = Get_Property(@Window:'.RDS_NO', 'DEFPROP')
PSNo = Get_Property(@Window:'.PS_NO', 'DEFPROP')
//Tool = Get_Property(@Window:'.SPEC_THICK_MTOOL', 'DEFPROP')
User = @User4
Date = SRP_DateTime('Now')
EpochStart = 00732
EpochTime = SRP_DateTime('SecondSpan',EpochStart, Date)
RDSNo = Get_Property(@Window:'.RDS_NO', 'DEFPROP')
PSNo = Get_Property(@Window:'.PS_NO', 'DEFPROP')
User = @User4
Description = 'Manual SurfScan Data Entry detected for RDS #: ':RDSNo
Reactor = XLATE('RDS', RDSNo, 2, 'X')
Reactor = XLATE('RDS', RDSNo, 2, 'X')
FileName = Environment_Services('GetApplicationRootPath'): '\LogFiles\ManualDataEntry\PollPath\' : EpochTime :'.json'
@ -1957,7 +1777,6 @@ SCAN_RESULTS.CHAR:
OSWrite JSON to FileName
end
// -----------------------------------------------------------------------------------------------------------------
return
@ -2015,7 +1834,6 @@ RefreshSpec:
RETURN
* * * * * * *
InspPC:
* * * * * * *
@ -2056,9 +1874,6 @@ BSideInspPC:
RETURN
* * * * * * *
SendSPC:
* * * * * * *
@ -2121,7 +1936,7 @@ SendSPC:
DOSFile = Environment_Services('GetSPCDataPath') : '\SPC_Surf.txt'
* * * * * * *
* * * * * * *
DosRead:
* * * * * * *
@ -2148,3 +1963,5 @@ SetGroupBackground:

View File

@ -855,13 +855,12 @@ WRITE_RECORD:
ScanSigDTM = Record<CLEAN_INSP_SCAN_SIG_DTM$>
SigProfUpdate = False$
If ( (OrigInspSig NE InspSig) or (OrigInspSigDTM NE InspSigDTM) ) then
WOMatStage = '1':Stage:'I'
Locate WOMatStage in WOMatSigProf using @VM setting vPos then
WOMatSigs<0, vPos> = InspSig
WOMatSigDTMs<0, vPos> = InspSigDTM
WOMatSigs<0, vPos> = InspSig[-1, 'B':@VM]
WOMatSigDTMs<0, vPos> = InspSigDTM[-1, 'B':@VM]
SigProfUpdate = True$
end
end
@ -869,8 +868,8 @@ WRITE_RECORD:
If ( (OrigCleanSig NE CleanSig) or (OrigCleanSigDTM NE CleanSigDTM) ) then
WOMatStage = '1':Stage:'C'
Locate WOMatStage in WOMatSigProf using @VM setting vPos then
WOMatSigs<0, vPos> = CleanSig
WOMatSigDTMs<0, vPos> = CleanSigDTM
WOMatSigs<0, vPos> = CleanSig[-1, 'B':@VM]
WOMatSigDTMs<0, vPos> = CleanSigDTM[-1, 'B':@VM]
SigProfUpdate = True$
end
end
@ -878,15 +877,16 @@ WRITE_RECORD:
If ( (OrigScanSig NE ScanSig) or (OrigScanSigDTM NE ScanSigDTM) ) then
WOMatStage = '1':Stage:'S'
Locate WOMatStage in WOMatSigProf using @VM setting vPos then
WOMatSigs<0, vPos> = ScanSig
WOMatSigDTMs<0, vPos> = ScanSigDTM
WOMatSigs<0, vPos> = ScanSig[-1, 'B':@VM]
WOMatSigDTMs<0, vPos> = ScanSigDTM[-1, 'B':@VM]
SigProfUpdate = True$
end
end
If SigProfUpdate then
WOMatRec<WO_MAT_SIGNATURE$> = WOMatSigs
WOMatRec<WO_MAT_SIG_DTM$> = WOMatSigDTMs
NumSteps = DCount(WOMatSigProf, @VM)
WOMatRec<WO_MAT_SIGNATURE$> = Field(WOMatSigs, @VM, 1, NumSteps)
WOMatRec<WO_MAT_SIG_DTM$> = Field(WOMatSigDTMs, @VM, 1, NumSteps)
Database_Services('WriteDataRow', 'WO_MAT', WOMatKey, WOMatRec, True$, False$, True$)
end
end

View File

@ -29,4 +29,3 @@ BEGIN CASE
Status() = invalid_msg$
END CASE
RETURN

View File

@ -448,4 +448,3 @@ end service

View File

@ -70,4 +70,3 @@ Bail:
* * * * * * *
END

View File

@ -61,4 +61,3 @@ Bail:
* * * * * * *
END

View File

@ -92,4 +92,3 @@ write '' on SysListsTable, ListsId else
return 0
end
RETURN 0

View File

@ -137,4 +137,3 @@ Void = utility( 'CURSOR', 'A' )
RETURN 0

View File

@ -793,4 +793,3 @@ RETURN

View File

@ -309,4 +309,3 @@ RETURN

View File

@ -6,4 +6,3 @@ COMPILE FUNCTION Comm_Clean_Insp(Instruction,Parm1,Parm2)
RETURN ''

View File

@ -159,4 +159,3 @@ RETURN

View File

@ -176,4 +176,3 @@ RETURN

View File

@ -80,4 +80,3 @@ RETURN

View File

@ -75,4 +75,3 @@ RETURN

View File

@ -140,4 +140,3 @@ obj_AppWindow('LUValReturn',CustNo:@RM:ReturnToCtrl:@RM:ReturnToPos:@RM:1) ;* La
RETURN

View File

@ -97,4 +97,3 @@ RETURN

View File

@ -195,13 +195,22 @@ Refresh:
RETURN
* * * * * * *
Page:
* * * * * * *
obj_Appwindow('Page')
RETURN
Page = Parm1
IF Page = '' THEN
Page = Get_Property(@WINDOW:'.TAB_MAIN','VALUE')
END ELSE
Set_Property(@WINDOW:'.TAB_MAIN','VALUE',Page)
END
Set_Property(@WINDOW,'VPOSITION', Page)
return
* * * * * * *
@ -816,4 +825,3 @@ return

View File

@ -335,4 +335,3 @@ RETURN

View File

@ -327,4 +327,3 @@ End_Dialog(@WINDOW,'Cancel')
RETURN

View File

@ -697,4 +697,3 @@ RETURN

View File

@ -147,4 +147,3 @@ RETURN

View File

@ -89,4 +89,3 @@ RETURN

View File

@ -779,4 +779,3 @@ RETURN

View File

@ -114,4 +114,3 @@ End_Dialog(@WINDOW,Vals)
RETURN

View File

@ -97,4 +97,3 @@ End_Dialog( @WINDOW, GenericDt )
RETURN

View File

@ -87,4 +87,3 @@ End_Dialog( @WINDOW, StartDt:@FM:EndDt )
RETURN

View File

@ -697,4 +697,3 @@ RETURN

View File

@ -391,4 +391,3 @@ RETURN

View File

@ -156,4 +156,3 @@ End_Dialog(@WINDOW,Result)
RETURN

View File

@ -404,4 +404,3 @@ RETURN

View File

@ -325,7 +325,6 @@ FOR I = 1 TO CassCnt
NEXT I
UserID = @USER4
IF UserID = '' THEN UserID = @USERNAME
LogFile = 'WO_MAT' ;* Changed so all scans are logged in the WO_MAT table 12/3/2006
@ -367,6 +366,7 @@ Logging_Services('AppendLog', objLog, LogData, @FM, @VM)
obj_WO_Mat_Log('Create',LogFile:@RM:CurrDTM:@RM:Action:@RM:WhCd:@RM:LocCd:@RM:WONos:@RM:CassNos:@RM:UserID:@RM:CassIDs)
errCode = ''
IF Get_Status(errCode) THEN
Errmsg(errCode)
END

View File

@ -226,53 +226,58 @@ WaferList = Get_Property(@WINDOW:'.SLOT_REJECT','LIST')
WONo = Get_Property(@WINDOW:'.WO_NO','DEFPROP')
CassNo = Get_Property(@WINDOW:'.CASS_NO','DEFPROP')
NCRNo = Get_Property(@Window:'.NCR_NO', 'TEXT')
SAPBatchNo = Xlate('NCR', NCRNo, 'SAP_BATCH_NO', 'X')
If SAPBatchNo EQ '' then
WaferSelection = Get_Property(@WINDOW:'.SLOT_REJECT','SELPOS')
SelectedWafers = WaferSelection<2>
WaferSelection = Get_Property(@WINDOW:'.SLOT_REJECT','SELPOS')
SelectedWafers = WaferSelection<2>
IF SelectedWafers = '' THEN RETURN
IF SelectedWafers = '' THEN RETURN
SelCnt = COUNT(SelectedWafers,@VM) + (SelectedWafers NE '')
WaferCnt = COUNT(WaferList,@FM) + (WaferList NE '')
SelCnt = COUNT(SelectedWafers,@VM) + (SelectedWafers NE '')
WaferCnt = COUNT(WaferList,@FM) + (WaferList NE '')
IF SelCnt = WaferCnt THEN
ErrMesg = 'There must be at least one rejected wafer on the NCR. '
ErrMesg := 'If you are moving wafers from one slot to another, '
ErrMesg := 'reject wafers from the cassette and then replace '
ErrMesg := 'from the NCR.':CRLF$:CRLF$
ErrMesg := 'If you are going to delete the NCR completely, '
ErrMesg := 'you do not need to replace the wafers. The program '
ErrMesg := 'will replace them during the NCR delete process.'
ErrMsg(ErrMesg)
RETURN
END
IF SelCnt = WaferCnt THEN
ErrMesg = 'There must be at least one rejected wafer on the NCR. '
ErrMesg := 'If you are moving wafers from one slot to another, '
ErrMesg := 'reject wafers from the cassette and then replace '
ErrMesg := 'from the NCR.':CRLF$:CRLF$
ErrMesg := 'If you are going to delete the NCR completely, '
ErrMesg := 'you do not need to replace the wafers. The program '
ErrMesg := 'will replace them during the NCR delete process.'
ErrMsg(ErrMesg)
RETURN
END
SlotList = Get_Property(@WINDOW:'.WO_MAT_SLOT','LIST')
SlotList = Get_Property(@WINDOW:'.WO_MAT_SLOT','LIST')
FOR I = SelCnt TO 1 STEP -1
SelectedWafer = SelectedWafers<1,I>
SlotNo = WaferList<SelectedWafer,NCR_COL$SLOT_NO>
WaferID = WaferList<SelectedWafer,NCR_COL$WAFER_ID>
PrevNCR = WaferList<SelectedWafer,NCR_COL$PREV_NCR>
RejMetNo = WaferList<SelectedWafer,NCR_COL$REJ_MET_NO>
FOR I = SelCnt TO 1 STEP -1
SelectedWafer = SelectedWafers<1,I>
SlotNo = WaferList<SelectedWafer,NCR_COL$SLOT_NO>
WaferID = WaferList<SelectedWafer,NCR_COL$WAFER_ID>
PrevNCR = WaferList<SelectedWafer,NCR_COL$PREV_NCR>
RejMetNo = WaferList<SelectedWafer,NCR_COL$REJ_MET_NO>
WaferList = DELETE(WaferList,SelectedWafer,0,0)
SlotList<SlotNo,WFR_COL$SLOT> = SlotNo
SlotList<SlotNo,WFR_COL$WAFER_ID> = WaferID
SlotList<SlotNo,WFR_COL$SLOT_NCR> = PrevNCR
SlotList<SlotNo,WFR_COL$MET_NO> = RejMetNo
IF PrevNCR NE '' THEN
SlotList<SlotNo,WFR_COL$REPLACED_BY> = WaferID
END
NEXT I
WaferList = DELETE(WaferList,SelectedWafer,0,0)
SlotList<SlotNo,WFR_COL$SLOT> = SlotNo
SlotList<SlotNo,WFR_COL$WAFER_ID> = WaferID
SlotList<SlotNo,WFR_COL$SLOT_NCR> = PrevNCR
SlotList<SlotNo,WFR_COL$MET_NO> = RejMetNo
IF PrevNCR NE '' THEN
SlotList<SlotNo,WFR_COL$REPLACED_BY> = WaferID
END
NEXT I
Set_Property(@WINDOW:'.SLOT_REJECT','LIST',WaferList)
Set_Property(@WINDOW:'.WO_MAT_SLOT','LIST',SlotList)
Set_Property(@WINDOW:'.SLOT_REJECT','LIST',WaferList)
Set_Property(@WINDOW:'.WO_MAT_SLOT','LIST',SlotList)
end else
ErrMsg('Wafers cannot be replaced because an SAP batch number has been assigned. Contact FI for further assistance.')
end
RETURN

View File

@ -269,66 +269,71 @@ WaferList = Get_Property(@WINDOW:'.SLOT_REJECT','LIST')
WONo = Get_Property(@WINDOW:'.WO_NO','DEFPROP')
CassNo = Get_Property(@WINDOW:'.CASS_NO','DEFPROP')
NCRNo = Get_Property(@Window:'.NCR_NO', 'TEXT')
SAPBatchNo = Xlate('NCR', NCRNo, 'SAP_BATCH_NO', 'X')
WaferSelection = Get_Property(@WINDOW:'.SLOT_REJECT','SELPOS')
SelectedWafers = WaferSelection<2>
If SAPBatchNo EQ '' then
WaferSelection = Get_Property(@WINDOW:'.SLOT_REJECT','SELPOS')
SelectedWafers = WaferSelection<2>
IF SelectedWafers = '' THEN RETURN
IF SelectedWafers = '' THEN RETURN
SelCnt = COUNT(SelectedWafers,@VM) + (SelectedWafers NE '')
WaferCnt = COUNT(WaferList,@FM) + (WaferList NE '')
SelCnt = COUNT(SelectedWafers,@VM) + (SelectedWafers NE '')
WaferCnt = COUNT(WaferList,@FM) + (WaferList NE '')
IF SelCnt = WaferCnt THEN
ErrMesg = 'There must be at least one rejected wafer on the NCR. '
ErrMesg := 'If you are moving wafers from one slot to another, '
ErrMesg := 'reject wafers from the cassette and then replace '
ErrMesg := 'from the NCR.':CRLF$:CRLF$
ErrMesg := 'If you are going to delete the NCR completely, '
ErrMesg := 'you do not need to replace the wafers. The program '
ErrMesg := 'will replace them during the NCR delete process.'
ErrMsg(ErrMesg)
RETURN
END
IF SelCnt = WaferCnt THEN
ErrMesg = 'There must be at least one rejected wafer on the NCR. '
ErrMesg := 'If you are moving wafers from one slot to another, '
ErrMesg := 'reject wafers from the cassette and then replace '
ErrMesg := 'from the NCR.':CRLF$:CRLF$
ErrMesg := 'If you are going to delete the NCR completely, '
ErrMesg := 'you do not need to replace the wafers. The program '
ErrMesg := 'will replace them during the NCR delete process.'
ErrMsg(ErrMesg)
RETURN
END
SlotList = Get_Property(@WINDOW:'.WM_OUT_SLOT','LIST')
SlotList = Get_Property(@WINDOW:'.WM_OUT_SLOT','LIST')
FOR I = SelCnt TO 1 STEP -1
SelectedWafer = SelectedWafers<1,I>
FOR I = SelCnt TO 1 STEP -1
SelectedWafer = SelectedWafers<1,I>
OutSlot = WaferList<SelectedWafer,NCR_COL$OUT_SLOT>
RDSNo = WaferList<SelectedWafer,NCR_COL$RDS>
Pocket = WaferList<SelectedWafer,NCR_COL$POCKET>
Zone = WaferList<SelectedWafer,NCR_COL$ZONE>
InCass = WaferList<SelectedWafer,NCR_COL$IN_CASS>
InSlot = WaferList<SelectedWafer,NCR_COL$IN_SLOT>
PrevNCR = WaferList<SelectedWafer,NCR_COL$PREV_NCR>
MUWONo = WaferList<SelectedWafer,NCR_COL$MU_WO_NO>
MUWOStep = WaferList<SelectedWafer,NCR_COL$MU_STEP>
MUCassID = WaferList<SelectedWafer,NCR_COL$MU_CASS>
MUSlot = WaferList<SelectedWafer,NCR_COL$MU_SLOT>
WaferList = DELETE(WaferList,SelectedWafer,0,0) ;* Removes rejected wafer from NCR list
SlotList<OutSlot,WFR_COL$OUT_SLOT> = OutSlot
SlotList<OutSlot,WFR_COL$RDS> = RDSNo
SlotList<OutSlot,WFR_COL$POCKET> = Pocket
SlotList<OutSlot,WFR_COL$ZONE> = Zone
SlotList<OutSlot,WFR_COL$IN_CASS> = InCass
SlotList<OutSlot,WFR_COL$IN_SLOT> = InSlot
SlotList<OutSlot,WFR_COL$SLOT_NCR> = PrevNCR
SlotList<OutSlot,WFR_COL$MU_WO_NO> = MUWONo
SlotList<OutSlot,WFR_COL$MU_STEP> = MUWOStep
SlotList<OutSlot,WFR_COL$MU_CASS> = MUCassID
SlotList<OutSlot,WFR_COL$MU_SLOT> = MUSlot
NEXT I
OutSlot = WaferList<SelectedWafer,NCR_COL$OUT_SLOT>
RDSNo = WaferList<SelectedWafer,NCR_COL$RDS>
Pocket = WaferList<SelectedWafer,NCR_COL$POCKET>
Zone = WaferList<SelectedWafer,NCR_COL$ZONE>
InCass = WaferList<SelectedWafer,NCR_COL$IN_CASS>
InSlot = WaferList<SelectedWafer,NCR_COL$IN_SLOT>
PrevNCR = WaferList<SelectedWafer,NCR_COL$PREV_NCR>
MUWONo = WaferList<SelectedWafer,NCR_COL$MU_WO_NO>
MUWOStep = WaferList<SelectedWafer,NCR_COL$MU_STEP>
MUCassID = WaferList<SelectedWafer,NCR_COL$MU_CASS>
MUSlot = WaferList<SelectedWafer,NCR_COL$MU_SLOT>
WaferList = DELETE(WaferList,SelectedWafer,0,0) ;* Removes rejected wafer from NCR list
SlotList<OutSlot,WFR_COL$OUT_SLOT> = OutSlot
SlotList<OutSlot,WFR_COL$RDS> = RDSNo
SlotList<OutSlot,WFR_COL$POCKET> = Pocket
SlotList<OutSlot,WFR_COL$ZONE> = Zone
SlotList<OutSlot,WFR_COL$IN_CASS> = InCass
SlotList<OutSlot,WFR_COL$IN_SLOT> = InSlot
SlotList<OutSlot,WFR_COL$SLOT_NCR> = PrevNCR
SlotList<OutSlot,WFR_COL$MU_WO_NO> = MUWONo
SlotList<OutSlot,WFR_COL$MU_STEP> = MUWOStep
SlotList<OutSlot,WFR_COL$MU_CASS> = MUCassID
SlotList<OutSlot,WFR_COL$MU_SLOT> = MUSlot
NEXT I
Set_Property(@WINDOW:'.SLOT_REJECT','LIST',WaferList)
Set_Property(@WINDOW:'.WM_OUT_SLOT','LIST',SlotList)
Set_Property(@WINDOW:'.SLOT_REJECT','LIST',WaferList)
Set_Property(@WINDOW:'.WM_OUT_SLOT','LIST',SlotList)
end else
ErrMsg('Wafers cannot be replaced because an SAP batch number has been assigned. Contact FI for further assistance.')
end
RETURN

View File

@ -155,4 +155,3 @@ Cancel:
RETURN

View File

@ -658,4 +658,3 @@ RETURN

View File

@ -136,4 +136,3 @@ Cancel:
RETURN

View File

@ -156,4 +156,3 @@ RETURN

View File

@ -248,4 +248,3 @@ RETURN

View File

@ -421,4 +421,3 @@ END
RETURN

View File

@ -209,4 +209,3 @@ END
RETURN

View File

@ -195,4 +195,3 @@ End_Dialog(@WINDOW,Result)
RETURN

View File

@ -246,4 +246,3 @@ RETURN

View File

@ -288,4 +288,3 @@ RETURN

View File

@ -238,4 +238,3 @@ RETURN

View File

@ -247,4 +247,3 @@ Timer:
Set_Property(@WINDOW,'TIMER','0':@FM:'1000') ;* Set the next timer event to start in 1000 msecs (1 second).
RETURN

View File

@ -79,4 +79,3 @@ End_Dialog(@WINDOW,Result)
RETURN

View File

@ -239,4 +239,3 @@ return

View File

@ -368,4 +368,3 @@ RETURN

File diff suppressed because it is too large Load Diff

View File

@ -159,4 +159,3 @@ End_Dialog(@WINDOW,CassQtys)
RETURN

View File

@ -494,4 +494,3 @@ RETURN

View File

@ -752,4 +752,3 @@ RETURN

View File

@ -571,4 +571,3 @@ End_Dialog(@WINDOW,Result)
RETURN

View File

@ -436,4 +436,3 @@ End_Dialog(@WINDOW,Result)
RETURN

View File

@ -179,4 +179,3 @@ RETURN

File diff suppressed because it is too large Load Diff

View File

@ -373,4 +373,3 @@ RETURN

Some files were not shown because too many files have changed in this diff Show More