Compare commits

46 Commits

Author SHA1 Message Date
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
96 changed files with 35939 additions and 13057 deletions

View File

@ -5,7 +5,7 @@
}, },
"body": { "body": {
"record1": { "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": { "body": {
"record1": { "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": { "body": {
"record1": { "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>": {
"<2,1>": { "<2,1>": {
"<2,1,1>": { "<2,1,1>": {
"<2,1,1,1>": "SEND_MESSAGE.MESSAGE_W/ATTACHMENT", "<2,1,1,1>": "UNLOAD/LOAD_EXTRA.SIGNATURE_INFO",
"<2,1,1,2>": "PRINT.CUSTOMER_RDS", "<2,1,1,2>": "PRINT.FACTORY_LABELS",
"<2,1,1,3>": "PRINT.FACTORY_LABELS", "<2,1,1,3>": "PRINT.CUSTOMER_RDS",
"<2,1,1,4>": "UNLOAD/LOAD_EXTRA.SIGNATURE_INFO" "<2,1,1,4>": "SEND_MESSAGE.MESSAGE_W/ATTACHMENT"
} }
}, },
"<2,2>": { "<2,2>": {

View File

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

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

View File

@ -9,7 +9,7 @@
"<2>": "-1", "<2>": "-1",
"<3>": "-1", "<3>": "-1",
"<4>": "-1", "<4>": "-1",
"<5>": "16777215", "<5>": "-2",
"<6>": { "<6>": {
"<6,1>": { "<6,1>": {
"<6,1,1>": "Tahoma", "<6,1,1>": "Tahoma",
@ -49,20 +49,8 @@
"<8,4,2>": " EpiPro" "<8,4,2>": " EpiPro"
}, },
"<8,5>": { "<8,5>": {
"<8,5,1>": "GAN", "<8,5,1>": "STD",
"<8,5,2>": "GaN" "<8,5,2>": "Standard"
},
"<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"
} }
}, },
"<9>": { "<9>": {
@ -108,7 +96,17 @@
"<32>": "0", "<32>": "0",
"<33>": "1", "<33>": "1",
"<34>": "16777215", "<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,1>": "PSV",
"<8,25,2>": "Pre Ship Verification" "<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>": {
"<9,1>": { "<9,1>": {
@ -174,8 +178,18 @@
"<31>": "0", "<31>": "0",
"<32>": "0", "<32>": "0",
"<33>": "0", "<33>": "0",
"<34>": "16777215", "<34>": "-2",
"<35>": "16777215" "<35>": "-2",
"<36>": "",
"<37>": "",
"<38>": "",
"<39>": "",
"<40>": "-2",
"<41>": "1000",
"<42>": "",
"<43>": "",
"<44>": "",
"<45>": ""
} }
} }
} }

View File

@ -9,7 +9,7 @@
"<2>": "-1", "<2>": "-1",
"<3>": "-1", "<3>": "-1",
"<4>": "-1", "<4>": "-1",
"<5>": "16777215", "<5>": "-2",
"<6>": { "<6>": {
"<6,1>": { "<6,1>": {
"<6,1,1>": "Tahoma", "<6,1,1>": "Tahoma",
@ -43,39 +43,19 @@
"<8,2,3>": "High Thruput" "<8,2,3>": "High Thruput"
}, },
"<8,3>": { "<8,3>": {
"<8,3,1>": "4", "<8,3,1>": "5",
"<8,3,2>": "HTR", "<8,3,2>": "HTR",
"<8,3,3>": "High Thruput" "<8,3,3>": "High Thruput"
}, },
"<8,4>": { "<8,4>": {
"<8,4,1>": "5", "<8,4,1>": "8",
"<8,4,2>": "HTR", "<8,4,2>": "EPP",
"<8,4,3>": "High Thruput" "<8,4,3>": "EpiPro"
}, },
"<8,5>": { "<8,5>": {
"<8,5,1>": "8", "<8,5,1>": "18",
"<8,5,2>": "EPP", "<8,5,2>": "EPP",
"<8,5,3>": "EpiPro" "<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>": { "<9>": {
@ -129,7 +109,17 @@
"<32>": "0", "<32>": "0",
"<33>": "1", "<33>": "1",
"<34>": "16777215", "<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", "<2>": "-1",
"<3>": "-1", "<3>": "-1",
"<4>": "-1", "<4>": "-1",
"<5>": "16777215", "<5>": "-2",
"<6>": { "<6>": {
"<6,1>": { "<6,1>": {
"<6,1,1>": "Tahoma", "<6,1,1>": "Tahoma",
@ -33,32 +33,12 @@
"<7>": "", "<7>": "",
"<8>": { "<8>": {
"<8,1>": { "<8,1>": {
"<8,1,1>": "35", "<8,1,1>": "8",
"<8,1,2>": "35 inch EpiPro" "<8,1,2>": "200mm 8 in"
}, },
"<8,2>": { "<8,2>": {
"<8,2,1>": "18", "<8,2,1>": "6",
"<8,2,2>": "18 inch HTR" "<8,2,2>": "150mm 6 in"
},
"<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"
} }
}, },
"<9>": { "<9>": {
@ -104,7 +84,17 @@
"<32>": "0", "<32>": "0",
"<33>": "1", "<33>": "1",
"<34>": "16777215", "<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", "<2>": "-2",
"<3>": "-1", "<3>": "-1",
"<4>": "-1", "<4>": "-1",
"<5>": "16777215", "<5>": "-2",
"<6>": { "<6>": {
"<6,1>": { "<6,1>": {
"<6,1,1>": "MS Sans Serif", "<6,1,1>": "MS Sans Serif",
@ -105,6 +105,10 @@
"<8,19>": { "<8,19>": {
"<8,19,1>": "PACK", "<8,19,1>": "PACK",
"<8,19,2>": "Loaded in PT Out" "<8,19,2>": "Loaded in PT Out"
},
"<8,20>": {
"<8,20,1>": "RTF",
"<8,20,2>": "Return To Fab Active"
} }
}, },
"<9>": { "<9>": {
@ -123,14 +127,6 @@
"<9,2,4>": "C", "<9,2,4>": "C",
"<9,2,5>": "", "<9,2,5>": "",
"<9,2,6>": "Current Status Description" "<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", "<10>": "L",
@ -158,7 +154,17 @@
"<32>": "0", "<32>": "0",
"<33>": "1", "<33>": "1",
"<34>": "16777215", "<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", "<2>": "-2",
"<3>": "-1", "<3>": "-1",
"<4>": "-1", "<4>": "-1",
"<5>": "16777215", "<5>": "-2",
"<6>": { "<6>": {
"<6,1>": { "<6,1>": {
"<6,1,1>": "MS Sans Serif", "<6,1,1>": "MS Sans Serif",
@ -189,6 +189,10 @@
"<8,40>": { "<8,40>": {
"<8,40,1>": "PACK", "<8,40,1>": "PACK",
"<8,40,2>": "Loaded in PT Out" "<8,40,2>": "Loaded in PT Out"
},
"<8,41>": {
"<8,41,1>": "RTF",
"<8,41,2>": "Return To Fab Active"
} }
}, },
"<9>": { "<9>": {
@ -207,14 +211,6 @@
"<9,2,4>": "C", "<9,2,4>": "C",
"<9,2,5>": "", "<9,2,5>": "",
"<9,2,6>": "Current Status Description" "<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", "<10>": "L",
@ -242,7 +238,17 @@
"<32>": "0", "<32>": "0",
"<33>": "1", "<33>": "1",
"<34>": "16777215", "<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 APP_INSERTS
$Insert REVDOTNETEQUATES $Insert REVDOTNETEQUATES
Declare function Logging_Services, Environment_Services, Active_Directory_Services Declare function Logging_Services, Environment_Services, Active_Directory_Services, Database_Services
Declare subroutine Set_Property.Net, Logging_Services, Set_Status, 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' LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\ActiveDirectory'
LogDate = Oconv(Date(), 'D4/') LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS') LogTime = Oconv(Time(), 'MTS')
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ActiveDirectoryAuthLog.csv' LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ActiveDirectoryAuthenticationLog.csv'
Headers = 'Logging DTM' : @FM : 'Username' : @FM : 'Authenticated' Headers = 'Logging DTM' : @FM : 'Username' : @FM : 'Authenticated'
objADAuthLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$) 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' LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ActiveDirectoryLog.csv'
Headers = 'Logging DTM' : @FM : 'Operation' : @FM : 'Message' Headers = 'Logging DTM' : @FM : 'Operation' : @FM : 'Message'
@ -83,12 +88,43 @@ Service AuthenticateUser(Username, Password, Domain)
LogData<1> = LoggingDTM LogData<1> = LoggingDTM
LogData<2> = Username LogData<2> = Username
LogData<3> = Authenticated LogData<3> = Authenticated
Logging_Services('AppendLog', objADAuthLog, LogData, @RM, @FM, False$) Logging_Services('AppendLog', objADAuthenticationLog, LogData, @RM, @FM, False$)
Response = Authenticated Response = Authenticated
end service 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) Service GetADGroups(Username, Domain)
ADGroups = '' ADGroups = ''
@ -143,7 +179,6 @@ Service GetADGroups(Username, Domain)
End Service End Service
Service GetComputerDomain() Service GetComputerDomain()
Domain = '' Domain = ''
@ -166,6 +201,7 @@ Service GetComputerDomain()
end service end service
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
// GetADGroupsByString // GetADGroupsByString
// //
@ -303,8 +339,10 @@ Service GetADGroupsByString(SearchString, Domain=DOMAIN, SearchByDescription=DES
end end
Response = ADGroups Response = ADGroups
end service end service
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
// GetADGroupMembersByGroupDescription // GetADGroupMembersByGroupDescription
// //
@ -319,6 +357,7 @@ end service
// 9/26/2024 - [JRO] Initial Programmer. // 9/26/2024 - [JRO] Initial Programmer.
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
Service GetADGroupMembersByGroupDescription(DescriptionName, Domain=DOMAIN) Service GetADGroupMembersByGroupDescription(DescriptionName, Domain=DOMAIN)
Set_Status(0) Set_Status(0)
ErrMessage = '' ErrMessage = ''
GroupUsers = '' GroupUsers = ''
@ -397,8 +436,10 @@ Service GetADGroupMembersByGroupDescription(DescriptionName, Domain=DOMAIN)
Error_Services('Add', ErrMessage) Error_Services('Add', ErrMessage)
end end
Response = GroupUsers Response = GroupUsers
end service end service
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
// GetADGroupMembersByGroupName // GetADGroupMembersByGroupName
// //
@ -413,6 +454,7 @@ end service
// 9/26/2024 - [JRO] Initial Programmer. // 9/26/2024 - [JRO] Initial Programmer.
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
Service GetADGroupMembersByGroupName(GroupName, Domain=DOMAIN) Service GetADGroupMembersByGroupName(GroupName, Domain=DOMAIN)
Set_Status(0) Set_Status(0)
Users = '' Users = ''
ErrMessage = '' ErrMessage = ''
@ -501,8 +543,10 @@ Service GetADGroupMembersByGroupName(GroupName, Domain=DOMAIN)
Error_Services('Add', ErrMessage) Error_Services('Add', ErrMessage)
end end
Response = Users Response = Users
end service end service
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
// GetADUserAttributes // 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. // First value is the AD User Name, Second value is the Display Name, and third value is the email.
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
Service GetADUserAttributes(Username, Domain=DOMAIN) Service GetADUserAttributes(Username, Domain=DOMAIN)
Set_Status(0) Set_Status(0)
ThisUser = '' ThisUser = ''
ErrMessage = '' ErrMessage = ''
@ -593,5 +638,6 @@ Service GetADUserAttributes(Username, Domain=DOMAIN)
Error_Services('Add', ErrMessage) Error_Services('Add', ErrMessage)
end end
Response = ThisUser Response = ThisUser
end service end service

View File

@ -1,85 +1,261 @@
Compile function Archive_Services(@Service, @Params) Compile function Archive_Services(@Service, @Params)
#pragma precomp SRP_PreCompiler #pragma precomp SRP_PreCompiler
$insert LOGICAL $insert LOGICAL
$insert APP_INSERTS $insert APP_INSERTS
EQU COMMA$ To ',' $Insert WO_LOG_EQUATES
$Insert RDS_EQUATES
Declare subroutine Change_Log_Services, Logging_Services $Insert REACT_RUN_EQUATES
Declare function SRP_Datetime, Logging_Services, Environment_Services, Datetime $Insert RDS_LAYER_EQUATES
$Insert RDS_TEST_EQUATES
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Archive' $Insert ARCHIVE_EQUATES
LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS') EQU COMMA$ To ','
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ArchiveService.csv'
Headers = 'Logging DTM' : @FM : 'Message' : @FM : 'Cutoff Date' Declare subroutine Change_Log_Services, Logging_Services, Error_Services, Database_Services
objLogArchiveService = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$) Declare function SRP_Datetime, Logging_Services, Environment_Services, Datetime
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM Declare function Database_Services, Wo_Mat_Services, Error_Services, RDS_Services
Declare function WM_In_Services, WM_Out_Services
GoToService
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Archive'
Return Response or "" LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS')
//----------------------------------------------------------------------------- LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ArchiveService.csv'
// SERVICES Headers = 'Logging DTM' : @FM : 'Message' : @FM : 'Cutoff Date'
//----------------------------------------------------------------------------- objLogArchiveService = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
Service ArchiveRecords()
Errors = '' GoToService
StatusMessage = 'Starting Archive Script.'
LogData = '' Return Response or ""
LogData<1> = LoggingDTM
LogData<2> = StatusMessage //-----------------------------------------------------------------------------
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM) // SERVICES
//-----------------------------------------------------------------------------
//Archive Change Log Records
GoSub ChangeLogArchive Service ArchiveRecords()
Errors = ''
//Finish StatusMessage = 'Starting Archive Script.'
Locate True$ in Errors using @FM setting ePos then LogData = ''
StatusMessage = 'Archive script complete. Errors detected. Check individual archive logs for more info.' LogData<1> = LoggingDTM
LogData = '' LogData<2> = StatusMessage
LogData<1> = LoggingDTM Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
LogData<2> = StatusMessage
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM) //Archive Change Log Records
end else GoSub ChangeLogArchive
StatusMessage = 'Archive script complete. No errors detected.'
LogData = '' //Finish
LogData<1> = LoggingDTM Locate True$ in Errors using @FM setting ePos then
LogData<2> = StatusMessage StatusMessage = 'Archive script complete. Errors detected. Check individual archive logs for more info.'
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM) LogData = ''
end LogData<1> = LoggingDTM
LogData<2> = StatusMessage
End Service Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
end else
Service DearchiveRecord(Table, ID) StatusMessage = 'Archive script complete. No errors detected.'
LogData = ''
end service LogData<1> = LoggingDTM
LogData<2> = StatusMessage
ChangeLogArchive: Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
StatusMessage = 'Starting Change_Log Archive Script.' end
LogData = ''
LogData<1> = LoggingDTM End Service
LogData<2> = StatusMessage
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM) Service GetWORelatedRecord(WOLogId)
ChangeLogArchiveDate = SRP_Datetime('AddYears', Datetime(), -1)
Change_Log_Services('ArchiveChangeLogRecByDate', ChangeLogArchiveDate) ErrorMsg = ''
If Error_Services('NoError') then If WOLogId NE '' then
StatusMessage = 'Starting Change_Log Archive Script.' If RowExists('WO_LOG', WOLogId) then
LogData = '' WOLogRec = Database_Services('ReadDataRow', 'WO_LOG', WOLogId, True$, 0, False$)
LogData<1> = LoggingDTM If Error_Services('NoError') then
LogData<2> = StatusMessage ArchiveRecordId = 'WO_LOG*' : WOLogId
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM) ArchiveRecord = ''
end else WOMatKeys = Wo_Mat_Services('GetWOMatKeys', WOLogId)
StatusMessage = 'Error in Change_Log Archive Script.' If Error_Services('NoError') then
LogData = '' WOMatQAKeys = WOMatKeys
LogData<1> = LoggingDTM WOStepKey = WOLogRec<WO_LOG_WO_STEP_KEY$>
LogData<2> = StatusMessage WMInKeys = Wm_In_Services('GetWMInKeys', WOLogId)
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM) if Error_Services('NoError') then
Errors<-1> = True$ WMOutKeys = Wm_Out_Services('GetWMOutKeys', WOLogId)
end if Error_Services('NoError') then
return 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: Read:
* * * * * * * * * * * * * *
WMOKey = Get_Property(@WINDOW,'ID') WMOKey = Get_Property(@WINDOW,'ID')
IF RowExists('WM_OUT',WMOKey) THEN IF Not(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
ErrMsg('WM_OUT entries may only be created from the Work Order Release process.') ErrMsg('WM_OUT entries may only be created from the Work Order Release process.')
Send_Event(@WINDOW,'CLEAR') Send_Event(@WINDOW,'CLEAR')
RETURN RETURN
@ -382,11 +376,11 @@ return
* * * * * * * * * * * * * *
WONoLF: WONoLF:
* * * * * * * * * * * * * *
WONo = Get_Property(@WINDOW:'.WO_NO','DEFPROP') 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 IF INDEX(WONo,'.',1) > 0 THEN
CONVERT '.' TO '*' IN WONo CONVERT '.' TO '*' IN WONo
Set_Property(@WINDOW:'.WO_NO','DEFPROP','') Set_Property(@WINDOW:'.WO_NO','DEFPROP','')
obj_AppWindow('LoadFormKeys',@WINDOW:@RM:WONo) obj_AppWindow('LoadFormKeys',@WINDOW:@RM:WONo)
@ -1768,22 +1762,8 @@ AddMakeup:
AvailMU_WMOKeys = '' AvailMU_WMOKeys = ''
UserResp = Response UserResp = Response
MakeupBox = '' MakeupBox = ''
CheckValue = 1
// 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
FieldNo = WO_MAT_EPO_MAKEUP_BOX$ FieldNo = WO_MAT_EPO_MAKEUP_BOX$
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue) ;* Set WMO_MAKEUP flag on WM_OUT obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue) ;* Set WMO_MAKEUP flag on WM_OUT
@ -2000,51 +1980,42 @@ MakeupClick:
End Case End Case
If Not(InvalidRequest) then If Not(InvalidRequest) then
Parms = '' Send_Event(CtrlEnt,'GOTFOCUS')
Parms<1> = WMOKey ; // Cassette to verify wafer count of. OrgMUPart = XLATE('WM_OUT',WMOKey,'MU_PART_NO','X')
Parms<2> = 0 ; // Wafer count adjustment - 0 because converting box. // Log the makeup flag change
Parms<3> = 'MU' ; // Wafer counter tool location LogData = ''
Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms) LogData<1> = LoggingDTM
If Proceed EQ True$ then LogData<2> = WONo:'*':ProcStepNo:'*':CassNo
Send_Event(CtrlEnt,'GOTFOCUS') LogData<3> = CheckValue
OrgMUPart = XLATE('WM_OUT',WMOKey,'MU_PART_NO','X') LogData<4> = @User4
// Log the makeup flag change Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
LogData = ''
LogData<1> = LoggingDTM Send_Event(@WINDOW,'WRITE') ;************* 6/30/2010
LogData<2> = WONo:'*':ProcStepNo:'*':CassNo
LogData<3> = CheckValue FieldNo = WO_MAT_EPO_MAKEUP_BOX$
LogData<4> = @User4
Logging_Services('AppendLog', objLog, LogData, @RM, @FM) obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue)
Send_Event(@WINDOW,'WRITE') ;************* 6/30/2010 IF Get_Status(errCode) THEN ErrMsg(errCode)
FieldNo = WO_MAT_EPO_MAKEUP_BOX$ * Added 10/11/2010 JCH
NewMUPart = XLATE('WM_OUT',WMOKey,'MU_PART_NO','X')
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue) IndexTransactionRow = 'MU_PART_NO':@FM:WMOKey:@FM:OrgMUPart:@FM:NewMUPart:@FM
OPEN "!WM_OUT" TO BangTable THEN
IF Get_Status(errCode) THEN ErrMsg(errCode) LOCK BangTable, 0 THEN
READ PendingTrans FROM BangTable, 0 ELSE PendingTrans = '0':@FM
* Added 10/11/2010 JCH PendingTrans := IndexTransactionRow
NewMUPart = XLATE('WM_OUT',WMOKey,'MU_PART_NO','X') WRITE PendingTrans ON BangTable, 0 ELSE
IndexTransactionRow = 'MU_PART_NO':@FM:WMOKey:@FM:OrgMUPart:@FM:NewMUPart:@FM ErrMsg('Unable to write index transaction to !WM_OUT. ':WMOutKey)
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)
END END
UNLOCK BangTable, 0 ELSE ErrMsg('Unable to Unlock !WM_OUT while adding index transaction. ':WMOutKey)
END ELSE 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
* End of 10/11/2010 update END ELSE
end else ErrMsg('Unable to Open !WM_OUT to add index transaction. ':WMOutKey)
InvalidRequest = True$ END
end * End of 10/11/2010 update
end end
end else end else
InvalidRequest = True$ InvalidRequest = True$

View File

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

View File

@ -811,18 +811,6 @@ AddMakeup:
MakeupBox = '' MakeupBox = ''
// User requested to convert the current cassette into a makeup box. // 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. 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.') ErrMsg('Unable to set makeup flag until Unload stage is signed.')
Return Return
END else END else
Wo_Mat_Services('MakeupFlagOn', RDSNo) Wo_Mat_Services('MakeupFlagOn', WOMatKey)
If Error_Services('HasError') then ErrMsg(Error_Services('GetMessage'))
end end
end end
@ -1066,37 +1055,23 @@ MakeUpLot:
End Case End Case
If Not(InvalidRequest) then If Not(InvalidRequest) then
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
EpiCheck = Rds_Services('IsEpiPro', RDSNo) EpiCheck = Rds_Services('IsEpiPro', RDSNo)
If RDSNo NE '' then obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue)
Parms = '' If EpiCheck EQ False$ then
Parms<1> = RDSNo ; // Cassette to verify wafer count of. IF Get_Status(errCode) THEN
Parms<2> = 0 ; // Wafer count adjustment - 0 because converting box. ErrMsg('Unable to set makeup flag until Unload stage is signed.')
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
InvalidRequest = True$ 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
end else end else
InvalidRequest = True$ Set_Property(@WINDOW,'SAVEWARN', False$)
ErrMsg('WARNING: Error starting wafer counter check. RDS No is missing.') Send_Event(@WINDOW,'CLEAR')
end end
end end
end else end else
@ -1233,7 +1208,3 @@ LogRecord:
return 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) Service WriteDataRow(TableName, KeyID, DataRow, IgnoreSelfLock, IgnoreMFSRoutines, IgnoreAllLocks)
ErrorMsg = ''
If TableName NE '' AND KeyID NE '' then If TableName NE '' AND KeyID NE '' then
If IgnoreSelfLock NE True$ then IgnoreSelfLock = False$ If IgnoreSelfLock NE True$ then IgnoreSelfLock = False$
If IgnoreMFSRoutines NE True$ then IgnoreMFSRoutines = False$ If IgnoreMFSRoutines NE True$ then IgnoreMFSRoutines = False$
@ -943,7 +944,13 @@ Service WriteDataRow(TableName, KeyID, DataRow, IgnoreSelfLock, IgnoreMFSRoutine
end end
end end
If IgnoreAllLocks EQ False$ then If IgnoreAllLocks EQ False$ then
If Error_Services('HasError') then
ErrorMsg = Error_Services('GetMessage')
end
Database_Services('ReleaseKeyIDLock', TableName, KeyID) Database_Services('ReleaseKeyIDLock', TableName, KeyID)
If ErrorMsg NE '' then
Error_Services('Add', ErrorMsg)
end
end end
end else end else
Error_Services('Add', 'Unable to lock ' : KeyID : ' for the ' : TableName : ' table in the ' : Service : ' service.') Error_Services('Add', 'Unable to lock ' : KeyID : ' for the ' : TableName : ' table in the ' : Service : ' service.')
@ -1102,3 +1109,4 @@ end service
// Internal GoSubs // Internal GoSubs
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@ -220,10 +220,17 @@ Service GetWeekNum(InputDate)
end service end service
Service ConvertDateTimeToISO8601(DatetimeToConv) 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]") end service
swap ' ' with 'T' in Response
Service ConvertISO8601ToDateTime(ISO8601Dtm)
Response = IConv(ISO8601Dtm, "[SRP_DATETIME,()YYYY-MM-DD'T'hh:mm:ss.000Z]")
end service 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

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

View File

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

View File

@ -219,6 +219,28 @@ Service GetOnShiftUsers()
end service 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) Service GetShiftByDate(Date, GenerateFlag)
OnShift = ''; *Return Value OnShift = ''; *Return Value
@ -549,3 +571,4 @@ Service UpdateSecurityGroups()
end service end service

View File

@ -1,187 +1,410 @@
Compile function NDW_LOAD_UNLOAD_EXTRA_EVENTS(CtrlEntId, Event, @PARAMS) Compile function NDW_LOAD_UNLOAD_EXTRA_EVENTS(CtrlEntId, Event, @PARAMS)
#pragma precomp SRP_PreCompiler #pragma precomp SRP_PreCompiler
#window NDW_LOAD_UNLOAD_EXTRA #window NDW_LOAD_UNLOAD_EXTRA
Declare subroutine End_Dialog, Post_Event, Database_Services, Error_Services, Msg Declare subroutine End_Dialog, Post_Event, Database_Services, Error_Services, Msg
Declare subroutine Set_Property, Rds_Services Declare subroutine Set_Property, Rds_Services, Set_Status, Rlist, Obj_Post_Log
Declare function Database_Services, Error_Services Declare function Database_Services, Error_Services, Qa_Services, Reactor_Services
Declare function Get_Property Declare function Get_Property, Dialog_Box
$Insert EVENT_SETUP
$Insert EVENT_SETUP $Insert LOGICAL
$Insert LOGICAL $Insert RDS_EQUATES
$Insert RDS_EQUATES $Insert REACT_LL_EQUATES
$Insert REACTOR_EQUATES
GoToEvent Event for CtrlEntId else $Insert MSG_EQUATES
// Event not implemented
end GoToEvent Event for CtrlEntId else
// Event not implemented
Return EventFlow or 1 end
//----------------------------------------------------------------------------- Return EventFlow or 1
// EVENT HANDLERS
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// EVENT HANDLERS
Event WINDOW.CREATE(CreateParam) //-----------------------------------------------------------------------------
ResponseValue = Set_Property(@Window, '@responsevalue', 0)
RDSNo = CreateParam Event WINDOW.CREATE(CreateParam)
If RowExists('RDS', RDSNo) then ResponseValue = Set_Property(@Window, '@responsevalue', 0)
Set_Property(@Window : '.EDL_RDS', 'TEXT', RDSNo) RDSNo = CreateParam
GoSub Refresh If RowExists('RDS', RDSNo) then
end else Set_Property(@Window : '.EDL_RDS', 'TEXT', RDSNo)
ResponseValue = Set_Property(@Window, '@responsevalue', 0) GoSub Refresh
Post_Event(@Window, 'CLOSE') end else
end ResponseValue = Set_Property(@Window, '@responsevalue', 0)
Post_Event(@Window, 'CLOSE')
End Event end
Event WINDOW.CLOSE(CancelFlag) End Event
ResponseValue = Get_Property(@Window, '@responsevalue')
End_Dialog(@Window, ResponseValue) Event WINDOW.CLOSE(CancelFlag)
end event ResponseValue = Get_Property(@Window, '@responsevalue')
End_Dialog(@Window, ResponseValue)
//Signature buttons end event
Event PUB_SIGN_UNLOAD_EX_1.CLICK() //Signature buttons
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
Rds_Services('SignUnloadExtra1', RDSNo, @USER4) Event PUB_SIGN_UNLOAD_EX_1.CLICK()
If Error_Services('NoError') then
Msg(@Window, 'Unload Extra 1 Signed!') RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
end else initParams = ''
Msg(@Window, Error_Services('GetMessage')) initParams<4> = 'Sign Unload Extra 1'
end Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, initParams)
GoSub Refresh Valid = Response<1>
end event
If Valid then
Event PUB_SIGN_LOAD_EX_1.CLICK() Rds_Services('SignUnloadExtra1', RDSNo, @USER4)
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT') If Error_Services('NoError') then
Rds_Services('SignLoadExtra1', RDSNo, @USER4) Msg(@Window, 'Unload Extra 1 Signed!')
If Error_Services('NoError') then end else
Msg(@Window, 'Load Extra 1 Signed!') Msg(@Window, Error_Services('GetMessage'))
end else end
Msg(@Window, Error_Services('GetMessage')) end
end GoSub Refresh
GoSub Refresh end event
end event
Event PUB_SIGN_LOAD_EX_1.CLICK()
Event PUB_SIGN_UNLOAD_EX_2.CLICK()
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT') RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
Rds_Services('SignUnloadExtra2', RDSNo, @USER4) RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
If Error_Services('NoError') then OldReactorNo = RDSRec<RDS_REACTOR$>
Msg(@Window, 'Unload Extra 2 Signed!') NewReactorNo = Get_Property(@Window : '.EDL_REACTOR1', 'TEXT')
end else initParams = ''
Msg(@Window, Error_Services('GetMessage')) initParams<4> = 'Sign Load Extra 1'
end Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, initParams)
GoSub Refresh Valid = Response<1>
end event
If Valid then
Event PUB_SIGN_LOAD_EX_2.CLICK() If Qa_Services('LoadExtra1stReady', RDSNo) AND (OldReactorNo NE NewReactorNo) then
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT') Gosub ReactorChange
Rds_Services('SignLoadExtra2', RDSNo, @USER4) end
If Error_Services('NoError') then
Msg(@Window, 'Load Extra 2 Signed!') If Error_Services('NoError') then
end else Rds_Services('SignLoadExtra1', RDSNo, @USER4)
Msg(@Window, Error_Services('GetMessage')) If Error_Services('NoError') then
end Msg(@Window, 'Load Extra 1 Signed!')
GoSub Refresh end else
end event Msg(@Window, Error_Services('GetMessage'))
end
//Clear Signature Buttons End else
Msg(@Window, Error_Services('GetMessage'))
Event PUB_CLEAR_UNLOAD_EX_1.CLICK() end
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT') end
Rds_Services('UnsignUnloadExtra1', RDSNo, @User4) GoSub Refresh
If Error_Services('NoError') then
Msg(@Window, 'Unload Extra 1 unsigned!') end event
end else
Msg(@Window, Error_Services('GetMessage')) Event PUB_SIGN_UNLOAD_EX_2.CLICK()
end RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
GoSub Refresh initParams = ''
end event initParams<4> = 'Sign Unload Extra 2'
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, initParams)
Event PUB_CLEAR_LOAD_EX_1.CLICK() Valid = Response<1>
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
Rds_Services('UnsignLoadExtra1', RDSNo, @User4) If Valid then
If Error_Services('NoError') then Rds_Services('SignUnloadExtra2', RDSNo, @USER4)
Msg(@Window, 'Load Extra 1 unsigned!') If Error_Services('NoError') then
end else Msg(@Window, 'Unload Extra 2 Signed!')
Msg(@Window, Error_Services('GetMessage')) end else
end Msg(@Window, Error_Services('GetMessage'))
GoSub Refresh end
end event end
GoSub Refresh
Event PUB_CLEAR_UNLOAD_EX_2.CLICK() end event
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
Rds_Services('UnsignUnloadExtra2', RDSNo, @User4) Event PUB_SIGN_LOAD_EX_2.CLICK()
If Error_Services('NoError') then RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
Msg(@Window, 'Unload Extra 2 unsigned!') RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
end else OldReactorNo = RDSRec<RDS_REACTOR$>
Msg(@Window, Error_Services('GetMessage')) NewReactorNo = Get_Property(@Window : '.EDL_REACTOR2', 'TEXT')
end initParams = ''
GoSub Refresh initParams<4> = 'Sign Load Extra 2'
end event Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, initParams)
Valid = Response<1>
Event PUB_CLEAR_LOAD_EX_2.CLICK()
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT') If Valid then
Rds_Services('UnsignLoadExtra2', RDSNo, @User4) If Qa_Services('LoadExtra2ndReady', RDSNo) AND (OldReactorNo NE NewReactorNo) then
If Error_Services('NoError') then Gosub ReactorChange
Msg(@Window, 'Load Extra 2 unsigned!') end
end else
Msg(@Window, Error_Services('GetMessage')) If Error_Services('NoError') then
end Rds_Services('SignLoadExtra2', RDSNo, @USER4)
GoSub Refresh If Error_Services('NoError') then
end event Msg(@Window, 'Load Extra 2 Signed!')
end else
//----------------------------------------------------------------------------- Msg(@Window, Error_Services('GetMessage'))
// INTERNAL GO-SUBS end
//----------------------------------------------------------------------------- End else
Msg(@Window, Error_Services('GetMessage'))
end
*************** end
Refresh:
*************** GoSub Refresh
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT') end event
If RowExists('RDS', RDSNo) then
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) //Clear Signature Buttons
//Unload Extra 1
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$> Event PUB_CLEAR_UNLOAD_EX_1.CLICK()
UnloadExtra1UserFirstLast = xlate( 'LSL_USERS', UnloadExtra1Signature, 'FIRST_LAST', 'X' ) RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
UnloadExtra1Date = OConv(RDSRec<RDS_OP_OUT_EX1_DATE$>, 'D') Rds_Services('UnsignUnloadExtra1', RDSNo, @User4)
UnloadExtra1Time = Oconv(RDSRec<RDS_OP_OUT_EX1_TIME$>, 'MT') If Error_Services('NoError') then
//Load Extra 1 Msg(@Window, 'Unload Extra 1 unsigned!')
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$> end else
LoadExtra1UserFirstLast = xlate( 'LSL_USERS', LoadExtra1Signature, 'FIRST_LAST', 'X' ) Msg(@Window, Error_Services('GetMessage'))
LoadExtra1Date = Oconv(RDSRec<RDS_OP_IN_EX2_DATE$>, 'D') end
LoadExtra1Time = Oconv(RDSRec<RDS_OP_IN_EX2_TIME$>, 'MT') GoSub Refresh
//Unload Extra 2 end event
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
UnloadExtra2UserFirstLast = xlate( 'LSL_USERS', UnloadExtra2Signature, 'FIRST_LAST', 'X' ) Event PUB_CLEAR_LOAD_EX_1.CLICK()
UnloadExtra2Date = Oconv(RDSRec<RDS_OP_OUT_EX2_DATE$>, 'D') RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
UnloadExtra2Time = Oconv(RDSRec<RDS_OP_OUT_EX2_TIME$>, 'MT') Rds_Services('UnsignLoadExtra1', RDSNo, @User4)
//Load Extra 2 If Error_Services('NoError') then
LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$> Msg(@Window, 'Load Extra 1 unsigned!')
LoadExtra2UserFirstLast = xlate( 'LSL_USERS', LoadExtra2Signature, 'FIRST_LAST', 'X' ) end else
LoadExtra2Date = Oconv(RDSRec<RDS_OP_IN_EX3_DATE$>, 'D') Msg(@Window, Error_Services('GetMessage'))
LoadExtra2Time = Oconv(RDSRec<RDS_OP_IN_EX3_TIME$>, 'MT') end
GoSub Refresh
//Populate text fields end event
Set_Property(@Window : '.EDL_UNLOAD_EX_1_USER', 'TEXT', UnloadExtra1UserFirstLast)
Set_Property(@Window : '.EDL_UNLOAD_EX_1_DATE', 'TEXT', UnloadExtra1Date) Event PUB_CLEAR_UNLOAD_EX_2.CLICK()
Set_Property(@Window : '.EDL_UNLOAD_EX_1_TIME', 'TEXT', UnloadExtra1Time) RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
Set_Property(@Window : '.EDL_LOAD_EX_1_USER', 'TEXT', LoadExtra1UserFirstLast) Rds_Services('UnsignUnloadExtra2', RDSNo, @User4)
Set_Property(@Window : '.EDL_LOAD_EX_1_DATE', 'TEXT', LoadExtra1Date) If Error_Services('NoError') then
Set_Property(@Window : '.EDL_LOAD_EX_1_TIME', 'TEXT', LoadExtra1Time) Msg(@Window, 'Unload Extra 2 unsigned!')
Set_Property(@Window : '.EDL_UNLOAD_EX_2_USER', 'TEXT', UnloadExtra2UserFirstLast) end else
Set_Property(@Window : '.EDL_UNLOAD_EX_2_DATE', 'TEXT', UnloadExtra2Date) Msg(@Window, Error_Services('GetMessage'))
Set_Property(@Window : '.EDL_UNLOAD_EX_2_TIME', 'TEXT', UnloadExtra2Time) end
Set_Property(@Window : '.EDL_LOAD_EX_2_USER', 'TEXT', LoadExtra2UserFirstLast) GoSub Refresh
Set_Property(@Window : '.EDL_LOAD_EX_2_DATE', 'TEXT', LoadExtra2Date) end event
Set_Property(@Window : '.EDL_LOAD_EX_2_TIME', 'TEXT', LoadExtra2Time)
end else Event PUB_CLEAR_LOAD_EX_2.CLICK()
ResponseValue = Set_Property(@Window, '@responsevalue', 0) RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
Post_Event(@Window, 'CLOSE') Rds_Services('UnsignLoadExtra2', RDSNo, @User4)
end If Error_Services('NoError') then
Msg(@Window, 'Load Extra 2 unsigned!')
return 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 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 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 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 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 Declare subroutine Notes_Services, Obj_Note_Ptrs, Comm_Note_Ptrs, SRP_Run_Command, PlaceDialog, GetEngineVersion
@ -404,6 +404,16 @@ Event WINDOW.TIMER()
Gosub SetSnoozeButtonState 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_TIME','TEXT','Current Time: ':OCONV( TIME(), 'MTHS' ))
Set_Property(@WINDOW:'.CURRENT_DATE','TEXT','Date: ':OCONV( DATE(), 'D2/' )) Set_Property(@WINDOW:'.CURRENT_DATE','TEXT','Date: ':OCONV( DATE(), 'D2/' ))
If Get_Property(@Window, '@CLOSE') then 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 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 SRP_Show_Window, Send_Message, Set_Property, Database_Services, Material_Track, Report_Services
Declare subroutine PlaceDialog
$Insert EVENT_SETUP $Insert EVENT_SETUP
$Insert LOGICAL $Insert LOGICAL
@ -97,8 +98,7 @@ Event WINDOW.CREATE(CreateParam)
GoSub Setup_OLE_Controls GoSub Setup_OLE_Controls
GoSub EnableGenerateReportButton GoSub EnableGenerateReportButton
FormSize = '' PlaceDialog(-2, -2)
SRP_Show_Window(@Window, '', 'C', 'C', 1, '', False$, False$, FormSize)
End Event End Event
@ -127,7 +127,7 @@ Event PUB_GEN_REPORT.CLICK()
LocationEnabled = Flags<0, vPos> LocationEnabled = Flags<0, vPos>
If LocationEnabled then RptLocations<0, -1> = Location If LocationEnabled then RptLocations<0, -1> = Location
Next Location Next Location
Report_Services('PrintMaterialTrackReport', RptColumns, RptLocations, NoMatFlag, OldReport) Report_Services('PrintMaterialTrackReport', RptColumns, RptLocations, NoMatFlag, OldReport)
end event end event

View File

@ -39,8 +39,6 @@ $Insert POPUP_EQUATES
$Insert NOTIFICATION_EQUATES $Insert NOTIFICATION_EQUATES
$Insert LSL_USERS_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 function Admin_User, Database_Services, Error_Services, Active_Directory_Services, SRP_Array
Declare subroutine PlaceDialog, Error_Services, Database_Services, Btree.Extract, ErrMsg 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$DESC to 2
EQU COL$DATECOMP to 3 EQU COL$DATECOMP to 3
EQU COL$DATEDUE to 4 EQU COL$DATEDUE to 4
EQU COL$LATE to 5 EQU COL$USER to 5
EQU COL$USER to 6
// Update the arguments so that the OpenInsight OLE event will treate the ActiveX event as a native event handler. // Update the arguments so that the OpenInsight OLE event will treate the ActiveX event as a native event handler.
If Event EQ 'OLE' then If Event EQ 'OLE' then
@ -102,7 +101,7 @@ Event PUB_EXPORT_TO_EXCEL.CLICK()
if FilePath NE '' then if FilePath NE '' then
PmHistoryOutput = '' 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 = Get_Property(@Window : '.OLE_HIST_TABLE', "OLE.ARRAY")
PMHistoryArray = SRP_Array('Rotate',PMHistoryArray) PMHistoryArray = SRP_Array('Rotate',PMHistoryArray)
for each DataRow in PmHistoryArray using @FM setting dPos for each DataRow in PmHistoryArray using @FM setting dPos
@ -152,13 +151,10 @@ RunReport:
PMRec = Database_Services('ReadDataRow', 'PM', PMId) PMRec = Database_Services('ReadDataRow', 'PM', PMId)
SchedDtm = SRP_Datetime('Combine', PMRec<PM_SCHED_DT$>, PMRec<PM_SCHED_TM$>) SchedDtm = SRP_Datetime('Combine', PMRec<PM_SCHED_DT$>, PMRec<PM_SCHED_TM$>)
DueByDTM = obj_PM_Spec('LateStart',PMId:@RM:PMSpecRecord) 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$PMID> = PMId
PMHistoryArray<pPos, COL$DESC> = PMDescription PMHistoryArray<pPos, COL$DESC> = PMDescription
PMHistoryArray<pPos, COL$DATECOMP> = OCONV(PMRec<PM_COMP_DTM$>, 'DT') PMHistoryArray<pPos, COL$DATECOMP> = OCONV(PMRec<PM_COMP_DTM$>, 'DT')
PMHistoryArray<pPos, COL$DATEDUE> = OCONV(SchedDtm, '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]') 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 While Msg(@window, MsgUp, pPos, MSGINSTUPDATE$) ; * update the gauge and check if cancel was pressed
Next PMId Next PMId
@ -191,9 +187,9 @@ Setup_OLE_Controls:
EdtTableCtrl = @Window : '.OLE_HIST_TABLE' EdtTableCtrl = @Window : '.OLE_HIST_TABLE'
Set_Property(EdtTableCtrl, 'OLE.Redraw', False$) Set_Property(EdtTableCtrl, 'OLE.Redraw', False$)
//Set up columns //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_Property(EdtTableCtrl, "OLE.TitleList", HeaderTitles); *Set the column titles
//Set the column Sizes //Set the column Sizes
@ -203,7 +199,7 @@ Setup_OLE_Controls:
ColSize<1> = 45 ColSize<1> = 45
Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$PMID:"]", ColSize) Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$PMID:"]", ColSize)
//Column 2 //Column 2
ColSize<1> = 200 ColSize<1> = 250
ColSize<4> = True$ ColSize<4> = True$
Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$DESC:"]", ColSize) Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$DESC:"]", ColSize)
ColSize<4> = False$ ColSize<4> = False$
@ -211,13 +207,10 @@ Setup_OLE_Controls:
ColSize<1> = 120 ColSize<1> = 120
Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$DATECOMP:"]", ColSize) Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$DATECOMP:"]", ColSize)
//Column 4 //Column 4
ColSize<1> = 110 ColSize<1> = 135
Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$DATEDUE:"]", ColSize) Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$DATEDUE:"]", ColSize)
//Column 5 //Column 5
ColSize<1> = 50 ColSize<1> = 185
Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$LATE:"]", ColSize)
//Column 6
ColSize<1> = 160
Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$USER:"]", ColSize) Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$USER:"]", ColSize)
Set_Property(EdtTableCtrl, 'OLE.Border', 'XP Flat') Set_Property(EdtTableCtrl, 'OLE.Border', 'XP Flat')
@ -234,3 +227,4 @@ Setup_OLE_Controls:
return return

View File

@ -39,8 +39,6 @@ $Insert POPUP_EQUATES
$Insert SEC_GROUPS_EQUATES $Insert SEC_GROUPS_EQUATES
$Insert LSL_USERS_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 function Admin_User, Database_Services, Error_Services, Active_Directory_Services, SRP_Array
Declare subroutine PlaceDialog, Error_Services, Database_Services, Btree.Extract, ErrMsg Declare subroutine PlaceDialog, Error_Services, Database_Services, Btree.Extract, ErrMsg
@ -726,3 +724,4 @@ UnlockRec:
return return

View File

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

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 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 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 $INSERT POST_LOG_EQUATES
@ -222,12 +222,44 @@ Post:
IF Get_Status(errCode) THEN IF Get_Status(errCode) THEN
Set_Status(0) Set_Status(0)
obj_Tables('UnlockRec',PlParms)
obj_Tables('UnlockRec',UFParms) Tablename = Field(UFParms, @RM, 1, 1)
ClearSelect CursorVar Key = Field(UFParms, @RM, 2, 1)
// 4/22/19 Added unlock statement to prevent POST_LOG service from locking up Database_Services('ReleaseKeyIDLock', Tablename, Key)
Unlock hSysLists, ServiceKeyID else Null
RETURN 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 END ELSE
obj_Tables('DeleteRec',PlParms) obj_Tables('DeleteRec',PlParms)
END END

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 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 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 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 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 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 '') RDSCnt = COUNT(RDSNos,@VM) + (RDSNos NE '')
FOR R = 1 TO RDSCnt 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') NCRStatuses = XLATE('NCR',RDSRec<RDS_NCR_KEYS$>,7,'X')
IF INDEX(NCRStatuses,'O',1) THEN IF INDEX(NCRStatuses,'O',1) THEN
@ -1242,3 +1250,4 @@ CalcThickTarget:
RETURN 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 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 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$> InstRINos = ReactorLogRec<REACTOR_LOG_INST_RI_NO$>
CurrRINos = XLATE('REACTOR_LOG', RLNo, 'CURR_RI_NO', 'X') 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 //Check to make sure that everything is valid before adding or removing anything
ValidationFailureReason = '' ValidationFailureReason = ''
for each InstRINo in InstRINos using @VM for each InstRINo in InstRINos using @VM
@ -125,6 +125,23 @@ PostReactItems:
If InstRIRec<REACT_ITEM_RETIRE_DT$> NE '' then If InstRIRec<REACT_ITEM_RETIRE_DT$> NE '' then
ValidationFailureReason = 'Unable to install Reactor Item No. ' : InstRINo : ' because its status is retired!' ValidationFailureReason = 'Unable to install Reactor Item No. ' : InstRINo : ' because its status is retired!'
end 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 '' Until ValidationFailureReason NE ''
Next InstRINo Next InstRINo
@ -147,9 +164,17 @@ PostReactItems:
obj_React_Item_Hist('Install',oriParms) obj_React_Item_Hist('Install',oriParms)
IF Get_Status(errCode) THEN IF Not(Get_Status(errCode)) THEN
RIKey = InstRINos<1,I>
END 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 END ;* End of LOCATE check for Install RI number already in the reactor
NEXT I 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 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 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 APP_INSERTS
$INSERT REACT_RUN_EQUATES $INSERT REACT_RUN_EQUATES
@ -262,6 +263,13 @@ END
LSKeys = ReactRunRec<REACT_RUN_RDS_LAYER_KEYS$> 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 MetOutOfSpec = SUM(XLATE('RDS_LAYER',LSKeys,'TEST_OUT_OF_SPEC','X')) ;* Updated for Metrology update 4/16/2006 JCH
IF MetOutOfSpec > 0 THEN IF MetOutOfSpec > 0 THEN
@ -2278,3 +2286,4 @@ END
RETURN RETURN

View File

@ -205,8 +205,6 @@ WriteRec:
IF TestRec = '' THEN IF TestRec = '' THEN
DELETE TableVar,TableKey ELSE Null 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 END ELSE
Set_Status(0) Set_Status(0)
rv = Get_Status(errCode) rv = Get_Status(errCode)
@ -215,7 +213,6 @@ WriteRec:
END ELSE END ELSE
ErrorMsg = 'Unable to write ':QUOTE(TableKey):' on ':QUOTE(TableName):' table.' ErrorMsg = 'Unable to write ':QUOTE(TableKey):' on ':QUOTE(TableName):' table.'
END END
END END
If ( (TableName NE '') and (TableKey NE '') ) then If ( (TableName NE '') and (TableKey NE '') ) then
@ -235,20 +232,9 @@ WriteRec:
LogData<7> = 'Record self locked: ':Database_Services('IsKeyIDSelfLocked', TableName, TableKey) LogData<7> = 'Record self locked: ':Database_Services('IsKeyIDSelfLocked', TableName, TableKey)
LogData<9> = 'Call stack: ':RetStack() LogData<9> = 'Call stack: ':RetStack()
Logging_Services('AppendLog', objLog, LogData, @RM, @FM) 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
end end
END END
RETURN 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 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 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 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 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 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') CurrLocation = XLATE('WO_MAT',WOMatKey,'CURR_LOCATION','X')
END END
IF WOMatRec<WO_MAT_HOLD$> = 1 AND WOMatRec<WO_MAT_HOLD_ENTITY$,1> = 'WM_OUT' THEN IF WOMatRec<WO_MAT_HOLD$> = 1 AND WOMatRec<WO_MAT_HOLD_ENTITY$,1> = 'WM_OUT' THEN
Result = 'HOLD' ;* Box is on Hold Result = 'HOLD' ;* Box is on Hold
RETURN RETURN
END 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 IF WMOutRec<WM_OUT_SHIP_NO$> NE '' THEN
Result = 'SHIP' Result = 'SHIP'
@ -646,7 +652,12 @@ NextOpenSlots:
IsMULot = WMOutRec EQ True$ IsMULot = WMOutRec EQ True$
IsFQASigned = WMOutRec<WM_OUT_SUP_VER_SIG$> NE '' IsFQASigned = WMOutRec<WM_OUT_SUP_VER_SIG$> NE ''
IsVoided = WMOutRec<WM_OUT_VOID$> 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 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 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 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 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 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 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 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_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 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 RETURN
END 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 IF WOMatRec<WO_MAT_SHIP_NO$> NE '' THEN
Result = 'SHIP' Result = 'SHIP'
RETURN RETURN
END 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 '') 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$> WMIStatus = WOMatRec<WO_MAT_WMI_CURR_STATUS$>
WMOStatus = WOMatRec<WO_MAT_WMO_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) WMOStatus = obj_WO_Mat('CurrStatus',WOMatKey:@RM:WOMatRec)
END END
@ -5714,3 +5736,5 @@ ExpCOA:
RETURN RETURN

View File

@ -117,11 +117,24 @@ API oiwizard.POST
ParseResponse = SRP_JSON(hWizardJSON, 'PARSE', WizardJSON) ParseResponse = SRP_JSON(hWizardJSON, 'PARSE', WizardJSON)
If (ParseResponse EQ '') then If (ParseResponse EQ '') then
// Validate credentials and create a new session // Validate credentials and create a new session
UserID = SRP_JSON(hWizardJSON, 'GetValue', 'userID') UserID = SRP_JSON(hWizardJSON, 'GetValue', 'userID')
Password = SRP_JSON(hWizardJSON, 'GetValue', 'password') Password = SRP_JSON(hWizardJSON, 'GetValue', 'password')
ADUsername = SRP_JSON(hWizardJSON, 'GetValue', 'adUsername')
SRP_JSON(hWizardJSON, 'Release') SRP_JSON(hWizardJSON, 'Release')
Authenticated = Active_Directory_Services('AuthenticateUser', UserID, Password, 'Infineon') Domain = 'Infineon'
If Authenticated then 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) LSLUserID = Security_Services('GetLSLUser', UserID)
If LSLUserID NE '' then If LSLUserID NE '' then
OIWizardID = OI_Wizard_Services('CreateWizardID', LSLUserID) OIWizardID = OI_Wizard_Services('CreateWizardID', LSLUserID)
@ -235,3 +248,4 @@ API oiwizard.checkidleoisessionvalid.GET
end end
end api end api

View File

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

View File

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

View File

@ -11,6 +11,7 @@ $insert recipe_layer_info_equ
$insert msg_equates $insert msg_equates
$insert logical $insert logical
$insert shipping_info_equ $insert shipping_info_equ
$insert TOOL_CLASS_EQUATES
equ CrLf$ to char(13):char(10) equ CrLf$ to char(13):char(10)
@ -19,10 +20,10 @@ declare function memberof, scroll_enable
ReturnVar = 0 ReturnVar = 0
declare function set_property, fieldcount, get_property, msg, editcell, send_event, dialog_box declare function set_property, fieldcount, get_property, msg, editcell, send_event, dialog_box
declare subroutine create_note 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 convert ',' to @fm in Branches
locate Branch in Branches using @fm setting Bpos then 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 end else
Void = msg( '', 'Invalid Branch ':Bpos:' passed to prod_spec_comm' ) Void = msg( '', 'Invalid Branch ':Bpos:' passed to prod_spec_comm' )
end end
@ -111,13 +112,24 @@ return
LOAD_TOOL_RECIPE: LOAD_TOOL_RECIPE:
Tool = get_property( @window:'.TOOL', 'TEXT' ) Tool = get_property( @window:'.TOOL', 'TEXT' )
convert @lower_case to @upper_case in Tool 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 convert @vm to @fm in RecipeList
if RecipeList <> '' then if RecipeList <> '' then
Void = set_property( @window:'.RECIPE', 'LIST', RecipeList ) Void = set_property( @window:'.RECIPE', 'LIST', RecipeList )
end end
return 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: SURFSCAN_CLICK:
CtrlToUse = get_property( @window, '@SurfScanCtl' ) CtrlToUse = get_property( @window, '@SurfScanCtl' )
if get_property( @window:'.':CtrlToUse, 'CHECK' ) then if get_property( @window:'.':CtrlToUse, 'CHECK' ) then

View File

@ -34,11 +34,12 @@ $Insert QA_MET_EQUATES
$Insert RDS_TEST_EQUATES $Insert RDS_TEST_EQUATES
$Insert RDS_TEST_PROP_EQUATES $Insert RDS_TEST_PROP_EQUATES
$Insert PRS_LAYER_EQU $Insert PRS_LAYER_EQU
$Insert PRS_PROP_EQUATES
Options SpecTypes = 'CLEAN', 'SURFSCAN', 'THICK', 'THICKA', 'RES', 'SRES', 'CRES', 'CONC' 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 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 Declare subroutine Database_Services, Psn_Services, Error_Services, SRP_JSON, Extract_Si_Keys
GoToService else GoToService else
@ -104,6 +105,77 @@ Service GetRecipes(PSNo)
end service 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) Service GetAllMetrologyRecipes(PSNo, GetSurfscan, GetClean, GetRes, GetThick)
Recipes = '' Recipes = ''
@ -1085,6 +1157,22 @@ Service ConvertRecordToJSON(KeyID, Record, ItemURL)
SRP_JSON(objStageArray, 'Release') SRP_JSON(objStageArray, 'Release')
end 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(objJSON, 'Set', 'prodSpec', objProdSpec)
SRP_JSON(objProdSpec, 'Release') SRP_JSON(objProdSpec, 'Release')
end 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 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 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 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 subroutine Transaction_Services
Declare function SRP_Sort_Array, Metrology_Services, obj_RDS_Test, obj_Test_Point_Map, Database_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 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$> PSNo = RDSRec<RDS_PROD_SPEC_ID$>
WOStep = Xlate('RDS', RDSNo, 'WO_STEP', 'X') 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 // Need to update/save RDS record before calling RDS_React_Run
RDSRec<RDS_REACTOR$> = Reactor RDSRec<RDS_REACTOR$> = Reactor
RDSRec<RDS_VERIFY_QTY$> = WaferQty RDSRec<RDS_VERIFY_QTY$> = WaferQty
@ -2013,11 +1997,11 @@ end service
Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOpt) Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOpt)
StartTick = GetTickCount() StartTick = GetTickCount()
MetricName = 'LoadSignatureReady' MetricName = 'LoadSignatureReady'
ErrorMsg = ''
Error_Services('Clear') Error_Services('Clear')
If (RDSNo EQ '') or (Username EQ '') or (WaferQty EQ '') then If (RDSNo EQ '') or (Username EQ '') or (WaferQty EQ '') then
ErrorMessage = 'Process Error: RDSNo, Username, or WaferQty not supplied in the ':Service:' service.' ErrorMsg = 'Process Error: RDSNo, Username, or WaferQty not supplied in the ':Service:' service.'
Error_Services('Set', ErrorMessage) Error_Services('Set', ErrorMsg)
Response = False$ Response = False$
return return
end end
@ -2055,15 +2039,15 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
ReactorCapacity = Reactor_Services('GetReactorAvailChamberCount', Reactor) ReactorCapacity = Reactor_Services('GetReactorAvailChamberCount', Reactor)
If ReactorCapacity LE 0 then If ReactorCapacity LE 0 then
ErrorMessage = 'Process Error: Reactor ' : Reactor : ' does not have the capacity for this lot.' ErrorMsg = 'Process Error: Reactor ' : Reactor : ' does not have the capacity for this lot.'
Error_Services('Set', ErrorMessage) Error_Services('Set', ErrorMsg)
Response = False$ Response = False$
return return
end end
If WaferQty NE SchedQty then If WaferQty NE SchedQty then
ErrorMessage = 'Process Error: Verified wafer quantity does not match the scheduled quantity.' ErrorMsg = 'Process Error: Verified wafer quantity does not match the scheduled quantity.'
Error_Services('Set', ErrorMessage) Error_Services('Set', ErrorMsg)
Response = False$ Response = False$
return return
end 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. // 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') RDSLayerAckReq = Xlate('RDS', RDSNo, 'RDS_LAYER_ACK_REQ', 'X')
If RDSLayerAckReq EQ True$ then If RDSLayerAckReq EQ True$ then
ErrorMessage = 'RDS layer parameters must be reviewed for accuracy and acknowledged before the load operation can be signed.' ErrorMsg = 'RDS layer parameters must be reviewed for accuracy and acknowledged before the load operation can be signed.'
Error_Services('Set', ErrorMessage) Error_Services('Set', ErrorMsg)
Response = False$ Response = False$
return return
end end
@ -2167,9 +2151,9 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
ROTRStatus = ReactorRec<REACTOR_ROTR_STATUS$> ROTRStatus = ReactorRec<REACTOR_ROTR_STATUS$>
If ROTRStatus EQ 'F' then 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.' : 'A lead or supervisor must clear the ROTR load block.'
Error_Services('Set', ErrorMessage) Error_Services('Set', ErrorMsg)
Response = False$ Response = False$
return return
end end
@ -2252,35 +2236,149 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
// Add check for supplement signatures // Add check for supplement signatures
UnacknowledgedSupp = Supplement_Services('UnacknowledgedSupplementCheck', 'RDS', RDSNo, 'LOAD') UnacknowledgedSupp = Supplement_Services('UnacknowledgedSupplementCheck', 'RDS', RDSNo, 'LOAD')
If UnacknowledgedSupp NE FALSE$ then If UnacknowledgedSupp NE FALSE$ then
ErrorMessage = 'The LOAD stage supplements must be acknowledged before the load operation can be signed.' ErrorMsg = 'The LOAD stage supplements must be acknowledged before the load operation can be signed.'
Error_Services('Set', ErrorMessage) Error_Services('Set', ErrorMsg)
Response = False$ Response = False$
return return
end end
If Error_Services('NoError') then EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
If ErrorMsg EQ '' then
Response = True$ Response = True$
end else end else
Response = False$ Response = False$
Error_Services('Add', ErrorMsg)
end end
EndTick = GetTickCount() end service
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
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 end service
Service LoadExtra1stReady(RDSNo) Service LoadExtra1stReady(RDSNo)
ErrorMsg = ''
Response = False$ Response = False$
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$> if Error_Services('NoError') then
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$> StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$> UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$> LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$> UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
StandardUnloadSignature = RDSRec<RDS_OPERATOR_OUT$> LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$>
If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature EQ '' And LoadExtra2Signature EQ ''AND UnloadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then StandardUnloadSignature = RDSRec<RDS_OPERATOR_OUT$>
Response = True$ 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
end service end service
@ -2288,54 +2386,106 @@ end service
Service UnsignLoadExtra1stReady(RDSNo) Service UnsignLoadExtra1stReady(RDSNo)
ErrorMsg = ''
Response = False$ Response = False$
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$> if Error_Services('NoError') then
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$> StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$> UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$> LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$> UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
StandardUnloadSignature = RDSRec<RDS_OPERATOR_OUT$> LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$>
If LoadExtra1Signature NE '' then StandardUnloadSignature = RDSRec<RDS_OPERATOR_OUT$>
If UnloadExtra2Signature EQ '' AND LoadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then If LoadExtra1Signature NE '' then
Response = True$ If UnloadExtra2Signature EQ '' AND LoadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
end Response = True$
end
end
end else
ErrorMsg = Error_Services('GetMessage')
end end
If ErrorMsg NE '' then
Error_Services('Add', ErrorMsg)
end
end service end service
Service LoadExtra2ndReady(RDSNo) Service LoadExtra2ndReady(RDSNo)
ErrorMsg = ''
Response = False$ Response = False$
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$> If Error_Services('NoError') then
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$> StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$> UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$> LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$> UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
StandardUnloadSignature = RDSRec<RDS_OPERATOR_OUT$> LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$>
If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature NE '' AND UnloadExtra2Signature NE '' And LoadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then StandardUnloadSignature = RDSRec<RDS_OPERATOR_OUT$>
Response = True$ 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 end
If ErrorMsg NE '' then
Error_Services('Add', ErrorMsg)
end
end service end service
Service UnsignLoadExtra2ndReady(RDSNo) Service UnsignLoadExtra2ndReady(RDSNo)
ErrorMsg = ''
Response = False$ Response = False$
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$> If Error_Services('NoError') then
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$> StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$> UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$> LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$> UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
StandardUnloadSignature = RDSRec<RDS_OPERATOR_OUT$> LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$>
If LoadExtra2Signature NE '' then StandardUnloadSignature = RDSRec<RDS_OPERATOR_OUT$>
If StandardUnloadSignature EQ '' then If LoadExtra2Signature NE '' then
Response = True$ If StandardUnloadSignature EQ '' then
end Response = True$
end
end
end else
ErrorMsg = Error_Services('GetMessage')
end
If ErrorMsg NE '' then
Error_Services('Add', ErrorMsg)
end end
end service end service
@ -2400,62 +2550,6 @@ Service SignLoadStage(RDSNo, Username, WaferQty, LLSide, ScanEntry)
Response = False$ Response = False$
return return
end 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/' ) SigDt = OCONV( Date(), 'D2/' )
SigTm = OCONV( Time(), 'MTS' ) SigTm = OCONV( Time(), 'MTS' )
@ -3682,6 +3776,52 @@ Service SignFQAStage(RDSNo, Username)
end service 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 // Internal GoSubs
@ -3695,3 +3835,12 @@ ClearCursors:
return 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 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 Rds_Services, SRP_DateTime, SRP_Math, obj_WO_Mat, Lot_Services, SRP_Array
Declare function Lot_Event_Services, GetTickCount, Work_Order_Services 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' LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\RDS'
LogDate = Oconv(Date(), 'D4/') LogDate = Oconv(Date(), 'D4/')
@ -623,6 +624,7 @@ return
WRITE_RECORD_PRE: WRITE_RECORD_PRE:
ErrorMsg = ''
StartTick = GetTickCount() StartTick = GetTickCount()
MetricName = 'WriteRecordPre' MetricName = 'WriteRecordPre'
@ -766,10 +768,10 @@ WRITE_RECORD_PRE:
// Look for UNLOAD_DTM override // Look for UNLOAD_DTM override
Override = Override_Services('GetOverride', 'RDS', RDSNo, 'UNLOAD_DTM') Override = Override_Services('GetOverride', 'RDS', RDSNo, 'UNLOAD_DTM')
Begin Case Begin Case
Case ( (OrigLoadSig NE '') and (OrigReactor NE NewReactor) ) Case ( (OrigTimeOutSig NE '') and (OrigReactor NE NewReactor) )
LogData = '' LogData = ''
LogData<1> = LoggingDTM LogData<1> = LoggingDTM
LogData<2> = @USER4 LogData<2> = @USER4
@ -778,28 +780,11 @@ WRITE_RECORD_PRE:
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$) 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. // 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!') 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 load signature is set!' OrigFileError = 104:': Reactor number cannot be changed or removed once the unload signature is set!'
Status = 0 Status = 0
Record = '' Record = ''
ActionFlow = ACTION_STOP$ 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) | 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) | 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!' LogData<4> = 'Signature datetime is greater than current datetime!'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$) 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!' OrigFileError = 104:': Signature datetime is greater than current datetime!'
Status = 0 Status = 0
Record = '' Record = ''
@ -833,7 +818,7 @@ WRITE_RECORD_PRE:
LogData<4> = 'Signature datetime is less than a previous signature datetime!' LogData<4> = 'Signature datetime is less than a previous signature datetime!'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$) 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!' OrigFileError = 104:': Signature datetime is less than a previous signature datetime!'
Status = 0 Status = 0
Record = '' Record = ''
@ -848,7 +833,7 @@ WRITE_RECORD_PRE:
LogData<4> = 'Cassette runtime exceeds three days!' LogData<4> = 'Cassette runtime exceeds three days!'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$) 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!' OrigFileError = 104:': Cassette runtime exceeds three days!'
Status = 0 Status = 0
Record = '' Record = ''
@ -861,11 +846,16 @@ WRITE_RECORD_PRE:
EndTick = GetTickCount() EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick) Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
If ErrorMsg NE '' then
Error_Services('Add', ErrorMsg)
end
return return
WRITE_RECORD: WRITE_RECORD:
StartTick = GetTickCount() StartTick = GetTickCount()
MetricName = 'WriteRecord' MetricName = 'WriteRecord'
@ -880,6 +870,32 @@ WRITE_RECORD:
OrigDateOut = OrigRecord<RDS_DATE_OUT$> OrigDateOut = OrigRecord<RDS_DATE_OUT$>
NewDateOut = Record<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 If ( ( (OrigDateOut EQ '') and (NewDateOut NE '') ) ) then
// Mark this cassette as processed in the schedule event record // Mark this cassette as processed in the schedule event record
DatetimeOut = {DATETIME_OUT} DatetimeOut = {DATETIME_OUT}
@ -1002,4 +1018,3 @@ Restore_System_Variables:
return return

View File

@ -99,6 +99,13 @@ API rds.ID.PUT
end api end api
API rds.ID.zpl.HEAD
API rds.ID.zpl.GET
GoSub CreateZPLItem
end api
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs // Internal GoSubs
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -128,3 +135,29 @@ CreateHALItem:
end end
return 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 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 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 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 Declare subroutine Lot_Event_Services, Override_Log_Services, Logging_Services
@ -170,7 +168,7 @@ end event
Event PUB_SIGN.CLICK() Event PUB_SIGN.CLICK()
RDSNo = Get_Property(@WINDOW:'.RDS_NO','TEXT') RDSNo = Get_Property(@WINDOW:'.RDS_NO','TEXT')
ReactorType = Get_Property(@WINDOW:'.REACTOR_TYPE','TEXT') ReactorType = Get_Property(@WINDOW:'.REACTOR_TYPE','TEXT')
LoadLockVal = Get_Property(@WINDOW:'.LOAD_LOCK_SIDE_HIDDEN','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') LSIDArray = Get_Property(@WINDOW:'.RDS_LS_ID','ARRAY')
Preauthenticated = FALSE$ Preauthenticated = FALSE$
SignEventType = Get_Property(CtrlEntID, 'TEXT') SignEventType = Get_Property(CtrlEntID, 'TEXT')
WoMatKey = WONo : '*' : CassNo
Begin Case Begin Case
Case SignEventType EQ 'Sign' Case SignEventType EQ 'Sign'
RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP') RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP')
WfrQty = Get_Property(@WINDOW:'.WAFERS_IN','TEXT') WfrQty = Get_Property(@WINDOW:'.WAFERS_IN','TEXT')
LLSide = Get_Property(@Window:'.LOAD_LOCK_SIDE', 'DEFPROP') LLSide = Get_Property(@Window:'.LOAD_LOCK_SIDE', 'DEFPROP')
Reactor = Get_Property(@Window:'.REACTOR', 'TEXT') Reactor = Database_Services('ReadDataColumn', 'RDS', RDSNo, RDS_REACTOR$, True$, 0, False$)
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', Reactor) If Error_Services('NoError') then
ReactorType = ReactorRec<REACTOR_REACT_TYPE$> If Reactor NE '' then
ROTREnabled = Xlate('REACTOR', Reactor, 'ENABLE_ROTR', 'X') ReactorRec = Database_Services('ReadDataRow', 'REACTOR', Reactor)
if Error_Services('NoError') then
// Don't allow tracking in on down reactor ReactorType = ReactorRec<REACTOR_REACT_TYPE$>
ReactorCurrModeKey = Xlate('REACTOR_CHILD_KEY_IDS_NG', Reactor, 1, 'X') ROTREnabled = Xlate('REACTOR', Reactor, 'ENABLE_ROTR', '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.'
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 Override = False$
Case Response EQ 1 UserVerification = ''
Response = True$ ; // User Clicked Override OverrideGroups = 'LEAD':@VM:'SUPERVISOR':@VM:'ENGINEERING':@VM:'ENG_TECH':@VM:'ROTR_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 ReactorIsDown = CurrE10State _NEC 'PRODUCTIVE'
If UserVerification EQ '' then If (ReactorIsDown EQ True$) then
UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups) // Allow override during prove in
If ReactorType EQ 'EPP' then
If RDS_Services('IsEpiProTestRun', RDSNo) then Override = True$
end end
Valid = UserVerification<1>
If Valid EQ True$ then If Override EQ False$ then
// Prompt user for a comment UserMsg = "Reactor down. Override required from a lead or supervisor."
ResponseComment = Dialog_Box('NDW_ADD_COMMENT', @WINDOW) UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups:@FM:'':@FM:UserMsg)
Override = UserVerification<1>
IF ResponseComment<2> NE '' THEN end
// Clear ROTR reactor load block. end
overrideLogTable = 'RDS':@VM:'REACTOR'
overrideLogKey = RDSNo:@VM:Reactor If (ReactorIsDown NE True$) OR (Override EQ True$) then
overrideLogUser = Response<2> If (ReactorType EQ 'ASM+' OR ReactorType EQ 'HTR' OR ReactorType EQ 'ASM') AND (ROTREnabled EQ True$) then
overrideLogComment = ResponseComment<2> ROTRStatus = ReactorRec<REACTOR_ROTR_STATUS$>
overrideLogCategory = 'ROTR_BLOCK' If ROTRStatus EQ 'F' then
overrideLogCause = FailReason FailReason = ReactorRec<REACTOR_ROTR_STATUS_REASON$>
orKey = Override_Log_Services('Create', overrideLogTable, overrideLogKey, overrideLogUser, overrideLogComment, overrideLogCategory, overrideLogCause) 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 Response = Msg(@Window, '', 'RDS_ROTR_OVERRIDE', '', Message)
RDSRec = Xlate('RDS', RDSNo, '', 'X')
RDSRec = Insert(RDSRec, RDS_OVERRIDE_KEYS$, 1, 0, orKey)
ReactorRec<REACTOR_ROTR_STATUS$> = 'P' Begin Case
Case Response EQ 1
rotrStatusReason = ReactorRec<REACTOR_ROTR_STATUS_REASON$> Response = True$ ; // User Clicked Override
ReactorRec<REACTOR_PREVIOUS_ROTR_STATUS_REASON$> = rotrStatusReason Case Response EQ 2
ReactorRec<REACTOR_ROTR_STATUS_REASON$> = '' Response = False$ ; // User Clicked Cancel
Case Response EQ char(27)
ReactorRec<REACTOR_PREVIOUS_ROTR_OVERRIDE_RDS$> = RDSNo Response = False$ ; // User Pressed Escape Key
End Case
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$)
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 end else
//No Comment added. Block Load Signaure PreAuthenticated = TRUE$
Msg(@Window, 'A comment is required to perform an ROTR Block Override', '', '', '') 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 return
end end
end else
// ROTR override not verified. Block load signature.
return
end end
end else
// Block load signature FWIInstAckReq = Xlate('RDS', RDSNo, 'FWI_INST_ACK_REQ', 'X')
return If (FWIInstAckReq EQ True$) then
end Response = RDS_Services('RDSVerifyInst', RDSNo, 'FWI')
end If Response EQ False$ then return
end end
SupplAckReq = Supplement_Services('UnacknowledgedSupplementCheck', 'RDS', RDSNo, 'LOAD') LoadInstAckReq = Xlate('RDS', RDSNo, 'LOAD_INST_ACK_REQ', 'X')
IF (SupplAckReq NE FALSE$) then If (LoadInstAckReq EQ True$) then
Response = Dialog_Box('NDW_RDS_SUPP_SIG', @Window, RDSNo :@FM: 'LOAD' :@FM: FALSE$) Response = RDS_Services('RDSVerifyInst', RDSNo, 'LOAD')
If Response EQ False$ then If Response EQ False$ then return
return end
end else
PreAuthenticated = TRUE$ SupplAckReq = Xlate('RDS', RDSNo, 'SUPPL_ACK_REQ', 'X')
end IF (SupplAckReq EQ True$) then
end Response = Dialog_Box('NDW_RDS_SUPP_SIG', @Window, RDSNo)
If Response EQ False$ then return
end
RDSLayerAckReq = Xlate('RDS', RDSNo, 'RDS_LAYER_ACK_REQ', 'X') //Check if TW Required
If RDSLayerAckReq EQ True$ then 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
ErrorMessage = 'RDS layer parameters must be reviewed for accuracy and acknowledged before the load operation can be signed.' UsingTestWafers = False$
ErrMsg(ErrorMessage) IsTWReqd = RDS_Services('IsTWLoggingReqd', RDSNo)
LayerKeys = Xlate('RDS', RDSNo, 'RDS_LAYER_KEYS', 'X') ExistingTestWafersLogged = Test_Run_Services('GetTestRunKeysByRDS', RdsNo)
// Just display the first layer If ExistingTestWafersLogged NE True$ then
RDSLSID = LayerKeys<0, 1> If Not(IsTWReqd) then
Dialog_Box('RDS_LAYER', @Window, RDSLSID) //Test wafer logging is NOT required here.
If ReactorType NE 'EPP' then
RDSLayerAck = Xlate('RDS', RDSNo, 'RDS_LAYER_ACK', 'X') UsingTestWafers = Msg(@Window, '', 'YESNO', '', 'Test Wafer Usage logging is not required on this load.':@FM:'Are any test wafers loaded?')
If ( (RDSLayerAck EQ False$) or (RDSLayerAck EQ '') ) then If UsingTestWafers EQ True$ then
ErrorMessage = 'RDS layer parameters were not acknowledged. Sign load stage event aborting.' TWLogResult = Dialog_Box('NDW_LOG_TEST_WAFER_USAGE', @Window, RDSNo : @VM : 'STANDARD' : @VM : 'REACTOR' : @VM : Reactor)
ErrMsg(ErrorMessage) If TWLogResult NE True$ then
return ContinueSign = Msg(@Window, '', 'YESNO', '', 'Continue?':@FM:'Test wafer logging was cancelled. Do you wish to continue signing?')
end If Not(ContinueSign) then return
end end
end
FWIInstAckReq = Xlate('RDS', RDSNo, 'FWI_INST_ACK_REQ', 'X') end
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', '')
end else 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 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)
end If ReadyToSign EQ True$ then
If PreAuthenticated EQ FALSE$ then
ReadyToSign = QA_Services('LoadSignatureReady', RDSNo, @User4, WfrQty, LLSide) initParams = ''
If ReadyToSign EQ True$ then initParams<4> = 'Sign Load'
If PreAuthenticated EQ FALSE$ then Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, initParams)
initParams = '' Valid = Response<1>
initParams<4> = 'Sign Load' If (Valid EQ True$) then
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, initParams) QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
Valid = Response<1> end
If (Valid EQ True$) then end else
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide) 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
end else end else
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide) Msg(@Window, "Reactor load signature not allowed on a down reactor.")
end end
end end else
If Error_Services('HasError') then Msg(@Window, "RDS is not assigned to a reactor.")
ErrorMsg = Error_Services('GetMessage')
ErrMsg(ErrorMsg)
end end
end else end else
Msg(@Window, "Reactor load signature not allowed on a down reactor.") ErrorMsg = Error_Services('GetMessage')
Msg(@Window, ErrorMsg)
end end
GoSub OLE_LL_Status GoSub OLE_LL_Status
Set_Property(@Window, 'SAVEWARN', False$) Set_Property(@Window, 'SAVEWARN', False$)
Send_Event(@Window, 'READ') Send_Event(@Window, 'READ')
Case SignEventType EQ 'Unsign' Case SignEventType EQ 'Unsign'
// 1. Check if on hold. If so, then block event and inform user // 1. Check if RDS Load signature is eligible to be set.
WOMatKey = WONo:'*':CassNo IsEligible = QA_Services('UnsignLoadSignatureReady', RDSNo)
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
// 3. Lead/Supervisor/Engineer/EngTech override If IsEligible then
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4 : @FM : 'LEAD' : @VM : 'SUPERVISOR':@VM:'ENGINEER':@VM:'ENG_TECH') // 3. Lead/Supervisor/Engineer/EngTech override
Valid = Response<1> Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4 : @FM : 'LEAD' : @VM : 'SUPERVISOR':@VM:'ENGINEER':@VM:'ENG_TECH')
OverrideUser = Response<2> 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 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 end else
Return 0 ErrorMessage = Error_Services('GetMessage')
end Msg(@Window, ErrorMessage)
end
End Case End Case
Post_Event(@Window, 'READ') Post_Event(@Window, 'READ')
@ -582,7 +569,6 @@ Event LL_R_STATUS.OnClick()
end event end event
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs // Internal GoSubs
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -740,3 +726,6 @@ OLE_LL_Status:
return return

View File

@ -51,8 +51,6 @@ $insert REACT_STATUS_EQUATES
$insert SUPPL_INFO_ARRAY_EQU $insert SUPPL_INFO_ARRAY_EQU
$insert CLEAN_INSP_EQUATES $insert CLEAN_INSP_EQUATES
EQU READONLY_GREEN$ TO 192 + (220*256) + (192*65536)
Equ COL$LOG_FILE to 1 Equ COL$LOG_FILE to 1
Equ COL$LOG_DTM to 2 Equ COL$LOG_DTM to 2
Equ COL$ACTION to 3 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 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 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 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') SubclassInfo = Form_Services('FindSubclassControl')
Subclass = SubclassInfo<1> Subclass = SubclassInfo<1>
@ -95,20 +93,16 @@ Return EventFlow else EVENT_CONTINUE$
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Event WINDOW.CREATE(CreateParam) Event WINDOW.CREATE(CreateParam)
GoSub SetupControls
end event end event
Event WINDOW.READ() Event WINDOW.READ()
// Disable reactor edit line control if the RDS has been loaded.
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT') GoSub SetupControls
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
end event end event
@ -132,6 +126,76 @@ end event
Event PUB_SIGN.CLICK() 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') RDSNo = Get_Property(@Window:'.RDS_NO' ,'DEFPROP')
WfrQty = Get_Property(@Window:'.VERIFY_QTY','TEXT') WfrQty = Get_Property(@Window:'.VERIFY_QTY','TEXT')
Reactor = Get_Property(@Window:'.REACTOR' ,'TEXT') Reactor = Get_Property(@Window:'.REACTOR' ,'TEXT')
@ -156,23 +220,29 @@ Event PUB_SIGN.CLICK()
Valid = Response<1> Valid = Response<1>
If (Valid EQ True$) then If (Valid EQ True$) then
QA_Services('SignPreEpiStage', RDSNo, @USER4, WfrQty, Reactor) QA_Services('SignPreEpiStage', RDSNo, @USER4, WfrQty, Reactor)
end end
end else end else
QA_Services('SignPreEpiStage', RDSNo, @USER4, WfrQty, Reactor) QA_Services('SignPreEpiStage', RDSNo, @USER4, WfrQty, Reactor)
end end
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

@ -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 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 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 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 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 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 WoMatRecord<WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$> = TWLogResult
If TWLogResult NE True$ then If TWLogResult NE True$ then
ErrMsg = 'Unload blocked! You must run a test wafer before signing the unload' 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 end
If ErrMsg NE '' then If ErrMsg NE '' then
Database_Services('WriteDataRow', 'WO_MAT', WoMatKey, WoMatRecord, True$, False$, False$) Database_Services('WriteDataRow', 'WO_MAT', WoMatKey, WoMatRecord, True$, False$, False$)
@ -322,6 +325,8 @@ Event PUB_SIGN.CLICK()
ErrMsg = Error_Services('GetMessage') ErrMsg = Error_Services('GetMessage')
end end
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 end
end else end else
@ -474,3 +479,4 @@ Setup_OLE_Controls:
return return

View File

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

View File

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

View File

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

View File

@ -677,12 +677,93 @@ Service ResetWfrMetric(ReactorNo, MetricType = REACTORMETRIC)
end service 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 // GetReactors
// //
// Returns a JSON formatted array of reactor objects. Reactor number 0 will be ommitted. If the MatchType or MatchSize // 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) 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')) SRP_JSON(objReactor, 'SetValue', 'ArmsCnt', Xlate('REACTOR', ReactorNo, REACTOR_ARMS_WFR_CNT$, 'X'))
// Add Current Run Status (Current Loaded Cassettes) // 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 If LoadedRDS NE '' then
objLoadedRDS = '' objLoadedRDS = ''
If SRP_JSON(objLoadedRDS, 'New', 'Array') then If SRP_JSON(objLoadedRDS, 'New', 'Array') then
For each RDS in LoadedRDS using @VM setting vPos For each RDS in LoadedRDS using @VM setting vPos
SRP_JSON(objLoadedRDS, 'AddValue', RDS) 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 Next RDS
SRP_JSON(objReactor, 'Set', 'loadedRDS', objLoadedRDS) SRP_JSON(objReactor, 'Set', 'loadedRDS', objLoadedRDS)
SRP_JSON(objLoadedRDS, 'Release') SRP_JSON(objLoadedRDS, 'Release')
@ -2788,6 +2878,8 @@ Service ConvertRecordToJSON(ReactorNo, ItemURL, CurrUser, FullObject=BOOLEAN)
end else end else
SRP_JSON(objReactor, 'SetValue', 'loadedRDS', '') SRP_JSON(objReactor, 'SetValue', 'loadedRDS', '')
end end
SRP_JSON(objReactor, 'SetValue', 'loadLockLeftRDS', LoadLockLeftRDS)
SRP_JSON(objReactor, 'SetValue', 'loadLockRightRDS', LoadLockRightRDS)
// Add new reactor items here // Add new reactor items here
InstItems = Xlate('REACTOR', ReactorNo, REACTOR_CURR_INST_ITEMS$, 'X') InstItems = Xlate('REACTOR', ReactorNo, REACTOR_CURR_INST_ITEMS$, 'X')
@ -3676,7 +3768,7 @@ Service GetReactorAvailChamberCount(ReactNo)
StartTick = GetTickCount() StartTick = GetTickCount()
MetricName = 'GetReactorAvailChamberCount' MetricName = 'GetReactorAvailChamberCount'
ErrMsg = 'Error in ReactorServices -> GetReactorAvailChamberCount: ' ErrMsg = ''
AvailableChamberCount = 0 AvailableChamberCount = 0
If ReactNo NE '' then If ReactNo NE '' then
If RowExists('REACTOR', ReactNo) then If RowExists('REACTOR', ReactNo) then
@ -3686,16 +3778,19 @@ Service GetReactorAvailChamberCount(ReactNo)
AvailableChamberCount = ReactorCurrCapacity - ReactorCurrLoadCnt AvailableChamberCount = ReactorCurrCapacity - ReactorCurrLoadCnt
end else end else
ErrMsg := 'Reactor ' : ReactNo : ' does not exist.' ErrMsg := 'Reactor ' : ReactNo : ' does not exist.'
Error_Services('Add', ErrMsg)
end end
end else end else
ErrMsg := 'Reactor Number was null.' ErrMsg := 'Reactor Number was null.'
Error_Services('Add', ErrMsg)
end end
Response = AvailableChamberCount Response = AvailableChamberCount
EndTick = GetTickCount() EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick) Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
If ErrMsg NE '' then
ErrMsg = 'Error in ReactorServices -> GetReactorAvailChamberCount: ':ErrMsg
Error_Services('Add', ErrMsg)
end
end service 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 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 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 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 REACT_ITEM_HIST_EQUATES
$INSERT APPCOLORS $INSERT APPCOLORS
$INSERT POPUP_EQUATES $INSERT POPUP_EQUATES
$INSERT LOGICAL
EQU COL$REACT_NO TO 1 EQU COL$REACT_NO TO 1
EQU COL$SVC_HRS TO 2 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:'.LU_PKT_QTY' AND Event = 'CLICK' ; GOSUB LUPktQty
CASE EntID = @WINDOW:'.RETIRE_BUTTON' AND Event = 'CLICK' ; GOSUB RetireItem CASE EntID = @WINDOW:'.RETIRE_BUTTON' AND Event = 'CLICK' ; GOSUB RetireItem
CASE EntID = @WINDOW:'.PRINT_LABEL' AND Event = 'CLICK' ; GOSUB PrintLabel 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 CASE 1
@ -142,14 +146,11 @@ RETURN
Read: Read:
* * * * * * * * * * * * * *
GOSUB Refresh GOSUB Refresh
RETURN RETURN
* * * * * * * * * * * * * *
Write: Write:
* * * * * * * * * * * * * *
@ -261,9 +262,68 @@ FOR Line = 1 TO ListCnt
NEXT N NEXT N
END END
NEXT Line 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 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: RetireItem:
@ -443,19 +503,47 @@ RETURN
LUPktSize: LUPktSize:
* * * * * * * * * * * * * *
RetVal = Popup(@WINDOW,'','WAFER_SIZES') Retired = Get_Property(@Window: '.RETIRE_DT', 'TEXT')
RIType = Get_Property(@Window:'.RI_TYPE', 'TEXT')
IF RetVal NE '' THEN If RIType EQ 'S' then
oaParms = RetVal:@RM:@WINDOW:'.PKT_SIZE' PocketQty = ''
obj_Appwindow('LUValReturn',oaParms) Set_Property(@Window:'.PKT_QTY', 'TEXT', '')
END 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 RETURN
* * * * * * * * * * * * *
LUPktQty: LUPktQty:
* * * * * * * * * * * * *
ReactType = Get_Property(@WINDOW:'.REACT_TYPE','INVALUE') ReactType = Get_Property(@WINDOW:'.REACT_TYPE','INVALUE')
@ -508,3 +596,43 @@ obj_React_Item('PrintLabel',RINo:@RM:CurrRec)
RETURN 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: 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 If ItemType EQ '' then ErrMsg := 'Item Type was not specified. '
ItemType = {RI_TYPE}
If (ItemType NE 'LE') AND (ItemType NE 'RE') then
If ItemType EQ '' then ErrMsg := 'Item Type was not specified. ' 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 If ErrMsg NE '' then
Error_Services('Add', 'Error Saving Reactor Item: ' : ErrMsg) Error_Services('Add', 'Error Saving Reactor Item: ' : ErrMsg)
@ -149,8 +207,6 @@ WRITE_RECORD_PRE:
Record = '' Record = ''
ActionFlow = ACTION_STOP$ ActionFlow = ACTION_STOP$
end else end else
OrigRetireDt = OrigRecord<REACT_ITEM_RETIRE_DT$>
NewRetireDt = Record<REACT_ITEM_RETIRE_DT$>
OrigNotes = OrigRecord<REACT_ITEM_NOTES$> OrigNotes = OrigRecord<REACT_ITEM_NOTES$>
NewNotes = Record<REACT_ITEM_NOTES$> NewNotes = Record<REACT_ITEM_NOTES$>
If ( (OrigRetireDt NE NewRetireDt) or (OrigNotes NE NewNotes) ) then If ( (OrigRetireDt NE NewRetireDt) or (OrigNotes NE NewNotes) ) then
@ -233,3 +289,6 @@ Restore_System_Variables:
return 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 = '' ErrorMsg = ''
Response = '' Response = ''
@ -99,6 +99,9 @@ Service GetReactItems(RIType, CurrStatus, EntryDtStart, EntryDtEnd, RetireDtStar
Swap ',' with @VM in CurrStatus Swap ',' with @VM in CurrStatus
SearchString := 'CURR_STATUS_STATIC':@VM:CurrStatus:@FM SearchString := 'CURR_STATUS_STATIC':@VM:CurrStatus:@FM
end end
If PartType NE '' then
SearchString := 'PART_TYPE':@VM:PartType:@FM
end
Flag = '' Flag = ''
RIKeys = '' RIKeys = ''
Btree.Extract(SearchString, 'REACT_ITEM', DictReactItem, RIKeys, 'E', Flag) Btree.Extract(SearchString, 'REACT_ITEM', DictReactItem, RIKeys, 'E', Flag)
@ -370,7 +373,7 @@ Service GetReactItemTemplateJSON()
end else end else
Error_Services('Add', 'Unable to create JSON representation in the ' : Service : ' service.') Error_Services('Add', 'Unable to create JSON representation in the ' : Service : ' service.')
end end
Response = jsonRecord Response = jsonRecord
end service end service
@ -381,17 +384,15 @@ Service CreateReactItem(Record)
ErrMsg = '' ErrMsg = ''
KeyID = '' KeyID = ''
If Record NE '' then 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 If ErrMsg EQ '' then
KeyID = NextKey('REACT_ITEM') KeyID = NextKey('REACT_ITEM')
If Error_Services('NoError') and KeyID NE '' then 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 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 end
end end
@ -457,6 +458,31 @@ Service ConvertRecordToJSONQuick(KeyID, Record, ItemURL)
end service 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) Service UpdateReactItemStatus(RINo)
If RINo NE '' then If RINo NE '' then
@ -493,3 +519,7 @@ ClearCursors:
return 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') HTTP_Resource_Services('LoremIpsum')
end api end api

View File

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

View File

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

View File

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

View File

@ -385,7 +385,6 @@ end service
Service GetScheduleEventSummary(SchedDetKeyID, IncludeWaferDetails) Service GetScheduleEventSummary(SchedDetKeyID, IncludeWaferDetails)
If IncludeWaferDetails NE True$ then IncludeWaferDetails = False$ If IncludeWaferDetails NE True$ then IncludeWaferDetails = False$
ScheduleEventSummary = '' ScheduleEventSummary = ''
If SchedDetKeyID NE '' then If SchedDetKeyID NE '' then
SchedDetRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', SchedDetKeyID) SchedDetRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', SchedDetKeyID)
@ -442,10 +441,10 @@ Service GetScheduleEventSummary(SchedDetKeyID, IncludeWaferDetails)
Begin Case Begin Case
Case BackColor NE '' Case BackColor NE ''
// Set in the schedule detail record. Use current color. // Set in the schedule detail record. Use current color.
Case HotLotFlag
BackColor = 'LightCoral'
Case WOClosedFlag Case WOClosedFlag
BackColor = 'LightGray' BackColor = 'LightGray'
Case HotLotFlag
BackColor = 'LightCoral'
Case HardBlock Case HardBlock
BackColor = 'LightGoldenRodYellow' BackColor = 'LightGoldenRodYellow'
Case BlockOut Case BlockOut
@ -807,6 +806,7 @@ Service GetCurrentEvent(ReactNo)
MetricName = 'GetCurrentEvent' MetricName = 'GetCurrentEvent'
SchedDetKey = '' SchedDetKey = ''
ErrorMsg = ''
If ReactNo NE '' then If ReactNo NE '' then
CurrDTM = Datetime() CurrDTM = Datetime()
Query = 'SELECT SCHED_DET_NG WITH REACT_NO EQ "':ReactNo:'" AND WITH EVENT_COMP NE 1 BY START_DTM' Query = 'SELECT SCHED_DET_NG WITH REACT_NO EQ "':ReactNo:'" AND WITH EVENT_COMP NE 1 BY START_DTM'
@ -818,20 +818,22 @@ Service GetCurrentEvent(ReactNo)
ReadNext SchedDetKey else EOF = True$ ReadNext SchedDetKey else EOF = True$
Response = SchedDetKey Response = SchedDetKey
end else end else
ErrorMsg = 'Error in service ':Service:' module. Error code ':errCode ErrorMsg = 'Error in service ':Service:' module. Error code ':errCode
Error_Services('Add', ErrorMsg)
end end
GoSub ClearCursors GoSub ClearCursors
end end
EndTick = GetTickCount() EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick) Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
end service end service
Service CurrentEventIsBlock(ReactNo) Service CurrentEventIsBlock(ReactNo)
StartTick = GetTickCount() StartTick = GetTickCount()
MetricName = 'CurrentEventIsBlock' MetricName = 'CurrentEventIsBlock'
ErrorMsg = ''
If ReactNo NE '' then If ReactNo NE '' then
CurrentSchedDetKey = Schedule_Services('GetCurrentEvent', ReactNo) CurrentSchedDetKey = Schedule_Services('GetCurrentEvent', ReactNo)
@ -847,15 +849,15 @@ Service CurrentEventIsBlock(ReactNo)
end else end else
Error = Error_Services('GetMessage') Error = Error_Services('GetMessage')
ErrorMsg = 'Error in service ':Service:' module. ':Error ErrorMsg = 'Error in service ':Service:' module. ':Error
Error_Services('Add', ErrorMsg)
end end
end else end else
ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.' ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.'
Error_Services('Add', ErrorMsg)
end end
EndTick = GetTickCount() EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick) Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
end service end service
Service GetNextEvent(ReactNo) Service GetNextEvent(ReactNo)
@ -863,6 +865,7 @@ Service GetNextEvent(ReactNo)
MetricName = 'GetNextEvent' MetricName = 'GetNextEvent'
SchedDetKey = '' SchedDetKey = ''
ErrorMsg = ''
If ReactNo NE '' then If ReactNo NE '' then
CurrDTM = Datetime() CurrDTM = Datetime()
Query = 'SELECT SCHED_DET_NG WITH REACT_NO EQ "':ReactNo:'" AND WITH EVENT_COMP NE 1 BY START_DTM' Query = 'SELECT SCHED_DET_NG WITH REACT_NO EQ "':ReactNo:'" AND WITH EVENT_COMP NE 1 BY START_DTM'
@ -875,25 +878,24 @@ Service GetNextEvent(ReactNo)
ReadNext SchedDetKey else EOF = True$ ReadNext SchedDetKey else EOF = True$
If EOF EQ True$ then If EOF EQ True$ then
ErrorMsg = 'Error in service ':Service:' module. No incomplete events in schedule' ErrorMsg = 'Error in service ':Service:' module. No incomplete events in schedule'
Error_Services('Add', ErrorMsg)
end else end else
ReadNext SchedDetKey else EOF = True$ ReadNext SchedDetKey else EOF = True$
If EOF EQ True$ then If EOF EQ True$ then
ErrorMsg = 'Error in service ':Service:' module. No incomplete events in schedule after current event' ErrorMsg = 'Error in service ':Service:' module. No incomplete events in schedule after current event'
Error_Services('Add', ErrorMsg)
end else end else
Response = SchedDetKey Response = SchedDetKey
end end
end end
end else end else
ErrorMsg = 'Error in service ':Service:' module. Error code ':errCode ErrorMsg = 'Error in service ':Service:' module. Error code ':errCode
Error_Services('Add', ErrorMsg)
end end
GoSub ClearCursors GoSub ClearCursors
end end
EndTick = GetTickCount() EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick) Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
end service end service
Service GetEngagedEvent(ReactNo) Service GetEngagedEvent(ReactNo)
@ -947,6 +949,7 @@ Service NextEventIsSamePsn(ReactNo)
MetricName = 'NextEventIsSamePsn' MetricName = 'NextEventIsSamePsn'
Response = False$ Response = False$
ErrorMsg = ''
If ReactNo NE '' then If ReactNo NE '' then
CurrentSchedDetKey = Schedule_Services('GetCurrentEvent', ReactNo) CurrentSchedDetKey = Schedule_Services('GetCurrentEvent', ReactNo)
@ -987,17 +990,19 @@ Service NextEventIsSamePsn(ReactNo)
end end
end else end else
ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.' ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.'
Error_Services('Add', ErrorMsg)
end end
EndTick = GetTickCount() EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick) Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
end service end service
Service NextEventIsBlock(ReactNo) Service NextEventIsBlock(ReactNo)
StartTick = GetTickCount() StartTick = GetTickCount()
MetricName = 'NextEventIsBlock' MetricName = 'NextEventIsBlock'
ErrorMsg = ''
If ReactNo NE '' then If ReactNo NE '' then
NextSchedDetKey = Schedule_Services('GetNextEvent', ReactNo) NextSchedDetKey = Schedule_Services('GetNextEvent', ReactNo)
@ -1013,15 +1018,15 @@ Service NextEventIsBlock(ReactNo)
end else end else
Error = Error_Services('GetMessage') Error = Error_Services('GetMessage')
ErrorMsg = 'Error in service ':Service:' module. ':Error ErrorMsg = 'Error in service ':Service:' module. ':Error
Error_Services('Add', ErrorMsg)
end end
end else end else
ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.' ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.'
Error_Services('Add', ErrorMsg)
end end
EndTick = GetTickCount() EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick) Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
end service end service
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
@ -3596,5 +3601,3 @@ CreateScheduleChangeNotification:
return 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() StartTick = GetTickCount()
MetricName = 'AcknowledgeSupplement' MetricName = 'AcknowledgeSupplement'
ErrMsg = ''
If ( (SupplID NE '') and (EntryUser NE '') ) then If ( (SupplID NE '') and (EntryUser NE '') ) then
OldRec = Xlate('SUPPLEMENTS', SupplID, '', 'X', '') OldRec = Xlate('SUPPLEMENTS', SupplID, '', 'X', '')
If OldRec NE '' then If OldRec NE '' then
@ -469,19 +470,21 @@ Service AcknowledgeSupplement(SupplID, EntryUser)
Supplement_Services('LogSupplementChange', NewRec, 'Acknowledged', EntryUser) Supplement_Services('LogSupplementChange', NewRec, 'Acknowledged', EntryUser)
end else end else
Response = FALSE$ Response = FALSE$
Error_Services('Add', 'Error editing Supplement record.') ErrMsg = 'Error editing Supplement record.'
end end
end else end else
Response = FALSE$ Response = FALSE$
Error_Services('Add', 'Record does not exist.') ErrMsg = 'Record does not exist.'
end end
end else end else
Response = FALSE$ 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 end
EndTick = GetTickCount() 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 end service
@ -501,6 +504,7 @@ Service UnacknowledgedSupplementCheck(LotType=LOTTYPES, LotID, Stage=STAGES)
UnackList = '' UnackList = ''
Response = False$ Response = False$
ErrMsg = ''
If ( (LotType NE '') and (LotID NE '') and (Stage NE '') ) then If ( (LotType NE '') and (LotID NE '') and (Stage NE '') ) then
KeyList = '' KeyList = ''
Query = '' Query = ''
@ -518,23 +522,25 @@ Service UnacknowledgedSupplementCheck(LotType=LOTTYPES, LotID, Stage=STAGES)
If AckField NE True$ then UnackList<-1> = Key If AckField NE True$ then UnackList<-1> = Key
Next Key Next Key
end else 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 end
end else end else
Error_Services('Add', 'Error in ':Service:' service. Error calling Btree.Extract') ErrMsg = 'Error in ':Service:' service. Error calling Btree.Extract'
end end
end else end else
Error_Services('Add', 'Error in ':Service:' service. Error opening SUPPLEMENTS dictionary.') ErrMsg = 'Error in ':Service:' service. Error opening SUPPLEMENTS dictionary.'
end end
end else 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 end
If UnackList NE '' then Response = UnackList If UnackList NE '' then Response = UnackList
EndTick = GetTickCount() 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 end service
@ -552,6 +558,7 @@ Service LogSupplementChange(SupplementRec, EditEvent, EntryUser)
StartTick = GetTickCount() StartTick = GetTickCount()
MetricName = 'LogSupplementChange' MetricName = 'LogSupplementChange'
ErrMsg = ''
If ( (SupplementRec NE '') and (EditEvent NE '') and (EntryUser NE '') ) then If ( (SupplementRec NE '') and (EditEvent NE '') and (EntryUser NE '') ) then
SupplementText = SupplementRec<SUPPLEMENTS_SUPPL_TEXT$> SupplementText = SupplementRec<SUPPLEMENTS_SUPPL_TEXT$>
LotType = SupplementRec<SUPPLEMENTS_LOT_TYPE$> LotType = SupplementRec<SUPPLEMENTS_LOT_TYPE$>
@ -565,11 +572,13 @@ Service LogSupplementChange(SupplementRec, EditEvent, EntryUser)
End Case End Case
end else 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 end
EndTick = GetTickCount() 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 end service
@ -670,3 +679,4 @@ Service SendNotifications(RDSList, EditEvent, Instructions, EntryUser)
end service 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 #pragma precomp SRP_PreCompiler
$insert LOGICAL $insert LOGICAL
$Insert APP_INSERTS $Insert APP_INSERTS
$Insert SERVICE_SETUP
$Insert TEST_WAFER_PROD_EQUATES $Insert TEST_WAFER_PROD_EQUATES
$Insert TEST_WAFER_TYPES_DISPO_OPTIONS_EQUATES $Insert TEST_WAFER_TYPES_DISPO_OPTIONS_EQUATES
$Insert TEST_RUN_EQUATES $Insert TEST_RUN_EQUATES
@ -10,7 +11,7 @@ $Insert TEST_RUN_OBJ_EQUATES
$Insert LOT_EQUATES $Insert LOT_EQUATES
$Insert LOT_OPERATION_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 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 Database_Services, Btree.Extract, Error_Services, Logging_Services, Rlist, Test_Run_Services, Lot_Services, SRP_Json
Declare subroutine Mona_Services Declare subroutine Mona_Services
@ -331,6 +332,71 @@ Service GetTestWaferLots(ShowOnlyOpenLots)
Response = TestWaferLotKeys Response = TestWaferLotKeys
end service 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) Service CreateTestRunRecord(RunTypeID, EqpType, EqpID, PSNo, RDSNo, UserID, TWLotIds, TWLotQtys, ManualQtyAdjust)
StartTick = GetTickCount() StartTick = GetTickCount()
@ -688,6 +754,7 @@ Service GetTestWaferUsageByDateSpan(StartDtm, StopDtm)
end service end service
Service GetTestRunKeysByDateSpan(StartDtm, StopDtm) Service GetTestRunKeysByDateSpan(StartDtm, StopDtm)
Begin Case Begin Case
Case StartDTM EQ '' AND StopDTM EQ '' Case StartDTM EQ '' AND StopDTM EQ ''
//Set search date for last 24 hour period //Set search date for last 24 hour period
@ -714,8 +781,6 @@ Service GetTestRunKeysByDateSpan(StartDtm, StopDtm)
Response = keylist Response = keylist
end end
end service end service
Service GetTestRunKeysByEqp(EquipType, EquipID) Service GetTestRunKeysByEqp(EquipType, EquipID)
@ -820,13 +885,3 @@ Service IsNewTWSystemActive(UserId)
end service end service

View File

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

View File

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

View File

@ -0,0 +1,106 @@
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$)
PlaceDialog(-2, -2)
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 #pragma precomp SRP_PreCompiler
$insert LOGICAL
$Insert SERVICE_SETUP
$Insert SERVICE_SETUP
$insert APP_INSERTS
$Insert UNIT_EQUATES
$Insert MSG_EQUATES $Insert MSG_EQUATES
$Insert DICT_EQUATES $Insert DICT_EQUATES
$Insert WM_IN_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 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) Service GetComments(WMINNo)
CommentArray = '' CommentArray = ''
WMInRow = Database_Services('ReadDataRow', 'WM_IN', WMInNo) WMInRow = Database_Services('ReadDataRow', 'WM_IN', WMInNo)
CommentDates = Oconv(WMInRow<WM_IN_EPP_COMMENT_DATE$>, 'DT') CommentDates = Oconv(WMInRow<WM_IN_EPP_COMMENT_DATE$>, 'DT')
CommentUsers = WMInRow<WM_IN_EPP_COMMENT_USER$> CommentUsers = WMInRow<WM_IN_EPP_COMMENT_USER$>
Comments = WMInRow<WM_IN_EPP_COMMENT_NOTE$> Comments = WMInRow<WM_IN_EPP_COMMENT_NOTE$>
CommentList = CommentDates :@FM: CommentUsers :@FM: Comments
CommentList = CommentDates :@FM: CommentUsers :@FM: Comments
CommentArray = SRP_Rotate_Array(CommentList) CommentArray = SRP_Rotate_Array(CommentList)
Response = CommentArray Response = CommentArray
End Service End Service
@ -368,3 +391,557 @@ Service VerifyWOMatWMIKeyIndex(WMIKey)
end service 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 #pragma precomp SRP_PreCompiler
$Insert SERVICE_SETUP $Insert SERVICE_SETUP
$Insert LOGICAL $Insert APP_INSERTS
$Insert MSG_EQUATES $Insert MSG_EQUATES
$Insert DICT_EQUATES $Insert DICT_EQUATES
$Insert WM_OUT_EQUATES $Insert WM_OUT_EQUATES
@ -57,20 +57,28 @@ $Insert WO_MAT_EQUATES
$Insert WO_LOG_EQUATES $Insert WO_LOG_EQUATES
$Insert COMPANY_EQUATES $Insert COMPANY_EQUATES
$Insert RETURN_TO_FAB_LOTS_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 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 PSN_Services, SRP_Rotate_Array, Datetime, Return_To_Fab_Services, Environment_Services
Declare function Logging_Services Declare function Logging_Services
Declare subroutine Database_Services, SRP_JSON, Error_Services, Extract_Si_Keys, Set_Status, obj_wo_mat_log 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 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 $Insert CUST_EPI_PART_EQUATES
Equ MAX_NUM_CASS$ to 150 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 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 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 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 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 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 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 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 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' LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
LogDate = Oconv(Date(), 'D4/') LogDate = Oconv(Date(), 'D4/')
@ -1140,6 +1141,86 @@ Service UpdateReleasedQty(WONo)
end service 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) Service UpdateReceivedQty(WONo)
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG' LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
@ -1155,8 +1236,10 @@ Service UpdateReceivedQty(WONo)
If WONo NE '' then If WONo NE '' then
If RowExists('WO_LOG', WONo) then If RowExists('WO_LOG', WONo) then
WORec = Database_Services('ReadDataRow', 'WO_LOG', WONo) WORec = Database_Services('ReadDataRow', 'WO_LOG', WONo)
If Error_Services('NoError') then If Error_Services('NoError') then
RXQty = obj_WO_Log('RxQty', WONo:@RM:WORec) WOQty = WORec<WO_LOG_WO_QTY$>
RXQty = obj_WO_Log('RxQty', WONo:@RM:WORec)
OpenQty = WOQty - RXQty
Open 'WO_LOG' to hTable then Open 'WO_LOG' to hTable then
ReadV OrigRXQty from hTable, WONo, WO_LOG_RX_QTY_STATIC$ then ReadV OrigRXQty from hTable, WONo, WO_LOG_RX_QTY_STATIC$ then
If OrigRXQty NE RXQty then If OrigRXQty NE RXQty then
@ -1169,6 +1252,19 @@ Service UpdateReceivedQty(WONo)
end else end else
ErrorMsg = 'Error in ':Service:' service. Error reading RX_QTY_STATIC column from WO_LOG ':WONo:'.' ErrorMsg = 'Error in ':Service:' service. Error reading RX_QTY_STATIC column from WO_LOG ':WONo:'.'
end 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 end else
ErrorMsg = 'Error in ':Service:' service. Failed to open the WO_LOG table.' ErrorMsg = 'Error in ':Service:' service. Failed to open the WO_LOG table.'
end end
@ -1200,6 +1296,84 @@ Service UpdateReceivedQty(WONo)
end service 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) Service UpdateShippedQty(WONo)
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG' LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
@ -1331,83 +1505,124 @@ end service
Service ConvertRecordToJSON(WONo, Record, ItemURL) Service ConvertRecordToJSON(WONo, Record, ItemURL)
jsonRecord = '' ErrorMsg = ''
jsonRecord = ''
IF WONo NE '' then IF WONo NE '' then
If Record EQ '' then Record = Database_Services('ReadDataRow', 'WO_LOG', WONo) If Record EQ '' then Record = Database_Services('ReadDataRow', 'WO_LOG', WONo)
If Error_Services('NoError') then If Error_Services('NoError') then
@DICT = Database_Services('GetTableHandle', 'DICT.WO_LOG') EpiPartNo = Record<WO_LOG_EPI_PART_NO$>
@ID = WONo EpiPartRec = Database_Services('ReadDataRow', 'EPI_PART', EpiPartNo)
@RECORD = Record If Error_Services('NoError') then
objJSON = '' SubSuppBy = EpiPartRec<EPI_PART_SUB_SUPP_BY$> ;* L - EpiSvcs supplied, C - Customer Supplied
If SRP_JSON(objJSON, 'New', 'Object') then ProdVerNo = Record<WO_LOG_PROD_VER_NO$>
objWOLog = '' ProdVerRec = Database_Services('ReadDataRow', 'PROD_VER', ProdVerNo)
If SRP_JSON(objWOLog, 'New', 'Object') then If Error_Services('NoError') then
SRP_JSON(objWOLog, 'SetValue', 'KeyId', @ID) SubPartNo = ProdVerRec<PROD_VER_SUB_PART_NO$>
SRP_JSON(objWOLog, 'SetValue', 'ProdOrdNo', {PROD_ORD_NO}) // Create the JSON response object
SRP_JSON(objWOLog, 'SetValue', 'PSN', {PROD_SPEC_ID}) objJSON = ''
SRP_JSON(objWOLog, 'SetValue', 'EpiPartNo', {EPI_PART_NO}) If SRP_JSON(objJSON, 'New', 'Object') then
SRP_JSON(objWOLog, 'SetValue', 'HOT_FLAG', {HOT_FLAG}) objWOLog = ''
//Create a list of cassettes If SRP_JSON(objWOLog, 'New', 'Object') then
CassIDs = {WO_MAT_KEY} SRP_JSON(objWOLog, 'SetValue', 'KeyId', WONo)
objChildCassettes = '' SRP_JSON(objWOLog, 'SetValue', 'ProdOrdNo', Record<WO_LOG_PROD_ORD_NO$>)
If SRP_JSON(objChildCassettes, 'New', 'Array') then SRP_JSON(objWOLog, 'SetValue', 'PSN', Xlate('WO_LOG', WONo, 'PS_NO', 'X'))
If CassIDs NE '' then SRP_JSON(objWOLog, 'SetValue', 'EpiPartNo', EpiPartNo)
for each Cass in CassIDs using @VM setting vPos SRP_JSON(objWOLog, 'SetValue', 'HotFlag', Record<WO_LOG_HOT_FLAG$>)
SAPBatchNo = XLATE('WO_MAT', Cass, WO_MAT_SAP_BATCH_NO$, 'X') SRP_JSON(objWOLog, 'SetValue', 'WoQty', Record<WO_LOG_WO_QTY$>)
SAPTXDtm = XLATE('WO_MAT', Cass, WO_MAT_SAP_TX_DTM$, 'X') SRP_JSON(objWOLog, 'SetValue', 'RxQty', Record<WO_LOG_RX_QTY_STATIC$>)
RDSNo = XLATE('WO_MAT', Cass, WO_MAT_RDS_NO$, 'X') SRP_JSON(objWOLog, 'SetValue', 'RelQty', Record<WO_LOG_REL_QTY_STATIC$>)
ShipNo = XLATE('WO_MAT', Cass, WO_MAT_SHIP_NO$, 'X') SRP_JSON(objWOLog, 'SetValue', 'UnRelQty', Record<WO_LOG_UNREL_QTY_STATIC$>)
//Add in each indv. cassette object SRP_JSON(objWOLog, 'SetValue', 'ShipQty', Record<WO_LOG_SHIP_QTY_STATIC$>)
objChildCassette = '' SRP_JSON(objWOLog, 'SetValue', 'ScrapQty', Record<WO_LOG_SCRAP_QTY_STATIC$>)
If SRP_JSON(objChildCassette, 'New', 'Object') then SRP_JSON(objWOLog, 'SetValue', 'OpenQty', Record<WO_LOG_OPEN_QTY_STATIC$>)
SRP_JSON(objChildCassette, 'SetValue', 'KeyId', Cass) SRP_JSON(objWOLog, 'SetValue', 'CustNo', Record<WO_LOG_CUST_NO$>)
SRP_JSON(objChildCassette, 'SetValue', 'SAPBatchNo', SAPBatchNo) SRP_JSON(objWOLog, 'SetValue', 'Customer', Xlate('WO_LOG', WONo, 'CUST_NAME', 'X'))
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
// Create the _class property for this resource. ExpectedVendorCd = Record<WO_LOG_EXP_VEND_CD$>
SRP_JSON(objJSON, 'SetValue', '_class', 'resource') 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 end
jsonRecord = SRP_JSON(objJSON, 'Stringify', 'Styled')
SRP_JSON(objJSON, 'Release')
end else 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
end else
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
end end
end else end else
Error_Services('Add', 'KeyID argument was missing in the ' : Service : ' service.') ErrorMsg = 'Error in ':Service:' service. Null WONo passed into service.'
end end
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
Response = jsonRecord Response = jsonRecord
end service end service
@ -2313,6 +2528,57 @@ Service UpdateWorkOrderData(WONo)
end service 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
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs // Internal GoSubs
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@ -35,16 +35,15 @@ Function Wo_API(@API)
10/20/23 xxx Original programmer. 10/20/23 xxx Original programmer.
***********************************************************************************************************************/ ***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler #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 APP_INSERTS
$insert API_SETUP $insert API_SETUP
$insert HTTP_INSERTS $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/') LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS') LogTime = Oconv(Time(), 'MTS')
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\API\Materials\WO' LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\API\Materials\WO'
@ -55,6 +54,8 @@ LoggingDTM = LogDate : ' ' : LogTime
ResponseCode = '' ResponseCode = ''
ResponseMessage = '' ResponseMessage = ''
LogData = '' LogData = ''
Response = ''
GoToAPI else GoToAPI else
// The specific resource endpoint doesn't have a API handler yet. // The specific resource endpoint doesn't have a API handler yet.
ResponseCode = 204 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.HEAD
API wo.ID.GET API wo.ID.GET
@ -91,7 +84,20 @@ API wo.ID.GET
end api end api
API wo.ID.zpl.HEAD
API wo.ID.zpl.GET
GoSub CreateZPLItem
end api
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CreateHALItem: CreateHALItem:
ResponseCode = 200 ResponseCode = 200
MaterialKey = EndpointSegment MaterialKey = EndpointSegment
WOLogKey = '' WOLogKey = ''
@ -122,7 +128,7 @@ CreateHALItem:
end end
IF WOLogKey NE '' then IF WOLogKey NE '' then
JSON = Work_Order_Services('ConvertRecordToJSON', WOLogKey, '', FullEndpointURL) JSON = Work_Order_Services('ConvertRecordToJSON', WOLogKey, '', FullEndpointURL)
end else end else
IF ResponseCode NE 500 then IF ResponseCode NE 500 then
ResponseCode = 406 ResponseCode = 406
@ -148,4 +154,32 @@ CreateHALItem:
Message = Error_Services('GetMessage') Message = Error_Services('GetMessage')
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message) HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
end 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 return

View File

@ -616,13 +616,25 @@ WRITE_RECORD:
NewRelDtm = Record<WO_MAT_REL_DTM$> NewRelDtm = Record<WO_MAT_REL_DTM$>
OrigRecDtm = OrigRecord<WO_MAT_RX_DTM$> OrigRecDtm = OrigRecord<WO_MAT_RX_DTM$>
NewRecDtm = Record<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 If ( (OrigWfrQty NE '' ) and (OrigWfrQty NE NewWfrQty) and (OrigRecDtm NE '' and NewRecDtm NE '') ) then
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'UpdateReceivedQty':SD$:WONo) // Cassette already received, but casssette quantity has changed.
end If AdjustQty NE 0 then Work_Order_Services('AdjustReceivedQty', WONo, AdjustQty)
If ( ( (OrigWfrQty NE '') and (OrigWfrQty NE NewWfrQty) ) or ( (OrigRelDtm EQ '') and (NewRelDtm NE '') ) ) then end
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'UpdateReleasedQty':SD$:WONo) If ( (OrigRecDtm EQ '') and (NewRecDtm NE '') ) then
end // 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 {REACTOR_TYPE} NE 'EPP' then
If {MAKEUP_BOX} then If {MAKEUP_BOX} then

View File

@ -44,6 +44,7 @@ Declare Subroutine Logging_Services
$insert APP_INSERTS $insert APP_INSERTS
$insert API_SETUP $insert API_SETUP
$insert HTTP_INSERTS $insert HTTP_INSERTS
LogDate = Oconv(Date(), 'D4/') LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS') LogTime = Oconv(Time(), 'MTS')
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\API\Materials\WO_MAT' LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\API\Materials\WO_MAT'
@ -54,6 +55,8 @@ LoggingDTM = LogDate : ' ' : LogTime
ResponseCode = '' ResponseCode = ''
ResponseMessage = '' ResponseMessage = ''
LogData = '' LogData = ''
Response = ''
GoToAPI else GoToAPI else
// The specific resource endpoint doesn't have a API handler yet. // 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.') 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.HEAD
API wo_mat.ID.GET API wo_mat.ID.GET
@ -82,6 +77,12 @@ API wo_mat.ID.GET
end api end api
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CreateHalItem: CreateHalItem:
ResponseCode = 200 ResponseCode = 200
@ -119,4 +120,6 @@ CreateHalItem:
LogData<4> = ResponseCode LogData<4> = ResponseCode
LogData<5> = ResponseMessage LogData<5> = ResponseMessage
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM) Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM)
return return

View File

@ -182,6 +182,7 @@ WRITE_RECORD_PRE:
Case Record EQ '' Case Record EQ ''
// Unscheduled record write attempt. Block the write and log the event. // 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!' ErrorMessage = 'Empty WO_MAT_QA profile. Unscheduled record write attempt!'
Error_Services('Add', 'FS104: ':ErrorMessage) Error_Services('Add', 'FS104: ':ErrorMessage)
OrigFileError = 104 : @FM : ErrorMessage OrigFileError = 104 : @FM : ErrorMessage
@ -200,21 +201,8 @@ WRITE_RECORD_PRE:
LogData<4> = Stack LogData<4> = Stack
LogData<5> = CRLF$:RecordSnapshot:CRLF$ LogData<5> = CRLF$:RecordSnapshot:CRLF$
LogData<6> = 'FS104: ':ErrorMessage LogData<6> = 'FS104: ':ErrorMessage
// Sending a null message will send the LogData instead
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, '', '', '') 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 Status = 0
Record = '' Record = ''
ActionFlow = ACTION_STOP$ ActionFlow = ACTION_STOP$

View File

@ -420,36 +420,58 @@ end service
Service GetQAMetComplete(WOMatKey) Service GetQAMetComplete(WOMatKey)
ErrorMsg = ''
QAMetComplete = True$
If WOMatKey NE '' then 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 If Rowexists('WO_MAT_QA', WOMatKey) then
Response = '' QAMetRec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatKey, '', True$, 0, False$)
QAMetRec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatKey, '', True$, 0, False$) If Error_Services('NoError') then
Stages = QAMetRec<WO_MAT_QA_STAGE$> Stages = QAMetRec<WO_MAT_QA_STAGE$>
Results = QAMetRec<WO_MAT_QA_RESULT$> Results = QAMetRec<WO_MAT_QA_RESULT$>
StageCount = Count(Stages, @VM) StageCount = DCount(Stages, @VM)
For I = 1 to StageCount QAStagePresent = False$
If Results<1,I> EQ '' then For I = 1 to StageCount
Response = False$ 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 end
Until Response EQ False$ end else
Next I ErrorMsg = Error_Services('GetMessage')
If Response = '' then
Response = Wo_Mat_Qa_Services('GetMUWaferQAComplete', WOMatKey)
end end
end else
Response = True$
end end
end else end else
Error_Services('Add', 'Missing WOMatKey parameter.') ErrorMsg = 'Missing WOMatKey parameter.'
end end
If ErrorMsg EQ '' then
Response = QAMetComplete
end else
Response = False$
Error_Services('Add', ErrorMsg)
end
end service end service
Service GetMUWaferQAComplete(WOMatKey) Service GetMUWaferQAComplete(WOMatKey)
ErrorMsg = ''
If WOMatKey NE '' then If WOMatKey NE '' then
Response = True$ Response = True$
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WoMatKey, True$, 0, False$) WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WoMatKey, True$, 0, False$)
@ -487,10 +509,14 @@ Service GetMUWaferQAComplete(WOMatKey)
Next Box Next Box
end end
end else end else
Error_Services('Add', 'Failed to open WO_MAT record.') ErrorMsg = 'Failed to open WO_MAT record.'
end end
end else end else
Error_Services('Add', 'Missing WOMatKey parameter.') ErrorMsg = 'Missing WOMatKey parameter.'
end
If ErrorMsg NE '' then
Error_Services('Add', ErrorMsg)
end end
end service end service

View File

@ -55,7 +55,7 @@ $Insert SERVICE_SETUP
$Insert DICT_EQUATES $Insert DICT_EQUATES
Declare function Database_Services, Error_Services, SRP_Json, SRP_Com, Environment_Services, Logging_Services 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 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 obj_wo_mat_log, Set_Status, Rds_Services, Signature_Services, Mona_Services, Btree.Extract
Declare subroutine Transaction_Services Declare subroutine Transaction_Services
@ -86,6 +86,7 @@ Return Response or ""
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
Service ConvertRecordToJSON(WOMatKey, Record, ItemURL) Service ConvertRecordToJSON(WOMatKey, Record, ItemURL)
jsonRecord = '' jsonRecord = ''
IF WOMatKey NE '' then IF WOMatKey NE '' then
If Record EQ '' then Record = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey) If Record EQ '' then Record = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
@ -290,6 +291,50 @@ Service ConvertRecordToJSON(WOMatKey, Record, ItemURL)
End Service 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 // GetWaferMap
// //
@ -447,37 +492,43 @@ Service CassetteIsLastInWo(WoMatKey)
IsLastInWo = False$ IsLastInWo = False$
ErrMsg = ''
If Unassigned(WoMatKey) or WoMatKey EQ '' or RowExists('WO_MAT', WoMatKey) NE True$ then 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 end
WO = Field(WoMatKey, '*', 1) WO = Field(WoMatKey, '*', 1)
If WO EQ '' then If WO EQ '' then
Error_Services('Add', 'WO# not found in WO_MAT record') ErrMsg = 'WO# not found in WO_MAT record'
end end
If Error_Services('NoError') and Num(WO) EQ False$ then If ErrMsg EQ '' and Num(WO) EQ False$ then
Error_Services('Add', 'WO# is not numeric') ErrMsg = 'WO# is not numeric'
end end
CassNo = Field(WoMatKey, '*', 2) CassNo = Field(WoMatKey, '*', 2)
If Error_Services('NoError') and CassNo EQ '' then If ErrMsg EQ '' and CassNo EQ '' then
Error_Services('Add', 'Cassette# not found in WO_MAT record') ErrMsg = 'Cassette# not found in WO_MAT record'
end end
If Error_Services('NoError') and Num(CassNo) EQ False$ then If ErrMsg EQ '' and Num(CassNo) EQ False$ then
Error_Services('Add', 'Cassette# is not numeric') ErrMsg = 'Cassette# is not numeric'
end end
If Error_Services('NoError') then If ErrMsg EQ '' then
WoMatKeys = Xlate('WO_LOG', WO, WO_LOG_WO_MAT_KEY$, 'X') 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) TotalCassettes = DCount(WoMatKeys, @VM)
IsLastInWo = TotalCassettes EQ CassNo IsLastInWo = TotalCassettes EQ CassNo
end else
ErrMsg = 'WO_MAT keys not found in WO_LOG for WO ':WO
end end
end end
If Error_Services('HasError') then Response = IsLastInWo
ErrMsg = Error_Services('GetMessage')
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
If ErrMsg NE '' then
LogData = '' LogData = ''
LogData<1> = LoggingDtm LogData<1> = LoggingDtm
LogData<2> = WOMatKey LogData<2> = WOMatKey
@ -488,11 +539,6 @@ Service CassetteIsLastInWo(WoMatKey)
Error_Services('Add', ErrMsg) Error_Services('Add', ErrMsg)
end end
Response = IsLastInWo
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
@ -546,34 +592,49 @@ Service SetWoMatVoidFlag(WoMatKey, Username)
end service end service
Service MakeupFlagOn(RDSNo) Service MakeupFlagOn(WOMatKey)
EpiCheck = Rds_Services('IsEpiPro', RDSNo) ErrorMsg = ''
BioRadDown = False$ If (WOMatKey NE '') then
Bio4Down = False$ If RowExists('WO_MAT', WOMatKey) then
Bio5Down = False$ RDSNo = Database_Services('ReadDataColumn', 'WO_MAT', WOMatKey, WO_MAT_RDS_NO$)
Bio4LogKey = Xlate('TOOL', 'BIORAD4', 'CURR_MODE_KEY', 'X') If Error_Services('NoError') then
Bio5LogKey = Xlate('TOOL', 'BIORAD5', 'CURR_MODE_KEY', 'X') EpiCheck = Rds_Services('IsEpiPro', RDSNo)
Bio4Mode = Xlate('TOOL_LOG', Bio4LogKey, 'TOOL_MODE', 'X') BioRadDown = False$
Bio5Mode = Xlate('TOOL_LOG', Bio5LogKey, 'TOOL_MODE', 'X') Bio4Down = False$
Bio5Down = False$
If (Bio4Mode NE 'PROD') AND (Bio4Mode NE 'LIM') then Bio4Down = True$ Bio4LogKey = Xlate('TOOL', 'BIORAD4', 'CURR_MODE_KEY', 'X')
If (Bio5Mode NE 'PROD') AND (Bio5Mode NE 'LIM') then Bio5Down = True$ Bio5LogKey = Xlate('TOOL', 'BIORAD5', 'CURR_MODE_KEY', 'X')
Bio4Mode = Xlate('TOOL_LOG', Bio4LogKey, 'TOOL_MODE', 'X')
If (Bio4Down) AND (Bio5Down) then BioRadDown = True$ Bio5Mode = Xlate('TOOL_LOG', Bio5LogKey, 'TOOL_MODE', 'X')
If EpiCheck EQ False$ then If (Bio4Mode NE 'PROD') AND (Bio4Mode NE 'LIM') then Bio4Down = True$
WOMatKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X') If (Bio5Mode NE 'PROD') AND (Bio5Mode NE 'LIM') then Bio5Down = True$
WOMatQARec = XLATE('WO_MAT_QA',WOMatKey,'','X')
PropRow = WOMatQARec<3> If (Bio4Down) AND (Bio5Down) then BioRadDown = True$
If (Count(PropRow, 'THICK') NE 0) AND (BioRadDown EQ False$) then
CurrentStage = Rds_Services('GetCurrentStage', RDSNo) If EpiCheck EQ False$ then
If CurrentStage EQ 'COMP' then WOMatKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X')
Signature_Services('UnsignFQAStage', RDSNo) WOMatQARec = XLATE('WO_MAT_QA',WOMatKey,'','X')
end PropRow = WOMatQARec<3>
Rds_Services('ApplyQA100PercentADE', RDSNo) If (Count(PropRow, 'THICK') NE 0) AND (BioRadDown EQ False$) then
end CurrentStage = Rds_Services('GetCurrentStage', RDSNo)
end 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 end service
@ -696,4 +757,3 @@ Service VerifyWOLogWOMatKeyColumn(WOMatKey)
end service end service

View File

@ -242,6 +242,10 @@ Equ API_COLOR_BTNTEXT$ To 18
Equ API_COLOR_INACTIVECAPTIONTEXT$ To 19 Equ API_COLOR_INACTIVECAPTIONTEXT$ To 19
Equ API_COLOR_BTNHIGHLIGHT$ To 20 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 // Preference Manager
Equ ImagePath$ to Memory_Services('GetValue', 'PM_CURRENT_IMAGE_PATH') : '\' Equ ImagePath$ to Memory_Services('GetValue', 'PM_CURRENT_IMAGE_PATH') : '\'
PMSystemFont = Memory_Services('GetValue', 'PM_SYSTEM_FONT') PMSystemFont = Memory_Services('GetValue', 'PM_SYSTEM_FONT')

View File

@ -0,0 +1,19 @@
compile insert ARCHIVE_EQUATES
/*----------------------------------------
Author : Table Create Insert Routine
Written : 28/08/2025
Description : Insert for Table ARCHIVE
----------------------------------------*/
#ifndef __ARCHIVE_EQUATES__
#define __ARCHIVE_EQUATES__
equ ARCHIVE_ARCHIVE_DTM$ to 1
equ ARCHIVE_COMPLETE$ to 2
equ ARCHIVE_CHILD_RECORD$ to 3
equ ARCHIVE_CHILD_TABLE$ to 4
equ ARCHIVE_CHILD_RECORD_ARCHIVED$ to 5
equ ARCHIVE_CHILD_RECORD_DELETED$ to 6
equ ARCHIVE_CHILD_RECORD_ARCHIVE_DTM$ to 7
equ ARCHIVE_CHILD_RECORD_DELETE_DTM$ to 8
#endif

View File

@ -0,0 +1,17 @@
compile insert DIALOG_RESPONSE_LOG_EQUATES
/*----------------------------------------
Author : Table Create Insert Routine
Written : 22/08/2025
Description : Insert for Table DIALOG_RESPONSE_LOG
----------------------------------------*/
#ifndef __DIALOG_RESPONSE_LOG_EQUATES__
#define __DIALOG_RESPONSE_LOG_EQUATES__
equ DIALOG_RESPONSE_LOG_RESPONSE_DTM$ to 1
equ DIALOG_RESPONSE_LOG_ENTITY_ID$ to 2
equ DIALOG_RESPONSE_LOG_ENTITY_TYPE$ to 3
equ DIALOG_RESPONSE_LOG_USER_ID$ to 4
equ DIALOG_RESPONSE_LOG_DIALOG_TYPE$ to 5
equ DIALOG_RESPONSE_LOG_DATA$ to 6
#endif

View File

@ -11,6 +11,11 @@ Equ POST_LOG_REC_KEY1$ To 0
Equ POST_LOG_REC_KEY2$ To 0 Equ POST_LOG_REC_KEY2$ To 0
Equ POST_LOG_REC_KEY3$ To 0 Equ POST_LOG_REC_KEY3$ To 0
Equ POST_LOG_FIELD_NO$ To 1 Equ POST_LOG_FIELD_NO$ To 1
Equ POST_LOG_FIELD_VALUE$ To 2 Equ POST_LOG_FIELD_VALUE$ To 2
Equ POST_LOG_FIELD_ADD_MV_BY$ To 3 Equ POST_LOG_FIELD_ADD_MV_BY$ To 3
Equ POST_LOG_FAILED$ To 4
Equ POST_LOG_FAILURE_REASON$ To 5
Equ POST_LOG_FAILURE_NOTIFICATION_SENT$ To 6
Equ POST_LOG_FAILURE_NOTIFICATION_DTM$ To 7

View File

@ -260,4 +260,7 @@ Equ RDS_COMMENT_NOTE$ To 307
Equ RDS_WAFER_COUNTER_QTY$ To 308 Equ RDS_WAFER_COUNTER_QTY$ To 308
Equ RDS_WAFER_COUNTER_DTM$ To 309 Equ RDS_WAFER_COUNTER_DTM$ To 309
Equ RDS_POST_SUPERCEDE$ To 310 Equ RDS_POST_SUPERCEDE$ To 310
Equ RDS_ALL_TW_USE_SIGNED$ To 311 Equ RDS_ALL_TW_USE_SIGNED$ To 311
Equ RDS_LOAD_EXTRA_1_REACTOR$ To 312
Equ RDS_LOAD_EXTRA_2_REACTOR$ To 313

View File

@ -96,4 +96,5 @@ Equ WO_LOG_RX_STAMPS$ To 83
Equ WO_LOG_REL_STAMPS$ To 84 Equ WO_LOG_REL_STAMPS$ To 84
Equ WO_LOG_CURR_STATUS_STATIC$ To 85 Equ WO_LOG_CURR_STATUS_STATIC$ To 85
Equ WO_LOG_SCRAP_QTY_STATIC$ To 86 Equ WO_LOG_SCRAP_QTY_STATIC$ To 86
Equ WO_LOG_OPEN_QTY_STATIC$ To 87