Compare commits

56 Commits

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

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

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

Commit final changes.

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

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

Commit to change branches post-UAT 1.

Commit to change branches.

Commit to change branches.

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

various bug fixes

Re-initializaing branch

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

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

View File

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

View File

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

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",
@ -41,28 +41,8 @@
"<8,2,2>": "High Thruput" "<8,2,2>": "High Thruput"
}, },
"<8,3>": { "<8,3>": {
"<8,3,1>": "K2K", "<8,3,1>": "EPP",
"<8,3,2>": "Kit 2000" "<8,3,2>": " EpiPro"
},
"<8,4>": {
"<8,4,1>": "EPP",
"<8,4,2>": " EpiPro"
},
"<8,5>": {
"<8,5,1>": "GAN",
"<8,5,2>": "GaN"
},
"<8,6>": {
"<8,6,1>": "STD",
"<8,6,2>": "Standard"
},
"<8,7>": {
"<8,7,1>": "HD",
"<8,7,2>": "Heavy Duty"
},
"<8,8>": {
"<8,8,1>": "SCADA",
"<8,8,2>": "Prototype"
} }
}, },
"<9>": { "<9>": {
@ -108,7 +88,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

@ -2,10 +2,19 @@ Compile function Archive_Services(@Service, @Params)
#pragma precomp SRP_PreCompiler #pragma precomp SRP_PreCompiler
$insert LOGICAL $insert LOGICAL
$insert APP_INSERTS $insert APP_INSERTS
$Insert WO_LOG_EQUATES
$Insert RDS_EQUATES
$Insert REACT_RUN_EQUATES
$Insert RDS_LAYER_EQUATES
$Insert RDS_TEST_EQUATES
$Insert ARCHIVE_EQUATES
EQU COMMA$ To ',' EQU COMMA$ To ','
Declare subroutine Change_Log_Services, Logging_Services Declare subroutine Change_Log_Services, Logging_Services, Error_Services, Database_Services
Declare function SRP_Datetime, Logging_Services, Environment_Services, Datetime Declare function SRP_Datetime, Logging_Services, Environment_Services, Datetime
Declare function Database_Services, Wo_Mat_Services, Error_Services, RDS_Services
Declare function WM_In_Services, WM_Out_Services
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Archive' LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Archive'
LogDate = Oconv(Date(), 'D4/') LogDate = Oconv(Date(), 'D4/')
@ -51,7 +60,174 @@ Service ArchiveRecords()
End Service End Service
Service DearchiveRecord(Table, ID) Service GetWORelatedRecord(WOLogId)
ErrorMsg = ''
If WOLogId NE '' then
If RowExists('WO_LOG', WOLogId) then
WOLogRec = Database_Services('ReadDataRow', 'WO_LOG', WOLogId, True$, 0, False$)
If Error_Services('NoError') then
ArchiveRecordId = 'WO_LOG*' : WOLogId
ArchiveRecord = ''
WOMatKeys = Wo_Mat_Services('GetWOMatKeys', WOLogId)
If Error_Services('NoError') then
WOMatQAKeys = WOMatKeys
WOStepKey = WOLogRec<WO_LOG_WO_STEP_KEY$>
WMInKeys = Wm_In_Services('GetWMInKeys', WOLogId)
if Error_Services('NoError') then
WMOutKeys = Wm_Out_Services('GetWMOutKeys', WOLogId)
if Error_Services('NoError') then
RDSKeys = RDS_Services('GetRDSKeys', WOLogId)
if Error_Services('NoError') then
ReactRunKeys = RDSKeys
RDSLayerKeys = ''
CleanInspKeys = ''
for each ReactRunKey in ReactRunKeys using @VM setting iPos
ReactRunRec = Database_Services('ReadDataRow', 'REACT_RUN', ReactRunKey, True$, 0, False$)
If Error_Services('NoError') then
CleanInspKeys<1, -1> = ReactRunRec<REACT_RUN_CI_NO$>
RDSLayerKeys<1, -1> = ReactRunRec<REACT_RUN_RDS_LAYER_KEYS$>
end else
ErrorMsg = Error_Services('GetMessage')
end
Next ReactRunKey
RDSTestKeys = ''
If ErrorMsg EQ '' then
For each RDSLayerKey in RDSLayerKeys using @VM
RDSLayerRec = Database_Services('ReadDataRow', 'RDS_LAYER', RDSLayerKey, True$, 0, False$)
If Error_Services('NoError') then
RDSTestKeys<1, -1> = RDSLayerRec<RDS_LAYER_RDS_TEST_KEYS$>
end else
ErrorMsg = Error_Services('GetMessage')
end
Next RDSLayerKey
TWUseKeys = ''
end
TWUseKeys = ''
If ErrorMsg EQ '' then
for each RDSTestKey in RDSTestKeys using @VM
RDSTestRec = Database_Services('ReadDataRow', 'RDS_TEST', RDSTestKey, True$, 0, False$)
If Error_Services('NoError') then
TWUseKeys<1,-1> = RDSTestRec<RDS_TEST_TW_USE_ID$>
end else
ErrorMsg = Error_Services('GetMessage')
end
Next RDSTestKey
end
If ErrorMsg EQ '' then
//ArchiveRecord
//WOLogId
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = WOLogId
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'WO_LOG'
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
//WOStepKey
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = WOStepKey
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'WO_STEP'
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
//WOMatKeys
for each WOMatKey in WOMatKeys using @VM
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = WOMatKey
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'WO_MAT'
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
Next WOMatKey
//WOMatQAKeys
for each WOMatQAKey in WOMatQAKeys using @VM
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = WOMatQAKey
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'WO_MAT_QA'
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
Next WOMatQAKey
//WMInKeys (EpiPro Specific)
for each WMInKey in WMInKeys using @VM
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = WMInKey
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'WM_IN'
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
Next WMInKey
//WMOutKeys (EpiPro Specific)
for each WMOutKey in WMOutKeys using @VM
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = WMOutKey
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'WM_OUT'
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
Next WMOutKey
//RDSKeys
for each RDSKey in RDSKeys using @VM
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = RDSKey
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'RDS'
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
Next RDSKey
//ReactRunKeys
for each ReactRunKey in ReactRunKeys using @VM
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = ReactRunKey
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'REACT_RUN'
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
Next ReactRunKey
//RDSLayerKeys
for each RDSLayerKey in RDSLayerKeys using @VM
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = RDSLayerKey
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'RDS_LAYER'
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
Next RDSLayerKey
//CleanInspKeys
for each CleanInspKey in CleanInspKeys using @VM
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = CleanInspKey
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'CLEAN_INSP'
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
Next CleanInspKey
//RDSTestKeys
for each RDSTestKey in RDSTestKeys using @VM
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = RDSTestKey
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'RDS_TEST'
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
Next RDSTestKey
//TWUseKeys
for each TWUseKey in TWUseKeys using @VM
if TWUseKey NE '' then
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = TWUseKey
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'TW_USE'
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
end
Next TWUseKey
Database_Services('WriteDataRow', 'ARCHIVE', ArchiveRecordId, ArchiveRecord)
If Error_Services('HasError') then
ErrorMsg = Error_Services('GetMessage')
end
end
end else
ErrorMsg = Error_Services('GetMessage')
end
end else
ErrorMsg = Error_Services('GetMessage')
end
end else
ErrorMsg = Error_Services('GetMessage')
end
end else
ErrorMsg = Error_Services('GetMessage')
end
end else
ErrorMsg = Error_Services('GetMessage')
end
end else
ErrorMsg = 'WO_LOG record not found in WO_LOG table.'
end
end else
ErrorMsg = 'WO_LOG ID was null.'
end
If ErrorMsg NE '' then
Error_Services('Add', ErrorMsg)
end
end service end service

View File

@ -233,13 +233,7 @@ 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
@ -384,9 +378,9 @@ 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)
@ -1769,20 +1763,6 @@ AddMakeup:
AvailMU_WMOKeys = '' AvailMU_WMOKeys = ''
UserResp = Response UserResp = Response
MakeupBox = '' MakeupBox = ''
// User requested to convert the current cassette into a makeup box.
// Verify the quantity before proceeding.
If WMOutKey NE '' then
Parms = ''
Parms<1> = WMOutKey ; // Cassette to verify wafer count of.
Parms<2> = 0 ; // Wafer count adjustment - 0 because converting box.
Parms<3> = 'MU' ; // Wafer counter tool location
Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms)
If Proceed NE True$ then Return
end else
ErrMsg('Error starting wafer counter check. WM_OUT key is missing.')
end
CheckValue = 1 CheckValue = 1
FieldNo = WO_MAT_EPO_MAKEUP_BOX$ FieldNo = WO_MAT_EPO_MAKEUP_BOX$
@ -2000,12 +1980,6 @@ MakeupClick:
End Case End Case
If Not(InvalidRequest) then If Not(InvalidRequest) then
Parms = ''
Parms<1> = WMOKey ; // Cassette to verify wafer count of.
Parms<2> = 0 ; // Wafer count adjustment - 0 because converting box.
Parms<3> = 'MU' ; // Wafer counter tool location
Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms)
If Proceed EQ True$ then
Send_Event(CtrlEnt,'GOTFOCUS') Send_Event(CtrlEnt,'GOTFOCUS')
OrgMUPart = XLATE('WM_OUT',WMOKey,'MU_PART_NO','X') OrgMUPart = XLATE('WM_OUT',WMOKey,'MU_PART_NO','X')
// Log the makeup flag change // Log the makeup flag change
@ -2042,9 +2016,6 @@ MakeupClick:
ErrMsg('Unable to Open !WM_OUT to add index transaction. ':WMOutKey) ErrMsg('Unable to Open !WM_OUT to add index transaction. ':WMOutKey)
END END
* End of 10/11/2010 update * End of 10/11/2010 update
end else
InvalidRequest = True$
end
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,15 +1055,7 @@ 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
Parms = ''
Parms<1> = RDSNo ; // Cassette to verify wafer count of.
Parms<2> = 0 ; // Wafer count adjustment - 0 because converting box.
Parms<3> = 'MU' ; // Wafer counter tool location
Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms)
If Proceed EQ True$ then
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue) obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue)
If EpiCheck EQ False$ then If EpiCheck EQ False$ then
IF Get_Status(errCode) THEN IF Get_Status(errCode) THEN
@ -1084,20 +1065,14 @@ MakeUpLot:
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)
If Error_Services('HasError') then ErrMsg(Error_Services('GetMessage'))
end end
end end
end else end else
Set_Property(@WINDOW,'SAVEWARN', False$) Set_Property(@WINDOW,'SAVEWARN', False$)
Send_Event(@WINDOW,'CLEAR') Send_Event(@WINDOW,'CLEAR')
end end
end else
InvalidRequest = True$
end
end else
InvalidRequest = True$
ErrMsg('WARNING: Error starting wafer counter check. RDS No is missing.')
end
end end
end else end else
InvalidRequest = True$ InvalidRequest = True$
@ -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 hh:mm:ss.000Z]") Response = OConv(DatetimeToConv, "[SRP_DATETIME,()YYYY-MM-DD'T'hh:mm:ss.000Z]")
swap ' ' with 'T' in Response
end service
Service ConvertISO8601ToDateTime(ISO8601Dtm)
Response = IConv(ISO8601Dtm, "[SRP_DATETIME,()YYYY-MM-DD'T'hh:mm:ss.000Z]")
end service end service
@ -233,3 +240,4 @@ end service
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

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

View File

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

View File

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

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

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

View File

@ -3,13 +3,15 @@ Compile function NDW_LOAD_UNLOAD_EXTRA_EVENTS(CtrlEntId, Event, @PARAMS)
#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
$Insert MSG_EQUATES
GoToEvent Event for CtrlEntId else GoToEvent Event for CtrlEntId else
// Event not implemented // Event not implemented
@ -42,47 +44,102 @@ end event
//Signature buttons //Signature buttons
Event PUB_SIGN_UNLOAD_EX_1.CLICK() Event PUB_SIGN_UNLOAD_EX_1.CLICK()
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT') RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
initParams = ''
initParams<4> = 'Sign Unload Extra 1'
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, initParams)
Valid = Response<1>
If Valid then
Rds_Services('SignUnloadExtra1', RDSNo, @USER4) Rds_Services('SignUnloadExtra1', RDSNo, @USER4)
If Error_Services('NoError') then If Error_Services('NoError') then
Msg(@Window, 'Unload Extra 1 Signed!') Msg(@Window, 'Unload Extra 1 Signed!')
end else end else
Msg(@Window, Error_Services('GetMessage')) Msg(@Window, Error_Services('GetMessage'))
end end
end
GoSub Refresh GoSub Refresh
end event end event
Event PUB_SIGN_LOAD_EX_1.CLICK() Event PUB_SIGN_LOAD_EX_1.CLICK()
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT') RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
OldReactorNo = RDSRec<RDS_REACTOR$>
NewReactorNo = Get_Property(@Window : '.EDL_REACTOR1', 'TEXT')
initParams = ''
initParams<4> = 'Sign Load Extra 1'
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, initParams)
Valid = Response<1>
If Valid then
If Qa_Services('LoadExtra1stReady', RDSNo) AND (OldReactorNo NE NewReactorNo) then
Gosub ReactorChange
end
If Error_Services('NoError') then
Rds_Services('SignLoadExtra1', RDSNo, @USER4) Rds_Services('SignLoadExtra1', RDSNo, @USER4)
If Error_Services('NoError') then If Error_Services('NoError') then
Msg(@Window, 'Load Extra 1 Signed!') Msg(@Window, 'Load Extra 1 Signed!')
end else end else
Msg(@Window, Error_Services('GetMessage')) Msg(@Window, Error_Services('GetMessage'))
end end
End else
Msg(@Window, Error_Services('GetMessage'))
end
end
GoSub Refresh GoSub Refresh
end event end event
Event PUB_SIGN_UNLOAD_EX_2.CLICK() Event PUB_SIGN_UNLOAD_EX_2.CLICK()
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT') RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
initParams = ''
initParams<4> = 'Sign Unload Extra 2'
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, initParams)
Valid = Response<1>
If Valid then
Rds_Services('SignUnloadExtra2', RDSNo, @USER4) Rds_Services('SignUnloadExtra2', RDSNo, @USER4)
If Error_Services('NoError') then If Error_Services('NoError') then
Msg(@Window, 'Unload Extra 2 Signed!') Msg(@Window, 'Unload Extra 2 Signed!')
end else end else
Msg(@Window, Error_Services('GetMessage')) Msg(@Window, Error_Services('GetMessage'))
end end
end
GoSub Refresh GoSub Refresh
end event end event
Event PUB_SIGN_LOAD_EX_2.CLICK() Event PUB_SIGN_LOAD_EX_2.CLICK()
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT') RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
OldReactorNo = RDSRec<RDS_REACTOR$>
NewReactorNo = Get_Property(@Window : '.EDL_REACTOR2', 'TEXT')
initParams = ''
initParams<4> = 'Sign Load Extra 2'
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, initParams)
Valid = Response<1>
If Valid then
If Qa_Services('LoadExtra2ndReady', RDSNo) AND (OldReactorNo NE NewReactorNo) then
Gosub ReactorChange
end
If Error_Services('NoError') then
Rds_Services('SignLoadExtra2', RDSNo, @USER4) Rds_Services('SignLoadExtra2', RDSNo, @USER4)
If Error_Services('NoError') then If Error_Services('NoError') then
Msg(@Window, 'Load Extra 2 Signed!') Msg(@Window, 'Load Extra 2 Signed!')
end else end else
Msg(@Window, Error_Services('GetMessage')) Msg(@Window, Error_Services('GetMessage'))
end end
End else
Msg(@Window, Error_Services('GetMessage'))
end
end
GoSub Refresh GoSub Refresh
end event end event
//Clear Signature Buttons //Clear Signature Buttons
@ -143,6 +200,9 @@ Refresh:
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT') RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
If RowExists('RDS', RDSNo) then If RowExists('RDS', RDSNo) then
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
if Error_Services('NoError') then
UnloadSigned = RDSRec<RDS_OPERATOR_OUT$>
ReactorNo = RDSRec<RDS_REACTOR$>
//Unload Extra 1 //Unload Extra 1
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$> UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
UnloadExtra1UserFirstLast = xlate( 'LSL_USERS', UnloadExtra1Signature, 'FIRST_LAST', 'X' ) UnloadExtra1UserFirstLast = xlate( 'LSL_USERS', UnloadExtra1Signature, 'FIRST_LAST', 'X' )
@ -153,6 +213,7 @@ Refresh:
LoadExtra1UserFirstLast = xlate( 'LSL_USERS', LoadExtra1Signature, 'FIRST_LAST', 'X' ) LoadExtra1UserFirstLast = xlate( 'LSL_USERS', LoadExtra1Signature, 'FIRST_LAST', 'X' )
LoadExtra1Date = Oconv(RDSRec<RDS_OP_IN_EX2_DATE$>, 'D') LoadExtra1Date = Oconv(RDSRec<RDS_OP_IN_EX2_DATE$>, 'D')
LoadExtra1Time = Oconv(RDSRec<RDS_OP_IN_EX2_TIME$>, 'MT') LoadExtra1Time = Oconv(RDSRec<RDS_OP_IN_EX2_TIME$>, 'MT')
LoadExtra1Reactor = RDSRec<RDS_LOAD_EXTRA_1_REACTOR$>
//Unload Extra 2 //Unload Extra 2
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$> UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
UnloadExtra2UserFirstLast = xlate( 'LSL_USERS', UnloadExtra2Signature, 'FIRST_LAST', 'X' ) UnloadExtra2UserFirstLast = xlate( 'LSL_USERS', UnloadExtra2Signature, 'FIRST_LAST', 'X' )
@ -163,6 +224,7 @@ Refresh:
LoadExtra2UserFirstLast = xlate( 'LSL_USERS', LoadExtra2Signature, 'FIRST_LAST', 'X' ) LoadExtra2UserFirstLast = xlate( 'LSL_USERS', LoadExtra2Signature, 'FIRST_LAST', 'X' )
LoadExtra2Date = Oconv(RDSRec<RDS_OP_IN_EX3_DATE$>, 'D') LoadExtra2Date = Oconv(RDSRec<RDS_OP_IN_EX3_DATE$>, 'D')
LoadExtra2Time = Oconv(RDSRec<RDS_OP_IN_EX3_TIME$>, 'MT') LoadExtra2Time = Oconv(RDSRec<RDS_OP_IN_EX3_TIME$>, 'MT')
LoadExtra2Reactor = RDSRec<RDS_LOAD_EXTRA_2_REACTOR$>
//Populate text fields //Populate text fields
Set_Property(@Window : '.EDL_UNLOAD_EX_1_USER', 'TEXT', UnloadExtra1UserFirstLast) Set_Property(@Window : '.EDL_UNLOAD_EX_1_USER', 'TEXT', UnloadExtra1UserFirstLast)
@ -177,6 +239,55 @@ Refresh:
Set_Property(@Window : '.EDL_LOAD_EX_2_USER', 'TEXT', LoadExtra2UserFirstLast) 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_DATE', 'TEXT', LoadExtra2Date)
Set_Property(@Window : '.EDL_LOAD_EX_2_TIME', 'TEXT', LoadExtra2Time) 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 end else
ResponseValue = Set_Property(@Window, '@responsevalue', 0) ResponseValue = Set_Property(@Window, '@responsevalue', 0)
Post_Event(@Window, 'CLOSE') Post_Event(@Window, 'CLOSE')
@ -184,4 +295,116 @@ Refresh:
return 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

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

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

View File

@ -723,6 +723,7 @@ Event OLE_SCHEDULE.OnContextMenuClick(Item, UserData)
Description = AddEventDetails<5> Description = AddEventDetails<5>
WaferQty = AddEventDetails<6> WaferQty = AddEventDetails<6>
NewApptID = Schedule_Services('AddSchedEvent', ReactorNo, WorkOrder, StartDTM, StopDTM, Description, WaferQty) NewApptID = Schedule_Services('AddSchedEvent', ReactorNo, WorkOrder, StartDTM, StopDTM, Description, WaferQty)
If Error_Services('NoError') then
NewAppt = Schedule_Services('GetScheduleEvent', NewApptID) NewAppt = Schedule_Services('GetScheduleEvent', NewApptID)
If Error_Services('NoError') then If Error_Services('NoError') then
GoSub RefreshReactor GoSub RefreshReactor
@ -733,6 +734,9 @@ Event OLE_SCHEDULE.OnContextMenuClick(Item, UserData)
end else end else
Error_Services('DisplayError') Error_Services('DisplayError')
end end
end else
Error_Services('DisplayError')
end
GoSub HideWaitMessage GoSub HideWaitMessage
end end

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,16 +97,6 @@ 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 = ''
@ -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,8 +321,6 @@ 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)
If QAMetComplete EQ True$ then
ExpectedQty = Xlate('RDS', CassetteID, 'WFRS_OUT', 'X') ExpectedQty = Xlate('RDS', CassetteID, 'WFRS_OUT', 'X')
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty) Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass RDS') Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass RDS')
@ -347,14 +333,9 @@ Event EDL_CASS_BARCODE.LOSTFOCUS(Flag, FocusID)
end else end else
ErrorMsg = Error_Services('GetMessage') ErrorMsg = Error_Services('GetMessage')
end end
end else
ErrorMsg = 'Wafer Counter Operation Not Allowed. A Metrology stage is incomplete.'
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)
If QAMetComplete EQ True$ then
ExpectedQty = Xlate('WM_OUT', CassetteID, 'WAFER_CNT', 'X') ExpectedQty = Xlate('WM_OUT', CassetteID, 'WAFER_CNT', 'X')
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty) Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass WMO') Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass WMO')
@ -366,9 +347,6 @@ Event EDL_CASS_BARCODE.LOSTFOCUS(Flag, FocusID)
end else end else
ErrorMsg = Error_Services('GetMessage') ErrorMsg = Error_Services('GetMessage')
end end
end else
ErrorMsg = 'Wafer Counter Operation Not Allowed. QA Metrology Incomplete.'
end
End Case End Case
If ErrorMsg EQ '' then If ErrorMsg EQ '' then
@ -438,7 +416,53 @@ 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
If Area EQ 'FQA' then
CassetteID = Get_Property(@Window:'.EDL_CASS_ID', 'TEXT')
Begin Case
Case RowExists('RDS', CassetteID)
WOMatKey = Xlate('RDS', CassetteID, 'WO_MAT_KEY', 'X')
QAMetComplete = Wo_Mat_Qa_Services('GetQAMetComplete', WOMatKey)
If QAMetComplete EQ True$ then
ExpectedQty = Xlate('RDS', CassetteID, 'WFRS_OUT', 'X')
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass RDS')
Set_Property(@Window:'.LBL_CASS_BARCODE', 'TEXT', 'Cass RDS 2D')
WOMatKey = Xlate('RDS', CassetteID, 'WO_MAT_KEY', 'X')
CurrWfrMap = WO_Mat_Services('GetWaferMap', WOMatKey)
If Error_Services('NoError') then
ExpectedWfrMap = CurrWfrMap
end else
ErrorMsg = Error_Services('GetMessage')
end
end else
ErrorMsg = 'Wafer Counter Operation Not Allowed. A Metrology stage is incomplete.'
end
Case RowExists('WM_OUT', CassetteID)
WOMatKey = Xlate('WM_OUT', CassetteID, 'WO_MAT_KEY', 'X')
QAMetComplete = Wo_Mat_Qa_Services('GetQAMetComplete', WOMatKey)
If QAMetComplete EQ True$ then
ExpectedQty = Xlate('WM_OUT', CassetteID, 'WAFER_CNT', 'X')
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass WMO')
Set_Property(@Window:'.LBL_CASS_BARCODE', 'TEXT', 'Cass WMO 2D')
CurrWfrMap = WM_Out_Services('GetWaferMap', CassetteID)
If Error_Services('NoError') then
ExpectedWfrMap = CurrWfrMap
end else
ErrorMsg = Error_Services('GetMessage')
end
end else
ErrorMsg = 'Wafer Counter Operation Not Allowed. QA Metrology Incomplete.'
end
End Case
end
If ErrorMsg EQ '' then
Def = "" Def = ""
Def<MTEXT$> = "Retreiving Wafer Counter Data..." Def<MTEXT$> = "Retreiving Wafer Counter Data..."
Def<MTYPE$> = "U" Def<MTYPE$> = "U"
@ -531,17 +555,16 @@ Event EDL_TOOL_BARCODE.LOSTFOCUS(Flag, FocusID)
end else end else
ErrorMsg = Error_Services('GetMessage') ErrorMsg = Error_Services('GetMessage')
end 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

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

View File

@ -20,9 +20,9 @@ COMPILE FUNCTION obj_Post_Log(Method,Parms)
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, Get_Property, obj_RDS, Database_Services, Environment_Services DECLARE FUNCTION 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

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

View File

@ -18,6 +18,7 @@ COMPILE FUNCTION obj_RDS(Method,Parms)
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, NextKey, obj_WO_Verify, obj_Prod_Spec, Send_Dyn, obj_RDS_Makeup DECLARE FUNCTION 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,8 +164,16 @@ 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>
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 ;* 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

View File

@ -20,13 +20,13 @@ DECLARE FUNCTION Printer_Select, Set_Printer, obj_Install, Direct_Print, Environ
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, Direct_Print DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, Direct_Print
DECLARE SUBROUTINE ErrMsg, Btree.Extract DECLARE SUBROUTINE ErrMsg, Btree.Extract
$INSERT LOGICAL
$INSERT MSG_EQUATES $INSERT MSG_EQUATES
$INSERT REACT_ITEM_EQUATES $INSERT REACT_ITEM_EQUATES
$INSERT REACT_ITEM_HIST_EQUATES $INSERT REACT_ITEM_HIST_EQUATES
$INSERT REACTOR_EQUATES $INSERT REACTOR_EQUATES
$INSERT REACT_READS_EQUATES $INSERT REACT_READS_EQUATES
EQU PI$LEFT TO 1 EQU PI$LEFT TO 1
EQU PI$TOP TO 2 EQU PI$TOP TO 2
EQU PI$RIGHT TO 3 EQU PI$RIGHT TO 3
@ -35,12 +35,9 @@ EQU PI$WIDTH TO 5
EQU PI$HEIGHT TO 6 EQU PI$HEIGHT TO 6
EQU PI$SIZE TO 7 EQU PI$SIZE TO 7
EQU CRLF$ TO \0D0A\ EQU CRLF$ TO \0D0A\
EQU TAB$ TO CHAR(9) EQU TAB$ TO CHAR(9)
ErrTitle = 'Error in Stored Procedure "obj_ReactItem"' ErrTitle = 'Error in Stored Procedure "obj_ReactItem"'
ErrorMsg = '' ErrorMsg = ''
@ -108,7 +105,7 @@ BEGIN CASE
CASE InstDTM NE '' AND RemDTM = '' ; Result = 'I' CASE InstDTM NE '' AND RemDTM = '' ; Result = 'I'
CASE InstDTM NE '' AND RemDTM NE '' OR INDEX(Notes,'USED',1) ; Result = 'U' CASE InstDTM NE '' AND RemDTM NE '' OR INDEX(Notes,'USED',1) ; Result = 'U'
CASE InstDTM = '' AND RemDTM = '' ; Result = 'N' CASE InstDTM = '' AND RemDTM = '' ; Result = 'N'
CASE 1 ; Result = '?' CASE Otherwise$ ; Result = '?'
END CASE END CASE
RETURN RETURN
@ -402,7 +399,6 @@ Result = Ans
return return
* * * * * * * * * * * * * *
Serial_GRNo: Serial_GRNo:
* * * * * * * * * * * * * *
@ -436,8 +432,6 @@ FOR I = 1 TO snCnt
END ;* End of check for null SerialNo END ;* End of check for null SerialNo
NEXT I NEXT I
RETURN RETURN
@ -542,8 +536,7 @@ BEGIN CASE
END END
CASE 1 CASE Otherwise$
* Graphite types * Graphite types
@ -577,15 +570,12 @@ BEGIN CASE
BEGIN CASE BEGIN CASE
CASE RingDesc NE '' AND SuscSize EQ '' AND PktSize NE '' ; CalcDesc := RingDesc CASE RingDesc NE '' AND SuscSize EQ '' AND PktSize NE '' ; CalcDesc := RingDesc
CASE RingDesc NE '' AND SuscSize NE '' ; CalcDesc := RingDesc:' for ':SuscSize:'in Susceptor with ':PktQty:' ':PktLabel CASE RingDesc NE '' AND SuscSize NE '' ; CalcDesc := RingDesc:' for ':SuscSize:'in Susceptor with ':PktQty:' ':PktLabel
*CASE RingDesc EQ '' AND SuscSize NE '' ; CalcDesc := RITypeDesc:', ':SuscSize:'in with ':PktSize:'in':PktQty:' ':PktLabel ;* Replaced PktQty with PktSize -dkk 9/11/14
CASE RingDesc EQ '' AND SuscSize NE '' ; CalcDesc := RITypeDesc:' ':SuscSize:'in, with ':PktQty: ' ':PktLabel:' @ ':PktSize:'in' ;* Replaced PktQty with PktSize -dkk 9/11/14 CASE RingDesc EQ '' AND SuscSize NE '' ; CalcDesc := RITypeDesc:' ':SuscSize:'in, with ':PktQty: ' ':PktLabel:' @ ':PktSize:'in' ;* Replaced PktQty with PktSize -dkk 9/11/14
CASE 1 CASE RITypeDesc NE '' AND PktQty NE '' AND PktSize NE '' ; CalcDesc := RITypeDesc:' with ':PktQty: ' ':PktLabel:' @ ':PktSize:'in'
CASE Otherwise$
END CASE END CASE
END CASE END CASE
Result = CalcDesc Result = CalcDesc
@ -593,7 +583,6 @@ Result = CalcDesc
RETURN RETURN
* * * * * * * * * * * * * *
PrintLabel: PrintLabel:
* * * * * * * * * * * * * *
@ -675,8 +664,6 @@ IF stat < 0 THEN GOTO OIPrint_Error
EQU DosPath$ TO 'C:\WINDOWS\OIZPL.TXT' ;* remove jch EQU DosPath$ TO 'C:\WINDOWS\OIZPL.TXT' ;* remove jch
Str = '^XA' Str = '^XA'
Str := '^LH0,0' Str := '^LH0,0'
Str := '^PR2' ;* Print speed 2 inches per second Str := '^PR2' ;* Print speed 2 inches per second
@ -684,8 +671,6 @@ Str := '^LL406' ;* Label length = 203.2dpi x 2in
Str := '^PW812' ;* Print width = 203.2dpi x 4in ;* This was 900 jch 12/30/2013 Str := '^PW812' ;* Print width = 203.2dpi x 4in ;* This was 900 jch 12/30/2013
Str := '^MD15' ;* Media darkness Str := '^MD15' ;* Media darkness
Str := '^MMT' ;* Media mode t=tear off mode Str := '^MMT' ;* Media mode t=tear off mode
*Str := '^PQ2' ;* Print 2 labels for each pass through here
Str := '^FS' ;* end command Str := '^FS' ;* end command
****** First Line ****** First Line
@ -728,12 +713,6 @@ Str:= '^FO500,160^AC,18^FDSN:^FS':CRLF$ ;* Label
Str:= '^FO540,160^A045,25^FD':SerialNo:'^FS':CRLF$ ;* Data Str:= '^FO540,160^A045,25^FD':SerialNo:'^FS':CRLF$ ;* Data
****** Separator bar
*Str:= '^FO15,128^GB795,1^FS'
****** Fifth Line ****** Fifth Line
Str := '^FO30,205^AC,18^FDEntered:^FS':CRLF$ Str := '^FO30,205^AC,18^FDEntered:^FS':CRLF$
@ -754,10 +733,6 @@ Str := '^FO610,250^A0,20^FD':ReactNo:'^FS':CRLF$
Str := '^FO30,295^AC,18^FDRemoved:^FS':CRLF$ Str := '^FO30,295^AC,18^FDRemoved:^FS':CRLF$
Str := '^FO150,295^A0,20^FD':RemoveDTM:'^FS':CRLF$ Str := '^FO150,295^A0,20^FD':RemoveDTM:'^FS':CRLF$
*Str := '^FO410,295^AC,18^FDReact Type:^FS':CRLF$
*Str := '^FO560,295^A0,20^FD':PrintReactType:'^FS':CRLF$
* * * * * * * * * * * *
Jump: Jump:
@ -783,6 +758,3 @@ end
RETURN RETURN

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,6 +3293,19 @@ 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$>
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 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

@ -14,7 +14,6 @@ COMPILE FUNCTION obj_WO_React(Method,Parms)
*/ */
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, NextKey, obj_Prod_Spec, obj_WO_Mat_QA, GetTickCount DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, NextKey, obj_Prod_Spec, obj_WO_Mat_QA, GetTickCount
Declare function Environment_Services, Database_Services Declare function Environment_Services, Database_Services
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, RList, ErrMsg, Btree.Extract, obj_WO_Mat_QA, Mona_Services DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, RList, ErrMsg, Btree.Extract, obj_WO_Mat_QA, Mona_Services
@ -134,11 +133,13 @@ CassNos = WOReactRec<WO_REACT_CASS_NO$> ;* List after insert
GOSUB BuildAllTestPos GOSUB BuildAllTestPos
ChangePosList = FIELD(AllTestPos,@VM,TrimPos,SeqCnt) ChangePosList = FIELD(AllTestPos,@VM,TrimPos,SeqCnt)
// Add QAMet spec data to cassettes now associated with the test
GOSUB AddSchedQA ;* Add QAMet spec data to cassettes now associated with the test positions after removing the RDS & Cassno from the lists // positions after removing the RDS & Cassno from the lists
GOSUB AddSchedQA
otParms = FIELDSTORE(otParms,@RM,4,0,WOReactRec) otParms = FIELDSTORE(otParms,@RM,4,0,WOReactRec)
obj_Tables('WriteOnlyRec',otParms) ;* Done with updates to the WO_REACT record // Done with updates to the WO_REACT record
obj_Tables('WriteOnlyRec',otParms)
Result = Log Result = Log
@ -148,7 +149,6 @@ Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick
RETURN RETURN
* * * * * * * * * * * * * *
RemRDSNo: RemRDSNo:
* * * * * * * * * * * * * *
@ -171,7 +171,7 @@ IF CassNo = '' THEN RETURN
WOReactKey = WONo:'*':StepNo:'*':ReactNo WOReactKey = WONo:'*':StepNo:'*':ReactNo
otParms = 'WO_REACT':@RM:WOReactKey otParms = 'WO_REACT':@RM:WOReactKey
// 10/12/18 Changed to ReadOnlyRec as per Francois' instructions. - djs
WOReactRec = obj_Tables('ReadOnlyRec',otParms) WOReactRec = obj_Tables('ReadOnlyRec',otParms)
RDSNos = WOReactRec<WO_REACT_RDS_NO$> RDSNos = WOReactRec<WO_REACT_RDS_NO$>
@ -222,7 +222,7 @@ ChangePosList = FIELD(AllTestPos,@VM,TrimPos,SeqCnt)
GOSUB AddSchedQA ;* Add QAMet spec data to cassettes now associated with the test positions after removing the RDS & Cassno from the lists GOSUB AddSchedQA ;* Add QAMet spec data to cassettes now associated with the test positions after removing the RDS & Cassno from the lists
otParms = FIELDSTORE(otParms,@RM,4,0,WOReactRec) otParms = FIELDSTORE(otParms,@RM,4,0,WOReactRec)
// 10/12/18 Changed to WriteOnlyRec as per Francois' instructions. - djs
obj_Tables('WriteOnlyRec',otParms) ;* Done with updates to the WO_REACT record obj_Tables('WriteOnlyRec',otParms) ;* Done with updates to the WO_REACT record
Result = Log Result = Log
@ -233,9 +233,6 @@ Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick
RETURN RETURN
************** Internal Methods ************* ************** Internal Methods *************
* * * * * * * * * * * * * *
@ -260,7 +257,6 @@ Log := 'AllTestPos: ':AllTestPos:@FM
RETURN RETURN
* * * * * * * * * * * * * *
RemSchedQA: RemSchedQA:
* * * * * * * * * * * * * *
@ -279,12 +275,6 @@ FOR I = 1 TO chgCnt
ErrMsg(errCode) ErrMsg(errCode)
END END
*obj_WO_Mat('RemQAMet',owmParms) ;* Dead 6/5/2015 JCH - Remove after a few days
*IF Get_Status(errCode) THEN
* ErrMsg(errCode)
*END
NEXT I NEXT I
RETURN RETURN
@ -326,14 +316,6 @@ FOR I = 1 TO chgCnt
ErrMsg(errCode) ErrMsg(errCode)
END END
*obj_WO_Mat('AddQAMet',owmParms) ;* Dead 6/5/2015 JCH - remove after a few days
*IF Get_Status(errCode) THEN
* ErrMsg(errCode)
*END
NEXT I NEXT I
RETURN RETURN

View File

@ -119,9 +119,22 @@ API oiwizard.POST
// 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,11 +832,7 @@ 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>
end else
colData<StepNo,STEP_RECIPE$> = StageRec<PRS_STAGE_MET_RECIPE$,M>
end
colData<StepNo,STEP_SPEC_TOL$> = StageRec<PRS_STAGE_MET_MIN$,M>:' - ':StageRec<PRS_STAGE_MET_MAX$,M>:' ':obj_Met_Prop('GetUnitsDesc',StageRec<PRS_STAGE_MET_PROP$,M>) colData<StepNo,STEP_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_SIZE$> = StageRec<PRS_STAGE_MET_WFR_QTY$,M>
colData<StepNo,STEP_FREQ$> = StageRec<PRS_STAGE_MET_INTERVAL$,M> colData<StepNo,STEP_FREQ$> = StageRec<PRS_STAGE_MET_INTERVAL$,M>

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)
if Error_Services('NoError') then
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$> StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$> UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$> LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$> UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$> LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$>
StandardUnloadSignature = RDSRec<RDS_OPERATOR_OUT$> StandardUnloadSignature = RDSRec<RDS_OPERATOR_OUT$>
Reactor = RDSRec<RDS_REACTOR$>
If Reactor NE '' then
WONo = RDSRec<RDS_WO$>
Query = 'SELECT REACT_STATE WITH SCHED_WO CONTAINING ':WONo
GoSub ClearCursors
Set_Status(0)
RList(Query, TARGET_ACTIVELIST$, '', '' '')
SchedReactors = ''
EOF = False$
Loop
ReadNext SchedReactor else EOF = True$
Until EOF
SchedReactors<0, -1> = SchedReactor
Repeat
Locate Reactor in SchedReactors using @VM setting vPos then
If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature EQ '' And LoadExtra2Signature EQ ''AND UnloadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature EQ '' And LoadExtra2Signature EQ ''AND UnloadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
Response = True$ 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,8 +2386,10 @@ 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)
if Error_Services('NoError') then
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$> StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$> UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$> LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
@ -2301,22 +2401,63 @@ Service UnsignLoadExtra1stReady(RDSNo)
Response = True$ Response = True$
end end
end end
end else
ErrorMsg = Error_Services('GetMessage')
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)
If Error_Services('NoError') then
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$> StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$> UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$> LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$> UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$> LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$>
StandardUnloadSignature = RDSRec<RDS_OPERATOR_OUT$> StandardUnloadSignature = RDSRec<RDS_OPERATOR_OUT$>
Reactor = RDSRec<RDS_REACTOR$>
If Reactor NE '' then
WONo = RDSRec<RDS_WO$>
Query = 'SELECT REACT_STATE WITH SCHED_WO CONTAINING ':WONo
ClearSelect
Set_Status(0)
RList(Query, TARGET_ACTIVELIST$, '', '' '')
SchedReactors = ''
EOF = False$
Loop
ReadNext SchedReactor else EOF = True$
Until EOF
SchedReactors<0, -1> = SchedReactor
Repeat
Locate Reactor in SchedReactors using @VM setting vPos then
If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature NE '' AND UnloadExtra2Signature NE '' And LoadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature NE '' AND UnloadExtra2Signature NE '' And LoadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
Response = True$ Response = True$
end else
ErrorMsg = 'RDS is not eligible to have the Load Extra 2 set.'
end
end else
Swap @VM with ',' in SchedReactors
ErrorMsg = 'Assigned reactor, ':Reactor:', does not equal any scheduled reactor(s), ':SchedReactors:'.'
Response = False$
end
end
end else
ErrorMsg = Error_Services('GetMessage')
end
If ErrorMsg NE '' then
Error_Services('Add', ErrorMsg)
end end
end service end service
@ -2324,8 +2465,10 @@ 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)
If Error_Services('NoError') then
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$> StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$> UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$> LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
@ -2337,6 +2480,13 @@ Service UnsignLoadExtra2ndReady(RDSNo)
Response = True$ Response = True$
end end
end end
end else
ErrorMsg = Error_Services('GetMessage')
end
If ErrorMsg NE '' then
Error_Services('Add', ErrorMsg)
end
end service end service
@ -2401,62 +2551,6 @@ Service SignLoadStage(RDSNo, Username, WaferQty, LLSide, ScanEntry)
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' )
LoadDTM = SigDt:' ':SigTm LoadDTM = SigDt:' ':SigTm
@ -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'
@ -769,7 +771,7 @@ WRITE_RECORD_PRE:
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,25 +780,8 @@ 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
Record = ''
ActionFlow = ACTION_STOP$
Case ( (OrigVerSig NE '') and (NewVerSig EQ '') ) or ( (OrigVerDate NE '') and (NewVerDate EQ '') ) |
or ( (OrigVerTime NE '') and (NewVerTime EQ '') ) or ( (NewVerDate EQ '') and (NewVerTime NE '') ) |
or ( (NewVerDate NE '') and (NewVerTime EQ '') )
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = RDSKeyID
LogData<4> = 'Signature data cannot be removed!'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
// User is attempting to erase data that is prohibited from being erased Set the FS104 error and block the write.
Error_Services('Add', 'Signature data cannot be removed!')
OrigFileError = 104:': Signature data cannot be removed!'
Status = 0 Status = 0
Record = '' Record = ''
ActionFlow = ACTION_STOP$ ActionFlow = ACTION_STOP$
@ -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,6 +846,11 @@ 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
@ -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
@ -183,17 +181,20 @@ 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$)
If Error_Services('NoError') then
If Reactor NE '' then
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', Reactor) ReactorRec = Database_Services('ReadDataRow', 'REACTOR', Reactor)
if Error_Services('NoError') then
ReactorType = ReactorRec<REACTOR_REACT_TYPE$> ReactorType = ReactorRec<REACTOR_REACT_TYPE$>
ROTREnabled = Xlate('REACTOR', Reactor, 'ENABLE_ROTR', 'X') ROTREnabled = Xlate('REACTOR', Reactor, 'ENABLE_ROTR', 'X')
@ -418,45 +419,29 @@ Event PUB_SIGN.CLICK()
ErrorMsg = Error_Services('GetMessage') ErrorMsg = Error_Services('GetMessage')
ErrMsg(ErrorMsg) ErrMsg(ErrorMsg)
end end
end else
ErrorMsg = Error_Services('GetMessage')
Msg(@Window, ErrorMsg)
end
end else end else
Msg(@Window, "Reactor load signature not allowed on a down reactor.") Msg(@Window, "Reactor load signature not allowed on a down reactor.")
end end
end else
Msg(@Window, "RDS is not assigned to a reactor.")
end
end else
ErrorMsg = Error_Services('GetMessage')
Msg(@Window, ErrorMsg)
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
If IsEligible then
// 3. Lead/Supervisor/Engineer/EngTech override // 3. Lead/Supervisor/Engineer/EngTech override
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4 : @FM : 'LEAD' : @VM : 'SUPERVISOR':@VM:'ENGINEER':@VM:'ENG_TECH') Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4 : @FM : 'LEAD' : @VM : 'SUPERVISOR':@VM:'ENGINEER':@VM:'ENG_TECH')
Valid = Response<1> Valid = Response<1>
@ -519,7 +504,6 @@ Event PUB_SIGN.CLICK()
Set_Property(@Window, 'IOOPTIONS', IOOptions) Set_Property(@Window, 'IOOPTIONS', IOOptions)
Reactor = Get_Property(@Window:'.REACTOR', 'TEXT') Reactor = Get_Property(@Window:'.REACTOR', 'TEXT')
Rds_Services('AddComment', RDSNo, 'Load Stage Unsigned from Reactor ' : Reactor)
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', Reactor) ReactorRec = Database_Services('ReadDataRow', 'REACTOR', Reactor)
PreviousRotrOverrideRds = ReactorRec<REACTOR_PREVIOUS_ROTR_OVERRIDE_RDS$> PreviousRotrOverrideRds = ReactorRec<REACTOR_PREVIOUS_ROTR_OVERRIDE_RDS$>
@ -541,7 +525,10 @@ Event PUB_SIGN.CLICK()
end else end else
Return 0 Return 0
end end
end else
ErrorMessage = Error_Services('GetMessage')
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>
@ -96,19 +94,15 @@ 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')
@ -161,18 +225,24 @@ Event PUB_SIGN.CLICK()
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') return
ErrMsg(ErrorMsg)
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 end
Set_Property(@Window, 'SAVEWARN', False$)
Set_Status(0)
Send_Event(@Window, 'READ')
end event return
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,204 @@
Compile function RDS_TEST_Services(@Service, @Params)
/***********************************************************************************************************************
Name : Rds_Test_Services
Description : Handler program for all RDS_TEST services.
Notes : Application errors should be logged using the Error Services module. There are a few methodological
assumptions built into way errors are managed which are important to understand in order to properly
work with Error Services:
- The term 'top' refers to the originating procedure of a call stack and the term 'bottom' refers to
the last routine (or the current routine) within a call stack. Within the OpenInsight Debugger
this will appear backwards since the originating procedure always appears at the bottom of the
list and the current routine appears at the top of the list. We are using this orientation because
it is common to refer to the process of calling other procedures as 'drilling down'.
- The reason for defining the orientation of the call stack is because Error_Services allows for
multiple error conditions to be appended to an original error. In most cases this will happen when
a procedure at the bottom of the stack generates an error condition and then returns to its
calling procedure. This higher level procedure can optionally add more information relevant to
itself. This continues as the call stack 'bubbles' its way back to the top to where the
originating procedure is waiting.
- Native OpenInsight commands that handle errors (e.g., Set_Status, Set_FSError, Set_EventStatus)
preserve their error state until explicitly cleared. This can hinder the normal execution of code
since subsequent procedures (usually SSPs) will fail if a pre-existing error condition exists.
Our philosophy is that error conditions should automatically be cleared before a new procedure
is executed to avoid this problem. However, the nature of Basic+ does not make this easy to
automate for any given stored procedure. Therefore, if a stored procedure wants to conform to our
philosophy then it should include a call into the 'Clear' service request at the top of the
program. Alternatively this can be done through a common insert (see SERVICE_SETUP for example.)
- Service modules will use the SERVICE_SETUP insert and therefore automatically clear out any
error conditions that were set before.
Parameters :
Service [in] -- Name of the service being requested
Param1-10 [in/out] -- Additional request parameter holders
Response [out] -- Response to be sent back to the Controller (MCP) or requesting procedure
Metadata :
History : (Date, Initials, Notes)
09/26/2025 djs Original programmer.
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
$Insert SERVICE_SETUP
$insert APP_INSERTS
$Insert RDS_EQUATES
$Insert RDS_TEST_EQUATES
$Insert PROD_SPEC_EQUATES
$Insert RDS_LAYER_EQUATES
$INSERT PRS_LAYER_EQU
Declare function Database_Services, Error_Services, obj_Prod_Spec
Declare subroutine Database_Services, Error_Services
GoToService
Return Response or ""
//-----------------------------------------------------------------------------
// SERVICES
//-----------------------------------------------------------------------------
Service UpdateRDSTestSpecs(RdsNo)
ErrorMsg = ''
If (RDSNo NE '') then
If RowExists('RDS', RDSNo) then
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
If Error_Services('NoError') then
LayerKeys = RDSRec<RDS_RDS_LAYER_KEYS$>
PSNId = RDSRec<RDS_PROD_SPEC_ID$>
For each LayerKey in LayerKeys using @VM setting vPos
LayerSet = Field(LayerKey, '*', 2, 1)
LayerSpecs = obj_Prod_Spec('GetLayerProp',PSNId:@RM:LayerSet:@RM:1) ;* Last parameter specifies no output conversion on return data
LayerSpecs = Field(LayerSpecs,@FM,2,99) ;* Returns with the layer set ID in the first field of each line
ErrCode = ''
If Not(Get_Status(ErrCode)) then
WaferSize = Xlate('PROD_SPEC', PSNId, 'SUB_WAFER_SIZE', 'X')
SubOrientation = Xlate('PROD_SPEC', PSNId, 'SUB_ORIENTATION', 'X')
ResUnits = LayerSpecs<PRS_LAYER_RES_UNITS$>
ReactorType = Xlate('PROD_SPEC', PSNId, PROD_SPEC_REACTOR_TYPE$, 'X')
ThickFilmMet = Xlate('PROD_SPEC', PSNId, PROD_SPEC_THICKFILM_MET$, 'X') ;* Added 1/16/2009 JCH
RdsTestKeys = Database_Services('ReadDataColumn', 'RDS_LAYER', LayerKey, RDS_LAYER_RDS_TEST_KEYS$)
If Error_Services('NoError') then
For each RdsTestKey in RdsTestKeys using @VM setting RdsTestPos
RdsTestRec = Database_Services('ReadDataRow', 'RDS_TEST', RdsTestKey)
If Error_Services('NoError') then
RDSTestRec<RDS_TEST_WAFER_SIZE$> = WaferSize
RDSTestRec<RDS_TEST_SUB_ORIENTATION$> = SubOrientation
RDSTestRec<RDS_TEST_SPEC_DOPANT$> = LayerSpecs<PRS_LAYER_DOPANT$>
RDSTestRec<RDS_TEST_SPEC_RECIPE$> = LayerSpecs<PRS_LAYER_RECIPE$>
RDSTestRec<RDS_TEST_SPEC_RECIPE_NAME$> = LayerSpecs<PRS_LAYER_RECIPE_NAME$>
RDSTestRec<RDS_TEST_SPEC_THICK_MIN$> = LayerSpecs<PRS_LAYER_THICK_MIN$>
RDSTestRec<RDS_TEST_SPEC_THICK_TARGET$> = LayerSpecs<PRS_LAYER_THICK_TARGET$>
RDSTestRec<RDS_TEST_SPEC_THICK_MAX$> = LayerSpecs<PRS_LAYER_THICK_MAX$>
RDSTestRec<RDS_TEST_SPEC_THICK_UNITS$> = LayerSpecs<PRS_LAYER_THICK_UNITS$>
RDSTestRec<RDS_TEST_SPEC_RES_MIN$> = LayerSpecs<PRS_LAYER_RES_MIN$>
RDSTestRec<RDS_TEST_SPEC_RES_TARGET$> = LayerSpecs<PRS_LAYER_RES_TARGET$>
RDSTestRec<RDS_TEST_SPEC_RES_MAX$> = LayerSpecs<PRS_LAYER_RES_MAX$>
RDSTestRec<RDS_TEST_SPEC_RES_UNITS$> = LayerSpecs<PRS_LAYER_RES_UNITS$>
RDSTestRec<RDS_TEST_SPEC_CON_MIN$> = LayerSpecs<PRS_LAYER_CONC_MIN$>
RDSTestRec<RDS_TEST_SPEC_CON_TARGET$> = LayerSpecs<PRS_LAYER_CONC_TARGET$>
RDSTestRec<RDS_TEST_SPEC_CON_MAX$> = LayerSpecs<PRS_LAYER_CONC_MAX$>
RDSTestRec<RDS_TEST_SPEC_CON_UNITS$> = LayerSpecs<PRS_LAYER_CONC_UNITS$>
RDSTestRec<RDS_TEST_SPEC_STRESS_MIN$> = LayerSpecs<PRS_LAYER_STRESS_MIN$>
RDSTestRec<RDS_TEST_SPEC_STRESS_MAX$> = LayerSpecs<PRS_LAYER_STRESS_MAX$>
RDSTestRec<RDS_TEST_SPEC_TRANS$> = LayerSpecs<PRS_LAYER_TRANS_SPEC$>
RDSTestRec<RDS_TEST_SPEC_CRES_MIN$> = LayerSpecs<PRS_LAYER_CRES_MIN$>
RDSTestRec<RDS_TEST_SPEC_CRES_TARGET$> = LayerSpecs<PRS_LAYER_CRES_TARGET$>
RDSTestRec<RDS_TEST_SPEC_CRES_MAX$> = LayerSpecs<PRS_LAYER_CRES_MAX$>
RDSTestRec<RDS_TEST_SPEC_CRES_UNITS$> = LayerSpecs<PRS_LAYER_CRES_UNITS$>
For A = 11 to 19
RDSTestRec<A> = LayerSpecs<PRS_LAYER_THICK_MEASUREMENT$,A-10>
Next A
For A = 24 to 32
RDSTestRec<A> = LayerSpecs<PRS_LAYER_RES_MEASUREMENT$,A-23>
Next A
For A = 37 to 45
RDSTestRec<A> = LayerSpecs<PRS_LAYER_CONC_MEASUREMENT$,A-36>
Next A
For A = 50 to 58
RDSTestRec<A> = LayerSpecs<PRS_LAYER_STRESS_MEASUREMENT$,A-49>
Next A
For A = 121 to 129
RDSTestRec<A> = LayerSpecs<PRS_LAYER_CRES_MEASUREMENT$,A-120>
Next A
RDSTestRec<RDS_TEST_SPEC_THICK_MPATTERN$> = LayerSpecs<PRS_LAYER_THICK_MEASUREMENT$,PRS_MPATTERN$>
RDSTestRec<RDS_TEST_SPEC_RES_MPATTERN$> = LayerSpecs<PRS_LAYER_RES_MEASUREMENT$,PRS_MPATTERN$>
RDSTestRec<RDS_TEST_SPEC_CON_MPATTERN$> = LayerSpecs<PRS_LAYER_CONC_MEASUREMENT$,PRS_MPATTERN$>
RDSTestRec<RDS_TEST_SPEC_STRESS_MPATTERN$> = LayerSpecs<PRS_LAYER_STRESS_MEASUREMENT$,PRS_MPATTERN$>
RDSTestRec<RDS_TEST_SPEC_CRES_MPATTERN$> = LayerSpecs<PRS_LAYER_CRES_MEASUREMENT$,PRS_MPATTERN$>
RDSTestRec<RDS_TEST_REACTOR_TYPE$> = ReactorType
If ( (ReactorType EQ 'P') or (ReactorType EQ 'EPP') or (ThickFilmMet EQ True$) ) then
SpecMap = XLATE('PROD_SPEC', PSNId, PROD_SPEC_TEST_POINT_MAP$, 'X') ;* Added 4/8/2009 JCH new field in PROD_SPEC
If SpecMap NE '' then
RDSTestRec<RDS_TEST_TEST_POINT_MAP$> = SpecMap
end else
;* Added ThickFilmMet check - 1/16/2009 JCH
AllTargetThicks = XLATE('PROD_SPEC', PSNId, 'THICK_TARGET_ALL', 'X')
TargetCnt = COUNT(AllTargetThicks,@VM) + (AllTargetThicks NE '')
Begin Case
Case TargetCnt = 2
CombinedThick = SUM(AllTargetThicks)
Case TargetCnt = 1 OR TargetCnt = 3
CombinedThick = AllTargetThicks[-1,'B':@VM]
End Case
If OCONV(CombinedThick,'MD2') > '65.0' then
RDSTestRec<RDS_TEST_TEST_POINT_MAP$> = 'FTIR_T'
end else
RDSTestRec<RDS_TEST_TEST_POINT_MAP$> = 'FTIR'
end
end
end else
RDSTestRec<RDS_TEST_TEST_POINT_MAP$> = 'ASM17' ;* 17 Point linear test pattern until PROD_SPEC is updated support other types
end
Database_Services('WriteDataRow', 'RDS_TEST', RdsTestKey, RdsTestRec)
If Error_Services('HasError') then
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
end
end else
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
end
Next RdsTestKey
end else
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
end
end else
ErrorMsg = 'Error in ':Service:' service. Error calling obj_Prod_Spec("GetLayerProp"). Error code: ':ErrCode
end
Next LayerKey
end else
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
end
end else
ErrorMsg = 'Error in ':Service:' service. RDS ':RdsNo:' does not exist'
end
end else
ErrorMsg = 'Error in ':Service:' service. Null RDSNo passed into service'
end
If (ErrorMsg NE '') then Error_Services('Add', ErrorMsg)
End Service

View File

@ -93,7 +93,7 @@ Equ ACTION$SPEC_SURFSCAN_RECIPE TO 8
Declare subroutine ErrMsg, Set_Status, obj_WO_Mat, obj_WO_Mat_Log, obj_RDS, Set_Property, Send_Event, Database_Services Declare subroutine 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,8 +221,9 @@ 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 Error_Services('NoError') then
If KeyID NE '' and Record NE '' then If KeyID NE '' and Record NE '' then
Database_Services('WriteDataRow', 'REACT_ITEM', KeyID, Record) React_Item_Services('UpdateReactItem', KeyID, Record)
end end
If Error_Services('NoError') then If Error_Services('NoError') then
StatusCode = 200 StatusCode = 200
@ -230,6 +232,9 @@ API ReactItems.ID.PUT
end else end else
HTTP_Services('SetResponseStatus', 400, Error_Services('GetMessage')) HTTP_Services('SetResponseStatus', 400, Error_Services('GetMessage'))
end end
end else
HTTP_Services('SetResponseStatus', 400, Error_Services('GetMessage'))
end
end else end else
// Error parsing JSON // Error parsing JSON
HTTP_Services('SetResponseStatus', 400, 'Unable to parse the JSON data from the request.') HTTP_Services('SetResponseStatus', 400, 'Unable to parse the JSON data from the request.')
@ -356,4 +361,3 @@ CreateHALCollection:
end end
return return

View File

@ -149,8 +149,7 @@ WRITE_RECORD:
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,11 +165,15 @@ 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)
If Error_Services('NoError') then
// Pull in a fresh copy of the record with the POST_BY signature set // Pull in a fresh copy of the record with the POST_BY signature set
ReactorLogRec = Database_Services('ReadDataRow', 'REACTOR_LOG', ReactorLogID) ReactorLogRec = Database_Services('ReadDataRow', 'REACTOR_LOG', ReactorLogID)
If Get_Status(ErrCode) then If Get_Status(ErrCode) then
ErrorMsg = 'Error in ':Service:' service. Error calling obj_Reactor_Log("PostReactItems"). Error code: ':ErrCode:'.' ErrorMsg = 'Error in ':Service:' service. Error calling obj_Reactor_Log("PostReactItems"). Error code: ':ErrCode:'.'
end end
end else
ErrorMsg = Error_Services('GetMessage')
end
end end
end end
If ErrorMsg EQ '' then If ErrorMsg EQ '' then
@ -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)
LoadLockLeftRDS = ''
LoadLockRightRDS = ''
LoadedRDS = Xlate('REACT_STATUS', ReactorNo, 'LOAD_RDS', 'X') 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 RIType EQ 'S' then
PocketQty = ''
Set_Property(@Window:'.PKT_QTY', 'TEXT', '')
PartType = Get_Property(@Window: '.PART_TYPE', 'TEXT')
If (PartType EQ 'HTR') OR (PartType EQ 'EPP') OR (PartType EQ 'ASM') then
RetVal = Popup(@WINDOW,TypeOver,'WAFER_SIZES')
IF RetVal NE '' THEN IF RetVal NE '' THEN
oaParms = RetVal:@RM:@WINDOW:'.PKT_SIZE' oaParms = RetVal:@RM:@WINDOW:'.PKT_SIZE'
obj_Appwindow('LUValReturn',oaParms) 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
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

@ -136,12 +136,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 // Req'd parameter checks
ItemType = {RI_TYPE} ItemType = {RI_TYPE}
If ItemType EQ '' then ErrMsg := 'Item Type was not specified. ' If ItemType EQ '' then ErrMsg := 'Item Type was not specified. '
If (ItemType NE 'LE') AND (ItemType NE 'RE') then
SerialNo = Record<REACT_ITEM_SERIAL_NO$>
If SerialNo EQ '' then
ErrMsg := 'Serial No. is required for this Reactor Item type. '
end
end
If ItemType EQ 'S' then
PocketQty = Record<REACT_ITEM_PKT_QTY$>
PocketSize = Record<REACT_ITEM_PKT_SIZE$>
If PocketSize EQ '' then
ErrMsg := 'Pocket size is required for Susceptor Item Type. '
end
If PocketQty EQ '' then
ErrMsg := 'Pocket quantity is required for Susceptor Item Type. '
end
If ErrMsg = '' then
ExpectedQty = ''
Begin Case
Case Record<REACT_ITEM_PART_TYPE$> EQ 'ASM'
If PocketSize EQ 6 OR PocketSize EQ 8 then
ExpectedQty = 1
end
Case Record<REACT_ITEM_PART_TYPE$> EQ 'HTR'
If PocketSize EQ 8 then
ExpectedQty = 3
end else
If PocketSize EQ 6 then ExpectedQty = 5
end
Case Record<REACT_ITEM_PART_TYPE$> EQ 'EPP'
If PocketSize EQ 8 then
ExpectedQty = 8
end else
If PocketSize EQ 6 then ExpectedQty = 18
end
Case Record<REACT_ITEM_PART_TYPE$> EQ ''
ErrMsg := 'Part Type. is required for Susceptor Reactor Item type. '
Case Otherwise$
ErrMsg := 'Invalid Part Type for Susceptor Reactor Item Type. '
End Case
If ExpectedQty NE '' then
If PocketQty NE ExpectedQty then
ErrMsg := 'Invalid Pocket Quantity for Part Type/Pocket Size combination. '
end
end
end
end
end
If ErrMsg NE '' then If ErrMsg NE '' then
Error_Services('Add', 'Error Saving Reactor Item: ' : ErrMsg) Error_Services('Add', 'Error Saving Reactor Item: ' : ErrMsg)
OrigFileError = 104:': Error Saving Reactor Item: ' : ErrMsg OrigFileError = 104:': 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)
@ -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]')
@ -1899,8 +1904,11 @@ Service PrintMaterialTrackReport(RptColumns, LocationFilter, NoMatFlag, OldRepor
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 = ''
@ -1922,12 +1930,12 @@ Service PrintMaterialTrackReport(RptColumns, LocationFilter, NoMatFlag, OldRepor
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 = {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')
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,8 +985,7 @@ 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$>
@ -991,13 +1002,13 @@ Service ProcessScanData(ScanID, ScanJSON)
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?
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$)
@ -1017,11 +1028,11 @@ Service ProcessScanData(ScanID, ScanJSON)
end end
end else end else
// 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)
End Case End Case
end end
end else end else
@ -1032,17 +1043,19 @@ Service ProcessScanData(ScanID, ScanJSON)
end end
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.')
end end
end else end else
Error_Services('Add', '(':CassetteID:') The first run must be completed using the OpenInsight user interface.') ErrMsg = Error_Services('GetMessage')
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:') The first run must be completed using the OpenInsight user interface.'
end
end else
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 = ''
If Error_Services('HasError') then
ErrorMessage = Error_Services('GetMessage')
end
Database_Services('WriteDataRow', 'SCANS', ScanID, ScansRow, True$, False$, True$) 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 = ''
If Error_Services('HasError') then
ErrorMessage = Error_Services('GetMessage')
end
Scan_Services('SetScansRow', ScanID, ScansRow) 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

@ -30,22 +30,23 @@ Function Schedule_Services(@Service, @Params)
#pragma precomp SRP_PreCompiler #pragma precomp SRP_PreCompiler
$insert APP_INSERTS $Insert APP_INSERTS
$insert SERVICE_SETUP $Insert SERVICE_SETUP
$insert RLIST_EQUATES $Insert RLIST_EQUATES
$insert REACTOR_EQUATES $Insert REACTOR_EQUATES
$insert SCHED_DET_NG_EQUATES $Insert SCHED_DET_NG_EQUATES
$insert WO_LOG_EQUATES $Insert WO_LOG_EQUATES
$Insert WO_MAT_EQUATES $Insert WO_MAT_EQUATES
$insert WO_SCHEDULE_NG_EQUATES $Insert WO_SCHEDULE_NG_EQUATES
$insert COMPANY_EQUATES $Insert COMPANY_EQUATES
$insert PROD_VER_EQUATES $Insert PROD_VER_EQUATES
$insert PRS_LAYER_EQU $Insert PRS_LAYER_EQU
$insert SCHEDULE_EVENT_SUMMMARY_EQUATES $Insert SCHEDULE_EVENT_SUMMMARY_EQUATES
$insert EPI_PART_EQUATES $Insert EPI_PART_EQUATES
$insert PROD_SPEC_EQUATES $Insert PROD_SPEC_EQUATES
$insert SCHED_HIST_EQUATES $Insert SCHED_HIST_EQUATES
$Insert RDS_EQUATES $Insert RDS_EQUATES
$Insert WM_IN_EQUATES
Equ new_exist$ To 0 ; * Reduce Mode 0 Equ new_exist$ To 0 ; * Reduce Mode 0
Equ next_cur$ To 1 Equ next_cur$ To 1
@ -59,7 +60,7 @@ Declare subroutine Mona_Services
Declare function SRP_Array, Schedule_Services, Memory_Services, Database_Services, SRP_Sort_Array, Datetime Declare function SRP_Array, Schedule_Services, Memory_Services, Database_Services, SRP_Sort_Array, Datetime
Declare function Epi_Part_Services, SRP_Math, SRP_Hash, obj_Prod_Spec, Logging_Services, Environment_Services Declare function Epi_Part_Services, SRP_Math, SRP_Hash, obj_Prod_Spec, Logging_Services, Environment_Services
Declare function Work_Order_Services, RTI_CreateGUID, Reactor_Services, Schedule_Services, NextKey, SRP_Datetime Declare function Work_Order_Services, RTI_CreateGUID, Reactor_Services, Schedule_Services, NextKey, SRP_Datetime
Declare function SRP_Time, Lsl_Users_Services, GetTickCount Declare function SRP_Time, Lsl_Users_Services, GetTickCount, obj_WO_Mat
Date = Oconv(Date(), 'D4/') Date = Oconv(Date(), 'D4/')
LogFileName = Date[7, 4] : '-' : Date[1, 2] : '-' : Date[4, 2] : ' Scheduler Log.csv' LogFileName = Date[7, 4] : '-' : Date[1, 2] : '-' : Date[4, 2] : ' Scheduler Log.csv'
@ -385,7 +386,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 +442,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 +807,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'
@ -819,19 +820,21 @@ Service GetCurrentEvent(ReactNo)
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 +850,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 +866,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 +879,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 +950,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 +991,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 +1019,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
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
@ -1241,12 +1247,57 @@ Service AdjustScheduleEvents(ReactNo)
Schedule_Services('LogActivity', ReactNo, LogData) Schedule_Services('LogActivity', ReactNo, LogData)
LogData<3> = 'Event complete: ':OConv(EventRec<SCHED_DET_NG.EVENT_COMP$>, "Btrue,false") LogData<3> = 'Event complete: ':OConv(EventRec<SCHED_DET_NG.EVENT_COMP$>, "Btrue,false")
Schedule_Services('LogActivity', ReactNo, LogData) Schedule_Services('LogActivity', ReactNo, LogData)
LogData<3> = 'Event unprocessed cassettes: ':EventRec<SCHED_DET_NG.UNPROCESSED_CASS$>
Schedule_Services('LogActivity', ReactNo, LogData)
LogData<3> = 'Event processed cassettes: ':EventRec<SCHED_DET_NG.PROCESSED_CASS$>
Schedule_Services('LogActivity', ReactNo, LogData)
EventAdjustment = Schedule_Services('GetEventAdjustment', EventKey)
UnprocessedCass = EventRec<SCHED_DET_NG.UNPROCESSED_CASS$> UnprocessedCass = EventRec<SCHED_DET_NG.UNPROCESSED_CASS$>
ProcessedCass = EventRec<SCHED_DET_NG.PROCESSED_CASS$> ProcessedCass = EventRec<SCHED_DET_NG.PROCESSED_CASS$>
AllCassList = SRP_Array('Join', UnprocessedCass, ProcessedCass, 'OR', @VM) AllCassList = SRP_Array('Join', UnprocessedCass, ProcessedCass, 'OR', @VM)
AllCassList = SRP_Array('SortSimpleList', AllCassList, 'AscendingNumbers', @VM) AllCassList = SRP_Array('SortSimpleList', AllCassList, 'AscendingNumbers', @VM)
// Check each cassette to see if it was voided
VoidedQty = 0
WONo = EventRec<SCHED_DET_NG.WO_NO$>
EventWfrs = EventRec<SCHED_DET_NG.EVENT_TOTAL_WFRS$>
VoidedCassList = ''
VoidedWfrQty = 0
For each CassNo in AllCassList using @VM
If Epipro then
WmInKey = WoNo:'*1*':CassNo
Voided = Xlate('WM_IN', WmInKey, 'VOID', 'X')
CassQty = Xlate('WM_IN', WmInKey, 'WFR_CNT', 'X')
end else
WOMatKey = WoNo:'*':CassNo
Voided = Xlate('WO_MAT', WOMatKey, 'VOID', 'X')
CassQty = Xlate('WO_MAT', WOMatKey, 'WAFER_QTY', 'X')
end
If Voided then
VoidedCassList<0, -1> = CassNo
VoidedWfrQty += CassQty
end
Next CassNo
UnprocessedCass = SRP_Array('Join', UnprocessedCass, VoidedCassList, 'NOT', @VM)
ProcessedCass = SRP_Array('Join', ProcessedCass, VoidedCassList, 'NOT', @VM)
AllCassList = SRP_Array('Join', AllCassList, VoidedCassList, 'NOT', @VM)
EventWfrs -= VoidedWfrQty
EventRec<SCHED_DET_NG.UNPROCESSED_CASS$> = UnprocessedCass
EventRec<SCHED_DET_NG.PROCESSED_CASS$> = ProcessedCass
EventRec<SCHED_DET_NG.EVENT_TOTAL_WFRS$> = EventWfrs
Database_Services('WriteDataRow', 'SCHED_DET_NG', EventKey, EventRec, True$, False$, True$)
// Check each unprocessed cassette to ensure it does not need to be moved to the processed column
For each CassNo in UnprocessedCass using @VM
Schedule_Services('MarkCassProcessed', WONo, CassNo, Datetime())
Next CassNo
EventRec = Schedule_Services('GetScheduleDetail', EventKey)
UnprocessedCass = EventRec<SCHED_DET_NG.UNPROCESSED_CASS$>
ProcessedCass = EventRec<SCHED_DET_NG.PROCESSED_CASS$>
AllCassList = SRP_Array('Join', UnprocessedCass, ProcessedCass, 'OR', @VM)
AllCassList = SRP_Array('SortSimpleList', AllCassList, 'AscendingNumbers', @VM)
EventAdjustment = Schedule_Services('GetEventAdjustment', EventKey)
EventComp = (UnprocessedCass EQ '') EventComp = (UnprocessedCass EQ '')
If Not(EventRec<SCHED_DET_NG.EVENT_COMP$>) and EventComp then If Not(EventRec<SCHED_DET_NG.EVENT_COMP$>) and EventComp then
@ -1258,9 +1309,7 @@ Service AdjustScheduleEvents(ReactNo)
end end
EventRec<SCHED_DET_NG.EVENT_COMP$> = EventComp EventRec<SCHED_DET_NG.EVENT_COMP$> = EventComp
WONo = EventRec<SCHED_DET_NG.WO_NO$>
ReactNo = EventRec<SCHED_DET_NG.REACT_NO$> ReactNo = EventRec<SCHED_DET_NG.REACT_NO$>
EventWfrs = EventRec<SCHED_DET_NG.EVENT_TOTAL_WFRS$>
WOQty = Xlate('WO_LOG', WONo, 'QTY', 'X') WOQty = Xlate('WO_LOG', WONo, 'QTY', 'X')
// If work order event is engaged then set start DTM to first cassette DTM in. // If work order event is engaged then set start DTM to first cassette DTM in.
// If previous event end time overlaps (e.g. soft block finished sooner than scheduled) // If previous event end time overlaps (e.g. soft block finished sooner than scheduled)
@ -2253,6 +2302,7 @@ end service
Service AddSchedEvent(ReactorNo, WorkOrderNo, StartDTM, StopDTM, Description, WaferQty) Service AddSchedEvent(ReactorNo, WorkOrderNo, StartDTM, StopDTM, Description, WaferQty)
// Create a unique key ID for the new event // Create a unique key ID for the new event
ErrorMsg = ''
NewEventKeyID = RTI_CreateGUID() NewEventKeyID = RTI_CreateGUID()
NewEventRec = '' NewEventRec = ''
NewEventRec<SCHED_DET_NG.REACT_NO$> = ReactorNo NewEventRec<SCHED_DET_NG.REACT_NO$> = ReactorNo
@ -2268,10 +2318,11 @@ Service AddSchedEvent(ReactorNo, WorkOrderNo, StartDTM, StopDTM, Description, Wa
LastUnloadedRDS = '' LastUnloadedRDS = ''
// Determine start cassette and slot number // Determine start cassette and slot number
PrevSchedQty = Schedule_Services('GetScheduledWfrQty', WorkOrderNo) PrevSchedQty = Schedule_Services('GetScheduledWfrQty', WorkOrderNo)
StartCass = SRP_Math('CEILING', ( (PrevSchedQty + 1) / 25)) VoidedQty = Work_Order_Services('GetVoidedWaferCount', WorkOrderNo)
StartCass = SRP_Math('CEILING', ( (PrevSchedQty + VoidedQty + 1) / 25))
If StartCass EQ 0 then StartCass = 1 If StartCass EQ 0 then StartCass = 1
StartSlot = Mod(PrevSchedQty, 25) + 1 StartSlot = Mod(PrevSchedQty, 25) + 1
TotalSchedQty = PrevSchedQty + WaferQty TotalSchedQty = PrevSchedQty + WaferQty + VoidedQty
StopCass = SRP_Math('CEILING', ( TotalSchedQty / 25 ) ) StopCass = SRP_Math('CEILING', ( TotalSchedQty / 25 ) )
StopSlot = Mod(TotalSchedQty, 25) StopSlot = Mod(TotalSchedQty, 25)
If StopSlot EQ 0 then StopSlot = 25 If StopSlot EQ 0 then StopSlot = 25
@ -2280,7 +2331,16 @@ Service AddSchedEvent(ReactorNo, WorkOrderNo, StartDTM, StopDTM, Description, Wa
If EpiPro then If EpiPro then
For CassNo = StartCass to StopCass For CassNo = StartCass to StopCass
WMIKey = WorkOrderNo:'*1*':CassNo WMIKey = WorkOrderNo:'*1*':CassNo
WMIRdsList = Xlate('WM_IN', WMIKey, 'RDS_NO', 'X') If RowExists('WM_IN', WMIKey) then
WMIRec = Database_Services('ReadDataRow', 'WM_IN', WMIKey)
end else
// Material not received yet
WMIRec = ''
end
If Error_Services('NoError') then
Voided = WMIRec<WM_IN_VOID$>
If Not(Voided) then
WMIRdsList = WMIRec<WM_IN_RDS_NO$>
If WMIRdsList NE '' then If WMIRdsList NE '' then
Begin Case Begin Case
Case ( (CassNo EQ StartCass) and (CassNo EQ StopCass) ) Case ( (CassNo EQ StartCass) and (CassNo EQ StopCass) )
@ -2303,12 +2363,29 @@ Service AddSchedEvent(ReactorNo, WorkOrderNo, StartDTM, StopDTM, Description, Wa
// No RDS keys exist for this cassette yet, so it's unprocessed // No RDS keys exist for this cassette yet, so it's unprocessed
EventUnprocCassList<0, -1> = CassNo EventUnprocCassList<0, -1> = CassNo
end end
end
end else
ErrorMsg = Error_Services('GetMessage')
end
Until (ErrorMsg NE '')
Next CassNo Next CassNo
If (ErrorMsg EQ '') then
If RDSKeys NE '' then If RDSKeys NE '' then
RDSKeys = SRP_Array('Clean', RDSKeys, 'TrimAndMakeUnique', @VM) RDSKeys = SRP_Array('Clean', RDSKeys, 'TrimAndMakeUnique', @VM)
For each RDSKey in RDSKeys using @VM setting vPos For each RDSKey in RDSKeys using @VM setting vPos
DtmOut = Xlate('RDS', RDSKey, 'DATETIME_OUT', 'X') RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKey)
If Error_Services('NoError') then
DateOut = RDSRec<RDS_DATE_OUT$>
TimeOut = RDSRec<RDS_TIME_OUT$>
TimeOut = TimeOut/86400
TimeOut = SRP_Math('ROUND', TimeOut, 5)
TimeOut = TimeOut[2, 6]
DtmOut = DateOut:TimeOut
end else
ErrorMsg = Error_Services('GetMessage')
end
If (ErrorMsg EQ '' ) then
WMIKeys = Xlate('RDS', RDSKey, 'WM_IN_KEY', 'X') WMIKeys = Xlate('RDS', RDSKey, 'WM_IN_KEY', 'X')
For each WMIKey in WMIKeys using @VM For each WMIKey in WMIKeys using @VM
CassNo = Field(WMIKey, '*', 3) CassNo = Field(WMIKey, '*', 3)
@ -2323,20 +2400,51 @@ Service AddSchedEvent(ReactorNo, WorkOrderNo, StartDTM, StopDTM, Description, Wa
end end
end end
Next WMIKey Next WMIKey
end
Until (ErrorMsg NE '')
Next RDSKey Next RDSKey
end end
EventUnprocCassList = SRP_Array('SortSimpleList', EventUnprocCassList, 'AscendingNumbers', @VM) EventUnprocCassList = SRP_Array('SortSimpleList', EventUnprocCassList, 'AscendingNumbers', @VM)
// This line ensures EpiPro cassettes are not recorded as both processed and unprocessed. // This line ensures EpiPro cassettes are not recorded as both processed and unprocessed.
EventProcCassList = SRP_Array('Join', EventProcCassList, EventUnprocCassList, 'NOT', @VM) EventProcCassList = SRP_Array('Join', EventProcCassList, EventUnprocCassList, 'NOT', @VM)
end
end else end else
For CassNo = StartCass to StopCass For CassNo = StartCass to StopCass
DtmOut = ''
WOMatKey = WorkOrderNo:'*':CassNo WOMatKey = WorkOrderNo:'*':CassNo
RDSKey = Xlate('WO_MAT', WOMatKey, 'RDS_NO', 'X') If RowExists('WO_MAT', WOMatKey) then
DtmOut = Xlate('RDS', RDSKey, 'DATETIME_OUT', 'X') WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
If DtmOut NE '' then end else
// Material not received yet
WOMatRec = ''
end
If Error_Services('NoError') then
Voided = WOMatRec<WO_MAT_VOID$>
If Not(Voided) then
RDSKey = WOMatRec<WO_MAT_RDS_NO$>
If (RDSKey NE '') then
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKey)
If Error_Services('NoError') then
DateOut = RDSRec<RDS_DATE_OUT$>
TimeOut = RDSRec<RDS_TIME_OUT$>
TimeOut = TimeOut/86400
TimeOut = SRP_Math('ROUND', TimeOut, 5)
TimeOut = TimeOut[2, 6]
DtmOut = DateOut:TimeOut
end else
ErrorMsg = Error_Services('GetMessage')
end
end
end
end else
ErrorMsg = Error_Services('GetMessage')
end
If (ErrorMsg EQ '') then
If (DtmOut NE '') then
LastUnloadedRDS = RDSKey LastUnloadedRDS = RDSKey
Locate CassNo in EventProcCassList using @VM setting Dummy else Locate CassNo in EventProcCassList using @VM setting Dummy else
EventProcCassList<0, -1> = CassNo EventProcCassList<0, -1> = CassNo
@ -2346,9 +2454,13 @@ Service AddSchedEvent(ReactorNo, WorkOrderNo, StartDTM, StopDTM, Description, Wa
EventUnprocCassList<0, -1> = CassNo EventUnprocCassList<0, -1> = CassNo
end end
end end
end
Until (ErrorMsg NE '')
Next CassNo Next CassNo
end end
If (ErrorMsg EQ '') then
EventComp = (EventUnprocCassList EQ '') EventComp = (EventUnprocCassList EQ '')
If EventComp then StopDtm = Xlate('RDS', LastUnloadedRDS, 'DATETIME_OUT', 'X') If EventComp then StopDtm = Xlate('RDS', LastUnloadedRDS, 'DATETIME_OUT', 'X')
@ -2400,6 +2512,9 @@ Service AddSchedEvent(ReactorNo, WorkOrderNo, StartDTM, StopDTM, Description, Wa
Schedule_Services('AddSchedHist', NewEventKeyID, ReactorNo, 'ADD', @User4) Schedule_Services('AddSchedHist', NewEventKeyID, ReactorNo, 'ADD', @User4)
Response = NewEventKeyID Response = NewEventKeyID
end end
end
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
end service end service
@ -3195,19 +3310,33 @@ Service MarkCassProcessed(WONo, CassNo, ProcessedDTM)
CassComp = True$ CassComp = True$
end end
end else end else
CassComp = True$ WOMatKey = WoNo:'*':CassNo
CurrWaferCount = obj_WO_Mat('CurrWaferCnt', WOMatKey)
RDSNo = Xlate('WO_MAT', WOMatKey, 'RDS_NO', 'X')
DateOut = Xlate('RDS', RDSNo, 'DATE_OUT', 'X')
CassComp = ( (CurrWaferCount EQ 0) or (DateOut NE '') )
end end
UnprocessedCassettes = SchedDetNGRec<SCHED_DET_NG.UNPROCESSED_CASS$>
If CassComp then If CassComp then
RecChanged = False$
UnprocessedCassettes = SchedDetNGRec<SCHED_DET_NG.UNPROCESSED_CASS$>
Locate CassNo in UnprocessedCassettes using @VM setting vPos then Locate CassNo in UnprocessedCassettes using @VM setting vPos then
UnprocessedCassettes = Delete(UnprocessedCassettes, 0, vPos, 0) UnprocessedCassettes = Delete(UnprocessedCassettes, 0, vPos, 0)
RecChanged = True$
end
ProcessedCassettes = SchedDetNGRec<SCHED_DET_NG.PROCESSED_CASS$> ProcessedCassettes = SchedDetNGRec<SCHED_DET_NG.PROCESSED_CASS$>
Locate CassNo in ProcessedCassettes using @VM setting vPos else
ProcessedCassettes<0, -1> = CassNo ProcessedCassettes<0, -1> = CassNo
ProcessedCassettes = SRP_Array('Clean', ProcessedCassettes, 'TrimAndMakeUnique', @VM)
ProcessedCassettes = SRP_Array('SortSimpleList', ProcessedCassettes, 'AscendingNumbers', @VM)
RecChanged = True$
end
If RecChanged then
SchedDetNGRec<SCHED_DET_NG.UNPROCESSED_CASS$> = UnprocessedCassettes SchedDetNGRec<SCHED_DET_NG.UNPROCESSED_CASS$> = UnprocessedCassettes
SchedDetNGRec<SCHED_DET_NG.PROCESSED_CASS$> = ProcessedCassettes SchedDetNGRec<SCHED_DET_NG.PROCESSED_CASS$> = ProcessedCassettes
Database_Services('WriteDataRow', 'SCHED_DET_NG', SchedDetNGKey, SchedDetNGRec, True$, False$, True$) Database_Services('WriteDataRow', 'SCHED_DET_NG', SchedDetNGKey, SchedDetNGRec, True$, False$, True$)
Done = True$
end end
Done = True$
end end
Until Done EQ True$ Until Done EQ True$
Repeat Repeat
@ -3596,5 +3725,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,116 @@
Compile function WEB_OI_WIZARD_EVENTS(CtrlEntId, Event, @PARAMS)
#pragma precomp SRP_PreCompiler
#window WEB_OI_WIZARD
$Insert EVENT_SETUP
$Insert APP_INSERTS
$Insert PS_WebView_Equates
EQU ONE_DAY_SECS$ to 84600
Declare function OI_Wizard_Services, Exec_Method, Environment_Services
Declare subroutine PlaceDialog
GoToEvent Event for CtrlEntId else
// Event not implemented
end
Return EventFlow or 1
//-----------------------------------------------------------------------------
// EVENT HANDLERS
//-----------------------------------------------------------------------------
Event WINDOW.CREATE(CreateParam)
OIWizardBaseUrl = Environment_Services('GetOIWizardBaseUrl')
Set_Property(@Window, '@BASE_URL', OIWizardBaseUrl)
InitNavPage = CreateParam
Set_Property(@Window, '@INIT_NAV_PAGE', InitNavPage)
Set_Property(@Window, '@FIRST_RENDER', True$)
Set_Property(@Window:'.WEBVIEW_MAIN', 'AUTOSIZEHEIGHT', True$)
Set_Property(@Window:'.WEBVIEW_MAIN', 'AUTOSIZEWIDTH', True$)
ScreenSize = Get_Property('SYSTEM', 'SIZE')
ClientWidth = ScreenSize<3>
ClientHeight = ScreenSize<4>
FormSize = Get_Property(@Window, 'SIZE')
FormWidth = Int(ClientWidth * (3/4))
FormHeight = Int(ClientHeight * (3/4))
FormSize<1> = Int( (ClientWidth - FormWidth ) / 2 )
FormSize<2> = Int( (ClientHeight - FormHeight ) / 2 )
FormSize<3> = FormWidth
FormSize<4> = FormHeight
FormSize<5> = True$
Set_Property(@Window, 'SIZE', FormSize)
End Event
Event WEBVIEW_MAIN.WEBVIEWCREATED()
OIWizardURL = Get_Property(@Window, '@BASE_URL')
NavPage = Get_Property(@Window, '@INIT_NAV_PAGE')
NavTo = OIWizardURL:NavPage
SuccessFlag = Exec_Method( CtrlEntID, "NAVIGATE", NavTo)
If Not(SuccessFlag) then
Msg(@Window, '', 'OK', '', 'Application Error':@FM:'Error navigating to ':NavTo)
end
end event
Event WEBVIEW_MAIN.WEBNAVIGATED(NavID, URI, Redirected, UserInitiated, StatusInfo, FrameID)
FirstRender = Get_Property(@Window, '@FIRST_RENDER')
If FirstRender then
SuccessFlag = Exec_Method(CtrlEntID, "DELETECOOKIES", '*')
If SuccessFlag then
LSLUserId = @User4
OIWizardID = OI_Wizard_Services('CreateWizardID', LSLUserID)
If Error_Services('NoError') then
Expiry = Xlate('OI_WIZARD', OIWizardID, 'EXPIRY', 'X')
Domain = Get_Property(@Window, '@BASE_URL')
Swap 'http://' with '' in Domain
Swap 'https://' with '' in Domain
PortIndex = Index(Domain, ':', 1)
If PortIndex then Domain = Domain[1, PortIndex - 1]
Cookie = ""
Cookie<0, WBV_COOKIE_POS_NAME$> = "sessionID"
Cookie<0, WBV_COOKIE_POS_VALUE$> = OIWizardID
Cookie<0, WBV_COOKIE_POS_DOMAIN$> = Domain
Cookie<0, WBV_COOKIE_POS_EXPIRES$> = Expiry
SuccessFlag = Exec_Method( CtrlEntID, "SETCOOKIE", Cookie )
If SuccessFlag then
Cookies = Exec_Method( CtrlEntID, "GETCOOKIES")
Cookie<0, WBV_COOKIE_POS_NAME$> = "userID"
Cookie<0, WBV_COOKIE_POS_VALUE$> = LSLUserID
Cookie<0, WBV_COOKIE_POS_DOMAIN$> = Domain
Cookie<0, WBV_COOKIE_POS_EXPIRES$> = Expiry
SuccessFlag = Exec_Method( CtrlEntID, "SETCOOKIE", Cookie )
If SuccessFlag then
// Set a timer to execute our session service javascript hook once the page is ready
Set_Property(@Window, "TIMER", 0:@FM:1000)
Set_Property(@Window, '@FIRST_RENDER', False$)
end else
Msg(@Window, '', 'OK', '', 'Application Error':@FM:'Error setting userID cookie')
end
end else
Msg(@Window, '', 'OK', '', 'Application Error':@FM:'Error setting sessionID cookie')
end
end else
Msg(@Window, '', 'OK', '', 'Application Error':@FM:'Error creating OI Wizard session')
end
end else
Msg(@Window, '', 'OK', '', 'Application Error':@FM:'Error deleting cookies')
end
end
end event
Event WINDOW.TIMER()
Response = Exec_Method(@Window:'.WEBVIEW_MAIN', 'EXECUTESCRIPT', 'SessionServiceHelper.SetSessionFromCookies()')
end event

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

@ -0,0 +1,132 @@
Function WM_IN_API(@API)
/***********************************************************************************************************************
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
permission from SRP Computer Solutions, Inc.
Name : WM_IN_Api
Description : API logic for the WM_IN resource.
Notes : All web APIs should include the API_SETUP insert. This will provide several useful variables:
HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.)
APIURL - The URL for the API entry point (e.g., api.mysite.com/v1).
FullEndpointURL - The URL submitted by the client, including query params.
FullEndpointURLNoQuery - The URL submitted by the client, excluding query params.
EndpointSegment - The URL endpoint segment.
ParentURL - The URL path preceeding the current endpoint.
CurrentAPI - The name of this stored procedure.
Parameters :
API [in] -- Web API to process. Format is [APIPattern].[HTTPMethod]:
- APIPattern must follow this structure Rds[.ID.[<Property>]]
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
Examples:
- Rds.POST
- Rds.ID.PUT
- Rds.ID.firstName.GET
Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API
services do not rely upon anything being returned in the response. This is what the
various services like SetResponseBody and SetResponseStatus services are for. A response
value is only helpful if the developers want to use it for debug purposes.
History : (Date, Initials, Notes)
09/27/22 xxx Original programmer.
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
$insert APP_INSERTS
$insert API_SETUP
$insert HTTP_INSERTS
Declare function WM_In_Services
GoToAPI else
// The specific resource endpoint doesn't have a API handler yet.
HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.')
end
Return Response OR ''
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Endpoint Handlers
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
API wm_in.ID.HEAD
API wm_in.ID.GET
GoSub CreateHALItem
end api
API wm_in.ID.zpl.HEAD
API wm_in.ID.zpl.GET
GoSub CreateZPLItem
end api
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------------------------
// CreateHALItem
//
// Creates a HAL+JSON object based on the OpenInsight data row representation of the scan.
//----------------------------------------------------------------------------------------------------------------------
CreateHALItem:
WMInKey = EndpointSegment
Convert '-' to '*' in WMInKey
WmInJson = WM_In_Services('ConvertRecordToJSON', WMInKey, '', FullEndpointURL)
If Error_Services('NoError') then
StatusCode = 200
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
HTTP_Services('SetResponseBody', WmInJson, False$, 'application/hal+json')
If Assigned(Message) then
HTTP_Services('SetResponseStatus', StatusCode, Message)
end else
HTTP_Services('SetResponseStatus', StatusCode)
end
end else
Message = Error_Services('GetMessage')
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
end
return
//----------------------------------------------------------------------------------------------------------------------
// CreateZPLItem
//
// Creates a HAL+JSON object with the ZPL for the given WM_IN row
//----------------------------------------------------------------------------------------------------------------------
CreateZPLItem:
WmInKey = ParentSegment
ZplJson = ''
ZPL = Wm_In_Services('GetWmInZpl', WmInKey)
If Error_Services('NoError') then
StatusCode = 200
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
HTTP_Services('SetResponseBody', ZPL, False$, 'text/plain')
If Assigned(Message) then
HTTP_Services('SetResponseStatus', StatusCode, Message)
end else
HTTP_Services('SetResponseStatus', StatusCode)
end
end else
Message = Error_Services('GetMessage')
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
end
return

View File

@ -46,23 +46,48 @@ Compile function WM_IN_Services(@Service, @Params)
***********************************************************************************************************************/ ***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler #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
//----------------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
@ -77,11 +102,9 @@ 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
@ -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'
@ -1156,7 +1237,9 @@ Service UpdateReceivedQty(WONo)
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
WOQty = WORec<WO_LOG_WO_QTY$>
RXQty = obj_WO_Log('RxQty', WONo:@RM:WORec) 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,44 +1505,76 @@ end service
Service ConvertRecordToJSON(WONo, Record, ItemURL) Service ConvertRecordToJSON(WONo, Record, ItemURL)
ErrorMsg = ''
jsonRecord = '' 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
SubSuppBy = EpiPartRec<EPI_PART_SUB_SUPP_BY$> ;* L - EpiSvcs supplied, C - Customer Supplied
ProdVerNo = Record<WO_LOG_PROD_VER_NO$>
ProdVerRec = Database_Services('ReadDataRow', 'PROD_VER', ProdVerNo)
If Error_Services('NoError') then
SubPartNo = ProdVerRec<PROD_VER_SUB_PART_NO$>
// Create the JSON response object
objJSON = '' objJSON = ''
If SRP_JSON(objJSON, 'New', 'Object') then If SRP_JSON(objJSON, 'New', 'Object') then
objWOLog = '' objWOLog = ''
If SRP_JSON(objWOLog, 'New', 'Object') then If SRP_JSON(objWOLog, 'New', 'Object') then
SRP_JSON(objWOLog, 'SetValue', 'KeyId', @ID) SRP_JSON(objWOLog, 'SetValue', 'KeyId', WONo)
SRP_JSON(objWOLog, 'SetValue', 'ProdOrdNo', {PROD_ORD_NO}) SRP_JSON(objWOLog, 'SetValue', 'ProdOrdNo', Record<WO_LOG_PROD_ORD_NO$>)
SRP_JSON(objWOLog, 'SetValue', 'PSN', {PROD_SPEC_ID}) SRP_JSON(objWOLog, 'SetValue', 'PSN', Xlate('WO_LOG', WONo, 'PS_NO', 'X'))
SRP_JSON(objWOLog, 'SetValue', 'EpiPartNo', {EPI_PART_NO}) SRP_JSON(objWOLog, 'SetValue', 'EpiPartNo', EpiPartNo)
SRP_JSON(objWOLog, 'SetValue', 'HOT_FLAG', {HOT_FLAG}) SRP_JSON(objWOLog, 'SetValue', 'HotFlag', Record<WO_LOG_HOT_FLAG$>)
SRP_JSON(objWOLog, 'SetValue', 'WoQty', Record<WO_LOG_WO_QTY$>)
SRP_JSON(objWOLog, 'SetValue', 'RxQty', Record<WO_LOG_RX_QTY_STATIC$>)
SRP_JSON(objWOLog, 'SetValue', 'RelQty', Record<WO_LOG_REL_QTY_STATIC$>)
SRP_JSON(objWOLog, 'SetValue', 'UnRelQty', Record<WO_LOG_UNREL_QTY_STATIC$>)
SRP_JSON(objWOLog, 'SetValue', 'ShipQty', Record<WO_LOG_SHIP_QTY_STATIC$>)
SRP_JSON(objWOLog, 'SetValue', 'ScrapQty', Record<WO_LOG_SCRAP_QTY_STATIC$>)
SRP_JSON(objWOLog, 'SetValue', 'OpenQty', Record<WO_LOG_OPEN_QTY_STATIC$>)
SRP_JSON(objWOLog, 'SetValue', 'CustNo', Record<WO_LOG_CUST_NO$>)
SRP_JSON(objWOLog, 'SetValue', 'Customer', Xlate('WO_LOG', WONo, 'CUST_NAME', 'X'))
ExpectedVendorCd = Record<WO_LOG_EXP_VEND_CD$>
If ( (Len(ExpectedVendorCd) NE 2) or (SubSuppBy NE 'L') ) then ExpectedVendorCd = ''
SRP_JSON(objWOLog, 'SetValue', 'ExpectedVendorCd', ExpectedVendorCd)
SRP_JSON(objWOLog, 'SetValue', 'SubPartNo', SubPartNo)
// Create a list of cassettes // Create a list of cassettes
CassIDs = {WO_MAT_KEY} CassIDs = Record<WO_LOG_WO_MAT_KEY$>
objChildCassettes = '' objChildCassettes = ''
If SRP_JSON(objChildCassettes, 'New', 'Array') then If SRP_JSON(objChildCassettes, 'New', 'Array') then
If CassIDs NE '' then If CassIDs NE '' then
for each Cass in CassIDs using @VM setting vPos for each Cass in CassIDs using @VM setting vPos
SAPBatchNo = XLATE('WO_MAT', Cass, WO_MAT_SAP_BATCH_NO$, 'X') WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', Cass)
SAPTXDtm = XLATE('WO_MAT', Cass, WO_MAT_SAP_TX_DTM$, 'X') If Error_Services('NoError') then
RDSNo = XLATE('WO_MAT', Cass, WO_MAT_RDS_NO$, 'X')
ShipNo = XLATE('WO_MAT', Cass, WO_MAT_SHIP_NO$, 'X')
// Add in each indv. cassette object // Add in each indv. cassette object
objChildCassette = '' objChildCassette = ''
If SRP_JSON(objChildCassette, 'New', 'Object') then If SRP_JSON(objChildCassette, 'New', 'Object') then
SRP_JSON(objChildCassette, 'SetValue', 'KeyId', Cass) SRP_JSON(objChildCassette, 'SetValue', 'KeyId', Cass)
SRP_JSON(objChildCassette, 'SetValue', 'SAPBatchNo', SAPBatchNo) SRP_JSON(objChildCassette, 'SetValue', 'CassNo', Field(Cass, '*', 2, 1))
SRP_JSON(objChildCassette, 'SetValue', 'SAPTXDtm', OCONV(SAPTXDtm, 'DT')) SRP_JSON(objChildCassette, 'SetValue', 'SAPBatchNo', WOMatRec<WO_MAT_SAP_BATCH_NO$>)
SRP_JSON(objChildCassette, 'SetValue', 'RDSNo', RDSNo) SRP_JSON(objChildCassette, 'SetValue', 'SAPTXDtm', Date_Services('ConvertDateTimeToISO8601', WOMatRec<WO_MAT_SAP_TX_DTM$>))
SRP_JSON(objChildCassette, 'SetValue', 'ShipNo', ShipNo) 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(objChildCassettes, 'Add', objChildCassette)
SRP_JSON(objChildCassette, 'Release') SRP_JSON(objChildCassette, 'Release')
end end
end else
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
end
Next Cass Next Cass
end else end else
SRP_JSON(objWOLog, 'SetValue', 'ChildCassettes', '') SRP_JSON(objWOLog, 'SetValue', 'ChildCassettes', '')
@ -1395,19 +1601,28 @@ Service ConvertRecordToJSON(WONo, Record, ItemURL)
SRP_JSON(objJSON, 'Set', '_links', objLinks) SRP_JSON(objJSON, 'Set', '_links', objLinks)
SRP_JSON(objLinks, 'Release') SRP_JSON(objLinks, 'Release')
end end
// Create the _class property for this resource. // Create the _class property for this resource.
SRP_JSON(objJSON, 'SetValue', '_class', 'resource') SRP_JSON(objJSON, 'SetValue', '_class', 'resource')
end end
jsonRecord = SRP_JSON(objJSON, 'Stringify', 'Styled') jsonRecord = SRP_JSON(objJSON, 'Stringify', 'Styled')
SRP_JSON(objJSON, 'Release') 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. Unable to create JSON object'
end
end end
end else end else
Error_Services('Add', 'KeyID argument was missing 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 else
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
end
end else
ErrorMsg = 'Error in ':Service:' service. Null WONo passed into service.'
end
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
Response = jsonRecord Response = jsonRecord
end service end service
@ -2129,6 +2344,38 @@ Service UpdateOpenWorkOrderData()
Logging_Services('AppendLog', objVerifyWOMatKeysLog, LogData, @RM, @FM) Logging_Services('AppendLog', objVerifyWOMatKeysLog, LogData, @RM, @FM)
MonaStatus = 'critical' MonaStatus = 'critical'
end end
Work_Order_Services('UpdateReceivedQty', NextOpenWoLogKey)
If Error_Services('HasError') then
LogData<1> = OConv(Datetime(), 'DT/^S')
ErrorMsg = 'Error calling UpdateReceivedQty for WO_LOG ':NextOpenWoLogKey:'. ':Error_Services('GetMessage')
LogData<4> = ErrorMsg
Logging_Services('AppendLog', objVerifyWOMatKeysLog, LogData, @RM, @FM)
MonaStatus = 'critical'
end
Work_Order_Services('UpdateReleasedQty', NextOpenWoLogKey)
If Error_Services('HasError') then
LogData<1> = OConv(Datetime(), 'DT/^S')
ErrorMsg = 'Error calling UpdateReleasedQty for WO_LOG ':NextOpenWoLogKey:'. ':Error_Services('GetMessage')
LogData<4> = ErrorMsg
Logging_Services('AppendLog', objVerifyWOMatKeysLog, LogData, @RM, @FM)
MonaStatus = 'critical'
end
Work_Order_Services('UpdateScrappedQty', NextOpenWoLogKey)
If Error_Services('HasError') then
LogData<1> = OConv(Datetime(), 'DT/^S')
ErrorMsg = 'Error calling UpdateScrappedQty for WO_LOG ':NextOpenWoLogKey:'. ':Error_Services('GetMessage')
LogData<4> = ErrorMsg
Logging_Services('AppendLog', objVerifyWOMatKeysLog, LogData, @RM, @FM)
MonaStatus = 'critical'
end
Work_Order_Services('UpdateShippedQty', NextOpenWoLogKey)
If Error_Services('HasError') then
LogData<1> = OConv(Datetime(), 'DT/^S')
ErrorMsg = 'Error calling UpdateShippedQty for WO_LOG ':NextOpenWoLogKey:'. ':Error_Services('GetMessage')
LogData<4> = ErrorMsg
Logging_Services('AppendLog', objVerifyWOMatKeysLog, LogData, @RM, @FM)
MonaStatus = 'critical'
end
end end
end else end else
LogData<1> = OConv(Datetime(), 'DT/^S') LogData<1> = OConv(Datetime(), 'DT/^S')
@ -2313,6 +2560,107 @@ 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
Service GetVoidedWaferCount(WorkOrderNo)
ErrorMsg = ''
VoidedWaferCount = 0
If WorkOrderNo NE '' then
If RowExists('WO_LOG', WorkOrderNo) then
ReactorType = Xlate('WO_LOG', WorkOrderNo, 'PS_REACTOR_TYPE', 'X')
If ReactorType EQ 'EPP' then
Query = 'SELECT WM_IN WITH WO_NO EQ ':WorkOrderNo:' AND WITH VOID EQ ':True$
Rlist(Query, TARGET_ACTIVELIST$, '', '', '')
ErrCode = ''
If Not(Get_Status(ErrCode)) then
EOF = False$
Loop
Readnext WmInKey else EOF = True$
Until EOF
VoidedWaferCount += Xlate('WM_IN', WmInKey, 'WFR_CNT', 'X')
Repeat
end else
ErrorMsg = 'Error in ':Service: 'service. Error calling RList. Error code: ':ErrCode
end
end else
Query = 'SELECT WO_MAT WITH WO_NO EQ ':WorkOrderNo:' AND WITH VOID EQ ':True$
Rlist(Query, TARGET_ACTIVELIST$, '', '', '')
ErrCode = ''
If Not(Get_Status(ErrCode)) then
EOF = False$
Loop
Readnext WoMatKey else EOF = True$
Until EOF
VoidedWaferCount += Xlate('WO_MAT', WoMatKey, 'WAFER_QTY', 'X')
Repeat
end else
ErrorMsg = 'Error in ':Service: 'service. Error calling RList. Error code: ':ErrCode
end
end
end else
ErrorMsg = 'Error in ':Service: 'service. WO_LOG ':WorkOrderNo:' does not exist.'
end
end else
ErrorMsg = 'Error in ':Service: 'service. Null WorkOrderNo passed into service.'
end
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
Response = VoidedWaferCount
end service
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs // 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 = ''
@ -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,12 +616,24 @@ 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.
If AdjustQty NE 0 then Work_Order_Services('AdjustReceivedQty', WONo, AdjustQty)
end end
If ( ( (OrigWfrQty NE '') and (OrigWfrQty NE NewWfrQty) ) or ( (OrigRelDtm EQ '') and (NewRelDtm NE '') ) ) then If ( (OrigRecDtm EQ '') and (NewRecDtm NE '') ) then
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'UpdateReleasedQty':SD$:WONo) // 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 end
If {REACTOR_TYPE} NE 'EPP' then If {REACTOR_TYPE} NE 'EPP' 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

@ -57,6 +57,8 @@ $Insert PRS_LAYER_EQUATES
$Insert PRS_STAGE_EQUATES $Insert PRS_STAGE_EQUATES
$Insert PROD_VER_EQUATES $Insert PROD_VER_EQUATES
$Insert QA_MET_EQUATES ;* Used in GetQAMet data structure return variable $Insert QA_MET_EQUATES ;* Used in GetQAMet data structure return variable
$Insert RDS_EQUATES
$Insert WO_REACT_EQUATES
Declare function Database_Services, SRP_JSON, Error_Services, obj_Prod_Spec, Wo_Mat_Qa_Services Declare function Database_Services, SRP_JSON, Error_Services, obj_Prod_Spec, Wo_Mat_Qa_Services
Declare subroutine Database_Services, SRP_JSON, Error_Services Declare subroutine Database_Services, SRP_JSON, Error_Services
@ -196,20 +198,26 @@ Service UpdateQAMet(WOMatKey)
WOMatQARec = '' WOMatQARec = ''
ErrorMsg = '' ErrorMsg = ''
If (WOMatKey NE '') then If (WOMatKey NE '') then
WONo = Field(WOMatKey, '*', 1) WONo = Field(WOMatKey, '*', 1)
CassNo = Field(WOMatKey, '*', 2) CassNo = Field(WOMatKey, '*', 2)
RDSNo = Database_Services('ReadDataColumn', 'WO_MAT', WOMatKey, WO_MAT_RDS_NO$)
* * * * * * * * Build QA_MET profile - Work Order scheduled only * * * * * * * * If Error_Services('NoError') then
WOStepKeys = XLATE('WO_LOG', WONo, WO_LOG_WO_STEP_KEY$, 'X') If (RDSNo NE '') then
// Check if it has been assigned to a reactor
ReactNo = Database_Services('ReadDataColumn', 'RDS', RDSNo, RDS_REACTOR$)
If Error_Services('HasError') then
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
end
end else
// Either not signed into a reactor yet or this WO_MAT is EpiPro and therefore there is no
// 1-to-1 RDS record. Because of this, reactor scheduled QA met is not possible with EpiPro.
ReactNo = ''
end
If (ErrorMsg EQ '') then
WOStepKeys = Database_Services('ReadDataColumn', 'WO_LOG', WONo, WO_LOG_WO_STEP_KEY$)
If Error_Services('NoError') then
StepCnt = DCount(WOStepKeys,@VM) StepCnt = DCount(WOStepKeys,@VM)
EpiProPSNo = ''
EpiProPSRec = ''
MetLine = 1 MetLine = 1
// Get original WO_MAT_QA record to copy any test results // Get original WO_MAT_QA record to copy any test results
OrigWOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatKey) OrigWOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatKey)
OrigQAStages = OrigWOMatQARec<WO_MAT_QA_STAGE$> OrigQAStages = OrigWOMatQARec<WO_MAT_QA_STAGE$>
@ -229,51 +237,69 @@ Service UpdateQAMet(WOMatKey)
OrigQAOutOfSpecs = OrigWOMatQARec<WO_MAT_QA_OUT_OF_SPEC$> OrigQAOutOfSpecs = OrigWOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
OrigQAFailReasons = OrigWOMatQARec<WO_MAT_QA_FAIL_REASON$> OrigQAFailReasons = OrigWOMatQARec<WO_MAT_QA_FAIL_REASON$>
* WO_MAT record is used to check for pre-existing signatures jch 6/7/2015
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
FOR WOStepNo = 1 TO StepCnt FOR WOStepNo = 1 TO StepCnt
PSNo = XLATE('WO_STEP', WOStepKeys<1,WOStepNo>, WO_STEP_PROD_SPEC_ID$, 'X') PSNo = Database_Services('ReadDataColumn', 'WO_STEP', WOStepKeys<1,WOStepNo>, WO_STEP_PROD_SPEC_ID$)
If Error_Services('NoError') then
PSRec = Database_Services('ReadDataRow', 'PROD_SPEC', PSNo) PSRec = Database_Services('ReadDataRow', 'PROD_SPEC', PSNo)
If Error_Services('NoError') then
QAMetData = obj_Prod_Spec('GetQAMet',PSNo:@RM:PSRec) QAMetData = obj_Prod_Spec('GetQAMet',PSNo:@RM:PSRec)
QAStages = QAMetData<COL$QA_MET_STAGE> QAStages = QAMetData<COL$QA_MET_STAGE>
StageCnt = COUNT(QAStages,@VM) + (QAStages NE '') StageCnt = DCount(QAStages,@VM)
FOR StageNo = 1 TO StageCnt If (ReactNo NE '') then
WOReactKey = WONo:'*':WOStepNo:'*':ReactNo
end else
WOReactKey = ''
end
If (WOReactKey NE '') then
WOReactRDSNos = Database_Services('ReadDataColumn', 'WO_REACT', WOReactKey, WO_REACT_RDS_NO$)
If Error_Services('HasError') then
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
end
end
If (ErrorMsg EQ '') then
For StageNo = 1 to StageCnt
Stage = QAMetData<COL$QA_MET_STAGE,StageNo> Stage = QAMetData<COL$QA_MET_STAGE,StageNo>
MetTest = QAMetData<COL$QA_MET_TEST,StageNo> ;* StageRec<PRS_STAGE_MET_TEST$> MetTest = QAMetData<COL$QA_MET_TEST,StageNo> ;* StageRec<PRS_STAGE_MET_TEST$>
Interval = QAMetData<COL$QA_MET_INTERVAL,StageNo> ;* StageRec<PRS_STAGE_MET_INTERVAL$,StageNo> Interval = QAMetData<COL$QA_MET_INTERVAL,StageNo> ;* StageRec<PRS_STAGE_MET_INTERVAL$,StageNo>
Start = QAMetData<COL$QA_MET_START,StageNo> ;* StageRec<PRS_STAGE_MET_START$,StageNo> Start = QAMetData<COL$QA_MET_START,StageNo> ;* StageRec<PRS_STAGE_MET_START$,StageNo>
ReactSched = QAMetData<COL$QA_MET_REACT_SCHED,StageNo> ;* StageRec<PRS_STAGE_MET_REACT_SCHED$,StageNo> ReactSched = QAMetData<COL$QA_MET_REACT_SCHED,StageNo> ;* StageRec<PRS_STAGE_MET_REACT_SCHED$,StageNo>
TestFlag = 0 TestFlag = False$
IF Interval NE '' AND Start NE '' THEN If ( (Interval NE '') and (Start NE '') ) then
IF Interval = Start THEN // Add Work Order scheduled tests (i.e., not reactor scheduled tests)
IF REM(CassNo,Interval) = 0 THEN TestFlag = 1 If Not(ReactSched) then
END ELSE If Interval = Start then
IF ABS((Start + INT(CassNo/Interval)*Interval) - CassNo) = 0 THEN TestFlag = 1 If ( Rem(CassNo, Interval) EQ 0 ) then TestFlag = True$
END end else
IF TestFlag AND NOT(ReactSched) THEN If ( Abs( (Start + Int(CassNo / Interval)*Interval) - CassNo ) EQ 0) then TestFlag = True$
WOMatQARec<WO_MAT_QA_PROFILE$,MetLine> = WOStepNo:QAMetData<COL$QA_MET_TEST,StageNo> ;* StageRec<PRS_STAGE_MET_TEST$,N> end
WOMatQARec<WO_MAT_QA_PROP$,MetLine> = QAMetData<COL$QA_MET_PROP,StageNo> ;* StageRec<PRS_STAGE_MET_PROP$,N> end else
WOMatQARec<WO_MAT_QA_TOOL_CLASS$,MetLine> = QAMetData<COL$QA_MET_TOOL_CLASS,StageNo> ;* StageRec<PRS_STAGE_MET_TOOL_CLASS$,N> Locate RDSNo in WOReactRDSNos using @VM setting TestSeq then
WOMatQARec<WO_MAT_QA_STAGE$,MetLine> = QAMetData<COL$QA_MET_STAGE,StageNo> If ( Rem( (TestSeq - Start), Interval) EQ 0 ) then TestFlag = True$
WOMatQARec<WO_MAT_QA_MIN$,MetLine> = QAMetData<COL$QA_MET_MIN,StageNo> ;* StageRec<PRS_STAGE_MET_MIN$,N> end
WOMatQARec<WO_MAT_QA_MAX$,MetLine> = QAMetData<COL$QA_MET_MAX,StageNo> ;* StageRec<PRS_STAGE_MET_MAX$,N> end
WOMatQARec<WO_MAT_QA_SLOT$,MetLine> = QAMetData<COL$QA_MET_SLOT,StageNo> ;* StageRec<PRS_STAGE_MET_SLOT$,N> If TestFlag then
WOMatQARec<WO_MAT_QA_RECIPE$,MetLine> = QAMetData<COL$QA_MET_RECIPE,StageNo> ;* StageRec<PRS_STAGE_MET_RECIPE$,N> WOMatQARec<WO_MAT_QA_PROFILE$,MetLine> = WOStepNo:MetTest
WOMatQARec<WO_MAT_QA_RECIPE_PATTERN$,MetLine> = QAMetData<COL$QA_MET_RECIPE_PATTERN,StageNo> ;* StageRec<PRS_STAGE_MET_RECIPE_PATTERN$,StageNo> WOMatQARec<WO_MAT_QA_PROP$,MetLine> = QAMetData<COL$QA_MET_PROP,StageNo>
WOMatQARec<WO_MAT_QA_WFR_QTY$,MetLine> = QAMetData<COL$QA_MET_WFR_QTY,StageNo> ;* StageRec<PRS_STAGE_MET_WFR_QTY$,StageNo> WOMatQARec<WO_MAT_QA_TOOL_CLASS$,MetLine> = QAMetData<COL$QA_MET_TOOL_CLASS,StageNo>
WOMatQARec<WO_MAT_QA_WFR_TYPE$,MetLine> = QAMetData<COL$QA_MET_WFR_TYPE,StageNo> ;* StageRec<PRS_STAGE_MET_WFR_TYPE$,StageNo> WOMatQARec<WO_MAT_QA_STAGE$,MetLine> = Stage
WOMatQARec<WO_MAT_QA_REACT_SCHED$,MetLine> = ReactSched ;* StageRec<PRS_STAGE_MET_REACT_SCHED$,StageNo> WOMatQARec<WO_MAT_QA_MIN$,MetLine> = QAMetData<COL$QA_MET_MIN,StageNo>
WOMatQARec<WO_MAT_QA_SHIP_DOC$,MetLine> = QAMetData<COL$QA_MET_SHIP_DOC,StageNo> ;* StageRec<PRS_STAGE_MET_SHIP_DOC$,StageNo> WOMatQARec<WO_MAT_QA_MAX$,MetLine> = QAMetData<COL$QA_MET_MAX,StageNo>
WOMatQARec<WO_MAT_QA_SLOT$,MetLine> = QAMetData<COL$QA_MET_SLOT,StageNo>
WOMatQARec<WO_MAT_QA_RECIPE$,MetLine> = QAMetData<COL$QA_MET_RECIPE,StageNo>
WOMatQARec<WO_MAT_QA_RECIPE_PATTERN$,MetLine> = QAMetData<COL$QA_MET_RECIPE_PATTERN,StageNo>
WOMatQARec<WO_MAT_QA_WFR_QTY$,MetLine> = QAMetData<COL$QA_MET_WFR_QTY,StageNo>
WOMatQARec<WO_MAT_QA_WFR_TYPE$,MetLine> = QAMetData<COL$QA_MET_WFR_TYPE,StageNo>
WOMatQARec<WO_MAT_QA_REACT_SCHED$,MetLine> = ReactSched
WOMatQARec<WO_MAT_QA_SHIP_DOC$,MetLine> = QAMetData<COL$QA_MET_SHIP_DOC,StageNo>
WOMatQARec<WO_MAT_QA_PHASE_MIN$,MetLine> = QAMetData<COL$QA_MET_PHASE_MIN,StageNo> WOMatQARec<WO_MAT_QA_PHASE_MIN$,MetLine> = QAMetData<COL$QA_MET_PHASE_MIN,StageNo>
If OrigWOMatQARec NE '' then If OrigWOMatQARec NE '' then
CurrStage = QAMetData<COL$QA_MET_STAGE,StageNo> CurrStage = QAMetData<COL$QA_MET_STAGE,StageNo>
CurrProfile = WOStepNo:QAMetData<COL$QA_MET_TEST,StageNo> CurrProfile = WOStepNo:MetTest
CurrSlot = QAMetData<COL$QA_MET_SLOT,StageNo> CurrSlot = QAMetData<COL$QA_MET_SLOT,StageNo>
// Copy any existing results from the original WO_MAT_QA record. // Copy any existing results from the original WO_MAT_QA record.
If OrigQAStages NE '' then If OrigQAStages NE '' then
@ -302,20 +328,34 @@ Service UpdateQAMet(WOMatKey)
end end
end end
MetLine += 1 MetLine += 1
END end
END end
Next StageNo
NEXT StageNo end
end else
NEXT WOStepNo ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
end
end else
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
end
Until (ErrorMsg NE '')
Next WOStepNo
If (ErrorMsg EQ '') then
Database_Services('WriteDataRow', 'WO_MAT_QA', WONo:'*':CassNo, WOMatQARec) Database_Services('WriteDataRow', 'WO_MAT_QA', WONo:'*':CassNo, WOMatQARec)
If Error_Services('HasError') then ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
end
end else
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
end
end
end else
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
end
end else end else
ErrorMsg = 'Error in ':Service:' service. Null WOMatKey passed in.' ErrorMsg = 'Error in ':Service:' service. Null WOMatKey passed in.'
end end
If ErrorMsg NE '' then If (ErrorMsg NE '') then
Error_Services('Add', ErrorMsg) Error_Services('Add', ErrorMsg)
end else end else
Response = WOMatQARec Response = WOMatQARec
@ -421,35 +461,57 @@ 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)
QAStagePresent = False$
For I = 1 to StageCount For I = 1 to StageCount
If Stages<1, I> EQ 'QA' then QAStagePresent = True$
If Results<1,I> EQ '' then If Results<1,I> EQ '' then
Response = False$ QAMetComplete = False$
end end
Until Response EQ False$ Until QAMetComplete EQ False$
Next I Next I
If Response = '' then If QAMetComplete EQ True$ AND QAStagePresent = True$ then
Response = Wo_Mat_Qa_Services('GetMUWaferQAComplete', WOMatKey) QAMUMetComplete = WO_Mat_QA_Services('GetMUWaferQAComplete', WOMatKey)
If Error_Services('NoError') then
If Not(QAMUMetComplete) then
QAMetComplete = False$
end end
end else end else
Response = True$ ErrorMsg = Error_Services('GetMessage')
end
end end
end else end else
Error_Services('Add', 'Missing WOMatKey parameter.') ErrorMsg = Error_Services('GetMessage')
end
end
end else
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,12 +549,15 @@ 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
@ -489,11 +540,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,8 +592,13 @@ Service SetWoMatVoidFlag(WoMatKey, Username)
end service end service
Service MakeupFlagOn(RDSNo) Service MakeupFlagOn(WOMatKey)
ErrorMsg = ''
If (WOMatKey NE '') then
If RowExists('WO_MAT', WOMatKey) then
RDSNo = Database_Services('ReadDataColumn', 'WO_MAT', WOMatKey, WO_MAT_RDS_NO$)
If Error_Services('NoError') then
EpiCheck = Rds_Services('IsEpiPro', RDSNo) EpiCheck = Rds_Services('IsEpiPro', RDSNo)
BioRadDown = False$ BioRadDown = False$
Bio4Down = False$ Bio4Down = False$
@ -574,6 +625,16 @@ Service MakeupFlagOn(RDSNo)
Rds_Services('ApplyQA100PercentADE', RDSNo) Rds_Services('ApplyQA100PercentADE', RDSNo)
end end
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')

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