Compare commits

56 Commits

Author SHA1 Message Date
aaf415e62c Common IndexOf on six methods 2025-09-30 09:10:29 -07:00
af279541ae Reduced available react item part types to just ASM, HTR, and EPP to prevent validation issues. 2025-09-26 15:12:37 -07:00
2036ed3289 Fixed an issue which was preventing work orders without received material from being scheduled. 2025-09-26 13:40:16 -07:00
edd09af821 Fixed obj_Prod_Spec('GetQAMet'). Added RDS_Test_Services('UpdateRDSTestSpecs'). 2025-09-26 11:30:17 -07:00
febe660fcf Updated WEB_OI_WIZARD form to launch centered on the screen sized to 3/4 of the client area. Updated the UpdateOpenWorkOrderData service to also update all work order quantities to ensure the OPEN_QTY_STATIC is set after routing a work order. 2025-09-25 16:30:41 -07:00
245f832445 Modified UpdateQAMet service to support reactor scheduled metrology tests 2025-09-25 22:35:05 +00:00
f07e4476a7 updated schedule related services to account for voided cassettes 2025-09-24 16:00:16 -07:00
12f354dcaa commented out localhost case until a better way to determine local development is implemented 2025-09-24 10:49:59 -07:00
d2f98a342d adding in GetOIWizardBaseURL 2025-09-24 10:38:26 -07:00
b83a3fb57b Merged PR 26794: Added increased error checking in CopyRDSLayerParameters service
Added increased error checking in CopyRDSLayerParameters service
2025-09-24 17:12:27 +00:00
3e0991f681 Merged PR 26793: Added a check for an error in copying of RDS Layer Params
Added a check for an error in copying of RDS Layer Params
2025-09-24 17:05:55 +00:00
f1a719d279 Merged PR 26784: Error Message buffer variable mismatch. Errors were being set to ErrorMsg and...
Error Message buffer variable mismatch. Errors were being set to ErrorMsg and it needed to be set to ErrMsg. LoadSignatureReady was being set to false, but there were no cases to handle that false response with the variable ErrMsg not getting set.
2025-09-24 15:57:32 +00:00
40a7a5e5a1 Set autosize height and width to false in form designer and to true in commuter module to avoid SRP Git serialization issue. 2025-09-23 11:37:41 -07:00
261880fab8 Implemented ReceiveRelease_API.
Added OI Wizard Webview form to launch into OI Wizard from OI and
auto-login the user.

Added menu items to NDW_MAIN to launch the OI Wizard webview form and
navigated to the appropriate page.
2025-09-23 09:41:57 -07:00
4b7417c1a8 RDS Test spec recipe and pattern list pull from TOOL_CLASS 2025-09-22 22:44:59 +00:00
c183da951a Modified QA met complete check before wafer counter to only apply to FQA location scans 2025-09-22 22:20:25 +00:00
9d6c4c154f Modified ApplyQA100PercentADE service to delete the @VM delimited test instead of just clearing it. 2025-09-22 14:31:06 -07:00
18f17f1d77 Add surf scan recipes to PSN JSON 2025-09-22 09:06:42 -07:00
4020095d79 Making Daniel's suggested changes -.- 2025-09-19 16:37:53 +00:00
422dc69da7 Added in checking that QA stage exists. This allows for lack of QA stage measurements 2025-09-19 16:37:53 +00:00
a0897d19df Add PSN MET test recipes and patterns to JSON 2025-09-18 23:57:07 +00:00
8c11300455 removed makeup wafer qa met check until a new solution is ready 2025-09-18 12:36:28 -07:00
537d46ba21 Bugfix Commit 2025-09-17 12:01:08 -07:00
9dcead4eff Modfified IQS_HGCV_ALARM Nica order trigger to not also check for active CHANGEOVER orders before triggering 2025-09-17 09:09:35 -07:00
0872e88869 Merged PR 25852: Temporary fix to address false positives for missing QA tests
Temporary fix to address false positives for missing QA tests
2025-09-16 00:03:32 +00:00
c316aa9164 Swapped Count with DCount 2025-09-15 12:31:13 -07:00
ed6f6cfc0d Merged PR 25836: Weekend Bug Fixes
1. Change to exlude on-hold WMO's from showing up as available.
2. Change to Test Run Services -> Get Test Runs By Username to not utilize the @DICT variable in a btree extract.

Related work items: #325597
2025-09-15 16:42:20 +00:00
f1316d0e8f Bumped the case statement for closed above the hot flag to ensure closed hot events are colored accordingly 2025-09-12 13:39:13 -07:00
487246af46 Removed unnecessary code in GetRDSKeys 2025-09-12 11:32:07 -07:00
3acaf60a5f replaced global variables with local variables to prevent dictionary getting clobbered 2025-09-11 13:27:31 -07:00
26198b343a Merged PR 25502: Test Wafer Stat view
Declare new service GetTestRuns.

Commit final changes.

Related work items: #294890
2025-09-10 21:47:21 +00:00
30372169ba added scrape routines for the TEST_WAFER_PROD (i.e., PRODUCT) table 2025-09-10 12:21:49 -07:00
557221c0d3 Removed WO_MAT_QA write action block event emails. Removed failure to unlock emails from obj_Tables. 2025-09-08 14:43:40 -07:00
e09912b8bb Merged PR 25255: Status Indicator for Open RTF in OI
Adding a status for all lot types for an Open Return TO Fab Record.
2025-09-08 16:30:20 +00:00
993c812252 updated the WM_OUT form to accept barcode scans for the key id 2025-09-03 16:52:26 -07:00
464a1adebd updated obj_Post_Log(Post) to notify FI if an error is encountered and continue processing other records 2025-09-03 15:56:08 -07:00
3211eb5593 modified react item calculated description to output even if susceptor size is null 2025-09-03 14:12:14 -07:00
981840fd95 Bypass validation for REACT_ITEMs being retired. 2025-09-03 13:15:58 -07:00
7ec010b03f Modified validation to allow ASM parts to be installed into ASM+ reactors 2025-08-28 14:38:42 -07:00
2fa985137f restoring HgCV pattern on the control plan 2025-08-28 18:17:30 +00:00
c30bb96972 Merged PR 24620: WO Hierarchy Record Gathering
Created methods to get all record found in the hierarchy of WO's

Related work items: #313450
2025-08-28 18:08:06 +00:00
a196bffd41 Add errors last 2025-08-28 09:37:39 -07:00
47405863d7 added properties in Work_Order_Services('ConvertRecordToJSON') 2025-08-27 15:54:42 -07:00
5d1b1f254e removed unused ri-part-type options 2025-08-27 15:52:59 -07:00
d6894f2fa4 Revert removed Write event code. 2025-08-27 20:59:00 +00:00
63d9fe7964 Replace DATABASE_SERVICES with current prod
version.
2025-08-27 20:59:00 +00:00
8a5c1572e7 Set Reactor wafer size based on installed
susceptor.

Commit to change branches post-UAT 1.

Commit to change branches.

Commit to change branches.

Final changes and re-factor duplicate code.
2025-08-27 20:59:00 +00:00
2eff7c5a37 Implemented suggested changes and added extra error checking 2025-08-27 11:51:15 -07:00
d61ae234c9 ebase 8/22/2025
Modified RDS_Actions to fix RDSNo being unassigned when calling obj_wo_react -> RemRDS

various bug fixes

Re-initializaing branch

Modified RDS_Actions to fix RDSNo being unassigned when calling obj_wo_react -> RemRDS

Added a check prior to running Load logic to check that a reactor is assigned.
2025-08-27 10:13:53 -07:00
cc2213061c Added logging to the Dialog Response Log, and refactored Scheduling services to buffer error message and add to error stack before returning. 2025-08-25 10:29:45 -07:00
056db6326b Made recommended changes. 2025-08-22 13:11:14 -07:00
ea20e6c8a0 Created a basic table and method to write to that table for the purpose of collecting basic data on user dialog responses. 2025-08-22 12:00:02 -07:00
db1624a25b Removed Late column 2025-08-22 10:39:19 -07:00
764603f60b removed wafer counter prompt when converting cassettes 2025-08-21 14:55:03 -07:00
7eacacec8c added two properties to reactor api response 2025-08-21 20:59:49 +00:00
05340fc53a Fix bug where WriteDataRow clears out errors
before the service returns.
2025-08-21 13:12:04 -07:00
105 changed files with 36968 additions and 13605 deletions

View File

@ -5,7 +5,7 @@
},
"body": {
"record1": {
"<1>": "declare function prod_spec_comm\r\ndeclare subroutine forward_event\r\n\r\nforward_event(NewData)\r\nVoid = prod_spec_comm( \"LOAD_TOOL_RECIPE\" )\r\nRETURN 0\r\n"
"<1>": "declare function prod_spec_comm\r\ndeclare subroutine forward_event\r\n\r\nforward_event(NewData)\r\nVoid = prod_spec_comm( \"LOAD_TOOL_RECIPE\" )\r\nVoid = prod_spec_comm( \"LOAD_TOOL_PATTERN\" )\r\nRETURN 0\r\n"
}
}
}

View File

@ -5,7 +5,7 @@
},
"body": {
"record1": {
"<1>": "$INSERT RECIPE_EQU\r\n\r\nDECLARE SUBROUTINE Set_List_Box_data, Set_Property\r\nDECLARE FUNCTION Center_Window, Prod_Spec_Comm\r\n\r\nEQU MI$TOOL\t\t\tTO 1\r\nEQU MI$TYPE\t\t\tTO 2\r\nEQU MI$RECIPE\t\tTO 3\r\nEQU MI$FREQ\t\t\tTO 4\r\nEQU MI$PROVE_TYPE\tTO 5\r\nEQU MI$FIRST_CHECK\tTO 6\r\nEQU MI$LAST_CHECK\tTO 7\r\nEQU MI$SPC\t\t\tTO 8\r\nEQU MI$OVERGROW\t\tTO 9\r\nEQU MI$EXP_TW_QTY\tTO 10\r\nEQU MI$PATTERN\t\tTO 11\r\n\r\nIF INDEX( CreateParam, 'CENTER', 1 ) THEN\r\n void = center_window( @window )\r\nEND ELSE\r\n Void = Set_Property( @window, 'VISIBLE', 1 )\r\nEND\r\n\r\nMeasureInfo\t= FIELD( CreateParam, CHAR(245), 1 )\t\t;* 1st passed parameter\r\n\r\nCtrls = @WINDOW:'.TOOL':@RM\t\t\t\t; Props = 'TEXT':@RM\t\t; Vals = FIELD(MeasureInfo,'~',MI$TOOL):@RM\r\nCtrls := @WINDOW:'.TYPE':@RM\t\t\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$TYPE):@RM\r\nCtrls := @WINDOW:'.RECIPE':@RM\t\t\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$RECIPE):@RM\r\nCtrls := @WINDOW:'.FREQ':@RM\t\t\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$FREQ):@RM\r\nCtrls := @WINDOW:'.PROVE_TYPE':@RM\t\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$PROVE_TYPE):@RM\r\nCtrls := @WINDOW:'.FIRST_CHECK':@RM\t\t\t; Props := 'CHECK':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$FIRST_CHECK):@RM\r\nCtrls := @WINDOW:'.LAST_CHECK':@RM\t\t\t; Props := 'CHECK':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$LAST_CHECK):@RM\r\nCtrls := @WINDOW:'.SPC':@RM\t\t\t\t\t; Props := 'CHECK':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$SPC):@RM\r\nCtrls := @WINDOW:'.OVERGROW':@RM\t\t\t; Props := 'CHECK':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$OVERGROW):@RM\r\nCtrls := @WINDOW:'.EXPECTED_TW_QTY':@RM\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$EXP_TW_QTY):@RM\r\nCtrls := @WINDOW:'.PATTERN'\t\t\t\t\t; Props := 'TEXT'\t\t\t; Vals := FIELD(MeasureInfo,'~',MI$PATTERN)\r\n\r\nSet_Property(Ctrls,Props,Vals)\r\nSet_Property(@WINDOW, '@Controls',Ctrls)\r\nSet_Property(@WINDOW, '@Props',Props)\r\n\r\nType = FIELD(CreateParam,CHAR(245),2)\t\t;* 2nd passed parameter\r\n\r\nIF Type = 'RES' THEN\r\n\tvoid = Set_Property(@WINDOW:'.OVERGROW','VISIBLE',1)\r\nEND ELSE\r\n\tvoid = Set_Property(@WINDOW:'.OVERGROW','VISIBLE',0)\r\nEND\r\n\r\nTypeOut = FIELD(CreateParam,CHAR(245),3)\t\t\t;* 3rd passed parameter\r\n\r\nTitle = Get_Property(@WINDOW,'TEXT')\r\nTitle := TypeOut:' ':Title\r\nSet_Property(@WINDOW,'TEXT',Title)\r\n\r\nSet_List_Box_Data(CtrlEntId)\r\n\r\n\r\nToolList = XLATE('LISTBOX_CONFIG',Type:'MEASURETOOL','','X')\r\nCONVERT @VM TO @FM IN ToolList\r\nSet_Property(@WINDOW:'.TOOL','LIST',ToolList)\r\n\r\nTool = Get_Property(@WINDOW:'.TOOL', 'TEXT' )\r\nCONVERT @LOWER_CASE TO @UPPER_CASE IN Tool\r\n\r\nRecipeList = XLATE( 'LISTBOX_CONFIG', Tool:'_RECIPES', '', 'X' )\r\nCONVERT @VM To @FM IN RecipeList\r\n\r\nIF RecipeList NE '' THEN\r\n\tSet_Property(@WINDOW:'.RECIPE','LIST',RecipeList)\r\nEND\r\n\r\nRETURN 1\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"
"<1>": "$INSERT RECIPE_EQU\r\n$insert TOOL_CLASS_EQUATES\r\n\r\nDECLARE SUBROUTINE Set_List_Box_data, Set_Property\r\nDECLARE FUNCTION Center_Window, Prod_Spec_Comm\r\n\r\nEQU MI$TOOL\t\t\tTO 1\r\nEQU MI$TYPE\t\t\tTO 2\r\nEQU MI$RECIPE\t\tTO 3\r\nEQU MI$FREQ\t\t\tTO 4\r\nEQU MI$PROVE_TYPE\tTO 5\r\nEQU MI$FIRST_CHECK\tTO 6\r\nEQU MI$LAST_CHECK\tTO 7\r\nEQU MI$SPC\t\t\tTO 8\r\nEQU MI$OVERGROW\t\tTO 9\r\nEQU MI$EXP_TW_QTY\tTO 10\r\nEQU MI$PATTERN\t\tTO 11\r\n\r\nIF INDEX( CreateParam, 'CENTER', 1 ) THEN\r\n void = center_window( @window )\r\nEND ELSE\r\n Void = Set_Property( @window, 'VISIBLE', 1 )\r\nEND\r\n\r\nMeasureInfo\t= FIELD( CreateParam, CHAR(245), 1 )\t\t;* 1st passed parameter\r\n\r\nCtrls = @WINDOW:'.TOOL':@RM\t\t\t\t; Props = 'TEXT':@RM\t\t; Vals = FIELD(MeasureInfo,'~',MI$TOOL):@RM\r\nCtrls := @WINDOW:'.TYPE':@RM\t\t\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$TYPE):@RM\r\nCtrls := @WINDOW:'.RECIPE':@RM\t\t\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$RECIPE):@RM\r\nCtrls := @WINDOW:'.FREQ':@RM\t\t\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$FREQ):@RM\r\nCtrls := @WINDOW:'.PROVE_TYPE':@RM\t\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$PROVE_TYPE):@RM\r\nCtrls := @WINDOW:'.FIRST_CHECK':@RM\t\t\t; Props := 'CHECK':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$FIRST_CHECK):@RM\r\nCtrls := @WINDOW:'.LAST_CHECK':@RM\t\t\t; Props := 'CHECK':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$LAST_CHECK):@RM\r\nCtrls := @WINDOW:'.SPC':@RM\t\t\t\t\t; Props := 'CHECK':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$SPC):@RM\r\nCtrls := @WINDOW:'.OVERGROW':@RM\t\t\t; Props := 'CHECK':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$OVERGROW):@RM\r\nCtrls := @WINDOW:'.EXPECTED_TW_QTY':@RM\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$EXP_TW_QTY):@RM\r\nCtrls := @WINDOW:'.PATTERN'\t\t\t\t\t; Props := 'TEXT'\t\t\t; Vals := FIELD(MeasureInfo,'~',MI$PATTERN)\r\n\r\nSet_Property(Ctrls,Props,Vals)\r\nSet_Property(@WINDOW, '@Controls',Ctrls)\r\nSet_Property(@WINDOW, '@Props',Props)\r\n\r\nType = FIELD(CreateParam,CHAR(245),2)\t\t;* 2nd passed parameter\r\n\r\nIF Type = 'RES' THEN\r\n\tvoid = Set_Property(@WINDOW:'.OVERGROW','VISIBLE',1)\r\nEND ELSE\r\n\tvoid = Set_Property(@WINDOW:'.OVERGROW','VISIBLE',0)\r\nEND\r\n\r\nTypeOut = FIELD(CreateParam,CHAR(245),3)\t\t\t;* 3rd passed parameter\r\n\r\nTitle = Get_Property(@WINDOW,'TEXT')\r\nTitle := TypeOut:' ':Title\r\nSet_Property(@WINDOW,'TEXT',Title)\r\n\r\nToolList = XLATE('LISTBOX_CONFIG',Type:'MEASURETOOL','','X')\r\nCONVERT @VM TO @FM IN ToolList\r\nSet_Property(@WINDOW:'.TOOL','LIST',ToolList)\r\n\r\nTool = Get_Property(@WINDOW:'.TOOL', 'TEXT' )\r\nCONVERT @LOWER_CASE TO @UPPER_CASE IN Tool\r\n\r\nRecipeList = XLATE( 'TOOL_CLASS', Tool, TOOL_CLASS_RECIPES$, 'X' )\r\nCONVERT @VM To @FM IN RecipeList\r\n\r\nIF RecipeList NE '' THEN\r\n\tSet_Property(@WINDOW:'.RECIPE','LIST',RecipeList)\r\nEnd\r\n\r\nPatternList = Xlate('TOOL_CLASS', Tool, TOOL_CLASS_PATTERN$, 'X')\r\nCONVERT @VM To @FM IN PatternList\r\n\r\nIf PatternList Ne '' Then\r\n Set_Property(@Window:'.PATTERN', 'LIST', PatternList)\r\nEnd\r\n\r\nRETURN 1\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"
}
}
}

View File

@ -5,7 +5,7 @@
},
"body": {
"record1": {
"<1>": "\r\ndeclare function dialog_box\r\n\r\nRDSNo = Get_Property(@Window : '.RDS_NO', 'TEXT')\r\nReturnVal = dialog_box( 'NDW_LOAD_UNLOAD_EXTRA', @window, RDSNo)\r\n/*\r\nVoid = set_property( @window, '@ExSigWrite', 0 )\r\nOrigExSigInfo = get_property( @window, '@ExSigInfo' )\r\nReturnVal = dialog_box( 'RDS_UNLOAD_LOAD_EX', @window, OrigExSigInfo )\r\nif ReturnVal <> 'CANCEL' and ( ReturnVal <> OrigExSigInfo ) then\r\n Void = set_property( @window, '@ExSigInfo', ReturnVal )\r\n Void = set_property( @window, '@ExSigWrite', 1 )\r\n @@window->savewarn = 1\r\nend\r\n*/\r\nRETURN 0\r\n"
"<1>": "\r\ndeclare function dialog_box, Get_Property\r\ndeclare subroutine Send_Event, Post_Event, Set_Property\r\n\r\nATRECORD = Get_Property(@Window, 'ATRECORD')\r\nRecCheck = @Record\r\n\r\nRDSNo = Get_Property(@Window : '.RDS_NO', 'TEXT')\r\n\r\nIf ATRECORD NE RecCheck then\r\n OrigIOOptions = Get_Property (@Window, \"IOOPTIONS\")\r\n TempIOOptions = OrigIOOptions\r\n TempIOOptions<6> = 1\r\n Set_Property(@Window, 'IOOPTIONS', TempIOOptions)\r\n Send_Event(@Window, 'WRITE')\r\n Set_Property(@Window, 'IOOPTIONS', OrigIOOptions)\r\nend\r\n\r\nReturnVal = dialog_box( 'NDW_LOAD_UNLOAD_EXTRA', @window, RDSNo)\r\nSet_Property(@window, 'SAVEWARN', 0)\r\nPost_Event(@Window, 'READ')\r\n/*\r\nVoid = set_property( @window, '@ExSigWrite', 0 )\r\nOrigExSigInfo = get_property( @window, '@ExSigInfo' )\r\nReturnVal = dialog_box( 'RDS_UNLOAD_LOAD_EX', @window, OrigExSigInfo )\r\nif ReturnVal <> 'CANCEL' and ( ReturnVal <> OrigExSigInfo ) then\r\n Void = set_property( @window, '@ExSigInfo', ReturnVal )\r\n Void = set_property( @window, '@ExSigWrite', 1 )\r\n @@window->savewarn = 1\r\nend\r\n*/\r\nRETURN 0\r\n"
}
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -22604,10 +22604,10 @@
"<2>": {
"<2,1>": {
"<2,1,1>": {
"<2,1,1,1>": "SEND_MESSAGE.MESSAGE_W/ATTACHMENT",
"<2,1,1,2>": "PRINT.CUSTOMER_RDS",
"<2,1,1,3>": "PRINT.FACTORY_LABELS",
"<2,1,1,4>": "UNLOAD/LOAD_EXTRA.SIGNATURE_INFO"
"<2,1,1,1>": "UNLOAD/LOAD_EXTRA.SIGNATURE_INFO",
"<2,1,1,2>": "PRINT.FACTORY_LABELS",
"<2,1,1,3>": "PRINT.CUSTOMER_RDS",
"<2,1,1,4>": "SEND_MESSAGE.MESSAGE_W/ATTACHMENT"
}
},
"<2,2>": {

View File

@ -3591,7 +3591,7 @@
"<22,2>": "",
"<22,3>": "EDITFIELD",
"<22,4>": "RDS_PRE_EPI",
"<22,5>": "366",
"<22,5>": "380",
"<22,6>": "370",
"<22,7>": "132",
"<22,8>": "18",
@ -3731,7 +3731,7 @@
"<23,2>": "",
"<23,3>": "EDITFIELD",
"<23,4>": "RDS_PRE_EPI",
"<23,5>": "505",
"<23,5>": "521",
"<23,6>": "370",
"<23,7>": "84",
"<23,8>": "18",
@ -3871,7 +3871,7 @@
"<24,2>": "",
"<24,3>": "EDITFIELD",
"<24,4>": "RDS_PRE_EPI",
"<24,5>": "593",
"<24,5>": "612",
"<24,6>": "370",
"<24,7>": "75",
"<24,8>": "18",
@ -9835,9 +9835,9 @@
"<56,3>": "PUSHBUTTON",
"<56,4>": "RDS_PRE_EPI",
"<56,5>": "324",
"<56,6>": "370",
"<56,7>": "36",
"<56,8>": "18",
"<56,6>": "368",
"<56,7>": "52",
"<56,8>": "24",
"<56,9>": "Sign",
"<56,10>": {
"<56,10,1>": "0x56000300",
@ -17211,9 +17211,9 @@
"<101,2>": "",
"<101,3>": "GROUPBOX",
"<101,4>": "RDS_PRE_EPI",
"<101,5>": "10",
"<101,5>": "12",
"<101,6>": "268",
"<101,7>": "672",
"<101,7>": "690",
"<101,8>": "129",
"<101,9>": "Pre-Epi Verification",
"<101,10>": {
@ -17917,7 +17917,8 @@
"<1,26,16>": "",
"<1,26,17>": "",
"<1,26,18>": "",
"<1,26,19>": ""
"<1,26,19>": "",
"<1,26,20>": ""
},
"<1,27>": {
"<1,27,1>": "ITEM",
@ -17938,7 +17939,8 @@
"<1,27,16>": "",
"<1,27,17>": "",
"<1,27,18>": "",
"<1,27,19>": ""
"<1,27,19>": "",
"<1,27,20>": ""
},
"<1,28>": {
"<1,28,1>": "POPUP",
@ -18010,9 +18012,9 @@
"<2>": {
"<2,1>": {
"<2,1,1>": {
"<2,1,1,1>": "SEND_MESSAGE.MESSAGE_W/ATTACHMENT",
"<2,1,1,1>": "EDIT.THICKNESS_OVERGROWTH_AVG",
"<2,1,1,2>": "EDIT.SSI_STANDARDS",
"<2,1,1,3>": "EDIT.THICKNESS_OVERGROWTH_AVG"
"<2,1,1,3>": "SEND_MESSAGE.MESSAGE_W/ATTACHMENT"
}
},
"<2,2>": {
@ -18022,7 +18024,17 @@
"<2,2,1,3>": "@WINDOW",
"<2,2,1,4>": "",
"<2,2,1,5>": "",
"<2,2,1,6>": ""
"<2,2,1,6>": "",
"<2,2,1,7>": "",
"<2,2,1,8>": "",
"<2,2,1,9>": "",
"<2,2,1,10>": "",
"<2,2,1,11>": "",
"<2,2,1,12>": "",
"<2,2,1,13>": "",
"<2,2,1,14>": "",
"<2,2,1,15>": "READROW",
"<2,2,1,16>": "0"
},
"<2,2,2>": {
"<2,2,2,1>": "E",
@ -18152,7 +18164,17 @@
"<2,2,16,3>": "@WINDOW",
"<2,2,16,4>": "",
"<2,2,16,5>": "",
"<2,2,16,6>": ""
"<2,2,16,6>": "",
"<2,2,16,7>": "",
"<2,2,16,8>": "",
"<2,2,16,9>": "",
"<2,2,16,10>": "",
"<2,2,16,11>": "",
"<2,2,16,12>": "",
"<2,2,16,13>": "",
"<2,2,16,14>": "",
"<2,2,16,15>": "GEN",
"<2,2,16,16>": "0"
}
},
"<2,3>": {

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,445 @@
{
"header": {
"version": 1,
"type": "record"
},
"body": {
"record1": {
"<1>": "1010",
"<2>": "1",
"<3>": ""
},
"record2": {
"<1>": {
"<1,1>": "WEB_OI_WIZARD",
"<1,2>": "",
"<1,3>": "WINDOW",
"<1,4>": "",
"<1,5>": "0",
"<1,6>": "0",
"<1,7>": "-1184",
"<1,8>": "-761",
"<1,9>": "OI Wizard",
"<1,10>": {
"<1,10,1>": "0x84CF0000",
"<1,10,2>": "0x100"
},
"<1,11>": {
"<1,11,1>": "0xC000",
"<1,11,2>": "0x80000000"
},
"<1,12>": "",
"<1,13>": {
"<1,13,1>": "-2",
"<1,13,2>": "-2",
"<1,13,3>": ""
},
"<1,14>": "",
"<1,15>": "",
"<1,16>": "",
"<1,17>": "",
"<1,18>": {
"<1,18,1>": {
"<1,18,1,1>": "X",
"<1,18,1,2>": "EXECUTE",
"<1,18,1,3>": "@WINDOW_EVENTS",
"<1,18,1,4>": {
"<1,18,1,4,1>": "@SELF",
"<1,18,1,4,2>": "@EVENT",
"<1,18,1,4,3>": "@PARAM1",
"<1,18,1,4,4>": "@PARAM2",
"<1,18,1,4,5>": "@PARAM3",
"<1,18,1,4,6>": "@PARAM4",
"<1,18,1,4,7>": "@PARAM5",
"<1,18,1,4,8>": "@PARAM6"
},
"<1,18,1,5>": "",
"<1,18,1,6>": "",
"<1,18,1,7>": "",
"<1,18,1,8>": "",
"<1,18,1,9>": "",
"<1,18,1,10>": "",
"<1,18,1,11>": "",
"<1,18,1,12>": "",
"<1,18,1,13>": "",
"<1,18,1,14>": "",
"<1,18,1,15>": "COMMEVT",
"<1,18,1,16>": "0"
},
"<1,18,2>": {
"<1,18,2,1>": "X",
"<1,18,2,2>": "EXECUTE",
"<1,18,2,3>": "@WINDOW_EVENTS",
"<1,18,2,4>": {
"<1,18,2,4,1>": "@SELF",
"<1,18,2,4,2>": "@EVENT",
"<1,18,2,4,3>": "@PARAM1",
"<1,18,2,4,4>": "@PARAM2",
"<1,18,2,4,5>": "@PARAM3",
"<1,18,2,4,6>": "@PARAM4",
"<1,18,2,4,7>": "@PARAM5",
"<1,18,2,4,8>": "@PARAM6"
},
"<1,18,2,5>": "",
"<1,18,2,6>": "",
"<1,18,2,7>": "",
"<1,18,2,8>": "",
"<1,18,2,9>": "",
"<1,18,2,10>": "",
"<1,18,2,11>": "",
"<1,18,2,12>": "",
"<1,18,2,13>": "",
"<1,18,2,14>": "",
"<1,18,2,15>": "COMMEVT",
"<1,18,2,16>": "0"
}
},
"<1,19>": {
"<1,19,1>": "CREATE",
"<1,19,2>": "TIMER"
},
"<1,20>": "",
"<1,21>": "",
"<1,22>": "",
"<1,23>": "",
"<1,24>": {
"<1,24,1>": "",
"<1,24,2>": "0",
"<1,24,3>": "0",
"<1,24,4>": "0",
"<1,24,5>": "",
"<1,24,6>": "0",
"<1,24,7>": "",
"<1,24,8>": "",
"<1,24,9>": "",
"<1,24,10>": "0",
"<1,24,11>": "0",
"<1,24,12>": "0",
"<1,24,13>": "0",
"<1,24,14>": "0",
"<1,24,15>": "0",
"<1,24,16>": "0",
"<1,24,17>": "0"
},
"<1,25>": "",
"<1,26>": "",
"<1,27>": "",
"<1,28>": "",
"<1,29>": "",
"<1,30>": "",
"<1,31>": "",
"<1,32>": "",
"<1,33>": "",
"<1,34>": "LSL2*IMAGE*ICO*INFINEON",
"<1,35>": "",
"<1,36>": "",
"<1,37>": {
"<1,37,1>": "0X10001",
"<1,37,2>": "0X10001"
},
"<1,38>": "",
"<1,39>": "",
"<1,40>": "",
"<1,41>": "",
"<1,42>": "",
"<1,43>": "",
"<1,44>": "",
"<1,45>": "",
"<1,46>": "",
"<1,47>": "",
"<1,48>": "",
"<1,49>": "",
"<1,50>": "",
"<1,51>": "",
"<1,52>": "",
"<1,53>": "",
"<1,54>": "",
"<1,55>": "",
"<1,56>": "",
"<1,57>": "",
"<1,58>": "",
"<1,59>": "",
"<1,60>": "",
"<1,61>": "",
"<1,62>": {
"<1,62,1>": "0",
"<1,62,2>": "",
"<1,62,3>": "",
"<1,62,4>": "1",
"<1,62,5>": "0",
"<1,62,6>": "0",
"<1,62,7>": "",
"<1,62,8>": "0.50",
"<1,62,9>": "5.00",
"<1,62,10>": "0.00"
},
"<1,63>": "",
"<1,64>": "",
"<1,65>": "",
"<1,66>": "",
"<1,67>": "",
"<1,68>": "",
"<1,69>": "",
"<1,70>": "",
"<1,71>": "",
"<1,72>": "",
"<1,73>": "",
"<1,74>": "",
"<1,75>": "",
"<1,76>": "",
"<1,77>": "",
"<1,78>": "",
"<1,79>": "",
"<1,80>": "",
"<1,81>": "",
"<1,82>": "",
"<1,83>": "",
"<1,84>": "",
"<1,85>": "",
"<1,86>": "",
"<1,87>": "",
"<1,88>": "",
"<1,89>": "",
"<1,90>": "",
"<1,91>": "",
"<1,92>": "",
"<1,93>": "",
"<1,94>": "",
"<1,95>": "",
"<1,96>": "",
"<1,97>": "",
"<1,98>": "",
"<1,99>": "",
"<1,100>": "",
"<1,101>": "",
"<1,102>": "",
"<1,103>": "",
"<1,104>": "",
"<1,105>": "",
"<1,106>": "0",
"<1,107>": "",
"<1,108>": ""
}
},
"record3": {
"<1>": {
"<1,1>": "WEBVIEW_MAIN",
"<1,2>": "",
"<1,3>": "WEBVIEW",
"<1,4>": "WEB_OI_WIZARD",
"<1,5>": "9",
"<1,6>": "8",
"<1,7>": "1167",
"<1,8>": "745",
"<1,9>": "",
"<1,10>": {
"<1,10,1>": "0x56000000",
"<1,10,2>": "0x0"
},
"<1,11>": {
"<1,11,1>": "0x4",
"<1,11,2>": "0x80000000"
},
"<1,12>": "1",
"<1,13>": {
"<1,13,1>": "-2",
"<1,13,2>": "-2",
"<1,13,3>": ""
},
"<1,14>": "",
"<1,15>": "",
"<1,16>": "",
"<1,17>": "",
"<1,18>": {
"<1,18,1>": {
"<1,18,1,1>": "X",
"<1,18,1,2>": "EXECUTE",
"<1,18,1,3>": "@WINDOW_EVENTS",
"<1,18,1,4>": {
"<1,18,1,4,1>": "@SELF",
"<1,18,1,4,2>": "@EVENT",
"<1,18,1,4,3>": "@PARAM1",
"<1,18,1,4,4>": "@PARAM2",
"<1,18,1,4,5>": "@PARAM3",
"<1,18,1,4,6>": "@PARAM4",
"<1,18,1,4,7>": "@PARAM5",
"<1,18,1,4,8>": "@PARAM6"
},
"<1,18,1,5>": "",
"<1,18,1,6>": "",
"<1,18,1,7>": "",
"<1,18,1,8>": "",
"<1,18,1,9>": "",
"<1,18,1,10>": "",
"<1,18,1,11>": "",
"<1,18,1,12>": "",
"<1,18,1,13>": "",
"<1,18,1,14>": "",
"<1,18,1,15>": "COMMEVT",
"<1,18,1,16>": "0"
},
"<1,18,2>": {
"<1,18,2,1>": "X",
"<1,18,2,2>": "EXECUTE",
"<1,18,2,3>": "@WINDOW_EVENTS",
"<1,18,2,4>": {
"<1,18,2,4,1>": "@SELF",
"<1,18,2,4,2>": "@EVENT",
"<1,18,2,4,3>": "@PARAM1",
"<1,18,2,4,4>": "@PARAM2",
"<1,18,2,4,5>": "@PARAM3",
"<1,18,2,4,6>": "@PARAM4",
"<1,18,2,4,7>": "@PARAM5",
"<1,18,2,4,8>": "@PARAM6"
},
"<1,18,2,5>": "",
"<1,18,2,6>": "",
"<1,18,2,7>": "",
"<1,18,2,8>": "",
"<1,18,2,9>": "",
"<1,18,2,10>": "",
"<1,18,2,11>": "",
"<1,18,2,12>": "",
"<1,18,2,13>": "",
"<1,18,2,14>": "",
"<1,18,2,15>": "COMMEVT",
"<1,18,2,16>": "0"
}
},
"<1,19>": {
"<1,19,1>": "WEBVIEWCREATED",
"<1,19,2>": "WEBNAVIGATED"
},
"<1,20>": "",
"<1,21>": "",
"<1,22>": "",
"<1,23>": "",
"<1,24>": "",
"<1,25>": "",
"<1,26>": "",
"<1,27>": "",
"<1,28>": "",
"<1,29>": "",
"<1,30>": "",
"<1,31>": "",
"<1,32>": "",
"<1,33>": "",
"<1,34>": "",
"<1,35>": "",
"<1,36>": "",
"<1,37>": "",
"<1,38>": "",
"<1,39>": "",
"<1,40>": "",
"<1,41>": "",
"<1,42>": "",
"<1,43>": "",
"<1,44>": "",
"<1,45>": "",
"<1,46>": "",
"<1,47>": "",
"<1,48>": "",
"<1,49>": "",
"<1,50>": "",
"<1,51>": "",
"<1,52>": "",
"<1,53>": "",
"<1,54>": "",
"<1,55>": "",
"<1,56>": "",
"<1,57>": "",
"<1,58>": {
"<1,58,1>": "1",
"<1,58,2>": "1",
"<1,58,3>": "1",
"<1,58,4>": "1",
"<1,58,5>": "1",
"<1,58,6>": "0",
"<1,58,7>": "1",
"<1,58,8>": "1",
"<1,58,9>": "1",
"<1,58,10>": "1",
"<1,58,11>": "1",
"<1,58,12>": "1",
"<1,58,13>": "1"
},
"<1,59>": "",
"<1,60>": "",
"<1,61>": "",
"<1,62>": "",
"<1,63>": "",
"<1,64>": "",
"<1,65>": "",
"<1,66>": "",
"<1,67>": "",
"<1,68>": "",
"<1,69>": "",
"<1,70>": "",
"<1,71>": "",
"<1,72>": "",
"<1,73>": "",
"<1,74>": "",
"<1,75>": "",
"<1,76>": "",
"<1,77>": "",
"<1,78>": "",
"<1,79>": "",
"<1,80>": "",
"<1,81>": "",
"<1,82>": "",
"<1,83>": "",
"<1,84>": "",
"<1,85>": "",
"<1,86>": "",
"<1,87>": "",
"<1,88>": "",
"<1,89>": "",
"<1,90>": "",
"<1,91>": "",
"<1,92>": "",
"<1,93>": "",
"<1,94>": {
"<1,94,1>": "",
"<1,94,2>": "",
"<1,94,3>": "",
"<1,94,4>": "0",
"<1,94,5>": "",
"<1,94,6>": "",
"<1,94,7>": "0",
"<1,94,8>": "",
"<1,94,9>": "0",
"<1,94,10>": "0"
},
"<1,95>": {
"<1,95,1>": "0",
"<1,95,2>": "0",
"<1,95,3>": "0",
"<1,95,4>": "0",
"<1,95,5>": "0",
"<1,95,6>": "0",
"<1,95,7>": "0",
"<1,95,8>": "0",
"<1,95,9>": "0",
"<1,95,10>": "0",
"<1,95,11>": "0"
},
"<1,96>": "",
"<1,97>": "",
"<1,98>": "",
"<1,99>": "",
"<1,100>": "",
"<1,101>": "",
"<1,102>": "",
"<1,103>": "",
"<1,104>": "",
"<1,105>": "",
"<1,106>": "",
"<1,107>": "",
"<1,108>": ""
}
},
"record4": {
"<1>": ""
}
}
}

View File

@ -43,6 +43,10 @@
"<8,3>": {
"<8,3,1>": "Update RDS Layer Parameters",
"<8,3,2>": "UPDATE_RDS_LAYER"
},
"<8,4>": {
"<8,4,1>": "Update RDS Test Specs",
"<8,4,2>": "UPDATE_RDS_TEST"
}
},
"<9>": {

View File

@ -122,8 +122,12 @@
"<8,23,1>": "PSV",
"<8,23,2>": "Pre Ship Verification"
},
"<8,24>": "",
"<8,25>": ""
"<8,24>": {
"<8,24,1>": "RTF",
"<8,24,2>": "Return To Fab Active"
},
"<8,25>": "",
"<8,26>": ""
},
"<9>": {
"<9,1>": {
@ -141,14 +145,6 @@
"<9,2,4>": "C",
"<9,2,5>": "",
"<9,2,6>": "Current Status Description"
},
"<9,3>": {
"<9,3,1>": "",
"<9,3,2>": "",
"<9,3,3>": "",
"<9,3,4>": "",
"<9,3,5>": "",
"<9,3,6>": ""
}
},
"<10>": "L",
@ -175,8 +171,18 @@
"<31>": "0",
"<32>": "0",
"<33>": "0",
"<34>": "16777215",
"<35>": "16777215"
"<34>": "-2",
"<35>": "-2",
"<36>": "",
"<37>": "",
"<38>": "",
"<39>": "",
"<40>": "-2",
"<41>": "1000",
"<42>": "",
"<43>": "",
"<44>": "",
"<45>": ""
}
}
}

View File

@ -9,7 +9,7 @@
"<2>": "-1",
"<3>": "-1",
"<4>": "-1",
"<5>": "16777215",
"<5>": "-2",
"<6>": {
"<6,1>": {
"<6,1,1>": "Tahoma",
@ -41,28 +41,8 @@
"<8,2,2>": "High Thruput"
},
"<8,3>": {
"<8,3,1>": "K2K",
"<8,3,2>": "Kit 2000"
},
"<8,4>": {
"<8,4,1>": "EPP",
"<8,4,2>": " EpiPro"
},
"<8,5>": {
"<8,5,1>": "GAN",
"<8,5,2>": "GaN"
},
"<8,6>": {
"<8,6,1>": "STD",
"<8,6,2>": "Standard"
},
"<8,7>": {
"<8,7,1>": "HD",
"<8,7,2>": "Heavy Duty"
},
"<8,8>": {
"<8,8,1>": "SCADA",
"<8,8,2>": "Prototype"
"<8,3,1>": "EPP",
"<8,3,2>": " EpiPro"
}
},
"<9>": {
@ -108,7 +88,17 @@
"<32>": "0",
"<33>": "1",
"<34>": "16777215",
"<35>": "16777215"
"<35>": "16777215",
"<36>": "",
"<37>": "",
"<38>": "",
"<39>": "",
"<40>": "-2",
"<41>": "1000",
"<42>": "",
"<43>": "",
"<44>": "",
"<45>": ""
}
}
}

View File

@ -130,7 +130,11 @@
"<8,25,1>": "PSV",
"<8,25,2>": "Pre Ship Verification"
},
"<8,26>": ""
"<8,26>": {
"<8,26,1>": "RTF",
"<8,26,2>": "Return To Fab Active"
},
"<8,27>": ""
},
"<9>": {
"<9,1>": {
@ -174,8 +178,18 @@
"<31>": "0",
"<32>": "0",
"<33>": "0",
"<34>": "16777215",
"<35>": "16777215"
"<34>": "-2",
"<35>": "-2",
"<36>": "",
"<37>": "",
"<38>": "",
"<39>": "",
"<40>": "-2",
"<41>": "1000",
"<42>": "",
"<43>": "",
"<44>": "",
"<45>": ""
}
}
}

View File

@ -9,7 +9,7 @@
"<2>": "-1",
"<3>": "-1",
"<4>": "-1",
"<5>": "16777215",
"<5>": "-2",
"<6>": {
"<6,1>": {
"<6,1,1>": "Tahoma",
@ -43,39 +43,19 @@
"<8,2,3>": "High Thruput"
},
"<8,3>": {
"<8,3,1>": "4",
"<8,3,1>": "5",
"<8,3,2>": "HTR",
"<8,3,3>": "High Thruput"
},
"<8,4>": {
"<8,4,1>": "5",
"<8,4,2>": "HTR",
"<8,4,3>": "High Thruput"
"<8,4,1>": "8",
"<8,4,2>": "EPP",
"<8,4,3>": "EpiPro"
},
"<8,5>": {
"<8,5,1>": "8",
"<8,5,1>": "18",
"<8,5,2>": "EPP",
"<8,5,3>": "EpiPro"
},
"<8,6>": {
"<8,6,1>": "18",
"<8,6,2>": "EPP",
"<8,6,3>": "EpiPro"
},
"<8,7>": {
"<8,7,1>": "24",
"<8,7,2>": "EPP",
"<8,7,3>": "EpiPro"
},
"<8,8>": {
"<8,8,1>": "5",
"<8,8,2>": "GAN",
"<8,8,3>": "G5+"
},
"<8,9>": {
"<8,9,1>": "8",
"<8,9,2>": "GAN",
"<8,9,3>": "G5"
}
},
"<9>": {
@ -129,7 +109,17 @@
"<32>": "0",
"<33>": "1",
"<34>": "16777215",
"<35>": "16777215"
"<35>": "16777215",
"<36>": "",
"<37>": "",
"<38>": "",
"<39>": "",
"<40>": "-2",
"<41>": "1000",
"<42>": "",
"<43>": "",
"<44>": "",
"<45>": ""
}
}
}

View File

@ -9,7 +9,7 @@
"<2>": "-1",
"<3>": "-1",
"<4>": "-1",
"<5>": "16777215",
"<5>": "-2",
"<6>": {
"<6,1>": {
"<6,1,1>": "Tahoma",
@ -33,32 +33,12 @@
"<7>": "",
"<8>": {
"<8,1>": {
"<8,1,1>": "35",
"<8,1,2>": "35 inch EpiPro"
"<8,1,1>": "8",
"<8,1,2>": "200mm 8 in"
},
"<8,2>": {
"<8,2,1>": "18",
"<8,2,2>": "18 inch HTR"
},
"<8,3>": {
"<8,3,1>": "15",
"<8,3,2>": "15 inch HTR"
},
"<8,4>": {
"<8,4,1>": "8",
"<8,4,2>": "8 inch 200mm"
},
"<8,5>": {
"<8,5,1>": "6",
"<8,5,2>": "6 inch 150mm"
},
"<8,6>": {
"<8,6,1>": "5",
"<8,6,2>": "5 inch 125mm"
},
"<8,7>": {
"<8,7,1>": "4",
"<8,7,2>": "4 inch 100mm"
"<8,2,1>": "6",
"<8,2,2>": "150mm 6 in"
}
},
"<9>": {
@ -104,7 +84,17 @@
"<32>": "0",
"<33>": "1",
"<34>": "16777215",
"<35>": "16777215"
"<35>": "16777215",
"<36>": "",
"<37>": "",
"<38>": "",
"<39>": "",
"<40>": "-2",
"<41>": "1000",
"<42>": "",
"<43>": "",
"<44>": "",
"<45>": ""
}
}
}

View File

@ -9,7 +9,7 @@
"<2>": "-2",
"<3>": "-1",
"<4>": "-1",
"<5>": "16777215",
"<5>": "-2",
"<6>": {
"<6,1>": {
"<6,1,1>": "MS Sans Serif",
@ -105,6 +105,10 @@
"<8,19>": {
"<8,19,1>": "PACK",
"<8,19,2>": "Loaded in PT Out"
},
"<8,20>": {
"<8,20,1>": "RTF",
"<8,20,2>": "Return To Fab Active"
}
},
"<9>": {
@ -123,14 +127,6 @@
"<9,2,4>": "C",
"<9,2,5>": "",
"<9,2,6>": "Current Status Description"
},
"<9,3>": {
"<9,3,1>": "",
"<9,3,2>": "",
"<9,3,3>": "",
"<9,3,4>": "",
"<9,3,5>": "",
"<9,3,6>": ""
}
},
"<10>": "L",
@ -158,7 +154,17 @@
"<32>": "0",
"<33>": "1",
"<34>": "16777215",
"<35>": "16777215"
"<35>": "16777215",
"<36>": "",
"<37>": "",
"<38>": "",
"<39>": "",
"<40>": "-2",
"<41>": "1000",
"<42>": "",
"<43>": "",
"<44>": "",
"<45>": ""
}
}
}

View File

@ -9,7 +9,7 @@
"<2>": "-2",
"<3>": "-1",
"<4>": "-1",
"<5>": "16777215",
"<5>": "-2",
"<6>": {
"<6,1>": {
"<6,1,1>": "MS Sans Serif",
@ -189,6 +189,10 @@
"<8,40>": {
"<8,40,1>": "PACK",
"<8,40,2>": "Loaded in PT Out"
},
"<8,41>": {
"<8,41,1>": "RTF",
"<8,41,2>": "Return To Fab Active"
}
},
"<9>": {
@ -207,14 +211,6 @@
"<9,2,4>": "C",
"<9,2,5>": "",
"<9,2,6>": "Current Status Description"
},
"<9,3>": {
"<9,3,1>": "",
"<9,3,2>": "",
"<9,3,3>": "",
"<9,3,4>": "",
"<9,3,5>": "",
"<9,3,6>": ""
}
},
"<10>": "L",
@ -242,7 +238,17 @@
"<32>": "0",
"<33>": "1",
"<34>": "16777215",
"<35>": "16777215"
"<35>": "16777215",
"<36>": "",
"<37>": "",
"<38>": "",
"<39>": "",
"<40>": "-2",
"<41>": "1000",
"<42>": "",
"<43>": "",
"<44>": "",
"<45>": ""
}
}
}

View File

@ -27,17 +27,22 @@ $Insert SERVICE_SETUP
$Insert APP_INSERTS
$Insert REVDOTNETEQUATES
Declare function Logging_Services, Environment_Services, Active_Directory_Services
Declare subroutine Set_Property.Net, Logging_Services, Set_Status, Database_Services
Declare function Logging_Services, Environment_Services, Active_Directory_Services, Database_Services
Declare function Error_Services, SRP_Array
Declare subroutine Set_Property.Net, Logging_Services, Set_Status, Database_Services, Error_Services
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\ActiveDirectory'
LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS')
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ActiveDirectoryAuthLog.csv'
Headers = 'Logging DTM' : @FM : 'Username' : @FM : 'Authenticated'
objADAuthLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ActiveDirectoryAuthenticationLog.csv'
Headers = 'Logging DTM' : @FM : 'Username' : @FM : 'Authenticated'
objADAuthenticationLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ActiveDirectoryAuthorizationLog.csv'
Headers = 'Logging DTM' : @FM : 'Username' : @FM : 'Authorized'
objADAuthorizationLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ActiveDirectoryLog.csv'
Headers = 'Logging DTM' : @FM : 'Operation' : @FM : 'Message'
@ -83,12 +88,43 @@ Service AuthenticateUser(Username, Password, Domain)
LogData<1> = LoggingDTM
LogData<2> = Username
LogData<3> = Authenticated
Logging_Services('AppendLog', objADAuthLog, LogData, @RM, @FM, False$)
Logging_Services('AppendLog', objADAuthenticationLog, LogData, @RM, @FM, False$)
Response = Authenticated
end service
Service AuthorizeUser(Username, Domain)
ErrorMsg = ''
Authorized = False$
If ( (Username NE '') and (Domain NE '') ) then
AuthAdGroups = ''
LoginConfig = Database_Services('ReadDataRow', 'SYSENV', 'CFG_LOGIN*LSL2')
If Error_Services('NoError') then
AuthAdGroups<-1> = LoginConfig<2>
AuthAdGroups<-1> = LoginConfig<3>
AuthAdGroups<-1> = LoginConfig<4>
UserAdGroups = Active_Directory_Services('GetADGroups', Username, Domain)
MemberOfAuthGroups = SRP_Array('Join', UserAdGroups, AuthAdGroups, 'AND', @FM)
Authorized = (MemberOfAuthGroups NE '')
end else
ErrorMsg = 'Error in ':Service:' service. Error retrieving active directory authorization groups.'
end
end else
ErrorMsg = 'Error in ':Service:' service. Username and domain required.'
end
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = Username
LogData<3> = Authorized
Logging_Services('AppendLog', objADAuthorizationLog, LogData, @RM, @FM, False$)
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
Response = Authorized
end service
Service GetADGroups(Username, Domain)
ADGroups = ''
@ -143,7 +179,6 @@ Service GetADGroups(Username, Domain)
End Service
Service GetComputerDomain()
Domain = ''
@ -166,6 +201,7 @@ Service GetComputerDomain()
end service
//----------------------------------------------------------------------------------------------------------------------
// GetADGroupsByString
//
@ -303,8 +339,10 @@ Service GetADGroupsByString(SearchString, Domain=DOMAIN, SearchByDescription=DES
end
Response = ADGroups
end service
//----------------------------------------------------------------------------------------------------------------------
// GetADGroupMembersByGroupDescription
//
@ -319,6 +357,7 @@ end service
// 9/26/2024 - [JRO] Initial Programmer.
//----------------------------------------------------------------------------------------------------------------------
Service GetADGroupMembersByGroupDescription(DescriptionName, Domain=DOMAIN)
Set_Status(0)
ErrMessage = ''
GroupUsers = ''
@ -397,8 +436,10 @@ Service GetADGroupMembersByGroupDescription(DescriptionName, Domain=DOMAIN)
Error_Services('Add', ErrMessage)
end
Response = GroupUsers
end service
//----------------------------------------------------------------------------------------------------------------------
// GetADGroupMembersByGroupName
//
@ -413,6 +454,7 @@ end service
// 9/26/2024 - [JRO] Initial Programmer.
//----------------------------------------------------------------------------------------------------------------------
Service GetADGroupMembersByGroupName(GroupName, Domain=DOMAIN)
Set_Status(0)
Users = ''
ErrMessage = ''
@ -501,8 +543,10 @@ Service GetADGroupMembersByGroupName(GroupName, Domain=DOMAIN)
Error_Services('Add', ErrMessage)
end
Response = Users
end service
//----------------------------------------------------------------------------------------------------------------------
// GetADUserAttributes
//
@ -513,6 +557,7 @@ end service
// First value is the AD User Name, Second value is the Display Name, and third value is the email.
//----------------------------------------------------------------------------------------------------------------------
Service GetADUserAttributes(Username, Domain=DOMAIN)
Set_Status(0)
ThisUser = ''
ErrMessage = ''
@ -593,5 +638,6 @@ Service GetADUserAttributes(Username, Domain=DOMAIN)
Error_Services('Add', ErrMessage)
end
Response = ThisUser
end service

View File

@ -1,85 +1,261 @@
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
$Insert WO_LOG_EQUATES
$Insert RDS_EQUATES
$Insert REACT_RUN_EQUATES
$Insert RDS_LAYER_EQUATES
$Insert RDS_TEST_EQUATES
$Insert ARCHIVE_EQUATES
EQU COMMA$ To ','
Declare subroutine Change_Log_Services, Logging_Services, Error_Services, Database_Services
Declare function SRP_Datetime, Logging_Services, Environment_Services, Datetime
Declare function Database_Services, Wo_Mat_Services, Error_Services, RDS_Services
Declare function WM_In_Services, WM_Out_Services
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 GetWORelatedRecord(WOLogId)
ErrorMsg = ''
If WOLogId NE '' then
If RowExists('WO_LOG', WOLogId) then
WOLogRec = Database_Services('ReadDataRow', 'WO_LOG', WOLogId, True$, 0, False$)
If Error_Services('NoError') then
ArchiveRecordId = 'WO_LOG*' : WOLogId
ArchiveRecord = ''
WOMatKeys = Wo_Mat_Services('GetWOMatKeys', WOLogId)
If Error_Services('NoError') then
WOMatQAKeys = WOMatKeys
WOStepKey = WOLogRec<WO_LOG_WO_STEP_KEY$>
WMInKeys = Wm_In_Services('GetWMInKeys', WOLogId)
if Error_Services('NoError') then
WMOutKeys = Wm_Out_Services('GetWMOutKeys', WOLogId)
if Error_Services('NoError') then
RDSKeys = RDS_Services('GetRDSKeys', WOLogId)
if Error_Services('NoError') then
ReactRunKeys = RDSKeys
RDSLayerKeys = ''
CleanInspKeys = ''
for each ReactRunKey in ReactRunKeys using @VM setting iPos
ReactRunRec = Database_Services('ReadDataRow', 'REACT_RUN', ReactRunKey, True$, 0, False$)
If Error_Services('NoError') then
CleanInspKeys<1, -1> = ReactRunRec<REACT_RUN_CI_NO$>
RDSLayerKeys<1, -1> = ReactRunRec<REACT_RUN_RDS_LAYER_KEYS$>
end else
ErrorMsg = Error_Services('GetMessage')
end
Next ReactRunKey
RDSTestKeys = ''
If ErrorMsg EQ '' then
For each RDSLayerKey in RDSLayerKeys using @VM
RDSLayerRec = Database_Services('ReadDataRow', 'RDS_LAYER', RDSLayerKey, True$, 0, False$)
If Error_Services('NoError') then
RDSTestKeys<1, -1> = RDSLayerRec<RDS_LAYER_RDS_TEST_KEYS$>
end else
ErrorMsg = Error_Services('GetMessage')
end
Next RDSLayerKey
TWUseKeys = ''
end
TWUseKeys = ''
If ErrorMsg EQ '' then
for each RDSTestKey in RDSTestKeys using @VM
RDSTestRec = Database_Services('ReadDataRow', 'RDS_TEST', RDSTestKey, True$, 0, False$)
If Error_Services('NoError') then
TWUseKeys<1,-1> = RDSTestRec<RDS_TEST_TW_USE_ID$>
end else
ErrorMsg = Error_Services('GetMessage')
end
Next RDSTestKey
end
If ErrorMsg EQ '' then
//ArchiveRecord
//WOLogId
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = WOLogId
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'WO_LOG'
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
//WOStepKey
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = WOStepKey
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'WO_STEP'
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
//WOMatKeys
for each WOMatKey in WOMatKeys using @VM
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = WOMatKey
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'WO_MAT'
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
Next WOMatKey
//WOMatQAKeys
for each WOMatQAKey in WOMatQAKeys using @VM
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = WOMatQAKey
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'WO_MAT_QA'
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
Next WOMatQAKey
//WMInKeys (EpiPro Specific)
for each WMInKey in WMInKeys using @VM
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = WMInKey
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'WM_IN'
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
Next WMInKey
//WMOutKeys (EpiPro Specific)
for each WMOutKey in WMOutKeys using @VM
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = WMOutKey
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'WM_OUT'
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
Next WMOutKey
//RDSKeys
for each RDSKey in RDSKeys using @VM
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = RDSKey
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'RDS'
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
Next RDSKey
//ReactRunKeys
for each ReactRunKey in ReactRunKeys using @VM
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = ReactRunKey
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'REACT_RUN'
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
Next ReactRunKey
//RDSLayerKeys
for each RDSLayerKey in RDSLayerKeys using @VM
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = RDSLayerKey
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'RDS_LAYER'
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
Next RDSLayerKey
//CleanInspKeys
for each CleanInspKey in CleanInspKeys using @VM
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = CleanInspKey
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'CLEAN_INSP'
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
Next CleanInspKey
//RDSTestKeys
for each RDSTestKey in RDSTestKeys using @VM
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = RDSTestKey
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'RDS_TEST'
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
Next RDSTestKey
//TWUseKeys
for each TWUseKey in TWUseKeys using @VM
if TWUseKey NE '' then
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = TWUseKey
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'TW_USE'
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
end
Next TWUseKey
Database_Services('WriteDataRow', 'ARCHIVE', ArchiveRecordId, ArchiveRecord)
If Error_Services('HasError') then
ErrorMsg = Error_Services('GetMessage')
end
end
end else
ErrorMsg = Error_Services('GetMessage')
end
end else
ErrorMsg = Error_Services('GetMessage')
end
end else
ErrorMsg = Error_Services('GetMessage')
end
end else
ErrorMsg = Error_Services('GetMessage')
end
end else
ErrorMsg = Error_Services('GetMessage')
end
end else
ErrorMsg = 'WO_LOG record not found in WO_LOG table.'
end
end else
ErrorMsg = 'WO_LOG ID was null.'
end
If ErrorMsg NE '' then
Error_Services('Add', ErrorMsg)
end
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

@ -231,15 +231,9 @@ RETURN
* * * * * * *
Read:
* * * * * * *
WMOKey = Get_Property(@WINDOW,'ID')
IF RowExists('WM_OUT',WMOKey) THEN
*IF NOT(Security_Check('Work Order',READ$)) THEN
* Send_Event(@WINDOW,'CLEAR')
* Security_Err_Msg('Work Order',READ$)
* RETURN
*END
END ELSE
IF Not(RowExists('WM_OUT',WMOKey)) THEN
ErrMsg('WM_OUT entries may only be created from the Work Order Release process.')
Send_Event(@WINDOW,'CLEAR')
RETURN
@ -382,11 +376,11 @@ return
* * * * * * *
WONoLF:
* * * * * * *
WONo = Get_Property(@WINDOW:'.WO_NO','DEFPROP')
Convert @Lower_Case to @Upper_Case in WONo
Convert 'O' to '' in WONo
IF INDEX(WONo,'.',1) > 0 THEN
CONVERT '.' TO '*' IN WONo
Set_Property(@WINDOW:'.WO_NO','DEFPROP','')
obj_AppWindow('LoadFormKeys',@WINDOW:@RM:WONo)
@ -1768,22 +1762,8 @@ AddMakeup:
AvailMU_WMOKeys = ''
UserResp = Response
MakeupBox = ''
// User requested to convert the current cassette into a makeup box.
// Verify the quantity before proceeding.
If WMOutKey NE '' then
Parms = ''
Parms<1> = WMOutKey ; // Cassette to verify wafer count of.
Parms<2> = 0 ; // Wafer count adjustment - 0 because converting box.
Parms<3> = 'MU' ; // Wafer counter tool location
Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms)
If Proceed NE True$ then Return
end else
ErrMsg('Error starting wafer counter check. WM_OUT key is missing.')
end
CheckValue = 1
MakeupBox = ''
CheckValue = 1
FieldNo = WO_MAT_EPO_MAKEUP_BOX$
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue) ;* Set WMO_MAKEUP flag on WM_OUT
@ -2000,51 +1980,42 @@ MakeupClick:
End Case
If Not(InvalidRequest) then
Parms = ''
Parms<1> = WMOKey ; // Cassette to verify wafer count of.
Parms<2> = 0 ; // Wafer count adjustment - 0 because converting box.
Parms<3> = 'MU' ; // Wafer counter tool location
Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms)
If Proceed EQ True$ then
Send_Event(CtrlEnt,'GOTFOCUS')
OrgMUPart = XLATE('WM_OUT',WMOKey,'MU_PART_NO','X')
// Log the makeup flag change
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = WONo:'*':ProcStepNo:'*':CassNo
LogData<3> = CheckValue
LogData<4> = @User4
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
Send_Event(@WINDOW,'WRITE') ;************* 6/30/2010
FieldNo = WO_MAT_EPO_MAKEUP_BOX$
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue)
IF Get_Status(errCode) THEN ErrMsg(errCode)
* Added 10/11/2010 JCH
NewMUPart = XLATE('WM_OUT',WMOKey,'MU_PART_NO','X')
IndexTransactionRow = 'MU_PART_NO':@FM:WMOKey:@FM:OrgMUPart:@FM:NewMUPart:@FM
OPEN "!WM_OUT" TO BangTable THEN
LOCK BangTable, 0 THEN
READ PendingTrans FROM BangTable, 0 ELSE PendingTrans = '0':@FM
PendingTrans := IndexTransactionRow
WRITE PendingTrans ON BangTable, 0 ELSE
ErrMsg('Unable to write index transaction to !WM_OUT. ':WMOutKey)
END
UNLOCK BangTable, 0 ELSE ErrMsg('Unable to Unlock !WM_OUT while adding index transaction. ':WMOutKey)
END ELSE
ErrMsg('Unable to Lock !WM_OUT to add index transaction. ':WMOutKey)
Send_Event(CtrlEnt,'GOTFOCUS')
OrgMUPart = XLATE('WM_OUT',WMOKey,'MU_PART_NO','X')
// Log the makeup flag change
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = WONo:'*':ProcStepNo:'*':CassNo
LogData<3> = CheckValue
LogData<4> = @User4
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
Send_Event(@WINDOW,'WRITE') ;************* 6/30/2010
FieldNo = WO_MAT_EPO_MAKEUP_BOX$
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue)
IF Get_Status(errCode) THEN ErrMsg(errCode)
* Added 10/11/2010 JCH
NewMUPart = XLATE('WM_OUT',WMOKey,'MU_PART_NO','X')
IndexTransactionRow = 'MU_PART_NO':@FM:WMOKey:@FM:OrgMUPart:@FM:NewMUPart:@FM
OPEN "!WM_OUT" TO BangTable THEN
LOCK BangTable, 0 THEN
READ PendingTrans FROM BangTable, 0 ELSE PendingTrans = '0':@FM
PendingTrans := IndexTransactionRow
WRITE PendingTrans ON BangTable, 0 ELSE
ErrMsg('Unable to write index transaction to !WM_OUT. ':WMOutKey)
END
UNLOCK BangTable, 0 ELSE ErrMsg('Unable to Unlock !WM_OUT while adding index transaction. ':WMOutKey)
END ELSE
ErrMsg('Unable to Open !WM_OUT to add index transaction. ':WMOutKey)
ErrMsg('Unable to Lock !WM_OUT to add index transaction. ':WMOutKey)
END
* End of 10/11/2010 update
end else
InvalidRequest = True$
end
END ELSE
ErrMsg('Unable to Open !WM_OUT to add index transaction. ':WMOutKey)
END
* End of 10/11/2010 update
end
end else
InvalidRequest = True$

View File

@ -646,7 +646,7 @@ MakeUpClick:
Set_Property(@WINDOW,'SAVEWARN', False$)
Send_Event(@WINDOW,'CLEAR')
If (CheckValue EQ True$) then
Wo_Mat_Services('MakeupFlagOn', RDSNo)
Wo_Mat_Services('MakeupFlagOn', WOMatKey)
end
end
end else
@ -815,3 +815,4 @@ BatchFixit:
RETURN

View File

@ -811,18 +811,6 @@ AddMakeup:
MakeupBox = ''
// User requested to convert the current cassette into a makeup box.
// Verify the quantity before proceeding.
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
If RDSNo NE '' then
Parms = ''
Parms<1> = RDSNo ; // Cassette to verify wafer count of.
Parms<2> = 0 ; // Wafer count adjustment - 0 because converting box.
Parms<3> = 'MU' ; // Wafer counter tool location
Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms)
If Proceed NE True$ then return
end else
ErrMsg('Error starting wafer counter check. RDS No is missing.')
end
RDSNo = Get_Property(@Window : '.RDS_NO', 'TEXT') ; // Get the RDS No now before the WRITE in case it is needed to toggle the index.
@ -839,7 +827,8 @@ AddMakeup:
ErrMsg('Unable to set makeup flag until Unload stage is signed.')
Return
END else
Wo_Mat_Services('MakeupFlagOn', RDSNo)
Wo_Mat_Services('MakeupFlagOn', WOMatKey)
If Error_Services('HasError') then ErrMsg(Error_Services('GetMessage'))
end
end
@ -1066,37 +1055,23 @@ MakeUpLot:
End Case
If Not(InvalidRequest) then
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
EpiCheck = Rds_Services('IsEpiPro', RDSNo)
If RDSNo NE '' then
Parms = ''
Parms<1> = RDSNo ; // Cassette to verify wafer count of.
Parms<2> = 0 ; // Wafer count adjustment - 0 because converting box.
Parms<3> = 'MU' ; // Wafer counter tool location
Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms)
If Proceed EQ True$ then
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue)
If EpiCheck EQ False$ then
IF Get_Status(errCode) THEN
ErrMsg('Unable to set makeup flag until Unload stage is signed.')
InvalidRequest = True$
END else
Set_Property(@WINDOW,'SAVEWARN', False$)
Send_Event(@WINDOW,'CLEAR')
If (CheckValue EQ True$) then
Wo_Mat_Services('MakeupFlagOn', RDSNo)
end
end
end else
Set_Property(@WINDOW,'SAVEWARN', False$)
Send_Event(@WINDOW,'CLEAR')
end
end else
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue)
If EpiCheck EQ False$ then
IF Get_Status(errCode) THEN
ErrMsg('Unable to set makeup flag until Unload stage is signed.')
InvalidRequest = True$
END else
Set_Property(@WINDOW,'SAVEWARN', False$)
Send_Event(@WINDOW,'CLEAR')
If (CheckValue EQ True$) then
Wo_Mat_Services('MakeupFlagOn', WOMatKey)
If Error_Services('HasError') then ErrMsg(Error_Services('GetMessage'))
end
end
end else
InvalidRequest = True$
ErrMsg('WARNING: Error starting wafer counter check. RDS No is missing.')
Set_Property(@WINDOW,'SAVEWARN', False$)
Send_Event(@WINDOW,'CLEAR')
end
end
end else
@ -1233,7 +1208,3 @@ LogRecord:
return

View File

@ -0,0 +1,37 @@
Compile function Copy_Test_Wafer_Prod_Record_To_SQL(Connection, Key, Record)
/*****************************************************************************\
Copies the given TEST_WAFER_PROD (to be renamed) PRODUCT record to the MSSQL database.
History
-------
09/10/2025 DJS Original Programmer
\*****************************************************************************/
$insert TEST_WAFER_PROD_EQUATES
Declare function SQL_Write, SQL_Write_MV, SQL_Format
Ans = ""
// Parse record into a dimensioned array for speed
Dim Rec(5)
MatParse Record into Rec
// List of key names and their values
Keys = "PRODUCT_ID":@VM:SQL_Format(Key, "STR")
// List of data fields and their values
DataFields = "PART_NAME" :@VM:SQL_Format(Rec(TEST_WAFER_PROD_PART_NAME$), "STR"):@FM
DataFields := "USAGE" :@VM:SQL_Format(Rec(TEST_WAFER_PROD_USAGE$), "INT"):@FM
DataFields := "SORT_ORDER" :@VM:SQL_Format(Rec(TEST_WAFER_PROD_SORT_ORDER$), "INT")
// Symbolics
// Write the data to the SQL database
Ans = SQL_Write(Connection, "PRODUCT", Keys, DataFields);
//-------------------------------------------------------------------------------------------------
// Multi-valued Fields
Return Ans

View File

@ -910,6 +910,7 @@ end service
//----------------------------------------------------------------------------------------------------------------------
Service WriteDataRow(TableName, KeyID, DataRow, IgnoreSelfLock, IgnoreMFSRoutines, IgnoreAllLocks)
ErrorMsg = ''
If TableName NE '' AND KeyID NE '' then
If IgnoreSelfLock NE True$ then IgnoreSelfLock = False$
If IgnoreMFSRoutines NE True$ then IgnoreMFSRoutines = False$
@ -943,7 +944,13 @@ Service WriteDataRow(TableName, KeyID, DataRow, IgnoreSelfLock, IgnoreMFSRoutine
end
end
If IgnoreAllLocks EQ False$ then
If Error_Services('HasError') then
ErrorMsg = Error_Services('GetMessage')
end
Database_Services('ReleaseKeyIDLock', TableName, KeyID)
If ErrorMsg NE '' then
Error_Services('Add', ErrorMsg)
end
end
end else
Error_Services('Add', 'Unable to lock ' : KeyID : ' for the ' : TableName : ' table in the ' : Service : ' service.')
@ -1102,3 +1109,4 @@ end service
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@ -220,10 +220,17 @@ Service GetWeekNum(InputDate)
end service
Service ConvertDateTimeToISO8601(DatetimeToConv)
Response = OConv(DatetimeToConv, "[SRP_DATETIME,()YYYY-MM-DD'T'hh:mm:ss.000Z]")
Response = OConv(DatetimeToConv, "[SRP_DATETIME,()YYYY-MM-DD hh:mm:ss.000Z]")
swap ' ' with 'T' in Response
end service
Service ConvertISO8601ToDateTime(ISO8601Dtm)
Response = IConv(ISO8601Dtm, "[SRP_DATETIME,()YYYY-MM-DD'T'hh:mm:ss.000Z]")
end service
@ -233,3 +240,4 @@ end service
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@ -0,0 +1,30 @@
Compile function Delete_Test_Wafer_Prod_Record_From_SQL(Connection, Key, Record)
/*****************************************************************************\
Deletes the given TEST_WAFER_PROD (to be renamed PRODUCT) record from the MSSQL database.
History
-------
09/10/2025 DJS Original Programmer
\*****************************************************************************/
Declare function SQL_Delete, SQL_Format
Ans = ""
// List of key names and their values
Keys = "PRODUCT_ID":@VM:SQL_Format(Key, "STR")
//-------------------------------------------------------------------------------------------------
// Multi-valued Fields
!! Delete records from MV tables first !!
// Currently no multi-value (child) tables
// OPERATION
If Ans EQ "" then
Ans = SQL_Delete(Connection, "PRODUCT", Keys)
end
Return Ans

View File

@ -0,0 +1,109 @@
Compile function Dialog_Response_Log_Services(@Service, @Params)
#pragma precomp SRP_PreCompiler
$Insert LOGICAL
$Insert SERVICE_SETUP
$Insert DIALOG_RESPONSE_LOG_EQUATES
Declare function RTI_CreateGUID, Error_Services, Datetime, Environment_Services, Logging_Services
Declare subroutine Database_Services, Error_Services, Logging_Services
Options ENTITY_TYPES = 'RDS', 'REACTOR', 'WM_OUT', 'WM_IN'
Options RESPONSE_TYPES = 'OVERRIDE', 'METROLOGY', 'TEST_WAFER', 'HTR_LAST_BOX_TW'
GoToService
Return Response or ""
//-----------------------------------------------------------------------------
// SERVICES
//-----------------------------------------------------------------------------
Service AddDialogResponseLog(EntityId, EntityType=ENTITY_TYPES, UserId, ResponseType=RESPONSE_TYPES, Data)
ErrorMsg = ''
NewDialogResponseLogId = ''
ResponseDtm = Datetime()
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\DialogResponseLog'
LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS')
LoggingDTM = LogDate : ' ' : LogTime
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' DialogResponseLogCreation.csv'
Headers = 'Logging DTM' : @FM : 'Key Id' : @FM : 'Response Dtm' : @FM : 'Entity Id' : @FM : 'Entity Type' : @FM : 'User Id' : @FM : 'Response Type' : @FM : 'Data' : @FM : 'Creation Message'
objAddLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
If EntityId NE '' then
If EntityType NE '' then
If RowExists(EntityType, EntityId) then
If UserId NE '' then
If RowExists('LSL_USERS', UserId) then
If ResponseType NE '' then
If Data NE '' then
NewDialogResponseLogId = RTI_CreateGUID()
If NewDialogResponseLogId NE '' then
NewDialogResponseLogRec = ''
NewDialogResponseLogRec<DIALOG_RESPONSE_LOG_RESPONSE_DTM$> = ResponseDtm
NewDialogResponseLogRec<DIALOG_RESPONSE_LOG_ENTITY_ID$> = EntityId
NewDialogResponseLogRec<DIALOG_RESPONSE_LOG_ENTITY_TYPE$> = EntityType
NewDialogResponseLogRec<DIALOG_RESPONSE_LOG_USER_ID$> = UserId
NewDialogResponseLogRec<DIALOG_RESPONSE_LOG_DIALOG_TYPE$> = ResponseType
NewDialogResponseLogRec<DIALOG_RESPONSE_LOG_DATA$> = Data
Database_Services('WriteDataRow', 'DIALOG_RESPONSE_LOG', NewDialogResponseLogId, NewDialogResponseLogRec)
If Error_Services('HasError') then
ErrorMsg = Error_Services('GetMessage')
end
end else
ErrorMsg = 'Error generating a new key ID.'
end
end else
ErrorMsg = 'Data was null.'
end
end else
ErrorMsg = 'Response Type was null.'
end
end else
ErrorMsg = 'Invalid user id.'
end
end else
ErrorMsg = 'User Id was null.'
end
end else
ErrorMsg = 'Entity Id and Entity Type was not a valid data type.'
end
end else
ErrorMsg = 'Entity Type was null.'
end
end else
ErrorMsg = 'Entity Id was null.'
end
If ErrorMsg EQ '' then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = NewDialogResponseLogId
LogData<3> = OConv(ResponseDtm, 'DT')
LogData<4> = EntityId
LogData<5> = EntityType
LogData<6> = UserId
LogData<7> = ResponseType
LogData<8> = Data
LogData<9> = 'Success'
Logging_Services('AppendLog', objAddLog, LogData, @RM, @FM, False$)
end else
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = NewDialogResponseLogId
LogData<3> = OConv(ResponseDtm, 'DT')
LogData<4> = EntityId
LogData<5> = EntityType
LogData<6> = UserId
LogData<7> = ResponseType
LogData<8> = Data
LogData<9> = ErrorMsg
Logging_Services('AppendLog', objAddLog, LogData, @RM, @FM, False$)
Error_Services('Set', ErrorMsg)
end
End Service

View File

@ -80,6 +80,7 @@ Service GetServer()
end service
Service IsProd()
Machine = Environment_Services('GetServer')
@ -279,6 +280,27 @@ Service GetMetrologyProductionPath()
end service
//----------------------------------------------------------------------------------------------------------------------
// GetOIWizardBaseUrl
//
// Returns the OIWizardBaseUrl.
//----------------------------------------------------------------------------------------------------------------------
Service GetOIWizardBaseUrl()
Machine = Environment_Services('GetServer')
Begin Case
Case ( (Machine _EQC 'MESTSA01EC') or (Machine _EQC 'MESTST1009') or (Machine _EQC 'MESTST1010') )
Response = 'https://mestsa008.infineon.com:50186/'
// Uncomment this case and add your hostname if testing locally.
//Case ( (Machine EQ 'ISCN5CG2430JV1') or (Machine _EQC 'MESTSA09EC') )
// Response = 'http://localhost:12009/'
Case Otherwise$
Response = 'https://messa014.infineon.com:50184/'
End Case
end service
//----------------------------------------------------------------------------------------------------------------------
// GetControlPlanProductionPath
//

View File

@ -111,7 +111,6 @@ API Lock.HEAD
API Lock.POST
OIWizardID = ''
Cookies = HTTP_Services('GetHTTPCookie')
For each Cookie in Cookies using ';'

View File

@ -1618,3 +1618,4 @@ end service
// Internal GoSubs
//----------------------------------------------------------------------------------------------------------------------

View File

@ -219,6 +219,28 @@ Service GetOnShiftUsers()
end service
Service GetCurrentShiftStartDtm()
CurrDate = SRP_Datetime('Date', Datetime())
ShiftTime = SRP_DateTime('Time', CurrDtm)
ShiftStartDtm = ''
Begin Case
Case ShiftTime GE 21600 AND ShiftTime LT 64800
//Day Shift - Same day @ 6AM
ShiftStartDtm = SRP_Datetime('AddHours', CurrDate, 6)
Case ShiftTime LT 21600
//Morning part of night shift - Prior day at 6PM
ShiftStartDtm = SRP_Datetime('AddHours', CurrDate - 1, 18)
Case ShiftTime GT 64800
//Evening Part of Night shift - Same day at 6PM
ShiftStartDtm = SRP_Datetime('AddHours', CurrDate, 18)
End Case
Response = ShiftStartDtm
end service
Service GetShiftByDate(Date, GenerateFlag)
OnShift = ''; *Return Value
@ -549,3 +571,4 @@ Service UpdateSecurityGroups()
end service

View File

@ -254,6 +254,7 @@ Service GetStratus(Handle)
Result<10> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Batch'); // BatchID
Result<11> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Cassette'); // Cassette
Result<12> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].GradeMean'); // ThickAvg
Result<13> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].IndexOf');
END
ForOffset = (RecordIndex - 1) * FieldPositionIncrement;
Result<FieldPosition + ForOffset> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Slot'); // Position
@ -283,6 +284,7 @@ Service GetBioRad(Handle)
Result<8> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Layer'); // RunDataLayer
Result<9> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Zone'); // RunDataZone
Result<11> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Wafer'); // DataSlotId
Result<13> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].IndexOf');
END
ForOffset = (RecordIndex - 1) * FieldPositionIncrement;
Result<FieldPosition + ForOffset> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Position'); // Position
@ -310,6 +312,7 @@ Service GetCDE(Handle)
Result<8> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].PSN'); // PSN
Result<9> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Layer'); // RunDataLayer
Result<10> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Zone'); // RunDataZo
Result<13> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].IndexOf');
END
ForOffset = (RecordIndex - 1) * FieldPositionIncrement;
Result<FieldPosition + ForOffset> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].InferredPoint'); // Position
@ -338,6 +341,7 @@ Service GetHgCV(Handle)
Result<5> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].PSN'); // PSN
Result<8> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Wafer'); // LayerZonePair
Result<11> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Date'); // Timestamp
Result<13> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].IndexOf');
END
ForOffset = (RecordIndex - 1) * FieldPositionIncrement;
Result<FieldPosition + ForOffset> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Site'); // Position
@ -359,6 +363,7 @@ Service GetTencor(Handle)
IF RecordIndex EQ 1 THEN
Result<9> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Date'); // Timestamp
Result<10> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].HazeAverageAvg'); // HazeAvg
Result<13> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].IndexOf');
Result<28> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].RDS'); // RDSKeyID
Result<30> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].WaferRecipe'); // ScanRecipe
Result<39> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].SumOfDefectsAvg'); // SoDAvg
@ -381,6 +386,7 @@ Service GetSP1(Handle)
IF RecordIndex EQ 1 THEN
Result<9> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Date'); // Timestamp
Result<10> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].DcnHazeAvgMean'); // HazeAvg
Result<13> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].IndexOf');
Result<28> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].RDS'); // RDSKeyID
Result<30> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Session'); // ScanRecipe
Result<3> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].DcnLpdMean'); // SoDAvg

View File

@ -1,187 +1,410 @@
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, Set_Status, Rlist, Obj_Post_Log
Declare function Database_Services, Error_Services, Qa_Services, Reactor_Services
Declare function Get_Property, Dialog_Box
$Insert EVENT_SETUP
$Insert LOGICAL
$Insert RDS_EQUATES
$Insert REACT_LL_EQUATES
$Insert REACTOR_EQUATES
$Insert MSG_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')
initParams = ''
initParams<4> = 'Sign Unload Extra 1'
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, initParams)
Valid = Response<1>
If Valid then
Rds_Services('SignUnloadExtra1', RDSNo, @USER4)
If Error_Services('NoError') then
Msg(@Window, 'Unload Extra 1 Signed!')
end else
Msg(@Window, Error_Services('GetMessage'))
end
end
GoSub Refresh
end event
Event PUB_SIGN_LOAD_EX_1.CLICK()
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
OldReactorNo = RDSRec<RDS_REACTOR$>
NewReactorNo = Get_Property(@Window : '.EDL_REACTOR1', 'TEXT')
initParams = ''
initParams<4> = 'Sign Load Extra 1'
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, initParams)
Valid = Response<1>
If Valid then
If Qa_Services('LoadExtra1stReady', RDSNo) AND (OldReactorNo NE NewReactorNo) then
Gosub ReactorChange
end
If Error_Services('NoError') then
Rds_Services('SignLoadExtra1', RDSNo, @USER4)
If Error_Services('NoError') then
Msg(@Window, 'Load Extra 1 Signed!')
end else
Msg(@Window, Error_Services('GetMessage'))
end
End else
Msg(@Window, Error_Services('GetMessage'))
end
end
GoSub Refresh
end event
Event PUB_SIGN_UNLOAD_EX_2.CLICK()
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
initParams = ''
initParams<4> = 'Sign Unload Extra 2'
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, initParams)
Valid = Response<1>
If Valid then
Rds_Services('SignUnloadExtra2', RDSNo, @USER4)
If Error_Services('NoError') then
Msg(@Window, 'Unload Extra 2 Signed!')
end else
Msg(@Window, Error_Services('GetMessage'))
end
end
GoSub Refresh
end event
Event PUB_SIGN_LOAD_EX_2.CLICK()
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
OldReactorNo = RDSRec<RDS_REACTOR$>
NewReactorNo = Get_Property(@Window : '.EDL_REACTOR2', 'TEXT')
initParams = ''
initParams<4> = 'Sign Load Extra 2'
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, initParams)
Valid = Response<1>
If Valid then
If Qa_Services('LoadExtra2ndReady', RDSNo) AND (OldReactorNo NE NewReactorNo) then
Gosub ReactorChange
end
If Error_Services('NoError') then
Rds_Services('SignLoadExtra2', RDSNo, @USER4)
If Error_Services('NoError') then
Msg(@Window, 'Load Extra 2 Signed!')
end else
Msg(@Window, Error_Services('GetMessage'))
end
End else
Msg(@Window, Error_Services('GetMessage'))
end
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)
if Error_Services('NoError') then
UnloadSigned = RDSRec<RDS_OPERATOR_OUT$>
ReactorNo = RDSRec<RDS_REACTOR$>
//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')
LoadExtra1Reactor = RDSRec<RDS_LOAD_EXTRA_1_REACTOR$>
//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')
LoadExtra2Reactor = RDSRec<RDS_LOAD_EXTRA_2_REACTOR$>
//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)
If LoadExtra1Reactor NE '' then
Set_Property(@Window : '.EDL_REACTOR1', 'TEXT', LoadExtra1Reactor)
end else
Set_Property(@Window : '.EDL_REACTOR1', 'TEXT', ReactorNo)
end
If LoadExtra2Reactor NE '' then
Set_Property(@Window : '.EDL_REACTOR2', 'TEXT', LoadExtra2Reactor)
end else
Set_Property(@Window : '.EDL_REACTOR2', 'TEXT', ReactorNo)
end
If UnloadSigned EQ '' then
Set_Property(@Window : '.EDL_REACTOR1', 'ENABLED', True$)
Set_Property(@Window : '.EDL_REACTOR2', 'ENABLED', True$)
end else
Set_Property(@Window : '.EDL_REACTOR1', 'ENABLED', False$)
Set_Property(@Window : '.EDL_REACTOR2', 'ENABLED', False$)
end
If UnloadExtra1Signature NE '' then
Set_Property(@Window : '.PUB_SIGN_UNLOAD_EX_1', 'ENABLED', False$)
Set_Property(@Window : '.PUB_CLEAR_UNLOAD_EX_1', 'ENABLED', True$)
end else
Set_Property(@Window : '.PUB_SIGN_UNLOAD_EX_1', 'ENABLED', True$)
Set_Property(@Window : '.PUB_CLEAR_UNLOAD_EX_1', 'ENABLED', False$)
end
If UnloadExtra2Signature NE '' then
Set_Property(@Window : '.PUB_SIGN_UNLOAD_EX_2', 'ENABLED', False$)
Set_Property(@Window : '.PUB_CLEAR_UNLOAD_EX_2', 'ENABLED', True$)
end else
Set_Property(@Window : '.PUB_SIGN_UNLOAD_EX_2', 'ENABLED', True$)
Set_Property(@Window : '.PUB_CLEAR_UNLOAD_EX_2', 'ENABLED', False$)
end
If LoadExtra1Signature NE '' then
Set_Property(@Window : '.PUB_SIGN_LOAD_EX_1', 'ENABLED', False$)
Set_Property(@Window : '.PUB_CLEAR_LOAD_EX_1', 'ENABLED', True$)
end else
Set_Property(@Window : '.PUB_SIGN_LOAD_EX_1', 'ENABLED', True$)
Set_Property(@Window : '.PUB_CLEAR_LOAD_EX_1', 'ENABLED', False$)
end
If LoadExtra2Signature NE '' then
Set_Property(@Window : '.PUB_SIGN_LOAD_EX_2', 'ENABLED', False$)
Set_Property(@Window : '.PUB_CLEAR_LOAD_EX_2', 'ENABLED', True$)
end else
Set_Property(@Window : '.PUB_SIGN_LOAD_EX_2', 'ENABLED', True$)
Set_Property(@Window : '.PUB_CLEAR_LOAD_EX_2', 'ENABLED', False$)
end
end else
Msg(@Window, 'Error reading RDS record from database.')
end
end else
ResponseValue = Set_Property(@Window, '@responsevalue', 0)
Post_Event(@Window, 'CLOSE')
end
return
ReactorChange:
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
if Error_Services('NoError') then
WONo = RDSRec<RDS_WO$>
ReactorNo = ''
LLChosen = ''
ChangePermitted = False$
Begin Case
Case Control EQ 'PUB_SIGN_LOAD_EX_1'
ReactorNo = Get_Property(@Window : '.EDL_REACTOR1', 'TEXT')
ReactorField = RDS_LOAD_EXTRA_1_REACTOR$
Case Control EQ 'PUB_SIGN_LOAD_EX_2'
ReactorNo = Get_Property(@Window : '.EDL_REACTOR2', 'TEXT')
ReactorField = RDS_LOAD_EXTRA_2_REACTOR$
Case Otherwise$
End Case
If ReactorNo NE '' then
PickPlace = Xlate('REACTOR', ReactorNo, 'PICK_PLACE', 'X')
If (Reactor_Services('GetReactorAvailChamberCount', ReactorNo) NE 0) OR (PickPlace EQ False$) then
Query = 'SELECT REACT_STATE WITH SCHED_WO CONTAINING ':WONo
GoSub ClearCursors
Set_Status(0)
RList(Query, TARGET_ACTIVELIST$, '', '' '')
SchedReactors = ''
EOF = False$
Loop
ReadNext SchedReactor else EOF = True$
Until EOF
SchedReactors<0, -1> = SchedReactor
Repeat
Locate ReactorNo in SchedReactors using @VM setting vPos then
If PickPlace EQ True$ then
LLDisabled = XLATE('REACTOR', ReactorNo, 'ACTIVE_LL_DISABLED', 'X')
IF LLDisabled NE '' then
ReactLLRec = Database_Services('ReadDataRow', 'REACT_LL', LLDisabled)
SideDisabled = ReactLLRec<REACT_LL_DISABLED$>
QualMode = ReactLLRec<REACT_LL_QUAL_MODE$>
Begin Case
Case SideDisabled EQ 'L'
LLChosen = 'R'
Case SideDisabled EQ 'R'
LLChosen = 'L'
End Case
end else
Def = ''
Def<MCAPTION$> = 'Select Load Lock'
Def<MTYPE$> = 'BLeft,Right'
Def<MTEXT$> = 'Please select a load lock.'
Def<MMODAL$> = 'A'
LLResponse = Msg(@Window, Def)
Begin Case
Case LLResponse EQ 1
LLChosen = 'L'
Case LLResponse EQ 2
LLChosen = 'R'
End Case
end
If LLChosen NE '' then
ChangePermitted = True$
end else
Error_Services('Add', 'You must select a load lock for this lot.')
end
end else
ChangePermitted = True$
end
end else
Swap @VM with ',' in SchedReactors
Error_Services('Add', 'Assigned reactor, ':ReactorNo:', does not equal any scheduled reactor(s), ':SchedReactors:'.')
end
end else
Error_Services('Add', ReactorNo: 'does not have the capacity necessary for this lot.')
end
end else
Error_Services('Add', 'Invalid Reactor number.')
end
If ChangePermitted then
RDSRec<RDS_REACTOR$> = ReactorNo
RDSRec<ReactorField> = ReactorNo
RDSRec<RDS_LOAD_LOCK_SIDE$> = LLChosen
Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, False$)
If Error_Services('NoError') then
Msg(@Window, 'Reactor successfully changed!')
end else
Msg(@Window, 'Error changing reactor!')
end
end
end else
Msg(@Window, 'Error reading RDS from database!')
end
return
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ClearCursors:
For counter = 0 to 8
ClearSelect counter
Next counter
return

View File

@ -50,7 +50,7 @@ Equ HEIGHT$ to 4
Declare function GetCommandLine, MemberOf, obj_Install, obj_Notes_Sent, FindWindow, ShowWindow, Next_Key
Declare function Environment_Services, Reactor_Services, Database_Services, obj_Tool, Messaging_Services, SRP_JSON
Declare function Notes_Services, RTI_Xlate_Controller
Declare function Notes_Services, RTI_Xlate_Controller, Test_Run_Services, LSL_Users_Services, Datetime
Declare subroutine Set_Env, obj_Appwindow, Get_BMP_Info, obj_Login, obj_Calib_List, End_Window, Start_Window, Next_Key
Declare subroutine Database_Services, obj_React_Status, Obj_React_Mode, obj_Tool_Log, RList, Messaging_Services, RTP27
Declare subroutine Notes_Services, Obj_Note_Ptrs, Comm_Note_Ptrs, SRP_Run_Command, PlaceDialog, GetEngineVersion
@ -404,6 +404,16 @@ Event WINDOW.TIMER()
Gosub SetSnoozeButtonState
CurrDtm = Datetime()
CurrShiftStartDtm = LSL_USERS_SERVICES('GetCurrentShiftStartDtm', CurrDtm)
TWStats = Test_Run_Services('GetTestWaferUsageStats', @USER4, CurrShiftStartDtm, Datetime())
LastUsed = TWStats<1>
LastUsed = Oconv(LastUsed, 'DT2/^H')
QtyUsed = TWStats<2>
Set_Property(@Window: '.LBL_LAST_TW_USED', 'TEXT', 'TW Last Used by User: ' :LastUsed)
Set_Property(@Window: '.LBL_TW_USED', 'TEXT', 'TW Used by User: ' :QtyUsed)
Set_Property(@WINDOW:'.CURRENT_TIME','TEXT','Current Time: ':OCONV( TIME(), 'MTHS' ))
Set_Property(@WINDOW:'.CURRENT_DATE','TEXT','Date: ':OCONV( DATE(), 'D2/' ))
If Get_Property(@Window, '@CLOSE') then
@ -853,3 +863,5 @@ return

View File

@ -50,6 +50,7 @@ Compile function NDW_MATERIAL_TRACK_PRO_REPORT_EVENTS(CtrlEntId, Event, @PARAMS)
Declare function Form_Services, Database_Services, RTI_Task_Submit, RTI_Task_Status, MemberOf
Declare subroutine SRP_Show_Window, Send_Message, Set_Property, Database_Services, Material_Track, Report_Services
Declare subroutine PlaceDialog
$Insert EVENT_SETUP
$Insert LOGICAL
@ -97,8 +98,7 @@ Event WINDOW.CREATE(CreateParam)
GoSub Setup_OLE_Controls
GoSub EnableGenerateReportButton
FormSize = ''
SRP_Show_Window(@Window, '', 'C', 'C', 1, '', False$, False$, FormSize)
PlaceDialog(-2, -2)
End Event
@ -127,7 +127,7 @@ Event PUB_GEN_REPORT.CLICK()
LocationEnabled = Flags<0, vPos>
If LocationEnabled then RptLocations<0, -1> = Location
Next Location
Report_Services('PrintMaterialTrackReport', RptColumns, RptLocations, NoMatFlag, OldReport)
end event

View File

@ -39,8 +39,6 @@ $Insert POPUP_EQUATES
$Insert NOTIFICATION_EQUATES
$Insert LSL_USERS_EQUATES
EQU READONLY_GREEN$ TO 192 + (220*256) + (192*65536)
Declare function Admin_User, Database_Services, Error_Services, Active_Directory_Services, SRP_Array
Declare subroutine PlaceDialog, Error_Services, Database_Services, Btree.Extract, ErrMsg
@ -643,3 +641,4 @@ return

View File

@ -45,8 +45,7 @@ EQU COL$PMID to 1
EQU COL$DESC to 2
EQU COL$DATECOMP to 3
EQU COL$DATEDUE to 4
EQU COL$LATE to 5
EQU COL$USER to 6
EQU COL$USER to 5
// Update the arguments so that the OpenInsight OLE event will treate the ActiveX event as a native event handler.
If Event EQ 'OLE' then
@ -102,7 +101,7 @@ Event PUB_EXPORT_TO_EXCEL.CLICK()
if FilePath NE '' then
PmHistoryOutput = ''
PmHistoryOutput<1> = 'PM ID' : @VM : 'Description' : @VM : 'Complete Date' : @VM : 'Due Date' : @VM : 'Late' : @VM : 'User'
PmHistoryOutput<1> = 'PM ID' : @VM : 'Description' : @VM : 'Complete Date' : @VM : 'Due Date' : @VM : 'User'
PMHistoryArray = Get_Property(@Window : '.OLE_HIST_TABLE', "OLE.ARRAY")
PMHistoryArray = SRP_Array('Rotate',PMHistoryArray)
for each DataRow in PmHistoryArray using @FM setting dPos
@ -152,13 +151,10 @@ RunReport:
PMRec = Database_Services('ReadDataRow', 'PM', PMId)
SchedDtm = SRP_Datetime('Combine', PMRec<PM_SCHED_DT$>, PMRec<PM_SCHED_TM$>)
DueByDTM = obj_PM_Spec('LateStart',PMId:@RM:PMSpecRecord)
Late = Xlate('PM', PMId, 'LATE', 'X')
If Late then Late = 'Yes' else Late = 'No'
PMHistoryArray<pPos, COL$PMID> = PMId
PMHistoryArray<pPos, COL$DESC> = PMDescription
PMHistoryArray<pPos, COL$DATECOMP> = OCONV(PMRec<PM_COMP_DTM$>, 'DT')
PMHistoryArray<pPos, COL$DATEDUE> = OCONV(SchedDtm, 'DT')
PMHistoryArray<pPos, COL$LATE> = Late
PMHistoryArray<pPos, COL$USER> = OConv(PMRec<PM_COMP_BY$>, '[XLATE_CONV,LSL_USERS*FIRST_LAST]')
While Msg(@window, MsgUp, pPos, MSGINSTUPDATE$) ; * update the gauge and check if cancel was pressed
Next PMId
@ -191,9 +187,9 @@ Setup_OLE_Controls:
EdtTableCtrl = @Window : '.OLE_HIST_TABLE'
Set_Property(EdtTableCtrl, 'OLE.Redraw', False$)
//Set up columns
Set_Property(EdtTableCtrl, "OLE.Dimension", 6);*Define number of columns
Set_Property(EdtTableCtrl, "OLE.Dimension", 5);*Define number of columns
HeaderTitles = 'PM ID':@VM:'Desc':@VM:'Date Completed':@VM:'Sched Due':@VM:'Late':@VM:'User Completed'; *Define the column header titles
HeaderTitles = 'PM ID':@VM:'Desc':@VM:'Date Completed':@VM:'Sched Due':@VM:'User Completed'; *Define the column header titles
Set_Property(EdtTableCtrl, "OLE.TitleList", HeaderTitles); *Set the column titles
//Set the column Sizes
@ -203,7 +199,7 @@ Setup_OLE_Controls:
ColSize<1> = 45
Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$PMID:"]", ColSize)
//Column 2
ColSize<1> = 200
ColSize<1> = 250
ColSize<4> = True$
Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$DESC:"]", ColSize)
ColSize<4> = False$
@ -211,13 +207,10 @@ Setup_OLE_Controls:
ColSize<1> = 120
Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$DATECOMP:"]", ColSize)
//Column 4
ColSize<1> = 110
ColSize<1> = 135
Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$DATEDUE:"]", ColSize)
//Column 5
ColSize<1> = 50
Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$LATE:"]", ColSize)
//Column 6
ColSize<1> = 160
ColSize<1> = 185
Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$USER:"]", ColSize)
Set_Property(EdtTableCtrl, 'OLE.Border', 'XP Flat')
@ -234,3 +227,4 @@ Setup_OLE_Controls:
return

View File

@ -44,7 +44,7 @@ $insert SUPPLEMENTS_EQUATES
equ WOCust$ to 2
Declare subroutine SRP_Show_Window, Rds_Services, ErrMsg, Start_Window, Placedialog, Supplement_Services, Hold_Services
Declare subroutine Labeling_Services
Declare subroutine Labeling_Services
Declare function Database_Services, Material_Services, Rds_Services, RGB, SRP_Array, MemberOf, Supplement_Services
Declare function Hold_Services, Datetime, Printer_Select
@ -59,11 +59,11 @@ If Event EQ 'OLE' then
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
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
@ -186,78 +186,83 @@ Event PUB_ENG_OPTIONS.CLICK()
NumRows = DCount(WOMatKeys, @VM)
Begin Case
Case SelOpt EQ 'CLEAN_INSP'
Caption = "Updating Clean & Insp specs for selected RDS cassettes..."
ServiceModules = 'CLEAN_INSP_SERVICES'
Services = 'UpdateAllCleanInsp'
ServiceModules = ''
Services = ''
Caption = ''
For each Sel in SelOpt using @VM
If Sel EQ 'CLEAN_INSP' then
Caption<0, -1> = "Updating Clean & Insp specs for selected RDS cassettes..."
ServiceModules<0, -1> = 'CLEAN_INSP_SERVICES'
Services<0, -1> = 'UpdateAllCleanInsp'
end
Case SelOpt EQ 'QA_MET'
Caption = "Updating QA Metrology specs for selected RDS cassettes..."
ServiceModules = 'WO_MAT_QA_SERVICES'
Services = 'UpdateQAMet'
If SelOpt EQ 'QA_MET' then
Caption<0, -1> = "Updating QA Metrology specs for selected RDS cassettes..."
ServiceModules<0, -1> = 'WO_MAT_QA_SERVICES'
Services<0, -1> = 'UpdateQAMet'
end
Case SelOpt EQ 'UPDATE_RDS_LAYER'
Caption = "Updating RDS Layer specs for selected RDS cassettes..."
ServiceModules = 'RDS_LAYER_SERVICES'
Services = 'UpdateRDSLayerSpecs'
If SelOpt EQ 'UPDATE_RDS_LAYER' then
Caption<0, -1> = "Updating RDS Layer specs for selected RDS cassettes..."
ServiceModules<0, -1> = 'RDS_LAYER_SERVICES'
Services<0, -1> = 'UpdateRDSLayerSpecs'
end
Case SelOpt EQ 'CLEAN_INSP':@VM:'QA_MET'
Caption = "Updating Clean & Insp and QA Metrology specs for selected RDS cassettes..."
ServiceModules = 'CLEAN_INSP_SERVICES':@VM:'WO_MAT_QA_SERVICES'
Services = 'UpdateAllCleanInsp':@VM:'UpdateQAMet'
Case SelOpt EQ 'QA_MET':@VM:'UPDATE_RDS_LAYER'
Caption = "Updating RDS Layer and QA Metrology specs for selected RDS cassettes..."
ServiceModules = 'WO_MAT_QA_SERVICES':@VM:'RDS_LAYER_SERVICES'
Services = 'UpdateQAMet':@VM:'UpdateRDSLayerSpecs'
Case SelOpt EQ 'CLEAN_INSP':@VM: 'UPDATE_RDS_LAYER'
Caption = "Updating RDS Layer and Clean & Insp specs for selected RDS cassettes..."
ServiceModules = 'CLEAN_INSP_SERVICES':@VM:'RDS_LAYER_SERVICES'
Services = 'UpdateAllCleanInsp':@VM:'UpdateRDSLayerSpecs'
Case SelOpt EQ 'CLEAN_INSP':@VM:'QA_MET':@VM: 'UPDATE_RDS_LAYER'
Caption = "Updating Clean & Insp, QA Metrology, and RDS Layer specs for selected RDS cassettes..."
ServiceModules = 'CLEAN_INSP_SERVICES':@VM:'WO_MAT_QA_SERVICES' :@VM: 'RDS_LAYER_SERVICES'
Services = 'UpdateAllCleanInsp':@VM:'UpdateQAMet' :@VM: 'UpdateRDSLayerSpecs'
End Case
If SelOpt EQ 'UPDATE_RDS_TEST' then
Caption<0, -1> = "Updating RDS Test specs for selected RDS cassettes..."
ServiceModules<0, -1> = 'RDS_TEST_SERVICES'
Services<0, -1> = 'UpdateRDSTestSpecs'
end
Next Sel
Swap @VM with CRLF$ in Caption
If ServiceModules NE '' then
Def = ""
ErrorMsg = ''
Def = ''
Def<MCAPTION$> = Caption
Def<MTYPE$> = "GC"
Def<MEXTENT$> = NumRows
Def<MTEXTWIDTH$> = 600
MsgUp = Msg(@WINDOW, Def) ;* Start gas guage message
Def<MCOL$> = -2
Def<MROW$> = -2
MsgUp = Msg(@Window, Def) ;* Start gas guage message
For each WOMatKey in WOMatKeys using @VM setting vPos
Running = Msg(@WINDOW, MsgUp, vPos, MSGINSTUPDATE$) ;* Update gas guage
Running = Msg(@Window, MsgUp, vPos, MSGINSTUPDATE$) ;* Update gas guage
For each ServiceModule in ServiceModules using @VM setting sPos
Service = Services<0, sPos>
If Service = 'UpdateRDSLayerSpecs' then
If ( (Service _EQC 'UpdateRDSLayerSpecs') or (Service _EQC 'UpdateRDSTestSpecs') ) then
RDSKey = SelRDSList<4, vPos>
Ans = Function(@ServiceModule(Service, RDSKey))
end else
Ans = Function(@ServiceModule(Service, WOMatKey))
end
If Error_Services('HasError') then
Error_Services('DisplayError')
ErrorMsg = Error_Services('GetMessage')
end
Until (ErrorMsg NE '')
Next ServiceModule
Until (ErrorMsg NE '')
Next WOMatKey
Msg(@WINDOW,MsgUp) ;* Take gas guage down
Msg(@Window,MsgUp) ;* Take gas guage down
end
If Error_Services('NoError') then
Def = ""
Def = ''
Def<MCOL$> = -2
Def<MROW$> = -2
If (ErrorMsg EQ '') then
Def<MICON$> = '*'
Def<MCAPTION$> = 'Success'
Def<MTEXT$> = "Update complete!"
Def<MTYPE$> = "BO"
MsgUp = Msg(@window, Def)
Def<MTEXT$> = 'Update complete!'
end else
Def<MICON$> = 'H'
Def<MCAPTION$> = 'Update failed!'
Def<MTEXT$> = ErrorMsg
end
Def<MTYPE$> = "BO"
MsgUp = Msg(@Window, Def, 'OK')
end
end event
@ -277,7 +282,7 @@ Event PUB_ON_HOLD.CLICK()
HoldEntity = 'RDS'
HoldType = 'HOLD'
HoldData = ''
HoldData = Dialog_Box('DIALOG_HOLD',@WINDOW,Transition:@FM:@FM:HoldType)
HoldData = Dialog_Box('DIALOG_HOLD',@Window,Transition:@FM:@FM:HoldType)
If HoldData NE 'Cancel' then
GoSub GetView
Hold_Services('EnableMultipleHolds', WOMatKeys, HoldEntity, RDSKeys, 'NDW_RDS_QUERY', '', HoldData)
@ -289,7 +294,7 @@ Event PUB_ON_HOLD.CLICK()
MsgInfo<MTYPE$> = 'BNY'
MsgInfo<MTEXT$> = 'Hold Successful. Would you like to print label(s)?'
MsgInfo<MICON$> = '!'
PrintLabel = Msg(@WINDOW,MsgInfo,'')
PrintLabel = Msg(@Window,MsgInfo,'')
HoldBy = HoldData<1>
Reason = HoldData<2>
Stage = HoldData<4>
@ -333,7 +338,7 @@ Event PUB_OFF_HOLD.CLICK()
Transition = True$
HoldType = 'HOLD'
HoldData = ''
HoldData = Dialog_Box('DIALOG_HOLD',@WINDOW,Transition:@FM:@FM:HoldType)
HoldData = Dialog_Box('DIALOG_HOLD',@Window,Transition:@FM:@FM:HoldType)
If HoldData NE 'Cancel' then
GoSub GetView
Hold_Services('DisableMultipleHolds', WOMatKeys, 'RDS', RDSKeys, 'NDW_RDS_QUERY', '', HoldData)
@ -666,7 +671,7 @@ CheckSelectedForHolds:
Until HoldOnFlag EQ True$ and HoldOffFlag EQ True$
Next K
end
if MemberOf(@USER4, 'ENG_TECH') OR MemberOf(@USER4, 'LEAD') OR MemberOf(@USER4, 'SUPERVISOR') then
if MemberOf(@User4, 'ENG_TECH') OR MemberOf(@User4, 'LEAD') OR MemberOf(@User4, 'SUPERVISOR') then
// IF ANY SELECTED LOTS ARE ON HOLD, ENABLE PUB_OFF_HOLD
Set_Property(@Window:'.PUB_OFF_HOLD', 'ENABLED', HoldOffFlag)
end else

View File

@ -723,12 +723,16 @@ Event OLE_SCHEDULE.OnContextMenuClick(Item, UserData)
Description = AddEventDetails<5>
WaferQty = AddEventDetails<6>
NewApptID = Schedule_Services('AddSchedEvent', ReactorNo, WorkOrder, StartDTM, StopDTM, Description, WaferQty)
NewAppt = Schedule_Services('GetScheduleEvent', NewApptID)
If Error_Services('NoError') then
GoSub RefreshReactor
If NewApptID NE '' then
SchedRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', NewApptID)
Schedule_Services('NotifySupervisorsIfSameDayChange', SchedRec)
If Error_Services('NoError') then
NewAppt = Schedule_Services('GetScheduleEvent', NewApptID)
If Error_Services('NoError') then
GoSub RefreshReactor
If NewApptID NE '' then
SchedRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', NewApptID)
Schedule_Services('NotifySupervisorsIfSameDayChange', SchedRec)
end
end else
Error_Services('DisplayError')
end
end else
Error_Services('DisplayError')

View File

@ -39,8 +39,6 @@ $Insert POPUP_EQUATES
$Insert SEC_GROUPS_EQUATES
$Insert LSL_USERS_EQUATES
EQU READONLY_GREEN$ TO 192 + (220*256) + (192*65536)
Declare function Admin_User, Database_Services, Error_Services, Active_Directory_Services, SRP_Array
Declare subroutine PlaceDialog, Error_Services, Database_Services, Btree.Extract, ErrMsg
@ -726,3 +724,4 @@ UnlockRec:
return

View File

@ -97,17 +97,7 @@ Event WINDOW.CREATE(CreateParam)
LogData<5> = ToolLoc
LogData<6> = @Window:'.CREATE'
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
QAMetComplete = ''
If CassID NE '' then
If RowExists('WM_OUT', CassID) then
WOMatKey = Xlate('WM_OUT', CassID, 'WO_MAT_KEY', 'X')
end else
WOMatKey = Xlate('RDS', CassID, 'WO_MAT_KEY', 'X')
end
QAMetComplete = Wo_Mat_Qa_Services('GetQAMetComplete', WOMatKey)
end
Convert '.' to '*' in CassID
ExpectedQty = ''
ExpectedWfrMap = ''
@ -115,8 +105,6 @@ Event WINDOW.CREATE(CreateParam)
Set_Property(@Window:'.EDL_CASS_ID', 'TEXT', CassID)
Begin Case
Case (CassID NE '' AND QAMetComplete EQ False$)
ErrorMsg = 'Wafer Counter Operation Not Allowed. QA Metrology Incomplete.'
Case ( (CassID EQ '') and (ToolLoc EQ '') )
// Alternate workflow
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass ID')
@ -333,42 +321,32 @@ Event EDL_CASS_BARCODE.LOSTFOCUS(Flag, FocusID)
Begin Case
Case RowExists('RDS', CassetteID)
WOMatKey = Xlate('RDS', CassetteID, 'WO_MAT_KEY', 'X')
QAMetComplete = Wo_Mat_Qa_Services('GetQAMetComplete', WOMatKey)
If QAMetComplete EQ True$ then
ExpectedQty = Xlate('RDS', CassetteID, 'WFRS_OUT', 'X')
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass RDS')
Set_Property(@Window:'.LBL_CASS_BARCODE', 'TEXT', 'Cass RDS 2D')
WOMatKey = Xlate('RDS', CassetteID, 'WO_MAT_KEY', 'X')
CurrWfrMap = WO_Mat_Services('GetWaferMap', WOMatKey)
If Error_Services('NoError') then
ExpectedWfrMap = CurrWfrMap
end else
ErrorMsg = Error_Services('GetMessage')
end
ExpectedQty = Xlate('RDS', CassetteID, 'WFRS_OUT', 'X')
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass RDS')
Set_Property(@Window:'.LBL_CASS_BARCODE', 'TEXT', 'Cass RDS 2D')
WOMatKey = Xlate('RDS', CassetteID, 'WO_MAT_KEY', 'X')
CurrWfrMap = WO_Mat_Services('GetWaferMap', WOMatKey)
If Error_Services('NoError') then
ExpectedWfrMap = CurrWfrMap
end else
ErrorMsg = 'Wafer Counter Operation Not Allowed. A Metrology stage is incomplete.'
ErrorMsg = Error_Services('GetMessage')
end
Case RowExists('WM_OUT', CassetteID)
WOMatKey = Xlate('WM_OUT', CassetteID, 'WO_MAT_KEY', 'X')
QAMetComplete = Wo_Mat_Qa_Services('GetQAMetComplete', WOMatKey)
If QAMetComplete EQ True$ then
ExpectedQty = Xlate('WM_OUT', CassetteID, 'WAFER_CNT', 'X')
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass WMO')
Set_Property(@Window:'.LBL_CASS_BARCODE', 'TEXT', 'Cass WMO 2D')
CurrWfrMap = WM_Out_Services('GetWaferMap', CassetteID)
If Error_Services('NoError') then
ExpectedWfrMap = CurrWfrMap
end else
ErrorMsg = Error_Services('GetMessage')
end
ExpectedQty = Xlate('WM_OUT', CassetteID, 'WAFER_CNT', 'X')
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass WMO')
Set_Property(@Window:'.LBL_CASS_BARCODE', 'TEXT', 'Cass WMO 2D')
CurrWfrMap = WM_Out_Services('GetWaferMap', CassetteID)
If Error_Services('NoError') then
ExpectedWfrMap = CurrWfrMap
end else
ErrorMsg = 'Wafer Counter Operation Not Allowed. QA Metrology Incomplete.'
end
ErrorMsg = Error_Services('GetMessage')
end
End Case
If ErrorMsg EQ '' then
@ -423,7 +401,7 @@ end event
Event EDL_TOOL_BARCODE.LOSTFOCUS(Flag, FocusID)
If Flag EQ 1 then
ErrorMsg = ''
ScanData = Get_Property(CtrlEntID, 'TEXT')
@ -438,110 +416,155 @@ Event EDL_TOOL_BARCODE.LOSTFOCUS(Flag, FocusID)
Cnt = DCount(ScanData, '|')
If Cnt EQ 2 then
WaferSize = Field(ScanData, '|', 1)
Area = Field(ScanData, '|', 2)
Def = ""
Def<MTEXT$> = "Retreiving Wafer Counter Data..."
Def<MTYPE$> = "U"
CassID = Get_Property(@Window:'.EDL_CASS_BARCODE', 'TEXT')
MsgUp = Msg(@window, Def) ;* display the processing message
WcJson = Wafer_Counter_Services('GetWaferCounterJSON', WaferSize, Area, CassID)
Msg(@window, MsgUp) ;* take down the processing message
If Error_Services('NoError') then
objJSON = ''
If SRP_JSON(objJSON, 'Parse', WcJson) EQ '' then
ScanDtm = SRP_JSON(objJSON, 'GetValue', 'dateTimeFormatted')
ToolID = SRP_JSON(objJSON, 'GetValue', 'equipmentId')
WaferCount = SRP_JSON(objJSON, 'GetValue', 'total')
SlotMap = SRP_JSON(objJSON, 'GetValue', 'slotMap')
SRP_JSON(objJSON, 'Release')
Wafer_Counter_Services('AddScan', CassID, WaferCount, ScanDtm, ToolID, @User4, Area, SlotMap)
If Error_Services('NoError') then
Set_Property(@Window:'.EDL_SCAN_DTM', 'TEXT', ScanDtm)
Set_Property(@Window:'.EDL_TOOL_ID', 'TEXT', ToolID)
Set_Property(@Window:'.EDL_WAFER_COUNT', 'TEXT', WaferCount)
EmptyColorArray = RED$ : @FM : '' : @FM : '' : @FM : ''
FilledColorArray = GREEN$ : @FM : '' : @FM : '' : @FM : ''
RowIndex = 1
ResultArray = ''
ExpectedWfrMap = Get_Property(@Window, '@EXPECTED_WFR_MAP')
For SlotIndex = 1 to 25
SlotFilled = SlotMap[SlotIndex, 1]
ExpectedVal = ExpectedWfrMap[SlotIndex, 1]
ResultArray<1, SlotIndex> = 26 - SlotIndex
If SlotFilled EQ ExpectedVal then
ResultArray<2, SlotIndex> = ''
end else
ResultArray<2, SlotIndex> = 'Error'
end
RowIndex += 1
Next SlotIndex
ExpectedQty = Get_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT')
Set_Property(@Window:'.EDT_WAFER_COUNTER', 'ARRAY', ResultArray)
RowIndex = 1
For SlotIndex = 1 to 25
SlotFilled = SlotMap[SlotIndex, 1]
If SlotFilled then
CellColorArray = FilledColorArray
end else
CellColorArray = EmptyColorArray
end
Send_Message(@Window:'.EDT_WAFER_COUNTER', 'COLOR_BY_POS', 2, RowIndex, CellColorArray)
RowIndex += 1
Next SlotIndex
Begin Case
Case WaferCount NE ExpectedQty
ErrorMsg = 'Scanned wafer count "':WaferCount:'" does not match expected quantity "':ExpectedQty:'".'
Case SlotMap NE ExpectedWfrMap
ErrorMsg = 'Scanned wafer map does not match expected wafer map.'
Case Otherwise$
SuccessMessage = 'Wafer count verification complete!'
LogData = ''
LogData<1> = OConv(Datetime(), 'DT2/^H')
LogData<2> = @User4
LogData<3> = SuccessMessage
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
MsgStruct = ""
MsgStruct<MTEXTWIDTH$> = MSG_WIDTH$
MsgStruct<MCOL$> = -300
MsgStruct<MROW$> = 500
MsgStruct<MTYPE$> = "T4"
Msg(@Window, MsgStruct, 'PROCESS_COMPLETE', '', SuccessMessage)
AltFlow = Get_Property(@Window, '@ALTERNATE')
If AltFlow then
GoSub ClearForm
end else
End_Dialog(@Window, True$)
end
End Case
end else
ErrorMsg = Error_Services('GetMessage')
end
end else
ErrorMsg = 'Error parsing tool scan data.'
end
end else
ErrorMsg = Error_Services('GetMessage')
Area = Field(ScanData, '|', 2) ; // This is a proxy for the operation being performed
If Area EQ 'FQA' then
CassetteID = Get_Property(@Window:'.EDL_CASS_ID', 'TEXT')
Begin Case
Case RowExists('RDS', CassetteID)
WOMatKey = Xlate('RDS', CassetteID, 'WO_MAT_KEY', 'X')
QAMetComplete = Wo_Mat_Qa_Services('GetQAMetComplete', WOMatKey)
If QAMetComplete EQ True$ then
ExpectedQty = Xlate('RDS', CassetteID, 'WFRS_OUT', 'X')
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass RDS')
Set_Property(@Window:'.LBL_CASS_BARCODE', 'TEXT', 'Cass RDS 2D')
WOMatKey = Xlate('RDS', CassetteID, 'WO_MAT_KEY', 'X')
CurrWfrMap = WO_Mat_Services('GetWaferMap', WOMatKey)
If Error_Services('NoError') then
ExpectedWfrMap = CurrWfrMap
end else
ErrorMsg = Error_Services('GetMessage')
end
end else
ErrorMsg = 'Wafer Counter Operation Not Allowed. A Metrology stage is incomplete.'
end
Case RowExists('WM_OUT', CassetteID)
WOMatKey = Xlate('WM_OUT', CassetteID, 'WO_MAT_KEY', 'X')
QAMetComplete = Wo_Mat_Qa_Services('GetQAMetComplete', WOMatKey)
If QAMetComplete EQ True$ then
ExpectedQty = Xlate('WM_OUT', CassetteID, 'WAFER_CNT', 'X')
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass WMO')
Set_Property(@Window:'.LBL_CASS_BARCODE', 'TEXT', 'Cass WMO 2D')
CurrWfrMap = WM_Out_Services('GetWaferMap', CassetteID)
If Error_Services('NoError') then
ExpectedWfrMap = CurrWfrMap
end else
ErrorMsg = Error_Services('GetMessage')
end
end else
ErrorMsg = 'Wafer Counter Operation Not Allowed. QA Metrology Incomplete.'
end
End Case
end
If ErrorMsg EQ '' then
Def = ""
Def<MTEXT$> = "Retreiving Wafer Counter Data..."
Def<MTYPE$> = "U"
CassID = Get_Property(@Window:'.EDL_CASS_BARCODE', 'TEXT')
MsgUp = Msg(@window, Def) ;* display the processing message
WcJson = Wafer_Counter_Services('GetWaferCounterJSON', WaferSize, Area, CassID)
Msg(@window, MsgUp) ;* take down the processing message
If Error_Services('NoError') then
objJSON = ''
If SRP_JSON(objJSON, 'Parse', WcJson) EQ '' then
ScanDtm = SRP_JSON(objJSON, 'GetValue', 'dateTimeFormatted')
ToolID = SRP_JSON(objJSON, 'GetValue', 'equipmentId')
WaferCount = SRP_JSON(objJSON, 'GetValue', 'total')
SlotMap = SRP_JSON(objJSON, 'GetValue', 'slotMap')
SRP_JSON(objJSON, 'Release')
Wafer_Counter_Services('AddScan', CassID, WaferCount, ScanDtm, ToolID, @User4, Area, SlotMap)
If Error_Services('NoError') then
Set_Property(@Window:'.EDL_SCAN_DTM', 'TEXT', ScanDtm)
Set_Property(@Window:'.EDL_TOOL_ID', 'TEXT', ToolID)
Set_Property(@Window:'.EDL_WAFER_COUNT', 'TEXT', WaferCount)
EmptyColorArray = RED$ : @FM : '' : @FM : '' : @FM : ''
FilledColorArray = GREEN$ : @FM : '' : @FM : '' : @FM : ''
RowIndex = 1
ResultArray = ''
ExpectedWfrMap = Get_Property(@Window, '@EXPECTED_WFR_MAP')
For SlotIndex = 1 to 25
SlotFilled = SlotMap[SlotIndex, 1]
ExpectedVal = ExpectedWfrMap[SlotIndex, 1]
ResultArray<1, SlotIndex> = 26 - SlotIndex
If SlotFilled EQ ExpectedVal then
ResultArray<2, SlotIndex> = ''
end else
ResultArray<2, SlotIndex> = 'Error'
end
RowIndex += 1
Next SlotIndex
ExpectedQty = Get_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT')
Set_Property(@Window:'.EDT_WAFER_COUNTER', 'ARRAY', ResultArray)
RowIndex = 1
For SlotIndex = 1 to 25
SlotFilled = SlotMap[SlotIndex, 1]
If SlotFilled then
CellColorArray = FilledColorArray
end else
CellColorArray = EmptyColorArray
end
Send_Message(@Window:'.EDT_WAFER_COUNTER', 'COLOR_BY_POS', 2, RowIndex, CellColorArray)
RowIndex += 1
Next SlotIndex
Begin Case
Case WaferCount NE ExpectedQty
ErrorMsg = 'Scanned wafer count "':WaferCount:'" does not match expected quantity "':ExpectedQty:'".'
Case SlotMap NE ExpectedWfrMap
ErrorMsg = 'Scanned wafer map does not match expected wafer map.'
Case Otherwise$
SuccessMessage = 'Wafer count verification complete!'
LogData = ''
LogData<1> = OConv(Datetime(), 'DT2/^H')
LogData<2> = @User4
LogData<3> = SuccessMessage
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
MsgStruct = ""
MsgStruct<MTEXTWIDTH$> = MSG_WIDTH$
MsgStruct<MCOL$> = -300
MsgStruct<MROW$> = 500
MsgStruct<MTYPE$> = "T4"
Msg(@Window, MsgStruct, 'PROCESS_COMPLETE', '', SuccessMessage)
AltFlow = Get_Property(@Window, '@ALTERNATE')
If AltFlow then
GoSub ClearForm
end else
End_Dialog(@Window, True$)
end
End Case
end else
ErrorMsg = Error_Services('GetMessage')
end
end else
ErrorMsg = 'Error parsing tool scan data.'
end
end else
ErrorMsg = Error_Services('GetMessage')
end
end
end else
ErrorMsg = 'Invalid Tool Barcode Scan.'
end
end else
LogData = ''
LogData<1> = OConv(Datetime(), 'DT2/^H')
LogData<2> = @User4
LogData<3> = 'Verification process canceled'
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
End_Dialog(@Window, False$)
end
If ErrorMsg NE '' then
@ -624,9 +647,3 @@ ClearForm:
return

View File

@ -1221,7 +1221,6 @@ Event PUB_REM_CASS.CLICK()
WmInKeys = ''
for each CassetteToVoid in CassettesToVoid using @FM
WmInKeys<1, -1> = CassetteToVoid<1,4>
//Work_Order_Services('SignVoidWMI', WMIToVoid, @USER4)
Next CassetteToVoid
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'SignVoidWMI':SD$:WmInKeys:SD$:WoNo:SD$:@USER4)
If Error_Services('HasError') then
@ -1240,7 +1239,6 @@ Event PUB_REM_CASS.CLICK()
CassNo = XLATE('RDS', RDSToVoid, RDS_CASS_NO$, 'X')
WOMatKey = WONo : '*' : CassNo
WoMatKeyList<1, -1> = WoMatKey
//Work_Order_Services('SignVoidNonEPP', WOMatKey, @USER4)
If Error_Services('HasError') then
ErrorMessage = Error_Services('GetMessage')
end
@ -1332,7 +1330,7 @@ Event PUB_REM_WM_OUT.CLICK()
WmOutKeys<1, -1> = CassetteToVoid<1,3>
Until ErrorMessage NE ''
Next CassetteToVoid
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'SignVoidWMO':SD$:WmInKeys:SD$:WoNo:SD$:@USER4)
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'SignVoidWMO':SD$:WmOutKeys:SD$:WoNo:SD$:@USER4)
If Error_Services('HasError') then
ErrorMessage = Error_Services('GetMessage')
end

View File

@ -20,9 +20,9 @@ COMPILE FUNCTION obj_Post_Log(Method,Parms)
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, Get_Property, obj_RDS, Database_Services, Environment_Services
DECLARE FUNCTION Logging_Services, Datetime, SRP_DateTime, GetTickCount
DECLARE FUNCTION Logging_Services, Datetime, SRP_DateTime, GetTickCount, SRP_Datetime
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, Send_Dyn, RList, obj_WO_Log, Send_Event, obj_RDS
DECLARE SUBROUTINE obj_WO_Mat, Send_Info, obj_Notes, ErrMsg, Logging_Services, Mona_Services
DECLARE SUBROUTINE obj_WO_Mat, Send_Info, obj_Notes, ErrMsg, Logging_Services, Mona_Services, Database_Services
$INSERT POST_LOG_EQUATES
@ -222,12 +222,44 @@ Post:
IF Get_Status(errCode) THEN
Set_Status(0)
obj_Tables('UnlockRec',PlParms)
obj_Tables('UnlockRec',UFParms)
ClearSelect CursorVar
// 4/22/19 Added unlock statement to prevent POST_LOG service from locking up
Unlock hSysLists, ServiceKeyID else Null
RETURN
Tablename = Field(UFParms, @RM, 1, 1)
Key = Field(UFParms, @RM, 2, 1)
Database_Services('ReleaseKeyIDLock', Tablename, Key)
CurrDtm = Datetime()
FailureNotificationSent = PostLogRec<POST_LOG_FAILURE_NOTIFICATION_SENT$>
FailureNotificationDtm = PostLogRec<POST_LOG_FAILURE_NOTIFICATION_DTM$>
If FailureNotificationDtm NE '' then
SendReminder = ( SRP_Datetime('HourSpan', FailureNotificationDtm, CurrDtm) GE 1 )
end else
SendReminder = False$
end
If ( (FailureNotificationSent NE True$) or (SendReminder EQ True$) ) then
PostLogRec<POST_LOG_FAILED$> = True$
PostLogRec<POST_LOG_FAILURE_REASON$> = errCode
PostLogRec<POST_LOG_FAILURE_NOTIFICATION_SENT$> = True$
PostLogRec<POST_LOG_FAILURE_NOTIFICATION_DTM$> = CurrDtm
Database_Services('WriteDataRow', 'POST_LOG', PostLogKey, PostLogRec, True$, False$, False$)
// Notify OI_SYSADMIN group
Server = Environment_Services('GetServer')
Recipients = ''
SentFrom = 'SYSTEM'
Subject = 'Obj_Post_Log("Post") Error'
Message = OConv(CurrDtm, 'DT2/^H')
Message<2> = 'Error on server ':Server
Message<3> = 'Failed to write record ':Tablename:' ':Key:' . Error_Services error message: ':errCode
Swap @FM with \0D0A\ in Message
AttachWindow = ''
AttachKey = ''
SendToGroup = 'OI_SYSADMIN'
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
obj_Notes('Create',Parms)
end else
Database_Services('ReleaseKeyIDLock', 'POST_LOG', PostLogKey)
end
END ELSE
obj_Tables('DeleteRec',PlParms)
END

View File

@ -2108,5 +2108,3 @@ GetQAMet:
RETURN

View File

@ -18,6 +18,7 @@ COMPILE FUNCTION obj_RDS(Method,Parms)
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, NextKey, obj_WO_Verify, obj_Prod_Spec, Send_Dyn, obj_RDS_Makeup
DECLARE FUNCTION obj_RDS2, obj_RDS_Test, obj_WO_Mat, obj_Clean_Insp, obj_PRS_Prop, Database_Services, RDS_Services
DECLARE FUNCTION Return_To_Fab_Services
DECLARE FUNCTION Logging_Services, Environment_Services, Error_Services, Signature_Services, Lot_Services, Supplement_Services
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, obj_WO_Step, obj_RDS_Layer, obj_RDS_Test, obj_WM_In
DECLARE SUBROUTINE Btree.Extract, RDS_React_Run, Environment_Services, Logging_Services, Error_Services, Send_Info
@ -135,6 +136,13 @@ CurrStatus:
RDSCnt = COUNT(RDSNos,@VM) + (RDSNos NE '')
FOR R = 1 TO RDSCnt
OpenRTF = Return_To_Fab_Services('GetOpenReturnToFabRecordIdByCassId', RDSNos<R>)
IF OpenRTF NE '' THEN
ReturnVals<1,R> = 'RTF' ;* Open RTF on RDS *
GOTO StatusHere
END
NCRStatuses = XLATE('NCR',RDSRec<RDS_NCR_KEYS$>,7,'X')
IF INDEX(NCRStatuses,'O',1) THEN
@ -1242,3 +1250,4 @@ CalcThickTarget:
RETURN

View File

@ -18,7 +18,7 @@ COMPILE FUNCTION obj_Reactor_Log(Method,Parms)
*/
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, ErrMsg, Btree.Extract, obj_React_Item_Hist, Update_Index, obj_Post_Log
Declare subroutine Error_Services, Database_Services, React_Item_Services
Declare subroutine Error_Services, Database_Services, React_Item_Services, Reactor_Services
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, obj_React_Item, obj_Calendar, Database_Services
@ -117,7 +117,7 @@ PostReactItems:
InstRINos = ReactorLogRec<REACTOR_LOG_INST_RI_NO$>
CurrRINos = XLATE('REACTOR_LOG', RLNo, 'CURR_RI_NO', 'X')
ReactorType = Xlate('REACTOR', ReactNo, REACTOR_REACT_TYPE$, 'X')
//Check to make sure that everything is valid before adding or removing anything
ValidationFailureReason = ''
for each InstRINo in InstRINos using @VM
@ -125,6 +125,23 @@ PostReactItems:
If InstRIRec<REACT_ITEM_RETIRE_DT$> NE '' then
ValidationFailureReason = 'Unable to install Reactor Item No. ' : InstRINo : ' because its status is retired!'
end
If InstRIRec<REACT_ITEM_RI_TYPE$> EQ 'S' then
If InstRIRec<REACT_ITEM_PKT_SIZE$> EQ '' then
ValidationFailureReason = 'Unable to install Reactor Item No. ' : InstRINo : '. Pocket/Ring Size cannot be empty for Susceptor Reactor Items.'
end
If InstRIRec<REACT_ITEM_PKT_QTY$> EQ '' then
ValidationFailureReason = 'Unable to install Reactor Item No. ' : InstRINo : '. Pocket Qty cannot be empty for Susceptor Reactor Items.'
end
end
If (InstRIRec<REACT_ITEM_RI_TYPE$> NE 'RE') AND (InstRIRec<REACT_ITEM_RI_TYPE$> NE 'LE') then
If InstRIRec<REACT_ITEM_SERIAL_NO$> EQ '' then
ValidationFailureReason = 'Unable to install Reactor Item No. ' : InstRINo : '. Serial Number cannot be blank to non-elevator Reactor Items.'
end
end
// Only check first three characters so that ASM parts can be installed in an ASM+ reactor
If (InstRIRec<REACT_ITEM_PART_TYPE$>[1, 3] NE ReactorType[1, 3]) then
ValidationFailureReason = 'Unable to install Reactor Item No. ' : InstRINo : '. Reactor Type must match Reactor Item Part Type.'
end
Until ValidationFailureReason NE ''
Next InstRINo
@ -147,9 +164,17 @@ PostReactItems:
obj_React_Item_Hist('Install',oriParms)
IF Get_Status(errCode) THEN
END
IF Not(Get_Status(errCode)) THEN
RIKey = InstRINos<1,I>
RIRec = Xlate('REACT_ITEM', RIKey, '', 'X')
RIType = RIRec<REACT_ITEM_RI_TYPE$>
If RIType EQ 'S' then
PktSize = Xlate('REACT_ITEM', RIKey, 'PKT_SIZE_DESC', 'X')
PktQty = RIRec<REACT_ITEM_PKT_QTY$>
Reactor_Services('SetWaferSize', ReactNo, PktSize)
Reactor_Services('SetPocketQty', ReactNo, PktQty)
end
END
END ;* End of LOCATE check for Install RI number already in the reactor
NEXT I

File diff suppressed because it is too large Load Diff

View File

@ -20,6 +20,7 @@ DECLARE SUBROUTINE obj_Clean_Insp, Btree.Extract, Send_Info, obj_WO_Wfr, ErrMsg,
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, NextKey, obj_Prod_Spec, Send_Dyn, obj_Clean_Insp
DECLARE FUNCTION obj_RDS_Test, obj_Test_Point_Map, obj_Popup, obj_WO_Wfr, Logging_Services, Environment_Services
Declare function Return_To_Fab_Services
$INSERT APP_INSERTS
$INSERT REACT_RUN_EQUATES
@ -262,6 +263,13 @@ END
LSKeys = ReactRunRec<REACT_RUN_RDS_LAYER_KEYS$>
OpenRTF = Return_To_Fab_Services('GetOpenReturnToFabRecordIdByCassId', RDSNo)
IF OpenRTF NE '' THEN
Result = 'RTF' ;* Open RTF on WO_MAT *
RETURN
END
MetOutOfSpec = SUM(XLATE('RDS_LAYER',LSKeys,'TEST_OUT_OF_SPEC','X')) ;* Updated for Metrology update 4/16/2006 JCH
IF MetOutOfSpec > 0 THEN
@ -2278,3 +2286,4 @@ END
RETURN

View File

@ -205,8 +205,6 @@ WriteRec:
IF TestRec = '' THEN
DELETE TableVar,TableKey ELSE Null
* ErrorMsg = 'Blank table rec with ':QUOTE(TableKey):' on ':QUOTE(TableName):' table.'; *added 4/9/21 for debugging
* Set_FSError()
END ELSE
Set_Status(0)
rv = Get_Status(errCode)
@ -215,7 +213,6 @@ WriteRec:
END ELSE
ErrorMsg = 'Unable to write ':QUOTE(TableKey):' on ':QUOTE(TableName):' table.'
END
END
If ( (TableName NE '') and (TableKey NE '') ) then
@ -235,20 +232,9 @@ WriteRec:
LogData<7> = 'Record self locked: ':Database_Services('IsKeyIDSelfLocked', TableName, TableKey)
LogData<9> = 'Call stack: ':RetStack()
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
Recipients = ''
SendFrom = 'System'
Subject = 'obj_Tables("WriteRec") failed to release lock'
AttachWindow = TableName
AttachKey = TableKey
SendToGroup = 'FI_SUPPORT'
MessageParms = Recipients:@RM:SendFrom:@RM:Subject:@RM:UnlockError:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
obj_Notes('Create',MessageParms)
end
end
end
END
RETURN

View File

@ -19,7 +19,7 @@ Compile Function obj_WM_Out(Method,Parms)
Declare Function Get_Status, Msg, Utility, obj_Tables, NextKey, obj_WO_Verify, obj_Prod_Spec, Send_Dyn, obj_RDS_Makeup
Declare Function obj_RDS2, obj_WM_Out, Delete, Signature_Services, Environment_Services, Logging_Services
Declare Function Database_Services, SRP_Array
Declare Function Database_Services, SRP_Array, Return_To_Fab_Services
Declare Subroutine Set_Status, Msg, obj_Tables, Send_Dyn, obj_WO_Step, obj_RDS_Layer, obj_RDS_Test, Btree.Extract
Declare Subroutine Extract_SI_Keys, obj_WM_Out, obj_WO_Mat, obj_Post_Log, obj_WO_Mat_Log, ErrMsg, obj_WO_Wfr
Declare Subroutine Logging_Services, Material_Services, Database_Services, Update_Index, Work_Order_Services
@ -382,12 +382,18 @@ CurrStatus:
CurrLocation = XLATE('WO_MAT',WOMatKey,'CURR_LOCATION','X')
END
IF WOMatRec<WO_MAT_HOLD$> = 1 AND WOMatRec<WO_MAT_HOLD_ENTITY$,1> = 'WM_OUT' THEN
Result = 'HOLD' ;* Box is on Hold
RETURN
END
OpenRTF = Return_To_Fab_Services('GetOpenReturnToFabRecordIdByCassId', WMOutKey)
IF OpenRTF NE '' THEN
Result = 'RTF' ;* Open RTF on WM_OUT *
RETURN
END
IF WMOutRec<WM_OUT_SHIP_NO$> NE '' THEN
Result = 'SHIP'
@ -646,7 +652,12 @@ NextOpenSlots:
IsMULot = WMOutRec EQ True$
IsFQASigned = WMOutRec<WM_OUT_SUP_VER_SIG$> NE ''
IsVoided = WMOutRec<WM_OUT_VOID$>
If Not(IsMULot) AND Not(IsFQASigned) AND Not(IsVoided) then
WOMatKey = WONo : '*' : CassNo
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey, True$, 0, False$)
WOMatHold = WOMatRec<WO_MAT_HOLD$>
WOMatHoldEntity = WOMatRec<WO_MAT_HOLD_ENTITY$>
IsOnHold = WOMatHold EQ True$ and WOMatHoldEntity EQ 'WM_OUT'
If Not(IsMULot) AND Not(IsFQASigned) AND Not(IsVoided) AND Not(IsOnHold) then
FOR N = SlotCnt TO 1 STEP -1
IF WMOutRec<WM_OUT_SLOT_NO$,N> NE '' AND WMOutRec<WM_OUT_RDS$,N> = '' AND WMOutRec<WM_OUT_SLOT_NCR$,N> = '' AND WMOutRec<WM_OUT_UMW_CASS_ID$,N> = '' THEN
@ -1988,3 +1999,6 @@ ConvertCleanInsp:
RETURN

View File

@ -28,7 +28,7 @@ Compile Function obj_WO_Mat(Method,Parms)
Declare Function Get_Status, Msg, Utility, obj_Tables, Dialog_Box,NextKey, Popup, Get_Property, obj_RDS, RetStack
Declare Function Database_Services, GaN_Services, Logging_Services, Environment_Services, Signature_Services
Declare Function obj_WO_Mat, obj_WM_In, obj_WM_Out, obj_Prod_Spec, obj_Clean_Insp, obj_Calendar, obj_Popup
Declare Function Error_Services, Memberof, Datetime, GetTickCount
Declare Function Error_Services, Memberof, Datetime, GetTickCount, Return_To_Fab_Services
Declare Subroutine Set_Status, Msg, obj_Tables, Send_Dyn, Btree.Extract, ErrMsg, Send_Dyn, RList, obj_WO_Log, Send_Event
Declare Subroutine obj_RDS, Extract_SI_Keys, obj_Pend_Ship_Labels, obj_WO_Mat_QA, Work_Order_Services, Service_Services
Declare Subroutine obj_notes, obj_Clean_Insp, obj_Post_Log, Send_Info, obj_WO_Mat_Log, obj_SAP, obj_WO_Mat, obj_WO_Wfr
@ -664,13 +664,22 @@ CurrStatus:
RETURN
END
WMIKey = WOMatRec<WO_MAT_WMI_KEY$>
WMOKey = WOMatRec<WO_MAT_WMO_KEY$>
OpenRTF = Return_To_Fab_Services('GetOpenReturnToFabRecordIdByCassId', WMOKey)
IF OpenRTF NE '' THEN
Result = 'RTF' ;* Open RTF on WO_MAT *
Result = Oconv(Result, '[WO_MAT_CURR_STATUS_CONV]')
RETURN
END
IF WOMatRec<WO_MAT_SHIP_NO$> NE '' THEN
Result = 'SHIP'
RETURN
END
WMIKey = WOMatRec<WO_MAT_WMI_KEY$>
WMOKey = WOMatRec<WO_MAT_WMO_KEY$>
LocCnt = COUNT(WOMatRec<WO_MAT_INV_LOCATION$>,@VM) + (WOMatRec<WO_MAT_INV_LOCATION$> NE '')
@ -3284,7 +3293,20 @@ ReportStatus:
WMIStatus = WOMatRec<WO_MAT_WMI_CURR_STATUS$>
WMOStatus = WOMatRec<WO_MAT_WMO_CURR_STATUS$>
IF WMOStatus = 'COMP' THEN
OpenRTF = Return_To_Fab_Services('GetOpenReturnToFabRecordIdByCassId', RDSNo)
If OpenRTF EQ '' then
OpenRTF = Return_To_Fab_Services('GetOpenReturnToFabRecordIdByCassId', WMOKey)
end
IF OpenRTF NE '' THEN
Result = 'RTF' ;* Open RTF on WO_MAT *
Result = Oconv(Result, '[WO_MAT_CURR_STATUS_CONV]')
RETURN
END
IF WMOStatus = 'COMP' THEN
WMOStatus = obj_WO_Mat('CurrStatus',WOMatKey:@RM:WOMatRec)
END
@ -5714,3 +5736,5 @@ ExpCOA:
RETURN

View File

@ -14,7 +14,6 @@ COMPILE FUNCTION obj_WO_React(Method,Parms)
*/
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, NextKey, obj_Prod_Spec, obj_WO_Mat_QA, GetTickCount
Declare function Environment_Services, Database_Services
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, RList, ErrMsg, Btree.Extract, obj_WO_Mat_QA, Mona_Services
@ -70,222 +69,213 @@ RETURN Result
AddRdsNo:
* * * * * * *
StartTick = GetTickCount()
MetricName = 'AddRdsNo'
StartTick = GetTickCount()
MetricName = 'AddRdsNo'
WONo = Parms[1,@RM]
StepNo = Parms[COL2()+1,@RM]
ReactNo = Parms[COL2()+1,@RM]
RdsNo = Parms[COL2()+1,@RM]
CassNo = Parms[COL2()+1,@RM]
WONo = Parms[1,@RM]
StepNo = Parms[COL2()+1,@RM]
ReactNo = Parms[COL2()+1,@RM]
RdsNo = Parms[COL2()+1,@RM]
CassNo = Parms[COL2()+1,@RM]
IF WONo = '' THEN RETURN
IF StepNo = '' THEN RETURN
IF ReactNo = '' THEN RETURN
IF RdsNo = '' THEN RETURN
IF CassNo = '' THEN RETURN
IF WONo = '' THEN RETURN
IF StepNo = '' THEN RETURN
IF ReactNo = '' THEN RETURN
IF RdsNo = '' THEN RETURN
IF CassNo = '' THEN RETURN
WOReactKey = WONo:'*':StepNo:'*':ReactNo
otParms = 'WO_REACT':@RM:WOReactKey
WOReactRec = obj_Tables('ReadOnlyRec',otParms)
RDSNos = WOReactRec<WO_REACT_RDS_NO$>
CassNos = WOReactRec<WO_REACT_CASS_NO$>
PSNos = XLATE('WO_LOG',WoNo,'PROD_VER_STEP_PSN','X')
PSNo = PSNos<1,StepNo>
QAMetData = obj_Prod_Spec('GetQAMet',PSNo:@RM:@RM:1) ;* * * Get Reactor Scheduled QA Metrology * * *
IF QAMetData = '' THEN RETURN ;* No reactor scheduled QA_MET specified
Start = QAMetData<COL$QA_MET_START>
Interval = QAMetData<COL$QA_MET_INTERVAL>
Stage = QAMetData<COL$QA_MET_STAGE>
MetPropCd = QAMetData<COL$QA_MET_PROP>
GOSUB BuildAllTestPos ;* Set RDSNos, Start and Interval -> returns AllTestPos
* * * Find where the the RDS being added will be in the list. * * *
LOCATE RDSNo IN WOReactRec<WO_REACT_RDS_NO$> USING @VM SETTING InsPos THEN
WOReactKey = WONo:'*':StepNo:'*':ReactNo
otParms = 'WO_REACT':@RM:WOReactKey
WOReactRec = obj_Tables('UnlockRec',otParms)
RETURN ;* RDSNo already in this list -> nothing to do.
WOReactRec = obj_Tables('ReadOnlyRec',otParms)
RDSNos = WOReactRec<WO_REACT_RDS_NO$>
CassNos = WOReactRec<WO_REACT_CASS_NO$>
END ELSE
PSNos = XLATE('WO_LOG',WoNo,'PROD_VER_STEP_PSN','X')
PSNo = PSNos<1,StepNo>
LOCATE InsPos IN AllTestPos USING @VM SETTING TrimPos ELSE Null
QAMetData = obj_Prod_Spec('GetQAMet',PSNo:@RM:@RM:1) ;* * * Get Reactor Scheduled QA Metrology * * *
IF QAMetData = '' THEN RETURN ;* No reactor scheduled QA_MET specified
Start = QAMetData<COL$QA_MET_START>
Interval = QAMetData<COL$QA_MET_INTERVAL>
Stage = QAMetData<COL$QA_MET_STAGE>
MetPropCd = QAMetData<COL$QA_MET_PROP>
GOSUB BuildAllTestPos ;* Set RDSNos, Start and Interval -> returns AllTestPos
* * * Find where the the RDS being added will be in the list. * * *
LOCATE RDSNo IN WOReactRec<WO_REACT_RDS_NO$> USING @VM SETTING InsPos THEN
otParms = 'WO_REACT':@RM:WOReactKey
WOReactRec = obj_Tables('UnlockRec',otParms)
RETURN ;* RDSNo already in this list -> nothing to do.
END ELSE
LOCATE InsPos IN AllTestPos USING @VM SETTING TrimPos ELSE Null
ChangePosList = FIELD(AllTestPos,@VM,TrimPos,SeqCnt)
GOSUB RemSchedQA ;* Removes unsigned QAMet from cassettes scheduled past the box being removed
END
WOReactRec = INSERT(WOReactRec,WO_REACT_RDS_NO$,InsPos,0,RDSNo)
WOReactRec = INSERT(WOReactRec,WO_REACT_CASS_NO$,InsPos,0,CassNo) ;* Inserts the passed in RDSNo & associated cassette number from the data fields
RDSNos = WOReactRec<WO_REACT_RDS_NO$> ;* List after insert
CassNos = WOReactRec<WO_REACT_CASS_NO$> ;* List after insert
* * * Now build list for cassette
GOSUB BuildAllTestPos
ChangePosList = FIELD(AllTestPos,@VM,TrimPos,SeqCnt)
GOSUB RemSchedQA ;* Removes unsigned QAMet from cassettes scheduled past the box being removed
END
// Add QAMet spec data to cassettes now associated with the test
// positions after removing the RDS & Cassno from the lists
GOSUB AddSchedQA
WOReactRec = INSERT(WOReactRec,WO_REACT_RDS_NO$,InsPos,0,RDSNo)
WOReactRec = INSERT(WOReactRec,WO_REACT_CASS_NO$,InsPos,0,CassNo) ;* Inserts the passed in RDSNo & associated cassette number from the data fields
otParms = FIELDSTORE(otParms,@RM,4,0,WOReactRec)
// Done with updates to the WO_REACT record
obj_Tables('WriteOnlyRec',otParms)
RDSNos = WOReactRec<WO_REACT_RDS_NO$> ;* List after insert
CassNos = WOReactRec<WO_REACT_CASS_NO$> ;* List after insert
Result = Log
* * * Now build list for cassette
GOSUB BuildAllTestPos
ChangePosList = FIELD(AllTestPos,@VM,TrimPos,SeqCnt)
GOSUB AddSchedQA ;* Add QAMet spec data to cassettes now associated with the test positions after removing the RDS & Cassno from the lists
otParms = FIELDSTORE(otParms,@RM,4,0,WOReactRec)
obj_Tables('WriteOnlyRec',otParms) ;* Done with updates to the WO_REACT record
Result = Log
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN
* * * * * * *
RemRDSNo:
* * * * * * *
StartTick = GetTickCount()
MetricName = 'RemRDSNo'
StartTick = GetTickCount()
MetricName = 'RemRDSNo'
WONo = Parms[1,@RM]
StepNo = Parms[COL2()+1,@RM]
ReactNo = Parms[COL2()+1,@RM]
RdsNo = Parms[COL2()+1,@RM]
CassNo = Parms[COL2()+1,@RM]
WONo = Parms[1,@RM]
StepNo = Parms[COL2()+1,@RM]
ReactNo = Parms[COL2()+1,@RM]
RdsNo = Parms[COL2()+1,@RM]
CassNo = Parms[COL2()+1,@RM]
IF WONo = '' THEN RETURN
IF StepNo = '' THEN RETURN
IF ReactNo = '' THEN RETURN
IF RdsNo = '' THEN RETURN
IF CassNo = '' THEN RETURN
IF WONo = '' THEN RETURN
IF StepNo = '' THEN RETURN
IF ReactNo = '' THEN RETURN
IF RdsNo = '' THEN RETURN
IF CassNo = '' THEN RETURN
WOReactKey = WONo:'*':StepNo:'*':ReactNo
WOReactKey = WONo:'*':StepNo:'*':ReactNo
otParms = 'WO_REACT':@RM:WOReactKey
// 10/12/18 Changed to ReadOnlyRec as per Francois' instructions. - djs
WOReactRec = obj_Tables('ReadOnlyRec',otParms)
otParms = 'WO_REACT':@RM:WOReactKey
WOReactRec = obj_Tables('ReadOnlyRec',otParms)
RDSNos = WOReactRec<WO_REACT_RDS_NO$>
CassNos = WOReactRec<WO_REACT_CASS_NO$>
RDSNos = WOReactRec<WO_REACT_RDS_NO$>
CassNos = WOReactRec<WO_REACT_CASS_NO$>
PSNos = XLATE('WO_LOG',WoNo,'PROD_VER_STEP_PSN','X')
PSNo = PSNos<1,StepNo>
PSNos = XLATE('WO_LOG',WoNo,'PROD_VER_STEP_PSN','X')
PSNo = PSNos<1,StepNo>
QAMetData = obj_Prod_Spec('GetQAMet',PSNo:@RM:@RM:1) ;* * * Get Reactor Scheduled QA Metrology * * *
QAMetData = obj_Prod_Spec('GetQAMet',PSNo:@RM:@RM:1) ;* * * Get Reactor Scheduled QA Metrology * * *
Start = QAMetData<COL$QA_MET_START>
Interval = QAMetData<COL$QA_MET_INTERVAL>
Stage = QAMetData<COL$QA_MET_STAGE>
MetPropCd = QAMetData<COL$QA_MET_PROP>
Start = QAMetData<COL$QA_MET_START>
Interval = QAMetData<COL$QA_MET_INTERVAL>
Stage = QAMetData<COL$QA_MET_STAGE>
MetPropCd = QAMetData<COL$QA_MET_PROP>
GOSUB BuildAllTestPos ;* Set RDSNos, Start and Interval -> returns AllTestPos
GOSUB BuildAllTestPos ;* Set RDSNos, Start and Interval -> returns AllTestPos
IF AllTestPos NE '' THEN
IF AllTestPos NE '' THEN
* * * Find where the the RDS being removed is in the list. * * *
* * * Find where the the RDS being removed is in the list. * * *
LOCATE RDSNo IN WOReactRec<WO_REACT_RDS_NO$> USING @VM SETTING RemPos THEN
LOCATE RDSNo IN WOReactRec<WO_REACT_RDS_NO$> USING @VM SETTING RemPos THEN
LOCATE RemPos IN AllTestPos USING @VM SETTING TrimPos ELSE Null
ChangePosList = FIELD(AllTestPos,@VM,TrimPos,SeqCnt)
GOSUB RemSchedQA ;* Removes unsigned QAMet from cassettes scheduled past the box being removed
END ELSE
otParms = 'WO_REACT':@RM:WOReactKey
WOReactRec = obj_Tables('UnlockRec',otParms)
LOCATE RemPos IN AllTestPos USING @VM SETTING TrimPos ELSE Null
ChangePosList = FIELD(AllTestPos,@VM,TrimPos,SeqCnt)
GOSUB RemSchedQA ;* Removes unsigned QAMet from cassettes scheduled past the box being removed
END ELSE
otParms = 'WO_REACT':@RM:WOReactKey
WOReactRec = obj_Tables('UnlockRec',otParms)
RETURN ;* RDSNo is not in this list -> nothing to do.
END
END ;* End of check for AllTestPos null
RETURN ;* RDSNo is not in this list -> nothing to do.
END
END ;* End of check for AllTestPos null
WOReactRec = DELETE(WOReactRec,WO_REACT_RDS_NO$,RemPos,0)
WOReactRec = DELETE(WOReactRec,WO_REACT_CASS_NO$,RemPos,0) ;* Removes the passed in RDSNo & associated cassette number from the data fields
WOReactRec = DELETE(WOReactRec,WO_REACT_RDS_NO$,RemPos,0)
WOReactRec = DELETE(WOReactRec,WO_REACT_CASS_NO$,RemPos,0) ;* Removes the passed in RDSNo & associated cassette number from the data fields
RDSNos = WOReactRec<WO_REACT_RDS_NO$> ;* List after removal
CassNos = WOReactRec<WO_REACT_CASS_NO$> ;* List after removal
RDSNos = WOReactRec<WO_REACT_RDS_NO$> ;* List after removal
CassNos = WOReactRec<WO_REACT_CASS_NO$> ;* List after removal
* * * Now build list for cassette
GOSUB BuildAllTestPos
ChangePosList = FIELD(AllTestPos,@VM,TrimPos,SeqCnt)
* * * Now build list for cassette
GOSUB BuildAllTestPos
ChangePosList = FIELD(AllTestPos,@VM,TrimPos,SeqCnt)
GOSUB AddSchedQA ;* Add QAMet spec data to cassettes now associated with the test positions after removing the RDS & Cassno from the lists
otParms = FIELDSTORE(otParms,@RM,4,0,WOReactRec)
// 10/12/18 Changed to WriteOnlyRec as per Francois' instructions. - djs
obj_Tables('WriteOnlyRec',otParms) ;* Done with updates to the WO_REACT record
GOSUB AddSchedQA ;* Add QAMet spec data to cassettes now associated with the test positions after removing the RDS & Cassno from the lists
otParms = FIELDSTORE(otParms,@RM,4,0,WOReactRec)
Result = Log
obj_Tables('WriteOnlyRec',otParms) ;* Done with updates to the WO_REACT record
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
Result = Log
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN
************** Internal Methods *************
* * * * * * *
BuildAllTestPos:
* * * * * * *
AllTestPos = ''
AllTestPos = ''
RDSCnt = COUNT(RDSNos,@VM) + (RDSNos NE '')
SeqCnt = 0
RDSCnt = COUNT(RDSNos,@VM) + (RDSNos NE '')
SeqCnt = 0
FOR TestSeq = 1 TO RDSCnt
IF REM((TestSeq - Start),Interval) = 0 THEN
AllTestPos<1,-1> = TestSeq ;* Build list of list positions to have QAMet scheduled
SeqCnt += 1
END
NEXT TestSeq
FOR TestSeq = 1 TO RDSCnt
IF REM((TestSeq - Start),Interval) = 0 THEN
AllTestPos<1,-1> = TestSeq ;* Build list of list positions to have QAMet scheduled
SeqCnt += 1
END
NEXT TestSeq
Log := 'AllTestPos: ':AllTestPos:@FM
Log := 'AllTestPos: ':AllTestPos:@FM
RETURN
* * * * * * *
RemSchedQA:
* * * * * * *
chgCnt = COUNT(ChangePosList,@VM) + (ChangePosList NE '')
chgCnt = COUNT(ChangePosList,@VM) + (ChangePosList NE '')
FOR I = 1 TO chgCnt
RemCassNo = CassNos<1,ChangePoslist<1,I>>
Log:= 'RemSched on CassNo: ':RemCassNo:@FM
owmParms = WONo:@RM:StepNo:@RM:RemCassNo:@RM:Stage:@RM:MetPropCd
obj_WO_Mat_QA('RemQAMet',owmParms) ;* Unschedule test boxes before list change
IF Get_Status(errCode) THEN
ErrMsg(errCode)
END
*obj_WO_Mat('RemQAMet',owmParms) ;* Dead 6/5/2015 JCH - Remove after a few days
*IF Get_Status(errCode) THEN
* ErrMsg(errCode)
*END
NEXT I
FOR I = 1 TO chgCnt
RemCassNo = CassNos<1,ChangePoslist<1,I>>
Log:= 'RemSched on CassNo: ':RemCassNo:@FM
owmParms = WONo:@RM:StepNo:@RM:RemCassNo:@RM:Stage:@RM:MetPropCd
obj_WO_Mat_QA('RemQAMet',owmParms) ;* Unschedule test boxes before list change
IF Get_Status(errCode) THEN
ErrMsg(errCode)
END
NEXT I
RETURN
@ -294,47 +284,39 @@ RETURN
AddSchedQA:
* * * * * * *
chgCnt = COUNT(ChangePosList,@VM) + (ChangePosList NE '')
chgCnt = COUNT(ChangePosList,@VM) + (ChangePosList NE '')
FOR I = 1 TO chgCnt
AddCassNo = CassNos<1,ChangePoslist<1,I>>
Log:= 'AddSched on CassNo: ':AddCassNo:@FM
owmParms = WONo:@RM
owmParms := StepNo:@RM
owmParms := AddCassNo:@RM
owmParms := QAMetData<COL$QA_MET_STAGE>:@RM
owmParms := QAMetData<COL$QA_MET_TEST>:@RM
owmParms := QAMetData<COL$QA_MET_PROP>:@RM
owmParms := QAMetData<COL$QA_MET_TOOL_CLASS>:@RM
owmParms := QAMetData<COL$QA_MET_MIN>:@RM
owmParms := QAMetData<COL$QA_MET_MAX>:@RM
owmParms := QAMetData<COL$QA_MET_SLOT>:@RM
owmParms := QAMetData<COL$QA_MET_RECIPE>:@RM
owmParms := QAMetData<COL$QA_MET_RECIPE_PATTERN>:@RM
owmParms := QAMetData<COL$QA_MET_WFR_QTY>:@RM
owmParms := QAMetData<COL$QA_MET_WFR_TYPE>:@RM
owmParms := QAMetData<COL$QA_MET_REACT_SCHED>:@RM
owmParms := QAMetData<COL$QA_MET_SHIP_DOC>:@RM
owmParms := QAMetData<COL$QA_MET_PHASE_MIN> ; // 10/15/18 - djs - Added Phase Min Spec for HgCV
obj_WO_Mat_QA('AddQAMet', owmParms) ;* Schedule test boxes after list change
IF Get_Status(errCode) THEN
ErrMsg(errCode)
END
*obj_WO_Mat('AddQAMet',owmParms) ;* Dead 6/5/2015 JCH - remove after a few days
*IF Get_Status(errCode) THEN
* ErrMsg(errCode)
*END
NEXT I
FOR I = 1 TO chgCnt
AddCassNo = CassNos<1,ChangePoslist<1,I>>
Log:= 'AddSched on CassNo: ':AddCassNo:@FM
owmParms = WONo:@RM
owmParms := StepNo:@RM
owmParms := AddCassNo:@RM
owmParms := QAMetData<COL$QA_MET_STAGE>:@RM
owmParms := QAMetData<COL$QA_MET_TEST>:@RM
owmParms := QAMetData<COL$QA_MET_PROP>:@RM
owmParms := QAMetData<COL$QA_MET_TOOL_CLASS>:@RM
owmParms := QAMetData<COL$QA_MET_MIN>:@RM
owmParms := QAMetData<COL$QA_MET_MAX>:@RM
owmParms := QAMetData<COL$QA_MET_SLOT>:@RM
owmParms := QAMetData<COL$QA_MET_RECIPE>:@RM
owmParms := QAMetData<COL$QA_MET_RECIPE_PATTERN>:@RM
owmParms := QAMetData<COL$QA_MET_WFR_QTY>:@RM
owmParms := QAMetData<COL$QA_MET_WFR_TYPE>:@RM
owmParms := QAMetData<COL$QA_MET_REACT_SCHED>:@RM
owmParms := QAMetData<COL$QA_MET_SHIP_DOC>:@RM
owmParms := QAMetData<COL$QA_MET_PHASE_MIN> ; // 10/15/18 - djs - Added Phase Min Spec for HgCV
obj_WO_Mat_QA('AddQAMet', owmParms) ;* Schedule test boxes after list change
IF Get_Status(errCode) THEN
ErrMsg(errCode)
END
NEXT I
RETURN

View File

@ -117,11 +117,24 @@ API oiwizard.POST
ParseResponse = SRP_JSON(hWizardJSON, 'PARSE', WizardJSON)
If (ParseResponse EQ '') then
// Validate credentials and create a new session
UserID = SRP_JSON(hWizardJSON, 'GetValue', 'userID')
Password = SRP_JSON(hWizardJSON, 'GetValue', 'password')
UserID = SRP_JSON(hWizardJSON, 'GetValue', 'userID')
Password = SRP_JSON(hWizardJSON, 'GetValue', 'password')
ADUsername = SRP_JSON(hWizardJSON, 'GetValue', 'adUsername')
SRP_JSON(hWizardJSON, 'Release')
Authenticated = Active_Directory_Services('AuthenticateUser', UserID, Password, 'Infineon')
If Authenticated then
Domain = 'Infineon'
Begin Case
Case ( (UserID NE '') and (Password NE '') )
Authenticated = Active_Directory_Services('AuthenticateUser', UserID, Password, Domain)
Authorized = Active_Directory_Services('AuthorizeUser', UserID, Domain)
Case (ADUsername NE '')
Authenticated = True$
Authorized = Active_Directory_Services('AuthorizeUser', ADUsername, Domain)
If Authorized then UserId = ADUsername
Case Otherwise$
Authenticated = False$
Authorized = False$
End Case
If Authenticated and Authorized then
LSLUserID = Security_Services('GetLSLUser', UserID)
If LSLUserID NE '' then
OIWizardID = OI_Wizard_Services('CreateWizardID', LSLUserID)
@ -235,3 +248,4 @@ API oiwizard.checkidleoisessionvalid.GET
end
end api

View File

@ -450,11 +450,7 @@ Main:
lsData<I,7> = PropRec<PRS_PROP_TOOL$>
lsData<I,8> = PropRec<PRS_PROP_MET_WFR_TYPE$>
lsData<I,9> = PropRec<PRS_PROP_MET_RECIPE$>
If (PropRec<PRS_PROP_TOOL$> _NEC 'HgCV') then
lsData<I,10> = PropRec<PRS_PROP_MET_RECIPE_PATTERN$>
end else
lsData<I,10> = ''
end
lsData<I,10> = PropRec<PRS_PROP_MET_RECIPE_PATTERN$>
lsData<I,11> = PropRec<PRS_PROP_MET_INTERVAL$>
lsData<I,12> = PropRec<PRS_PROP_PROVEIN_WFR_TYPE$>
@ -468,11 +464,7 @@ Main:
lsData<I,7> = lsData<I,7>:CRLF$:PropRec<PRS_PROP_TOOL$>
lsData<I,8> = lsData<I,8>:CRLF$:PropRec<PRS_PROP_MET_WFR_TYPE$>
lsData<I,9> = lsData<I,9>:CRLF$:PropRec<PRS_PROP_MET_RECIPE$>
If (PropRec<PRS_PROP_TOOL$> _NEC 'HgCV') then
lsData<I,10> = lsData<I,10>:CRLF$:PropRec<PRS_PROP_MET_RECIPE_PATTERN$>
end else
lsData<I,10> = lsData<I,10>:CRLF$
end
lsData<I,10> = lsData<I,10>:CRLF$:PropRec<PRS_PROP_MET_RECIPE_PATTERN$>
lsData<I,11> = lsData<I,11>:CRLF$:PropRec<PRS_PROP_MET_INTERVAL$>
lsData<I,12> = lsData<I,12>:CRLF$:PropRec<PRS_PROP_PROVEIN_WFR_TYPE$>
@ -840,14 +832,10 @@ Main:
end else
colData<StepNo,STEP_PRODUCT$> = CHAR(185):obj_Met_Prop('GetPropDesc',StageRec<PRS_STAGE_MET_PROP$,M>)
end
If (StageRec<PRS_STAGE_MET_TOOL_CLASS$,M> _NEC 'HgCV') then
colData<StepNo,STEP_RECIPE$> = StageRec<PRS_STAGE_MET_RECIPE$,M>:CRLF$:StageRec<PRS_STAGE_MET_RECIPE_PATTERN$,M>
end else
colData<StepNo,STEP_RECIPE$> = StageRec<PRS_STAGE_MET_RECIPE$,M>
end
colData<StepNo,STEP_SPEC_TOL$> = StageRec<PRS_STAGE_MET_MIN$,M>:' - ':StageRec<PRS_STAGE_MET_MAX$,M>:' ':obj_Met_Prop('GetUnitsDesc',StageRec<PRS_STAGE_MET_PROP$,M>)
colData<StepNo,STEP_SIZE$> = StageRec<PRS_STAGE_MET_WFR_QTY$,M>
colData<StepNo,STEP_FREQ$> = StageRec<PRS_STAGE_MET_INTERVAL$,M>
colData<StepNo,STEP_RECIPE$> = StageRec<PRS_STAGE_MET_RECIPE$,M>:CRLF$:StageRec<PRS_STAGE_MET_RECIPE_PATTERN$,M>
colData<StepNo,STEP_SPEC_TOL$> = StageRec<PRS_STAGE_MET_MIN$,M>:' - ':StageRec<PRS_STAGE_MET_MAX$,M>:' ':obj_Met_Prop('GetUnitsDesc',StageRec<PRS_STAGE_MET_PROP$,M>)
colData<StepNo,STEP_SIZE$> = StageRec<PRS_STAGE_MET_WFR_QTY$,M>
colData<StepNo,STEP_FREQ$> = StageRec<PRS_STAGE_MET_INTERVAL$,M>
if processName EQ 'FQA' then
colData<StepNo,STEP_CTRL_METHOD$> = "WI"
colData<StepNo,STEP_REACT_PLAN$> = "EpiMSA WI-0485"

View File

@ -28,7 +28,7 @@ OPEN 'REACTOR_LOG' TO ReactLogTable ELSE
RETURN
END
OPEN 'DICT.REACTOR_LOG' TO @DICT ELSE
OPEN 'DICT.REACTOR_LOG' TO hReactLogDict ELSE
ErrorMsg = 'Unable to open "DICT.Reactor_LOG" table.'
ErrMsg(ErrorTitle:@SVM:ErrorMsg)
RETURN
@ -430,3 +430,4 @@ END
RETURN

View File

@ -11,6 +11,7 @@ $insert recipe_layer_info_equ
$insert msg_equates
$insert logical
$insert shipping_info_equ
$insert TOOL_CLASS_EQUATES
equ CrLf$ to char(13):char(10)
@ -19,10 +20,10 @@ declare function memberof, scroll_enable
ReturnVar = 0
declare function set_property, fieldcount, get_property, msg, editcell, send_event, dialog_box
declare subroutine create_note
Branches = 'LOAD_SURFACE_DEF,SET_MEASURE,LOAD_TOOL_RECIPE,SURFSCAN_CLICK,VALIDATE_DOPANT,VALIDATE_MINMAX,SET_SCANNED_IMAGE,VALIDATE_RECIPE,AKRION_RECIPE_CHECK,TW_TYPE_CHECK'
Branches = 'LOAD_SURFACE_DEF,SET_MEASURE,LOAD_TOOL_RECIPE,LOAD_TOOL_PATTERN,SURFSCAN_CLICK,VALIDATE_DOPANT,VALIDATE_MINMAX,SET_SCANNED_IMAGE,VALIDATE_RECIPE,AKRION_RECIPE_CHECK,TW_TYPE_CHECK'
convert ',' to @fm in Branches
locate Branch in Branches using @fm setting Bpos then
on Bpos gosub load_surface_def, set_measure, load_tool_recipe, surfscan_click, validate_dopant, validate_minmax, set_scanned_image, validate_recipe, akrion_recipe_check, tw_type_check
on Bpos gosub load_surface_def, set_measure, load_tool_recipe, load_tool_pattern, surfscan_click, validate_dopant, validate_minmax, set_scanned_image, validate_recipe, akrion_recipe_check, tw_type_check
end else
Void = msg( '', 'Invalid Branch ':Bpos:' passed to prod_spec_comm' )
end
@ -111,13 +112,24 @@ return
LOAD_TOOL_RECIPE:
Tool = get_property( @window:'.TOOL', 'TEXT' )
convert @lower_case to @upper_case in Tool
RecipeList = xlate( 'LISTBOX_CONFIG', Tool:'_RECIPES', '', 'X' )
RecipeList = xlate( 'TOOL_CLASS', Tool, TOOL_CLASS_RECIPES$, 'X' )
convert @vm to @fm in RecipeList
if RecipeList <> '' then
Void = set_property( @window:'.RECIPE', 'LIST', RecipeList )
end
return
*============================================================================*
*============================================================================*
LOAD_TOOL_PATTERN:
Tool = get_property( @window:'.TOOL', 'TEXT' )
convert @lower_case to @upper_case in Tool
PatternList = Xlate('TOOL_CLASS', Tool, TOOL_CLASS_PATTERN$, 'X')
CONVERT @VM To @FM IN PatternList
If PatternList Ne '' Then
Void = Set_Property(@Window:'.PATTERN', 'LIST', PatternList)
End
return
*============================================================================*
SURFSCAN_CLICK:
CtrlToUse = get_property( @window, '@SurfScanCtl' )
if get_property( @window:'.':CtrlToUse, 'CHECK' ) then

View File

@ -34,11 +34,12 @@ $Insert QA_MET_EQUATES
$Insert RDS_TEST_EQUATES
$Insert RDS_TEST_PROP_EQUATES
$Insert PRS_LAYER_EQU
$Insert PRS_PROP_EQUATES
Options SpecTypes = 'CLEAN', 'SURFSCAN', 'THICK', 'THICKA', 'RES', 'SRES', 'CRES', 'CONC'
Declare function Database_Services, Psn_Services, obj_Prod_Spec, Error_Services, SRP_JSON, Cust_Epi_Part_Services
Declare function Prod_Ver_Services, PRS_Stage_Services, SRP_Array
Declare function Prod_Ver_Services, PRS_Stage_Services, SRP_Array, Tool_Class_Services
Declare subroutine Database_Services, Psn_Services, Error_Services, SRP_JSON, Extract_Si_Keys
GoToService else
@ -104,6 +105,77 @@ Service GetRecipes(PSNo)
end service
Service GetMetrologyRecipesAndPatterns(PSNo)
ErrorMsg = ''
RecipesAndPatterns = ''
CurrIdx = 1
If PSNo NE '' then
If RowExists('PROD_SPEC', PSNo) then
PropKeys = ''
Extract_Si_Keys('PRS_PROP', 'PS_NO', PSNo, PropKeys)
for each PropKey in PropKeys using @VM setting pPos
Recipe = Xlate('PRS_PROP', PropKey, PRS_PROP_RECIPE$, 'X')
Pattern = Xlate('PRS_PROP', PropKey, PRS_PROP_PATTERN$, 'X')
Tool = Xlate('PRS_PROP', PropKey, PRS_PROP_TOOL$, 'X')
Convert @LOWER_CASE to @UPPER_CASE in Tool
If Recipe NE '' and Pattern NE '' and Tool NE '' then
PatternSize = Tool_Class_Services('GetNumberOfPointsForPattern', Tool, Pattern)
If Error_Services('NoError') then
Entry = Recipe:@VM:Pattern:@VM:PatternSize:@VM:Tool
RecipesAndPatterns<CurrIdx> = Entry
CurrIdx = CurrIdx + 1
end
end
Next PropKey
PRSStageKeys = ''
Extract_Si_Keys('PRS_STAGE', 'PS_NO', PSNo, PRSStageKeys)
for each PRSStageKey in PRSStageKeys using @VM setting sPos
Recipes = Xlate('PRS_STAGE', PRSStageKey, PRS_STAGE_MET_RECIPE$, 'X')
for each Recipe in Recipes using @VM setting rPos
Pattern = Xlate('PRS_STAGE', PRSStageKey, PRS_STAGE_MET_RECIPE_PATTERN$, 'X')<1, rPos>
Tool = Xlate('PRS_STAGE', PRSStageKey, PRS_STAGE_MET_TOOL_CLASS$, 'X')<1, rPos>
Convert @LOWER_CASE to @UPPER_CASE in Tool
If Recipe NE '' and Tool NE '' and Pattern NE '' then
PatternSize = Tool_Class_Services('GetNumberOfPointsForPattern', Tool, Pattern)
If Error_Services('NoError') then
Entry = Recipe:@VM:Pattern:@VM:PatternSize:@VM:Tool
RecipesAndPatterns<CurrIdx> = Entry
CurrIdx = CurrIdx + 1
end
end
Next Recipe
SurfScanRecipes = Xlate('PRS_STAGE', PRSStageKey, PRS_STAGE_SURFSCAN_RECIPE$, 'X')
If SurfScanRecipes NE '' then
for each SurfScanRecipe in SurfScanRecipes using @VM setting ssPos
Entry = SurfScanRecipe:@VM:'':@VM:'':@VM:'TENCOR'
RecipesAndPatterns<CurrIdx> = Entry
CurrIdx = CurrIdx + 1
Next SurfScanRecipe
end
Next PRSStageKey
RecipesAndPatterns = SRP_Array('Clean', RecipesAndPatterns, 'TrimAndMakeUnique')
end else
ErrorMsg = 'Error in ':Service:' service. PROD_SPEC record "':PSNo:'" does not exist.'
end
end else
ErrorMsg = 'Error in ':Service:' service. Null PSNo passed into service.'
end
If ErrorMsg EQ '' then
Response = RecipesAndPatterns
end else
Error_Services('Add', ErrorMsg)
end
end service
Service GetAllMetrologyRecipes(PSNo, GetSurfscan, GetClean, GetRes, GetThick)
Recipes = ''
@ -1085,6 +1157,22 @@ Service ConvertRecordToJSON(KeyID, Record, ItemURL)
SRP_JSON(objStageArray, 'Release')
end
RecipesAndPatterns = PSN_Services('GetMetrologyRecipesAndPatterns', KeyID)
If SRP_JSON(objRecipesAndPatternsArray, 'New', 'Array') then
for each RecipeAndPattern in RecipesAndPatterns using @FM setting rpPos
If SRP_JSON(objRecipeAndPattern, 'New', 'Object') then
SRP_JSON(objRecipeAndPattern, 'SetValue', 'recipe', RecipeAndPattern<1, 1>, 'String')
SRP_JSON(objRecipeAndPattern, 'SetValue', 'pattern', RecipeAndPattern<1, 2>, 'String')
SRP_JSON(objRecipeAndPattern, 'SetValue', 'patternSize', RecipeAndPattern<1, 3>, 'Number')
SRP_JSON(objRecipeAndPattern, 'SetValue', 'tool', RecipeAndPattern<1, 4>, 'String')
SRP_JSON(objRecipesAndPatternsArray, 'Add', objRecipeAndPattern)
SRP_JSON(objRecipeAndPattern, 'Release')
end
Next RecipeAndPattern
SRP_JSON(objProdSpec, 'Set', 'recipesAndPatterns', objRecipesAndPatternsArray)
SRP_JSON(objRecipesAndPatternsArray, 'Release')
end
SRP_JSON(objJSON, 'Set', 'prodSpec', objProdSpec)
SRP_JSON(objProdSpec, 'Release')
end
@ -1167,3 +1255,4 @@ return

View File

@ -145,7 +145,7 @@ Declare subroutine RTI_Set_Debugger, Database_Services, Btree.Extract, Extract_
Declare subroutine Set_Status, Sleepery, Winyield, Yield, SRP_COM, QA_Services, Logging_Services, Obj_RDS
Declare subroutine Validate, obj_WO_Mat, obj_WO_Mat_Log, obj_React_Status, Record_Lock, obj_React_State, obj_Post_Log
Declare subroutine RDS_Services, obj_WO_React, RDS_React_Run, Signature_Services, SQL_Services, SRP_Stopwatch
Declare subroutine Override_Services, Reactor_Services, Lot_Services, Obj_Notes, Mona_Services, Service_Services
Declare subroutine Override_Services, Reactor_Services, Lot_Services, Mona_Services, Service_Services, Obj_Notes
Declare subroutine Transaction_Services
Declare function SRP_Sort_Array, Metrology_Services, obj_RDS_Test, obj_Test_Point_Map, Database_Services
Declare function Work_Order_Services, SRP_JSON, Logging_Services, Environment_Services, SRP_Trim, Error_Services
@ -1828,22 +1828,6 @@ Service SignPreEpiStage(RDSNo, Username, WaferQty, Reactor, ScanEntry)
PSNo = RDSRec<RDS_PROD_SPEC_ID$>
WOStep = Xlate('RDS', RDSNo, 'WO_STEP', 'X')
BEGIN CASE
CASE OrgReactNo = '' AND Reactor NE ''
obj_WO_React('AddRdsNo',WONo:@RM:WOStep:@RM:Reactor:@RM:RDSNo:@RM:CassNo:@RM:PSNo)
CASE OrgReactNo NE '' AND Reactor = ''
obj_WO_React('RemRdsNo',WONo:@RM:WOStep:@RM:OrgReactNo:@RM:RDSNo:@RM:CassNo:@RM:PSNo)
CASE OrgReactNo NE Reactor
obj_WO_React('RemRdsNo',WONo:@RM:WOStep:@RM:OrgReactNo:@RM:RDSNo:@RM:CassNo:@RM:PSNo)
obj_WO_React('AddRdsNo',WONo:@RM:WOStep:@RM:Reactor:@RM:RDSNo:@RM:CassNo:@RM:PSNo)
CASE Otherwise$
NULL
END CASE
// Need to update/save RDS record before calling RDS_React_Run
RDSRec<RDS_REACTOR$> = Reactor
RDSRec<RDS_VERIFY_QTY$> = WaferQty
@ -2013,11 +1997,11 @@ end service
Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOpt)
StartTick = GetTickCount()
MetricName = 'LoadSignatureReady'
ErrorMsg = ''
Error_Services('Clear')
If (RDSNo EQ '') or (Username EQ '') or (WaferQty EQ '') then
ErrorMessage = 'Process Error: RDSNo, Username, or WaferQty not supplied in the ':Service:' service.'
Error_Services('Set', ErrorMessage)
ErrorMsg = 'Process Error: RDSNo, Username, or WaferQty not supplied in the ':Service:' service.'
Error_Services('Set', ErrorMsg)
Response = False$
return
end
@ -2055,15 +2039,15 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
ReactorCapacity = Reactor_Services('GetReactorAvailChamberCount', Reactor)
If ReactorCapacity LE 0 then
ErrorMessage = 'Process Error: Reactor ' : Reactor : ' does not have the capacity for this lot.'
Error_Services('Set', ErrorMessage)
ErrorMsg = 'Process Error: Reactor ' : Reactor : ' does not have the capacity for this lot.'
Error_Services('Set', ErrorMsg)
Response = False$
return
end
If WaferQty NE SchedQty then
ErrorMessage = 'Process Error: Verified wafer quantity does not match the scheduled quantity.'
Error_Services('Set', ErrorMessage)
ErrorMsg = 'Process Error: Verified wafer quantity does not match the scheduled quantity.'
Error_Services('Set', ErrorMsg)
Response = False$
return
end
@ -2083,8 +2067,8 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
// the parameters. If they do not confirm them, then we need to stop the load signature.
RDSLayerAckReq = Xlate('RDS', RDSNo, 'RDS_LAYER_ACK_REQ', 'X')
If RDSLayerAckReq EQ True$ then
ErrorMessage = 'RDS layer parameters must be reviewed for accuracy and acknowledged before the load operation can be signed.'
Error_Services('Set', ErrorMessage)
ErrorMsg = 'RDS layer parameters must be reviewed for accuracy and acknowledged before the load operation can be signed.'
Error_Services('Set', ErrorMsg)
Response = False$
return
end
@ -2167,9 +2151,9 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
ROTRStatus = ReactorRec<REACTOR_ROTR_STATUS$>
If ROTRStatus EQ 'F' then
ErrorMessage = 'Process Error: Unable to load reactor due to ROTR load block. ' |
ErrorMsg = 'Process Error: Unable to load reactor due to ROTR load block. ' |
: 'A lead or supervisor must clear the ROTR load block.'
Error_Services('Set', ErrorMessage)
Error_Services('Set', ErrorMsg)
Response = False$
return
end
@ -2252,35 +2236,149 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
// Add check for supplement signatures
UnacknowledgedSupp = Supplement_Services('UnacknowledgedSupplementCheck', 'RDS', RDSNo, 'LOAD')
If UnacknowledgedSupp NE FALSE$ then
ErrorMessage = 'The LOAD stage supplements must be acknowledged before the load operation can be signed.'
Error_Services('Set', ErrorMessage)
ErrorMsg = 'The LOAD stage supplements must be acknowledged before the load operation can be signed.'
Error_Services('Set', ErrorMsg)
Response = False$
return
end
If Error_Services('NoError') then
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
If ErrorMsg EQ '' then
Response = True$
end else
Response = False$
Error_Services('Add', ErrorMsg)
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
Service UnsignLoadSignatureReady(RDSNo)
ErrorMessage = ''
UnsignEligible = True$
If RowExists('RDS', RDSNo) then
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo, True$, 0, False$)
If Error_Services('NoError') then
WONo = RDSRec<RDS_WO$>
CassNo = RDSRec<RDS_CASS_NO$>
WoMatKey = WONo : '*' : CassNo
If RowExists('WO_MAT', WoMatKey) then
WOMatCurrStatus = obj_WO_Mat('CurrStatus',WOMatKey)
//Cases to check for various statuses that should block unsigning the unload.
Begin Case
Case WOMatCurrStatus EQ 'HOLD'
ErrorMessage = 'Cassette is on HOLD and may not have the signature removed.'
Case Otherwise$
End Case
If ErrorMessage EQ '' then
//Check if any subsequent signature are set. If so RDS is not eligible.
UnloadExtra1Sig = RDSRec<RDS_OP_OUT_EX1$>
LoadExtra1Sig = RDSRec<RDS_OP_IN_EX2$>
UnloadExtra2Sig = RDSRec<RDS_OP_OUT_EX2$>
LoadExtra2Sig = RDSRec<RDS_OP_IN_EX3$>
UnloadSig = RDSRec<RDS_OPERATOR_OUT$>Xlate('RDS', RDSNo, 'OPERATOR_OUT', 'X')
CISigs = Xlate('RDS', RDSNo, 'LWI_CI_SIG', 'X')
swap @VM with '' in CISigs
ReactorType = XLATE('RDS', RDSNo, 'REACTOR_TYPE', 'X')
If ReactorType NE 'EPP' Then
FQASig = Xlate('RDS', RDSNo, 'SUP_VER_SIG', 'X')
end else
WMOutKey = Xlate('RDS', RDSNo, 'WM_OUT_KEY', 'X')
FQASig = Xlate('WM_OUT', WMOutKey, 'SUP_VER_SIG', 'X')
end
Begin Case
Case FQASig NE ''
ErrorMessage = 'FQA Signature is set.'
Case CISigs NE ''
ErrorMessage = 'Clean and Inspect Signatures are set.'
Case UnloadSig NE ''
ErrorMessage = 'Unload signature is set.'
Case LoadExtra2Sig NE ''
ErrorMessage = 'Load extra 2 signature is set.'
Case UnloadExtra2Sig NE ''
ErrorMessage = 'Unload extra 2 signature is set.'
Case LoadExtra1Sig NE ''
ErrorMessage = 'Load extra 1 signature is set.'
Case UnloadExtra1Sig NE ''
ErrorMessage = 'Unload extra 1 signature is set.'
End Case
end
end else
ErrorMessage = 'Unable to locate the WO_MAT record for this RDS in the WO_MAT table.'
end
end else
ErrorMessage = 'Error reading RDS Record. ' : Error_Services('GetMessage')
end
end else
ErrorMessage = 'Unable to locate RDS in the RDS Table.'
end
If ErrorMessage NE '' then
UnsignEligible = False$
ErrorMessage = 'Process Error: Unable to verify the load signature is Eligible to be unsigned: ' : ErrorMessage
Error_Services('Add', ErrorMessage)
end
Response = UnsignEligible
end service
Service LoadExtra1stReady(RDSNo)
ErrorMsg = ''
Response = False$
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$>
StandardUnloadSignature = RDSRec<RDS_OPERATOR_OUT$>
If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature EQ '' And LoadExtra2Signature EQ ''AND UnloadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
Response = True$
if Error_Services('NoError') then
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$>
StandardUnloadSignature = RDSRec<RDS_OPERATOR_OUT$>
Reactor = RDSRec<RDS_REACTOR$>
If Reactor NE '' then
WONo = RDSRec<RDS_WO$>
Query = 'SELECT REACT_STATE WITH SCHED_WO CONTAINING ':WONo
GoSub ClearCursors
Set_Status(0)
RList(Query, TARGET_ACTIVELIST$, '', '' '')
SchedReactors = ''
EOF = False$
Loop
ReadNext SchedReactor else EOF = True$
Until EOF
SchedReactors<0, -1> = SchedReactor
Repeat
Locate Reactor in SchedReactors using @VM setting vPos then
If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature EQ '' And LoadExtra2Signature EQ ''AND UnloadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
Response = True$
end else
ErrorMsg = 'RDS is not eligible to have Load Extra 1 signed.'
end
end else
Swap @VM with ',' in SchedReactors
ErrorMsg = 'Assigned reactor, ':Reactor:', does not equal any scheduled reactor(s), ':SchedReactors:'.'
end
end
end else
ErrorMsg = Error_Services('GetMessage')
end
If ErrorMsg NE '' then
Error_Services('Add', ErrorMsg)
end
end service
@ -2288,54 +2386,106 @@ end service
Service UnsignLoadExtra1stReady(RDSNo)
ErrorMsg = ''
Response = False$
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$>
StandardUnloadSignature = RDSRec<RDS_OPERATOR_OUT$>
If LoadExtra1Signature NE '' then
If UnloadExtra2Signature EQ '' AND LoadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
Response = True$
end
if Error_Services('NoError') then
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$>
StandardUnloadSignature = RDSRec<RDS_OPERATOR_OUT$>
If LoadExtra1Signature NE '' then
If UnloadExtra2Signature EQ '' AND LoadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
Response = True$
end
end
end else
ErrorMsg = Error_Services('GetMessage')
end
If ErrorMsg NE '' then
Error_Services('Add', ErrorMsg)
end
end service
Service LoadExtra2ndReady(RDSNo)
ErrorMsg = ''
Response = False$
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$>
StandardUnloadSignature = RDSRec<RDS_OPERATOR_OUT$>
If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature NE '' AND UnloadExtra2Signature NE '' And LoadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
Response = True$
If Error_Services('NoError') then
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$>
StandardUnloadSignature = RDSRec<RDS_OPERATOR_OUT$>
Reactor = RDSRec<RDS_REACTOR$>
If Reactor NE '' then
WONo = RDSRec<RDS_WO$>
Query = 'SELECT REACT_STATE WITH SCHED_WO CONTAINING ':WONo
ClearSelect
Set_Status(0)
RList(Query, TARGET_ACTIVELIST$, '', '' '')
SchedReactors = ''
EOF = False$
Loop
ReadNext SchedReactor else EOF = True$
Until EOF
SchedReactors<0, -1> = SchedReactor
Repeat
Locate Reactor in SchedReactors using @VM setting vPos then
If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature NE '' AND UnloadExtra2Signature NE '' And LoadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
Response = True$
end else
ErrorMsg = 'RDS is not eligible to have the Load Extra 2 set.'
end
end else
Swap @VM with ',' in SchedReactors
ErrorMsg = 'Assigned reactor, ':Reactor:', does not equal any scheduled reactor(s), ':SchedReactors:'.'
Response = False$
end
end
end else
ErrorMsg = Error_Services('GetMessage')
end
If ErrorMsg NE '' then
Error_Services('Add', ErrorMsg)
end
end service
Service UnsignLoadExtra2ndReady(RDSNo)
ErrorMsg = ''
Response = False$
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$>
StandardUnloadSignature = RDSRec<RDS_OPERATOR_OUT$>
If LoadExtra2Signature NE '' then
If StandardUnloadSignature EQ '' then
Response = True$
end
If Error_Services('NoError') then
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$>
StandardUnloadSignature = RDSRec<RDS_OPERATOR_OUT$>
If LoadExtra2Signature NE '' then
If StandardUnloadSignature EQ '' then
Response = True$
end
end
end else
ErrorMsg = Error_Services('GetMessage')
end
If ErrorMsg NE '' then
Error_Services('Add', ErrorMsg)
end
end service
@ -2400,62 +2550,6 @@ Service SignLoadStage(RDSNo, Username, WaferQty, LLSide, ScanEntry)
Response = False$
return
end
IF ReactorType NE 'EPP' THEN
WOMatRec = XLATE('WO_MAT',WONo:'*':CassNo,'','X')
WOMatSigProfile = WOMatRec<WO_MAT_SIG_PROFILE$>
SigAction = WOStep:'LOAD'
LOCATE SigAction IN WOMatSigProfile USING @VM SETTING Pos THEN
WOMatSig = WOMatRec<WO_MAT_SIGNATURE$,Pos>
CurrDTM = OCONV(WOMatRec<WO_MAT_SIG_DTM$,Pos>,'DT/4^HS')
END ELSE
WOMatSig = ''
END
RDSSig = Xlate('RDS', RDSNo, 'OPERATOR_IN', 'X')
BEGIN CASE
CASE WOMatSig = '' AND RDSSig NE ''
* Signature missing on WO_MAT
SigDate = RDSRec<RDS_DATE_IN$>
SigTime = RDSRec<RDS_TIME_IN$>
owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:'LOAD':@RM:RDSSig:@RM:SigDate:' ':SigTime
* Sets LOAD signature
IF Get_Status(errCode) THEN
ErrorMsg = 'Process Error: Error calling obj_WO_Mat("SetSignature"). Error code: ':errCode
Error_Services('Set', ErrorMsg)
Response = False$
END else
Response = True$
end
return
CASE RDSSig = '' AND WOMatSig NE ''
* Signature missing on RDS
CurrDate = CurrDTM[1,' ']
CurrTime = CurrDTM[COL2()+1,' ']
RDSRec<RDS_OPERATOR_IN$> = WOMatSig
RDSRec<RDS_DATE_IN$> = IConv(CurrDate, 'D')
RDSRec<RDS_TIME_IN$> = IConv(CurrTime, 'MT')
Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$)
Response = True$
return
CASE RDSSig NE '' AND WOMatSig NE ''
ErrorMsg = 'Process Error: Load stage has already been signed.'
Error_Services('Set', ErrorMsg)
Response = False$
RETURN
CASE Otherwise$
Null
// Continue
END CASE
END
SigDt = OCONV( Date(), 'D2/' )
SigTm = OCONV( Time(), 'MTS' )
@ -3682,6 +3776,52 @@ Service SignFQAStage(RDSNo, Username)
end service
Service UnsignPreEpiReady(RDSNo)
ErrorMsg = ''
UnsignPreEpiReady = False$
If RDSNo NE '' then
If RowExists('RDS', RDSNo) then
If Error_Services('NoError') then
//Call on the same logic to determine if the unsign LOAD signature is ready
UnsignLoadReady = QA_Services('UnsignLoadSignatureReady', RDSNo)
if Error_Services('NoError') then
If UnsignLoadReady then
//Check if LOAD signature is present
LoadSig = Database_Services('ReadDataColumn', 'RDS', RDSNo, RDS_OPERATOR_IN$, True$, 0, False$)
If Error_Services('NoError') then
If LoadSig EQ '' then
UnsignPreEpiReady = True$
end else
ErrorMsg = 'Load signature is set.'
end
end else
ErrorMsg = Error_Services('GetMessage')
end
end else
ErrorMsg = 'A signature beyond pre-epi exists. Please check later stages of this RDS.'
end
end else
ErrorMsg = Error_Services('GetMessage')
end
end else
ErrorMsg = Error_Services('GetMessage')
end
end else
ErrorMsg = 'RDS ' : RDSNo : ' was not found in database.'
end
end else
ErrorMsg = 'RDS No was null'
end
If ErrorMsg NE '' then
Error_Services('Add', ErrorMsg)
end
Response = UnsignPreEpiReady
end service
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
@ -3695,3 +3835,12 @@ ClearCursors:
return

View File

@ -67,7 +67,8 @@ Declare function Error_Services, Database_Services, obj_RDS_Test, Logging_Ser
Declare function Tool_Parms_Services, Signature_Services, obj_WO_Mat_QA, Datetime, Override_Services
Declare function Rds_Services, SRP_DateTime, SRP_Math, obj_WO_Mat, Lot_Services, SRP_Array
Declare function Lot_Event_Services, GetTickCount, Work_Order_Services
Declare subroutine Error_Services, Database_Services, Logging_Services, Service_Services, Mona_Services
Declare subroutine Error_Services, Database_Services, Logging_Services, Service_Services, obj_WO_React
Declare Subroutine Mona_Services
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\RDS'
LogDate = Oconv(Date(), 'D4/')
@ -623,6 +624,7 @@ return
WRITE_RECORD_PRE:
ErrorMsg = ''
StartTick = GetTickCount()
MetricName = 'WriteRecordPre'
@ -766,10 +768,10 @@ WRITE_RECORD_PRE:
// Look for UNLOAD_DTM override
Override = Override_Services('GetOverride', 'RDS', RDSNo, 'UNLOAD_DTM')
Begin Case
Case ( (OrigLoadSig NE '') and (OrigReactor NE NewReactor) )
Case ( (OrigTimeOutSig NE '') and (OrigReactor NE NewReactor) )
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
@ -778,28 +780,11 @@ WRITE_RECORD_PRE:
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
// User is attempting to erase data that is prohibited from being erased Set the FS104 error and block the write.
Error_Services('Add', 'Reactor number cannot be changed or removed once the load signature is set!')
OrigFileError = 104:': Reactor number cannot be changed or removed once the load signature is set!'
ErrorMsg = 'Reactor number cannot be changed or removed once the unload signature is set!'
OrigFileError = 104:': Reactor number cannot be changed or removed once the unload signature is set!'
Status = 0
Record = ''
ActionFlow = ACTION_STOP$
Case ( (OrigVerSig NE '') and (NewVerSig EQ '') ) or ( (OrigVerDate NE '') and (NewVerDate EQ '') ) |
or ( (OrigVerTime NE '') and (NewVerTime EQ '') ) or ( (NewVerDate EQ '') and (NewVerTime NE '') ) |
or ( (NewVerDate NE '') and (NewVerTime EQ '') )
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = RDSKeyID
LogData<4> = 'Signature data cannot be removed!'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
// User is attempting to erase data that is prohibited from being erased Set the FS104 error and block the write.
Error_Services('Add', 'Signature data cannot be removed!')
OrigFileError = 104:': Signature data cannot be removed!'
Status = 0
Record = ''
ActionFlow = ACTION_STOP$
Case ( (VerDTM GT CurrDTM) or (LoadDTM GT CurrDTM) or (LoadEx2DTM GT CurrDTM) or (LoadEx3DTM GT CurrDTM) |
or (UnloadEx1DTM GT CurrDTM) or (UnloadEx2DTM GT CurrDTM) or (UnloadDTM GT CurrDTM) |
@ -812,7 +797,7 @@ WRITE_RECORD_PRE:
LogData<4> = 'Signature datetime is greater than current datetime!'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'Signature datetime is greater than current datetime!')
ErrorMsg = 'Signature datetime is greater than current datetime!'
OrigFileError = 104:': Signature datetime is greater than current datetime!'
Status = 0
Record = ''
@ -833,7 +818,7 @@ WRITE_RECORD_PRE:
LogData<4> = 'Signature datetime is less than a previous signature datetime!'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'Signature datetime is less than a previous signature datetime!')
ErrorMsg = 'Signature datetime is less than a previous signature datetime!'
OrigFileError = 104:': Signature datetime is less than a previous signature datetime!'
Status = 0
Record = ''
@ -848,7 +833,7 @@ WRITE_RECORD_PRE:
LogData<4> = 'Cassette runtime exceeds three days!'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'Cassette runtime exceeds three days!')
ErrorMsg = 'Cassette runtime exceeds three days!'
OrigFileError = 104:': Cassette runtime exceeds three days!'
Status = 0
Record = ''
@ -861,11 +846,16 @@ WRITE_RECORD_PRE:
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
If ErrorMsg NE '' then
Error_Services('Add', ErrorMsg)
end
return
WRITE_RECORD:
StartTick = GetTickCount()
MetricName = 'WriteRecord'
@ -880,6 +870,32 @@ WRITE_RECORD:
OrigDateOut = OrigRecord<RDS_DATE_OUT$>
NewDateOut = Record<RDS_DATE_OUT$>
RDSNo = {SEQ}
Reactor = Record<RDS_REACTOR$>
OrgReactNo = OrigRecord<RDS_REACTOR$>
CassNo = Record<RDS_CASS_NO$>
PSNo = Record<RDS_PROD_SPEC_ID$>
WOStep = Xlate('RDS', RDSNo, 'WO_STEP', 'X')
BEGIN CASE
CASE OrgReactNo = '' AND Reactor NE ''
//Assignment to a reactor where there was no prior assigned reactor
obj_WO_React('AddRdsNo',WONo:@RM:WOStep:@RM:Reactor:@RM:RDSNo:@RM:CassNo:@RM:PSNo)
CASE OrgReactNo NE '' AND Reactor = ''
//Reactor Assignment is being cleared.
obj_WO_React('RemRdsNo',WONo:@RM:WOStep:@RM:OrgReactNo:@RM:RDSNo:@RM:CassNo:@RM:PSNo)
CASE OrgReactNo NE Reactor
//Reactor Assignment is changing
obj_WO_React('RemRdsNo',WONo:@RM:WOStep:@RM:OrgReactNo:@RM:RDSNo:@RM:CassNo:@RM:PSNo)
obj_WO_React('AddRdsNo',WONo:@RM:WOStep:@RM:Reactor:@RM:RDSNo:@RM:CassNo:@RM:PSNo)
CASE Otherwise$
NULL
END CASE
If ( ( (OrigDateOut EQ '') and (NewDateOut NE '') ) ) then
// Mark this cassette as processed in the schedule event record
DatetimeOut = {DATETIME_OUT}
@ -1002,4 +1018,3 @@ Restore_System_Variables:
return

View File

@ -99,6 +99,13 @@ API rds.ID.PUT
end api
API rds.ID.zpl.HEAD
API rds.ID.zpl.GET
GoSub CreateZPLItem
end api
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -128,3 +135,29 @@ CreateHALItem:
end
return
//----------------------------------------------------------------------------------------------------------------------
// CreateZPLItem
//
// Creates a HAL+JSON object with the ZPL for the given WM_IN row
//----------------------------------------------------------------------------------------------------------------------
CreateZPLItem:
RdsKey = ParentSegment
ZPL = Rds_Services('GetRdsZpl', RdsKey)
If Error_Services('NoError') then
StatusCode = 200
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
HTTP_Services('SetResponseBody', ZPL, False$, 'text/plain')
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
return

View File

@ -82,8 +82,6 @@ Equ COL$MET_SIG_DTM to 12
Equ MSG_WIDTH$ to 600
EQU READONLY_GREEN$ TO 192 + (220*256) + (192*65536)
Declare subroutine ErrMsg, Set_Status, obj_WO_Mat, obj_WO_Mat_Log, obj_RDS, Set_Property, Send_Event, Database_Services
Declare subroutine Dialog_Box, Qa_Services, Obj_React_Ll, Start_Window, obj_React_Status, Reactor_Services, Rds_Services
Declare subroutine Lot_Event_Services, Override_Log_Services, Logging_Services
@ -170,7 +168,7 @@ end event
Event PUB_SIGN.CLICK()
RDSNo = Get_Property(@WINDOW:'.RDS_NO','TEXT')
ReactorType = Get_Property(@WINDOW:'.REACTOR_TYPE','TEXT')
LoadLockVal = Get_Property(@WINDOW:'.LOAD_LOCK_SIDE_HIDDEN','TEXT')
@ -183,365 +181,354 @@ Event PUB_SIGN.CLICK()
LSIDArray = Get_Property(@WINDOW:'.RDS_LS_ID','ARRAY')
Preauthenticated = FALSE$
SignEventType = Get_Property(CtrlEntID, 'TEXT')
WoMatKey = WONo : '*' : CassNo
Begin Case
Case SignEventType EQ 'Sign'
RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP')
WfrQty = Get_Property(@WINDOW:'.WAFERS_IN','TEXT')
LLSide = Get_Property(@Window:'.LOAD_LOCK_SIDE', 'DEFPROP')
Reactor = Get_Property(@Window:'.REACTOR', 'TEXT')
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', Reactor)
ReactorType = ReactorRec<REACTOR_REACT_TYPE$>
ROTREnabled = Xlate('REACTOR', Reactor, 'ENABLE_ROTR', 'X')
// Don't allow tracking in on down reactor
ReactorCurrModeKey = Xlate('REACTOR_CHILD_KEY_IDS_NG', Reactor, 1, 'X')
ReactCurrModeRec = Database_Services('ReadDataRow','REACT_MODE_NG', ReactorCurrModeKey, '','','')
CurrReactMode = ReactCurrModeRec<REACT_MODE_NG_MODE$>
CurrE10State = Xlate('REACTOR_MODES', CurrReactMode, REACTOR_MODES_E10_STATE$, 'X')
Override = False$
UserVerification = ''
OverrideGroups = 'LEAD':@VM:'SUPERVISOR':@VM:'ENGINEERING':@VM:'ENG_TECH':@VM:'ROTR_OVERRIDE'
ReactorIsDown = CurrE10State _NEC 'PRODUCTIVE'
If (ReactorIsDown EQ True$) then
// Allow override during prove in
If ReactorType EQ 'EPP' then
If RDS_Services('IsEpiProTestRun', RDSNo) then Override = True$
end
If Override EQ False$ then
UserMsg = "Reactor down. Override required from a lead or supervisor."
UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups:@FM:'':@FM:UserMsg)
Override = UserVerification<1>
end
end
If (ReactorIsDown NE True$) OR (Override EQ True$) then
If (ReactorType EQ 'ASM+' OR ReactorType EQ 'HTR' OR ReactorType EQ 'ASM') AND (ROTREnabled EQ True$) then
ROTRStatus = ReactorRec<REACTOR_ROTR_STATUS$>
If ROTRStatus EQ 'F' then
FailReason = ReactorRec<REACTOR_ROTR_STATUS_REASON$>
Message = 'Unable to load reactor.' : CRLF$ : FailReason
RotrOverrideCount = ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$>
If RotrOverrideCount EQ '' then RotrOverrideCount = 0
Message := CRLF$ : RotrOverrideCount : ' override(s) were performed since the ROTR block was originally set.'
Message := CRLF$ : 'A lead or supervisor must override to clear ROTR status.'
Reactor = Database_Services('ReadDataColumn', 'RDS', RDSNo, RDS_REACTOR$, True$, 0, False$)
If Error_Services('NoError') then
If Reactor NE '' then
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', Reactor)
if Error_Services('NoError') then
ReactorType = ReactorRec<REACTOR_REACT_TYPE$>
ROTREnabled = Xlate('REACTOR', Reactor, 'ENABLE_ROTR', 'X')
Response = Msg(@Window, '', 'RDS_ROTR_OVERRIDE', '', Message)
// Don't allow tracking in on down reactor
ReactorCurrModeKey = Xlate('REACTOR_CHILD_KEY_IDS_NG', Reactor, 1, 'X')
ReactCurrModeRec = Database_Services('ReadDataRow','REACT_MODE_NG', ReactorCurrModeKey, '','','')
CurrReactMode = ReactCurrModeRec<REACT_MODE_NG_MODE$>
CurrE10State = Xlate('REACTOR_MODES', CurrReactMode, REACTOR_MODES_E10_STATE$, 'X')
Begin Case
Case Response EQ 1
Response = True$ ; // User Clicked Override
Case Response EQ 2
Response = False$ ; // User Clicked Cancel
Case Response EQ char(27)
Response = False$ ; // User Pressed Escape Key
End Case
Override = False$
UserVerification = ''
OverrideGroups = 'LEAD':@VM:'SUPERVISOR':@VM:'ENGINEERING':@VM:'ENG_TECH':@VM:'ROTR_OVERRIDE'
If Response EQ True$ then
If UserVerification EQ '' then
UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups)
ReactorIsDown = CurrE10State _NEC 'PRODUCTIVE'
If (ReactorIsDown EQ True$) then
// Allow override during prove in
If ReactorType EQ 'EPP' then
If RDS_Services('IsEpiProTestRun', RDSNo) then Override = True$
end
Valid = UserVerification<1>
If Valid EQ True$ then
// Prompt user for a comment
ResponseComment = Dialog_Box('NDW_ADD_COMMENT', @WINDOW)
IF ResponseComment<2> NE '' THEN
// Clear ROTR reactor load block.
overrideLogTable = 'RDS':@VM:'REACTOR'
overrideLogKey = RDSNo:@VM:Reactor
overrideLogUser = Response<2>
overrideLogComment = ResponseComment<2>
overrideLogCategory = 'ROTR_BLOCK'
overrideLogCause = FailReason
orKey = Override_Log_Services('Create', overrideLogTable, overrideLogKey, overrideLogUser, overrideLogComment, overrideLogCategory, overrideLogCause)
If Override EQ False$ then
UserMsg = "Reactor down. Override required from a lead or supervisor."
UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups:@FM:'':@FM:UserMsg)
Override = UserVerification<1>
end
end
If (ReactorIsDown NE True$) OR (Override EQ True$) then
If (ReactorType EQ 'ASM+' OR ReactorType EQ 'HTR' OR ReactorType EQ 'ASM') AND (ROTREnabled EQ True$) then
ROTRStatus = ReactorRec<REACTOR_ROTR_STATUS$>
If ROTRStatus EQ 'F' then
FailReason = ReactorRec<REACTOR_ROTR_STATUS_REASON$>
Message = 'Unable to load reactor.' : CRLF$ : FailReason
RotrOverrideCount = ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$>
If RotrOverrideCount EQ '' then RotrOverrideCount = 0
Message := CRLF$ : RotrOverrideCount : ' override(s) were performed since the ROTR block was originally set.'
Message := CRLF$ : 'A lead or supervisor must override to clear ROTR status.'
//Add override key to RDS
RDSRec = Xlate('RDS', RDSNo, '', 'X')
RDSRec = Insert(RDSRec, RDS_OVERRIDE_KEYS$, 1, 0, orKey)
Response = Msg(@Window, '', 'RDS_ROTR_OVERRIDE', '', Message)
ReactorRec<REACTOR_ROTR_STATUS$> = 'P'
rotrStatusReason = ReactorRec<REACTOR_ROTR_STATUS_REASON$>
ReactorRec<REACTOR_PREVIOUS_ROTR_STATUS_REASON$> = rotrStatusReason
ReactorRec<REACTOR_ROTR_STATUS_REASON$> = ''
ReactorRec<REACTOR_PREVIOUS_ROTR_OVERRIDE_RDS$> = RDSNo
rotrOverrideCount = ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$>
ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$> = rotrOverrideCount + 1
Database_Services('WriteDataRow', 'REACTOR', Reactor, ReactorRec, True$, False$, True$)
Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$)
Begin Case
Case Response EQ 1
Response = True$ ; // User Clicked Override
Case Response EQ 2
Response = False$ ; // User Clicked Cancel
Case Response EQ char(27)
Response = False$ ; // User Pressed Escape Key
End Case
If Response EQ True$ then
If UserVerification EQ '' then
UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups)
end
Valid = UserVerification<1>
If Valid EQ True$ then
// Prompt user for a comment
ResponseComment = Dialog_Box('NDW_ADD_COMMENT', @WINDOW)
IF ResponseComment<2> NE '' THEN
// Clear ROTR reactor load block.
overrideLogTable = 'RDS':@VM:'REACTOR'
overrideLogKey = RDSNo:@VM:Reactor
overrideLogUser = Response<2>
overrideLogComment = ResponseComment<2>
overrideLogCategory = 'ROTR_BLOCK'
overrideLogCause = FailReason
orKey = Override_Log_Services('Create', overrideLogTable, overrideLogKey, overrideLogUser, overrideLogComment, overrideLogCategory, overrideLogCause)
//Add override key to RDS
RDSRec = Xlate('RDS', RDSNo, '', 'X')
RDSRec = Insert(RDSRec, RDS_OVERRIDE_KEYS$, 1, 0, orKey)
ReactorRec<REACTOR_ROTR_STATUS$> = 'P'
rotrStatusReason = ReactorRec<REACTOR_ROTR_STATUS_REASON$>
ReactorRec<REACTOR_PREVIOUS_ROTR_STATUS_REASON$> = rotrStatusReason
ReactorRec<REACTOR_ROTR_STATUS_REASON$> = ''
ReactorRec<REACTOR_PREVIOUS_ROTR_OVERRIDE_RDS$> = RDSNo
rotrOverrideCount = ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$>
ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$> = rotrOverrideCount + 1
Database_Services('WriteDataRow', 'REACTOR', Reactor, ReactorRec, True$, False$, True$)
Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$)
end else
//No Comment added. Block Load Signaure
Msg(@Window, 'A comment is required to perform an ROTR Block Override', '', '', '')
return
end
end else
// ROTR override not verified. Block load signature.
return
end
end else
// Block load signature
return
end
end
end
SupplAckReq = Supplement_Services('UnacknowledgedSupplementCheck', 'RDS', RDSNo, 'LOAD')
IF (SupplAckReq NE FALSE$) then
Response = Dialog_Box('NDW_RDS_SUPP_SIG', @Window, RDSNo :@FM: 'LOAD' :@FM: FALSE$)
If Response EQ False$ then
return
end else
//No Comment added. Block Load Signaure
Msg(@Window, 'A comment is required to perform an ROTR Block Override', '', '', '')
PreAuthenticated = TRUE$
end
end
RDSLayerAckReq = Xlate('RDS', RDSNo, 'RDS_LAYER_ACK_REQ', 'X')
If RDSLayerAckReq EQ True$ then
ErrorMessage = 'RDS layer parameters must be reviewed for accuracy and acknowledged before the load operation can be signed.'
ErrMsg(ErrorMessage)
LayerKeys = Xlate('RDS', RDSNo, 'RDS_LAYER_KEYS', 'X')
// Just display the first layer
RDSLSID = LayerKeys<0, 1>
Dialog_Box('RDS_LAYER', @Window, RDSLSID)
RDSLayerAck = Xlate('RDS', RDSNo, 'RDS_LAYER_ACK', 'X')
If ( (RDSLayerAck EQ False$) or (RDSLayerAck EQ '') ) then
ErrorMessage = 'RDS layer parameters were not acknowledged. Sign load stage event aborting.'
ErrMsg(ErrorMessage)
return
end
end else
// ROTR override not verified. Block load signature.
return
end
end else
// Block load signature
return
end
end
end
SupplAckReq = Supplement_Services('UnacknowledgedSupplementCheck', 'RDS', RDSNo, 'LOAD')
IF (SupplAckReq NE FALSE$) then
Response = Dialog_Box('NDW_RDS_SUPP_SIG', @Window, RDSNo :@FM: 'LOAD' :@FM: FALSE$)
If Response EQ False$ then
return
end else
PreAuthenticated = TRUE$
end
end
RDSLayerAckReq = Xlate('RDS', RDSNo, 'RDS_LAYER_ACK_REQ', 'X')
If RDSLayerAckReq EQ True$ then
ErrorMessage = 'RDS layer parameters must be reviewed for accuracy and acknowledged before the load operation can be signed.'
ErrMsg(ErrorMessage)
LayerKeys = Xlate('RDS', RDSNo, 'RDS_LAYER_KEYS', 'X')
// Just display the first layer
RDSLSID = LayerKeys<0, 1>
Dialog_Box('RDS_LAYER', @Window, RDSLSID)
RDSLayerAck = Xlate('RDS', RDSNo, 'RDS_LAYER_ACK', 'X')
If ( (RDSLayerAck EQ False$) or (RDSLayerAck EQ '') ) then
ErrorMessage = 'RDS layer parameters were not acknowledged. Sign load stage event aborting.'
ErrMsg(ErrorMessage)
return
end
end
FWIInstAckReq = Xlate('RDS', RDSNo, 'FWI_INST_ACK_REQ', 'X')
If (FWIInstAckReq EQ True$) then
Response = RDS_Services('RDSVerifyInst', RDSNo, 'FWI')
If Response EQ False$ then return
end
LoadInstAckReq = Xlate('RDS', RDSNo, 'LOAD_INST_ACK_REQ', 'X')
If (LoadInstAckReq EQ True$) then
Response = RDS_Services('RDSVerifyInst', RDSNo, 'LOAD')
If Response EQ False$ then return
end
SupplAckReq = Xlate('RDS', RDSNo, 'SUPPL_ACK_REQ', 'X')
IF (SupplAckReq EQ True$) then
Response = Dialog_Box('NDW_RDS_SUPP_SIG', @Window, RDSNo)
If Response EQ False$ then return
end
//Check if TW Required
if XLATE('APP_INFO', 'NEW_TW_SYSTEM_ACTIVE_SWITCH', 1, 'X') EQ True$ AND (ReactorType EQ 'HTR' OR ReactorType EQ 'ASM' OR ReactorType 'ASM+') then
UsingTestWafers = False$
IsTWReqd = RDS_Services('IsTWLoggingReqd', RDSNo)
ExistingTestWafersLogged = Test_Run_Services('GetTestRunKeysByRDS', RdsNo)
If ExistingTestWafersLogged NE True$ then
If Not(IsTWReqd) then
//Test wafer logging is NOT required here.
If ReactorType NE 'EPP' then
UsingTestWafers = Msg(@Window, '', 'YESNO', '', 'Test Wafer Usage logging is not required on this load.':@FM:'Are any test wafers loaded?')
If UsingTestWafers EQ True$ then
TWLogResult = Dialog_Box('NDW_LOG_TEST_WAFER_USAGE', @Window, RDSNo : @VM : 'STANDARD' : @VM : 'REACTOR' : @VM : Reactor)
If TWLogResult NE True$ then
ContinueSign = Msg(@Window, '', 'YESNO', '', 'Continue?':@FM:'Test wafer logging was cancelled. Do you wish to continue signing?')
If Not(ContinueSign) then return
end
end
end
end else
//Test wafer logging is Required here.
Begin Case
Case ReactorType EQ 'ASM' OR ReactorType EQ 'HTR'
UsingTestWafers = Msg(@Window, '', 'YESNO', '', 'A test wafer is required to be ran with this load for metrology on this run':@FM:'Are any test wafers loaded?')
Case ReactorType EQ 'ASM+'
UsingTestWafers = Msg(@Window, '', 'YESNO', '', 'A test wafer is required to be ran with this load for metrology on the next run.':@FM:'Are any test wafers loaded?')
End Case
If UsingTestWafers EQ True$ then
//User has stated that they are using test wafers
TWLogResult = Dialog_Box('NDW_LOG_TEST_WAFER_USAGE', @Window, RDSNo : @VM : 'STANDARD' : @VM : 'REACTOR' : @VM : Reactor)
If TWLogResult NE True$ then
//User exited the the TW log prompt answering that they are not using any test wafers.
UserMsg = "Unable to sign load because test wafer logging is required on this run. A supervisor or lead may override."
OverrideGroups = 'LEAD':@VM:'SUPERVISOR':@VM:'ENGINEERING':@VM:'ENG_TECH'
UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups:@FM:'':@FM:UserMsg)
Override = UserVerification<1>
OverrideUser = UserVerification<2>
If Override then
Override_log_services('Create', 'RDS', RDSNo, OverrideUser, '', 'TW_USAGE', '')
FWIInstAckReq = Xlate('RDS', RDSNo, 'FWI_INST_ACK_REQ', 'X')
If (FWIInstAckReq EQ True$) then
Response = RDS_Services('RDSVerifyInst', RDSNo, 'FWI')
If Response EQ False$ then return
end
LoadInstAckReq = Xlate('RDS', RDSNo, 'LOAD_INST_ACK_REQ', 'X')
If (LoadInstAckReq EQ True$) then
Response = RDS_Services('RDSVerifyInst', RDSNo, 'LOAD')
If Response EQ False$ then return
end
SupplAckReq = Xlate('RDS', RDSNo, 'SUPPL_ACK_REQ', 'X')
IF (SupplAckReq EQ True$) then
Response = Dialog_Box('NDW_RDS_SUPP_SIG', @Window, RDSNo)
If Response EQ False$ then return
end
//Check if TW Required
if XLATE('APP_INFO', 'NEW_TW_SYSTEM_ACTIVE_SWITCH', 1, 'X') EQ True$ AND (ReactorType EQ 'HTR' OR ReactorType EQ 'ASM' OR ReactorType 'ASM+') then
UsingTestWafers = False$
IsTWReqd = RDS_Services('IsTWLoggingReqd', RDSNo)
ExistingTestWafersLogged = Test_Run_Services('GetTestRunKeysByRDS', RdsNo)
If ExistingTestWafersLogged NE True$ then
If Not(IsTWReqd) then
//Test wafer logging is NOT required here.
If ReactorType NE 'EPP' then
UsingTestWafers = Msg(@Window, '', 'YESNO', '', 'Test Wafer Usage logging is not required on this load.':@FM:'Are any test wafers loaded?')
If UsingTestWafers EQ True$ then
TWLogResult = Dialog_Box('NDW_LOG_TEST_WAFER_USAGE', @Window, RDSNo : @VM : 'STANDARD' : @VM : 'REACTOR' : @VM : Reactor)
If TWLogResult NE True$ then
ContinueSign = Msg(@Window, '', 'YESNO', '', 'Continue?':@FM:'Test wafer logging was cancelled. Do you wish to continue signing?')
If Not(ContinueSign) then return
end
end
end
end else
return
//Test wafer logging is Required here.
Begin Case
Case ReactorType EQ 'ASM' OR ReactorType EQ 'HTR'
UsingTestWafers = Msg(@Window, '', 'YESNO', '', 'A test wafer is required to be ran with this load for metrology on this run':@FM:'Are any test wafers loaded?')
Case ReactorType EQ 'ASM+'
UsingTestWafers = Msg(@Window, '', 'YESNO', '', 'A test wafer is required to be ran with this load for metrology on the next run.':@FM:'Are any test wafers loaded?')
End Case
If UsingTestWafers EQ True$ then
//User has stated that they are using test wafers
TWLogResult = Dialog_Box('NDW_LOG_TEST_WAFER_USAGE', @Window, RDSNo : @VM : 'STANDARD' : @VM : 'REACTOR' : @VM : Reactor)
If TWLogResult NE True$ then
//User exited the the TW log prompt answering that they are not using any test wafers.
UserMsg = "Unable to sign load because test wafer logging is required on this run. A supervisor or lead may override."
OverrideGroups = 'LEAD':@VM:'SUPERVISOR':@VM:'ENGINEERING':@VM:'ENG_TECH'
UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups:@FM:'':@FM:UserMsg)
Override = UserVerification<1>
OverrideUser = UserVerification<2>
If Override then
Override_log_services('Create', 'RDS', RDSNo, OverrideUser, '', 'TW_USAGE', '')
end else
return
end
end
end else
//User has stated that they are NOT using test wafers
UserMsg = "Unable to sign load because test wafer logging is required on this run. A supervisor or lead may override."
OverrideGroups = 'LEAD':@VM:'SUPERVISOR':@VM:'ENGINEERING':@VM:'ENG_TECH'
UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups:@FM:'':@FM:UserMsg)
Override = UserVerification<1>
OverrideUser = UserVerification<2>
If Override then
Override_log_services('Create', 'RDS', RDSNo, OverrideUser, '', 'TW_USAGE', '')
end else
return
end
end
end
end
end else
//User has stated that they are NOT using test wafers
UserMsg = "Unable to sign load because test wafer logging is required on this run. A supervisor or lead may override."
OverrideGroups = 'LEAD':@VM:'SUPERVISOR':@VM:'ENGINEERING':@VM:'ENG_TECH'
UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups:@FM:'':@FM:UserMsg)
Override = UserVerification<1>
OverrideUser = UserVerification<2>
If Override then
Override_log_services('Create', 'RDS', RDSNo, OverrideUser, '', 'TW_USAGE', '')
end else
return
end
end
end
end
end
ReadyToSign = QA_Services('LoadSignatureReady', RDSNo, @User4, WfrQty, LLSide)
If ReadyToSign EQ True$ then
If PreAuthenticated EQ FALSE$ then
initParams = ''
initParams<4> = 'Sign Load'
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, initParams)
Valid = Response<1>
If (Valid EQ True$) then
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
ReadyToSign = QA_Services('LoadSignatureReady', RDSNo, @User4, WfrQty, LLSide)
If ReadyToSign EQ True$ then
If PreAuthenticated EQ FALSE$ then
initParams = ''
initParams<4> = 'Sign Load'
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, initParams)
Valid = Response<1>
If (Valid EQ True$) then
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
end
end else
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
end
end
If Error_Services('HasError') then
ErrorMsg = Error_Services('GetMessage')
ErrMsg(ErrorMsg)
end
end else
ErrorMsg = Error_Services('GetMessage')
Msg(@Window, ErrorMsg)
end
end else
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
Msg(@Window, "Reactor load signature not allowed on a down reactor.")
end
end
If Error_Services('HasError') then
ErrorMsg = Error_Services('GetMessage')
ErrMsg(ErrorMsg)
end else
Msg(@Window, "RDS is not assigned to a reactor.")
end
end else
Msg(@Window, "Reactor load signature not allowed on a down reactor.")
ErrorMsg = Error_Services('GetMessage')
Msg(@Window, ErrorMsg)
end
GoSub OLE_LL_Status
Set_Property(@Window, 'SAVEWARN', False$)
Send_Event(@Window, 'READ')
Case SignEventType EQ 'Unsign'
// 1. Check if on hold. If so, then block event and inform user
WOMatKey = WONo:'*':CassNo
WOMatCurrStatus = obj_WO_Mat('CurrStatus',WOMatKey)
IF WOMatCurrStatus = 'HOLD' THEN
ErrorMessage = 'Process Error':@SVM:'Cassette is on Hold and may not have the signature removed.':CRLF$:CRLF$
ErrMsg(ErrorMessage)
RETURN 0
END
// 2.
// a. For Non-EPP - Check if LWII, LWIS, or FQA has been signed. If so, then block event and inform user
// b. For EPP - Check Clean_Insp actions to see if an inspection or surfscan has been completed
// Also check the FQA signature (MO_QA)
UnloadSig = Xlate('RDS', RDSNo, 'OPERATOR_OUT', 'X')
ReactorType = Xlate('RDS', RDSNo, 'REACTOR_TYPE','X')
CISigs = Xlate('RDS', RDSNo, 'LWI_CI_SIG', 'X')
Convert @VM to '' in CISigs
IF ReactorType NE 'EPP' THEN
FQASig = Xlate('RDS', RDSNo, 'SUP_VER_SIG', 'X')
END ELSE
WMOutKey = Xlate('RDS', RDSNo, 'WM_OUT_KEY', 'X')
FQASig = Xlate('WM_OUT', WMOutKey, 'SUP_VER_SIG', 'X')
END
If ( (UnloadSig NE '') or (CISigs NE '') or (FQASig NE '') ) then
// UNLOAD, LWII, LWIS, or FQA already signed. Block unload unsign event.
ErrorMessage = 'Process Error':@SVM:'UNLOAD, LWII, LWIS, or FQA already signed. Cannot unsign unload event.' |
: CRLF$ : CRLF$
ErrMsg(ErrorMessage)
Return 0
end
// 1. Check if RDS Load signature is eligible to be set.
IsEligible = QA_Services('UnsignLoadSignatureReady', RDSNo)
// 3. Lead/Supervisor/Engineer/EngTech override
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4 : @FM : 'LEAD' : @VM : 'SUPERVISOR':@VM:'ENGINEER':@VM:'ENG_TECH')
Valid = Response<1>
OverrideUser = Response<2>
If Valid then
Machine = Environment_Services('GetServer')
Headers = 'Logging DTM' : @FM : 'Machine' : @FM : 'Log'
ColumnWidths = 20 : @FM : 15 : @FM : 300
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Lot'
makeDirSuccess = Utility("MAKEDIR", LogPath)
LogFileName = 'R':RDSNo:'.csv'
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ' ', Headers, ColumnWidths, False$, False$)
LogData = ''
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS') ; // Logging DTM
LogData<2> = Machine
LogData<3> = 'LOAD stage unsigned for RDS ':RDSNo:' by user ':@User4
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
// 4. Remove WO_MAT Unload signature, date, and time
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
SigProf = WOMatRec<WO_MAT_SIG_PROFILE$>
Sigs = WOMatRec<WO_MAT_SIGNATURE$>
SigDTMs = WOMatRec<WO_MAT_SIG_DTM$>
Locate '1LOAD' in SigProf using @VM setting vPos then
Sigs<1, vPos> = ''
SigDTMs<1, vPos> = ''
WOMatRec<WO_MAT_SIGNATURE$> = Sigs
WOMatRec<WO_MAT_SIG_DTM$> = SigDTMs
obj_React_Status('HandleLoadUnsign',Reactor:@RM:WONo:@RM:CassNo:@RM:RDSNo:@RM:OverrideUser)
end
// 5. Remove '1LOAD' material log entry (i.e. WO_MAT<INV...> columns)
InvActions = WOMatRec<WO_MAT_INV_ACTION$>
Locate '1LOAD' in InvActions using @VM setting vPos then
WOMatRec<WO_MAT_INV_WH$> = Delete(WOMatRec<WO_MAT_INV_WH$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_LOCATION$> = Delete(WOMatRec<WO_MAT_INV_LOCATION$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_ACTION$> = Delete(WOMatRec<WO_MAT_INV_ACTION$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_DTM$> = Delete(WOMatRec<WO_MAT_INV_DTM$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_USER$> = Delete(WOMatRec<WO_MAT_INV_USER$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_TAG$> = Delete(WOMatRec<WO_MAT_INV_TAG$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_TOOL_ID$> = Delete(WOMatRec<WO_MAT_INV_TOOL_ID$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_LOC$> = Delete(WOMatRec<WO_MAT_INV_LOC$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_SCAN_ENTRY$> = Delete(WOMatRec<WO_MAT_INV_SCAN_ENTRY$>, 0, vPos, 0)
end
Database_Services('WriteDataRow', 'WO_MAT', WOMatKey, WOMatRec, True$, False$, True$)
// 6. Remove RDS Unload signature, date, and time
// NOTE: This needs to occur before item #5 to avoid RDS_ACTIONS restoring the load signature
Set_Property(@Window:'.OP_IN', 'TEXT', '')
Set_Property(@Window:'.OP_IN_NAME', 'TEXT', '')
Set_Property(@Window:'.OP_IN_DATE', 'TEXT', '')
Set_Property(@Window:'.OP_IN_TIME', 'TEXT', '')
IOOptions = Get_Property(@Window, 'IOOPTIONS')
IOOptions<6> = True$
Set_Property(@Window, 'IOOPTIONS', IOOptions)
Send_Event(@Window, 'WRITE')
IOOptions<6> = False$
Set_Property(@Window, 'IOOPTIONS', IOOptions)
Reactor = Get_Property(@Window:'.REACTOR', 'TEXT')
Rds_Services('AddComment', RDSNo, 'Load Stage Unsigned from Reactor ' : Reactor)
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', Reactor)
PreviousRotrOverrideRds = ReactorRec<REACTOR_PREVIOUS_ROTR_OVERRIDE_RDS$>
// Check if ROTR override was preformed when signing this load
If (PreviousRotrOverrideRds EQ RDSNo) then
// Reset the override flag
ReactorRec<REACTOR_ROTR_STATUS$> = 'F'
PreviousRotrStatusReason = ReactorRec<REACTOR_PREVIOUS_ROTR_STATUS_REASON$>
ReactorRec<REACTOR_ROTR_STATUS_REASON$> = PreviousRotrStatusReason
RotrOverrideCount = ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$>
ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$> = Max(0, (RotrOverrideCount - 1))
end
Database_Services('WriteDataRow', 'REACTOR', Reactor, ReactorRec, True$, False$, True$)
If ReactorType EQ 'EPP' then
Reactor_Services('DecrementWfrMetrics', RDSNo)
end
Set_Property(@Window:'.PUB_SIGN', 'TEXT', 'Sign')
If IsEligible then
// 3. Lead/Supervisor/Engineer/EngTech override
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4 : @FM : 'LEAD' : @VM : 'SUPERVISOR':@VM:'ENGINEER':@VM:'ENG_TECH')
Valid = Response<1>
OverrideUser = Response<2>
If Valid then
Machine = Environment_Services('GetServer')
Headers = 'Logging DTM' : @FM : 'Machine' : @FM : 'Log'
ColumnWidths = 20 : @FM : 15 : @FM : 300
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Lot'
makeDirSuccess = Utility("MAKEDIR", LogPath)
LogFileName = 'R':RDSNo:'.csv'
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ' ', Headers, ColumnWidths, False$, False$)
LogData = ''
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS') ; // Logging DTM
LogData<2> = Machine
LogData<3> = 'LOAD stage unsigned for RDS ':RDSNo:' by user ':@User4
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
// 4. Remove WO_MAT Unload signature, date, and time
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
SigProf = WOMatRec<WO_MAT_SIG_PROFILE$>
Sigs = WOMatRec<WO_MAT_SIGNATURE$>
SigDTMs = WOMatRec<WO_MAT_SIG_DTM$>
Locate '1LOAD' in SigProf using @VM setting vPos then
Sigs<1, vPos> = ''
SigDTMs<1, vPos> = ''
WOMatRec<WO_MAT_SIGNATURE$> = Sigs
WOMatRec<WO_MAT_SIG_DTM$> = SigDTMs
obj_React_Status('HandleLoadUnsign',Reactor:@RM:WONo:@RM:CassNo:@RM:RDSNo:@RM:OverrideUser)
end
// 5. Remove '1LOAD' material log entry (i.e. WO_MAT<INV...> columns)
InvActions = WOMatRec<WO_MAT_INV_ACTION$>
Locate '1LOAD' in InvActions using @VM setting vPos then
WOMatRec<WO_MAT_INV_WH$> = Delete(WOMatRec<WO_MAT_INV_WH$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_LOCATION$> = Delete(WOMatRec<WO_MAT_INV_LOCATION$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_ACTION$> = Delete(WOMatRec<WO_MAT_INV_ACTION$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_DTM$> = Delete(WOMatRec<WO_MAT_INV_DTM$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_USER$> = Delete(WOMatRec<WO_MAT_INV_USER$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_TAG$> = Delete(WOMatRec<WO_MAT_INV_TAG$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_TOOL_ID$> = Delete(WOMatRec<WO_MAT_INV_TOOL_ID$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_LOC$> = Delete(WOMatRec<WO_MAT_INV_LOC$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_SCAN_ENTRY$> = Delete(WOMatRec<WO_MAT_INV_SCAN_ENTRY$>, 0, vPos, 0)
end
Database_Services('WriteDataRow', 'WO_MAT', WOMatKey, WOMatRec, True$, False$, True$)
// 6. Remove RDS Unload signature, date, and time
// NOTE: This needs to occur before item #5 to avoid RDS_ACTIONS restoring the load signature
Set_Property(@Window:'.OP_IN', 'TEXT', '')
Set_Property(@Window:'.OP_IN_NAME', 'TEXT', '')
Set_Property(@Window:'.OP_IN_DATE', 'TEXT', '')
Set_Property(@Window:'.OP_IN_TIME', 'TEXT', '')
IOOptions = Get_Property(@Window, 'IOOPTIONS')
IOOptions<6> = True$
Set_Property(@Window, 'IOOPTIONS', IOOptions)
Send_Event(@Window, 'WRITE')
IOOptions<6> = False$
Set_Property(@Window, 'IOOPTIONS', IOOptions)
Reactor = Get_Property(@Window:'.REACTOR', 'TEXT')
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', Reactor)
PreviousRotrOverrideRds = ReactorRec<REACTOR_PREVIOUS_ROTR_OVERRIDE_RDS$>
// Check if ROTR override was preformed when signing this load
If (PreviousRotrOverrideRds EQ RDSNo) then
// Reset the override flag
ReactorRec<REACTOR_ROTR_STATUS$> = 'F'
PreviousRotrStatusReason = ReactorRec<REACTOR_PREVIOUS_ROTR_STATUS_REASON$>
ReactorRec<REACTOR_ROTR_STATUS_REASON$> = PreviousRotrStatusReason
RotrOverrideCount = ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$>
ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$> = Max(0, (RotrOverrideCount - 1))
end
Database_Services('WriteDataRow', 'REACTOR', Reactor, ReactorRec, True$, False$, True$)
If ReactorType EQ 'EPP' then
Reactor_Services('DecrementWfrMetrics', RDSNo)
end
Set_Property(@Window:'.PUB_SIGN', 'TEXT', 'Sign')
end else
Return 0
end
end else
Return 0
end
ErrorMessage = Error_Services('GetMessage')
Msg(@Window, ErrorMessage)
end
End Case
Post_Event(@Window, 'READ')
@ -582,7 +569,6 @@ Event LL_R_STATUS.OnClick()
end event
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -740,3 +726,6 @@ OLE_LL_Status:
return

View File

@ -51,8 +51,6 @@ $insert REACT_STATUS_EQUATES
$insert SUPPL_INFO_ARRAY_EQU
$insert CLEAN_INSP_EQUATES
EQU READONLY_GREEN$ TO 192 + (220*256) + (192*65536)
Equ COL$LOG_FILE to 1
Equ COL$LOG_DTM to 2
Equ COL$ACTION to 3
@ -67,7 +65,7 @@ Equ COL$TOOL_ID to 10
Declare subroutine ErrMsg, Set_Status, obj_WO_Mat, obj_WO_Mat_Log, obj_RDS, Set_Property, Send_Event, Database_Services
Declare subroutine Qa_Services, RDS_Services, Dialog_Box
Declare function Dialog_Box, Msg, MemberOf, obj_WO_Mat, Database_Services, Get_Property, obj_React_Status, Get_Status
Declare function QA_Services, Database_Services, Supplement_Services
Declare function QA_Services, Database_Services, Supplement_Services, RDS_Services
SubclassInfo = Form_Services('FindSubclassControl')
Subclass = SubclassInfo<1>
@ -95,20 +93,16 @@ Return EventFlow else EVENT_CONTINUE$
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Event WINDOW.CREATE(CreateParam)
GoSub SetupControls
end event
Event WINDOW.READ()
// Disable reactor edit line control if the RDS has been loaded.
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
If RDSNo NE '' then
LoadSig = Xlate('RDS', RDSNo, 'OPERATOR_IN', 'X')
If LoadSig NE '' then
Set_Property(@Window:'.REACTOR', 'ENABLED', False$)
Set_Property(@Window:'.REACTOR', 'BACKCOLOR', READONLY_GREEN$)
end
end
GoSub SetupControls
end event
@ -132,6 +126,76 @@ end event
Event PUB_SIGN.CLICK()
ButtonText = Get_Property(@Window:'.PUB_SIGN', 'TEXT')
Begin Case
Case ButtonText EQ 'Sign'
GoSub SignPreEpi
Case ButtonText EQ 'Unsign'
GoSub UnsignPreEpi
End Case
If Error_Services('HasError') then
ErrorMsg = Error_Services('GetMessage')
ErrMsg(ErrorMsg)
end
Set_Property(@Window, 'SAVEWARN', False$)
Set_Status(0)
Send_Event(@Window, 'READ')
end event
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
SetupControls:
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
GoSub ReactorEdlCtrlSetup
GoSub PubSignCtrlSetup
return
ReactorEdlCtrlSetup:
// Disable reactor edit line control if the RDS has been assigned.
If RDSNo NE '' then
PreEpiSig = Database_Services('ReadDataColumn', 'RDS', RDSNo, RDS_PRE_EPI_SIG$, True$, 0, False$)
If Error_Services('NoError') then
If PreEpiSig NE '' then
Set_Property(@Window:'.REACTOR', 'ENABLED', False$)
Set_Property(@Window:'.REACTOR', 'BACKCOLOR', READONLY_GREEN$)
end else
Set_Property(@Window:'.REACTOR', 'ENABLED', True$)
Set_Property(@Window:'.REACTOR', 'BACKCOLOR', EDIT_ACTIVE_WHITE$)
end
end else
Set_Property(@Window:'.REACTOR', 'ENABLED', False$)
Set_Property(@Window:'.REACTOR', 'BACKCOLOR', READONLY_GREEN$)
end
end
return
PubSignCtrlSetup:
If RDSNo NE '' then
PreEpiSig = Database_Services('ReadDataColumn', 'RDS', RDSNo, RDS_PRE_EPI_SIG$, True$, 0, False$)
If Error_Services('NoError') then
If PreEpiSig NE '' then
Set_Property(@Window:'.PUB_SIGN', 'TEXT', 'Unsign')
end else
Set_Property(@Window:'.PUB_SIGN', 'TEXT', 'Sign')
end
end
end
return
SignPreEpi:
RDSNo = Get_Property(@Window:'.RDS_NO' ,'DEFPROP')
WfrQty = Get_Property(@Window:'.VERIFY_QTY','TEXT')
Reactor = Get_Property(@Window:'.REACTOR' ,'TEXT')
@ -156,23 +220,29 @@ Event PUB_SIGN.CLICK()
Valid = Response<1>
If (Valid EQ True$) then
QA_Services('SignPreEpiStage', RDSNo, @USER4, WfrQty, Reactor)
end
end
end else
QA_Services('SignPreEpiStage', RDSNo, @USER4, WfrQty, Reactor)
end
end
If Error_Services('HasError') then
ErrorMsg = Error_Services('GetMessage')
ErrMsg(ErrorMsg)
end
Set_Property(@Window, 'SAVEWARN', False$)
Set_Status(0)
Send_Event(@Window, 'READ')
end event
return
UnsignPreEpi:
RDSNo = Get_Property(@Window:'.RDS_NO','DEFPROP')
VerCheckParams = ''
VerCheckParams<4> = 'Permission needed for Pre-Epi Unsign on RDS# ' : RDSNo
UserVerCheck = Dialog_Box('NDW_VERIFY_USER', @Window, '':@FM:'':@FM:'':@FM:VerCheckParams)
ValidUserCheck = UserVerCheck<1>
If ValidUserCheck then
ValidUserId = UserVerCheck<2>
If ValidUserId NE '' then
RDS_Services('UnsignPreEpiSignature', RDSNo, ValidUserId)
end
end
return
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,204 @@
Compile function RDS_TEST_Services(@Service, @Params)
/***********************************************************************************************************************
Name : Rds_Test_Services
Description : Handler program for all RDS_TEST 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)
09/26/2025 djs Original programmer.
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
$Insert SERVICE_SETUP
$insert APP_INSERTS
$Insert RDS_EQUATES
$Insert RDS_TEST_EQUATES
$Insert PROD_SPEC_EQUATES
$Insert RDS_LAYER_EQUATES
$INSERT PRS_LAYER_EQU
Declare function Database_Services, Error_Services, obj_Prod_Spec
Declare subroutine Database_Services, Error_Services
GoToService
Return Response or ""
//-----------------------------------------------------------------------------
// SERVICES
//-----------------------------------------------------------------------------
Service UpdateRDSTestSpecs(RdsNo)
ErrorMsg = ''
If (RDSNo NE '') then
If RowExists('RDS', RDSNo) then
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
If Error_Services('NoError') then
LayerKeys = RDSRec<RDS_RDS_LAYER_KEYS$>
PSNId = RDSRec<RDS_PROD_SPEC_ID$>
For each LayerKey in LayerKeys using @VM setting vPos
LayerSet = Field(LayerKey, '*', 2, 1)
LayerSpecs = obj_Prod_Spec('GetLayerProp',PSNId:@RM:LayerSet:@RM:1) ;* Last parameter specifies no output conversion on return data
LayerSpecs = Field(LayerSpecs,@FM,2,99) ;* Returns with the layer set ID in the first field of each line
ErrCode = ''
If Not(Get_Status(ErrCode)) then
WaferSize = Xlate('PROD_SPEC', PSNId, 'SUB_WAFER_SIZE', 'X')
SubOrientation = Xlate('PROD_SPEC', PSNId, 'SUB_ORIENTATION', 'X')
ResUnits = LayerSpecs<PRS_LAYER_RES_UNITS$>
ReactorType = Xlate('PROD_SPEC', PSNId, PROD_SPEC_REACTOR_TYPE$, 'X')
ThickFilmMet = Xlate('PROD_SPEC', PSNId, PROD_SPEC_THICKFILM_MET$, 'X') ;* Added 1/16/2009 JCH
RdsTestKeys = Database_Services('ReadDataColumn', 'RDS_LAYER', LayerKey, RDS_LAYER_RDS_TEST_KEYS$)
If Error_Services('NoError') then
For each RdsTestKey in RdsTestKeys using @VM setting RdsTestPos
RdsTestRec = Database_Services('ReadDataRow', 'RDS_TEST', RdsTestKey)
If Error_Services('NoError') then
RDSTestRec<RDS_TEST_WAFER_SIZE$> = WaferSize
RDSTestRec<RDS_TEST_SUB_ORIENTATION$> = SubOrientation
RDSTestRec<RDS_TEST_SPEC_DOPANT$> = LayerSpecs<PRS_LAYER_DOPANT$>
RDSTestRec<RDS_TEST_SPEC_RECIPE$> = LayerSpecs<PRS_LAYER_RECIPE$>
RDSTestRec<RDS_TEST_SPEC_RECIPE_NAME$> = LayerSpecs<PRS_LAYER_RECIPE_NAME$>
RDSTestRec<RDS_TEST_SPEC_THICK_MIN$> = LayerSpecs<PRS_LAYER_THICK_MIN$>
RDSTestRec<RDS_TEST_SPEC_THICK_TARGET$> = LayerSpecs<PRS_LAYER_THICK_TARGET$>
RDSTestRec<RDS_TEST_SPEC_THICK_MAX$> = LayerSpecs<PRS_LAYER_THICK_MAX$>
RDSTestRec<RDS_TEST_SPEC_THICK_UNITS$> = LayerSpecs<PRS_LAYER_THICK_UNITS$>
RDSTestRec<RDS_TEST_SPEC_RES_MIN$> = LayerSpecs<PRS_LAYER_RES_MIN$>
RDSTestRec<RDS_TEST_SPEC_RES_TARGET$> = LayerSpecs<PRS_LAYER_RES_TARGET$>
RDSTestRec<RDS_TEST_SPEC_RES_MAX$> = LayerSpecs<PRS_LAYER_RES_MAX$>
RDSTestRec<RDS_TEST_SPEC_RES_UNITS$> = LayerSpecs<PRS_LAYER_RES_UNITS$>
RDSTestRec<RDS_TEST_SPEC_CON_MIN$> = LayerSpecs<PRS_LAYER_CONC_MIN$>
RDSTestRec<RDS_TEST_SPEC_CON_TARGET$> = LayerSpecs<PRS_LAYER_CONC_TARGET$>
RDSTestRec<RDS_TEST_SPEC_CON_MAX$> = LayerSpecs<PRS_LAYER_CONC_MAX$>
RDSTestRec<RDS_TEST_SPEC_CON_UNITS$> = LayerSpecs<PRS_LAYER_CONC_UNITS$>
RDSTestRec<RDS_TEST_SPEC_STRESS_MIN$> = LayerSpecs<PRS_LAYER_STRESS_MIN$>
RDSTestRec<RDS_TEST_SPEC_STRESS_MAX$> = LayerSpecs<PRS_LAYER_STRESS_MAX$>
RDSTestRec<RDS_TEST_SPEC_TRANS$> = LayerSpecs<PRS_LAYER_TRANS_SPEC$>
RDSTestRec<RDS_TEST_SPEC_CRES_MIN$> = LayerSpecs<PRS_LAYER_CRES_MIN$>
RDSTestRec<RDS_TEST_SPEC_CRES_TARGET$> = LayerSpecs<PRS_LAYER_CRES_TARGET$>
RDSTestRec<RDS_TEST_SPEC_CRES_MAX$> = LayerSpecs<PRS_LAYER_CRES_MAX$>
RDSTestRec<RDS_TEST_SPEC_CRES_UNITS$> = LayerSpecs<PRS_LAYER_CRES_UNITS$>
For A = 11 to 19
RDSTestRec<A> = LayerSpecs<PRS_LAYER_THICK_MEASUREMENT$,A-10>
Next A
For A = 24 to 32
RDSTestRec<A> = LayerSpecs<PRS_LAYER_RES_MEASUREMENT$,A-23>
Next A
For A = 37 to 45
RDSTestRec<A> = LayerSpecs<PRS_LAYER_CONC_MEASUREMENT$,A-36>
Next A
For A = 50 to 58
RDSTestRec<A> = LayerSpecs<PRS_LAYER_STRESS_MEASUREMENT$,A-49>
Next A
For A = 121 to 129
RDSTestRec<A> = LayerSpecs<PRS_LAYER_CRES_MEASUREMENT$,A-120>
Next A
RDSTestRec<RDS_TEST_SPEC_THICK_MPATTERN$> = LayerSpecs<PRS_LAYER_THICK_MEASUREMENT$,PRS_MPATTERN$>
RDSTestRec<RDS_TEST_SPEC_RES_MPATTERN$> = LayerSpecs<PRS_LAYER_RES_MEASUREMENT$,PRS_MPATTERN$>
RDSTestRec<RDS_TEST_SPEC_CON_MPATTERN$> = LayerSpecs<PRS_LAYER_CONC_MEASUREMENT$,PRS_MPATTERN$>
RDSTestRec<RDS_TEST_SPEC_STRESS_MPATTERN$> = LayerSpecs<PRS_LAYER_STRESS_MEASUREMENT$,PRS_MPATTERN$>
RDSTestRec<RDS_TEST_SPEC_CRES_MPATTERN$> = LayerSpecs<PRS_LAYER_CRES_MEASUREMENT$,PRS_MPATTERN$>
RDSTestRec<RDS_TEST_REACTOR_TYPE$> = ReactorType
If ( (ReactorType EQ 'P') or (ReactorType EQ 'EPP') or (ThickFilmMet EQ True$) ) then
SpecMap = XLATE('PROD_SPEC', PSNId, PROD_SPEC_TEST_POINT_MAP$, 'X') ;* Added 4/8/2009 JCH new field in PROD_SPEC
If SpecMap NE '' then
RDSTestRec<RDS_TEST_TEST_POINT_MAP$> = SpecMap
end else
;* Added ThickFilmMet check - 1/16/2009 JCH
AllTargetThicks = XLATE('PROD_SPEC', PSNId, 'THICK_TARGET_ALL', 'X')
TargetCnt = COUNT(AllTargetThicks,@VM) + (AllTargetThicks NE '')
Begin Case
Case TargetCnt = 2
CombinedThick = SUM(AllTargetThicks)
Case TargetCnt = 1 OR TargetCnt = 3
CombinedThick = AllTargetThicks[-1,'B':@VM]
End Case
If OCONV(CombinedThick,'MD2') > '65.0' then
RDSTestRec<RDS_TEST_TEST_POINT_MAP$> = 'FTIR_T'
end else
RDSTestRec<RDS_TEST_TEST_POINT_MAP$> = 'FTIR'
end
end
end else
RDSTestRec<RDS_TEST_TEST_POINT_MAP$> = 'ASM17' ;* 17 Point linear test pattern until PROD_SPEC is updated support other types
end
Database_Services('WriteDataRow', 'RDS_TEST', RdsTestKey, RdsTestRec)
If Error_Services('HasError') then
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
end
end else
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
end
Next RdsTestKey
end else
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
end
end else
ErrorMsg = 'Error in ':Service:' service. Error calling obj_Prod_Spec("GetLayerProp"). Error code: ':ErrCode
end
Next LayerKey
end else
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
end
end else
ErrorMsg = 'Error in ':Service:' service. RDS ':RdsNo:' does not exist'
end
end else
ErrorMsg = 'Error in ':Service:' service. Null RDSNo passed into service'
end
If (ErrorMsg NE '') then Error_Services('Add', ErrorMsg)
End Service

View File

@ -93,7 +93,7 @@ Equ ACTION$SPEC_SURFSCAN_RECIPE TO 8
Declare subroutine ErrMsg, Set_Status, obj_WO_Mat, obj_WO_Mat_Log, obj_RDS, Set_Property, Send_Event, Database_Services
Declare subroutine Dialog_Box, Msg, MemberOf, obj_WO_Mat, Get_Property, obj_React_Status, Get_Status, Override_Services
Declare subroutine record_lock, obj_React_Status, Post_Event, obj_React_State, obj_Post_Log, Qa_Services, Reactor_Services
Declare Subroutine Rds_Services, WO_MAT_Services, Message_Box, Reactor_Log_Services, Schedule_Services
Declare Subroutine Rds_Services, WO_MAT_Services, Message_Box, Reactor_Log_Services, Schedule_Services, Dialog_Response_Log_Services
Declare function dialog_box, msg, Get_Status, obj_WO_Mat, Get_Status, obj_Clean_Insp, obj_Reactor, Get_Property
Declare function QA_Services, Database_Services, Set_Property, Rds_Services, Qa_Services, Memberof, Reactor_Services
@ -315,6 +315,9 @@ Event PUB_SIGN.CLICK()
WoMatRecord<WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$> = TWLogResult
If TWLogResult NE True$ then
ErrMsg = 'Unload blocked! You must run a test wafer before signing the unload'
Dialog_Response_Log_Services('AddDialogResponseLog', RDSNo, 'RDS', @User4, 'HTR_LAST_BOX_TW', 'Test wafer not logged when one was required. Unload signature was blocked. User was prompted.')
end else
Dialog_Response_Log_Services('AddDialogResponseLog', RDSNo, 'RDS', @User4, 'HTR_LAST_BOX_TW', 'Test wafer was logged when one was required. Unload signature was allowed. User was prompted.')
end
If ErrMsg NE '' then
Database_Services('WriteDataRow', 'WO_MAT', WoMatKey, WoMatRecord, True$, False$, False$)
@ -322,6 +325,8 @@ Event PUB_SIGN.CLICK()
ErrMsg = Error_Services('GetMessage')
end
end
end else
Dialog_Response_Log_Services('AddDialogResponseLog', RDSNo, 'RDS', @User4, 'HTR_LAST_BOX_TW', 'Test wafer was logged prior when one was required. Unload signature was allowed. User was not prompted.')
end
end
end else
@ -474,3 +479,4 @@ Setup_OLE_Controls:
return

View File

@ -41,8 +41,9 @@ Function Reactitems_API(@API)
$insert APP_INSERTS
$insert API_SETUP
$insert HTTP_INSERTS
$Insert REACT_ITEM_EQUATES
Declare subroutine OI_Wizard_Services, SRP_JSON, Database_Services
Declare subroutine OI_Wizard_Services, SRP_JSON, Database_Services, React_Item_Services
Declare function React_Item_Services, SRP_JSON, OI_Wizard_Services
GoToAPI else
@ -220,13 +221,17 @@ API ReactItems.ID.PUT
SRP_JSON(hJSON, 'Release')
KeyID = EndpointSegment
Record = React_Item_Services('ConvertJSONToRecord', JSON)
If KeyID NE '' and Record NE '' then
Database_Services('WriteDataRow', 'REACT_ITEM', KeyID, Record)
end
If Error_Services('NoError') then
StatusCode = 200
Message = 'React Item Updated'
GoSub CreateHalItem
If KeyID NE '' and Record NE '' then
React_Item_Services('UpdateReactItem', KeyID, Record)
end
If Error_Services('NoError') then
StatusCode = 200
Message = 'React Item Updated'
GoSub CreateHalItem
end else
HTTP_Services('SetResponseStatus', 400, Error_Services('GetMessage'))
end
end else
HTTP_Services('SetResponseStatus', 400, Error_Services('GetMessage'))
end
@ -356,4 +361,3 @@ CreateHALCollection:
end
return

View File

@ -148,9 +148,8 @@ WRITE_RECORD:
end else
ModeUser = @User4
end
CurrActiveHgCVOrders = Nica_Orders_Services('GetActiveOrders', 'REACTOR', Name, 'IQS_HGCV_ALARM')
CurrActiveProveInOrders = Nica_Orders_Services('GetActiveOrders', 'REACTOR', Name, 'CHANGEOVER')
OrderTypeAlreadyActive = ( (CurrActiveHgCVOrders NE '') or (CurrActiveProveInOrders NE '') )
CurrActiveHgCVOrders = Nica_Orders_Services('GetActiveOrders', 'REACTOR', Name, 'IQS_HGCV_ALARM')
OrderTypeAlreadyActive = (CurrActiveHgCVOrders NE '')
If Not(OrderTypeAlreadyActive) then
// Only create an order and change the mode if there is not already an active IQS_HGCV_ALARM order
OrderResponse = Nica_Orders_Services('CreateNewOrder', 'REACTOR', Name, 'IQS_HGCV_ALARM')
@ -228,5 +227,3 @@ Restore_System_Variables:
return

View File

@ -165,10 +165,14 @@ Service SignReactorLog(ReactorLogID, UserID)
RIPostBy = ReactorLogRec<REACTOR_LOG_RI_POST_BY$>
If RIPostBy EQ '' then
obj_Reactor_Log('PostReactItems',ReactorLogID:@RM:UserID)
// Pull in a fresh copy of the record with the POST_BY signature set
ReactorLogRec = Database_Services('ReadDataRow', 'REACTOR_LOG', ReactorLogID)
If Get_Status(ErrCode) then
ErrorMsg = 'Error in ':Service:' service. Error calling obj_Reactor_Log("PostReactItems"). Error code: ':ErrCode:'.'
If Error_Services('NoError') then
// Pull in a fresh copy of the record with the POST_BY signature set
ReactorLogRec = Database_Services('ReadDataRow', 'REACTOR_LOG', ReactorLogID)
If Get_Status(ErrCode) then
ErrorMsg = 'Error in ':Service:' service. Error calling obj_Reactor_Log("PostReactItems"). Error code: ':ErrCode:'.'
end
end else
ErrorMsg = Error_Services('GetMessage')
end
end
end
@ -961,3 +965,4 @@ ClearCursors:
return

View File

@ -677,12 +677,93 @@ Service ResetWfrMetric(ReactorNo, MetricType = REACTORMETRIC)
end service
//----------------------------------------------------------------------------------------------------------------------
// SetWaferSize
//
// Sets the Reactor's Wafer Size.
//----------------------------------------------------------------------------------------------------------------------
Service SetWaferSize(ReactNo, WaferSize)
ErrMsg = ''
If ReactNo EQ '' then
ErrMsg := 'ReactNo value is missing.'
end
If WaferSize EQ '' then
ErrMsg := 'WaferSize value is missing.'
end
If ErrMsg EQ '' then
If RowExists('REACTOR', ReactNo) then
WaferSizeOptions = Xlate('SYSREPOSPOPUPS', 'LSL2**WAFER_SIZES', 8, 'X')
Swap @VM with @FM in WaferSizeOptions
Swap @SVM with @VM in WaferSizeOptions
WaferSizeOptions = SRP_Array('Rotate', WaferSizeOptions)
WaferSizeOptions = WaferSizeOptions<2>
If Count(WaferSizeOptions, WaferSize) NE 0 then
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactNo)
ReactorRec<REACTOR_SUSC_POCKET_SIZE$> = WaferSize
Database_Services('WriteDataRow', 'REACTOR', ReactNo, ReactorRec, True$, False$, False$)
If Error_Services('HasError') then
ErrMsg := Error_Services('GetMessage')
end
end else
ErrMsg := 'Invalid Wafer Size.'
end
end else
ErrMsg := 'The chosen Reactor No. ': ReactNo: ' does not exist.'
end
end
If ErrMsg NE '' then
Error_Services('Add', ErrMsg)
end
end service
//----------------------------------------------------------------------------------------------------------------------
// SetPocketQty
//
// Sets the Reactor's Wafer Size.
//----------------------------------------------------------------------------------------------------------------------
Service SetPocketQty(ReactNo, PocketQty)
ErrMsg = ''
If ReactNo EQ '' then
ErrMsg := 'ReactNo value is missing.'
end
If PocketQty EQ '' then
ErrMsg := 'PocketQty value is missing.'
end
If ErrMsg EQ '' then
If RowExists('REACTOR', ReactNo) then
PocketQtyOptions = Xlate('SYSREPOSPOPUPS', 'LSL2**SUSCEPTOR_POCKETS', 8, 'X')
Swap @VM with @FM in PocketQtyOptions
Swap @SVM with @VM in PocketQtyOptions
PocketQtyOptions = SRP_Array('Rotate', PocketQtyOptions)
PocketQtyOptions = PocketQtyOptions<1>
If Count(PocketQtyOptions, PocketQty) NE 0 then
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactNo)
ReactorRec<REACTOR_SUSC_POCKET_QTY$> = PocketQty
Database_Services('WriteDataRow', 'REACTOR', ReactNo, ReactorRec, True$, False$, False$)
If Error_Services('HasError') then
ErrMsg := Error_Services('GetMessage')
end
end else
ErrMsg := 'Invalid Pocket Qty..'
end
end else
ErrMsg := 'The chosen Reactor No. ': ReactNo: ' does not exist.'
end
end
If ErrMsg NE '' then
Error_Services('Add', ErrMsg)
end
end service
//----------------------------------------------------------------------------------------------------------------------
// GetReactors
//
// Returns a JSON formatted array of reactor objects. Reactor number 0 will be ommitted. If the MatchType or MatchSize
// arguments are populated, the array will be filterd accordingly.
// arguments are populated, the array will be filtered accordingly.
//----------------------------------------------------------------------------------------------------------------------
Service GetReactors(MatchType, MatchSize)
@ -2775,12 +2856,21 @@ Service ConvertRecordToJSON(ReactorNo, ItemURL, CurrUser, FullObject=BOOLEAN)
SRP_JSON(objReactor, 'SetValue', 'ArmsCnt', Xlate('REACTOR', ReactorNo, REACTOR_ARMS_WFR_CNT$, 'X'))
// Add Current Run Status (Current Loaded Cassettes)
LoadedRDS = Xlate('REACT_STATUS', ReactorNo, 'LOAD_RDS', 'X')
LoadLockLeftRDS = ''
LoadLockRightRDS = ''
LoadedRDS = Xlate('REACT_STATUS', ReactorNo, 'LOAD_RDS', 'X')
If LoadedRDS NE '' then
objLoadedRDS = ''
If SRP_JSON(objLoadedRDS, 'New', 'Array') then
For each RDS in LoadedRDS using @VM setting vPos
SRP_JSON(objLoadedRDS, 'AddValue', RDS)
LoadLockSide = Xlate('RDS', RDS, 'LOAD_LOCK_SIDE', 'X')
Begin Case
Case LoadLockSide EQ 'L'
LoadLockLeftRDS = RDS
Case LoadLockSide EQ 'R'
LoadLockRightRDS = RDS
End Case
Next RDS
SRP_JSON(objReactor, 'Set', 'loadedRDS', objLoadedRDS)
SRP_JSON(objLoadedRDS, 'Release')
@ -2788,6 +2878,8 @@ Service ConvertRecordToJSON(ReactorNo, ItemURL, CurrUser, FullObject=BOOLEAN)
end else
SRP_JSON(objReactor, 'SetValue', 'loadedRDS', '')
end
SRP_JSON(objReactor, 'SetValue', 'loadLockLeftRDS', LoadLockLeftRDS)
SRP_JSON(objReactor, 'SetValue', 'loadLockRightRDS', LoadLockRightRDS)
// Add new reactor items here
InstItems = Xlate('REACTOR', ReactorNo, REACTOR_CURR_INST_ITEMS$, 'X')
@ -3676,7 +3768,7 @@ Service GetReactorAvailChamberCount(ReactNo)
StartTick = GetTickCount()
MetricName = 'GetReactorAvailChamberCount'
ErrMsg = 'Error in ReactorServices -> GetReactorAvailChamberCount: '
ErrMsg = ''
AvailableChamberCount = 0
If ReactNo NE '' then
If RowExists('REACTOR', ReactNo) then
@ -3686,16 +3778,19 @@ Service GetReactorAvailChamberCount(ReactNo)
AvailableChamberCount = ReactorCurrCapacity - ReactorCurrLoadCnt
end else
ErrMsg := 'Reactor ' : ReactNo : ' does not exist.'
Error_Services('Add', ErrMsg)
end
end else
ErrMsg := 'Reactor Number was null.'
Error_Services('Add', ErrMsg)
end
Response = AvailableChamberCount
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
If ErrMsg NE '' then
ErrMsg = 'Error in ReactorServices -> GetReactorAvailChamberCount: ':ErrMsg
Error_Services('Add', ErrMsg)
end
end service

View File

@ -6,7 +6,7 @@ COMPILE FUNCTION React_Item(EntID,Event,Parm1,Parm2,Parm3,Parm4,Parm5)
01/13/2014 - John C. Henry, J.C. Henry & Co., Inc. cloned from Graphite
*/
DECLARE SUBROUTINE Set_Property, ErrMsg, obj_Appwindow, Btree.Extract, Send_Event, Post_Event, obj_React_Item
DECLARE SUBROUTINE Set_Property, ErrMsg, obj_Appwindow, Btree.Extract, Send_Event, Post_Event, obj_React_Item, Forward_Event
DECLARE FUNCTION Get_Property, Send_Message, NextKey, Popup, obj_Calendar, Printer_Select
DECLARE FUNCTION Set_Printer, obj_Install, Start_Window, obj_React_Item_Hist, obj_React_Item, Dialog_Box
@ -15,6 +15,7 @@ $INSERT REACT_ITEM_EQUATES
$INSERT REACT_ITEM_HIST_EQUATES
$INSERT APPCOLORS
$INSERT POPUP_EQUATES
$INSERT LOGICAL
EQU COL$REACT_NO TO 1
EQU COL$SVC_HRS TO 2
@ -77,6 +78,9 @@ BEGIN CASE
CASE EntID = @WINDOW:'.LU_PKT_QTY' AND Event = 'CLICK' ; GOSUB LUPktQty
CASE EntID = @WINDOW:'.RETIRE_BUTTON' AND Event = 'CLICK' ; GOSUB RetireItem
CASE EntID = @WINDOW:'.PRINT_LABEL' AND Event = 'CLICK' ; GOSUB PrintLabel
CASE EntID = @WINDOW:'.RI_TYPE' AND Event = 'CHANGED' ; GOSUB RITypeChange
CASE EntID = @WINDOW:'.PKT_SIZE' AND Event = 'CHANGED' ; GOSUB PktSizeChange
CASE EntID = @WINDOW:'.PART_TYPE' AND Event = 'LOSTFOCUS' ; GOSUB PktSizeChange
CASE 1
@ -142,14 +146,11 @@ RETURN
Read:
* * * * * * *
GOSUB Refresh
RETURN
* * * * * * *
Write:
* * * * * * *
@ -261,9 +262,68 @@ FOR Line = 1 TO ListCnt
NEXT N
END
NEXT Line
RIType = Get_Property(@Window:'.RI_TYPE', 'TEXT')
If RIType EQ 'S' then
Set_Property(@Window:'.SUSC_GROUP', 'ENABLED', True$)
Set_Property(@Window:'.PKT_SIZE_LABEL', 'ENABLED', True$)
Set_Property(@Window:'.PKT_SIZE', 'ENABLED', True$)
Set_Property(@Window:'.LU_PKT_SIZE', 'ENABLED', True$)
Set_Property(@Window:'.PKT_SIZE_DESC', 'ENABLED', True$)
Set_Property(@Window:'.PKT_QTY_LABEL', 'ENABLED', True$)
Set_Property(@Window:'.LU_PKT_QTY', 'ENABLED', True$)
Set_Property(@Window:'.PPLUS_RDS_NO_LABEL', 'ENABLED', True$)
Set_Property(@Window:'.PPLUS_RDS_NO', 'ENABLED', True$)
end else
Set_Property(@Window:'.SUSC_GROUP', 'ENABLED', False$)
Set_Property(@Window:'.PKT_SIZE_LABEL', 'ENABLED', False$)
Set_Property(@Window:'.PKT_SIZE', 'ENABLED', False$)
Set_Property(@Window:'.PKT_SIZE', 'TEXT', '')
Set_Property(@Window:'.LU_PKT_SIZE', 'ENABLED', False$)
Set_Property(@Window:'.PKT_SIZE_DESC', 'ENABLED', False$)
Set_Property(@Window:'.PKT_SIZE_DESC', 'TEXT', '')
Set_Property(@Window:'PKT_QTY_LABEL', 'ENABLED', False$)
Set_Property(@Window:'.PKT_QTY', 'TEXT', '')
Set_Property(@Window:'.LU_PKT_QTY', 'ENABLED', False$)
Set_Property(@Window:'.PPLUS_RDS_NO_LABEL', 'ENABLED', False$)
Set_Property(@Window:'.PPLUS_RDS_NO', 'ENABLED', False$)
Set_Property(@Window:'.PPLUS_RDS_NO', 'TEXT', '')
end
RETURN
* * * * * * *
RITypeChange:
* * * * * * *
RIType = Get_Property(@Window:'.RI_TYPE', 'TEXT')
If RIType EQ 'S' then
Set_Property(@Window:'.SUSC_GROUP', 'ENABLED', True$)
Set_Property(@Window:'.PKT_SIZE_LABEL', 'ENABLED', True$)
Set_Property(@Window:'.PKT_SIZE', 'ENABLED', True$)
Set_Property(@Window:'.LU_PKT_SIZE', 'ENABLED', True$)
Set_Property(@Window:'.PKT_SIZE_DESC', 'ENABLED', True$)
Set_Property(@Window:'.PKT_QTY_LABEL', 'ENABLED', True$)
Set_Property(@Window:'.LU_PKT_QTY', 'ENABLED', True$)
Set_Property(@Window:'.PPLUS_RDS_NO_LABEL', 'ENABLED', True$)
Set_Property(@Window:'.PPLUS_RDS_NO', 'ENABLED', True$)
end else
Set_Property(@Window:'.SUSC_GROUP', 'ENABLED', False$)
Set_Property(@Window:'.PKT_SIZE_LABEL', 'ENABLED', False$)
Set_Property(@Window:'.PKT_SIZE', 'ENABLED', False$)
Set_Property(@Window:'.PKT_SIZE', 'TEXT', '')
Set_Property(@Window:'.LU_PKT_SIZE', 'ENABLED', False$)
Set_Property(@Window:'.PKT_SIZE_DESC', 'ENABLED', False$)
Set_Property(@Window:'.PKT_SIZE_DESC', 'TEXT', '')
Set_Property(@Window:'PKT_QTY_LABEL', 'ENABLED', False$)
Set_Property(@Window:'.PKT_QTY', 'TEXT', '')
Set_Property(@Window:'.LU_PKT_QTY', 'ENABLED', False$)
Set_Property(@Window:'.PPLUS_RDS_NO_LABEL', 'ENABLED', False$)
Set_Property(@Window:'.PPLUS_RDS_NO', 'ENABLED', False$)
Set_Property(@Window:'.PPLUS_RDS_NO', 'TEXT', '')
end
return
* * * * * * *
RetireItem:
@ -443,19 +503,47 @@ RETURN
LUPktSize:
* * * * * * *
RetVal = Popup(@WINDOW,'','WAFER_SIZES')
IF RetVal NE '' THEN
oaParms = RetVal:@RM:@WINDOW:'.PKT_SIZE'
obj_Appwindow('LUValReturn',oaParms)
END
Retired = Get_Property(@Window: '.RETIRE_DT', 'TEXT')
RIType = Get_Property(@Window:'.RI_TYPE', 'TEXT')
If RIType EQ 'S' then
PocketQty = ''
Set_Property(@Window:'.PKT_QTY', 'TEXT', '')
PartType = Get_Property(@Window: '.PART_TYPE', 'TEXT')
If (PartType EQ 'HTR') OR (PartType EQ 'EPP') OR (PartType EQ 'ASM') then
RetVal = Popup(@WINDOW,TypeOver,'WAFER_SIZES')
IF RetVal NE '' THEN
oaParms = RetVal:@RM:@WINDOW:'.PKT_SIZE'
obj_Appwindow('LUValReturn',oaParms)
Begin Case
Case PartType EQ 'HTR'
If RetVal EQ 8 then
PocketQty = 3
end else
If RetVal EQ 6 then PocketQty = 5
end
Case PartType EQ 'EPP'
If RetVal EQ 8 then
PocketQty = 8
end else
If RetVal EQ 6 then PocketQty = 18
end
Case PartType EQ 'ASM'
If RetVal EQ 8 OR RetVal EQ 6 then PocketQty = 1
End Case
Set_Property(@Window:'.PKT_QTY', 'TEXT', PocketQty)
END
end else
If Retired EQ '' then ErrMsg('A valid Part Type (EPP, ASM, HTR) must be selected before selecting Pocket Size.')
end
end
RETURN
* * * * * * *
* * * * * *
LUPktQty:
* * * * * * *
* * * * * *
ReactType = Get_Property(@WINDOW:'.REACT_TYPE','INVALUE')
@ -508,3 +596,43 @@ obj_React_Item('PrintLabel',RINo:@RM:CurrRec)
RETURN
PktSizeChange:
Retired = Get_Property(@Window: '.RETIRE_DT', 'TEXT')
RIType = Get_Property(@Window:'.RI_TYPE', 'TEXT')
If RIType EQ 'S' then
PocketQty = ''
Set_Property(@Window:'.PKT_QTY', 'TEXT', '')
PktSize = Get_Property(@Window: '.PKT_SIZE', 'TEXT')
PartType = Get_Property(@Window: '.PART_TYPE', 'TEXT')
If (PartType EQ 'HTR') OR (PartType EQ 'EPP') OR (PartType EQ 'ASM') then
If PktSize EQ 6 OR PktSize EQ 8 then
Begin Case
Case PartType EQ 'HTR'
If PktSize EQ 8 then
PocketQty = 3
end else
If PktSize EQ 6 then PocketQty = 5
end
Case PartType EQ 'EPP'
If PktSize EQ 8 then
PocketQty = 8
end else
If PktSize EQ 6 then PocketQty = 18
end
Case PartType EQ 'ASM'
If PktSize EQ 8 OR PktSize EQ 6 then PocketQty = 1
End Case
Set_Property(@Window:'.PKT_QTY', 'TEXT', PocketQty)
end else
If Retired EQ '' then ErrMsg('A valid Pocket Size (6 or 8 in.) is required.')
end
end else
If Retired EQ '' then ErrMsg('A valid Part Type (EPP, ASM, HTR) must be selected before selecting Pocket Size.')
end
end
return

View File

@ -135,12 +135,70 @@ return
WRITE_RECORD_PRE:
ErrMsg = ''
ErrMsg = ''
OrigRetireDt = OrigRecord<REACT_ITEM_RETIRE_DT$>
NewRetireDt = Record<REACT_ITEM_RETIRE_DT$>
If OrigRetireDt EQ '' AND NewRetireDt NE '' then
RetireBypass = True$
end else
RetireBypass = False$
end
If RetireBypass EQ False$ then
// Req'd parameter checks
ItemType = {RI_TYPE}
// Req'd parameter checks
ItemType = {RI_TYPE}
If ItemType EQ '' then ErrMsg := 'Item Type was not specified. '
If ItemType EQ '' then ErrMsg := 'Item Type was not specified. '
If (ItemType NE 'LE') AND (ItemType NE 'RE') then
SerialNo = Record<REACT_ITEM_SERIAL_NO$>
If SerialNo EQ '' then
ErrMsg := 'Serial No. is required for this Reactor Item type. '
end
end
If ItemType EQ 'S' then
PocketQty = Record<REACT_ITEM_PKT_QTY$>
PocketSize = Record<REACT_ITEM_PKT_SIZE$>
If PocketSize EQ '' then
ErrMsg := 'Pocket size is required for Susceptor Item Type. '
end
If PocketQty EQ '' then
ErrMsg := 'Pocket quantity is required for Susceptor Item Type. '
end
If ErrMsg = '' then
ExpectedQty = ''
Begin Case
Case Record<REACT_ITEM_PART_TYPE$> EQ 'ASM'
If PocketSize EQ 6 OR PocketSize EQ 8 then
ExpectedQty = 1
end
Case Record<REACT_ITEM_PART_TYPE$> EQ 'HTR'
If PocketSize EQ 8 then
ExpectedQty = 3
end else
If PocketSize EQ 6 then ExpectedQty = 5
end
Case Record<REACT_ITEM_PART_TYPE$> EQ 'EPP'
If PocketSize EQ 8 then
ExpectedQty = 8
end else
If PocketSize EQ 6 then ExpectedQty = 18
end
Case Record<REACT_ITEM_PART_TYPE$> EQ ''
ErrMsg := 'Part Type. is required for Susceptor Reactor Item type. '
Case Otherwise$
ErrMsg := 'Invalid Part Type for Susceptor Reactor Item Type. '
End Case
If ExpectedQty NE '' then
If PocketQty NE ExpectedQty then
ErrMsg := 'Invalid Pocket Quantity for Part Type/Pocket Size combination. '
end
end
end
end
end
If ErrMsg NE '' then
Error_Services('Add', 'Error Saving Reactor Item: ' : ErrMsg)
@ -149,8 +207,6 @@ WRITE_RECORD_PRE:
Record = ''
ActionFlow = ACTION_STOP$
end else
OrigRetireDt = OrigRecord<REACT_ITEM_RETIRE_DT$>
NewRetireDt = Record<REACT_ITEM_RETIRE_DT$>
OrigNotes = OrigRecord<REACT_ITEM_NOTES$>
NewNotes = Record<REACT_ITEM_NOTES$>
If ( (OrigRetireDt NE NewRetireDt) or (OrigNotes NE NewNotes) ) then
@ -233,3 +289,6 @@ Restore_System_Variables:
return

View File

@ -46,7 +46,7 @@ Options BOOLEAN = True$, False$
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Service GetReactItems(RIType, CurrStatus, EntryDtStart, EntryDtEnd, RetireDtStart, RetireDtEnd, IncludeNullRetireDt=BOOLEAN)
Service GetReactItems(RIType, CurrStatus, EntryDtStart, EntryDtEnd, RetireDtStart, RetireDtEnd, IncludeNullRetireDt=BOOLEAN, PartType)
ErrorMsg = ''
Response = ''
@ -99,6 +99,9 @@ Service GetReactItems(RIType, CurrStatus, EntryDtStart, EntryDtEnd, RetireDtStar
Swap ',' with @VM in CurrStatus
SearchString := 'CURR_STATUS_STATIC':@VM:CurrStatus:@FM
end
If PartType NE '' then
SearchString := 'PART_TYPE':@VM:PartType:@FM
end
Flag = ''
RIKeys = ''
Btree.Extract(SearchString, 'REACT_ITEM', DictReactItem, RIKeys, 'E', Flag)
@ -370,7 +373,7 @@ Service GetReactItemTemplateJSON()
end else
Error_Services('Add', 'Unable to create JSON representation in the ' : Service : ' service.')
end
Response = jsonRecord
end service
@ -381,17 +384,15 @@ Service CreateReactItem(Record)
ErrMsg = ''
KeyID = ''
If Record NE '' then
//Need to do some parameter checks here
ReactItemType = Record<REACT_ITEM_RI_TYPE$>
If ReactItemType EQ '' then
ErrMsg := 'React Item Type was blank!' : CRLF$
end
If ErrMsg EQ '' then
KeyID = NextKey('REACT_ITEM')
If Error_Services('NoError') and KeyID NE '' then
Database_Services('WriteDataRow', 'REACT_ITEM', KeyID, Record)
Database_Services('WriteDataRow', 'REACT_ITEM', KeyID, Record, True$, False$, False$)
If Error_Services('HasError') then
ErrMsg := Error_Services('GetMessage')
end
end else
ErrMsg := 'Failed to generate a key for a new react item. ' : CRLF$
ErrMsg := 'Failed to generate a key for a new react item. '
end
end
end
@ -457,6 +458,31 @@ Service ConvertRecordToJSONQuick(KeyID, Record, ItemURL)
end service
Service UpdateReactItem(RINo, Record)
ErrorMsg = ''
If RINo EQ '' then
ErrorMsg := 'React Item ID argument was missing in the ' : Service : ' service. '
end
If Record EQ '' then
ErrorMsg := 'React Item Record argument was missing in the ' : Service : ' service. '
end
If ErrorMsg EQ '' then
If RowExists('REACT_ITEM', RINo) then
Database_Services('WriteDataRow', 'REACT_ITEM', RINo, Record, True$, False$, False$)
If Error_Services('HasError') then
ErrorMsg := Error_Services('GetMessage')
end
end else
ErrorMsg := 'React Item not found. '
end
end
If ErrorMsg NE '' then
Error_Services('Add', ErrorMsg)
end
end service
Service UpdateReactItemStatus(RINo)
If RINo NE '' then
@ -493,3 +519,7 @@ ClearCursors:
return

View File

@ -0,0 +1,174 @@
Function Receivecassette_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 : Receivecassette_API
Description : API logic for the Receivecassette 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 Receivecassette[.ID.[<Property>]]
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
Examples:
- Receivecassette.POST
- Receivecassette.ID.PUT
- Receivecassette.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)
08/28/25 xxx Original programmer.
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
$insert APP_INSERTS
$insert API_SETUP
$insert HTTP_INSERTS
Declare function Work_Order_Services, Wo_Mat_Services, OI_Wizard_Services, Date_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 receivecassette.POST
OIWizardID = ''
Cookies = HTTP_Services('GetHTTPCookie')
For each Cookie in Cookies using ';'
Key = Field(Cookie, '=', 1)
If Key EQ 'sessionID' then
OIWizardID = Field(Cookie, '=', 2)
end
Next Cookie
ValidSession = OI_Wizard_Services('ValidateSession', OIWizardID)
If ValidSession then
ErrorMsg = ''
// Check if payload has the required information to create a react mode change record
Body = HTTP_Services('GetHTTPPostString')
If Body NE '' then
// The POST string will have been encoded so use percent (URL) decoding.
SubstrateScanJSON = HTTP_Services('DecodePercentString', Body)
ParseResponse = SRP_JSON(hJSON, 'PARSE', SubstrateScanJSON)
If (ParseResponse EQ '') then
WONo = SRP_JSON(hJSON, 'GetValue', 'WoNo', '')
LotNo = SRP_JSON(hJSON, 'GetValue', 'LotNo', '')
Qty = SRP_JSON(hJSON, 'GetValue', 'Qty', 0)
SubPartNo = SRP_JSON(hJSON, 'GetValue', 'SubPartNo', '')
SubVendCd = SRP_JSON(hJSON, 'GetValue', 'VendorCd', '')
ReceiveDtm = SRP_JSON(hJSON, 'GetValue', 'ReceiveDtm', '01/01/0001 00:00:00')
ReceiveUser = SRP_JSON(hJSON, 'GetValue', 'ReceiveUser', '')
Begin Case
Case (WONo EQ '')
ErrorMsg = 'WoNo cannot be null'
Case (ReceiveUser EQ '')
ErrorMsg = 'ReceiveUser cannot be null'
Case (LotNo EQ '')
ErrorMsg = 'Scanned LotNo cannot be null'
Case (Qty EQ 0)
ErrorMsg = 'Scanned Qty cannot be 0'
Case (SubPartNo EQ '')
ErrorMsg = 'Scanned SubPartNo cannot be null'
Case (SubVendCd EQ '')
ErrorMsg = 'Scanned VendorCd cannot be null'
Case (ReceiveDtm EQ '01/01/0001 00:00:00')
ErrorMsg = 'Invalid ReceiveDtm'
Case Otherwise$
Null
End Case
If (ErrorMsg EQ '') then
ReceiveDtm = Date_Services('ConvertISO8601ToDateTime', ReceiveDtm)
WOMatKey = Work_Order_Services('ReceiveReleaseCassette', WONo, ReceiveUser, LotNo, Qty, SubPartNo, SubVendCd, IConv(ReceiveDtm, 'DT'))
If Error_Services('NoError') then
ResponseCode = 201
Message = 'Cassette ':WOMatKey:' received'
GoSub CreateHalItem
end else
HTTP_Services('SetResponseStatus', 400, Error_Services('GetMessage'))
end
end else
HTTP_Services('SetResponseStatus', 400, 'Error receiving cassette. ':ErrorMsg)
end
SRP_JSON(hJSON, 'Release')
end else
// Error parsing JSON
HTTP_Services('SetResponseStatus', 400, 'Unable to parse the JSON data from the request.')
end
end else
// No JSON payload sent with request
HTTP_Services('SetResponseStatus', 400, 'JSON object is missing in the body of the request.')
end
end else
HTTP_Services('SetResponseStatus', 401, 'Invalid session. Reauthentication required.')
end
end api
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CreateHalItem:
JSON = ''
IF RowExists('WO_MAT', WOMatKey) then
// Update Scan object in root JSON object to contain the returned WO_MAT object
WOMatJson = Wo_Mat_Services('ConvertRecordToJsonOIWizard', WOMatKey)
If (SRP_JSON(objWOMat, 'Parse', WOMatJson) EQ '') then
objTemp = SRP_JSON(objWOMat, 'Get', 'WO_Mat')
SRP_JSON(hJSON, 'Remove', 'ReceivedCass')
SRP_JSON(hJSON, 'Set', 'ReceivedCass', objTemp)
SRP_JSON(objTemp, 'Release')
SRP_JSON(objWOMat, 'Release')
JSON = SRP_JSON(hJSON, 'Stringify', 'Fast')
end
end else
ResponseCode = 406
ResponseMessage = 'Error receiving and releasing cassette. WO_MAT record ':WOMatKey:' does not exist after calling ReceiveReleaseCassette.'
HTTP_Services('SetResponseStatus', ResponseCode, ResponseMessage)
end
If Error_Services('NoError') then
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
HTTP_Services('SetResponseBody', JSON, False$, 'application/hal+json')
If Assigned(Message) then
HTTP_Services('SetResponseStatus', ResponseCode, Message)
end else
HTTP_Services('SetResponseStatus', ResponseCode)
end
end else
Message = Error_Services('GetMessage')
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
end
return

View File

@ -243,4 +243,3 @@ API reports.GET
HTTP_Resource_Services('LoremIpsum')
end api

View File

@ -150,7 +150,7 @@ Service GetMakeupInventoryReportJSON()
end else
LotID = Row<0, 2>:'*1*':Row<0, 3>
end
WcRec = Wafer_Counter_Services('GetLastScan', LotID, 'MU')
WcRec = Wafer_Counter_Services('GetLastScan', LotID)
WcQty = WcRec<WAFER_COUNTER.SCAN_QTY$>
WcDtm = WcRec<WAFER_COUNTER.SCAN_DTM$>
@ -1446,8 +1446,11 @@ Service GenerateMaterialTrackRows()
ErrCode = ''
ErrorMsg = ''
SchedDetTable = ''
SchedDetDict = ''
OPEN 'SCHED_DET_NG' TO SchedDetTable then
OPEN 'DICT.SCHED_DET_NG' TO @DICT then
OPEN 'DICT.SCHED_DET_NG' TO SchedDetDict then
Today = Datetime()
ReactList = ''
@ -1466,12 +1469,12 @@ Service GenerateMaterialTrackRows()
END
Done = 0
@ID = ''
CurrSchedDetKey = ''
LOOP
PrevSchedDetKey = @ID
READNEXT @ID ELSE Done = 1
PrevSchedDetKey = CurrSchedDetKey
READNEXT CurrSchedDetKey ELSE Done = 1
UNTIL Done
READ SchedDetRec FROM SchedDetTable,@ID THEN
READ SchedDetRec FROM SchedDetTable,CurrSchedDetKey THEN
ReactNo = SchedDetRec<SCHED_DET_NG.REACT_NO$>
WONo = SchedDetRec<SCHED_DET_NG.WO_NO$>
If ReactNo NE '' then
@ -1482,20 +1485,20 @@ Service GenerateMaterialTrackRows()
If WONo NE '' then
LOCATE WONo IN WOList<Pos> USING @VM SETTING WPos ELSE
WOList = INSERT(WOList,Pos,-1,0,WONo)
SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,@ID)
SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,CurrSchedDetKey)
END
END
END
REPEAT
CALL Make.List(0,SchedDetKeys,SchedDetTable,@DICT)
CALL Make.List(0, SchedDetKeys, SchedDetTable, SchedDetDict)
DateRange = 'Effective ':OCONV(Date(),'D4')
RowIndex = 0
AllReportData = ''
@RECCOUNT = 0
RecCount = 0
FirstPass = 1
LastRecord = 0
FirstLine = 1
@ -1506,48 +1509,50 @@ Service GenerateMaterialTrackRows()
Prev.ReactNo = ''
Last.ReactNo.Break = 1
CurrSchedDetRec = ''
Loop
ReactNo.Break = 0
READNEXT @ID, Which.Value ELSE
READNEXT CurrSchedDetKey, Which.Value ELSE
LastRecord = 1
ReactNo.Break = 1
ReactNo = Prev.ReactNo
END
S.ATID = @ID
S.ATID = CurrSchedDetKey
Abort = (FirstPass and LastRecord)
If Not(Abort) then
If Not(LastRecord) then
READO @RECORD FROM SchedDetTable,@ID then
READO CurrSchedDetRec FROM SchedDetTable,CurrSchedDetKey then
// GOTO ReadRecord
@RECCOUNT += 1
RecCount += 1
* Calculate Value(s) For Column(s)
S.StartDtm = {START_DTM}
S.ATID = {@ID}
S.StartDtm = CurrSchedDetRec<SCHED_DET_NG.START_DTM$>
S.ATID = CurrSchedDetKey
I.ATID = S.ATID
S.ReactNo = {REACT_NO}
S.ReactNo = CurrSchedDetRec<SCHED_DET_NG.REACT_NO$>
I.ReactNo = S.ReactNo
S.WoNo = {WO_NO}
S.WoNo = CurrSchedDetRec<SCHED_DET_NG.WO_NO$>
I.WoNo = S.WoNo
S.SubPartNo = XLATE('WO_LOG', S.WoNo, 'ORD_SUB_PART_NO', 'X')
I.SubPartNo = S.SubPartNo
S.EpiPartNo = XLATE('WO_LOG', S.WoNo, WO_LOG_EPI_PART_NO$, 'X')
I.EpiPartNo = S.EpiPartNo
S.WO_Qty = Xlate('WO_LOG', {WO_NO}, WO_LOG_WO_QTY$, 'X')
S.WO_Qty = Xlate('WO_LOG', S.WoNo, WO_LOG_WO_QTY$, 'X')
I.WO_Qty = S.WO_Qty
S.WO_RX_Qty = Xlate('WO_LOG', {WO_NO}, 'RX_QTY', 'X')
S.WO_RX_Qty = Xlate('WO_LOG', S.WoNo, 'RX_QTY', 'X')
I.WO_RX_Qty = S.WO_RX_Qty
S.WO_UnRel_QTY = Xlate('WO_LOG', {WO_NO}, 'UNREL_QTY', 'X')
S.WO_UnRel_QTY = Xlate('WO_LOG', S.WoNo, 'UNREL_QTY', 'X')
I.WO_UnRel_QTY = S.WO_UnRel_QTY
S.REACT_TYPE = Xlate('WO_LOG', {WO_NO}, 'REACT_TYPE', 'X')
S.ProdOrdNo = Xlate('WO_LOG', {WO_NO}, 'PROD_ORD_NO', 'X')
S.REACT_TYPE = Xlate('WO_LOG', S.WoNo, 'REACT_TYPE', 'X')
S.ProdOrdNo = Xlate('WO_LOG', S.WoNo, 'PROD_ORD_NO', 'X')
Locate 'SR*KTR]' in LocationFilter using @VM setting vPos then
KitData = Location_Services('GetLocationCassInfo', S.WONo, 'SR*KTR]')
@ -1898,9 +1903,12 @@ Service PrintMaterialTrackReport(RptColumns, LocationFilter, NoMatFlag, OldRepor
ErrorTitle = 'Error in service ':Service
ErrCode = ''
ErrorMsg = ''
SchedDetTable = ''
SchedDetDict = ''
OPEN 'SCHED_DET_NG' TO SchedDetTable then
OPEN 'DICT.SCHED_DET_NG' TO @DICT then
OPEN 'DICT.SCHED_DET_NG' TO SchedDetDict then
Today = Datetime()
ReactList = ''
@ -1921,13 +1929,13 @@ Service PrintMaterialTrackReport(RptColumns, LocationFilter, NoMatFlag, OldRepor
RETURN
END
Done = 0
@ID = ''
Done = 0
CurrSchedDetKey = ''
LOOP
PrevSchedDetKey = @ID
READNEXT @ID ELSE Done = 1
PrevSchedDetKey = CurrSchedDetKey
READNEXT CurrSchedDetKey ELSE Done = 1
UNTIL Done
READ SchedDetRec FROM SchedDetTable,@ID THEN
READ SchedDetRec FROM SchedDetTable,CurrSchedDetKey THEN
ReactNo = SchedDetRec<SCHED_DET_NG.REACT_NO$>
WONo = SchedDetRec<SCHED_DET_NG.WO_NO$>
If ReactNo NE '' then
@ -1938,14 +1946,14 @@ Service PrintMaterialTrackReport(RptColumns, LocationFilter, NoMatFlag, OldRepor
If WONo NE '' then
LOCATE WONo IN WOList<Pos> USING @VM SETTING WPos ELSE
WOList = INSERT(WOList,Pos,-1,0,WONo)
SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,@ID)
SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,CurrSchedDetKey)
END
END
END
REPEAT
CALL Make.List(0,SchedDetKeys,SchedDetTable,@DICT)
CALL Make.List(0,SchedDetKeys,SchedDetTable,SchedDetDict)
Header = "'D'":@VM:obj_Install('Get_Prop','CompTitle'):' Material Tracking by Reactor':@VM:"Page 'P'"
MinDemand = 0
@ -1988,7 +1996,7 @@ Service PrintMaterialTrackReport(RptColumns, LocationFilter, NoMatFlag, OldRepor
Footer = " 'D' 'T'":@VM:@VM:"Page: 'P'"
stat = Set_Printer('FOOTER',Footer)
If Stat GE 0 then
@RECCOUNT = 0
RecCount = 0
FirstPass = 1
LastRecord = 0
FirstLine = 1
@ -2010,48 +2018,48 @@ Service PrintMaterialTrackReport(RptColumns, LocationFilter, NoMatFlag, OldRepor
Prev.ReactNo = ''
Last.ReactNo.Break = 1
CurrSchedDetRec = ''
Loop
* Zero Break Flags To False
ReactNo.Break = 0
READNEXT @ID, Which.Value ELSE
READNEXT CurrSchedDetKey, Which.Value ELSE
LastRecord = 1
ReactNo.Break = 1
ReactNo = Prev.ReactNo
END
S.ATID = @ID
S.ATID = CurrSchedDetKey
Abort = (FirstPass AND LastRecord)
IF Not(Abort) THEN
IF Not(LastRecord) then
READO @RECORD FROM SchedDetTable,@ID then
READO CurrSchedDetRec FROM SchedDetTable,CurrSchedDetKey then
@RECCOUNT += 1
RecCount += 1
* Calculate Value(s) For Column(s)
S.ATID = {@ID}
I.ATID = S.ATID
S.ReactNo = {REACT_NO}
I.ReactNo = S.ReactNo
S.WoNo = {WO_NO}
I.WoNo = S.WoNo
S.SubPartNo = XLATE('WO_LOG', S.WoNo, 'ORD_SUB_PART_NO', 'X')
I.SubPartNo = S.SubPartNo
S.EpiPartNo = XLATE('WO_LOG', S.WoNo, WO_LOG_EPI_PART_NO$, 'X')
I.EpiPartNo = S.EpiPartNo
S.WO_Qty = Xlate('WO_LOG', {WO_NO}, WO_LOG_WO_QTY$, 'X')
I.WO_Qty = S.WO_Qty
S.WO_RX_Qty = Xlate('WO_LOG', {WO_NO}, 'RX_QTY', 'X')
I.WO_RX_Qty = S.WO_RX_Qty
S.WO_UnRel_QTY = Xlate('WO_LOG', {WO_NO}, 'UNREL_QTY', 'X')
I.WO_UnRel_QTY = S.WO_UnRel_QTY
S.REACT_TYPE = Xlate('WO_LOG', {WO_NO}, 'REACT_TYPE', 'X')
S.ProdOrdNo = Xlate('WO_LOG', {WO_NO}, 'PROD_ORD_NO', 'X')
S.ATID = CurrSchedDetKey
I.ATID = S.ATID
S.ReactNo = CurrSchedDetRec<SCHED_DET_NG.REACT_NO$>
I.ReactNo = S.ReactNo
S.WoNo = CurrSchedDetRec<SCHED_DET_NG.WO_NO$>
I.WoNo = S.WoNo
S.SubPartNo = XLATE('WO_LOG', S.WoNo, 'ORD_SUB_PART_NO', 'X')
I.SubPartNo = S.SubPartNo
S.EpiPartNo = XLATE('WO_LOG', S.WoNo, WO_LOG_EPI_PART_NO$, 'X')
I.EpiPartNo = S.EpiPartNo
S.WO_Qty = Xlate('WO_LOG', S.WoNo, WO_LOG_WO_QTY$, 'X')
I.WO_Qty = S.WO_Qty
S.WO_RX_Qty = Xlate('WO_LOG', S.WoNo, 'RX_QTY', 'X')
I.WO_RX_Qty = S.WO_RX_Qty
S.WO_UnRel_QTY = Xlate('WO_LOG', S.WoNo, 'UNREL_QTY', 'X')
I.WO_UnRel_QTY = S.WO_UnRel_QTY
S.REACT_TYPE = Xlate('WO_LOG', S.WoNo, 'REACT_TYPE', 'X')
S.ProdOrdNo = Xlate('WO_LOG', S.WoNo, 'PROD_ORD_NO', 'X')
If OldReport then
@ -2332,7 +2340,9 @@ Service PrintMaterialTrackReport(RptColumns, LocationFilter, NoMatFlag, OldRepor
end service
Service GetOpenNCRReportJson()
ErrorMessage = ''
OpenNCRReportJson = ''
OpenNCRKeyList = NCR_Services('GetOpenNCRKeys')
@ -2435,4 +2445,3 @@ OipiPrintError:
return

View File

@ -1320,3 +1320,4 @@ Service MigrateLegacyRTFRecord(RTFRecordId)
end
end service

View File

@ -263,6 +263,7 @@ API scan.ID.PATCH
SRP_Stopwatch('Start', 'IDPatchResponseTime')
// First confirm that this is a valid Scan ID.
jsonScan = Scan_Services('GetScansRow', ScanID, True$)
ErrMsg = ''
If Error_Services('NoError') then
// Confirm that all required data has been scanned before allowing the "accept" field to be updated.
ParseResponse = SRP_JSON(objResource, 'Parse', jsonScan)
@ -293,7 +294,7 @@ API scan.ID.PATCH
end
end else
ScanNotAcceptableReason = SRP_JSON(objResource, 'GetValue', 'scan.notAcceptableReason')
Error_Services('Add', ScanNotAcceptableReason)
ErrMsg = ScanNotAcceptableReason
end
SRP_JSON(objResource, 'Release')
end else
@ -324,6 +325,8 @@ API scan.ID.PATCH
end
LogData<6> = ResponseStatusCode
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
If ErrMsg NE '' then Error_Services('Add', ErrMsg)
end api
@ -435,6 +438,3 @@ CreateHALItem:
end
return

View File

@ -51,6 +51,7 @@ Declare function GetTickCount
Declare Subroutine Scan_Services, Memory_Services, Database_Services, SRP_JSON, QA_Services, Error_Services
Declare Subroutine obj_WO_Mat_Log, Tool_Parms_Services, RDS_Services, Logging_Services, Supplement_Services
Declare Subroutine Test_Run_Services, WO_MAT_Services, Reactor_Log_Services, Schedule_Services, Mona_Services
Declare Subroutine Dialog_Response_Log_Services
Equ CRLF$ to \0D0A\
@ -213,19 +214,22 @@ Service GetScansRow(ScanID, ReturnJSON)
ScansRow = ''
ErrMsg = ''
If ScanID NE '' then
ScansRow = Database_Services('ReadDataRow', 'SCANS', ScanID)
If ReturnJSON EQ True$ then
ScansRow = Scan_Services('ConvertMVScanToJSON', ScanID, ScansRow)
end
end else
Error_Services('Add', 'ScanID argument was missing in the ' : Service : ' service.')
ErrMsg = 'ScanID argument was missing in the ' : Service : ' service.'
end
Response = ScansRow
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
If ErrMsg NE '' then Error_Services('Add', ErrMsg)
end service
@ -238,14 +242,17 @@ Service SetScansRow(ScanID, ScansRow)
StartTick = GetTickCount()
MetricName = 'SetScansRow'
ErrMsg = ''
If (ScanID NE '') AND (ScansRow NE '') then
Database_Services('WriteDataRow', 'SCANS', ScanID, ScansRow)
end else
Error_Services('Add', 'ScanID or ScansRow argument was missing in the ' : Service : ' service.')
ErrMsg = 'ScanID or ScansRow argument was missing in the ' : Service : ' service.'
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
If ErrMsg NE '' then Error_Services('Add', ErrMsg)
end service
@ -261,6 +268,7 @@ Service ProcessScanData(ScanID, ScanJSON)
StartTick = GetTickCount()
MetricName = 'ProcessScanData'
ErrMsg = ''
If ( (ScanID NE '') AND (ScanJSON NE '') ) then
hScanJSON = ''
ParseResponse = SRP_JSON(hScanJSON, 'PARSE', ScanJSON)
@ -299,7 +307,7 @@ Service ProcessScanData(ScanID, ScanJSON)
If RowExists('LOT', LotId) then
TWLots = ScansRow<SCANS.TW_LOT_ID$>
Locate LotId in TWLots using @VM setting twPos then
Error_Services('Add', LotID : ' has already been added as a test wafer lot being used.')
ErrMsg = LotID : ' has already been added as a test wafer lot being used.'
end else
ScansRow<SCANS.TW_LOT_CHANGED$> = True$
LotCurrentOperation = Lot_Services('GetLotCurrOperationName', LotId)
@ -315,14 +323,14 @@ Service ProcessScanData(ScanID, ScanJSON)
ScansRow<SCANS.TW_LOT_QTY$, twPos> = 1
end
end else
Error_Services('Add', LotID : ' does not have enough wafers to be used.')
ErrMsg = LotID : ' does not have enough wafers to be used.'
end
end else
Error_Services('Add', LotID : ' is not at a valid operation for use.')
ErrMsg = LotID : ' is not at a valid operation for use.'
end
end
end else
Error_Services('Add', LotID : ' is not a valid test wafer lot ID.')
ErrMsg = LotID : ' is not a valid test wafer lot ID.'
end
Case Otherwise$
@ -349,9 +357,9 @@ Service ProcessScanData(ScanID, ScanJSON)
Case EmployeeAuthorized NE True$
// Regardless of the not authorized reason, the scan data will be considered invalid.
EmployeeNotAuthorizedReason = {EMPLOYEE_NOT_AUTHORIZED_REASON}
Error_Services('Add', EmployeeNotAuthorizedReason)
ErrMsg = EmployeeNotAuthorizedReason
Case EmployeeActive NE True$
Error_Services('Add', 'Inactive employee.')
ErrMsg = 'Inactive employee.'
Case Otherwise$
ScansRow<SCANS.EMPLOYEE_ID$> = {EMPLOYEE_ID}
@ -394,7 +402,7 @@ Service ProcessScanData(ScanID, ScanJSON)
If (EmployeeAuthorized NE True$) AND ({EMPLOYEE_ID} NE '') then
// Regardless of the not authorized reason, the scan data will be considered invalid.
EmployeeNotAuthorizedReason = {EMPLOYEE_NOT_AUTHORIZED_REASON}
Error_Services('Add', EmployeeNotAuthorizedReason)
ErrMsg = EmployeeNotAuthorizedReason
end else
* If LoadLock EQ '' then LoadLock = 'NA' ; // NA means Not Applicable.
ReactorID = ToolID[2, 999]
@ -414,10 +422,10 @@ Service ProcessScanData(ScanID, ScanJSON)
ScansRow<SCANS.TOOL_ID$> = ToolID
ScansRow<SCANS.LOAD_LOCK$> = LoadLock
end else
Error_Services('Add', 'Invalid load lock value "':LoadLock:'".')
ErrMsg = 'Invalid load lock value "':LoadLock:'".'
end
end else
Error_Services('Add', 'A load lock side "L" or "R" is required for reactor ':ReactorID:'.')
ErrMsg = 'A load lock side "L" or "R" is required for reactor ':ReactorID:'.'
end
Case (LoadLockReq EQ False$)
If ScansRow<SCANS.LOCATION_ID$> NE '' then
@ -432,17 +440,17 @@ Service ProcessScanData(ScanID, ScanJSON)
end
Case ToolType _EQC 'Transfer'
Error_Services('Add', 'Tool type ':ToolType:' is not currently supported by the barcode application.')
ErrMsg = 'Tool type ':ToolType:' is not currently supported by the barcode application.'
// Code below may be implemented down the road.
// This is a transfer tool. Just update the scan resource.
* ScansRow<SCANS.LOCATION_ID$> = '' ; // Make sure the Location ID is cleared.
* ScansRow<SCANS.CASSETTE_IDS$> = ScansRow<SCANS.CASSETTE_IDS$, 1> ; // Make sure only the first Cassette ID is tracked.
* ScansRow<SCANS.TRANSFER_TOOL_ID$> = ToolID
Case Otherwise$
Error_Services('Add', 'Tool type ':ToolType:' is not currently supported by the barcode application.')
ErrMsg = 'Tool type ':ToolType:' is not currently supported by the barcode application.'
End Case
end else
Error_Services('Add', ToolID : ' is not a valid tool ID.')
ErrMsg = ToolID : ' is not a valid tool ID.'
end
Case ScanData[1, 2] EQ '1L'
@ -460,7 +468,7 @@ Service ProcessScanData(ScanID, ScanJSON)
ScansRow<SCANS.TRANSFER_TOOL_ID$> = '' ; // Make sure the Transfer Tool ID is cleared.
ScansRow<SCANS.LOCATION_ID$> = LocationID
end else
Error_Services('Add', LocationID : ' is not a valid location ID.')
ErrMsg = LocationID : ' is not a valid location ID.'
end
Case ScanData[1, 2] EQ '1B'
@ -475,7 +483,7 @@ Service ProcessScanData(ScanID, ScanJSON)
ScansRow<SCANS.BOAT_ID$> = BoatID
ScansRow<SCANS.PL_NUMBER$> = PLNo
end else
Error_Services('Add', ScanData : ' is not a valid boat ID.')
ErrMsg = ScanData : ' is not a valid boat ID.'
end
Case ScanData[1, 3] EQ 'PWD'
// Password/Signature scan. If the scan is not ready to be accepted or the password does
@ -490,14 +498,14 @@ Service ProcessScanData(ScanID, ScanJSON)
ScansRow<SCANS.AUTHENTICATED$> = 1
end else
ScansRow<SCANS.AUTHENTICATED$> = 0
Error_Services('Add', 'Invalid password for user ':EmployeeID:'.')
ErrMsg = 'Invalid password for user ':EmployeeID:'.'
end
ScansRow<SCANS.EMPLOYEE_CHANGED$> = True$
end else
Error_Services('Add', 'An employee ID must be scanned before scanning a password.')
ErrMsg = 'An employee ID must be scanned before scanning a password.'
end
end else
Error_Services('Add', 'Invalid password scanned.')
ErrMsg = 'Invalid password scanned.'
end
Case ScanData[1, 8] EQ 'OVERRIDE'
@ -564,7 +572,7 @@ Service ProcessScanData(ScanID, ScanJSON)
end
end else
Error_Services('Add', 'Selected Employee is not authorized to perform an override')
ErrMsg = 'Selected Employee is not authorized to perform an override'
end
end
Case ScanData[1, 2] EQ '5T'
@ -650,11 +658,11 @@ Service ProcessScanData(ScanID, ScanJSON)
ScansRow<SCANS.CASSETTE_IDS$> = CassetteID
end
end else
Error_Services('Add', CassetteID : ' is not a valid Cassette ID.')
ErrMsg = CassetteID : ' is not a valid Cassette ID.'
end
End Case
If Error_Services('NoError') then
If ErrMsg EQ '' then
// Process Scan row data here to determine the type of scan (i.e. Location, Pre-Epi + Load, or Unload).
ScanType = ScansRow<SCANS.SCAN_TYPE$>
CassetteIDs = ScansRow<SCANS.CASSETTE_IDS$>
@ -681,7 +689,7 @@ Service ProcessScanData(ScanID, ScanJSON)
LastCassScanned = CassetteIDs<0, NumCass>
CurrStage = Xlate('RDS', LastCassScanned, 'CURR_STAGE', 'X')
If CurrStage EQ 'UNLOAD' then
Error_Services('Add', '(':LastCassScanned:') Cassette is currently loaded on a tool and is ineligble for a location scan.')
ErrMsg = '(':LastCassScanned:') Cassette is currently loaded on a tool and is ineligble for a location scan.'
end
Case ScanType EQ 'TOOL'
@ -755,7 +763,9 @@ Service ProcessScanData(ScanID, ScanJSON)
CassNo = Xlate('RDS', CassetteID, 'CASS_NO', 'X')
WOMatKey = WONo:'*':CassNo
WOMatLocs = Xlate('WO_MAT', WOMatKey, WO_MAT_INV_LOCATION$, 'X')
If Index(WOMatLocs,'PTI',1) else Error_Services('Add', 'Cassette ':CassetteID:' failed due to missing PTI.')
If Index(WOMatLocs,'PTI',1) else
ErrMsg = 'Cassette ':CassetteID:' failed due to missing PTI.'
end
end else
// EpiPro RDS
OutCassNos = Xlate('RDS', CassetteID, 'OUT_CASS_NO', 'X')
@ -765,11 +775,13 @@ Service ProcessScanData(ScanID, ScanJSON)
CassNo = OutCassNo
WOMatKey = WONo:'*':CassNo
WOMatLocs = Xlate('WO_MAT', WOMatKey, WO_MAT_INV_LOCATION$, 'X')
If Index(WOMatLocs,'PTI',1) else Error_Services('Add', 'Cassette ':CassetteID:' failed due to missing PTI.')
If Index(WOMatLocs,'PTI',1) else
ErrMsg = 'Cassette ':CassetteID:' failed due to missing PTI.'
end
Next OutCassNo
end
If Error_Services('NoError') then
If ErrMsg EQ '' then
If CurrStatus NE 'HOLD' then
If (EmployeeID NE '') then
* SupplInstAckReq = Xlate('RDS', RDSNo, 'SUPPL_ACK_REQ' , 'X')
@ -973,76 +985,77 @@ Service ProcessScanData(ScanID, ScanJSON)
FirstParmsComp = LSParmsComp<1,1>
If (FirstParmsComp EQ False$) then RDS_Services('CopyRDSLayerParameters', RDSNo)
//Test Wafer logging verification
// Supplier lot verification
ScannedSuppLot = ScansRow<SCANS.SUPPLIER_LOT$>
RDSSuppLot = RDSRec<RDS_LOT_NUM$>
If (ScannedSuppLot NE '') then
If (ScannedSuppLot _EQC RDSSuppLot) then
IsTWLoggingReqd = RDS_Services('IsTWLoggingReqd', RDSNo)
If IsTWLoggingReqd NE True$ OR TestWaferLotData NE '' then
WaferCountAckReq = Xlate('RDS', RDSNo, 'WAFER_COUNT_ACK_REQ', 'X')
If WaferCountAckReq EQ False$ then
PreStageReady = ''
LoadStageReady = ''
PreStageReady = QA_Services('PreEpiSignatureReady', RDSNo, Username, WaferQty, Reactor)
If PreStageReady EQ True$ then
LoadStageReady = QA_Services('LoadSignatureReady', RDSNo, Username, WaferQty, LLSide, True$, Reactor)
If (LoadStageReady NE True$) then
// Why is it not ready?
ErrorMsg = Error_Services('GetMessage')
Begin Case
Case IndexC(ErrorMsg, 'supplement', 1)
// Clear the error to return a JSON payload and handle the acknowledgements.
Error_Services('Clear')
Scan_Services('AddNotAcceptableReason', ErrorMsg)
Case IndexC(ErrorMsg, 'ROTR', 1)
ROTRBlock = Database_Services('ReadDataColumn', 'REACTOR', Reactor, REACTOR_ROTR_STATUS$, True$, 0, False$)
ROTRBlockReason = Database_Services('ReadDataColumn', 'REACTOR', Reactor, REACTOR_ROTR_STATUS_REASON$, True$, 0, False$)
ROTREnabled = Database_Services('ReadDataColumn', 'REACTOR', Reactor, REACTOR_ENABLE_ROTR$, True$, 0, False$)
If ( (ROTRBlock NE 'P') AND (ROTREnabled EQ True$) ) then
// Clear the error to return a JSON payload and allow for OVERRIDE scan.
ScansRow<SCANS.OVERRIDE_REQD$> = True$
ScansRow<SCANS.OVERRIDE_REASON$> = ROTRBlockReason
ScansRow<SCANS.OVERRIDE_TYPE$> = 'ROTR'
If Error_Services('NoError') then
// Supplier lot verification
ScannedSuppLot = ScansRow<SCANS.SUPPLIER_LOT$>
RDSSuppLot = RDSRec<RDS_LOT_NUM$>
If (ScannedSuppLot NE '') then
If (ScannedSuppLot _EQC RDSSuppLot) then
IsTWLoggingReqd = RDS_Services('IsTWLoggingReqd', RDSNo)
If IsTWLoggingReqd NE True$ OR TestWaferLotData NE '' then
WaferCountAckReq = Xlate('RDS', RDSNo, 'WAFER_COUNT_ACK_REQ', 'X')
If WaferCountAckReq EQ False$ then
PreStageReady = ''
LoadStageReady = ''
PreStageReady = QA_Services('PreEpiSignatureReady', RDSNo, Username, WaferQty, Reactor)
If PreStageReady EQ True$ then
LoadStageReady = QA_Services('LoadSignatureReady', RDSNo, Username, WaferQty, LLSide, True$, Reactor)
If (LoadStageReady NE True$) then
// Why is it not ready?
ErrMsg = Error_Services('GetMessage')
Begin Case
Case IndexC(ErrMsg, 'supplement', 1)
// Clear the error to return a JSON payload and handle the acknowledgements.
Error_Services('Clear')
Scan_Services('AddNotAcceptableReason', "ROTR Load Block Enabled")
end else
ScansRow<SCANS.OVERRIDE_REQD$> = False$
ScansRow<SCANS.OVERRIDE_REASON$> = ''
ScansRow<SCANS.OVERRIDE_TYPE$> = ''
end
End Case
Scan_Services('AddNotAcceptableReason', ErrMsg)
Case IndexC(ErrMsg, 'ROTR', 1)
ROTRBlock = Database_Services('ReadDataColumn', 'REACTOR', Reactor, REACTOR_ROTR_STATUS$, True$, 0, False$)
ROTRBlockReason = Database_Services('ReadDataColumn', 'REACTOR', Reactor, REACTOR_ROTR_STATUS_REASON$, True$, 0, False$)
ROTREnabled = Database_Services('ReadDataColumn', 'REACTOR', Reactor, REACTOR_ENABLE_ROTR$, True$, 0, False$)
If ( (ROTRBlock NE 'P') AND (ROTREnabled EQ True$) ) then
// Clear the error to return a JSON payload and allow for OVERRIDE scan.
ScansRow<SCANS.OVERRIDE_REQD$> = True$
ScansRow<SCANS.OVERRIDE_REASON$> = ROTRBlockReason
ScansRow<SCANS.OVERRIDE_TYPE$> = 'ROTR'
Error_Services('Clear')
Scan_Services('AddNotAcceptableReason', "ROTR Load Block Enabled")
end else
ScansRow<SCANS.OVERRIDE_REQD$> = False$
ScansRow<SCANS.OVERRIDE_REASON$> = ''
ScansRow<SCANS.OVERRIDE_TYPE$> = ''
end
End Case
end
end else
// Why is it not ready?
ErrMsg = Error_Services('GetMessage')
Begin Case
Case IndexC(ErrMsg, 'supplement', 1)
Error_Services('Clear')
Scan_Services('AddNotAcceptableReason', ErrMsg)
End Case
end
end else
// Why is it not ready?
ErrorMsg = Error_Services('GetMessage')
Begin Case
Case IndexC(ErrorMsg, 'supplement', 1)
Error_Services('Clear')
Scan_Services('AddNotAcceptableReason', ErrorMsg)
End Case
Scan_Services('AddNotAcceptableReason', 'The cassette wafer count must be verified against the scheduled wafer count to proceed.')
end
end else
Scan_Services('AddNotAcceptableReason', 'The cassette wafer count must be verified against the scheduled wafer count to proceed.')
Scan_Services('AddNotAcceptableReason', 'Test wafers are required to be logged with this run.')
end
end else
Scan_Services('AddNotAcceptableReason', 'Test wafers are required to be logged with this run.')
ScansRow<SCANS.SUPPLIER_LOT$> = ''
ErrMsg = '(':CassetteID:') Supplier lot mismatch.'
end
end else
ScansRow<SCANS.SUPPLIER_LOT$> = ''
Error_Services('Add', '(':CassetteID:') Supplier lot mismatch.')
Scan_Services('AddNotAcceptableReason', 'Supplier lot scan required in order to complete a tool scan.')
end
end else
Scan_Services('AddNotAcceptableReason', 'Supplier lot scan required in order to complete a tool scan.')
ErrMsg = Error_Services('GetMessage')
end
end else
Error_Services('Add', '(':CassetteID:') The first run must be completed using the OpenInsight user interface.')
ErrMsg = '(':CassetteID:') The first run must be completed using the OpenInsight user interface.'
end
end else
Error_Services('Add', '(':CassetteID:') A pre-clean is required for this RDS. The OpenInsight user interface must be used to proceed.')
ErrMsg = '(':CassetteID:') A pre-clean is required for this RDS. The OpenInsight user interface must be used to proceed.'
end
Case CurrStage _EQC 'LOAD'
Action = 'LOAD'
@ -1067,13 +1080,13 @@ Service ProcessScanData(ScanID, ScanJSON)
LoadStageReady = QA_Services('LoadSignatureReady', RDSNo, Username, WaferQty, LLSide)
If (LoadStageReady NE True$) then
// Why is it not ready?
ErrorMsg = Error_Services('GetMessage')
ErrMsg = Error_Services('GetMessage')
Begin Case
Case IndexC(ErrorMsg, 'supplement', 1)
Case IndexC(ErrMsg, 'supplement', 1)
// Clear the error to return a JSON payload and handle the acknowledgements.
Error_Services('Clear')
Scan_Services('AddNotAcceptableReason', ErrorMsg)
Case IndexC(ErrorMsg, 'ROTR', 1)
Scan_Services('AddNotAcceptableReason', ErrMsg)
Case IndexC(ErrMsg, 'ROTR', 1)
ROTRBlock = Database_Services('ReadDataColumn', 'REACTOR', Reactor, REACTOR_ROTR_STATUS$, True$, 0, False$)
ROTRBlockReason = Database_Services('ReadDataColumn', 'REACTOR', Reactor, REACTOR_ROTR_STATUS_REASON$, True$, 0, False$)
ROTREnabled = Database_Services('ReadDataColumn', 'REACTOR', Reactor, REACTOR_ENABLE_ROTR$, True$, 0, False$)
@ -1098,11 +1111,11 @@ Service ProcessScanData(ScanID, ScanJSON)
Scan_Services('AddNotAcceptableReason', 'The LWI stage engineering instructions must be acknowledged before the load operation can be signed.')
end
end else
ErrorMessage = 'RDS layer parameters must be reviewed for accuracy and acknowledged before the load operation can be signed.'
Scan_Services('AddNotAcceptableReason', ErrorMessage)
ErrMsg = 'RDS layer parameters must be reviewed for accuracy and acknowledged before the load operation can be signed.'
Scan_Services('AddNotAcceptableReason', ErrMsg)
end
end else
Error_Services('Add', 'Scanned tool ':ScanTool:' does not match the scheduled tool ':SchedTool:'. (':RDSNo:')')
ErrMsg = 'Scanned tool ':ScanTool:' does not match the scheduled tool ':SchedTool:'. (':RDSNo:')'
end
end else
Scan_Services('AddNotAcceptableReason', 'Test wafers are required to be logged with this run.')
@ -1110,7 +1123,7 @@ Service ProcessScanData(ScanID, ScanJSON)
end else
ScansRow<SCANS.SUPPLIER_LOT$> = ''
Error_Services('Add', '(':CassetteID:') Supplier lot mismatch.')
ErrMsg = '(':CassetteID:') Supplier lot mismatch.'
end
end else
Scan_Services('AddNotAcceptableReason', 'Supplier lot scan required in order to complete a tool scan.')
@ -1126,11 +1139,11 @@ Service ProcessScanData(ScanID, ScanJSON)
UnloadStageReady = QA_Services('UnloadSignatureReady', RDSNo, Username, Reactor)
If Not(UnloadStageReady) then
// Why is it not ready?
ErrorMsg = Error_Services('GetMessage')
ErrMsg = Error_Services('GetMessage')
Begin Case
Case IndexC(ErrorMsg, 'supplement', 1)
Case IndexC(ErrMsg, 'supplement', 1)
Error_Services('Clear')
Scan_Services('AddNotAcceptableReason', ErrorMsg)
Scan_Services('AddNotAcceptableReason', ErrMsg)
Case Otherwise$
// Keep error on Error_Services stack and return 400 level error.
End Case
@ -1175,12 +1188,16 @@ Service ProcessScanData(ScanID, ScanJSON)
LastCassInWoTestWaferReqMsg = ''
If NextEventScheduled EQ False$ or NextEventIsBlock EQ True$ then
LastCassInWoTestWaferReqMsg = 'No material scheduled. Test wafer required.'
Dialog_Response_Log_Services('AddDialogResponseLog', RDSNo, 'RDS', @User4, 'HTR_LAST_BOX_TW', 'No test wafer ran with box when one was required. Unload signature was blocked. User was notified.')
end else If NextEventHasSamePsn EQ False$ then
LastCassInWoTestWaferReqMsg = 'Next work order is a NEW PSN number. Test wafer required.'
Dialog_Response_Log_Services('AddDialogResponseLog', RDSNo, 'RDS', @User4, 'HTR_LAST_BOX_TW', 'No test wafer ran with box when one was required. Unload signature was blocked. User was notified.')
end
Scan_Services('AddNotAcceptableReason', LastCassInWoTestWaferReqMsg)
end
end else
Dialog_Response_Log_Services('AddDialogResponseLog', RDSNo, 'RDS', @User4, 'HTR_LAST_BOX_TW', 'Test wafer was already logged with box. Unload signature was allowed. User was not prompted.')
end
WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$> = TestWaferRanSinceLoad
@ -1190,12 +1207,10 @@ Service ProcessScanData(ScanID, ScanJSON)
end
end
end else
ErrorMessage = 'WO_MAT record was null.'
Error_Services('Add', ErrorMessage)
ErrMsg = 'WO_MAT record was null.'
end
end else
ErrorMessage = 'Failure to read cassette record. ' : Error_Services('GetMessage')
Error_Services('Add', ErrorMessage)
ErrMsg = 'Failure to read cassette record. ' : Error_Services('GetMessage')
end
end
end
@ -1213,24 +1228,23 @@ Service ProcessScanData(ScanID, ScanJSON)
end
Case CurrStage _EQC 'COMP'
Action = 'COMP'
Error_Services('Add', '(':CassetteID:") Cassette has already been FQA'd.")
ErrMsg = '(':CassetteID:") Cassette has already been FQA'd."
Case Otherwise$
Action = CurrStage
Error_Services('Set', '(':CassetteID:') The ':CurrStage:' is not currently supported by the barcode application.')
ErrMsg = '(':CassetteID:') The ':CurrStage:' is not currently supported by the barcode application.'
End Case
end else
Scan_Services('AddNotAcceptableReason', 'EmployeeID required to complete a tool scan.')
end
end else
Error_Services('Add', '(':CassetteID:') Process Error: cassette is on Hold and may not be signed off.')
ErrMsg = '(':CassetteID:') Process Error: cassette is on Hold and may not be signed off.'
end
end
end else
Error_Services('Add', '(':CassetteID:') WMI/WMO cassette are not currently supported for tool scans. The OpenInsight user interface must be used in order to proceed.')
ErrMsg = '(':CassetteID:') WMI/WMO cassette are not currently supported for tool scans. The OpenInsight user interface must be used in order to proceed.'
end
end else
// Currently we are only supporting loading one cassette onto a tool at a time.
Error_Services('Add', '(':CassetteID:') Only one cassette can be loaded onto a tool at a time.')
ErrMsg = '(':CassetteID:') Only one cassette can be loaded onto a tool at a time.'
end
end
@ -1291,7 +1305,7 @@ Service ProcessScanData(ScanID, ScanJSON)
End Case
end
// If the the scan data is valid, update the scan log before returning to the calling process.
If Error_Services('NoError') then
If ErrMsg EQ '' then
If Scan_Services('NoNotAcceptableReason') then
ScansRow<SCANS.ACCEPTABLE$> = True$
ScansRow<SCANS.NOT_ACCEPTABLE_REASON$> = ''
@ -1301,7 +1315,7 @@ Service ProcessScanData(ScanID, ScanJSON)
end
end else
ScansRow<SCANS.ACCEPTABLE$> = False$
ScansRow<SCANS.NOT_ACCEPTABLE_REASON$> = Error_Services('GetMessage')
ScansRow<SCANS.NOT_ACCEPTABLE_REASON$> = ErrMsg
end
If ScanData NE '' then
ScansRow<SCANS.SCANNED_DATES$, -1> = Date()
@ -1309,25 +1323,21 @@ Service ProcessScanData(ScanID, ScanJSON)
ScansRow<SCANS.SCANNED_DATA$, -1> = ScanData
end
ScansRow<SCANS.ACTION$> = Action
// Save error message if present as Database_Services will clear any errors.
ErrorMessage = ''
If Error_Services('HasError') then
ErrorMessage = Error_Services('GetMessage')
end
Database_Services('WriteDataRow', 'SCANS', ScanID, ScansRow, True$, False$, True$)
// Restore pre-existing error message if present.
If ErrorMessage NE '' then Error_Services('Add', ErrorMessage)
Database_Services('WriteDataRow', 'SCANS', ScanID, ScansRow, True$, False$, True$)
end
end else
Error_Services('Add', 'Unable to parse the JSON scan data in the ':Service:' service.')
ErrMsg = 'Unable to parse the JSON scan data in the ':Service:' service.'
end
SRP_JSON(hScanJSON, 'Release')
end else
Error_Services('Add', 'ScanID or ScanJSON argument was missing in the ' : Service : ' service.')
ErrMsg = 'ScanID or ScanJSON argument was missing in the ' : Service : ' service.'
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
If ErrMsg NE '' then Error_Services('Add', ErrMsg)
end service
@ -1339,6 +1349,7 @@ Service AcceptScan(ScanID, ScanJSON)
StartTick = GetTickCount()
MetricName = 'AcceptScan'
ErrMsg = ''
If ( (ScanID NE '') and (ScanJSON NE '') ) then
hBody = ''
ParseResponse = SRP_JSON(hBody, 'PARSE', ScanJSON)
@ -1371,7 +1382,7 @@ Service AcceptScan(ScanID, ScanJSON)
If Error_Services('NoError') AND SendStatus EQ 'Success' then
Result = 'Tencor Data Sent Successfully'
end else
Error_Services('Add', SendStatus)
ErrMsg = SendStatus
end
Case ScanType _EQC 'LOCATION'
@ -1476,8 +1487,7 @@ Service AcceptScan(ScanID, ScanJSON)
end
IF Get_Status(errCode) THEN
ErrorMsg = 'Error calling obj_WO_Mat_Log("Create"). Error code: ':errCode
Error_Services('Add', ErrorMsg)
ErrMsg = 'Error calling obj_WO_Mat_Log("Create"). Error code: ':errCode
END else
NumCass = DCount(CassetteIDs, @VM)
If NumCass EQ 1 then
@ -1540,8 +1550,7 @@ Service AcceptScan(ScanID, ScanJSON)
If Error_Services('NoError') then
Continue = True$
end else
ErrorMessage = Error_Services('GetMessage')
Error_Services('Set', ErrorMessage)
ErrMsg = Error_Services('GetMessage')
Continue = False$
end
If Continue then
@ -1585,8 +1594,7 @@ Service AcceptScan(ScanID, ScanJSON)
If Error_Services('NoError') then
Continue = True$
end else
ErrorMessage = Error_Services('GetMessage')
Error_Services('Set', ErrorMessage)
ErrMsg = Error_Services('GetMessage')
Continue = False$
end
If Continue then
@ -1622,8 +1630,7 @@ Service AcceptScan(ScanID, ScanJSON)
PSNo = Xlate('RDS', RDSNo, RDS_PROD_SPEC_ID$, True$, 'X')
NewTestRunId = Test_Run_Services('CreateTestRunRecord', TestRunType, 'R', Reactor, PSNo, RDSNo,Username , TestWaferLots, TestWaferLotQtys)
If Error_Services('HasError') then
ErrorMessage = Error_Services('GetMessage')
Error_Services('Set', ErrorMessage)
ErrMsg = Error_Services('GetMessage')
Continue = False$
end
end
@ -1640,10 +1647,10 @@ Service AcceptScan(ScanID, ScanJSON)
end
Case CurrStage _EQC 'COMP'
Action = 'COMP'
Error_Services('Set', '(':CassetteID:") Cassette has already been FQA'd.")
ErrMsg = '(':CassetteID:") Cassette has already been FQA'd."
Case Otherwise$
Action = CurrStage
Error_Services('Set', '(':CassetteID:') The ':CurrStage:' is not currently supported by the barcode application.')
ErrMsg = '(':CassetteID:') The ':CurrStage:' is not currently supported by the barcode application.'
End Case
Case CassetteID EQ '' AND TestWaferLots NE ''
//Tool scan with ONLY test wafers being logged.
@ -1656,12 +1663,10 @@ Service AcceptScan(ScanID, ScanJSON)
If NewTestRunId NE '' then
Result = 'Test run logged successfully'
end else
ErrorMessage = 'Error while logging creating test run.'
Error_Services('Set', ErrorMessage)
ErrMsg = 'Error while logging creating test run.'
end
end else
ErrorMessage = Error_Services('GetMessage')
Error_Services('Set', ErrorMessage)
ErrMsg = Error_Services('GetMessage')
end
Case Otherwise$
//null
@ -1669,34 +1674,30 @@ Service AcceptScan(ScanID, ScanJSON)
End Case
end
If Error_Services('NoError') then
If ErrMsg EQ '' then
ScansRow<SCANS.NOT_ACCEPTABLE_REASON$> = 'This scan has already been accepted.'
end else
ScansRow<SCANS.NOT_ACCEPTABLE_REASON$> = Error_Services('GetMessage')
ScansRow<SCANS.NOT_ACCEPTABLE_REASON$> = ErrMsg
end
ScansRow<SCANS.ACCEPTABLE$> = False$
If Assigned(Result) then ScansRow<SCANS.RESULT$> = Result
// Save error message if present as Database_Services will clear any errors.
ErrorMessage = ''
If Error_Services('HasError') then
ErrorMessage = Error_Services('GetMessage')
end
Scan_Services('SetScansRow', ScanID, ScansRow)
// Restore pre-existing error message if present.
If ErrorMessage NE '' then Error_Services('Add', ErrorMessage)
Scan_Services('SetScansRow', ScanID, ScansRow)
end else
Error_Services('Add', 'The accepted.status field is missing from the JSON object in the ':Service:' service.')
ErrMsg = 'The accepted.status field is missing from the JSON object in the ':Service:' service.'
end
SRP_JSON(hBody, 'Release')
end else
Error_Services('Add', 'Unable to parse the JSON scan resource in the ':Service:' service.')
ErrMsg = 'Unable to parse the JSON scan resource in the ':Service:' service.'
end
end else
Error_Services('Add', 'ScanID or ScanJSON argument was missing in the ' : Service : ' service.')
ErrMsg = 'ScanID or ScanJSON argument was missing in the ' : Service : ' service.'
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
If ErrMsg NE '' then Error_Services('Add', ErrMsg)
end service
//----------------------------------------------------------------------------------------------------------------------
@ -1714,6 +1715,7 @@ Service ConvertMVScanToJSON(ScanID, mvScan, itemURL)
mvScanChanged = False$
ErrMsg = ''
If ScanID NE '' then
If mvScan EQ '' then mvScan = Database_Services('ReadDataRow', 'SCANS', ScanID)
@ -2167,17 +2169,19 @@ Service ConvertMVScanToJSON(ScanID, mvScan, itemURL)
Database_Services('WriteDataRow', 'SCANS', {SCAN_ID}, mvScan, True$, False$, False$)
end
end else
Error_Services('Add', 'Unable to create JSON representation in the ' : Service : ' service.')
ErrMsg = 'Unable to create JSON representation in the ' : Service : ' service.'
end
end
end else
Error_Services('Add', 'ScanID argument was missing in the ' : Service : ' service.')
ErrMsg = 'ScanID argument was missing in the ' : Service : ' service.'
end
Response = jsonScan
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
If ErrMsg NE '' then Error_Services('Add', ErrMsg)
end service
//----------------------------------------------------------------------------------------------------------------------
@ -2415,3 +2419,7 @@ ClearCursors:
return

View File

@ -30,22 +30,23 @@ Function Schedule_Services(@Service, @Params)
#pragma precomp SRP_PreCompiler
$insert APP_INSERTS
$insert SERVICE_SETUP
$insert RLIST_EQUATES
$insert REACTOR_EQUATES
$insert SCHED_DET_NG_EQUATES
$insert WO_LOG_EQUATES
$Insert APP_INSERTS
$Insert SERVICE_SETUP
$Insert RLIST_EQUATES
$Insert REACTOR_EQUATES
$Insert SCHED_DET_NG_EQUATES
$Insert WO_LOG_EQUATES
$Insert WO_MAT_EQUATES
$insert WO_SCHEDULE_NG_EQUATES
$insert COMPANY_EQUATES
$insert PROD_VER_EQUATES
$insert PRS_LAYER_EQU
$insert SCHEDULE_EVENT_SUMMMARY_EQUATES
$insert EPI_PART_EQUATES
$insert PROD_SPEC_EQUATES
$insert SCHED_HIST_EQUATES
$Insert WO_SCHEDULE_NG_EQUATES
$Insert COMPANY_EQUATES
$Insert PROD_VER_EQUATES
$Insert PRS_LAYER_EQU
$Insert SCHEDULE_EVENT_SUMMMARY_EQUATES
$Insert EPI_PART_EQUATES
$Insert PROD_SPEC_EQUATES
$Insert SCHED_HIST_EQUATES
$Insert RDS_EQUATES
$Insert WM_IN_EQUATES
Equ new_exist$ To 0 ; * Reduce Mode 0
Equ next_cur$ To 1
@ -59,7 +60,7 @@ Declare subroutine Mona_Services
Declare function SRP_Array, Schedule_Services, Memory_Services, Database_Services, SRP_Sort_Array, Datetime
Declare function Epi_Part_Services, SRP_Math, SRP_Hash, obj_Prod_Spec, Logging_Services, Environment_Services
Declare function Work_Order_Services, RTI_CreateGUID, Reactor_Services, Schedule_Services, NextKey, SRP_Datetime
Declare function SRP_Time, Lsl_Users_Services, GetTickCount
Declare function SRP_Time, Lsl_Users_Services, GetTickCount, obj_WO_Mat
Date = Oconv(Date(), 'D4/')
LogFileName = Date[7, 4] : '-' : Date[1, 2] : '-' : Date[4, 2] : ' Scheduler Log.csv'
@ -385,7 +386,6 @@ end service
Service GetScheduleEventSummary(SchedDetKeyID, IncludeWaferDetails)
If IncludeWaferDetails NE True$ then IncludeWaferDetails = False$
ScheduleEventSummary = ''
If SchedDetKeyID NE '' then
SchedDetRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', SchedDetKeyID)
@ -442,10 +442,10 @@ Service GetScheduleEventSummary(SchedDetKeyID, IncludeWaferDetails)
Begin Case
Case BackColor NE ''
// Set in the schedule detail record. Use current color.
Case HotLotFlag
BackColor = 'LightCoral'
Case WOClosedFlag
BackColor = 'LightGray'
Case HotLotFlag
BackColor = 'LightCoral'
Case HardBlock
BackColor = 'LightGoldenRodYellow'
Case BlockOut
@ -807,6 +807,7 @@ Service GetCurrentEvent(ReactNo)
MetricName = 'GetCurrentEvent'
SchedDetKey = ''
ErrorMsg = ''
If ReactNo NE '' then
CurrDTM = Datetime()
Query = 'SELECT SCHED_DET_NG WITH REACT_NO EQ "':ReactNo:'" AND WITH EVENT_COMP NE 1 BY START_DTM'
@ -818,20 +819,22 @@ Service GetCurrentEvent(ReactNo)
ReadNext SchedDetKey else EOF = True$
Response = SchedDetKey
end else
ErrorMsg = 'Error in service ':Service:' module. Error code ':errCode
Error_Services('Add', ErrorMsg)
ErrorMsg = 'Error in service ':Service:' module. Error code ':errCode
end
GoSub ClearCursors
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
end service
Service CurrentEventIsBlock(ReactNo)
StartTick = GetTickCount()
MetricName = 'CurrentEventIsBlock'
ErrorMsg = ''
If ReactNo NE '' then
CurrentSchedDetKey = Schedule_Services('GetCurrentEvent', ReactNo)
@ -847,15 +850,15 @@ Service CurrentEventIsBlock(ReactNo)
end else
Error = Error_Services('GetMessage')
ErrorMsg = 'Error in service ':Service:' module. ':Error
Error_Services('Add', ErrorMsg)
end
end else
ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.'
Error_Services('Add', ErrorMsg)
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
end service
Service GetNextEvent(ReactNo)
@ -863,6 +866,7 @@ Service GetNextEvent(ReactNo)
MetricName = 'GetNextEvent'
SchedDetKey = ''
ErrorMsg = ''
If ReactNo NE '' then
CurrDTM = Datetime()
Query = 'SELECT SCHED_DET_NG WITH REACT_NO EQ "':ReactNo:'" AND WITH EVENT_COMP NE 1 BY START_DTM'
@ -875,25 +879,24 @@ Service GetNextEvent(ReactNo)
ReadNext SchedDetKey else EOF = True$
If EOF EQ True$ then
ErrorMsg = 'Error in service ':Service:' module. No incomplete events in schedule'
Error_Services('Add', ErrorMsg)
end else
ReadNext SchedDetKey else EOF = True$
If EOF EQ True$ then
ErrorMsg = 'Error in service ':Service:' module. No incomplete events in schedule after current event'
Error_Services('Add', ErrorMsg)
end else
Response = SchedDetKey
end
end
end else
ErrorMsg = 'Error in service ':Service:' module. Error code ':errCode
Error_Services('Add', ErrorMsg)
ErrorMsg = 'Error in service ':Service:' module. Error code ':errCode
end
GoSub ClearCursors
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
end service
Service GetEngagedEvent(ReactNo)
@ -947,6 +950,7 @@ Service NextEventIsSamePsn(ReactNo)
MetricName = 'NextEventIsSamePsn'
Response = False$
ErrorMsg = ''
If ReactNo NE '' then
CurrentSchedDetKey = Schedule_Services('GetCurrentEvent', ReactNo)
@ -987,17 +991,19 @@ Service NextEventIsSamePsn(ReactNo)
end
end else
ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.'
Error_Services('Add', ErrorMsg)
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
end service
Service NextEventIsBlock(ReactNo)
StartTick = GetTickCount()
MetricName = 'NextEventIsBlock'
ErrorMsg = ''
If ReactNo NE '' then
NextSchedDetKey = Schedule_Services('GetNextEvent', ReactNo)
@ -1013,15 +1019,15 @@ Service NextEventIsBlock(ReactNo)
end else
Error = Error_Services('GetMessage')
ErrorMsg = 'Error in service ':Service:' module. ':Error
Error_Services('Add', ErrorMsg)
end
end else
ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.'
Error_Services('Add', ErrorMsg)
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
end service
//----------------------------------------------------------------------------------------------------------------------
@ -1240,14 +1246,59 @@ Service AdjustScheduleEvents(ReactNo)
LogData<3> = 'Event quantity: ':EventRec<SCHED_DET_NG.EVENT_TOTAL_WFRS$>
Schedule_Services('LogActivity', ReactNo, LogData)
LogData<3> = 'Event complete: ':OConv(EventRec<SCHED_DET_NG.EVENT_COMP$>, "Btrue,false")
Schedule_Services('LogActivity', ReactNo, LogData)
LogData<3> = 'Event unprocessed cassettes: ':EventRec<SCHED_DET_NG.UNPROCESSED_CASS$>
Schedule_Services('LogActivity', ReactNo, LogData)
LogData<3> = 'Event processed cassettes: ':EventRec<SCHED_DET_NG.PROCESSED_CASS$>
Schedule_Services('LogActivity', ReactNo, LogData)
EventAdjustment = Schedule_Services('GetEventAdjustment', EventKey)
UnprocessedCass = EventRec<SCHED_DET_NG.UNPROCESSED_CASS$>
ProcessedCass = EventRec<SCHED_DET_NG.PROCESSED_CASS$>
AllCassList = SRP_Array('Join', UnprocessedCass, ProcessedCass, 'OR', @VM)
AllCassList = SRP_Array('SortSimpleList', AllCassList, 'AscendingNumbers', @VM)
EventComp = (UnprocessedCass EQ '')
// Check each cassette to see if it was voided
VoidedQty = 0
WONo = EventRec<SCHED_DET_NG.WO_NO$>
EventWfrs = EventRec<SCHED_DET_NG.EVENT_TOTAL_WFRS$>
VoidedCassList = ''
VoidedWfrQty = 0
For each CassNo in AllCassList using @VM
If Epipro then
WmInKey = WoNo:'*1*':CassNo
Voided = Xlate('WM_IN', WmInKey, 'VOID', 'X')
CassQty = Xlate('WM_IN', WmInKey, 'WFR_CNT', 'X')
end else
WOMatKey = WoNo:'*':CassNo
Voided = Xlate('WO_MAT', WOMatKey, 'VOID', 'X')
CassQty = Xlate('WO_MAT', WOMatKey, 'WAFER_QTY', 'X')
end
If Voided then
VoidedCassList<0, -1> = CassNo
VoidedWfrQty += CassQty
end
Next CassNo
UnprocessedCass = SRP_Array('Join', UnprocessedCass, VoidedCassList, 'NOT', @VM)
ProcessedCass = SRP_Array('Join', ProcessedCass, VoidedCassList, 'NOT', @VM)
AllCassList = SRP_Array('Join', AllCassList, VoidedCassList, 'NOT', @VM)
EventWfrs -= VoidedWfrQty
EventRec<SCHED_DET_NG.UNPROCESSED_CASS$> = UnprocessedCass
EventRec<SCHED_DET_NG.PROCESSED_CASS$> = ProcessedCass
EventRec<SCHED_DET_NG.EVENT_TOTAL_WFRS$> = EventWfrs
Database_Services('WriteDataRow', 'SCHED_DET_NG', EventKey, EventRec, True$, False$, True$)
// Check each unprocessed cassette to ensure it does not need to be moved to the processed column
For each CassNo in UnprocessedCass using @VM
Schedule_Services('MarkCassProcessed', WONo, CassNo, Datetime())
Next CassNo
EventRec = Schedule_Services('GetScheduleDetail', EventKey)
UnprocessedCass = EventRec<SCHED_DET_NG.UNPROCESSED_CASS$>
ProcessedCass = EventRec<SCHED_DET_NG.PROCESSED_CASS$>
AllCassList = SRP_Array('Join', UnprocessedCass, ProcessedCass, 'OR', @VM)
AllCassList = SRP_Array('SortSimpleList', AllCassList, 'AscendingNumbers', @VM)
EventAdjustment = Schedule_Services('GetEventAdjustment', EventKey)
EventComp = (UnprocessedCass EQ '')
If Not(EventRec<SCHED_DET_NG.EVENT_COMP$>) and EventComp then
LogData = ''
@ -1258,9 +1309,7 @@ Service AdjustScheduleEvents(ReactNo)
end
EventRec<SCHED_DET_NG.EVENT_COMP$> = EventComp
WONo = EventRec<SCHED_DET_NG.WO_NO$>
ReactNo = EventRec<SCHED_DET_NG.REACT_NO$>
EventWfrs = EventRec<SCHED_DET_NG.EVENT_TOTAL_WFRS$>
WOQty = Xlate('WO_LOG', WONo, 'QTY', 'X')
// If work order event is engaged then set start DTM to first cassette DTM in.
// If previous event end time overlaps (e.g. soft block finished sooner than scheduled)
@ -2251,8 +2300,9 @@ end service
// Saves the event to the database.
//----------------------------------------------------------------------------------------------------------------------
Service AddSchedEvent(ReactorNo, WorkOrderNo, StartDTM, StopDTM, Description, WaferQty)
// Create a unique key ID for the new event
ErrorMsg = ''
NewEventKeyID = RTI_CreateGUID()
NewEventRec = ''
NewEventRec<SCHED_DET_NG.REACT_NO$> = ReactorNo
@ -2262,16 +2312,17 @@ Service AddSchedEvent(ReactorNo, WorkOrderNo, StartDTM, StopDTM, Description, Wa
NewEventRec<SCHED_DET_NG.EVENT_TOTAL_WFRS$> = WaferQty
EpiPro = (Xlate('WO_LOG', WorkOrderNo, 'REACT_TYPE', 'X') EQ 'EPP')
CurrDTM = Datetime()
EventProcCassList = ''
EventUnprocCassList = ''
LastLoadedRDS = ''
LastUnloadedRDS = ''
EventProcCassList = ''
EventUnprocCassList = ''
LastLoadedRDS = ''
LastUnloadedRDS = ''
// Determine start cassette and slot number
PrevSchedQty = Schedule_Services('GetScheduledWfrQty', WorkOrderNo)
StartCass = SRP_Math('CEILING', ( (PrevSchedQty + 1) / 25))
If StartCass EQ 0 then StartCass = 1
PrevSchedQty = Schedule_Services('GetScheduledWfrQty', WorkOrderNo)
VoidedQty = Work_Order_Services('GetVoidedWaferCount', WorkOrderNo)
StartCass = SRP_Math('CEILING', ( (PrevSchedQty + VoidedQty + 1) / 25))
If StartCass EQ 0 then StartCass = 1
StartSlot = Mod(PrevSchedQty, 25) + 1
TotalSchedQty = PrevSchedQty + WaferQty
TotalSchedQty = PrevSchedQty + WaferQty + VoidedQty
StopCass = SRP_Math('CEILING', ( TotalSchedQty / 25 ) )
StopSlot = Mod(TotalSchedQty, 25)
If StopSlot EQ 0 then StopSlot = 25
@ -2279,128 +2330,192 @@ Service AddSchedEvent(ReactorNo, WorkOrderNo, StartDTM, StopDTM, Description, Wa
RDSKeys = ''
If EpiPro then
For CassNo = StartCass to StopCass
WMIKey = WorkOrderNo:'*1*':CassNo
WMIRdsList = Xlate('WM_IN', WMIKey, 'RDS_NO', 'X')
If WMIRdsList NE '' then
Begin Case
Case ( (CassNo EQ StartCass) and (CassNo EQ StopCass) )
StartIndex = StartSlot
StopIndex = StopSlot
Case CassNo EQ StartCass
StartIndex = StartSlot
StopIndex = 25
Case CassNo EQ StopCass
StartIndex = 1
StopIndex = StopSlot
Case Otherwise$
StartIndex = 1
StopIndex = 25
End Case
For SlotIndex = StartIndex to StopIndex
RDSKeys<0, -1> = WMIRdsList<0, SlotIndex>
Next SlotIndex
WMIKey = WorkOrderNo:'*1*':CassNo
If RowExists('WM_IN', WMIKey) then
WMIRec = Database_Services('ReadDataRow', 'WM_IN', WMIKey)
end else
// No RDS keys exist for this cassette yet, so it's unprocessed
EventUnprocCassList<0, -1> = CassNo
// Material not received yet
WMIRec = ''
end
If Error_Services('NoError') then
Voided = WMIRec<WM_IN_VOID$>
If Not(Voided) then
WMIRdsList = WMIRec<WM_IN_RDS_NO$>
If WMIRdsList NE '' then
Begin Case
Case ( (CassNo EQ StartCass) and (CassNo EQ StopCass) )
StartIndex = StartSlot
StopIndex = StopSlot
Case CassNo EQ StartCass
StartIndex = StartSlot
StopIndex = 25
Case CassNo EQ StopCass
StartIndex = 1
StopIndex = StopSlot
Case Otherwise$
StartIndex = 1
StopIndex = 25
End Case
For SlotIndex = StartIndex to StopIndex
RDSKeys<0, -1> = WMIRdsList<0, SlotIndex>
Next SlotIndex
end else
// No RDS keys exist for this cassette yet, so it's unprocessed
EventUnprocCassList<0, -1> = CassNo
end
end
end else
ErrorMsg = Error_Services('GetMessage')
end
Until (ErrorMsg NE '')
Next CassNo
If RDSKeys NE '' then
RDSKeys = SRP_Array('Clean', RDSKeys, 'TrimAndMakeUnique', @VM)
For each RDSKey in RDSKeys using @VM setting vPos
DtmOut = Xlate('RDS', RDSKey, 'DATETIME_OUT', 'X')
WMIKeys = Xlate('RDS', RDSKey, 'WM_IN_KEY', 'X')
For each WMIKey in WMIKeys using @VM
CassNo = Field(WMIKey, '*', 3)
If DtmOut NE '' then
LastUnloadedRDS = RDSKey
Locate CassNo in EventProcCassList using @VM setting Dummy else
EventProcCassList<0, -1> = CassNo
end
If (ErrorMsg EQ '') then
If RDSKeys NE '' then
RDSKeys = SRP_Array('Clean', RDSKeys, 'TrimAndMakeUnique', @VM)
For each RDSKey in RDSKeys using @VM setting vPos
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKey)
If Error_Services('NoError') then
DateOut = RDSRec<RDS_DATE_OUT$>
TimeOut = RDSRec<RDS_TIME_OUT$>
TimeOut = TimeOut/86400
TimeOut = SRP_Math('ROUND', TimeOut, 5)
TimeOut = TimeOut[2, 6]
DtmOut = DateOut:TimeOut
end else
Locate CassNo in EventUnprocCassList using @VM setting Dummy else
EventUnprocCassList<0, -1> = CassNo
end
ErrorMsg = Error_Services('GetMessage')
end
Next WMIKey
Next RDSKey
If (ErrorMsg EQ '' ) then
WMIKeys = Xlate('RDS', RDSKey, 'WM_IN_KEY', 'X')
For each WMIKey in WMIKeys using @VM
CassNo = Field(WMIKey, '*', 3)
If DtmOut NE '' then
LastUnloadedRDS = RDSKey
Locate CassNo in EventProcCassList using @VM setting Dummy else
EventProcCassList<0, -1> = CassNo
end
end else
Locate CassNo in EventUnprocCassList using @VM setting Dummy else
EventUnprocCassList<0, -1> = CassNo
end
end
Next WMIKey
end
Until (ErrorMsg NE '')
Next RDSKey
end
EventUnprocCassList = SRP_Array('SortSimpleList', EventUnprocCassList, 'AscendingNumbers', @VM)
// This line ensures EpiPro cassettes are not recorded as both processed and unprocessed.
EventProcCassList = SRP_Array('Join', EventProcCassList, EventUnprocCassList, 'NOT', @VM)
end
EventUnprocCassList = SRP_Array('SortSimpleList', EventUnprocCassList, 'AscendingNumbers', @VM)
// This line ensures EpiPro cassettes are not recorded as both processed and unprocessed.
EventProcCassList = SRP_Array('Join', EventProcCassList, EventUnprocCassList, 'NOT', @VM)
end else
For CassNo = StartCass to StopCass
WOMatKey = WorkOrderNo:'*':CassNo
RDSKey = Xlate('WO_MAT', WOMatKey, 'RDS_NO', 'X')
DtmOut = Xlate('RDS', RDSKey, 'DATETIME_OUT', 'X')
If DtmOut NE '' then
LastUnloadedRDS = RDSKey
Locate CassNo in EventProcCassList using @VM setting Dummy else
EventProcCassList<0, -1> = CassNo
DtmOut = ''
WOMatKey = WorkOrderNo:'*':CassNo
If RowExists('WO_MAT', WOMatKey) then
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
end else
// Material not received yet
WOMatRec = ''
end
If Error_Services('NoError') then
Voided = WOMatRec<WO_MAT_VOID$>
If Not(Voided) then
RDSKey = WOMatRec<WO_MAT_RDS_NO$>
If (RDSKey NE '') then
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKey)
If Error_Services('NoError') then
DateOut = RDSRec<RDS_DATE_OUT$>
TimeOut = RDSRec<RDS_TIME_OUT$>
TimeOut = TimeOut/86400
TimeOut = SRP_Math('ROUND', TimeOut, 5)
TimeOut = TimeOut[2, 6]
DtmOut = DateOut:TimeOut
end else
ErrorMsg = Error_Services('GetMessage')
end
end
end
end else
Locate CassNo in EventUnprocCassList using @VM setting Dummy else
EventUnprocCassList<0, -1> = CassNo
ErrorMsg = Error_Services('GetMessage')
end
If (ErrorMsg EQ '') then
If (DtmOut NE '') then
LastUnloadedRDS = RDSKey
Locate CassNo in EventProcCassList using @VM setting Dummy else
EventProcCassList<0, -1> = CassNo
end
end else
Locate CassNo in EventUnprocCassList using @VM setting Dummy else
EventUnprocCassList<0, -1> = CassNo
end
end
end
Until (ErrorMsg NE '')
Next CassNo
end
EventComp = (EventUnprocCassList EQ '')
If EventComp then StopDtm = Xlate('RDS', LastUnloadedRDS, 'DATETIME_OUT', 'X')
If (ErrorMsg EQ '') then
// Update event
NewEventRec<SCHED_DET_NG.EVENT_COMP$> = EventComp
NewEventRec<SCHED_DET_NG.PROCESSED_CASS$> = EventProcCassList
NewEventRec<SCHED_DET_NG.UNPROCESSED_CASS$> = EventUnprocCassList
NewEventRec<SCHED_DET_NG.STOP_DTM$> = StopDtm
Database_Services('WriteDataRow', 'SCHED_DET_NG', NewEventKeyID, NewEventRec)
If Error_Services('NoError') then
// Determine where to insert the event in the REACTOR record linked list
// Add the event to the REACTOR record event list
ReactRec = Database_Services('ReadDataRow', 'REACTOR', ReactorNo)
ReactSchedEvents = ReactRec<REACTOR_SCHED_EVENTS$>
CurrNumEvents = DCount(ReactSchedEvents, @VM)
// Add our new event key ID to the reactor event list
NewNumEvents = CurrNumEvents + 1
InsertPos = ''
For EventIndex = 1 to CurrNumEvents Step 1
ThisEventKey = ReactSchedEvents<0, EventIndex>
ThisStartDTM = Xlate('SCHED_DET_NG', ThisEventKey, 'START_DTM', 'X')
IF ThisStartDTM GT StartDTM then
// We found our location
InsertPos = EventIndex
end
Until InsertPos NE ''
Next EventIndex
If InsertPos EQ '' then InsertPos = NewNumEvents
ReactSchedEvents = Insert(ReactSchedEvents, 0, InsertPos, 0, NewEventKeyID)
ReactRec<REACTOR_SCHED_EVENTS$> = ReactSchedEvents
Database_Services('WriteDataRow', 'REACTOR', ReactorNo, ReactRec)
EventComp = (EventUnprocCassList EQ '')
If EventComp then StopDtm = Xlate('RDS', LastUnloadedRDS, 'DATETIME_OUT', 'X')
// Check if there is an overlap with the previous event. If so, then set previous event's stop DTM to this event's
// start DTM.
If NewNumEvents GT 1 then
PrevEventKey = ReactSchedEvents<0, (NewNumEvents - 1)>
If PrevEventKey NE '' then
PrevEventRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', PrevEventKey)
PrevEventStopDTM = PrevEventRec<SCHED_DET_NG.STOP_DTM$>
If PrevEventStopDTM GT StartDTM then
PrevEventStopDTM = StartDTM
PrevEventRec<SCHED_DET_NG.STOP_DTM$> = PrevEventStopDTM
Database_Services('WriteDataRow', 'SCHED_DET_NG', PrevEventKey, PrevEventRec, True$, False$, True$)
// Update event
NewEventRec<SCHED_DET_NG.EVENT_COMP$> = EventComp
NewEventRec<SCHED_DET_NG.PROCESSED_CASS$> = EventProcCassList
NewEventRec<SCHED_DET_NG.UNPROCESSED_CASS$> = EventUnprocCassList
NewEventRec<SCHED_DET_NG.STOP_DTM$> = StopDtm
Database_Services('WriteDataRow', 'SCHED_DET_NG', NewEventKeyID, NewEventRec)
If Error_Services('NoError') then
// Determine where to insert the event in the REACTOR record linked list
// Add the event to the REACTOR record event list
ReactRec = Database_Services('ReadDataRow', 'REACTOR', ReactorNo)
ReactSchedEvents = ReactRec<REACTOR_SCHED_EVENTS$>
CurrNumEvents = DCount(ReactSchedEvents, @VM)
// Add our new event key ID to the reactor event list
NewNumEvents = CurrNumEvents + 1
InsertPos = ''
For EventIndex = 1 to CurrNumEvents Step 1
ThisEventKey = ReactSchedEvents<0, EventIndex>
ThisStartDTM = Xlate('SCHED_DET_NG', ThisEventKey, 'START_DTM', 'X')
IF ThisStartDTM GT StartDTM then
// We found our location
InsertPos = EventIndex
end
Until InsertPos NE ''
Next EventIndex
If InsertPos EQ '' then InsertPos = NewNumEvents
ReactSchedEvents = Insert(ReactSchedEvents, 0, InsertPos, 0, NewEventKeyID)
ReactRec<REACTOR_SCHED_EVENTS$> = ReactSchedEvents
Database_Services('WriteDataRow', 'REACTOR', ReactorNo, ReactRec)
// Check if there is an overlap with the previous event. If so, then set previous event's stop DTM to this event's
// start DTM.
If NewNumEvents GT 1 then
PrevEventKey = ReactSchedEvents<0, (NewNumEvents - 1)>
If PrevEventKey NE '' then
PrevEventRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', PrevEventKey)
PrevEventStopDTM = PrevEventRec<SCHED_DET_NG.STOP_DTM$>
If PrevEventStopDTM GT StartDTM then
PrevEventStopDTM = StartDTM
PrevEventRec<SCHED_DET_NG.STOP_DTM$> = PrevEventStopDTM
Database_Services('WriteDataRow', 'SCHED_DET_NG', PrevEventKey, PrevEventRec, True$, False$, True$)
end
end
end
// Record schedule change in SCHED_HIST table
Schedule_Services('AddSchedHist', NewEventKeyID, ReactorNo, 'ADD', @User4)
Response = NewEventKeyID
end
// Record schedule change in SCHED_HIST table
Schedule_Services('AddSchedHist', NewEventKeyID, ReactorNo, 'ADD', @User4)
Response = NewEventKeyID
end
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
end service
@ -3147,7 +3262,7 @@ end service
Service MarkCassProcessed(WONo, CassNo, ProcessedDTM)
If ((WONo NE '') and (CassNo NE '') and (ProcessedDTM NE '') ) then
If Num(ProcessedDTM) then ProcessedDTM = OConv(ProcessedDTM, 'DT2/^H')
// Find the SCHED_DET_NG event record that contains the cassette number
@ -3195,19 +3310,33 @@ Service MarkCassProcessed(WONo, CassNo, ProcessedDTM)
CassComp = True$
end
end else
CassComp = True$
WOMatKey = WoNo:'*':CassNo
CurrWaferCount = obj_WO_Mat('CurrWaferCnt', WOMatKey)
RDSNo = Xlate('WO_MAT', WOMatKey, 'RDS_NO', 'X')
DateOut = Xlate('RDS', RDSNo, 'DATE_OUT', 'X')
CassComp = ( (CurrWaferCount EQ 0) or (DateOut NE '') )
end
UnprocessedCassettes = SchedDetNGRec<SCHED_DET_NG.UNPROCESSED_CASS$>
If CassComp then
RecChanged = False$
UnprocessedCassettes = SchedDetNGRec<SCHED_DET_NG.UNPROCESSED_CASS$>
Locate CassNo in UnprocessedCassettes using @VM setting vPos then
UnprocessedCassettes = Delete(UnprocessedCassettes, 0, vPos, 0)
ProcessedCassettes = SchedDetNGRec<SCHED_DET_NG.PROCESSED_CASS$>
ProcessedCassettes<0, -1> = CassNo
UnprocessedCassettes = Delete(UnprocessedCassettes, 0, vPos, 0)
RecChanged = True$
end
ProcessedCassettes = SchedDetNGRec<SCHED_DET_NG.PROCESSED_CASS$>
Locate CassNo in ProcessedCassettes using @VM setting vPos else
ProcessedCassettes<0, -1> = CassNo
ProcessedCassettes = SRP_Array('Clean', ProcessedCassettes, 'TrimAndMakeUnique', @VM)
ProcessedCassettes = SRP_Array('SortSimpleList', ProcessedCassettes, 'AscendingNumbers', @VM)
RecChanged = True$
end
If RecChanged then
SchedDetNGRec<SCHED_DET_NG.UNPROCESSED_CASS$> = UnprocessedCassettes
SchedDetNGRec<SCHED_DET_NG.PROCESSED_CASS$> = ProcessedCassettes
Database_Services('WriteDataRow', 'SCHED_DET_NG', SchedDetNGKey, SchedDetNGRec, True$, False$, True$)
Done = True$
end
Done = True$
end
Until Done EQ True$
Repeat
@ -3596,5 +3725,3 @@ CreateScheduleChangeNotification:
return

View File

@ -0,0 +1,159 @@
Function Semi_vend_code_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 : Semi_vend_code_API
Description : API logic for the Semi_vend_code 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 Semi_vend_code[.ID.[<Property>]]
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
Examples:
- Semi_vend_code.POST
- Semi_vend_code.ID.PUT
- Semi_vend_code.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)
09/12/25 djs Original programmer.
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
$Insert APP_INSERTS
$Insert API_SETUP
$Insert HTTP_INSERTS
$Insert SEMI_VEND_CODE_EQUATES
Declare function Semi_Vend_Code_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 semi_vend_code.HEAD
API semi_vend_code.GET
GoSub CreateHALCollection
end api
API semi_vend_code.ID.HEAD
API semi_vend_code.ID.GET
GoSub CreateHALItem
end api
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CreateHALItem:
ResponseCode = 200
SemiVendCd = EndpointSegment
IF RowExists('SEMI_VEND_CODE', SemiVendCd) then
JSON = Semi_Vend_Code_Services('ConvertRecordToJSON', SemiVendCd)
If Error_Services('NoError') then
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
HTTP_Services('SetResponseBody', JSON, False$, 'application/hal+json')
If Assigned(Message) then
HTTP_Services('SetResponseStatus', ResponseCode, Message)
end else
HTTP_Services('SetResponseStatus', ResponseCode)
end
end else
Message = Error_Services('GetMessage')
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
end
end else
ResponseCode = 406
ResponseMessage = 'No WO found based on the search criteria provided.'
HTTP_Services('SetResponseStatus', ResponseCode, ResponseMessage)
end
return
//----------------------------------------------------------------------------------------------------------------------
// CreateHALCollection
//
// Creates a HAL+JSON collection based on OpenInsight data row representations.
//----------------------------------------------------------------------------------------------------------------------
CreateHALCollection:
StatusCode = 200
JSONCollection = ''
Abort = False$
SemiVendCodes = Semi_Vend_Code_Services('GetSemiVendCodes')
If Error_Services('NoError') then
If SemiVendCodes NE '' then
If SRP_JSON(hJSONCollection, 'New', 'Object') then
If SRP_Json(hSemiArray, 'New', 'Array') then
For each SemiVendCode in SemiVendCodes using @FM
SemiJson = Semi_Vend_Code_Services('ConvertRecordToJSON', SemiVendCode)
If (SRP_Json(hSemi, 'Parse', SemiJson) EQ '') then
hTemp = SRP_Json(hSemi, 'Get', 'SemiVendCode')
SRP_Json(hSemiArray, 'Add', hTemp)
SRP_Json(hTemp, 'Release')
SRP_Json(hSemi, 'Release')
end
Next SemiVendCode
end
SRP_Json(hJSONCollection, 'Set', 'SemiVendCodes', hSemiArray)
SRP_Json(hSemiArray, 'Release')
JSONCollection = SRP_JSON(hJSONCollection, 'Stringify', 'Fast')
SRP_JSON(hJSONCollection, 'Release')
end
end else
Message = 'No Semi Vend Codes found!'
end
end else
Message = Error_Services('GetMessage')
StatusCode = 500
end
If Error_Services('NoError') then
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
HTTP_Services('SetResponseBody', JSONCollection, 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
return

View File

@ -0,0 +1,124 @@
Function Semi_Vend_Code_Services(@Service, @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 Technologies.
Name : Semi_Vend_Code_Services
Description : Handler program for all module related services.
Notes : The generic parameters should contain all the necessary information to process the services. Often
this will be information like the data Record and Key ID.
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)
09/12/2025 djs Created service module for OI Wizard Receive and Release operations.
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
$Insert APP_INSERTS
$Insert SERVICE_SETUP
$Insert SEMI_VEND_CODE_EQUATES
Declare function Database_Services, SRP_Json
Declare subroutine Error_Services, SRP_Json
GoToService else
Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
end
Return Response else ''
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Service Parameter Options
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Options BOOLEAN = True$, False$
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Services
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------------------------
// GetSemiVendCodes
//
// Returns an @FM delimited array of all SEMI_VEND_CD keys in the table.
//----------------------------------------------------------------------------------------------------------------------
Service GetSemiVendCodes()
ErrorMsg = ''
SemiVendCodes = ''
Open 'SEMI_VEND_CODE' to hTable then
Select hTable
EOF = False$
SemiVendCodes = ''
Loop
Readnext KeyId else EOF = True$
Until EOF
SemiVendCodes<-1> = KeyId
Repeat
end else
ErrorMsg = 'Error in ':Service:' service. Error opening SEMI_VEND_CODE table.'
end
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
Response = SemiVendCodes
end service
Service ConvertRecordToJSON(KeyId, Record)
ErrorMsg = ''
JsonRecord = ''
If KeyId NE '' then
If Record EQ '' then Record = Database_Services('ReadDataRow', 'SEMI_VEND_CODE', KeyId)
If Error_Services('NoError') then
// Create the JSON response object
objJSON = ''
If SRP_JSON(objJSON, 'New', 'Object') then
objSemiVendCode = ''
If SRP_JSON(objSemiVendCode, 'New', 'Object') then
SRP_JSON(objSemiVendCode, 'SetValue', 'VendCd', KeyId)
SRP_JSON(objSemiVendCode, 'SetValue', 'VendorName', Record<SEMI_VEND_CODE_VENDOR_NAME$>)
SRP_JSON(objSemiVendCode, 'SetValue', 'Location', Record<SEMI_VEND_CODE_LOCATION$>)
SRP_JSON(objSemiVendCode, 'SetValue', 'EpiVendCd', Record<SEMI_VEND_CODE_EPI_VEND_CD$>)
SRP_JSON(objJSON, 'Set', 'SemiVendCode', objSemiVendCode)
SRP_JSON(objSemiVendCode, 'Release')
end
jsonRecord = SRP_JSON(objJSON, 'Stringify', 'Styled')
SRP_JSON(objJSON, 'Release')
end else
ErrorMsg = 'Error in ':Service:' service. Unable to create JSON object'
end
end else
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
end
end else
ErrorMsg = 'Error in ':Service:' service. Null KeyId passed into service.'
end
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
Response = JsonRecord
end service
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ClearCursors:
For counter = 0 to 8
ClearSelect counter
Next counter
return

View File

@ -456,6 +456,7 @@ Service AcknowledgeSupplement(SupplID, EntryUser)
StartTick = GetTickCount()
MetricName = 'AcknowledgeSupplement'
ErrMsg = ''
If ( (SupplID NE '') and (EntryUser NE '') ) then
OldRec = Xlate('SUPPLEMENTS', SupplID, '', 'X', '')
If OldRec NE '' then
@ -469,19 +470,21 @@ Service AcknowledgeSupplement(SupplID, EntryUser)
Supplement_Services('LogSupplementChange', NewRec, 'Acknowledged', EntryUser)
end else
Response = FALSE$
Error_Services('Add', 'Error editing Supplement record.')
ErrMsg = 'Error editing Supplement record.'
end
end else
Response = FALSE$
Error_Services('Add', 'Record does not exist.')
ErrMsg = 'Record does not exist.'
end
end else
Response = FALSE$
Error_Services('Add', 'SupplID or EntryUser was missing in the ' : Service : ' service.')
ErrMsg = 'SupplID or EntryUser was missing in the ' : Service : ' service.'
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
If ErrMsg NE '' then Error_Services('Add', ErrMsg)
end service
@ -501,6 +504,7 @@ Service UnacknowledgedSupplementCheck(LotType=LOTTYPES, LotID, Stage=STAGES)
UnackList = ''
Response = False$
ErrMsg = ''
If ( (LotType NE '') and (LotID NE '') and (Stage NE '') ) then
KeyList = ''
Query = ''
@ -518,23 +522,25 @@ Service UnacknowledgedSupplementCheck(LotType=LOTTYPES, LotID, Stage=STAGES)
If AckField NE True$ then UnackList<-1> = Key
Next Key
end else
Error_Services('Add', 'Error in ':Service:' service. Error opening SUPPLEMENTS table.')
ErrMsg = 'Error in ':Service:' service. Error opening SUPPLEMENTS table.'
end
end
end else
Error_Services('Add', 'Error in ':Service:' service. Error calling Btree.Extract')
ErrMsg = 'Error in ':Service:' service. Error calling Btree.Extract'
end
end else
Error_Services('Add', 'Error in ':Service:' service. Error opening SUPPLEMENTS dictionary.')
ErrMsg = 'Error in ':Service:' service. Error opening SUPPLEMENTS dictionary.'
end
end else
Error_Services('Add', 'LotType, LotID, or Stage was missing in the ' : Service : ' service.')
ErrMsg = 'LotType, LotID, or Stage was missing in the ' : Service : ' service.'
end
If UnackList NE '' then Response = UnackList
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
If ErrMsg NE '' then Error_Services('Add', ErrMsg)
end service
@ -552,6 +558,7 @@ Service LogSupplementChange(SupplementRec, EditEvent, EntryUser)
StartTick = GetTickCount()
MetricName = 'LogSupplementChange'
ErrMsg = ''
If ( (SupplementRec NE '') and (EditEvent NE '') and (EntryUser NE '') ) then
SupplementText = SupplementRec<SUPPLEMENTS_SUPPL_TEXT$>
LotType = SupplementRec<SUPPLEMENTS_LOT_TYPE$>
@ -565,11 +572,13 @@ Service LogSupplementChange(SupplementRec, EditEvent, EntryUser)
End Case
end else
Error_Services('Add', 'LotType, LotID, or Stage was missing in the ' : Service : ' service.')
ErrMsg = 'LotType, LotID, or Stage was missing in the ' : Service : ' service.'
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
If ErrMsg NE '' then Error_Services('Add', ErrMsg)
end service
@ -670,3 +679,4 @@ Service SendNotifications(RDSList, EditEvent, Instructions, EntryUser)
end service

View File

@ -0,0 +1,40 @@
Compile function Test_PSN_Services(@Test)
#pragma precomp SRP_PreCompiler
$Insert LOGICAL
Declare function PSN_Services, Error_Services
Declare subroutine PSN_Services, Error_Services
Error_Services('Clear')
GotoTest
// TODO: Code to run after each test goes here
Return TestResult or 1
//-----------------------------------------------------------------------------
// TESTS
//-----------------------------------------------------------------------------
Test GetMetrologyRecipesAndPatternsWithNullPsnNoShouldThrowError
PSN_Services('GetMetrologyRecipesAndPatterns', '')
Assert Error_Services('HasError') equals True$
end test
Test GetMetrologyRecipesAndPatternsWithInvalidPsnNoShouldThrowError
PSN_Services('GetMetrologyRecipesAndPatterns', 'potato')
Assert Error_Services('HasError') equals True$
end test
Test GetMetrologyRecipesAndPatternsWithValidPsnNoShouldReturnPrescribedValues
Values = PSN_Services('GetMetrologyRecipesAndPatterns', 4609)
Assert DCount(Values, @FM) equals 9
Values = PSN_Services('GetMetrologyRecipesAndPatterns', 5159)
Assert DCount(Values, @FM) equals 7
Values = PSN_Services('GetMetrologyRecipesAndPatterns', 4830)
Assert DCount(Values, @FM) equals 9
end test

View File

@ -2,6 +2,7 @@ Compile function TEST_RUN_Services(@Service, @Params)
#pragma precomp SRP_PreCompiler
$insert LOGICAL
$Insert APP_INSERTS
$Insert SERVICE_SETUP
$Insert TEST_WAFER_PROD_EQUATES
$Insert TEST_WAFER_TYPES_DISPO_OPTIONS_EQUATES
$Insert TEST_RUN_EQUATES
@ -10,7 +11,7 @@ $Insert TEST_RUN_OBJ_EQUATES
$Insert LOT_EQUATES
$Insert LOT_OPERATION_EQUATES
Declare function Nextkey, Error_Services, Environment_Services, OConv, Logging_Services, SRP_Hashtable, Lot_Services, GetTickCount
Declare function Nextkey, Error_Services, Environment_Services, OConv, Logging_Services, SRP_Hashtable, Lot_Services, GetTickCount, Xlate
Declare function SRP_Datetime, Database_Services, Test_Run_Services, File_Services, Status, delete, Insert, Datetime, SRP_Json, MemberOf
Declare subroutine Database_Services, Btree.Extract, Error_Services, Logging_Services, Rlist, Test_Run_Services, Lot_Services, SRP_Json
Declare subroutine Mona_Services
@ -331,6 +332,71 @@ Service GetTestWaferLots(ShowOnlyOpenLots)
Response = TestWaferLotKeys
end service
Service GetTestRunsByUsername(Username, StartDTM, StopDTM)
If Username NE '' then
Begin Case
Case StartDTM EQ '' AND StopDTM EQ ''
//Set search date for last 12 hour period
StopDTM = SRP_Datetime('Now')
StartDTM = SRP_Datetime('AddHours', StopDTM, -12)
Case StartDTM EQ '' AND StopDTM NE ''
//Set search start date 12 hours prior to stopDTM
StartDTM = SRP_Datetime('AddHours', StopDTM, -12)
Case StartDTM NE '' AND StopDTM EQ ''
//Set search start date to current dtm
StopDTM = SRP_Datetime('Now')
End Case
table = "TEST_RUN"
Open "DICT ":table To hTestRunDict Else
Error_Services('Add', 'Error opening TEST_RUN dictionary')
End
If Error_Services('NoError') then
srch_strng = "RUN_DTM":@VM:StartDTM:'~':StopDTM:@FM: "LSL_USER_ID":@VM:UserName:@FM
keylist = ""
option = ""
flag = ""
Btree.Extract(srch_strng, table, hTestRunDict, keylist, option, flag)
Swap @VM with @FM in keylist
Response = keylist
end
end else
Error_Services('Add', 'Username missing.')
end
end service
Service GetTestWaferUsageStats(Username, StartDTM, StopDTM)
MostRecentDTM = ''
WafersUsed = 0
If Username NE '' then
KeyList = Test_Run_Services('GetTestRunsByUsername', Username, StartDTM, StopDTM)
If KeyList NE '' then
For Each Key in KeyList
TestRunRec = Xlate('TEST_RUN', Key, '', 'X')
If MostRecentDTM EQ '' then
MostRecentDTM = TestRunRec<TEST_RUN_RUN_DTM$>
end else
If MostRecentDTM LT TestRunRec<TEST_RUN_RUN_DTM$> then
MostRecentDTM = TestRunRec<TEST_RUN_RUN_DTM$>
end
end
WaferQty = Dcount(TestRunRec<TEST_RUN_TEST_RUN_WAFER_IDS$>, @VM)
WafersUsed += WaferQty
Next Key
end
Response = ''
Response<1> = MostRecentDTM
Response<2> = WafersUsed
end else
Error_Services('Add', 'Username missing.')
end
end service
Service CreateTestRunRecord(RunTypeID, EqpType, EqpID, PSNo, RDSNo, UserID, TWLotIds, TWLotQtys, ManualQtyAdjust)
StartTick = GetTickCount()
@ -688,6 +754,7 @@ Service GetTestWaferUsageByDateSpan(StartDtm, StopDtm)
end service
Service GetTestRunKeysByDateSpan(StartDtm, StopDtm)
Begin Case
Case StartDTM EQ '' AND StopDTM EQ ''
//Set search date for last 24 hour period
@ -714,8 +781,6 @@ Service GetTestRunKeysByDateSpan(StartDtm, StopDtm)
Response = keylist
end
end service
Service GetTestRunKeysByEqp(EquipType, EquipID)
@ -820,13 +885,3 @@ Service IsNewTWSystemActive(UserId)
end service

View File

@ -27,6 +27,8 @@ Service GetNumberOfPointsForPattern(ToolClass, PatternName)
end
end
Convert @LOWER_CASE to @UPPER_CASE in ToolClass
If Error_Services('NoError') then
ToolClassRecord = Database_Services('ReadDataRow', 'TOOL_CLASS', ToolClass)
If Error_Services('HasError') then
@ -48,3 +50,4 @@ Service GetNumberOfPointsForPattern(ToolClass, PatternName)
end
end
End Service

View File

@ -381,5 +381,3 @@ API wafercounter.ID.GET
HTTP_Services('SetResponseStatus', ResponseCode, ErrorMessage)
end api

View File

@ -0,0 +1,116 @@
Compile function WEB_OI_WIZARD_EVENTS(CtrlEntId, Event, @PARAMS)
#pragma precomp SRP_PreCompiler
#window WEB_OI_WIZARD
$Insert EVENT_SETUP
$Insert APP_INSERTS
$Insert PS_WebView_Equates
EQU ONE_DAY_SECS$ to 84600
Declare function OI_Wizard_Services, Exec_Method, Environment_Services
Declare subroutine PlaceDialog
GoToEvent Event for CtrlEntId else
// Event not implemented
end
Return EventFlow or 1
//-----------------------------------------------------------------------------
// EVENT HANDLERS
//-----------------------------------------------------------------------------
Event WINDOW.CREATE(CreateParam)
OIWizardBaseUrl = Environment_Services('GetOIWizardBaseUrl')
Set_Property(@Window, '@BASE_URL', OIWizardBaseUrl)
InitNavPage = CreateParam
Set_Property(@Window, '@INIT_NAV_PAGE', InitNavPage)
Set_Property(@Window, '@FIRST_RENDER', True$)
Set_Property(@Window:'.WEBVIEW_MAIN', 'AUTOSIZEHEIGHT', True$)
Set_Property(@Window:'.WEBVIEW_MAIN', 'AUTOSIZEWIDTH', True$)
ScreenSize = Get_Property('SYSTEM', 'SIZE')
ClientWidth = ScreenSize<3>
ClientHeight = ScreenSize<4>
FormSize = Get_Property(@Window, 'SIZE')
FormWidth = Int(ClientWidth * (3/4))
FormHeight = Int(ClientHeight * (3/4))
FormSize<1> = Int( (ClientWidth - FormWidth ) / 2 )
FormSize<2> = Int( (ClientHeight - FormHeight ) / 2 )
FormSize<3> = FormWidth
FormSize<4> = FormHeight
FormSize<5> = True$
Set_Property(@Window, 'SIZE', FormSize)
End Event
Event WEBVIEW_MAIN.WEBVIEWCREATED()
OIWizardURL = Get_Property(@Window, '@BASE_URL')
NavPage = Get_Property(@Window, '@INIT_NAV_PAGE')
NavTo = OIWizardURL:NavPage
SuccessFlag = Exec_Method( CtrlEntID, "NAVIGATE", NavTo)
If Not(SuccessFlag) then
Msg(@Window, '', 'OK', '', 'Application Error':@FM:'Error navigating to ':NavTo)
end
end event
Event WEBVIEW_MAIN.WEBNAVIGATED(NavID, URI, Redirected, UserInitiated, StatusInfo, FrameID)
FirstRender = Get_Property(@Window, '@FIRST_RENDER')
If FirstRender then
SuccessFlag = Exec_Method(CtrlEntID, "DELETECOOKIES", '*')
If SuccessFlag then
LSLUserId = @User4
OIWizardID = OI_Wizard_Services('CreateWizardID', LSLUserID)
If Error_Services('NoError') then
Expiry = Xlate('OI_WIZARD', OIWizardID, 'EXPIRY', 'X')
Domain = Get_Property(@Window, '@BASE_URL')
Swap 'http://' with '' in Domain
Swap 'https://' with '' in Domain
PortIndex = Index(Domain, ':', 1)
If PortIndex then Domain = Domain[1, PortIndex - 1]
Cookie = ""
Cookie<0, WBV_COOKIE_POS_NAME$> = "sessionID"
Cookie<0, WBV_COOKIE_POS_VALUE$> = OIWizardID
Cookie<0, WBV_COOKIE_POS_DOMAIN$> = Domain
Cookie<0, WBV_COOKIE_POS_EXPIRES$> = Expiry
SuccessFlag = Exec_Method( CtrlEntID, "SETCOOKIE", Cookie )
If SuccessFlag then
Cookies = Exec_Method( CtrlEntID, "GETCOOKIES")
Cookie<0, WBV_COOKIE_POS_NAME$> = "userID"
Cookie<0, WBV_COOKIE_POS_VALUE$> = LSLUserID
Cookie<0, WBV_COOKIE_POS_DOMAIN$> = Domain
Cookie<0, WBV_COOKIE_POS_EXPIRES$> = Expiry
SuccessFlag = Exec_Method( CtrlEntID, "SETCOOKIE", Cookie )
If SuccessFlag then
// Set a timer to execute our session service javascript hook once the page is ready
Set_Property(@Window, "TIMER", 0:@FM:1000)
Set_Property(@Window, '@FIRST_RENDER', False$)
end else
Msg(@Window, '', 'OK', '', 'Application Error':@FM:'Error setting userID cookie')
end
end else
Msg(@Window, '', 'OK', '', 'Application Error':@FM:'Error setting sessionID cookie')
end
end else
Msg(@Window, '', 'OK', '', 'Application Error':@FM:'Error creating OI Wizard session')
end
end else
Msg(@Window, '', 'OK', '', 'Application Error':@FM:'Error deleting cookies')
end
end
end event
Event WINDOW.TIMER()
Response = Exec_Method(@Window:'.WEBVIEW_MAIN', 'EXECUTESCRIPT', 'SessionServiceHelper.SetSessionFromCookies()')
end event

132
LSL2/STPROC/WM_IN_API.txt Normal file
View File

@ -0,0 +1,132 @@
Function WM_IN_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 : WM_IN_Api
Description : API logic for the WM_IN 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 Rds[.ID.[<Property>]]
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
Examples:
- Rds.POST
- Rds.ID.PUT
- Rds.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)
09/27/22 xxx Original programmer.
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
$insert APP_INSERTS
$insert API_SETUP
$insert HTTP_INSERTS
Declare function WM_In_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 wm_in.ID.HEAD
API wm_in.ID.GET
GoSub CreateHALItem
end api
API wm_in.ID.zpl.HEAD
API wm_in.ID.zpl.GET
GoSub CreateZPLItem
end api
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------------------------
// CreateHALItem
//
// Creates a HAL+JSON object based on the OpenInsight data row representation of the scan.
//----------------------------------------------------------------------------------------------------------------------
CreateHALItem:
WMInKey = EndpointSegment
Convert '-' to '*' in WMInKey
WmInJson = WM_In_Services('ConvertRecordToJSON', WMInKey, '', FullEndpointURL)
If Error_Services('NoError') then
StatusCode = 200
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
HTTP_Services('SetResponseBody', WmInJson, 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
return
//----------------------------------------------------------------------------------------------------------------------
// CreateZPLItem
//
// Creates a HAL+JSON object with the ZPL for the given WM_IN row
//----------------------------------------------------------------------------------------------------------------------
CreateZPLItem:
WmInKey = ParentSegment
ZplJson = ''
ZPL = Wm_In_Services('GetWmInZpl', WmInKey)
If Error_Services('NoError') then
StatusCode = 200
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
HTTP_Services('SetResponseBody', ZPL, False$, 'text/plain')
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
return

View File

@ -46,23 +46,48 @@ Compile function WM_IN_Services(@Service, @Params)
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
$insert LOGICAL
$Insert SERVICE_SETUP
$Insert SERVICE_SETUP
$insert APP_INSERTS
$Insert UNIT_EQUATES
$Insert MSG_EQUATES
$Insert DICT_EQUATES
$Insert WM_IN_EQUATES
$Insert WO_LOG_EQUATES
$Insert PROD_SPEC_EQUATES
$Insert WO_MAT_EQUATES
$Insert CUST_EPI_PART_EQUATES
$Insert QUOTE_SPEC_EQU
$Insert WO_STEP_EQUATES
EQU PI$LEFT TO 1
EQU PI$TOP TO 2
EQU PI$RIGHT TO 3
EQU PI$BOTTOM TO 4
EQU PI$WIDTH TO 5
EQU PI$HEIGHT TO 6
EQU PI$SIZE TO 7
EQU PS$TOOL TO 1
EQU PS$TYPE TO 2
EQU PS$RECIPE TO 3
EQU PS$FREQ TO 4
EQU PS$PATTERN TO 11
Declare function PSN_Services, SRP_Rotate_Array, Datetime, Database_Services, Environment_Services, Logging_Services
Declare subroutine Database_Services, Set_Status, obj_Wo_Mat_Log, Logging_Services, Extract_Si_Keys
Declare function obj_Install, SRP_Json
Declare subroutine Database_Services, Set_Status, obj_Wo_Mat_Log, Logging_Services, Extract_Si_Keys, Btree.Extract
Declare subroutine SRP_Json
GoToService
GoToService else
Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
end
Return Response or ""
Return Response else ''
//-----------------------------------------------------------------------------
// SERVICES
//-----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Services
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------------------------
@ -76,15 +101,13 @@ Return Response or ""
Service GetComments(WMINNo)
CommentArray = ''
WMInRow = Database_Services('ReadDataRow', 'WM_IN', WMInNo)
WMInRow = Database_Services('ReadDataRow', 'WM_IN', WMInNo)
CommentDates = Oconv(WMInRow<WM_IN_EPP_COMMENT_DATE$>, 'DT')
CommentUsers = WMInRow<WM_IN_EPP_COMMENT_USER$>
Comments = WMInRow<WM_IN_EPP_COMMENT_NOTE$>
CommentList = CommentDates :@FM: CommentUsers :@FM: Comments
Comments = WMInRow<WM_IN_EPP_COMMENT_NOTE$>
CommentList = CommentDates :@FM: CommentUsers :@FM: Comments
CommentArray = SRP_Rotate_Array(CommentList)
Response = CommentArray
Response = CommentArray
End Service
@ -368,3 +391,557 @@ Service VerifyWOMatWMIKeyIndex(WMIKey)
end service
Service GetWMInKeys(WOLogId)
ErrorMsg = ''
WMInKeys = ''
If WOLogId NE '' then
Open 'DICT.WM_IN' to hWmInDict then
SearchString = ''
SearchString := 'WO_NO':@VM:WOLogId:@FM
Btree.Extract(SearchString, 'WM_IN', hWmInDict, WMInKeys, 0, 0)
end else
ErrorMsg = 'Error opening WM_IN dictionary.'
end
end else
ErrorMsg = 'WOLogId was null'
end
If ErrorMsg NE '' then
Error_Services('Add', ErrorMsg)
end
Response = WMInKeys
end service
Service GetWmInZpl(WmInKey)
ZPL = ''
ErrorMsg = ''
If WmInKey NE '' then
Swap '-' with '*' in WmInKey
Swap '.' with '*' in WmInKey
If RowExists('WM_IN', WmInKey) then
WONo = Field(WmInKey, '*', 1, 1)
WOStep = Field(WmInKey, '*', 2, 1)
WOStepKeys = XLATE('WO_LOG',WONo,WO_LOG_WO_STEP_KEY$,'X')
IF INDEX(WOStepKeys,@VM,1) THEN
PrintWONo = WONo:'.':WOStep
END ELSE
PrintWONo = WONo
END
WORec = XLATE('WO_LOG',WONo,'','X')
ReqShipDate = OCONV(WORec<WO_LOG_PROMISE_SHIP_DT$>,'D2/')
CustNo = WORec<WO_LOG_CUST_NO$>
CustName = XLATE('COMPANY',CustNo,'ABBREV_OR_CO_NAME','X')
Captive = XLATE('COMPANY',CustNo,'CAPTIVE','X')
PONo = WORec<WO_LOG_CUST_PO_NO$>
PSNo = XLATE('WO_STEP',WONo:'*':WOStep,WO_STEP_PROD_SPEC_ID$,'X')
PSRec = XLATE('PROD_SPEC',PSNo,'','X')
CustSpecNo = ''
IF Captive THEN
CustSpecNos = PSRec<PROD_SPEC_SPEC_NUM$>
CustSpecDescs = PSRec<PROD_SPEC_SPEC_DESC$>
CustSpecRevNos = PSRec<PROD_SPEC_REV_NUM$>
CustSpecRevDts = PSRec<PROD_SPEC_REV_DATE$>
SpecCnt = COUNT(CustSpecNos,@VM) + (CustSpecNos NE '')
FOR I = 1 TO SpecCnt
IF CustSpecDescs<1,I> _EQC 'GENERAL' THEN
CustSpecNo = CustSpecNos<1,I>
CustSpecDesc = CustSpecDescS<1,I>
CustSpecRevNo = CustSpecRevNos<1,I>
CustSpecRevDt = OCONV(CustSpecRevDts<1,I>,'D4/')
END
UNTIL CustSpecNo NE ''
NEXT I
END
EpiPartNo = WORec<WO_LOG_EPI_PART_NO$>
CustEpiPartRec = XLATE('CUST_EPI_PART',CustNo:'*':EpiPartNo,'','X')
ShipBagReq = CustEpiPartRec<CUST_EPI_PART_SHIP_BAG_REQ$>
PreSurfscan = PSRec<PROD_SPEC_PRE_SURFSCAN$>
FirstSurfscan = PSRec<PROD_SPEC_FIRST_SURFSCAN$>
PostCleanSurfScan = PSRec<PROD_SPEC_POST_CLEAN_SURFSCAN$>
SubPreClean = XLATE( 'PROD_SPEC', PSNo, 'SUB_PRE_CLEAN', 'X' )
SubPostClean = XLATE( 'PROD_SPEC', PSNo, 'SUB_POST_CLEAN', 'X' )
PreCleanTool = SubPreClean ;* Temporary for 2x4 -> 4x4 conversion
PostCleanTool = SubPostClean
PreAkrionRecipe = XLATE( 'PROD_SPEC', PSNo, 'PRE_AKRION_RECIPE', 'X' )
PostAkrionRecipe = XLATE( 'PROD_SPEC', PSNo, 'POST_AKRION_RECIPE', 'X' )
RecipeNo = XLATE( 'PROD_SPEC', PSNo, 'RECIPE_NO_L1', 'X' )
RecipeName = XLATE( 'PROD_SPEC', PSNo, 'RECIPE_NAME_L1', 'X' )
SpecType = OCONV( XLATE( 'PROD_SPEC', PSNo, 'SPEC_TYPE', 'X' ), '[SPEC_TYPE_CONV]' )
SubOxide = OCONV( XLATE( 'PROD_SPEC', PSNo, 'SUB_OXIDE_STRIP', 'X' ), 'B' )
ThickTarget = OCONV( XLATE( 'PROD_SPEC', PSNo, 'THICK_TARGET_ALL', 'X' ), 'MD3' )
ResTarget = OCONV( XLATE( 'PROD_SPEC', PSNo, 'RES_TARGET_ALL', 'X' ), 'MD3' )
ThickUnit = XLATE( 'PROD_SPEC', PSNo, 'THICK_UNITS_ALL', 'X' )
ResUnit = XLATE( 'PROD_SPEC', PSNo , 'RES_UNITS_ALL', 'X' )
Dopant = XLATE( 'PROD_SPEC', PSNo, 'DOPANT_L1', 'X' )
RecipeNo = XLATE( 'PROD_SPEC', PSNo, 'RECIPE_NO', 'X' )
RecipeInfo = XLATE( 'RECIPE', RecipeNo, 'RECIPE_NAME_NO', 'X' )
CleaningReqs = ''
ThickCnt = FIELDCOUNT( ThickTarget<1>, @VM )
PrintThickTargets = ''
FOR J = 1 TO ThickCnt
PrintThickTargets<1,J> = ThickTarget<1,J>:ThickUnit<1,J>
NEXT J
ResCnt = FIELDCOUNT( ResTarget<1>, @VM )
PrintResTargets = ''
FOR J = 1 TO ResCnt
IF ResTarget<1,J>[1,1] = '.' THEN
TargetVal = '0':ResTarget<1,J>
END ELSE
TargetVal = ResTarget<1,J>
END
PrintResTargets<1,J> = TargetVal:ResUnit<1,J>
NEXT J
APreRec = ''
APostRec = ''
IF ( PreAkrionRecipe<1> <> '' ) THEN
APreRec = ' ':PreAkrionRecipe:' '
SubOxide = 'No' ;* If Akrion then no oxide strip
END
IF ( PostAkrionRecipe<1> <> '' ) THEN
APostRec = ' ':PostAkrionRecipe
END
PrintCleaningReqs = TRIM( 'Strip:':SubOxide:' Pre:':SubPreClean:APreRec:' Post:':SubPostClean:APostRec )
swap UNIT_MICROMETER$ with 'um' in PrintThickTargets
swap UNIT_OHM_CM$ with 'ohm.cm' in PrintThickTargets
swap UNIT_OHM_PER_SQ$ with 'ohm/sq' in PrintThickTargets
swap UNIT_A$ with 'A' in PrintThickTargets
swap UNIT_MICROMETER$ with 'um' in PrintResTargets
swap UNIT_OHM_CM$ with 'ohm.cm' in PrintResTargets
swap UNIT_OHM_PER_SQ$ with 'ohm/sq' in PrintResTargets
swap UNIT_A$ with 'A' in PrintResTargets
PrintWMInKey = WMInKey
CONVERT '*' TO '.' IN PrintWMInKey
CassNo = FIELD(WMInKey,'*',3)
WOMatKey = WONo:'*':CassNo
WOMatRec = XLATE('WO_MAT',WOMatKey,'','X')
LotNo = WOMatRec<WO_MAT_LOT_NO$>
WfrQty = WOMatRec<WO_MAT_WAFER_QTY$>
CustPartNo = WOMatRec<WO_MAT_CUST_PART_NO$>
SubPartNo = WOMatRec<WO_MAT_SUB_PART_NO$>
OrderItem = WOMatRec<WO_MAT_ORDER_ITEM$>
Vendor = WOMatRec<WO_MAT_SUB_VEND_CD$>
OrderDetKey = WORec<WO_LOG_ORDER_NO$>:'*':OrderItem
LOCATE CustPartNo IN CustEpiPartRec<CUST_EPI_PART_CUST_PART_NO$> USING @VM SETTING Pos THEN
CustPartDesc = CustEpiPartRec<CUST_EPI_PART_CUST_PART_DESC$,Pos>
END ELSE
CustPartDesc = ''
END
PartNo = CustPartNo
PartDesc = CustPartDesc
SuppCd = TRIM(SubPartNo[-1,'B-'])
IF LEN(SuppCd) NE '2' THEN SuppCd =''
If CassNo EQ 1 then
SpecEpi = PSRec<prod_spec_spec_epi$>
SpecSub = PSRec<PROD_SPEC_SPEC_SUBSTRATE$>
ThkSmile = PSRec<PROD_SPEC_THICK_SMILE_REQ$>
ThkShift = Field(PSRec, @FM, PROD_SPEC_THICK_LIMIT_SHIFT$)
ResShift = Field(PSRec, @FM, PROD_SPEC_RES_LIMIT_SHIFT$)
SSRecipe = XLATE('PRS_STAGE', PSNo:'*LWI', 5, 'X')
PCRecipe = XLATE('PRS_STAGE', PSNo, 'POST_CLEAN_SURFSCAN_RECIPE', 'X')
WaferSize = Field(SpecSub, @VM, QSSubWafersize$)
convert char(248) to @fm in SpecEpi ;* char(248) is used to separate layers
layerCount = fieldcount( SpecEpi, @fm )
layerInfo = SpecEpi<layerCount>
// If this is just 1 layer, we're returning that info, if 3 layers, we're returning layer 3 (combo)
ThkData = Field(layerInfo, @VM, QSEpiThickMeasure$)
ResData = Field(layerInfo, @VM, QSEpiResMeasure$)
ConData = Field(layerInfo, @VM, QSEpiConcMeasure$)
CResData = Field(layerInfo, @VM, QSEpiCresMeasure$)
ThkMin = OCONV(Field(layerInfo, @VM, QSEpiMinThick$), 'MD3')
ThkMax = OCONV(Field(layerInfo, @VM, QSEpiMaxThick$), 'MD3')
ThkTarg = ''
If ThkMin NE '' Then ThkTarg = oConv(iconv((ThkMin+ThkMax)/2, 'MD3'), 'MD3')
ResMin = OCONV(Field(layerInfo, @VM, QSEpiResMinThick$), 'MD3')
ResMax = OCONV(Field(layerInfo, @VM, QSEpiResMaxThick$), 'MD3')
ResTarg = ''
If ResMin NE '' Then ResTarg = oConv(iconv((ResMin+ResMax)/2, 'MD3'), 'MD3')
ConMin = OCONV(Field(layerInfo, @VM, QSEpiConcMinThick$), 'MD3')
ConMax = OCONV(Field(layerInfo, @VM, QSEpiConcMaxThick$), 'MD3')
ConTarg = ''
If ConMin NE '' Then ConTarg = oConv(iconv((ConMin+ConMax)/2, 'MD3'), 'MD3')
CResMin = OCONV(Field(layerInfo, @VM, QSEpiCresMin$), 'MD3')
CResMax = OCONV(Field(layerInfo, @VM, QSEpiCresMax$), 'MD3')
CResTarg = ''
If CResMin NE '' Then CResTarg = oConv(iconv((CResMin+CResMax)/2, 'MD3'), 'MD3')
ThkTool = Field(ThkData, '~', PS$TOOL)
ThkType = Field(ThkData, '~', PS$TYPE)
ThkRecipe = Field(ThkData, '~', PS$RECIPE)
ThkFreq = Field(ThkData, '~', PS$FREQ)
ThkPattern = Field(ThkData, '~', PS$PATTERN)
ResTool = Field(ResData, '~', PS$TOOL)
ResType = Field(ResData, '~', PS$TYPE)
ResRecipe = Field(ResData, '~', PS$RECIPE)
ResFreq = Field(ResData, '~', PS$FREQ)
ResPattern = Field(ResData, '~', PS$PATTERN)
ConTool = Field(ConData, '~', PS$TOOL)
ConType = Field(ConData, '~', PS$TYPE)
ConRecipe = Field(ConData, '~', PS$RECIPE)
ConFreq = Field(ConData, '~', PS$FREQ)
ConPattern = Field(ConData, '~', PS$PATTERN)
CResTool = Field(CResData, '~', PS$TOOL)
CResType = Field(CResData, '~', PS$TYPE)
CResRecipe = Field(CResData, '~', PS$RECIPE)
CResFreq = Field(CResData, '~', PS$FREQ)
CResPattern = Field(CResData, '~', PS$PATTERN)
IF ThkMin EQ '' THEN ThkMin = '--'
IF ThkMax EQ '' THEN ThkMax = '--'
IF ThkTarg EQ '' THEN ThkTarg = '--'
IF ThkTool EQ '' THEN ThkTool = '--'
IF ThkType EQ '' THEN ThkType = '--'
IF ThkRecipe EQ '' THEN ThkRecipe = '--'
IF ThkPattern EQ '' THEN ThkPattern = '--'
IF ThkFreq EQ '' THEN ThkFreq = '--'
IF ResMin EQ '' THEN ResMin = '--'
IF ResMax EQ '' THEN ResMax = '--'
IF ResTarg EQ '' THEN ResTarg = '--'
IF ResTool EQ '' THEN ResTool = '--'
IF ResType EQ '' THEN ResType = '--'
IF ResRecipe EQ '' THEN ResRecipe = '--'
IF ResPattern EQ '' THEN ResPattern = '--'
IF ResFreq EQ '' THEN ResFreq = '--'
IF ConMin EQ '' THEN ConMin = '--'
IF ConMax EQ '' THEN ConMax = '--'
IF ConTarg EQ '' THEN ConTarg = '--'
IF ConTool EQ '' THEN ConTool = '--'
IF ConType EQ '' THEN ConType = '--'
IF ConRecipe EQ '' THEN ConRecipe = '--'
IF ConPattern EQ '' THEN ConPattern = '--'
IF ConFreq EQ '' THEN ConFreq = '--'
IF CResMin EQ '' THEN CResMin = '--'
IF CResMax EQ '' THEN CResMax = '--'
IF CResTarg EQ '' THEN CResTarg = '--'
IF CResTool EQ '' THEN CResTool = '--'
IF CResType EQ '' THEN CResType = '--'
IF CResRecipe EQ '' THEN CResRecipe = '--'
IF CResPattern EQ '' THEN CResPattern = '--'
IF CResFreq EQ '' THEN CResFreq = '--'
Swap @VM with ' / ' in SSRecipe
IF PCRecipe EQ '' Then PCRecipe = '--'
If ThkSmile EQ '' OR ThkSmile EQ '0' then
ThkSmile = 'N'
end else
ThkSmile = 'Y'
end
If ThkShift EQ '' OR ThkShift EQ '0' then
ThkShift = 'N'
end else
ThkShift = 'Y'
end
If ResShift EQ '' OR ResShift EQ '0' then
ResShift = 'N'
end else
ResShift = 'Y'
end
if Len(ThkMin) > 6 then
ThkMin = ThkMin[1,6]
end
if Len(ThkMax) > 6 then
ThkMax = ThkMax[1,6]
end
if Len(ThkTarg) > 6 then
ThkTarg = ThkTarg[1,6]
end
if Len(ResMin) > 6 then
ResMin = ResMin[1,6]
end
if Len(ResMax) > 6 then
ResMax = ResMax[1,6]
end
if Len(ResTarg) > 6 then
ResTarg = ResTarg[1,6]
end
if Len(ConMin) > 6 then
ConMin = ConMin[1,6]
end
if Len(ConMax) > 6 then
ConMax = ConMax[1,6]
end
if Len(ConTarg) > 6 then
ConTarg = ConTarg[1,6]
end
if Len(CResMin) > 6 then
CResMin = CResMin[1,6]
end
if Len(CResMax) > 6 then
CResMax = CResMax[1,6]
end
if Len(CResTarg) > 6 then
CResTarg = CResTarg[1,6]
end
****** Begin ZPL
ZPL := '^XA'
ZPL := '^LH10,0'
ZPL := '^PR2' ;* Print speed 2 inches per second
ZPL := '^LL406' ;* Label length @203 dpi
ZPL := '^PW900'
ZPL := '^MD0' ;* Media darkness
ZPL := '^MMT' ;* Media mode t=tear off mode
****** 1st/2nd Line
ZPL := '^FO30,20^A0,,40^FDWO ':WONo:'^FS'
ZPL := '^FO590,10^A050,30^FDPSN ':PSNo:'^FS'
ZPL := '^FO555,40^A050,30^FDDopant ':Dopant:'^FS'
****** 3rd Line - headers
ZPL := '^FO85,100^A050,23^FDMin^FS'
ZPL := '^FO145,100^A050,23^FDTarg^FS'
ZPL := '^FO210,100^A050,23^FDMax^FS'
ZPL := '^FO280,100^A050,23^FDTool^FS'
ZPL := '^FO330,100^A050,23^FDType^FS'
ZPL := '^FO470,100^A050,23^FDRecipe^FS'
ZPL := '^FO600,100^A050,23^FDPattern^FS'
ZPL := '^FO740,100^A050,23^FDFreq^FS'
****** 4th Line - Thickness (Thk)
ZPL := '^FO70,130^GB720,0,3^FS'
ZPL := '^FO70,130^GB0,160,3^FS'
ZPL := '^FO10,140^A050,23^FDThk:^FS'
ZPL := '^FO80,140^A050,23^FD':ThkMin:'^FS'
ZPL := '^FO145,140^A050,23^FD':ThkTarg:'^FS'
ZPL := '^FO210,140^A050,23^FD':ThkMax:'^FS'
ZPL := '^FO280,140^A050,23^FD':ThkTool[1,5]:'^FS'
ZPL := '^FO330,140^A050,23^FD':ThkType[1,11]:'^FS'
ZPL := '^FO470,140^A050,23^FD':ThkRecipe[1,11]:'^FS'
ZPL := '^FO600,140^A050,23^FD':ThkPattern[1,11]:'^FS'
ZPL := '^FO750,140^A050,23^FD':ThkFreq:'^FS'
****** 5th Line - Resistivity (Res)
ZPL := '^FO10,170^GB780,0,3^FS'
ZPL := '^FO10,180^A050,23^FDRes:^FS'
ZPL := '^FO80,180^A050,23^FD':ResMin:'^FS'
ZPL := '^FO145,180^A050,23^FD':ResTarg:'^FS'
ZPL := '^FO210,180^A050,23^FD':ResMax:'^FS'
ZPL := '^FO280,180^A050,23^FD':ResTool[1,5]:'^FS'
ZPL := '^FO330,180^A050,23^FD':ResType[1,11]:'^FS'
ZPL := '^FO470,180^A050,23^FD':ResRecipe[1,11]:'^FS'
ZPL := '^FO600,180^A050,23^FD':ResPattern[1,11]:'^FS'
ZPL := '^FO750,180^A050,23^FD':ResFreq:'^FS'
****** 6th Line - Contact (Con)
ZPL := '^FX***LINE 4'
ZPL := '^FO10,210^GB780,0,3^FS'
ZPL := '^FO10,220^A050,23^FDCon:^FS'
ZPL := '^FO80,220^A050,23^FD':ConMin:'^FS'
ZPL := '^FO145,220^A050,23^FD':ConTarg:'^FS'
ZPL := '^FO210,220^A050,23^FD':ConMax:'^FS'
ZPL := '^FO280,220^A050,23^FD':ConTool[1,5]:'^FS'
ZPL := '^FO330,220^A050,23^FD':ConType[1,11]:'^FS'
ZPL := '^FO470,220^A050,23^FD':ConRecipe[1,11]:'^FS'
ZPL := '^FO600,220^A050,23^FD':ConPattern[1,11]:'^FS'
ZPL := '^FO750,220^A050,23^FD':ConFreq:'^FS'
****** 7th Line - Contact Resistance (CRes)
ZPL := '^FO10,250^GB780,0,3^FS'
ZPL := '^FO10,260^A050,23^FDCRes:^FS'
ZPL := '^FO80,260^A050,23^FD':CResMin:'^FS'
ZPL := '^FO145,260^A050,23^FD':CResTarg:'^FS'
ZPL := '^FO210,260^A050,23^FD':CResMax:'^FS'
ZPL := '^FO280,260^A050,23^FD':CResTool[1,5]:'^FS'
ZPL := '^FO330,260^A050,23^FD':CResType[1,11]:'^FS'
ZPL := '^FO470,260^A050,23^FD':CResRecipe[1,11]:'^FS'
ZPL := '^FO600,260^A050,23^FD':CResPattern[1,11]:'^FS'
ZPL := '^FO750,260^A050,23^FD':CResFreq:'^FS'
ZPL := '^FO10,290^GB780,0,3^FS'
****** 8th Line - Special Instructions
ZPL := '^FO10,310^A050,23^FDSurfScan: ':SSRecipe:'^FS'
ZPL := '^FO10,340^A050,23^FDPostClean: ':PCRecipe:'^FS'
ZPL := '^FO10,370^A050,23^FDWafer Size: ':WaferSize:'^FS'
ZPL := '^FO500,310^A050,23^FDSmile Required: ':ThkSmile:'^FS'
ZPL := '^FO500,340^A050,23^FDSPC Thk Shift: ':ThkShift:'^FS'
ZPL := '^FO500,370^A050,23^FDSPC Res Shift: ':ResShift:'^FS'
ZPL := '^XZ':CRLF$
****** End Cheet Sheet ZPL
end
For cnt = 1 to 2
ZPL := '^XA'
ZPL := '^LH0,0'
ZPL := '^PR2' ;* Print speed 2 inches per second
ZPL := '^LL406' ;* Label length @203 dpi
ZPL := '^PW900'
ZPL := '^MD8' ;* Media darkness
ZPL := '^MMT' ;* Media mode t=tear off mode
ZPL := '^FO15,15^GB795,398,3,B^FS' ;* Border
ZPL:= '^FO680,25^A0,36^FDWM In^FS'
****** First Line
Company = 'IFX Epi Services'
ZPL := '^FO30,25^A0,,36^FD':Company:'^FS'
ZPL := '^FO290,25^AC,18^FDWO No:^FS':CRLF$
ZPL := '^FO370,25^A045,36^FD':PrintWONo:'^FS':CRLF$
IF CassNo = 1 THEN
ZPL := '^FO535,20^GB120,40,40,,3^FS':CRLF$
ZPL := '^FO540,25^AC,18^FR^FDCass:^FS':CRLF$
ZPL := '^FO600,25^A045,36^FR^FD':CassNo:'^FS':CRLF$
END ELSE
ZPL := '^FO540,25^AC,18^FDCass:^FS':CRLF$
ZPL := '^FO600,25^A045,36^FD':CassNo:'^FS':CRLF$
END
****** Second Line
ZPL := '^FO30,70^AC,18^FDWM In:^FS':CRLF$
ZPL := '^FO120,70^A050,30^FD':PrintWMInKey:'^FS':CRLF$
ZPL := '^BY2,2.0':CRLF$
ZPL := '^FO300,60^B3,,37,N^FD':'I':PrintWMInKey:'^FS':CRLF$
ZPL := '^BY2,3.0':CRLF$
ZPL := '^FO700,70^AC,18^FDQty:^FS':CRLF$
ZPL := '^FO760,70^A045,25^FD':WfrQty:'^FS':CRLF$
****** Third Line
ZPL := '^FO30,105^AC,18^FDShip Dt:^FS'
ZPL := '^FO140,105^A0,,25^FD':ReqShipDate:'^FS':CRLF$
ZPL := '^FO250,105^AC,18^FDCust:^FS':CRLF$
ZPL := '^FO320,105^A045,25^FD':CustName:'^FS':CRLF$
ZPL := '^FO560,105^AC,18^FDPO:^FS':CRLF$
ZPL := '^FO600,105^A045,25^FD':PONo:'^FS':CRLF$
****** Separator bar
ZPL := '^FO15,128^GB795,1^FS'
****** Fourth Line
ZPL := '^FO30,135^AC,18^FDLot No:^FS':CRLF$
ZPL := '^FO120,135^A0,20^FD':LotNo:'^FS':CRLF$
ZPL := '^FO410,135^AC,18^FDPart No:^FS':CRLF$
ZPL := '^FO510,135^A0,20^FD':PartNo:'^FS':CRLF$
****** Fifth Line
ZPL := '^FO30,160^AC,18^FDSub PN:^FS':CRLF$
ZPL := '^FO120,160^A0,20^FD':SubPartNo:'^FS':CRLF$
IF SuppCd NE '' THEN
ZPL := '^FO410,160^AC,18^FDSupp Cd:^FS':CRLF$
ZPL := '^FO510,160^A0,20^FD':SuppCd:'^FS':CRLF$
ZPL := '^BY2,2.0':CRLF$
ZPL := '^FO610,160^A040,20^B3,,23,N^FD':SuppCd:'^FS':CRLF$
ZPL := '^BY2,3.0':CRLF$
END
****** Separator bar
ZPL := '^FO15,183^GB795,1^FS'
****** Seventh Line
ZPL := '^FO30,210^AC,18^FDPre:^FS':CRLF$
ZPL := '^FO90,210^A0,20^FD':SubPreClean:'^FS':CRLF$
IF PreAkrionRecipe NE '' THEN
ZPL := '^FO210,210^AC,18^FDAkrion:^FS':CRLF$
ZPL := '^FO300,210^A0,20^FD':PreAkrionRecipe:'^FS':CRLF$
ZPL := '^BY2,2.0':CRLF$
ZPL := '^FO450,210^A040,20^B3,,23,N^FD':PreAkrionRecipe:'^FS':CRLF$
ZPL := '^BY2,3.0':CRLF$
END
****** Eighth Line
ZPL := '^FO30,235^AC,18^FDRecipe:^FS':CRLF$
ZPL := '^FO120,235^A0,20^FD':RecipeInfo:'^FS':CRLF$
ZPL := '^FO410,235^AC,18^FDEpi Dopant:^FS':CRLF$
ZPL := '^FO560,235^A040,20^FD':Dopant:'^FS':CRLF$
****** Tenth, Eleventh and Twelfth Lines
ZPL := '^FO30,285^AC,18^FDThk Spec:^FS':CRLF$
FOR M = 1 TO COUNT(PrintThickTargets,@VM) + (PrintThickTargets NE '')
BaseLine = 285 + (M-1)*20
ZPL := '^FO140,':BaseLine:'^A040,20^FD':PrintThickTargets<1,M>:'^FS':CRLF$
NEXT M
ZPL := '^FO410,285^AC,18^FDRes Spec:^FS':CRLF$
FOR M = 1 TO COUNT(PrintResTargets,@VM) + (PrintResTargets NE '')
BaseLine = 285 + (M-1)*20
ZPL := '^FO520,':BaseLine:'^A040,20^FD':PrintResTargets<1,M>:'^FS':CRLF$
NEXT M
****** Separator bar
ZPL := '^FO15,373^GB795,1^FS'
****** Fourteenth Line
ZPL := '^FO30,385^AC,18^FDProd Spec No:^FS':CRLF$
ZPL := '^FO190,385^A0,25^FD':PSNo:'^FS':CRLF$
IF SpecType = 'Production' THEN
SpecType = 'Prod'
end else IF SpecType = 'Pre-Production' THEN
SpecType = 'Pre'
end
ZPL := '^FO275,385^AC,18^FDSpec Type:^FS':CRLF$
ZPL := '^FO400,385^A0,25^FD':SpecType:'^FS':CRLF$
****** Data Matrix barcode
ZPL := '^FO720,280^CI28':CRLF$
ZPL := '^BXN,2,200^FDP':PartNo:'|S':SubPartNo:'|1T':PrintWMInKey:'|2T':LotNo:'|':PSNo:'|Q':WfrQty:'|1V':Vendor:'|SEQ':Cnt:'^FS':CRLF$
ZPL:= '^XZ'
Next
* Check to see if they get the monitor wafers based on the PSN
MonitorWafer = CustEpiPartRec<CUST_EPI_PART_MONITOR_WAFER_LABEL$>
IF MonitorWafer THEN
RDSIds = ''
ZPL := '^XA^CFD'
ZPL := '^LH0,0'
ZPL := '^PR2' ;* Print speed 2 inches per second
ZPL := '^LL325' ;* Label length in dots
ZPL := '^MD15' ;* Media darkness
ZPL := '^MMT':CRLF$ ;* Media mode t=tear off mode
ZPL := '^FO30,30^A060,40^FDMonitor Wafer^FS':CRLF$
ZPL := '^FO550,30^A060,40^FDReactor#_____^FS':CRLF$
ZPL := '^FO30,70^A060,40^FDDate_____________^FS':CRLF$
ZPL := '^FO30,130^A060,40^FDCustomer Name: ':CustName<I>:'^FS':CRLF$
ZPL := '^FO30,190^A060,40^FDRDS#: ':RDSIds<I>:'^FS':CRLF$
ZPL := '^FO400,190^A060,40^FDLot#: ':LotNo<I>:'^FS':CRLF$
ZPL := '^FO30,250^A060,40^FDThick Avg__________^FS':CRLF$
ZPL := '^FO400,250^A060,40^FDWafer Type__________^FS':CRLF$
ZPL := '^FO30,280^A060,40^FDRes Avg____________^FS':CRLF$
ZPL := '^FO400,280^A060,40^FDWafer Type__________^FS':CRLF$
ZPL := '^XZ'
END
end else
ErrorMsg = 'Error in ':Service:' service. WM_IN ':WmInKey:' does not exist.'
end
end else
ErrorMsg = 'Error in ':Service:' service. Null WmInKey passed in.'
end
If ErrorMsg EQ '' then
Response = ZPL
end else
Error_Services('Add', ErrorMsg)
end
end service
Service ConvertRecordToJSON(KeyID, Record, ItemURL)
jsonRecord = ''
If KeyID NE '' then
If Record EQ '' then Record = Database_Services('ReadDataRow', 'WM_IN', KeyID)
If Error_Services('NoError') then
@DICT = Database_Services('GetTableHandle', 'DICT.WM_IN')
@ID = KeyID
@RECORD = Record
objJSON = ''
If SRP_JSON(objJSON, 'New', 'Object') then
objWmIn = ''
If SRP_JSON(objWmIn, 'New', 'Object') then
SRP_JSON(objWmIn, 'SetValue', 'keyId', @ID)
SRP_JSON(objJSON, 'Set', 'wmIn', objWmIn)
SRP_JSON(objWmIn, 'Release')
end
If itemURL NE '' then
// The itemURL was passed in so add HAL+JSON properties.
// Create the _links property and then all link objects needed for this resource.
objLinks = ''
If SRP_JSON(objLinks, 'New', 'Object') then
// Create a self link.
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
// Create the _class property for this resource.
SRP_JSON(objJSON, 'SetValue', '_class', 'resource')
end
jsonRecord = SRP_JSON(objJSON, 'Stringify', 'Styled')
SRP_JSON(objJSON, 'Release')
end else
Error_Services('Add', 'Unable to create JSON representation in the ' : Service : ' service.')
end
end
end else
Error_Services('Add', 'KeyID argument was missing in the ' : Service : ' service.')
end
Response = jsonRecord
End Service

130
LSL2/STPROC/WM_OUT_API.txt Normal file
View File

@ -0,0 +1,130 @@
Function WM_OUT_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 : WM_OUT_Api
Description : API logic for the WM_OUT 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 Rds[.ID.[<Property>]]
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
Examples:
- Rds.POST
- Rds.ID.PUT
- Rds.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)
08/28/25 djs Original programmer.
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
$insert APP_INSERTS
$insert API_SETUP
$insert HTTP_INSERTS
Declare function WM_Out_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 wm_out.ID.HEAD
API wm_out.ID.GET
GoSub CreateHALItem
end api
API wm_out.ID.zpl.HEAD
API wm_out.ID.zpl.GET
GoSub CreateZPLItem
end api
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------------------------
// CreateHALItem
//
// Creates a HAL+JSON object based on the OpenInsight data row representation of the scan.
//----------------------------------------------------------------------------------------------------------------------
CreateHALItem:
WMOutKey = EndpointSegment
Convert '-' to '*' in WMOutKey
WmOutJson = WM_Out_Services('ConvertRecordToJSON', WMOutKey, '', FullEndpointURL)
If Error_Services('NoError') then
StatusCode = 200
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
HTTP_Services('SetResponseBody', WmOutJson, 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
return
//----------------------------------------------------------------------------------------------------------------------
// CreateZPLItem
//
// Creates a HAL+JSON object with the ZPL for the given WM_IN row
//----------------------------------------------------------------------------------------------------------------------
CreateZPLItem:
WmOutKey = ParentSegment
ZPL = Wm_Out_Services('GetWmOutZpl', WmOutKey)
If Error_Services('NoError') then
StatusCode = 200
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
HTTP_Services('SetResponseBody', ZPL, False$, 'text/plain')
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
return

View File

@ -49,7 +49,7 @@ Compile function WM_Out_Services(@Service, @Params)
#pragma precomp SRP_PreCompiler
$Insert SERVICE_SETUP
$Insert LOGICAL
$Insert APP_INSERTS
$Insert MSG_EQUATES
$Insert DICT_EQUATES
$Insert WM_OUT_EQUATES
@ -57,20 +57,28 @@ $Insert WO_MAT_EQUATES
$Insert WO_LOG_EQUATES
$Insert COMPANY_EQUATES
$Insert RETURN_TO_FAB_LOTS_EQUATES
$INSERT PROD_SPEC_EQUATES
$INSERT WO_STEP_EQUATES
$INSERT EPI_PART_EQUATES
$INSERT CUST_EPI_PART_EQUATES
$INSERT PRS_STAGE_EQUATES
$insert UNIT_EQUATES
Declare function Database_Services, SRP_JSON, Error_Services, Clean_Insp_Services, WO_Mat_QA_Services
Declare function PSN_Services, SRP_Rotate_Array, Datetime, Return_To_Fab_Services, Environment_Services
Declare function Logging_Services
Declare subroutine Database_Services, SRP_JSON, Error_Services, Extract_Si_Keys, Set_Status, obj_wo_mat_log
Declare subroutine Logging_Services
Declare subroutine Logging_Services, Btree.Extract
GoToService
GoToService else
Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
end
Return Response or ""
Return Response else ''
//-----------------------------------------------------------------------------
// SERVICES
//-----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Services
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------------------------
@ -645,3 +653,299 @@ Service VerifyWOMatWMOKeyIndex(WMOKey)
end service
Service GetWMOutKeys(WOLogId)
ErrorMsg = ''
WMOutKeys = ''
If WOLogId NE '' then
Open 'DICT.WM_OUT' to hWmOutDict then
SearchString = ''
SearchString := 'WO_NO':@VM:WOLogId:@FM
Btree.Extract(SearchString, 'WM_OUT', hWmOutDict, WMOutKeys, 0, 0)
end else
ErrorMsg = 'Error opening WM_OUT dictionary.'
end
end else
ErrorMsg = 'WOLogId was null'
end
If ErrorMsg NE '' then
Error_Services('Add', ErrorMsg)
end
Response = WMOutKeys
end service
Service GetWmOutZpl(WmOutKey)
ZPL = ''
ErrorMsg = ''
If WmOutKey NE '' then
Swap '-' with '*' in WmOutKey
Swap '.' with '*' in WmOutKey
If RowExists('WM_OUT', WmOutKey) then
WONo = Field(WmOutKey, '*', 1, 1)
WOStep = Field(WmOutKey, '*', 2, 1)
WOStepKeys = XLATE('WO_LOG', WONo, WO_LOG_WO_STEP_KEY$, 'X')
IF INDEX(WOStepKeys,@VM,1) THEN
PrintWONo = WONo:'.':WOStep
END ELSE
PrintWONo = WONo
END
WORec = XLATE('WO_LOG',WONo,'','X')
ReqShipDate = OCONV(WORec<WO_LOG_PROMISE_SHIP_DT$>,'D2/')
CustNo = WORec<WO_LOG_CUST_NO$>
CustName = XLATE('COMPANY',CustNo,'ABBREV_OR_CO_NAME','X')
Captive = XLATE('COMPANY',CustNo,'CAPTIVE','X')
PONo = WORec<WO_LOG_CUST_PO_NO$>
PSNo = XLATE('WO_STEP',WONo:'*':WOStep,WO_STEP_PROD_SPEC_ID$,'X')
PSRec = XLATE('PROD_SPEC',PSNo,'','X')
CustSpecNo = ''
IF Captive THEN
CustSpecNos = PSRec<PROD_SPEC_SPEC_NUM$>
CustSpecDescs = PSRec<PROD_SPEC_SPEC_DESC$>
CustSpecRevNos = PSRec<PROD_SPEC_REV_NUM$>
CustSpecRevDts = PSRec<PROD_SPEC_REV_DATE$>
SpecCnt = COUNT(CustSpecNos,@VM) + (CustSpecNos NE '')
FOR I = 1 TO SpecCnt
IF CustSpecDescs<1,I> _EQC 'GENERAL' THEN
CustSpecNo = CustSpecNos<1,I>
CustSpecDesc = CustSpecDescS<1,I>
CustSpecRevNo = CustSpecRevNos<1,I>
CustSpecRevDt = OCONV(CustSpecRevDts<1,I>,'D4/')
END
UNTIL CustSpecNo NE ''
NEXT I
END
EpiPartNo = WORec<WO_LOG_EPI_PART_NO$>
CustEpiPartRec = XLATE('CUST_EPI_PART',CustNo:'*':EpiPartNo,'','X')
ShipBagReq = CustEpiPartRec<CUST_EPI_PART_SHIP_BAG_REQ$>
PreSurfscan = XLATE('PRS_STAGE',PSNo:'*PRE',PRS_STAGE_SURFSCAN_SIG_REQ$,'X')
FirstSurfscan = XLATE('PRS_STAGE',PSNo:'*WFR',PRS_STAGE_SURFSCAN_SIG_REQ$,'X')
PostCleanSurfScan = XLATE('PRS_STAGE',PSNo:'*POST',PRS_STAGE_SURFSCAN_SIG_REQ$,'X')
PostCleanSSSampleQty = XLATE('PRS_STAGE',PSNo:'*POST',PRS_STAGE_SS_SAMP_QTY$, 'X' )
PostCleanSurfscanRecipe = XLATE('PRS_STAGE',PSNo:'*POST',PRS_STAGE_SURFSCAN_RECIPE$,'X')
PostCleanSurfDefects = XLATE('PRS_STAGE',PSNo:'*POST',PRS_STAGE_SURF_DEFECTS$,'X')
PostCleanSurfHaze = OCONV(XLATE('PRS_STAGE',PSNo:'*POST',PRS_STAGE_SURF_HAZE$,'X'),'MD2')
SubPreClean = XLATE('PRS_STAGE',PSNo:'*PRE','TOOL_DISPLAY','X')
SubPostClean = XLATE('PRS_STAGE',PSNo:'*POST','TOOL_DISPLAY','X')
PreCleanTool = XLATE('PRS_STAGE',PSNo:'*PRE','TOOL_DISPLAY','X')
PostCleanTool = XLATE('PRS_STAGE',PSNo:'*POST','TOOL_DISPLAY','X')
PreAkrionRecipe = XLATE('PRS_STAGE',PSNo:'*PRE',PRS_STAGE_CLEAN_RECIPE$,'X')
PostAkrionRecipe = XLATE('PRS_STAGE',PSNo:'*POST',PRS_STAGE_CLEAN_RECIPE$,'X')
* * * * * * * * Following needs update to point to the PRS_LAYER & PRS_STAGE tables as required.
* * * * * * * * It's the required part that needs sorted out JCH 1/28/2014
RecipeNo = XLATE( 'PROD_SPEC', PSNo, 'RECIPE_NO_L1', 'X' )
RecipeName = XLATE( 'PROD_SPEC', PSNo, 'RECIPE_NAME_L1', 'X' )
SpecType = OCONV( XLATE( 'PROD_SPEC', PSNo, 'SPEC_TYPE', 'X' ), '[SPEC_TYPE_CONV]' )
SubOxide = OCONV( XLATE( 'PROD_SPEC', PSNo, 'SUB_OXIDE_STRIP', 'X' ), 'B' )
ThickTarget = OCONV( XLATE( 'PROD_SPEC', PSNo, 'THICK_TARGET_ALL', 'X' ), 'MD3' )
ResTarget = OCONV( XLATE( 'PROD_SPEC', PSNo, 'RES_TARGET_ALL', 'X' ), 'MD3' )
ThickUnit = XLATE( 'PROD_SPEC', PSNo, 'THICK_UNITS_ALL', 'X' )
ResUnit = XLATE( 'PROD_SPEC', PSNo , 'RES_UNITS_ALL', 'X' )
Dopant = XLATE( 'PROD_SPEC', PSNo, 'DOPANT_L1', 'X' )
RecipeNo = XLATE( 'PROD_SPEC', PSNo, 'RECIPE_NO', 'X' )
RecipeInfo = XLATE( 'RECIPE', RecipeNo, 'RECIPE_NAME_NO', 'X' )
CleaningReqs = ''
ThickCnt = FIELDCOUNT( ThickTarget<1>, @VM )
PrintThickTargets = ''
FOR J = 1 TO ThickCnt
PrintThickTargets<1,J> = ThickTarget<1,J>:ThickUnit<1,J>
NEXT J
ResCnt = FIELDCOUNT( ResTarget<1>, @VM )
PrintResTargets = ''
FOR J = 1 TO ResCnt
IF ResTarget<1,J>[1,1] = '.' THEN
TargetVal = '0':ResTarget<1,J>
END ELSE
TargetVal = ResTarget<1,J>
END
PrintResTargets<1,J> = TargetVal:ResUnit<1,J>
NEXT J
APreRec = ''
APostRec = ''
IF ( PreAkrionRecipe<1> <> '' ) THEN
APreRec = ' ':PreAkrionRecipe:' '
SubOxide = 'No' ;* If Akrion then no oxide strip
END
IF ( PostAkrionRecipe<1> <> '' ) THEN
APostRec = ' ':PostAkrionRecipe
END
PrintCleaningReqs = TRIM( 'Strip:':SubOxide:' Pre:':SubPreClean:APreRec:' Post:':SubPostClean:APostRec )
swap UNIT_MICROMETER$ with 'um' in PrintThickTargets
swap UNIT_OHM_CM$ with 'ohm.cm' in PrintThickTargets
swap UNIT_OHM_PER_SQ$ with 'ohm/sq' in PrintThickTargets
swap UNIT_A$ with 'A' in PrintThickTargets
swap UNIT_MICROMETER$ with 'um' in PrintResTargets
swap UNIT_OHM_CM$ with 'ohm.cm' in PrintResTargets
swap UNIT_OHM_PER_SQ$ with 'ohm/sq' in PrintResTargets
swap UNIT_A$ with 'A' in PrintResTargets
MakeupBox = XLATE('WM_OUT',WMOutKey,WM_OUT_MAKEUP_BOX$ ,'X')
PrintWMOutKey = WMOutKey
CONVERT '*' TO '.' IN PrintWMOutKey
CassNo = FIELD(WMOutKey,'*',3)
LotNo = 'Multiple'
WfrQty = XLATE('WM_OUT',WMOutKey,'WFRS_SCHED','X')
SubPartNo = WORec<WO_LOG_ORD_SUB_PART_NO$>
CustPartNo = WORec<WO_LOG_CUST_PART_NO$>
EpiPartNo = WORec<WO_LOG_EPI_PART_NO$>
CustPartDesc = XLATE('EPI_PART',EpiPartNo,EPI_PART_EPI_PART_DESC$,'X')
PartNo = CustPartNo ;* Temporary for 4x2 to 4x4 conversion
PartDesc = CustPartDesc ;* Temporary for 4x2 to 4x4 conversion
SubVendCode = WORec<WO_LOG_EXP_VEND_CD$>
Vendor = XLATE('SEMI_VEND_CODE', SubVendCode, 'EPI_VEND_CD', 'X')
SuppCd = TRIM(SubPartNo[-1,'B-'])
IF LEN(SuppCd) NE '2' THEN SuppCd =''
For cnt = 1 to 2
***** Start of label ZPL
ZPL := '^XA'
***** Label setup
ZPL := '^LH0,0'
ZPL := '^PR2' ;* Print speed 2 inches per second
ZPL := '^LL406' ;* Label length 203 dpi
ZPL := '^PW900' ;* Print width 900 dpi
ZPL := '^MD2' ;* Media darkness
ZPL := '^MMT':CRLF$ ;* Media mode t=tear off mode
***** Border
ZPL := '^FO10,5^GB795,398,3,B^FS':CRLF$
****** First Line
Company = 'IFX Epi Services'
ZPL := '^FO30,20^A0,45,36^FD':Company:'^FS':CRLF$
ZPL := '^FO290,25^AC,18^FDWO No:^FS':CRLF$
ZPL := '^FO370,20^A045,36^FD':PrintWONo:'^FS':CRLF$
IF CassNo = 1 THEN
ZPL := '^FO535,15^GB120,40,40,,3^FS':CRLF$
ZPL := '^FO540,25^AC,18^FR^FDCass:^FS':CRLF$
ZPL := '^FO600,20^A045,36^FR^FD':CassNo:'^FS':CRLF$
END ELSE
ZPL := '^FO540,25^AC,18^FDCass:^FS':CRLF$
ZPL := '^FO600,20^A045,36^FD':CassNo:'^FS':CRLF$
END
ZPL:= '^FO665,20^A045,36^FDWM Out^FS':CRLF$
****** Second Line
ZPL:= '^FO30,70^AC,18^FDWM Out:^FS':CRLF$
ZPL:= '^FO120,65^A050,30^FD':PrintWMOutKey:'^FS':CRLF$
ZPL := '^BY2,2.0':CRLF$
ZPL := '^FO300,58^B3,,37,N^FD':'O':PrintWMOutKey:'^FS':CRLF$
ZPL := '^BY2,3.0':CRLF$
ZPL:= '^FO700,60^AC,18^FDQty:^FS':CRLF$
ZPL:= '^FO760,60^A045,25^FD':WfrQty:'^FS':CRLF$
****** Third Line
ZPL:= '^FO30,100^AC,18^FDShip Dt:^FS':CRLF$
ZPL:= '^FO140,100^A0,,25^FD':ReqShipDate:'^FS':CRLF$
ZPL:= '^FO250,100^AC,18^FDCust:^FS':CRLF$
ZPL:= '^FO320,100^A045,25^FD':CustName:'^FS':CRLF$
ZPL:= '^FO560,100^AC,18^FDPO:^FS':CRLF$
ZPL:= '^FO600,100^A045,25^FD':PONo:'^FS':CRLF$
****** Separator bar
ZPL:= '^FO15,125^GB790,1^FS':CRLF$
****** Fourth Line
ZPL := '^FO30,130^AC,18^FDLot No:^FS':CRLF$
ZPL := '^FO120,130^A0,20^FD':LotNo:'^FS':CRLF$
ZPL := '^FO410,130^AC,18^FDPart No:^FS':CRLF$
ZPL := '^FO510,130^A0,20^FD':PartNo:'^FS':CRLF$
****** Fifth Line
ZPL := '^FO30,155^AC,18^FDSub PN:^FS':CRLF$
ZPL := '^FO120,155^A0,20^FD':SubPartNo:'^FS':CRLF$
IF SuppCd NE '' THEN
ZPL := '^FO410,155^AC,18^FDSupp Cd:^FS':CRLF$
ZPL := '^FO510,155^A0,20^FD':SuppCd:'^FS':CRLF$
ZPL := '^BY2,2.0':CRLF$
ZPL := '^FO610,155^A040,20^B3,,23,N^FD':SuppCd:'^FS':CRLF$
ZPL := '^BY2,3.0':CRLF$
END
****** Separator bar
ZPL := '^FO15,180^GB790,1^FS':CRLF$
IF MakeupBox THEN
ZPL := '^FO410,190^A050,30^FD* * * M a k e u p B o x * * *^FS':CRLF$
END ELSE
ZPL := '^FO410,190^AC,18^FDReact Type:^FS':CRLF$
ZPL := '^FO560,190^A0,20^FDEpiPro^FS':CRLF$
END
****** Seventh Line
ZPL := '^FO30,190^AC,18^FDPre:^FS':CRLF$
ZPL := '^FO90,190^A0,20^FD':SubPreClean:'^FS':CRLF$
IF PreAkrionRecipe NE '' THEN
ZPL := '^FO210,190^AC,18^FDAkrion:^FS':CRLF$
ZPL := '^FO300,190^A0,20^FD':PreAkrionRecipe:'^FS':CRLF$
ZPL := '^BY2,2.0':CRLF$
ZPL := '^FO450,190^A040,20^B3,,23,N^FD':PreAkrionRecipe:'^FS':CRLF$
ZPL := '^BY2,3.0':CRLF$
END
****** Eighth Line
ZPL := '^FO30,225^AC,18^FDRecipe:^FS':CRLF$
ZPL := '^FO120,225^A0,20^FD':RecipeInfo:'^FS':CRLF$
ZPL := '^FO410,225^AC,18^FDEpi Dopant:^FS':CRLF$
ZPL := '^FO560,225^A040,20^FD':Dopant:'^FS':CRLF$
****** Ninth, Tenth and Eleventh Lines
ZPL := '^FO30,260^AC,18^FDThk Spec:^FS':CRLF$
FOR M = 1 TO COUNT(PrintThickTargets,@VM) + (PrintThickTargets NE '')
BaseLine = 260 + (M-1)*20
ZPL := '^FO140,':BaseLine:'^A040,20^FD':PrintThickTargets<1,M>:'^FS':CRLF$
NEXT M
ZPL := '^FO410,260^AC,18^FDRes Spec:^FS':CRLF$
FOR M = 1 TO COUNT(PrintResTargets,@VM) + (PrintResTargets NE '')
BaseLine = 260 + (M-1)*20
ZPL := '^FO520,':BaseLine:'^A040,20^FD':PrintResTargets<1,M>:'^FS':CRLF$
NEXT M
IF PostAkrionRecipe NE '' THEN
ZPL := '^FO30,335^AC,18^FDPost:^FS':CRLF$
ZPL := '^FO90,335^A0,20^FD':SubPostClean:'^FS':CRLF$
ZPL := '^FO210,335^AC,18^FDAkrion:^FS':CRLF$
ZPL := '^FO300,335^A0,20^FD':PostAkrionRecipe:'^FS':CRLF$
ZPL := '^BY2,2.0':CRLF$
ZPL := '^FO450,335^A040,20^B3,,23,N^FD':PostAkrionRecipe:'^FS':CRLF$
ZPL := '^BY2,3.0':CRLF$
END ELSE
ZPL := '^FO30,335^AC,18^FDPost:^FS':CRLF$
ZPL := '^FO120,335^A0,20^FD':SubPostClean:'^FS':CRLF$
END
****** Separator bar
ZPL := '^FO15,365^GB790,1^FS':CRLF$
****** Data Matrix barcode
ZPL := '^FO720,280^CI28':CRLF$
ZPL := '^BXN,2,200^FDP':PartNo:'|S':SubPartNo:'|1T':PrintWMOutKey:'|2T':LotNo:'|':PSNo:'|Q':WfrQty:'|1V':Vendor:'|SEQ':Cnt:'^FS':CRLF$
****** Fourteenth Line
ZPL := '^FO30,375^AC,18^FDProd Spec No:^FS':CRLF$
ZPL := '^FO190,375^A0,25^FD':PSNo:'^FS':CRLF$
IF SpecType = 'Production' THEN SpecType = 'Prod'
IF SpecType = 'Pre-Production' THEN SpecType = 'Pre'
ZPL := '^FO275,375^AC,18^FDSpec Type:^FS':CRLF$
ZPL := '^FO400,375^A0,25^FD':SpecType:'^FS':CRLF$
ZPL := '^FO480,375^AC,18^FDBag:^FS':CRLF$
ZPL := '^FO530,375^A0,20^FD':ShipBagReq:'^FS':CRLF$
***** End of Label
ZPL := '^XZ'
Next
end else
ErrorMsg = 'Error in ':Service:' service. WM_OUT ':WmOutKey:' does not exist.'
end
end else
ErrorMsg = 'Error in ':Service:' service. Null WmOutKey passed in.'
end
If ErrorMsg EQ '' then
Response = ZPL
end else
Error_Services('Add', ErrorMsg)
end
end service

View File

@ -51,17 +51,18 @@ $Insert IFX_EQUATES
$Insert CUST_EPI_PART_EQUATES
Equ MAX_NUM_CASS$ to 150
Equ NUM_ATTEMPTS$ to 10
Declare subroutine Error_Services, Work_Order_Services, Memory_Services, RList, Database_Services, SRP_JSON
Declare subroutine Btree.Extract, Set_Status, obj_WO_Log, obj_Notes, Print_Wo_Mat_In_Labels, Print_Wo_Mat_Out_Labels
Declare subroutine Print_Wmi_Labels, Print_Wmo_Labels, ErrMsg, Print_Cass_Labels, Logging_Services, Service_Services
Declare subroutine obj_WO_Mat_Log, WO_Mat_Services, Work_Order_Services, Transaction_Services, Extract_Si_Keys
Declare subroutine Mona_Services, Lot_Event_Services, RDS_Services, Lot_Services, WM_In_Services, WM_Out_Services
Declare subroutine obj_WO_Mat, obj_Post_Log
Declare subroutine obj_WO_Mat, obj_Post_Log, Delay
Declare function SRP_Array, Work_Order_Services, Memory_Services, Database_Services, SRP_Sort_Array, SRP_JSON
Declare function Company_Services, obj_Prod_Spec, Schedule_Services, obj_WO_Log, obj_WO_Step, Memberof, Datetime
Declare function Environment_Services, Logging_Services, Hold_Services, Signature_Services, Lot_Services
Declare function SRP_Datetime, RTI_CreateGUID, RDS_Services, UCase
Declare function SRP_Datetime, RTI_CreateGUID, RDS_Services, UCase, Date_Services
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
LogDate = Oconv(Date(), 'D4/')
@ -1140,6 +1141,86 @@ Service UpdateReleasedQty(WONo)
end service
Service AdjustReleasedQty(WONo, AdjustQty)
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS')
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Adjust Released Qty Log.csv'
Headers = 'Logging DTM' : @FM : 'WONo' : @FM : 'Notes'
objAdjRelLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$,',', Headers, '', False$, False$)
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
OrigRelQty = ''
RelQty = ''
UnrelQty = ''
ErrorMsg = ''
Begin Case
Case (WONo EQ '')
ErrorMsg = 'Error in ':Service:' service. Null WONo passed into service'
Case (AdjustQty EQ '')
ErrorMsg = 'Error in ':Service:' service. Null AdjustQty passed into service'
Case Not(Num(AdjustQty))
ErrorMsg = 'Error in ':Service:' service. AdjustQty is not a number'
Case Index(AdjustQty, '.', 1)
ErrorMsg = 'Error in ':Service:' service. AdjustQty cannot be a decimal value'
Case Otherwise$
Null
End Case
If (ErrorMsg EQ '' ) then
If RowExists('WO_LOG', WONo) then
For Attempt = 1 to NUM_ATTEMPTS$
If Attempt GT 0 then Delay(Attempt)
HaveLock = Database_Services('GetKeyIDLock', 'WO_LOG', WONo, True$)
If HaveLock then
WORec = Database_Services('ReadDataRow', 'WO_LOG', WONo)
If Error_Services('NoError') then
WOQty = WORec<WO_LOG_WO_QTY$>
OrigRelQty = WORec<WO_LOG_REL_QTY_STATIC$>
RelQty = OrigRelQty + AdjustQty
UnrelQty = WOQty - RelQty
If UnrelQty LT 0 then UnrelQty = 0
WORec<WO_LOG_REL_QTY_STATIC$> = RelQty
WORec<WO_LOG_UNREL_QTY_STATIC$> = UnRelQty
Database_Services('WriteDataRow', 'WO_LOG', WONo, WORec, True$, False$, False$)
If Error_Services('HasError') then
ErrorMsg = 'Error in ':Service:' service. Failed to write ':RelQty:' on REL_QTY_STATIC '
ErrorMsg := 'field and ':UnrelQty:' on UNREL_QTY_STATIC field of WO_LOG record ':WONo:'.'
ErrorMsg := 'Error message: ':Error_Services('GetMessage')
end
end else
ErrorMsg = 'Error in ':Service:' service. Failed to read record ':WONo:' from the WO_LOG table. '
ErrorMsg := 'Error message: ':Error_Services('GetMessage')
end
end
If ( Not(HaveLock) and (Attempt GE NUM_ATTEMPTS$) ) then
ErrorMsg = 'Error in ':Service:' service. Failed to lock WO_LOG ':WoNo:' for update after ':Attempt:' attempts.'
end
Until HaveLock or (ErrorMsg NE '')
Next Attempt
end else
ErrorMsg = 'Error in ':Service:' service. ':WONo:' does not exist in the WO_LOG table.'
end
end
LogData = ''
LogData<1> = LoggingDtm
LogData<2> = WONo
If ErrorMsg EQ '' then
LogResult = 'Successfully adjusted WO_LOG ':WONo:' released and unreleased quantities by ':AdjustQty
LogResult := '. Updated WO_LOG record ':WONo:' field REL_QTY_STATIC with released quantity ':RelQty
LogResult := ' and field UNREL_QTY_STATIC with unreleased quantity ':UnRelQty:'.'
LogData<3> = LogResult
Logging_Services('AppendLog', objAdjRelLog, LogData, @RM, @FM)
end else
LogResult = 'Failed to adjust WO_LOG ':WONo:' released and unreleased quantities by ':AdjustQty:'.'
LogData<3> = LogResult
Logging_Services('AppendLog', objAdjRelLog, LogData, @RM, @FM)
Error_Services('Add', ErrorMsg)
end
end service
Service UpdateReceivedQty(WONo)
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
@ -1155,8 +1236,10 @@ Service UpdateReceivedQty(WONo)
If WONo NE '' then
If RowExists('WO_LOG', WONo) then
WORec = Database_Services('ReadDataRow', 'WO_LOG', WONo)
If Error_Services('NoError') then
RXQty = obj_WO_Log('RxQty', WONo:@RM:WORec)
If Error_Services('NoError') then
WOQty = WORec<WO_LOG_WO_QTY$>
RXQty = obj_WO_Log('RxQty', WONo:@RM:WORec)
OpenQty = WOQty - RXQty
Open 'WO_LOG' to hTable then
ReadV OrigRXQty from hTable, WONo, WO_LOG_RX_QTY_STATIC$ then
If OrigRXQty NE RXQty then
@ -1169,6 +1252,19 @@ Service UpdateReceivedQty(WONo)
end else
ErrorMsg = 'Error in ':Service:' service. Error reading RX_QTY_STATIC column from WO_LOG ':WONo:'.'
end
If ErrorMsg EQ '' then
ReadV OrigOpenQty from hTable, WONo, WO_LOG_OPEN_QTY_STATIC$ then
If OrigOpenQty NE OpenQty then
WriteV OpenQty on hTable, WONo, WO_LOG_OPEN_QTY_STATIC$ else
ErrorMsg = 'Error in ':Service:' service. Failed to write received quantity ':RXQty
ErrorMsg := ' to the OPEN_QTY_STATIC field of WO_LOG record ':WONo:'.'
ErrorMsg := '@FILE_ERROR: ':@FILE_ERROR
end
end
end else
ErrorMsg = 'Error in ':Service:' service. Error reading OPEN_QTY_STATIC column from WO_LOG ':WONo:'.'
end
end
end else
ErrorMsg = 'Error in ':Service:' service. Failed to open the WO_LOG table.'
end
@ -1200,6 +1296,84 @@ Service UpdateReceivedQty(WONo)
end service
Service AdjustReceivedQty(WONo, AdjustQty)
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS')
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Adjust Received Qty Log.csv'
Headers = 'Logging DTM' : @FM : 'WONo' : @FM : 'Notes'
objAdjRecLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$,',', Headers, '', False$, False$)
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
RXQty = ''
OrigRXQty = ''
ErrorMsg = ''
Begin Case
Case (WONo EQ '')
ErrorMsg = 'Error in ':Service:' service. Null WONo passed into service'
Case (AdjustQty EQ '')
ErrorMsg = 'Error in ':Service:' service. Null AdjustQty passed into service'
Case Not(Num(AdjustQty))
ErrorMsg = 'Error in ':Service:' service. AdjustQty is not a number'
Case Index(AdjustQty, '.', 1)
ErrorMsg = 'Error in ':Service:' service. AdjustQty cannot be a decimal value'
Case Otherwise$
Null
End Case
If (ErrorMsg EQ '' ) then
If RowExists('WO_LOG', WONo) then
For Attempt = 1 to NUM_ATTEMPTS$
If Attempt GT 0 then Delay(Attempt)
HaveLock = Database_Services('GetKeyIDLock', 'WO_LOG', WONo, True$)
If HaveLock then
WORec = Database_Services('ReadDataRow', 'WO_LOG', WONo)
If Error_Services('NoError') then
WOQty = WORec<WO_LOG_WO_QTY$>
OrigRxQty = WORec<WO_LOG_RX_QTY_STATIC$>
RxQty = OrigRxQty + AdjustQty
OpenQty = WOQty - RXQty
WORec<WO_LOG_RX_QTY_STATIC$> = RxQty
WORec<WO_LOG_OPEN_QTY_STATIC$> = OpenQty
Database_Services('WriteDataRow', 'WO_LOG', WONo, WORec, True$, False$, False$)
If Error_Services('HasError') then
ErrorMsg = 'Error in ':Service:' service. Failed to write ':RxQty:' on RX_QTY_STATIC field '
ErrorMsg := 'and ':OpenQty:' on OPEN_QTY_STATIC to WO_LOG ':WONo:'. Error message: '
ErrorMsg := Error_Services('GetMessage')
end
end else
ErrorMsg = 'Error in ':Service:' service. Failed to read record ':WONo:' from the WO_LOG table. '
ErrorMsg := 'Error message: ':Error_Services('GetMessage')
end
end
If ( Not(HaveLock) and (Attempt GE NUM_ATTEMPTS$) ) then
ErrorMsg = 'Error in ':Service:' service. Failed to lock WO_LOG ':WoNo:' for update after ':Attempt:' attempts.'
end
Until HaveLock or (ErrorMsg NE '')
Next Attempt
end else
ErrorMsg = 'Error in ':Service:' service. ':WONo:' does not exist in the WO_LOG table.'
end
end
LogData = ''
LogData<1> = LoggingDtm
LogData<2> = WONo
If ErrorMsg EQ '' then
LogResult = 'Successfully adjusted WO_LOG ':WONo:' received and open quantities by ':AdjustQty
LogResult := '. Updated WO_LOG record ':WONo:' field RX_QTY_STATIC with received quantity ':RXQty
LogResult := ' and field OPEN_QTY_STATIC with open quantity ':OpenQty:'.'
LogData<3> = LogResult
Logging_Services('AppendLog', objAdjRecLog, LogData, @RM, @FM)
end else
LogResult = 'Failed to adjust WO_LOG ':WONo:' received and open quantities by ':AdjustQty
LogData<3> = LogResult
Logging_Services('AppendLog', objAdjRecLog, LogData, @RM, @FM)
Error_Services('Add', ErrorMsg)
end
end service
Service UpdateShippedQty(WONo)
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
@ -1331,83 +1505,124 @@ end service
Service ConvertRecordToJSON(WONo, Record, ItemURL)
jsonRecord = ''
ErrorMsg = ''
jsonRecord = ''
IF WONo NE '' then
If Record EQ '' then Record = Database_Services('ReadDataRow', 'WO_LOG', WONo)
If Error_Services('NoError') then
@DICT = Database_Services('GetTableHandle', 'DICT.WO_LOG')
@ID = WONo
@RECORD = Record
objJSON = ''
If SRP_JSON(objJSON, 'New', 'Object') then
objWOLog = ''
If SRP_JSON(objWOLog, 'New', 'Object') then
SRP_JSON(objWOLog, 'SetValue', 'KeyId', @ID)
SRP_JSON(objWOLog, 'SetValue', 'ProdOrdNo', {PROD_ORD_NO})
SRP_JSON(objWOLog, 'SetValue', 'PSN', {PROD_SPEC_ID})
SRP_JSON(objWOLog, 'SetValue', 'EpiPartNo', {EPI_PART_NO})
SRP_JSON(objWOLog, 'SetValue', 'HOT_FLAG', {HOT_FLAG})
//Create a list of cassettes
CassIDs = {WO_MAT_KEY}
objChildCassettes = ''
If SRP_JSON(objChildCassettes, 'New', 'Array') then
If CassIDs NE '' then
for each Cass in CassIDs using @VM setting vPos
SAPBatchNo = XLATE('WO_MAT', Cass, WO_MAT_SAP_BATCH_NO$, 'X')
SAPTXDtm = XLATE('WO_MAT', Cass, WO_MAT_SAP_TX_DTM$, 'X')
RDSNo = XLATE('WO_MAT', Cass, WO_MAT_RDS_NO$, 'X')
ShipNo = XLATE('WO_MAT', Cass, WO_MAT_SHIP_NO$, 'X')
//Add in each indv. cassette object
objChildCassette = ''
If SRP_JSON(objChildCassette, 'New', 'Object') then
SRP_JSON(objChildCassette, 'SetValue', 'KeyId', Cass)
SRP_JSON(objChildCassette, 'SetValue', 'SAPBatchNo', SAPBatchNo)
SRP_JSON(objChildCassette, 'SetValue', 'SAPTXDtm', OCONV(SAPTXDtm, 'DT'))
SRP_JSON(objChildCassette, 'SetValue', 'RDSNo', RDSNo)
SRP_JSON(objChildCassette, 'SetValue', 'ShipNo', ShipNo)
SRP_JSON(objChildCassettes, 'Add', objChildCassette)
SRP_JSON(objChildCassette, 'Release')
end
Next Cass
end else
SRP_JSON(objWOLog, 'SetValue', 'ChildCassettes', '')
end
SRP_JSON(objWOLog, 'Set', 'ChildCassettes', objChildCassettes)
SRP_JSON(objChildCassettes, 'Release')
end
SRP_JSON(objJSON, 'Set', 'WO_Log', objWOLog)
SRP_JSON(objWOLog, 'Release')
end
If itemURL NE '' then
// The itemURL was passed in so add HAL+JSON properties.
// Create the _links property and then all link objects needed for this resource.
objLinks = ''
If SRP_JSON(objLinks, 'New', 'Object') then
// Create a self link.
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
EpiPartNo = Record<WO_LOG_EPI_PART_NO$>
EpiPartRec = Database_Services('ReadDataRow', 'EPI_PART', EpiPartNo)
If Error_Services('NoError') then
SubSuppBy = EpiPartRec<EPI_PART_SUB_SUPP_BY$> ;* L - EpiSvcs supplied, C - Customer Supplied
ProdVerNo = Record<WO_LOG_PROD_VER_NO$>
ProdVerRec = Database_Services('ReadDataRow', 'PROD_VER', ProdVerNo)
If Error_Services('NoError') then
SubPartNo = ProdVerRec<PROD_VER_SUB_PART_NO$>
// Create the JSON response object
objJSON = ''
If SRP_JSON(objJSON, 'New', 'Object') then
objWOLog = ''
If SRP_JSON(objWOLog, 'New', 'Object') then
SRP_JSON(objWOLog, 'SetValue', 'KeyId', WONo)
SRP_JSON(objWOLog, 'SetValue', 'ProdOrdNo', Record<WO_LOG_PROD_ORD_NO$>)
SRP_JSON(objWOLog, 'SetValue', 'PSN', Xlate('WO_LOG', WONo, 'PS_NO', 'X'))
SRP_JSON(objWOLog, 'SetValue', 'EpiPartNo', EpiPartNo)
SRP_JSON(objWOLog, 'SetValue', 'HotFlag', Record<WO_LOG_HOT_FLAG$>)
SRP_JSON(objWOLog, 'SetValue', 'WoQty', Record<WO_LOG_WO_QTY$>)
SRP_JSON(objWOLog, 'SetValue', 'RxQty', Record<WO_LOG_RX_QTY_STATIC$>)
SRP_JSON(objWOLog, 'SetValue', 'RelQty', Record<WO_LOG_REL_QTY_STATIC$>)
SRP_JSON(objWOLog, 'SetValue', 'UnRelQty', Record<WO_LOG_UNREL_QTY_STATIC$>)
SRP_JSON(objWOLog, 'SetValue', 'ShipQty', Record<WO_LOG_SHIP_QTY_STATIC$>)
SRP_JSON(objWOLog, 'SetValue', 'ScrapQty', Record<WO_LOG_SCRAP_QTY_STATIC$>)
SRP_JSON(objWOLog, 'SetValue', 'OpenQty', Record<WO_LOG_OPEN_QTY_STATIC$>)
SRP_JSON(objWOLog, 'SetValue', 'CustNo', Record<WO_LOG_CUST_NO$>)
SRP_JSON(objWOLog, 'SetValue', 'Customer', Xlate('WO_LOG', WONo, 'CUST_NAME', 'X'))
// Create the _class property for this resource.
SRP_JSON(objJSON, 'SetValue', '_class', 'resource')
ExpectedVendorCd = Record<WO_LOG_EXP_VEND_CD$>
If ( (Len(ExpectedVendorCd) NE 2) or (SubSuppBy NE 'L') ) then ExpectedVendorCd = ''
SRP_JSON(objWOLog, 'SetValue', 'ExpectedVendorCd', ExpectedVendorCd)
SRP_JSON(objWOLog, 'SetValue', 'SubPartNo', SubPartNo)
// Create a list of cassettes
CassIDs = Record<WO_LOG_WO_MAT_KEY$>
objChildCassettes = ''
If SRP_JSON(objChildCassettes, 'New', 'Array') then
If CassIDs NE '' then
for each Cass in CassIDs using @VM setting vPos
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', Cass)
If Error_Services('NoError') then
// Add in each indv. cassette object
objChildCassette = ''
If SRP_JSON(objChildCassette, 'New', 'Object') then
SRP_JSON(objChildCassette, 'SetValue', 'KeyId', Cass)
SRP_JSON(objChildCassette, 'SetValue', 'CassNo', Field(Cass, '*', 2, 1))
SRP_JSON(objChildCassette, 'SetValue', 'SAPBatchNo', WOMatRec<WO_MAT_SAP_BATCH_NO$>)
SRP_JSON(objChildCassette, 'SetValue', 'SAPTXDtm', Date_Services('ConvertDateTimeToISO8601', WOMatRec<WO_MAT_SAP_TX_DTM$>))
SRP_JSON(objChildCassette, 'SetValue', 'RDSNo', WOMatRec<WO_MAT_RDS_NO$>)
SRP_JSON(objChildCassette, 'SetValue', 'ShipNo', WOMatRec<WO_MAT_SHIP_NO$>)
SRP_JSON(objChildCassette, 'SetValue', 'LotNo', WOMatRec<WO_MAT_LOT_NO$>)
SRP_JSON(objChildCassette, 'SetValue', 'Qty', WOMatRec<WO_MAT_WAFER_QTY$>)
SRP_JSON(objChildCassette, 'SetValue', 'CustPartNo', WOMatRec<WO_MAT_CUST_PART_NO$>)
SRP_JSON(objChildCassette, 'SetValue', 'SubPartNo', WOMatRec<WO_MAT_SUB_PART_NO$>)
SRP_JSON(objChildCassette, 'SetValue', 'VendorCd', WOMatRec<WO_MAT_SUB_VEND_CD$>)
SRP_JSON(objChildCassette, 'SetValue', 'RecDtm', Date_Services('ConvertDateTimeToISO8601', WOMatRec<WO_MAT_RX_DTM$>))
SRP_JSON(objChildCassette, 'SetValue', 'RelDtm', Date_Services('ConvertDateTimeToISO8601', WOMatRec<WO_MAT_REL_DTM$>))
SRP_JSON(objChildCassette, 'SetValue', 'RecUser', OConv(WOMatRec<WO_MAT_RX_BY$>, '[XLATE_CONV,LSL_USERS*FIRST_LAST]'))
SRP_JSON(objChildCassette, 'SetValue', 'RelUser', OConv(WOMatRec<WO_MAT_REL_BY$>, '[XLATE_CONV,LSL_USERS*FIRST_LAST]' ))
SRP_JSON(objChildCassettes, 'Add', objChildCassette)
SRP_JSON(objChildCassette, 'Release')
end
end else
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
end
Next Cass
end else
SRP_JSON(objWOLog, 'SetValue', 'ChildCassettes', '')
end
SRP_JSON(objWOLog, 'Set', 'ChildCassettes', objChildCassettes)
SRP_JSON(objChildCassettes, 'Release')
end
SRP_JSON(objJSON, 'Set', 'WO_Log', objWOLog)
SRP_JSON(objWOLog, 'Release')
end
If itemURL NE '' then
// The itemURL was passed in so add HAL+JSON properties.
// Create the _links property and then all link objects needed for this resource.
objLinks = ''
If SRP_JSON(objLinks, 'New', 'Object') then
// Create a self link.
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
// Create the _class property for this resource.
SRP_JSON(objJSON, 'SetValue', '_class', 'resource')
end
jsonRecord = SRP_JSON(objJSON, 'Stringify', 'Styled')
SRP_JSON(objJSON, 'Release')
end else
ErrorMsg = 'Error in ':Service:' service. Unable to create JSON object'
end
end else
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
end
jsonRecord = SRP_JSON(objJSON, 'Stringify', 'Styled')
SRP_JSON(objJSON, 'Release')
end else
Error_Services('Add', 'Unable to create JSON representation in the ' : Service : ' service.')
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
end
end else
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
end
end else
Error_Services('Add', 'KeyID argument was missing in the ' : Service : ' service.')
ErrorMsg = 'Error in ':Service:' service. Null WONo passed into service.'
end
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
Response = jsonRecord
end service
@ -2128,7 +2343,39 @@ Service UpdateOpenWorkOrderData()
LogData<4> = ErrorMsg
Logging_Services('AppendLog', objVerifyWOMatKeysLog, LogData, @RM, @FM)
MonaStatus = 'critical'
end
end
Work_Order_Services('UpdateReceivedQty', NextOpenWoLogKey)
If Error_Services('HasError') then
LogData<1> = OConv(Datetime(), 'DT/^S')
ErrorMsg = 'Error calling UpdateReceivedQty for WO_LOG ':NextOpenWoLogKey:'. ':Error_Services('GetMessage')
LogData<4> = ErrorMsg
Logging_Services('AppendLog', objVerifyWOMatKeysLog, LogData, @RM, @FM)
MonaStatus = 'critical'
end
Work_Order_Services('UpdateReleasedQty', NextOpenWoLogKey)
If Error_Services('HasError') then
LogData<1> = OConv(Datetime(), 'DT/^S')
ErrorMsg = 'Error calling UpdateReleasedQty for WO_LOG ':NextOpenWoLogKey:'. ':Error_Services('GetMessage')
LogData<4> = ErrorMsg
Logging_Services('AppendLog', objVerifyWOMatKeysLog, LogData, @RM, @FM)
MonaStatus = 'critical'
end
Work_Order_Services('UpdateScrappedQty', NextOpenWoLogKey)
If Error_Services('HasError') then
LogData<1> = OConv(Datetime(), 'DT/^S')
ErrorMsg = 'Error calling UpdateScrappedQty for WO_LOG ':NextOpenWoLogKey:'. ':Error_Services('GetMessage')
LogData<4> = ErrorMsg
Logging_Services('AppendLog', objVerifyWOMatKeysLog, LogData, @RM, @FM)
MonaStatus = 'critical'
end
Work_Order_Services('UpdateShippedQty', NextOpenWoLogKey)
If Error_Services('HasError') then
LogData<1> = OConv(Datetime(), 'DT/^S')
ErrorMsg = 'Error calling UpdateShippedQty for WO_LOG ':NextOpenWoLogKey:'. ':Error_Services('GetMessage')
LogData<4> = ErrorMsg
Logging_Services('AppendLog', objVerifyWOMatKeysLog, LogData, @RM, @FM)
MonaStatus = 'critical'
end
end
end else
LogData<1> = OConv(Datetime(), 'DT/^S')
@ -2313,6 +2560,107 @@ Service UpdateWorkOrderData(WONo)
end service
Service GetWoLogZpl(WoNo)
ZPL = ''
ErrorMsg = ''
If WoNo NE '' then
If RowExists('WO_LOG', WoNo) then
WOStepKeys = XLATE('WO_LOG',WONo,WO_LOG_WO_STEP_KEY$,'X')
IF INDEX(WOStepKeys,@VM,1) THEN
PrintWONo = WONo:'.':WOStep
END ELSE
PrintWONo = WONo
END
WORec = XLATE('WO_LOG',WONo,'','X')
ReqShipDate = OCONV(WORec<WO_LOG_PROMISE_SHIP_DT$>,'D2/')
CustNo = WORec<WO_LOG_CUST_NO$>
CustName = XLATE('COMPANY',CustNo,'ABBREV_OR_CO_NAME','X')
ZPL := '^XA^CFD'
ZPL := '^LH0,0'
ZPL := '^PR2' ;* Print speed 2 inches per second
ZPL := '^LL325' ;* Label length in dots
ZPL := '^MD15' ;* Media darkness
ZPL := '^PQ2' ;* Print 2 labels for each pass through here
ZPL := '^MMT':CRLF$ ;* Media mode t=tear off mode
IF INDEX(PrintWONo,'.',1) THEN
ZPL := '^FO10,30^A0,220,210^FD':PrintWONo:'^FS':CRLF$
END ELSE
ZPL := '^FO70,30^A0,220,210^FD':PrintWONo:'^FS':CRLF$
END
CharCnt = Len(CustName)
NameLength = CharCnt*72
WhiteSpace = INT(((2103 - NameLength)/2103) * 806)
StartingXPos = INT(WhiteSpace/2)
ZPL:= '^FO':StartingXPos:',230^A0,75,72^FD':CustName:'^FS':CRLF$
ZPL:= '^FO160,320^A080,50^FD':'Commit Date: ':OCONV( XLATE( 'WO_LOG', WONo, WO_LOG_COMMIT_DATE$, 'X' ), 'D2/' ):'^FS':CRLF$
ZPL:= '^XZ'
end else
ErrorMsg = 'Error in ':Service:' service. WO_LOG ':WoNo:' does not exist.'
end
end else
ErrorMsg = 'Error in ':Service:' service. Null WoNo passed in.'
end
If ErrorMsg EQ '' then
Response = ZPL
end else
Error_Services('Add', ErrorMsg)
end
end service
Service GetVoidedWaferCount(WorkOrderNo)
ErrorMsg = ''
VoidedWaferCount = 0
If WorkOrderNo NE '' then
If RowExists('WO_LOG', WorkOrderNo) then
ReactorType = Xlate('WO_LOG', WorkOrderNo, 'PS_REACTOR_TYPE', 'X')
If ReactorType EQ 'EPP' then
Query = 'SELECT WM_IN WITH WO_NO EQ ':WorkOrderNo:' AND WITH VOID EQ ':True$
Rlist(Query, TARGET_ACTIVELIST$, '', '', '')
ErrCode = ''
If Not(Get_Status(ErrCode)) then
EOF = False$
Loop
Readnext WmInKey else EOF = True$
Until EOF
VoidedWaferCount += Xlate('WM_IN', WmInKey, 'WFR_CNT', 'X')
Repeat
end else
ErrorMsg = 'Error in ':Service: 'service. Error calling RList. Error code: ':ErrCode
end
end else
Query = 'SELECT WO_MAT WITH WO_NO EQ ':WorkOrderNo:' AND WITH VOID EQ ':True$
Rlist(Query, TARGET_ACTIVELIST$, '', '', '')
ErrCode = ''
If Not(Get_Status(ErrCode)) then
EOF = False$
Loop
Readnext WoMatKey else EOF = True$
Until EOF
VoidedWaferCount += Xlate('WO_MAT', WoMatKey, 'WAFER_QTY', 'X')
Repeat
end else
ErrorMsg = 'Error in ':Service: 'service. Error calling RList. Error code: ':ErrCode
end
end
end else
ErrorMsg = 'Error in ':Service: 'service. WO_LOG ':WorkOrderNo:' does not exist.'
end
end else
ErrorMsg = 'Error in ':Service: 'service. Null WorkOrderNo passed into service.'
end
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
Response = VoidedWaferCount
end service
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@ -35,16 +35,15 @@ Function Wo_API(@API)
10/20/23 xxx Original programmer.
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
Declare function Environment_Services, SRP_Datetime, Logging_Services, Work_Order_Services
Declare Subroutine Btree.Extract, Logging_Services, Http_Services
$insert APP_INSERTS
$insert API_SETUP
$insert HTTP_INSERTS
Declare function Environment_Services, SRP_Datetime, Logging_Services, Work_Order_Services
Declare Subroutine Btree.Extract, Logging_Services, Http_Services
LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS')
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\API\Materials\WO'
@ -55,6 +54,8 @@ LoggingDTM = LogDate : ' ' : LogTime
ResponseCode = ''
ResponseMessage = ''
LogData = ''
Response = ''
GoToAPI else
// The specific resource endpoint doesn't have a API handler yet.
ResponseCode = 204
@ -76,14 +77,6 @@ Return Response OR ''
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
API wo.HEAD
API wo.GET
HTTP_Resource_Services('LoremIpsum')
end api
API wo.ID.HEAD
API wo.ID.GET
@ -91,7 +84,20 @@ API wo.ID.GET
end api
API wo.ID.zpl.HEAD
API wo.ID.zpl.GET
GoSub CreateZPLItem
end api
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CreateHALItem:
ResponseCode = 200
MaterialKey = EndpointSegment
WOLogKey = ''
@ -122,7 +128,7 @@ CreateHALItem:
end
IF WOLogKey NE '' then
JSON = Work_Order_Services('ConvertRecordToJSON', WOLogKey, '', FullEndpointURL)
JSON = Work_Order_Services('ConvertRecordToJSON', WOLogKey, '', FullEndpointURL)
end else
IF ResponseCode NE 500 then
ResponseCode = 406
@ -148,4 +154,32 @@ CreateHALItem:
Message = Error_Services('GetMessage')
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
end
return
//----------------------------------------------------------------------------------------------------------------------
// CreateZPLItem
//
// Creates a HAL+JSON object with the ZPL for the given WM_IN row
//----------------------------------------------------------------------------------------------------------------------
CreateZPLItem:
WoLogKey = ParentSegment
ZPL = Work_Order_Services('GetWoLogZpl', WoLogKey)
If Error_Services('NoError') then
StatusCode = 200
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
HTTP_Services('SetResponseBody', ZPL, False$, 'text/plain')
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
return

View File

@ -616,13 +616,25 @@ WRITE_RECORD:
NewRelDtm = Record<WO_MAT_REL_DTM$>
OrigRecDtm = OrigRecord<WO_MAT_RX_DTM$>
NewRecDtm = Record<WO_MAT_RX_DTM$>
AdjustQty = NewWfrQty - OrigWfrQty
If ( ( (OrigWfrQty NE '' ) and (OrigWfrQty NE NewWfrQty) ) or ( (OrigRecDtm EQ '') and (NewRecDtm NE '') ) ) then
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'UpdateReceivedQty':SD$:WONo)
end
If ( ( (OrigWfrQty NE '') and (OrigWfrQty NE NewWfrQty) ) or ( (OrigRelDtm EQ '') and (NewRelDtm NE '') ) ) then
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'UpdateReleasedQty':SD$:WONo)
end
If ( (OrigWfrQty NE '' ) and (OrigWfrQty NE NewWfrQty) and (OrigRecDtm NE '' and NewRecDtm NE '') ) then
// Cassette already received, but casssette quantity has changed.
If AdjustQty NE 0 then Work_Order_Services('AdjustReceivedQty', WONo, AdjustQty)
end
If ( (OrigRecDtm EQ '') and (NewRecDtm NE '') ) then
// Cassette was just received. Increment received quantity of work order by the entire cassette wafer count.
Work_Order_Services('AdjustReceivedQty', WONo, NewWfrQty)
end
If ( (OrigWfrQty NE '') and (OrigWfrQty NE NewWfrQty) and ( (OrigRelDtm NE '') and (NewRelDtm NE '') ) ) then
// Cassette already released, but casssette quantity has changed.
If AdjustQty NE 0 then Work_Order_Services('AdjustReleasedQty', WONo, AdjustQty)
end
If ( (OrigRelDtm EQ '') and (NewRelDtm NE '') ) then
// Cassette was just released. Increment released quantity of work order by the entire cassette wafer count.
Work_Order_Services('AdjustReleasedQty', WONo, NewWfrQty)
end
If {REACTOR_TYPE} NE 'EPP' then
If {MAKEUP_BOX} then

View File

@ -44,6 +44,7 @@ Declare Subroutine Logging_Services
$insert APP_INSERTS
$insert API_SETUP
$insert HTTP_INSERTS
LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS')
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\API\Materials\WO_MAT'
@ -54,6 +55,8 @@ LoggingDTM = LogDate : ' ' : LogTime
ResponseCode = ''
ResponseMessage = ''
LogData = ''
Response = ''
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.')
@ -67,14 +70,6 @@ Return Response OR ''
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
API wo_mat.HEAD
API wo_mat.GET
HTTP_Resource_Services('LoremIpsum')
end api
API wo_mat.ID.HEAD
API wo_mat.ID.GET
@ -82,6 +77,12 @@ API wo_mat.ID.GET
end api
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CreateHalItem:
ResponseCode = 200
@ -119,4 +120,6 @@ CreateHalItem:
LogData<4> = ResponseCode
LogData<5> = ResponseMessage
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM)
return

View File

@ -182,6 +182,7 @@ WRITE_RECORD_PRE:
Case Record EQ ''
// Unscheduled record write attempt. Block the write and log the event.
// Empty WO_MAT_QA records can cause undesireable issues processing lots.
ErrorMessage = 'Empty WO_MAT_QA profile. Unscheduled record write attempt!'
Error_Services('Add', 'FS104: ':ErrorMessage)
OrigFileError = 104 : @FM : ErrorMessage
@ -200,21 +201,8 @@ WRITE_RECORD_PRE:
LogData<4> = Stack
LogData<5> = CRLF$:RecordSnapshot:CRLF$
LogData<6> = 'FS104: ':ErrorMessage
// Sending a null message will send the LogData instead
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, '', '', '')
// Send an internal OI message to OI admins
Recipients = Xlate('SEC_GROUPS', 'OI_ADMIN', 'USER', 'X')
SentFrom = 'SYSTEM'
Subject = 'Unscheduled WO_MAT_QA record write attempt.'
Message = ErrorMessage
AttachWindow = ''
AttachKey = ''
SendToGroup = ''
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
obj_Notes('Create',Parms)
Status = 0
Record = ''
ActionFlow = ACTION_STOP$

View File

@ -57,6 +57,8 @@ $Insert PRS_LAYER_EQUATES
$Insert PRS_STAGE_EQUATES
$Insert PROD_VER_EQUATES
$Insert QA_MET_EQUATES ;* Used in GetQAMet data structure return variable
$Insert RDS_EQUATES
$Insert WO_REACT_EQUATES
Declare function Database_Services, SRP_JSON, Error_Services, obj_Prod_Spec, Wo_Mat_Qa_Services
Declare subroutine Database_Services, SRP_JSON, Error_Services
@ -192,130 +194,168 @@ End Service
Service UpdateQAMet(WOMatKey)
WOMatQARec = ''
ErrorMsg = ''
If (WOMatKey NE '') then
WONo = Field(WOMatKey, '*', 1)
CassNo = Field(WOMatKey, '*', 2)
* * * * * * * * Build QA_MET profile - Work Order scheduled only * * * * * * * *
WOStepKeys = XLATE('WO_LOG', WONo, WO_LOG_WO_STEP_KEY$, 'X')
StepCnt = DCount(WOStepKeys,@VM)
EpiProPSNo = ''
EpiProPSRec = ''
MetLine = 1
// Get original WO_MAT_QA record to copy any test results
OrigWOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatKey)
OrigQAStages = OrigWOMatQARec<WO_MAT_QA_STAGE$>
OrigQAProfiles = OrigWOMatQARec<WO_MAT_QA_PROFILE$>
OrigQASlots = OrigWOMatQARec<WO_MAT_QA_SLOT$>
OrigQASlotTests = OrigWOMatQARec<WO_MAT_QA_SLOT_TEST$>
OrigQAResults = OrigWOMatQARec<WO_MAT_QA_RESULT$>
OrigQASigs = OrigWOMatQARec<WO_MAT_QA_SIG$>
OrigQASigDtms = OrigWOMatQARec<WO_MAT_QA_SIG_DTM$>
OrigQAStdResults = OrigWOMatQARec<WO_MAT_QA_STD_RESULT$>
OrigQADataPoints = OrigWOMatQARec<WO_MAT_QA_DATA_POINTS$>
OrigQAMinResults = OrigWOMatQARec<WO_MAT_QA_MIN_RESULT$>
OrigQAMaxResults = OrigWOMatQARec<WO_MAT_QA_MAX_RESULT$>
OrigQARangeResults = OrigWOMatQARec<WO_MAT_QA_RANGE_PCT_RESULT$>
OrigQAEdgeResults = OrigWOMatQARec<WO_MAT_QA_EDGE_MEAN_RESULT$>
OrigQA5mmResults = OrigWOMatQARec<WO_MAT_QA_5MM_PCT_RESULT$>
OrigQAOutOfSpecs = OrigWOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
OrigQAFailReasons = OrigWOMatQARec<WO_MAT_QA_FAIL_REASON$>
* WO_MAT record is used to check for pre-existing signatures jch 6/7/2015
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
FOR WOStepNo = 1 TO StepCnt
PSNo = XLATE('WO_STEP', WOStepKeys<1,WOStepNo>, WO_STEP_PROD_SPEC_ID$, 'X')
PSRec = Database_Services('ReadDataRow', 'PROD_SPEC', PSNo)
QAMetData = obj_Prod_Spec('GetQAMet',PSNo:@RM:PSRec)
QAStages = QAMetData<COL$QA_MET_STAGE>
StageCnt = COUNT(QAStages,@VM) + (QAStages NE '')
FOR StageNo = 1 TO StageCnt
Stage = QAMetData<COL$QA_MET_STAGE,StageNo>
MetTest = QAMetData<COL$QA_MET_TEST,StageNo> ;* StageRec<PRS_STAGE_MET_TEST$>
Interval = QAMetData<COL$QA_MET_INTERVAL,StageNo> ;* StageRec<PRS_STAGE_MET_INTERVAL$,StageNo>
Start = QAMetData<COL$QA_MET_START,StageNo> ;* StageRec<PRS_STAGE_MET_START$,StageNo>
ReactSched = QAMetData<COL$QA_MET_REACT_SCHED,StageNo> ;* StageRec<PRS_STAGE_MET_REACT_SCHED$,StageNo>
TestFlag = 0
IF Interval NE '' AND Start NE '' THEN
IF Interval = Start THEN
IF REM(CassNo,Interval) = 0 THEN TestFlag = 1
END ELSE
IF ABS((Start + INT(CassNo/Interval)*Interval) - CassNo) = 0 THEN TestFlag = 1
END
IF TestFlag AND NOT(ReactSched) THEN
WOMatQARec<WO_MAT_QA_PROFILE$,MetLine> = WOStepNo:QAMetData<COL$QA_MET_TEST,StageNo> ;* StageRec<PRS_STAGE_MET_TEST$,N>
WOMatQARec<WO_MAT_QA_PROP$,MetLine> = QAMetData<COL$QA_MET_PROP,StageNo> ;* StageRec<PRS_STAGE_MET_PROP$,N>
WOMatQARec<WO_MAT_QA_TOOL_CLASS$,MetLine> = QAMetData<COL$QA_MET_TOOL_CLASS,StageNo> ;* StageRec<PRS_STAGE_MET_TOOL_CLASS$,N>
WOMatQARec<WO_MAT_QA_STAGE$,MetLine> = QAMetData<COL$QA_MET_STAGE,StageNo>
WOMatQARec<WO_MAT_QA_MIN$,MetLine> = QAMetData<COL$QA_MET_MIN,StageNo> ;* StageRec<PRS_STAGE_MET_MIN$,N>
WOMatQARec<WO_MAT_QA_MAX$,MetLine> = QAMetData<COL$QA_MET_MAX,StageNo> ;* StageRec<PRS_STAGE_MET_MAX$,N>
WOMatQARec<WO_MAT_QA_SLOT$,MetLine> = QAMetData<COL$QA_MET_SLOT,StageNo> ;* StageRec<PRS_STAGE_MET_SLOT$,N>
WOMatQARec<WO_MAT_QA_RECIPE$,MetLine> = QAMetData<COL$QA_MET_RECIPE,StageNo> ;* StageRec<PRS_STAGE_MET_RECIPE$,N>
WOMatQARec<WO_MAT_QA_RECIPE_PATTERN$,MetLine> = QAMetData<COL$QA_MET_RECIPE_PATTERN,StageNo> ;* StageRec<PRS_STAGE_MET_RECIPE_PATTERN$,StageNo>
WOMatQARec<WO_MAT_QA_WFR_QTY$,MetLine> = QAMetData<COL$QA_MET_WFR_QTY,StageNo> ;* StageRec<PRS_STAGE_MET_WFR_QTY$,StageNo>
WOMatQARec<WO_MAT_QA_WFR_TYPE$,MetLine> = QAMetData<COL$QA_MET_WFR_TYPE,StageNo> ;* StageRec<PRS_STAGE_MET_WFR_TYPE$,StageNo>
WOMatQARec<WO_MAT_QA_REACT_SCHED$,MetLine> = ReactSched ;* StageRec<PRS_STAGE_MET_REACT_SCHED$,StageNo>
WOMatQARec<WO_MAT_QA_SHIP_DOC$,MetLine> = QAMetData<COL$QA_MET_SHIP_DOC,StageNo> ;* StageRec<PRS_STAGE_MET_SHIP_DOC$,StageNo>
WOMatQARec<WO_MAT_QA_PHASE_MIN$,MetLine> = QAMetData<COL$QA_MET_PHASE_MIN,StageNo>
If OrigWOMatQARec NE '' then
CurrStage = QAMetData<COL$QA_MET_STAGE,StageNo>
CurrProfile = WOStepNo:QAMetData<COL$QA_MET_TEST,StageNo>
CurrSlot = QAMetData<COL$QA_MET_SLOT,StageNo>
// Copy any existing results from the original WO_MAT_QA record.
If OrigQAStages NE '' then
Found = False$
For each OrigQAStage in OrigQAStages using @VM setting sPos
OrigQAProfile = OrigQAProfiles<0, sPos>
OrigQASlot = OrigQASlots<0, sPos>
If ( (CurrStage EQ OrigQAStage) and (CurrProfile EQ OrigQAProfile) and (CurrSlot EQ OrigQASlot) ) then
Found = True$
WOMatQARec<WO_MAT_QA_SLOT_TEST$,MetLine> = OrigQASlotTests<0, sPos>
WOMatQARec<WO_MAT_QA_RESULT$,MetLine> = OrigQAResults<0, sPos>
WOMatQARec<WO_MAT_QA_SIG$,MetLine> = OrigQASigs<0, sPos>
WOMatQARec<WO_MAT_QA_SIG_DTM$,MetLine> = OrigQASigDtms<0, sPos>
WOMatQARec<WO_MAT_QA_STD_RESULT$,MetLine> = OrigQAStdResults<0, sPos>
WOMatQARec<WO_MAT_QA_DATA_POINTS$,MetLine> = OrigQADataPoints<0, sPos>
WOMatQARec<WO_MAT_QA_MIN_RESULT$,MetLine> = OrigQAMinResults<0, sPos>
WOMatQARec<WO_MAT_QA_MAX_RESULT$,MetLine> = OrigQAMaxResults<0, sPos>
WOMatQARec<WO_MAT_QA_RANGE_PCT_RESULT$,MetLine> = OrigQARangeResults<0, sPos>
WOMatQARec<WO_MAT_QA_EDGE_MEAN_RESULT$,MetLine> = OrigQAEdgeResults<0, sPos>
WOMatQARec<WO_MAT_QA_5MM_PCT_RESULT$,MetLine> = OrigQA5mmResults<0, sPos>
WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$,MetLine> = OrigQAOutOfSpecs<0, sPos>
WOMatQARec<WO_MAT_QA_FAIL_REASON$,MetLine> = OrigQAFailReasons<0, sPos>
end
Until Found
Next OrigQAStage
end
end
MetLine += 1
END
END
NEXT StageNo
NEXT WOStepNo
Database_Services('WriteDataRow', 'WO_MAT_QA', WONo:'*':CassNo, WOMatQARec)
WONo = Field(WOMatKey, '*', 1)
CassNo = Field(WOMatKey, '*', 2)
RDSNo = Database_Services('ReadDataColumn', 'WO_MAT', WOMatKey, WO_MAT_RDS_NO$)
If Error_Services('NoError') then
If (RDSNo NE '') then
// Check if it has been assigned to a reactor
ReactNo = Database_Services('ReadDataColumn', 'RDS', RDSNo, RDS_REACTOR$)
If Error_Services('HasError') then
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
end
end else
// Either not signed into a reactor yet or this WO_MAT is EpiPro and therefore there is no
// 1-to-1 RDS record. Because of this, reactor scheduled QA met is not possible with EpiPro.
ReactNo = ''
end
If (ErrorMsg EQ '') then
WOStepKeys = Database_Services('ReadDataColumn', 'WO_LOG', WONo, WO_LOG_WO_STEP_KEY$)
If Error_Services('NoError') then
StepCnt = DCount(WOStepKeys,@VM)
MetLine = 1
// Get original WO_MAT_QA record to copy any test results
OrigWOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatKey)
OrigQAStages = OrigWOMatQARec<WO_MAT_QA_STAGE$>
OrigQAProfiles = OrigWOMatQARec<WO_MAT_QA_PROFILE$>
OrigQASlots = OrigWOMatQARec<WO_MAT_QA_SLOT$>
OrigQASlotTests = OrigWOMatQARec<WO_MAT_QA_SLOT_TEST$>
OrigQAResults = OrigWOMatQARec<WO_MAT_QA_RESULT$>
OrigQASigs = OrigWOMatQARec<WO_MAT_QA_SIG$>
OrigQASigDtms = OrigWOMatQARec<WO_MAT_QA_SIG_DTM$>
OrigQAStdResults = OrigWOMatQARec<WO_MAT_QA_STD_RESULT$>
OrigQADataPoints = OrigWOMatQARec<WO_MAT_QA_DATA_POINTS$>
OrigQAMinResults = OrigWOMatQARec<WO_MAT_QA_MIN_RESULT$>
OrigQAMaxResults = OrigWOMatQARec<WO_MAT_QA_MAX_RESULT$>
OrigQARangeResults = OrigWOMatQARec<WO_MAT_QA_RANGE_PCT_RESULT$>
OrigQAEdgeResults = OrigWOMatQARec<WO_MAT_QA_EDGE_MEAN_RESULT$>
OrigQA5mmResults = OrigWOMatQARec<WO_MAT_QA_5MM_PCT_RESULT$>
OrigQAOutOfSpecs = OrigWOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
OrigQAFailReasons = OrigWOMatQARec<WO_MAT_QA_FAIL_REASON$>
FOR WOStepNo = 1 TO StepCnt
PSNo = Database_Services('ReadDataColumn', 'WO_STEP', WOStepKeys<1,WOStepNo>, WO_STEP_PROD_SPEC_ID$)
If Error_Services('NoError') then
PSRec = Database_Services('ReadDataRow', 'PROD_SPEC', PSNo)
If Error_Services('NoError') then
QAMetData = obj_Prod_Spec('GetQAMet',PSNo:@RM:PSRec)
QAStages = QAMetData<COL$QA_MET_STAGE>
StageCnt = DCount(QAStages,@VM)
If (ReactNo NE '') then
WOReactKey = WONo:'*':WOStepNo:'*':ReactNo
end else
WOReactKey = ''
end
If (WOReactKey NE '') then
WOReactRDSNos = Database_Services('ReadDataColumn', 'WO_REACT', WOReactKey, WO_REACT_RDS_NO$)
If Error_Services('HasError') then
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
end
end
If (ErrorMsg EQ '') then
For StageNo = 1 to StageCnt
Stage = QAMetData<COL$QA_MET_STAGE,StageNo>
MetTest = QAMetData<COL$QA_MET_TEST,StageNo> ;* StageRec<PRS_STAGE_MET_TEST$>
Interval = QAMetData<COL$QA_MET_INTERVAL,StageNo> ;* StageRec<PRS_STAGE_MET_INTERVAL$,StageNo>
Start = QAMetData<COL$QA_MET_START,StageNo> ;* StageRec<PRS_STAGE_MET_START$,StageNo>
ReactSched = QAMetData<COL$QA_MET_REACT_SCHED,StageNo> ;* StageRec<PRS_STAGE_MET_REACT_SCHED$,StageNo>
TestFlag = False$
If ( (Interval NE '') and (Start NE '') ) then
// Add Work Order scheduled tests (i.e., not reactor scheduled tests)
If Not(ReactSched) then
If Interval = Start then
If ( Rem(CassNo, Interval) EQ 0 ) then TestFlag = True$
end else
If ( Abs( (Start + Int(CassNo / Interval)*Interval) - CassNo ) EQ 0) then TestFlag = True$
end
end else
Locate RDSNo in WOReactRDSNos using @VM setting TestSeq then
If ( Rem( (TestSeq - Start), Interval) EQ 0 ) then TestFlag = True$
end
end
If TestFlag then
WOMatQARec<WO_MAT_QA_PROFILE$,MetLine> = WOStepNo:MetTest
WOMatQARec<WO_MAT_QA_PROP$,MetLine> = QAMetData<COL$QA_MET_PROP,StageNo>
WOMatQARec<WO_MAT_QA_TOOL_CLASS$,MetLine> = QAMetData<COL$QA_MET_TOOL_CLASS,StageNo>
WOMatQARec<WO_MAT_QA_STAGE$,MetLine> = Stage
WOMatQARec<WO_MAT_QA_MIN$,MetLine> = QAMetData<COL$QA_MET_MIN,StageNo>
WOMatQARec<WO_MAT_QA_MAX$,MetLine> = QAMetData<COL$QA_MET_MAX,StageNo>
WOMatQARec<WO_MAT_QA_SLOT$,MetLine> = QAMetData<COL$QA_MET_SLOT,StageNo>
WOMatQARec<WO_MAT_QA_RECIPE$,MetLine> = QAMetData<COL$QA_MET_RECIPE,StageNo>
WOMatQARec<WO_MAT_QA_RECIPE_PATTERN$,MetLine> = QAMetData<COL$QA_MET_RECIPE_PATTERN,StageNo>
WOMatQARec<WO_MAT_QA_WFR_QTY$,MetLine> = QAMetData<COL$QA_MET_WFR_QTY,StageNo>
WOMatQARec<WO_MAT_QA_WFR_TYPE$,MetLine> = QAMetData<COL$QA_MET_WFR_TYPE,StageNo>
WOMatQARec<WO_MAT_QA_REACT_SCHED$,MetLine> = ReactSched
WOMatQARec<WO_MAT_QA_SHIP_DOC$,MetLine> = QAMetData<COL$QA_MET_SHIP_DOC,StageNo>
WOMatQARec<WO_MAT_QA_PHASE_MIN$,MetLine> = QAMetData<COL$QA_MET_PHASE_MIN,StageNo>
If OrigWOMatQARec NE '' then
CurrStage = QAMetData<COL$QA_MET_STAGE,StageNo>
CurrProfile = WOStepNo:MetTest
CurrSlot = QAMetData<COL$QA_MET_SLOT,StageNo>
// Copy any existing results from the original WO_MAT_QA record.
If OrigQAStages NE '' then
Found = False$
For each OrigQAStage in OrigQAStages using @VM setting sPos
OrigQAProfile = OrigQAProfiles<0, sPos>
OrigQASlot = OrigQASlots<0, sPos>
If ( (CurrStage EQ OrigQAStage) and (CurrProfile EQ OrigQAProfile) and (CurrSlot EQ OrigQASlot) ) then
Found = True$
WOMatQARec<WO_MAT_QA_SLOT_TEST$,MetLine> = OrigQASlotTests<0, sPos>
WOMatQARec<WO_MAT_QA_RESULT$,MetLine> = OrigQAResults<0, sPos>
WOMatQARec<WO_MAT_QA_SIG$,MetLine> = OrigQASigs<0, sPos>
WOMatQARec<WO_MAT_QA_SIG_DTM$,MetLine> = OrigQASigDtms<0, sPos>
WOMatQARec<WO_MAT_QA_STD_RESULT$,MetLine> = OrigQAStdResults<0, sPos>
WOMatQARec<WO_MAT_QA_DATA_POINTS$,MetLine> = OrigQADataPoints<0, sPos>
WOMatQARec<WO_MAT_QA_MIN_RESULT$,MetLine> = OrigQAMinResults<0, sPos>
WOMatQARec<WO_MAT_QA_MAX_RESULT$,MetLine> = OrigQAMaxResults<0, sPos>
WOMatQARec<WO_MAT_QA_RANGE_PCT_RESULT$,MetLine> = OrigQARangeResults<0, sPos>
WOMatQARec<WO_MAT_QA_EDGE_MEAN_RESULT$,MetLine> = OrigQAEdgeResults<0, sPos>
WOMatQARec<WO_MAT_QA_5MM_PCT_RESULT$,MetLine> = OrigQA5mmResults<0, sPos>
WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$,MetLine> = OrigQAOutOfSpecs<0, sPos>
WOMatQARec<WO_MAT_QA_FAIL_REASON$,MetLine> = OrigQAFailReasons<0, sPos>
end
Until Found
Next OrigQAStage
end
end
MetLine += 1
end
end
Next StageNo
end
end else
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
end
end else
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
end
Until (ErrorMsg NE '')
Next WOStepNo
If (ErrorMsg EQ '') then
Database_Services('WriteDataRow', 'WO_MAT_QA', WONo:'*':CassNo, WOMatQARec)
If Error_Services('HasError') then ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
end
end else
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
end
end
end else
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
end
end else
ErrorMsg = 'Error in ':Service:' service. Null WOMatKey passed in.'
end
If ErrorMsg NE '' then
If (ErrorMsg NE '') then
Error_Services('Add', ErrorMsg)
end else
Response = WOMatQARec
@ -420,36 +460,58 @@ end service
Service GetQAMetComplete(WOMatKey)
ErrorMsg = ''
QAMetComplete = True$
If WOMatKey NE '' then
// Lack of WO_MAT_QA record may not be an error here. Gen5 Products do not have WO_MAT_QA Records
If Rowexists('WO_MAT_QA', WOMatKey) then
Response = ''
QAMetRec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatKey, '', True$, 0, False$)
Stages = QAMetRec<WO_MAT_QA_STAGE$>
Results = QAMetRec<WO_MAT_QA_RESULT$>
StageCount = Count(Stages, @VM)
For I = 1 to StageCount
If Results<1,I> EQ '' then
Response = False$
QAMetRec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatKey, '', True$, 0, False$)
If Error_Services('NoError') then
Stages = QAMetRec<WO_MAT_QA_STAGE$>
Results = QAMetRec<WO_MAT_QA_RESULT$>
StageCount = DCount(Stages, @VM)
QAStagePresent = False$
For I = 1 to StageCount
If Stages<1, I> EQ 'QA' then QAStagePresent = True$
If Results<1,I> EQ '' then
QAMetComplete = False$
end
Until QAMetComplete EQ False$
Next I
If QAMetComplete EQ True$ AND QAStagePresent = True$ then
QAMUMetComplete = WO_Mat_QA_Services('GetMUWaferQAComplete', WOMatKey)
If Error_Services('NoError') then
If Not(QAMUMetComplete) then
QAMetComplete = False$
end
end else
ErrorMsg = Error_Services('GetMessage')
end
end
Until Response EQ False$
Next I
If Response = '' then
Response = Wo_Mat_Qa_Services('GetMUWaferQAComplete', WOMatKey)
end else
ErrorMsg = Error_Services('GetMessage')
end
end else
Response = True$
end
end else
Error_Services('Add', 'Missing WOMatKey parameter.')
ErrorMsg = 'Missing WOMatKey parameter.'
end
If ErrorMsg EQ '' then
Response = QAMetComplete
end else
Response = False$
Error_Services('Add', ErrorMsg)
end
end service
Service GetMUWaferQAComplete(WOMatKey)
ErrorMsg = ''
If WOMatKey NE '' then
Response = True$
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WoMatKey, True$, 0, False$)
@ -487,12 +549,15 @@ Service GetMUWaferQAComplete(WOMatKey)
Next Box
end
end else
Error_Services('Add', 'Failed to open WO_MAT record.')
ErrorMsg = 'Failed to open WO_MAT record.'
end
end else
Error_Services('Add', 'Missing WOMatKey parameter.')
ErrorMsg = 'Missing WOMatKey parameter.'
end
If ErrorMsg NE '' then
Error_Services('Add', ErrorMsg)
end
end service

View File

@ -55,7 +55,7 @@ $Insert SERVICE_SETUP
$Insert DICT_EQUATES
Declare function Database_Services, Error_Services, SRP_Json, SRP_Com, Environment_Services, Logging_Services
Declare function Datetime, Rds_Services, GetTickCount, SRP_Array
Declare function Datetime, Rds_Services, GetTickCount, SRP_Array, Date_Services
Declare subroutine Error_Services, SRP_Json, SRP_Com, Wo_Mat_Services, Database_Services, Logging_Services
Declare subroutine obj_wo_mat_log, Set_Status, Rds_Services, Signature_Services, Mona_Services, Btree.Extract
Declare subroutine Transaction_Services
@ -86,6 +86,7 @@ Return Response or ""
//-----------------------------------------------------------------------------
Service ConvertRecordToJSON(WOMatKey, Record, ItemURL)
jsonRecord = ''
IF WOMatKey NE '' then
If Record EQ '' then Record = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
@ -290,6 +291,50 @@ Service ConvertRecordToJSON(WOMatKey, Record, ItemURL)
End Service
Service ConvertRecordToJsonOIWizard(WOMatKey, WOMatRec)
Json = ''
If WOMatKey NE '' then
If WOMatRec EQ '' then WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
If Error_Services('NoError') then
objJSON = ''
If SRP_JSON(objJSON, 'New', 'Object') then
objWOMat = ''
If SRP_JSON(objWOMat, 'New', 'Object') then
SRP_JSON(objWOMat, 'SetValue', 'KeyId', WOMatKey)
SRP_JSON(objWOMat, 'SetValue', 'CassNo', Field(WOMatKey, '*', 2, 1))
SRP_JSON(objWOMat, 'SetValue', 'SAPBatchNo', WOMatRec<WO_MAT_SAP_BATCH_NO$>)
SRP_JSON(objWOMat, 'SetValue', 'SAPTXDtm', Date_Services('ConvertDateTimeToISO8601', WOMatRec<WO_MAT_SAP_TX_DTM$>))
SRP_JSON(objWOMat, 'SetValue', 'RDSNo', WOMatRec<WO_MAT_RDS_NO$>)
SRP_JSON(objWOMat, 'SetValue', 'ShipNo', WOMatRec<WO_MAT_SHIP_NO$>)
SRP_JSON(objWOMat, 'SetValue', 'LotNo', WOMatRec<WO_MAT_LOT_NO$>)
SRP_JSON(objWOMat, 'SetValue', 'Qty', WOMatRec<WO_MAT_WAFER_QTY$>)
SRP_JSON(objWOMat, 'SetValue', 'CustPartNo', WOMatRec<WO_MAT_CUST_PART_NO$>)
SRP_JSON(objWOMat, 'SetValue', 'SubPartNo', WOMatRec<WO_MAT_SUB_PART_NO$>)
SRP_JSON(objWOMat, 'SetValue', 'VendorCd', WOMatRec<WO_MAT_SUB_VEND_CD$>)
SRP_JSON(objWOMat, 'SetValue', 'RecDtm', Date_Services('ConvertDateTimeToISO8601', WOMatRec<WO_MAT_RX_DTM$>))
SRP_JSON(objWOMat, 'SetValue', 'RelDtm', Date_Services('ConvertDateTimeToISO8601', WOMatRec<WO_MAT_REL_DTM$>))
SRP_JSON(objWOMat, 'SetValue', 'RecUser', OConv(WOMatRec<WO_MAT_RX_BY$>, '[XLATE_CONV,LSL_USERS*FIRST_LAST]'))
SRP_JSON(objWOMat, 'SetValue', 'RelUser', OConv(WOMatRec<WO_MAT_REL_BY$>, '[XLATE_CONV,LSL_USERS*FIRST_LAST]' ))
SRP_JSON(objJSON, 'Set', 'WO_Mat', objWOMat)
SRP_JSON(objWOMat, 'Release')
Json = SRP_JSON(objJSON, 'Stringify', 'Fast')
end else
Error_Services('Add', 'Unable to create JSON representation in the ' : Service : ' service.')
end
SRP_JSON(objJSON, 'Release')
end else
Error_Services('Add', 'Unable to create JSON representation in the ' : Service : ' service.')
end
end
end else
Error_Services('Add', 'KeyID argument was missing in the ' : Service : ' service.')
end
Response = Json
end service
//----------------------------------------------------------------------------------------------------------------------
// GetWaferMap
//
@ -447,37 +492,43 @@ Service CassetteIsLastInWo(WoMatKey)
IsLastInWo = False$
ErrMsg = ''
If Unassigned(WoMatKey) or WoMatKey EQ '' or RowExists('WO_MAT', WoMatKey) NE True$ then
Error_Services('Add', 'invalid WO_MAT key')
ErrMsg = 'invalid WO_MAT key'
end
WO = Field(WoMatKey, '*', 1)
If WO EQ '' then
Error_Services('Add', 'WO# not found in WO_MAT record')
ErrMsg = 'WO# not found in WO_MAT record'
end
If Error_Services('NoError') and Num(WO) EQ False$ then
Error_Services('Add', 'WO# is not numeric')
If ErrMsg EQ '' and Num(WO) EQ False$ then
ErrMsg = 'WO# is not numeric'
end
CassNo = Field(WoMatKey, '*', 2)
If Error_Services('NoError') and CassNo EQ '' then
Error_Services('Add', 'Cassette# not found in WO_MAT record')
If ErrMsg EQ '' and CassNo EQ '' then
ErrMsg = 'Cassette# not found in WO_MAT record'
end
If Error_Services('NoError') and Num(CassNo) EQ False$ then
Error_Services('Add', 'Cassette# is not numeric')
If ErrMsg EQ '' and Num(CassNo) EQ False$ then
ErrMsg = 'Cassette# is not numeric'
end
If Error_Services('NoError') then
If ErrMsg EQ '' then
WoMatKeys = Xlate('WO_LOG', WO, WO_LOG_WO_MAT_KEY$, 'X')
If Error_Services('NoError') and WoMatKeys NE '' then
If WoMatKeys NE '' then
TotalCassettes = DCount(WoMatKeys, @VM)
IsLastInWo = TotalCassettes EQ CassNo
end else
ErrMsg = 'WO_MAT keys not found in WO_LOG for WO ':WO
end
end
If Error_Services('HasError') then
ErrMsg = Error_Services('GetMessage')
Response = IsLastInWo
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
If ErrMsg NE '' then
LogData = ''
LogData<1> = LoggingDtm
LogData<2> = WOMatKey
@ -488,11 +539,6 @@ Service CassetteIsLastInWo(WoMatKey)
Error_Services('Add', ErrMsg)
end
Response = IsLastInWo
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
@ -546,34 +592,49 @@ Service SetWoMatVoidFlag(WoMatKey, Username)
end service
Service MakeupFlagOn(RDSNo)
Service MakeupFlagOn(WOMatKey)
EpiCheck = Rds_Services('IsEpiPro', RDSNo)
BioRadDown = False$
Bio4Down = False$
Bio5Down = False$
Bio4LogKey = Xlate('TOOL', 'BIORAD4', 'CURR_MODE_KEY', 'X')
Bio5LogKey = Xlate('TOOL', 'BIORAD5', 'CURR_MODE_KEY', 'X')
Bio4Mode = Xlate('TOOL_LOG', Bio4LogKey, 'TOOL_MODE', 'X')
Bio5Mode = Xlate('TOOL_LOG', Bio5LogKey, 'TOOL_MODE', 'X')
If (Bio4Mode NE 'PROD') AND (Bio4Mode NE 'LIM') then Bio4Down = True$
If (Bio5Mode NE 'PROD') AND (Bio5Mode NE 'LIM') then Bio5Down = True$
If (Bio4Down) AND (Bio5Down) then BioRadDown = True$
If EpiCheck EQ False$ then
WOMatKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X')
WOMatQARec = XLATE('WO_MAT_QA',WOMatKey,'','X')
PropRow = WOMatQARec<3>
If (Count(PropRow, 'THICK') NE 0) AND (BioRadDown EQ False$) then
CurrentStage = Rds_Services('GetCurrentStage', RDSNo)
If CurrentStage EQ 'COMP' then
Signature_Services('UnsignFQAStage', RDSNo)
end
Rds_Services('ApplyQA100PercentADE', RDSNo)
end
end
ErrorMsg = ''
If (WOMatKey NE '') then
If RowExists('WO_MAT', WOMatKey) then
RDSNo = Database_Services('ReadDataColumn', 'WO_MAT', WOMatKey, WO_MAT_RDS_NO$)
If Error_Services('NoError') then
EpiCheck = Rds_Services('IsEpiPro', RDSNo)
BioRadDown = False$
Bio4Down = False$
Bio5Down = False$
Bio4LogKey = Xlate('TOOL', 'BIORAD4', 'CURR_MODE_KEY', 'X')
Bio5LogKey = Xlate('TOOL', 'BIORAD5', 'CURR_MODE_KEY', 'X')
Bio4Mode = Xlate('TOOL_LOG', Bio4LogKey, 'TOOL_MODE', 'X')
Bio5Mode = Xlate('TOOL_LOG', Bio5LogKey, 'TOOL_MODE', 'X')
If (Bio4Mode NE 'PROD') AND (Bio4Mode NE 'LIM') then Bio4Down = True$
If (Bio5Mode NE 'PROD') AND (Bio5Mode NE 'LIM') then Bio5Down = True$
If (Bio4Down) AND (Bio5Down) then BioRadDown = True$
If EpiCheck EQ False$ then
WOMatKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X')
WOMatQARec = XLATE('WO_MAT_QA',WOMatKey,'','X')
PropRow = WOMatQARec<3>
If (Count(PropRow, 'THICK') NE 0) AND (BioRadDown EQ False$) then
CurrentStage = Rds_Services('GetCurrentStage', RDSNo)
If CurrentStage EQ 'COMP' then
Signature_Services('UnsignFQAStage', RDSNo)
end
Rds_Services('ApplyQA100PercentADE', RDSNo)
end
end
end else
ErrorMsg = 'Error in ':Service:' service. Error reading RDS_NO from WO_MAT record ':WOMatKey:'. '
ErrorMsg := 'Error message: ':Error_Services('GetMessage')
end
end else
ErrorMsg = 'Error in ':Service:' service. WO_MAT record ':WOMatKey:' does not exist.'
end
end else
ErrorMsg = 'Error in ':Service:' service. Null WOMatKey passed into service.'
end
end service
@ -696,4 +757,3 @@ Service VerifyWOLogWOMatKeyColumn(WOMatKey)
end service

View File

@ -242,6 +242,10 @@ Equ API_COLOR_BTNTEXT$ To 18
Equ API_COLOR_INACTIVECAPTIONTEXT$ To 19
Equ API_COLOR_BTNHIGHLIGHT$ To 20
// Edit Line Color Equates
Equ READONLY_GREEN$ TO 192 + (220*256) + (192*65536)
Equ EDIT_ACTIVE_WHITE$ TO 16777215
// Preference Manager
Equ ImagePath$ to Memory_Services('GetValue', 'PM_CURRENT_IMAGE_PATH') : '\'
PMSystemFont = Memory_Services('GetValue', 'PM_SYSTEM_FONT')

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