Compare commits
56 Commits
extra-file
...
aaf415e62c
Author | SHA1 | Date | |
---|---|---|---|
aaf415e62c | |||
af279541ae | |||
2036ed3289 | |||
edd09af821 | |||
febe660fcf | |||
245f832445 | |||
f07e4476a7 | |||
12f354dcaa | |||
d2f98a342d | |||
b83a3fb57b | |||
3e0991f681 | |||
f1a719d279 | |||
40a7a5e5a1 | |||
261880fab8 | |||
4b7417c1a8 | |||
c183da951a | |||
9d6c4c154f | |||
18f17f1d77 | |||
4020095d79 | |||
422dc69da7 | |||
a0897d19df | |||
8c11300455 | |||
537d46ba21 | |||
9dcead4eff | |||
0872e88869 | |||
c316aa9164 | |||
ed6f6cfc0d | |||
f1316d0e8f | |||
487246af46 | |||
3acaf60a5f | |||
26198b343a | |||
30372169ba | |||
557221c0d3 | |||
e09912b8bb | |||
993c812252 | |||
464a1adebd | |||
3211eb5593 | |||
981840fd95 | |||
7ec010b03f | |||
2fa985137f | |||
c30bb96972 | |||
a196bffd41 | |||
47405863d7 | |||
5d1b1f254e | |||
d6894f2fa4 | |||
63d9fe7964 | |||
8a5c1572e7 | |||
2eff7c5a37 | |||
d61ae234c9 | |||
cc2213061c | |||
056db6326b | |||
ea20e6c8a0 | |||
db1624a25b | |||
764603f60b | |||
7eacacec8c | |||
05340fc53a |
@ -5,7 +5,7 @@
|
||||
},
|
||||
"body": {
|
||||
"record1": {
|
||||
"<1>": "declare function prod_spec_comm\r\ndeclare subroutine forward_event\r\n\r\nforward_event(NewData)\r\nVoid = prod_spec_comm( \"LOAD_TOOL_RECIPE\" )\r\nRETURN 0\r\n"
|
||||
"<1>": "declare function prod_spec_comm\r\ndeclare subroutine forward_event\r\n\r\nforward_event(NewData)\r\nVoid = prod_spec_comm( \"LOAD_TOOL_RECIPE\" )\r\nVoid = prod_spec_comm( \"LOAD_TOOL_PATTERN\" )\r\nRETURN 0\r\n"
|
||||
}
|
||||
}
|
||||
}
|
@ -5,7 +5,7 @@
|
||||
},
|
||||
"body": {
|
||||
"record1": {
|
||||
"<1>": "$INSERT RECIPE_EQU\r\n\r\nDECLARE SUBROUTINE Set_List_Box_data, Set_Property\r\nDECLARE FUNCTION Center_Window, Prod_Spec_Comm\r\n\r\nEQU MI$TOOL\t\t\tTO 1\r\nEQU MI$TYPE\t\t\tTO 2\r\nEQU MI$RECIPE\t\tTO 3\r\nEQU MI$FREQ\t\t\tTO 4\r\nEQU MI$PROVE_TYPE\tTO 5\r\nEQU MI$FIRST_CHECK\tTO 6\r\nEQU MI$LAST_CHECK\tTO 7\r\nEQU MI$SPC\t\t\tTO 8\r\nEQU MI$OVERGROW\t\tTO 9\r\nEQU MI$EXP_TW_QTY\tTO 10\r\nEQU MI$PATTERN\t\tTO 11\r\n\r\nIF INDEX( CreateParam, 'CENTER', 1 ) THEN\r\n void = center_window( @window )\r\nEND ELSE\r\n Void = Set_Property( @window, 'VISIBLE', 1 )\r\nEND\r\n\r\nMeasureInfo\t= FIELD( CreateParam, CHAR(245), 1 )\t\t;* 1st passed parameter\r\n\r\nCtrls = @WINDOW:'.TOOL':@RM\t\t\t\t; Props = 'TEXT':@RM\t\t; Vals = FIELD(MeasureInfo,'~',MI$TOOL):@RM\r\nCtrls := @WINDOW:'.TYPE':@RM\t\t\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$TYPE):@RM\r\nCtrls := @WINDOW:'.RECIPE':@RM\t\t\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$RECIPE):@RM\r\nCtrls := @WINDOW:'.FREQ':@RM\t\t\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$FREQ):@RM\r\nCtrls := @WINDOW:'.PROVE_TYPE':@RM\t\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$PROVE_TYPE):@RM\r\nCtrls := @WINDOW:'.FIRST_CHECK':@RM\t\t\t; Props := 'CHECK':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$FIRST_CHECK):@RM\r\nCtrls := @WINDOW:'.LAST_CHECK':@RM\t\t\t; Props := 'CHECK':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$LAST_CHECK):@RM\r\nCtrls := @WINDOW:'.SPC':@RM\t\t\t\t\t; Props := 'CHECK':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$SPC):@RM\r\nCtrls := @WINDOW:'.OVERGROW':@RM\t\t\t; Props := 'CHECK':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$OVERGROW):@RM\r\nCtrls := @WINDOW:'.EXPECTED_TW_QTY':@RM\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$EXP_TW_QTY):@RM\r\nCtrls := @WINDOW:'.PATTERN'\t\t\t\t\t; Props := 'TEXT'\t\t\t; Vals := FIELD(MeasureInfo,'~',MI$PATTERN)\r\n\r\nSet_Property(Ctrls,Props,Vals)\r\nSet_Property(@WINDOW, '@Controls',Ctrls)\r\nSet_Property(@WINDOW, '@Props',Props)\r\n\r\nType = FIELD(CreateParam,CHAR(245),2)\t\t;* 2nd passed parameter\r\n\r\nIF Type = 'RES' THEN\r\n\tvoid = Set_Property(@WINDOW:'.OVERGROW','VISIBLE',1)\r\nEND ELSE\r\n\tvoid = Set_Property(@WINDOW:'.OVERGROW','VISIBLE',0)\r\nEND\r\n\r\nTypeOut = FIELD(CreateParam,CHAR(245),3)\t\t\t;* 3rd passed parameter\r\n\r\nTitle = Get_Property(@WINDOW,'TEXT')\r\nTitle := TypeOut:' ':Title\r\nSet_Property(@WINDOW,'TEXT',Title)\r\n\r\nSet_List_Box_Data(CtrlEntId)\r\n\r\n\r\nToolList = XLATE('LISTBOX_CONFIG',Type:'MEASURETOOL','','X')\r\nCONVERT @VM TO @FM IN ToolList\r\nSet_Property(@WINDOW:'.TOOL','LIST',ToolList)\r\n\r\nTool = Get_Property(@WINDOW:'.TOOL', 'TEXT' )\r\nCONVERT @LOWER_CASE TO @UPPER_CASE IN Tool\r\n\r\nRecipeList = XLATE( 'LISTBOX_CONFIG', Tool:'_RECIPES', '', 'X' )\r\nCONVERT @VM To @FM IN RecipeList\r\n\r\nIF RecipeList NE '' THEN\r\n\tSet_Property(@WINDOW:'.RECIPE','LIST',RecipeList)\r\nEND\r\n\r\nRETURN 1\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"
|
||||
"<1>": "$INSERT RECIPE_EQU\r\n$insert TOOL_CLASS_EQUATES\r\n\r\nDECLARE SUBROUTINE Set_List_Box_data, Set_Property\r\nDECLARE FUNCTION Center_Window, Prod_Spec_Comm\r\n\r\nEQU MI$TOOL\t\t\tTO 1\r\nEQU MI$TYPE\t\t\tTO 2\r\nEQU MI$RECIPE\t\tTO 3\r\nEQU MI$FREQ\t\t\tTO 4\r\nEQU MI$PROVE_TYPE\tTO 5\r\nEQU MI$FIRST_CHECK\tTO 6\r\nEQU MI$LAST_CHECK\tTO 7\r\nEQU MI$SPC\t\t\tTO 8\r\nEQU MI$OVERGROW\t\tTO 9\r\nEQU MI$EXP_TW_QTY\tTO 10\r\nEQU MI$PATTERN\t\tTO 11\r\n\r\nIF INDEX( CreateParam, 'CENTER', 1 ) THEN\r\n void = center_window( @window )\r\nEND ELSE\r\n Void = Set_Property( @window, 'VISIBLE', 1 )\r\nEND\r\n\r\nMeasureInfo\t= FIELD( CreateParam, CHAR(245), 1 )\t\t;* 1st passed parameter\r\n\r\nCtrls = @WINDOW:'.TOOL':@RM\t\t\t\t; Props = 'TEXT':@RM\t\t; Vals = FIELD(MeasureInfo,'~',MI$TOOL):@RM\r\nCtrls := @WINDOW:'.TYPE':@RM\t\t\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$TYPE):@RM\r\nCtrls := @WINDOW:'.RECIPE':@RM\t\t\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$RECIPE):@RM\r\nCtrls := @WINDOW:'.FREQ':@RM\t\t\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$FREQ):@RM\r\nCtrls := @WINDOW:'.PROVE_TYPE':@RM\t\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$PROVE_TYPE):@RM\r\nCtrls := @WINDOW:'.FIRST_CHECK':@RM\t\t\t; Props := 'CHECK':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$FIRST_CHECK):@RM\r\nCtrls := @WINDOW:'.LAST_CHECK':@RM\t\t\t; Props := 'CHECK':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$LAST_CHECK):@RM\r\nCtrls := @WINDOW:'.SPC':@RM\t\t\t\t\t; Props := 'CHECK':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$SPC):@RM\r\nCtrls := @WINDOW:'.OVERGROW':@RM\t\t\t; Props := 'CHECK':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$OVERGROW):@RM\r\nCtrls := @WINDOW:'.EXPECTED_TW_QTY':@RM\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$EXP_TW_QTY):@RM\r\nCtrls := @WINDOW:'.PATTERN'\t\t\t\t\t; Props := 'TEXT'\t\t\t; Vals := FIELD(MeasureInfo,'~',MI$PATTERN)\r\n\r\nSet_Property(Ctrls,Props,Vals)\r\nSet_Property(@WINDOW, '@Controls',Ctrls)\r\nSet_Property(@WINDOW, '@Props',Props)\r\n\r\nType = FIELD(CreateParam,CHAR(245),2)\t\t;* 2nd passed parameter\r\n\r\nIF Type = 'RES' THEN\r\n\tvoid = Set_Property(@WINDOW:'.OVERGROW','VISIBLE',1)\r\nEND ELSE\r\n\tvoid = Set_Property(@WINDOW:'.OVERGROW','VISIBLE',0)\r\nEND\r\n\r\nTypeOut = FIELD(CreateParam,CHAR(245),3)\t\t\t;* 3rd passed parameter\r\n\r\nTitle = Get_Property(@WINDOW,'TEXT')\r\nTitle := TypeOut:' ':Title\r\nSet_Property(@WINDOW,'TEXT',Title)\r\n\r\nToolList = XLATE('LISTBOX_CONFIG',Type:'MEASURETOOL','','X')\r\nCONVERT @VM TO @FM IN ToolList\r\nSet_Property(@WINDOW:'.TOOL','LIST',ToolList)\r\n\r\nTool = Get_Property(@WINDOW:'.TOOL', 'TEXT' )\r\nCONVERT @LOWER_CASE TO @UPPER_CASE IN Tool\r\n\r\nRecipeList = XLATE( 'TOOL_CLASS', Tool, TOOL_CLASS_RECIPES$, 'X' )\r\nCONVERT @VM To @FM IN RecipeList\r\n\r\nIF RecipeList NE '' THEN\r\n\tSet_Property(@WINDOW:'.RECIPE','LIST',RecipeList)\r\nEnd\r\n\r\nPatternList = Xlate('TOOL_CLASS', Tool, TOOL_CLASS_PATTERN$, 'X')\r\nCONVERT @VM To @FM IN PatternList\r\n\r\nIf PatternList Ne '' Then\r\n Set_Property(@Window:'.PATTERN', 'LIST', PatternList)\r\nEnd\r\n\r\nRETURN 1\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"
|
||||
}
|
||||
}
|
||||
}
|
@ -5,7 +5,7 @@
|
||||
},
|
||||
"body": {
|
||||
"record1": {
|
||||
"<1>": "\r\ndeclare function dialog_box\r\n\r\nRDSNo = Get_Property(@Window : '.RDS_NO', 'TEXT')\r\nReturnVal = dialog_box( 'NDW_LOAD_UNLOAD_EXTRA', @window, RDSNo)\r\n/*\r\nVoid = set_property( @window, '@ExSigWrite', 0 )\r\nOrigExSigInfo = get_property( @window, '@ExSigInfo' )\r\nReturnVal = dialog_box( 'RDS_UNLOAD_LOAD_EX', @window, OrigExSigInfo )\r\nif ReturnVal <> 'CANCEL' and ( ReturnVal <> OrigExSigInfo ) then\r\n Void = set_property( @window, '@ExSigInfo', ReturnVal )\r\n Void = set_property( @window, '@ExSigWrite', 1 )\r\n @@window->savewarn = 1\r\nend\r\n*/\r\nRETURN 0\r\n"
|
||||
"<1>": "\r\ndeclare function dialog_box, Get_Property\r\ndeclare subroutine Send_Event, Post_Event, Set_Property\r\n\r\nATRECORD = Get_Property(@Window, 'ATRECORD')\r\nRecCheck = @Record\r\n\r\nRDSNo = Get_Property(@Window : '.RDS_NO', 'TEXT')\r\n\r\nIf ATRECORD NE RecCheck then\r\n OrigIOOptions = Get_Property (@Window, \"IOOPTIONS\")\r\n TempIOOptions = OrigIOOptions\r\n TempIOOptions<6> = 1\r\n Set_Property(@Window, 'IOOPTIONS', TempIOOptions)\r\n Send_Event(@Window, 'WRITE')\r\n Set_Property(@Window, 'IOOPTIONS', OrigIOOptions)\r\nend\r\n\r\nReturnVal = dialog_box( 'NDW_LOAD_UNLOAD_EXTRA', @window, RDSNo)\r\nSet_Property(@window, 'SAVEWARN', 0)\r\nPost_Event(@Window, 'READ')\r\n/*\r\nVoid = set_property( @window, '@ExSigWrite', 0 )\r\nOrigExSigInfo = get_property( @window, '@ExSigInfo' )\r\nReturnVal = dialog_box( 'RDS_UNLOAD_LOAD_EX', @window, OrigExSigInfo )\r\nif ReturnVal <> 'CANCEL' and ( ReturnVal <> OrigExSigInfo ) then\r\n Void = set_property( @window, '@ExSigInfo', ReturnVal )\r\n Void = set_property( @window, '@ExSigWrite', 1 )\r\n @@window->savewarn = 1\r\nend\r\n*/\r\nRETURN 0\r\n"
|
||||
}
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -22604,10 +22604,10 @@
|
||||
"<2>": {
|
||||
"<2,1>": {
|
||||
"<2,1,1>": {
|
||||
"<2,1,1,1>": "SEND_MESSAGE.MESSAGE_W/ATTACHMENT",
|
||||
"<2,1,1,2>": "PRINT.CUSTOMER_RDS",
|
||||
"<2,1,1,3>": "PRINT.FACTORY_LABELS",
|
||||
"<2,1,1,4>": "UNLOAD/LOAD_EXTRA.SIGNATURE_INFO"
|
||||
"<2,1,1,1>": "UNLOAD/LOAD_EXTRA.SIGNATURE_INFO",
|
||||
"<2,1,1,2>": "PRINT.FACTORY_LABELS",
|
||||
"<2,1,1,3>": "PRINT.CUSTOMER_RDS",
|
||||
"<2,1,1,4>": "SEND_MESSAGE.MESSAGE_W/ATTACHMENT"
|
||||
}
|
||||
},
|
||||
"<2,2>": {
|
||||
|
@ -3591,7 +3591,7 @@
|
||||
"<22,2>": "",
|
||||
"<22,3>": "EDITFIELD",
|
||||
"<22,4>": "RDS_PRE_EPI",
|
||||
"<22,5>": "366",
|
||||
"<22,5>": "380",
|
||||
"<22,6>": "370",
|
||||
"<22,7>": "132",
|
||||
"<22,8>": "18",
|
||||
@ -3731,7 +3731,7 @@
|
||||
"<23,2>": "",
|
||||
"<23,3>": "EDITFIELD",
|
||||
"<23,4>": "RDS_PRE_EPI",
|
||||
"<23,5>": "505",
|
||||
"<23,5>": "521",
|
||||
"<23,6>": "370",
|
||||
"<23,7>": "84",
|
||||
"<23,8>": "18",
|
||||
@ -3871,7 +3871,7 @@
|
||||
"<24,2>": "",
|
||||
"<24,3>": "EDITFIELD",
|
||||
"<24,4>": "RDS_PRE_EPI",
|
||||
"<24,5>": "593",
|
||||
"<24,5>": "612",
|
||||
"<24,6>": "370",
|
||||
"<24,7>": "75",
|
||||
"<24,8>": "18",
|
||||
@ -9835,9 +9835,9 @@
|
||||
"<56,3>": "PUSHBUTTON",
|
||||
"<56,4>": "RDS_PRE_EPI",
|
||||
"<56,5>": "324",
|
||||
"<56,6>": "370",
|
||||
"<56,7>": "36",
|
||||
"<56,8>": "18",
|
||||
"<56,6>": "368",
|
||||
"<56,7>": "52",
|
||||
"<56,8>": "24",
|
||||
"<56,9>": "Sign",
|
||||
"<56,10>": {
|
||||
"<56,10,1>": "0x56000300",
|
||||
@ -17211,9 +17211,9 @@
|
||||
"<101,2>": "",
|
||||
"<101,3>": "GROUPBOX",
|
||||
"<101,4>": "RDS_PRE_EPI",
|
||||
"<101,5>": "10",
|
||||
"<101,5>": "12",
|
||||
"<101,6>": "268",
|
||||
"<101,7>": "672",
|
||||
"<101,7>": "690",
|
||||
"<101,8>": "129",
|
||||
"<101,9>": "Pre-Epi Verification",
|
||||
"<101,10>": {
|
||||
@ -17917,7 +17917,8 @@
|
||||
"<1,26,16>": "",
|
||||
"<1,26,17>": "",
|
||||
"<1,26,18>": "",
|
||||
"<1,26,19>": ""
|
||||
"<1,26,19>": "",
|
||||
"<1,26,20>": ""
|
||||
},
|
||||
"<1,27>": {
|
||||
"<1,27,1>": "ITEM",
|
||||
@ -17938,7 +17939,8 @@
|
||||
"<1,27,16>": "",
|
||||
"<1,27,17>": "",
|
||||
"<1,27,18>": "",
|
||||
"<1,27,19>": ""
|
||||
"<1,27,19>": "",
|
||||
"<1,27,20>": ""
|
||||
},
|
||||
"<1,28>": {
|
||||
"<1,28,1>": "POPUP",
|
||||
@ -18010,9 +18012,9 @@
|
||||
"<2>": {
|
||||
"<2,1>": {
|
||||
"<2,1,1>": {
|
||||
"<2,1,1,1>": "SEND_MESSAGE.MESSAGE_W/ATTACHMENT",
|
||||
"<2,1,1,1>": "EDIT.THICKNESS_OVERGROWTH_AVG",
|
||||
"<2,1,1,2>": "EDIT.SSI_STANDARDS",
|
||||
"<2,1,1,3>": "EDIT.THICKNESS_OVERGROWTH_AVG"
|
||||
"<2,1,1,3>": "SEND_MESSAGE.MESSAGE_W/ATTACHMENT"
|
||||
}
|
||||
},
|
||||
"<2,2>": {
|
||||
@ -18022,7 +18024,17 @@
|
||||
"<2,2,1,3>": "@WINDOW",
|
||||
"<2,2,1,4>": "",
|
||||
"<2,2,1,5>": "",
|
||||
"<2,2,1,6>": ""
|
||||
"<2,2,1,6>": "",
|
||||
"<2,2,1,7>": "",
|
||||
"<2,2,1,8>": "",
|
||||
"<2,2,1,9>": "",
|
||||
"<2,2,1,10>": "",
|
||||
"<2,2,1,11>": "",
|
||||
"<2,2,1,12>": "",
|
||||
"<2,2,1,13>": "",
|
||||
"<2,2,1,14>": "",
|
||||
"<2,2,1,15>": "READROW",
|
||||
"<2,2,1,16>": "0"
|
||||
},
|
||||
"<2,2,2>": {
|
||||
"<2,2,2,1>": "E",
|
||||
@ -18152,7 +18164,17 @@
|
||||
"<2,2,16,3>": "@WINDOW",
|
||||
"<2,2,16,4>": "",
|
||||
"<2,2,16,5>": "",
|
||||
"<2,2,16,6>": ""
|
||||
"<2,2,16,6>": "",
|
||||
"<2,2,16,7>": "",
|
||||
"<2,2,16,8>": "",
|
||||
"<2,2,16,9>": "",
|
||||
"<2,2,16,10>": "",
|
||||
"<2,2,16,11>": "",
|
||||
"<2,2,16,12>": "",
|
||||
"<2,2,16,13>": "",
|
||||
"<2,2,16,14>": "",
|
||||
"<2,2,16,15>": "GEN",
|
||||
"<2,2,16,16>": "0"
|
||||
}
|
||||
},
|
||||
"<2,3>": {
|
||||
|
16729
LSL2/OIWIN/REACTOR.json
16729
LSL2/OIWIN/REACTOR.json
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
445
LSL2/OIWIN/WEB_OI_WIZARD.json
Normal file
445
LSL2/OIWIN/WEB_OI_WIZARD.json
Normal 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>": ""
|
||||
}
|
||||
}
|
||||
}
|
@ -43,6 +43,10 @@
|
||||
"<8,3>": {
|
||||
"<8,3,1>": "Update RDS Layer Parameters",
|
||||
"<8,3,2>": "UPDATE_RDS_LAYER"
|
||||
},
|
||||
"<8,4>": {
|
||||
"<8,4,1>": "Update RDS Test Specs",
|
||||
"<8,4,2>": "UPDATE_RDS_TEST"
|
||||
}
|
||||
},
|
||||
"<9>": {
|
||||
|
@ -122,8 +122,12 @@
|
||||
"<8,23,1>": "PSV",
|
||||
"<8,23,2>": "Pre Ship Verification"
|
||||
},
|
||||
"<8,24>": "",
|
||||
"<8,25>": ""
|
||||
"<8,24>": {
|
||||
"<8,24,1>": "RTF",
|
||||
"<8,24,2>": "Return To Fab Active"
|
||||
},
|
||||
"<8,25>": "",
|
||||
"<8,26>": ""
|
||||
},
|
||||
"<9>": {
|
||||
"<9,1>": {
|
||||
@ -141,14 +145,6 @@
|
||||
"<9,2,4>": "C",
|
||||
"<9,2,5>": "",
|
||||
"<9,2,6>": "Current Status Description"
|
||||
},
|
||||
"<9,3>": {
|
||||
"<9,3,1>": "",
|
||||
"<9,3,2>": "",
|
||||
"<9,3,3>": "",
|
||||
"<9,3,4>": "",
|
||||
"<9,3,5>": "",
|
||||
"<9,3,6>": ""
|
||||
}
|
||||
},
|
||||
"<10>": "L",
|
||||
@ -175,8 +171,18 @@
|
||||
"<31>": "0",
|
||||
"<32>": "0",
|
||||
"<33>": "0",
|
||||
"<34>": "16777215",
|
||||
"<35>": "16777215"
|
||||
"<34>": "-2",
|
||||
"<35>": "-2",
|
||||
"<36>": "",
|
||||
"<37>": "",
|
||||
"<38>": "",
|
||||
"<39>": "",
|
||||
"<40>": "-2",
|
||||
"<41>": "1000",
|
||||
"<42>": "",
|
||||
"<43>": "",
|
||||
"<44>": "",
|
||||
"<45>": ""
|
||||
}
|
||||
}
|
||||
}
|
@ -9,7 +9,7 @@
|
||||
"<2>": "-1",
|
||||
"<3>": "-1",
|
||||
"<4>": "-1",
|
||||
"<5>": "16777215",
|
||||
"<5>": "-2",
|
||||
"<6>": {
|
||||
"<6,1>": {
|
||||
"<6,1,1>": "Tahoma",
|
||||
@ -41,28 +41,8 @@
|
||||
"<8,2,2>": "High Thruput"
|
||||
},
|
||||
"<8,3>": {
|
||||
"<8,3,1>": "K2K",
|
||||
"<8,3,2>": "Kit 2000"
|
||||
},
|
||||
"<8,4>": {
|
||||
"<8,4,1>": "EPP",
|
||||
"<8,4,2>": " EpiPro"
|
||||
},
|
||||
"<8,5>": {
|
||||
"<8,5,1>": "GAN",
|
||||
"<8,5,2>": "GaN"
|
||||
},
|
||||
"<8,6>": {
|
||||
"<8,6,1>": "STD",
|
||||
"<8,6,2>": "Standard"
|
||||
},
|
||||
"<8,7>": {
|
||||
"<8,7,1>": "HD",
|
||||
"<8,7,2>": "Heavy Duty"
|
||||
},
|
||||
"<8,8>": {
|
||||
"<8,8,1>": "SCADA",
|
||||
"<8,8,2>": "Prototype"
|
||||
"<8,3,1>": "EPP",
|
||||
"<8,3,2>": " EpiPro"
|
||||
}
|
||||
},
|
||||
"<9>": {
|
||||
@ -108,7 +88,17 @@
|
||||
"<32>": "0",
|
||||
"<33>": "1",
|
||||
"<34>": "16777215",
|
||||
"<35>": "16777215"
|
||||
"<35>": "16777215",
|
||||
"<36>": "",
|
||||
"<37>": "",
|
||||
"<38>": "",
|
||||
"<39>": "",
|
||||
"<40>": "-2",
|
||||
"<41>": "1000",
|
||||
"<42>": "",
|
||||
"<43>": "",
|
||||
"<44>": "",
|
||||
"<45>": ""
|
||||
}
|
||||
}
|
||||
}
|
@ -130,7 +130,11 @@
|
||||
"<8,25,1>": "PSV",
|
||||
"<8,25,2>": "Pre Ship Verification"
|
||||
},
|
||||
"<8,26>": ""
|
||||
"<8,26>": {
|
||||
"<8,26,1>": "RTF",
|
||||
"<8,26,2>": "Return To Fab Active"
|
||||
},
|
||||
"<8,27>": ""
|
||||
},
|
||||
"<9>": {
|
||||
"<9,1>": {
|
||||
@ -174,8 +178,18 @@
|
||||
"<31>": "0",
|
||||
"<32>": "0",
|
||||
"<33>": "0",
|
||||
"<34>": "16777215",
|
||||
"<35>": "16777215"
|
||||
"<34>": "-2",
|
||||
"<35>": "-2",
|
||||
"<36>": "",
|
||||
"<37>": "",
|
||||
"<38>": "",
|
||||
"<39>": "",
|
||||
"<40>": "-2",
|
||||
"<41>": "1000",
|
||||
"<42>": "",
|
||||
"<43>": "",
|
||||
"<44>": "",
|
||||
"<45>": ""
|
||||
}
|
||||
}
|
||||
}
|
@ -9,7 +9,7 @@
|
||||
"<2>": "-1",
|
||||
"<3>": "-1",
|
||||
"<4>": "-1",
|
||||
"<5>": "16777215",
|
||||
"<5>": "-2",
|
||||
"<6>": {
|
||||
"<6,1>": {
|
||||
"<6,1,1>": "Tahoma",
|
||||
@ -43,39 +43,19 @@
|
||||
"<8,2,3>": "High Thruput"
|
||||
},
|
||||
"<8,3>": {
|
||||
"<8,3,1>": "4",
|
||||
"<8,3,1>": "5",
|
||||
"<8,3,2>": "HTR",
|
||||
"<8,3,3>": "High Thruput"
|
||||
},
|
||||
"<8,4>": {
|
||||
"<8,4,1>": "5",
|
||||
"<8,4,2>": "HTR",
|
||||
"<8,4,3>": "High Thruput"
|
||||
"<8,4,1>": "8",
|
||||
"<8,4,2>": "EPP",
|
||||
"<8,4,3>": "EpiPro"
|
||||
},
|
||||
"<8,5>": {
|
||||
"<8,5,1>": "8",
|
||||
"<8,5,1>": "18",
|
||||
"<8,5,2>": "EPP",
|
||||
"<8,5,3>": "EpiPro"
|
||||
},
|
||||
"<8,6>": {
|
||||
"<8,6,1>": "18",
|
||||
"<8,6,2>": "EPP",
|
||||
"<8,6,3>": "EpiPro"
|
||||
},
|
||||
"<8,7>": {
|
||||
"<8,7,1>": "24",
|
||||
"<8,7,2>": "EPP",
|
||||
"<8,7,3>": "EpiPro"
|
||||
},
|
||||
"<8,8>": {
|
||||
"<8,8,1>": "5",
|
||||
"<8,8,2>": "GAN",
|
||||
"<8,8,3>": "G5+"
|
||||
},
|
||||
"<8,9>": {
|
||||
"<8,9,1>": "8",
|
||||
"<8,9,2>": "GAN",
|
||||
"<8,9,3>": "G5"
|
||||
}
|
||||
},
|
||||
"<9>": {
|
||||
@ -129,7 +109,17 @@
|
||||
"<32>": "0",
|
||||
"<33>": "1",
|
||||
"<34>": "16777215",
|
||||
"<35>": "16777215"
|
||||
"<35>": "16777215",
|
||||
"<36>": "",
|
||||
"<37>": "",
|
||||
"<38>": "",
|
||||
"<39>": "",
|
||||
"<40>": "-2",
|
||||
"<41>": "1000",
|
||||
"<42>": "",
|
||||
"<43>": "",
|
||||
"<44>": "",
|
||||
"<45>": ""
|
||||
}
|
||||
}
|
||||
}
|
@ -9,7 +9,7 @@
|
||||
"<2>": "-1",
|
||||
"<3>": "-1",
|
||||
"<4>": "-1",
|
||||
"<5>": "16777215",
|
||||
"<5>": "-2",
|
||||
"<6>": {
|
||||
"<6,1>": {
|
||||
"<6,1,1>": "Tahoma",
|
||||
@ -33,32 +33,12 @@
|
||||
"<7>": "",
|
||||
"<8>": {
|
||||
"<8,1>": {
|
||||
"<8,1,1>": "35",
|
||||
"<8,1,2>": "35 inch EpiPro"
|
||||
"<8,1,1>": "8",
|
||||
"<8,1,2>": "200mm 8 in"
|
||||
},
|
||||
"<8,2>": {
|
||||
"<8,2,1>": "18",
|
||||
"<8,2,2>": "18 inch HTR"
|
||||
},
|
||||
"<8,3>": {
|
||||
"<8,3,1>": "15",
|
||||
"<8,3,2>": "15 inch HTR"
|
||||
},
|
||||
"<8,4>": {
|
||||
"<8,4,1>": "8",
|
||||
"<8,4,2>": "8 inch 200mm"
|
||||
},
|
||||
"<8,5>": {
|
||||
"<8,5,1>": "6",
|
||||
"<8,5,2>": "6 inch 150mm"
|
||||
},
|
||||
"<8,6>": {
|
||||
"<8,6,1>": "5",
|
||||
"<8,6,2>": "5 inch 125mm"
|
||||
},
|
||||
"<8,7>": {
|
||||
"<8,7,1>": "4",
|
||||
"<8,7,2>": "4 inch 100mm"
|
||||
"<8,2,1>": "6",
|
||||
"<8,2,2>": "150mm 6 in"
|
||||
}
|
||||
},
|
||||
"<9>": {
|
||||
@ -104,7 +84,17 @@
|
||||
"<32>": "0",
|
||||
"<33>": "1",
|
||||
"<34>": "16777215",
|
||||
"<35>": "16777215"
|
||||
"<35>": "16777215",
|
||||
"<36>": "",
|
||||
"<37>": "",
|
||||
"<38>": "",
|
||||
"<39>": "",
|
||||
"<40>": "-2",
|
||||
"<41>": "1000",
|
||||
"<42>": "",
|
||||
"<43>": "",
|
||||
"<44>": "",
|
||||
"<45>": ""
|
||||
}
|
||||
}
|
||||
}
|
@ -9,7 +9,7 @@
|
||||
"<2>": "-2",
|
||||
"<3>": "-1",
|
||||
"<4>": "-1",
|
||||
"<5>": "16777215",
|
||||
"<5>": "-2",
|
||||
"<6>": {
|
||||
"<6,1>": {
|
||||
"<6,1,1>": "MS Sans Serif",
|
||||
@ -105,6 +105,10 @@
|
||||
"<8,19>": {
|
||||
"<8,19,1>": "PACK",
|
||||
"<8,19,2>": "Loaded in PT Out"
|
||||
},
|
||||
"<8,20>": {
|
||||
"<8,20,1>": "RTF",
|
||||
"<8,20,2>": "Return To Fab Active"
|
||||
}
|
||||
},
|
||||
"<9>": {
|
||||
@ -123,14 +127,6 @@
|
||||
"<9,2,4>": "C",
|
||||
"<9,2,5>": "",
|
||||
"<9,2,6>": "Current Status Description"
|
||||
},
|
||||
"<9,3>": {
|
||||
"<9,3,1>": "",
|
||||
"<9,3,2>": "",
|
||||
"<9,3,3>": "",
|
||||
"<9,3,4>": "",
|
||||
"<9,3,5>": "",
|
||||
"<9,3,6>": ""
|
||||
}
|
||||
},
|
||||
"<10>": "L",
|
||||
@ -158,7 +154,17 @@
|
||||
"<32>": "0",
|
||||
"<33>": "1",
|
||||
"<34>": "16777215",
|
||||
"<35>": "16777215"
|
||||
"<35>": "16777215",
|
||||
"<36>": "",
|
||||
"<37>": "",
|
||||
"<38>": "",
|
||||
"<39>": "",
|
||||
"<40>": "-2",
|
||||
"<41>": "1000",
|
||||
"<42>": "",
|
||||
"<43>": "",
|
||||
"<44>": "",
|
||||
"<45>": ""
|
||||
}
|
||||
}
|
||||
}
|
@ -9,7 +9,7 @@
|
||||
"<2>": "-2",
|
||||
"<3>": "-1",
|
||||
"<4>": "-1",
|
||||
"<5>": "16777215",
|
||||
"<5>": "-2",
|
||||
"<6>": {
|
||||
"<6,1>": {
|
||||
"<6,1,1>": "MS Sans Serif",
|
||||
@ -189,6 +189,10 @@
|
||||
"<8,40>": {
|
||||
"<8,40,1>": "PACK",
|
||||
"<8,40,2>": "Loaded in PT Out"
|
||||
},
|
||||
"<8,41>": {
|
||||
"<8,41,1>": "RTF",
|
||||
"<8,41,2>": "Return To Fab Active"
|
||||
}
|
||||
},
|
||||
"<9>": {
|
||||
@ -207,14 +211,6 @@
|
||||
"<9,2,4>": "C",
|
||||
"<9,2,5>": "",
|
||||
"<9,2,6>": "Current Status Description"
|
||||
},
|
||||
"<9,3>": {
|
||||
"<9,3,1>": "",
|
||||
"<9,3,2>": "",
|
||||
"<9,3,3>": "",
|
||||
"<9,3,4>": "",
|
||||
"<9,3,5>": "",
|
||||
"<9,3,6>": ""
|
||||
}
|
||||
},
|
||||
"<10>": "L",
|
||||
@ -242,7 +238,17 @@
|
||||
"<32>": "0",
|
||||
"<33>": "1",
|
||||
"<34>": "16777215",
|
||||
"<35>": "16777215"
|
||||
"<35>": "16777215",
|
||||
"<36>": "",
|
||||
"<37>": "",
|
||||
"<38>": "",
|
||||
"<39>": "",
|
||||
"<40>": "-2",
|
||||
"<41>": "1000",
|
||||
"<42>": "",
|
||||
"<43>": "",
|
||||
"<44>": "",
|
||||
"<45>": ""
|
||||
}
|
||||
}
|
||||
}
|
@ -27,17 +27,22 @@ $Insert SERVICE_SETUP
|
||||
$Insert APP_INSERTS
|
||||
$Insert REVDOTNETEQUATES
|
||||
|
||||
Declare function Logging_Services, Environment_Services, Active_Directory_Services
|
||||
Declare subroutine Set_Property.Net, Logging_Services, Set_Status, Database_Services
|
||||
Declare function Logging_Services, Environment_Services, Active_Directory_Services, Database_Services
|
||||
Declare function Error_Services, SRP_Array
|
||||
Declare subroutine Set_Property.Net, Logging_Services, Set_Status, Database_Services, Error_Services
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\ActiveDirectory'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
LogTime = Oconv(Time(), 'MTS')
|
||||
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
||||
|
||||
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ActiveDirectoryAuthLog.csv'
|
||||
Headers = 'Logging DTM' : @FM : 'Username' : @FM : 'Authenticated'
|
||||
objADAuthLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
|
||||
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ActiveDirectoryAuthenticationLog.csv'
|
||||
Headers = 'Logging DTM' : @FM : 'Username' : @FM : 'Authenticated'
|
||||
objADAuthenticationLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
|
||||
|
||||
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ActiveDirectoryAuthorizationLog.csv'
|
||||
Headers = 'Logging DTM' : @FM : 'Username' : @FM : 'Authorized'
|
||||
objADAuthorizationLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
|
||||
|
||||
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ActiveDirectoryLog.csv'
|
||||
Headers = 'Logging DTM' : @FM : 'Operation' : @FM : 'Message'
|
||||
@ -83,12 +88,43 @@ Service AuthenticateUser(Username, Password, Domain)
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = Username
|
||||
LogData<3> = Authenticated
|
||||
Logging_Services('AppendLog', objADAuthLog, LogData, @RM, @FM, False$)
|
||||
Logging_Services('AppendLog', objADAuthenticationLog, LogData, @RM, @FM, False$)
|
||||
Response = Authenticated
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service AuthorizeUser(Username, Domain)
|
||||
|
||||
ErrorMsg = ''
|
||||
Authorized = False$
|
||||
If ( (Username NE '') and (Domain NE '') ) then
|
||||
AuthAdGroups = ''
|
||||
LoginConfig = Database_Services('ReadDataRow', 'SYSENV', 'CFG_LOGIN*LSL2')
|
||||
If Error_Services('NoError') then
|
||||
AuthAdGroups<-1> = LoginConfig<2>
|
||||
AuthAdGroups<-1> = LoginConfig<3>
|
||||
AuthAdGroups<-1> = LoginConfig<4>
|
||||
UserAdGroups = Active_Directory_Services('GetADGroups', Username, Domain)
|
||||
MemberOfAuthGroups = SRP_Array('Join', UserAdGroups, AuthAdGroups, 'AND', @FM)
|
||||
Authorized = (MemberOfAuthGroups NE '')
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error retrieving active directory authorization groups.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Username and domain required.'
|
||||
end
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = Username
|
||||
LogData<3> = Authorized
|
||||
Logging_Services('AppendLog', objADAuthorizationLog, LogData, @RM, @FM, False$)
|
||||
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||
Response = Authorized
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service GetADGroups(Username, Domain)
|
||||
|
||||
ADGroups = ''
|
||||
@ -143,7 +179,6 @@ Service GetADGroups(Username, Domain)
|
||||
End Service
|
||||
|
||||
|
||||
|
||||
Service GetComputerDomain()
|
||||
|
||||
Domain = ''
|
||||
@ -166,6 +201,7 @@ Service GetComputerDomain()
|
||||
|
||||
end service
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// GetADGroupsByString
|
||||
//
|
||||
@ -303,8 +339,10 @@ Service GetADGroupsByString(SearchString, Domain=DOMAIN, SearchByDescription=DES
|
||||
end
|
||||
|
||||
Response = ADGroups
|
||||
|
||||
end service
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// GetADGroupMembersByGroupDescription
|
||||
//
|
||||
@ -319,6 +357,7 @@ end service
|
||||
// 9/26/2024 - [JRO] Initial Programmer.
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service GetADGroupMembersByGroupDescription(DescriptionName, Domain=DOMAIN)
|
||||
|
||||
Set_Status(0)
|
||||
ErrMessage = ''
|
||||
GroupUsers = ''
|
||||
@ -397,8 +436,10 @@ Service GetADGroupMembersByGroupDescription(DescriptionName, Domain=DOMAIN)
|
||||
Error_Services('Add', ErrMessage)
|
||||
end
|
||||
Response = GroupUsers
|
||||
|
||||
end service
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// GetADGroupMembersByGroupName
|
||||
//
|
||||
@ -413,6 +454,7 @@ end service
|
||||
// 9/26/2024 - [JRO] Initial Programmer.
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service GetADGroupMembersByGroupName(GroupName, Domain=DOMAIN)
|
||||
|
||||
Set_Status(0)
|
||||
Users = ''
|
||||
ErrMessage = ''
|
||||
@ -501,8 +543,10 @@ Service GetADGroupMembersByGroupName(GroupName, Domain=DOMAIN)
|
||||
Error_Services('Add', ErrMessage)
|
||||
end
|
||||
Response = Users
|
||||
|
||||
end service
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// GetADUserAttributes
|
||||
//
|
||||
@ -513,6 +557,7 @@ end service
|
||||
// First value is the AD User Name, Second value is the Display Name, and third value is the email.
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service GetADUserAttributes(Username, Domain=DOMAIN)
|
||||
|
||||
Set_Status(0)
|
||||
ThisUser = ''
|
||||
ErrMessage = ''
|
||||
@ -593,5 +638,6 @@ Service GetADUserAttributes(Username, Domain=DOMAIN)
|
||||
Error_Services('Add', ErrMessage)
|
||||
end
|
||||
Response = ThisUser
|
||||
|
||||
end service
|
||||
|
||||
|
@ -1,85 +1,261 @@
|
||||
Compile function Archive_Services(@Service, @Params)
|
||||
#pragma precomp SRP_PreCompiler
|
||||
$insert LOGICAL
|
||||
$insert APP_INSERTS
|
||||
EQU COMMA$ To ','
|
||||
|
||||
Declare subroutine Change_Log_Services, Logging_Services
|
||||
Declare function SRP_Datetime, Logging_Services, Environment_Services, Datetime
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Archive'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
LogTime = Oconv(Time(), 'MTS')
|
||||
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ArchiveService.csv'
|
||||
Headers = 'Logging DTM' : @FM : 'Message' : @FM : 'Cutoff Date'
|
||||
objLogArchiveService = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
|
||||
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
||||
|
||||
GoToService
|
||||
|
||||
Return Response or ""
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// SERVICES
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Service ArchiveRecords()
|
||||
Errors = ''
|
||||
StatusMessage = 'Starting Archive Script.'
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = StatusMessage
|
||||
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
|
||||
|
||||
//Archive Change Log Records
|
||||
GoSub ChangeLogArchive
|
||||
|
||||
//Finish
|
||||
Locate True$ in Errors using @FM setting ePos then
|
||||
StatusMessage = 'Archive script complete. Errors detected. Check individual archive logs for more info.'
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = StatusMessage
|
||||
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
|
||||
end else
|
||||
StatusMessage = 'Archive script complete. No errors detected.'
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = StatusMessage
|
||||
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
|
||||
end
|
||||
|
||||
End Service
|
||||
|
||||
Service DearchiveRecord(Table, ID)
|
||||
|
||||
end service
|
||||
|
||||
ChangeLogArchive:
|
||||
StatusMessage = 'Starting Change_Log Archive Script.'
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = StatusMessage
|
||||
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
|
||||
ChangeLogArchiveDate = SRP_Datetime('AddYears', Datetime(), -1)
|
||||
Change_Log_Services('ArchiveChangeLogRecByDate', ChangeLogArchiveDate)
|
||||
If Error_Services('NoError') then
|
||||
StatusMessage = 'Starting Change_Log Archive Script.'
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = StatusMessage
|
||||
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
|
||||
end else
|
||||
StatusMessage = 'Error in Change_Log Archive Script.'
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = StatusMessage
|
||||
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
|
||||
Errors<-1> = True$
|
||||
end
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Compile function Archive_Services(@Service, @Params)
|
||||
#pragma precomp SRP_PreCompiler
|
||||
$insert LOGICAL
|
||||
$insert APP_INSERTS
|
||||
$Insert WO_LOG_EQUATES
|
||||
$Insert RDS_EQUATES
|
||||
$Insert REACT_RUN_EQUATES
|
||||
$Insert RDS_LAYER_EQUATES
|
||||
$Insert RDS_TEST_EQUATES
|
||||
$Insert ARCHIVE_EQUATES
|
||||
|
||||
EQU COMMA$ To ','
|
||||
|
||||
Declare subroutine Change_Log_Services, Logging_Services, Error_Services, Database_Services
|
||||
Declare function SRP_Datetime, Logging_Services, Environment_Services, Datetime
|
||||
Declare function Database_Services, Wo_Mat_Services, Error_Services, RDS_Services
|
||||
Declare function WM_In_Services, WM_Out_Services
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Archive'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
LogTime = Oconv(Time(), 'MTS')
|
||||
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ArchiveService.csv'
|
||||
Headers = 'Logging DTM' : @FM : 'Message' : @FM : 'Cutoff Date'
|
||||
objLogArchiveService = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
|
||||
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
||||
|
||||
GoToService
|
||||
|
||||
Return Response or ""
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// SERVICES
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Service ArchiveRecords()
|
||||
Errors = ''
|
||||
StatusMessage = 'Starting Archive Script.'
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = StatusMessage
|
||||
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
|
||||
|
||||
//Archive Change Log Records
|
||||
GoSub ChangeLogArchive
|
||||
|
||||
//Finish
|
||||
Locate True$ in Errors using @FM setting ePos then
|
||||
StatusMessage = 'Archive script complete. Errors detected. Check individual archive logs for more info.'
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = StatusMessage
|
||||
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
|
||||
end else
|
||||
StatusMessage = 'Archive script complete. No errors detected.'
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = StatusMessage
|
||||
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
|
||||
end
|
||||
|
||||
End Service
|
||||
|
||||
Service GetWORelatedRecord(WOLogId)
|
||||
|
||||
ErrorMsg = ''
|
||||
If WOLogId NE '' then
|
||||
If RowExists('WO_LOG', WOLogId) then
|
||||
WOLogRec = Database_Services('ReadDataRow', 'WO_LOG', WOLogId, True$, 0, False$)
|
||||
If Error_Services('NoError') then
|
||||
ArchiveRecordId = 'WO_LOG*' : WOLogId
|
||||
ArchiveRecord = ''
|
||||
WOMatKeys = Wo_Mat_Services('GetWOMatKeys', WOLogId)
|
||||
If Error_Services('NoError') then
|
||||
WOMatQAKeys = WOMatKeys
|
||||
WOStepKey = WOLogRec<WO_LOG_WO_STEP_KEY$>
|
||||
WMInKeys = Wm_In_Services('GetWMInKeys', WOLogId)
|
||||
if Error_Services('NoError') then
|
||||
WMOutKeys = Wm_Out_Services('GetWMOutKeys', WOLogId)
|
||||
if Error_Services('NoError') then
|
||||
RDSKeys = RDS_Services('GetRDSKeys', WOLogId)
|
||||
if Error_Services('NoError') then
|
||||
ReactRunKeys = RDSKeys
|
||||
RDSLayerKeys = ''
|
||||
CleanInspKeys = ''
|
||||
for each ReactRunKey in ReactRunKeys using @VM setting iPos
|
||||
ReactRunRec = Database_Services('ReadDataRow', 'REACT_RUN', ReactRunKey, True$, 0, False$)
|
||||
If Error_Services('NoError') then
|
||||
CleanInspKeys<1, -1> = ReactRunRec<REACT_RUN_CI_NO$>
|
||||
RDSLayerKeys<1, -1> = ReactRunRec<REACT_RUN_RDS_LAYER_KEYS$>
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
Next ReactRunKey
|
||||
RDSTestKeys = ''
|
||||
If ErrorMsg EQ '' then
|
||||
For each RDSLayerKey in RDSLayerKeys using @VM
|
||||
RDSLayerRec = Database_Services('ReadDataRow', 'RDS_LAYER', RDSLayerKey, True$, 0, False$)
|
||||
If Error_Services('NoError') then
|
||||
RDSTestKeys<1, -1> = RDSLayerRec<RDS_LAYER_RDS_TEST_KEYS$>
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
Next RDSLayerKey
|
||||
TWUseKeys = ''
|
||||
end
|
||||
TWUseKeys = ''
|
||||
If ErrorMsg EQ '' then
|
||||
for each RDSTestKey in RDSTestKeys using @VM
|
||||
RDSTestRec = Database_Services('ReadDataRow', 'RDS_TEST', RDSTestKey, True$, 0, False$)
|
||||
If Error_Services('NoError') then
|
||||
TWUseKeys<1,-1> = RDSTestRec<RDS_TEST_TW_USE_ID$>
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
Next RDSTestKey
|
||||
end
|
||||
If ErrorMsg EQ '' then
|
||||
//ArchiveRecord
|
||||
//WOLogId
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = WOLogId
|
||||
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'WO_LOG'
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
|
||||
//WOStepKey
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = WOStepKey
|
||||
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'WO_STEP'
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
|
||||
//WOMatKeys
|
||||
for each WOMatKey in WOMatKeys using @VM
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = WOMatKey
|
||||
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'WO_MAT'
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
|
||||
Next WOMatKey
|
||||
//WOMatQAKeys
|
||||
for each WOMatQAKey in WOMatQAKeys using @VM
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = WOMatQAKey
|
||||
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'WO_MAT_QA'
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
|
||||
Next WOMatQAKey
|
||||
//WMInKeys (EpiPro Specific)
|
||||
for each WMInKey in WMInKeys using @VM
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = WMInKey
|
||||
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'WM_IN'
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
|
||||
Next WMInKey
|
||||
//WMOutKeys (EpiPro Specific)
|
||||
for each WMOutKey in WMOutKeys using @VM
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = WMOutKey
|
||||
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'WM_OUT'
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
|
||||
Next WMOutKey
|
||||
//RDSKeys
|
||||
for each RDSKey in RDSKeys using @VM
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = RDSKey
|
||||
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'RDS'
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
|
||||
Next RDSKey
|
||||
//ReactRunKeys
|
||||
for each ReactRunKey in ReactRunKeys using @VM
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = ReactRunKey
|
||||
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'REACT_RUN'
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
|
||||
Next ReactRunKey
|
||||
//RDSLayerKeys
|
||||
for each RDSLayerKey in RDSLayerKeys using @VM
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = RDSLayerKey
|
||||
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'RDS_LAYER'
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
|
||||
Next RDSLayerKey
|
||||
//CleanInspKeys
|
||||
for each CleanInspKey in CleanInspKeys using @VM
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = CleanInspKey
|
||||
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'CLEAN_INSP'
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
|
||||
Next CleanInspKey
|
||||
//RDSTestKeys
|
||||
for each RDSTestKey in RDSTestKeys using @VM
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = RDSTestKey
|
||||
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'RDS_TEST'
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
|
||||
Next RDSTestKey
|
||||
//TWUseKeys
|
||||
for each TWUseKey in TWUseKeys using @VM
|
||||
if TWUseKey NE '' then
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = TWUseKey
|
||||
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'TW_USE'
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
|
||||
end
|
||||
Next TWUseKey
|
||||
Database_Services('WriteDataRow', 'ARCHIVE', ArchiveRecordId, ArchiveRecord)
|
||||
If Error_Services('HasError') then
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'WO_LOG record not found in WO_LOG table.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'WO_LOG ID was null.'
|
||||
end
|
||||
|
||||
If ErrorMsg NE '' then
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
ChangeLogArchive:
|
||||
StatusMessage = 'Starting Change_Log Archive Script.'
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = StatusMessage
|
||||
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
|
||||
ChangeLogArchiveDate = SRP_Datetime('AddYears', Datetime(), -1)
|
||||
Change_Log_Services('ArchiveChangeLogRecByDate', ChangeLogArchiveDate)
|
||||
If Error_Services('NoError') then
|
||||
StatusMessage = 'Starting Change_Log Archive Script.'
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = StatusMessage
|
||||
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
|
||||
end else
|
||||
StatusMessage = 'Error in Change_Log Archive Script.'
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = StatusMessage
|
||||
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
|
||||
Errors<-1> = True$
|
||||
end
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -231,15 +231,9 @@ RETURN
|
||||
* * * * * * *
|
||||
Read:
|
||||
* * * * * * *
|
||||
|
||||
|
||||
WMOKey = Get_Property(@WINDOW,'ID')
|
||||
IF RowExists('WM_OUT',WMOKey) THEN
|
||||
*IF NOT(Security_Check('Work Order',READ$)) THEN
|
||||
* Send_Event(@WINDOW,'CLEAR')
|
||||
* Security_Err_Msg('Work Order',READ$)
|
||||
* RETURN
|
||||
*END
|
||||
END ELSE
|
||||
IF Not(RowExists('WM_OUT',WMOKey)) THEN
|
||||
ErrMsg('WM_OUT entries may only be created from the Work Order Release process.')
|
||||
Send_Event(@WINDOW,'CLEAR')
|
||||
RETURN
|
||||
@ -382,11 +376,11 @@ return
|
||||
* * * * * * *
|
||||
WONoLF:
|
||||
* * * * * * *
|
||||
|
||||
|
||||
WONo = Get_Property(@WINDOW:'.WO_NO','DEFPROP')
|
||||
|
||||
Convert @Lower_Case to @Upper_Case in WONo
|
||||
Convert 'O' to '' in WONo
|
||||
IF INDEX(WONo,'.',1) > 0 THEN
|
||||
|
||||
CONVERT '.' TO '*' IN WONo
|
||||
Set_Property(@WINDOW:'.WO_NO','DEFPROP','')
|
||||
obj_AppWindow('LoadFormKeys',@WINDOW:@RM:WONo)
|
||||
@ -1768,22 +1762,8 @@ AddMakeup:
|
||||
|
||||
AvailMU_WMOKeys = ''
|
||||
UserResp = Response
|
||||
MakeupBox = ''
|
||||
|
||||
// User requested to convert the current cassette into a makeup box.
|
||||
// Verify the quantity before proceeding.
|
||||
If WMOutKey NE '' then
|
||||
Parms = ''
|
||||
Parms<1> = WMOutKey ; // Cassette to verify wafer count of.
|
||||
Parms<2> = 0 ; // Wafer count adjustment - 0 because converting box.
|
||||
Parms<3> = 'MU' ; // Wafer counter tool location
|
||||
Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms)
|
||||
If Proceed NE True$ then Return
|
||||
end else
|
||||
ErrMsg('Error starting wafer counter check. WM_OUT key is missing.')
|
||||
end
|
||||
|
||||
CheckValue = 1
|
||||
MakeupBox = ''
|
||||
CheckValue = 1
|
||||
|
||||
FieldNo = WO_MAT_EPO_MAKEUP_BOX$
|
||||
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue) ;* Set WMO_MAKEUP flag on WM_OUT
|
||||
@ -2000,51 +1980,42 @@ MakeupClick:
|
||||
End Case
|
||||
|
||||
If Not(InvalidRequest) then
|
||||
Parms = ''
|
||||
Parms<1> = WMOKey ; // Cassette to verify wafer count of.
|
||||
Parms<2> = 0 ; // Wafer count adjustment - 0 because converting box.
|
||||
Parms<3> = 'MU' ; // Wafer counter tool location
|
||||
Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms)
|
||||
If Proceed EQ True$ then
|
||||
Send_Event(CtrlEnt,'GOTFOCUS')
|
||||
OrgMUPart = XLATE('WM_OUT',WMOKey,'MU_PART_NO','X')
|
||||
// Log the makeup flag change
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = WONo:'*':ProcStepNo:'*':CassNo
|
||||
LogData<3> = CheckValue
|
||||
LogData<4> = @User4
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||
|
||||
Send_Event(@WINDOW,'WRITE') ;************* 6/30/2010
|
||||
|
||||
FieldNo = WO_MAT_EPO_MAKEUP_BOX$
|
||||
|
||||
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue)
|
||||
|
||||
IF Get_Status(errCode) THEN ErrMsg(errCode)
|
||||
|
||||
* Added 10/11/2010 JCH
|
||||
NewMUPart = XLATE('WM_OUT',WMOKey,'MU_PART_NO','X')
|
||||
IndexTransactionRow = 'MU_PART_NO':@FM:WMOKey:@FM:OrgMUPart:@FM:NewMUPart:@FM
|
||||
OPEN "!WM_OUT" TO BangTable THEN
|
||||
LOCK BangTable, 0 THEN
|
||||
READ PendingTrans FROM BangTable, 0 ELSE PendingTrans = '0':@FM
|
||||
PendingTrans := IndexTransactionRow
|
||||
WRITE PendingTrans ON BangTable, 0 ELSE
|
||||
ErrMsg('Unable to write index transaction to !WM_OUT. ':WMOutKey)
|
||||
END
|
||||
UNLOCK BangTable, 0 ELSE ErrMsg('Unable to Unlock !WM_OUT while adding index transaction. ':WMOutKey)
|
||||
END ELSE
|
||||
ErrMsg('Unable to Lock !WM_OUT to add index transaction. ':WMOutKey)
|
||||
Send_Event(CtrlEnt,'GOTFOCUS')
|
||||
OrgMUPart = XLATE('WM_OUT',WMOKey,'MU_PART_NO','X')
|
||||
// Log the makeup flag change
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = WONo:'*':ProcStepNo:'*':CassNo
|
||||
LogData<3> = CheckValue
|
||||
LogData<4> = @User4
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||
|
||||
Send_Event(@WINDOW,'WRITE') ;************* 6/30/2010
|
||||
|
||||
FieldNo = WO_MAT_EPO_MAKEUP_BOX$
|
||||
|
||||
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue)
|
||||
|
||||
IF Get_Status(errCode) THEN ErrMsg(errCode)
|
||||
|
||||
* Added 10/11/2010 JCH
|
||||
NewMUPart = XLATE('WM_OUT',WMOKey,'MU_PART_NO','X')
|
||||
IndexTransactionRow = 'MU_PART_NO':@FM:WMOKey:@FM:OrgMUPart:@FM:NewMUPart:@FM
|
||||
OPEN "!WM_OUT" TO BangTable THEN
|
||||
LOCK BangTable, 0 THEN
|
||||
READ PendingTrans FROM BangTable, 0 ELSE PendingTrans = '0':@FM
|
||||
PendingTrans := IndexTransactionRow
|
||||
WRITE PendingTrans ON BangTable, 0 ELSE
|
||||
ErrMsg('Unable to write index transaction to !WM_OUT. ':WMOutKey)
|
||||
END
|
||||
UNLOCK BangTable, 0 ELSE ErrMsg('Unable to Unlock !WM_OUT while adding index transaction. ':WMOutKey)
|
||||
END ELSE
|
||||
ErrMsg('Unable to Open !WM_OUT to add index transaction. ':WMOutKey)
|
||||
ErrMsg('Unable to Lock !WM_OUT to add index transaction. ':WMOutKey)
|
||||
END
|
||||
* End of 10/11/2010 update
|
||||
end else
|
||||
InvalidRequest = True$
|
||||
end
|
||||
END ELSE
|
||||
ErrMsg('Unable to Open !WM_OUT to add index transaction. ':WMOutKey)
|
||||
END
|
||||
* End of 10/11/2010 update
|
||||
end
|
||||
end else
|
||||
InvalidRequest = True$
|
||||
|
@ -646,7 +646,7 @@ MakeUpClick:
|
||||
Set_Property(@WINDOW,'SAVEWARN', False$)
|
||||
Send_Event(@WINDOW,'CLEAR')
|
||||
If (CheckValue EQ True$) then
|
||||
Wo_Mat_Services('MakeupFlagOn', RDSNo)
|
||||
Wo_Mat_Services('MakeupFlagOn', WOMatKey)
|
||||
end
|
||||
end
|
||||
end else
|
||||
@ -815,3 +815,4 @@ BatchFixit:
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
@ -811,18 +811,6 @@ AddMakeup:
|
||||
MakeupBox = ''
|
||||
|
||||
// User requested to convert the current cassette into a makeup box.
|
||||
// Verify the quantity before proceeding.
|
||||
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
|
||||
If RDSNo NE '' then
|
||||
Parms = ''
|
||||
Parms<1> = RDSNo ; // Cassette to verify wafer count of.
|
||||
Parms<2> = 0 ; // Wafer count adjustment - 0 because converting box.
|
||||
Parms<3> = 'MU' ; // Wafer counter tool location
|
||||
Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms)
|
||||
If Proceed NE True$ then return
|
||||
end else
|
||||
ErrMsg('Error starting wafer counter check. RDS No is missing.')
|
||||
end
|
||||
|
||||
RDSNo = Get_Property(@Window : '.RDS_NO', 'TEXT') ; // Get the RDS No now before the WRITE in case it is needed to toggle the index.
|
||||
|
||||
@ -839,7 +827,8 @@ AddMakeup:
|
||||
ErrMsg('Unable to set makeup flag until Unload stage is signed.')
|
||||
Return
|
||||
END else
|
||||
Wo_Mat_Services('MakeupFlagOn', RDSNo)
|
||||
Wo_Mat_Services('MakeupFlagOn', WOMatKey)
|
||||
If Error_Services('HasError') then ErrMsg(Error_Services('GetMessage'))
|
||||
end
|
||||
end
|
||||
|
||||
@ -1066,37 +1055,23 @@ MakeUpLot:
|
||||
End Case
|
||||
|
||||
If Not(InvalidRequest) then
|
||||
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
|
||||
EpiCheck = Rds_Services('IsEpiPro', RDSNo)
|
||||
If RDSNo NE '' then
|
||||
Parms = ''
|
||||
Parms<1> = RDSNo ; // Cassette to verify wafer count of.
|
||||
Parms<2> = 0 ; // Wafer count adjustment - 0 because converting box.
|
||||
Parms<3> = 'MU' ; // Wafer counter tool location
|
||||
Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms)
|
||||
If Proceed EQ True$ then
|
||||
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue)
|
||||
If EpiCheck EQ False$ then
|
||||
IF Get_Status(errCode) THEN
|
||||
ErrMsg('Unable to set makeup flag until Unload stage is signed.')
|
||||
InvalidRequest = True$
|
||||
END else
|
||||
Set_Property(@WINDOW,'SAVEWARN', False$)
|
||||
Send_Event(@WINDOW,'CLEAR')
|
||||
If (CheckValue EQ True$) then
|
||||
Wo_Mat_Services('MakeupFlagOn', RDSNo)
|
||||
end
|
||||
end
|
||||
end else
|
||||
Set_Property(@WINDOW,'SAVEWARN', False$)
|
||||
Send_Event(@WINDOW,'CLEAR')
|
||||
end
|
||||
end else
|
||||
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue)
|
||||
If EpiCheck EQ False$ then
|
||||
IF Get_Status(errCode) THEN
|
||||
ErrMsg('Unable to set makeup flag until Unload stage is signed.')
|
||||
InvalidRequest = True$
|
||||
END else
|
||||
Set_Property(@WINDOW,'SAVEWARN', False$)
|
||||
Send_Event(@WINDOW,'CLEAR')
|
||||
If (CheckValue EQ True$) then
|
||||
Wo_Mat_Services('MakeupFlagOn', WOMatKey)
|
||||
If Error_Services('HasError') then ErrMsg(Error_Services('GetMessage'))
|
||||
end
|
||||
end
|
||||
end else
|
||||
InvalidRequest = True$
|
||||
ErrMsg('WARNING: Error starting wafer counter check. RDS No is missing.')
|
||||
Set_Property(@WINDOW,'SAVEWARN', False$)
|
||||
Send_Event(@WINDOW,'CLEAR')
|
||||
end
|
||||
end
|
||||
end else
|
||||
@ -1233,7 +1208,3 @@ LogRecord:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
37
LSL2/STPROC/COPY_TEST_WAFER_PROD_RECORD_TO_SQL.txt
Normal file
37
LSL2/STPROC/COPY_TEST_WAFER_PROD_RECORD_TO_SQL.txt
Normal 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
|
||||
|
@ -910,6 +910,7 @@ end service
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service WriteDataRow(TableName, KeyID, DataRow, IgnoreSelfLock, IgnoreMFSRoutines, IgnoreAllLocks)
|
||||
|
||||
ErrorMsg = ''
|
||||
If TableName NE '' AND KeyID NE '' then
|
||||
If IgnoreSelfLock NE True$ then IgnoreSelfLock = False$
|
||||
If IgnoreMFSRoutines NE True$ then IgnoreMFSRoutines = False$
|
||||
@ -943,7 +944,13 @@ Service WriteDataRow(TableName, KeyID, DataRow, IgnoreSelfLock, IgnoreMFSRoutine
|
||||
end
|
||||
end
|
||||
If IgnoreAllLocks EQ False$ then
|
||||
If Error_Services('HasError') then
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
Database_Services('ReleaseKeyIDLock', TableName, KeyID)
|
||||
If ErrorMsg NE '' then
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Unable to lock ' : KeyID : ' for the ' : TableName : ' table in the ' : Service : ' service.')
|
||||
@ -1102,3 +1109,4 @@ end service
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
@ -220,10 +220,17 @@ Service GetWeekNum(InputDate)
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service ConvertDateTimeToISO8601(DatetimeToConv)
|
||||
|
||||
Response = OConv(DatetimeToConv, "[SRP_DATETIME,()YYYY-MM-DD'T'hh:mm:ss.000Z]")
|
||||
|
||||
Response = OConv(DatetimeToConv, "[SRP_DATETIME,()YYYY-MM-DD hh:mm:ss.000Z]")
|
||||
swap ' ' with 'T' in Response
|
||||
end service
|
||||
|
||||
|
||||
Service ConvertISO8601ToDateTime(ISO8601Dtm)
|
||||
|
||||
Response = IConv(ISO8601Dtm, "[SRP_DATETIME,()YYYY-MM-DD'T'hh:mm:ss.000Z]")
|
||||
|
||||
end service
|
||||
|
||||
@ -233,3 +240,4 @@ end service
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
|
30
LSL2/STPROC/DELETE_TEST_WAFER_PROD_RECORD_FROM_SQL.txt
Normal file
30
LSL2/STPROC/DELETE_TEST_WAFER_PROD_RECORD_FROM_SQL.txt
Normal 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
|
||||
|
109
LSL2/STPROC/DIALOG_RESPONSE_LOG_SERVICES.txt
Normal file
109
LSL2/STPROC/DIALOG_RESPONSE_LOG_SERVICES.txt
Normal 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
|
@ -80,6 +80,7 @@ Service GetServer()
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service IsProd()
|
||||
|
||||
Machine = Environment_Services('GetServer')
|
||||
@ -279,6 +280,27 @@ Service GetMetrologyProductionPath()
|
||||
end service
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// GetOIWizardBaseUrl
|
||||
//
|
||||
// Returns the OIWizardBaseUrl.
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service GetOIWizardBaseUrl()
|
||||
|
||||
Machine = Environment_Services('GetServer')
|
||||
Begin Case
|
||||
Case ( (Machine _EQC 'MESTSA01EC') or (Machine _EQC 'MESTST1009') or (Machine _EQC 'MESTST1010') )
|
||||
Response = 'https://mestsa008.infineon.com:50186/'
|
||||
// Uncomment this case and add your hostname if testing locally.
|
||||
//Case ( (Machine EQ 'ISCN5CG2430JV1') or (Machine _EQC 'MESTSA09EC') )
|
||||
// Response = 'http://localhost:12009/'
|
||||
Case Otherwise$
|
||||
Response = 'https://messa014.infineon.com:50184/'
|
||||
End Case
|
||||
|
||||
end service
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// GetControlPlanProductionPath
|
||||
//
|
||||
|
@ -111,7 +111,6 @@ API Lock.HEAD
|
||||
|
||||
|
||||
API Lock.POST
|
||||
|
||||
OIWizardID = ''
|
||||
Cookies = HTTP_Services('GetHTTPCookie')
|
||||
For each Cookie in Cookies using ';'
|
||||
|
@ -1618,3 +1618,4 @@ end service
|
||||
// Internal GoSubs
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
@ -219,6 +219,28 @@ Service GetOnShiftUsers()
|
||||
|
||||
end service
|
||||
|
||||
Service GetCurrentShiftStartDtm()
|
||||
|
||||
CurrDate = SRP_Datetime('Date', Datetime())
|
||||
ShiftTime = SRP_DateTime('Time', CurrDtm)
|
||||
ShiftStartDtm = ''
|
||||
|
||||
Begin Case
|
||||
Case ShiftTime GE 21600 AND ShiftTime LT 64800
|
||||
//Day Shift - Same day @ 6AM
|
||||
ShiftStartDtm = SRP_Datetime('AddHours', CurrDate, 6)
|
||||
Case ShiftTime LT 21600
|
||||
//Morning part of night shift - Prior day at 6PM
|
||||
ShiftStartDtm = SRP_Datetime('AddHours', CurrDate - 1, 18)
|
||||
Case ShiftTime GT 64800
|
||||
//Evening Part of Night shift - Same day at 6PM
|
||||
ShiftStartDtm = SRP_Datetime('AddHours', CurrDate, 18)
|
||||
End Case
|
||||
|
||||
Response = ShiftStartDtm
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service GetShiftByDate(Date, GenerateFlag)
|
||||
OnShift = ''; *Return Value
|
||||
@ -549,3 +571,4 @@ Service UpdateSecurityGroups()
|
||||
end service
|
||||
|
||||
|
||||
|
||||
|
@ -254,6 +254,7 @@ Service GetStratus(Handle)
|
||||
Result<10> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Batch'); // BatchID
|
||||
Result<11> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Cassette'); // Cassette
|
||||
Result<12> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].GradeMean'); // ThickAvg
|
||||
Result<13> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].IndexOf');
|
||||
END
|
||||
ForOffset = (RecordIndex - 1) * FieldPositionIncrement;
|
||||
Result<FieldPosition + ForOffset> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Slot'); // Position
|
||||
@ -283,6 +284,7 @@ Service GetBioRad(Handle)
|
||||
Result<8> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Layer'); // RunDataLayer
|
||||
Result<9> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Zone'); // RunDataZone
|
||||
Result<11> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Wafer'); // DataSlotId
|
||||
Result<13> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].IndexOf');
|
||||
END
|
||||
ForOffset = (RecordIndex - 1) * FieldPositionIncrement;
|
||||
Result<FieldPosition + ForOffset> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Position'); // Position
|
||||
@ -310,6 +312,7 @@ Service GetCDE(Handle)
|
||||
Result<8> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].PSN'); // PSN
|
||||
Result<9> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Layer'); // RunDataLayer
|
||||
Result<10> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Zone'); // RunDataZo
|
||||
Result<13> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].IndexOf');
|
||||
END
|
||||
ForOffset = (RecordIndex - 1) * FieldPositionIncrement;
|
||||
Result<FieldPosition + ForOffset> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].InferredPoint'); // Position
|
||||
@ -338,6 +341,7 @@ Service GetHgCV(Handle)
|
||||
Result<5> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].PSN'); // PSN
|
||||
Result<8> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Wafer'); // LayerZonePair
|
||||
Result<11> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Date'); // Timestamp
|
||||
Result<13> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].IndexOf');
|
||||
END
|
||||
ForOffset = (RecordIndex - 1) * FieldPositionIncrement;
|
||||
Result<FieldPosition + ForOffset> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Site'); // Position
|
||||
@ -359,6 +363,7 @@ Service GetTencor(Handle)
|
||||
IF RecordIndex EQ 1 THEN
|
||||
Result<9> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Date'); // Timestamp
|
||||
Result<10> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].HazeAverageAvg'); // HazeAvg
|
||||
Result<13> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].IndexOf');
|
||||
Result<28> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].RDS'); // RDSKeyID
|
||||
Result<30> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].WaferRecipe'); // ScanRecipe
|
||||
Result<39> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].SumOfDefectsAvg'); // SoDAvg
|
||||
@ -381,6 +386,7 @@ Service GetSP1(Handle)
|
||||
IF RecordIndex EQ 1 THEN
|
||||
Result<9> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Date'); // Timestamp
|
||||
Result<10> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].DcnHazeAvgMean'); // HazeAvg
|
||||
Result<13> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].IndexOf');
|
||||
Result<28> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].RDS'); // RDSKeyID
|
||||
Result<30> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Session'); // ScanRecipe
|
||||
Result<3> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].DcnLpdMean'); // SoDAvg
|
||||
|
@ -1,187 +1,410 @@
|
||||
Compile function NDW_LOAD_UNLOAD_EXTRA_EVENTS(CtrlEntId, Event, @PARAMS)
|
||||
#pragma precomp SRP_PreCompiler
|
||||
#window NDW_LOAD_UNLOAD_EXTRA
|
||||
|
||||
Declare subroutine End_Dialog, Post_Event, Database_Services, Error_Services, Msg
|
||||
Declare subroutine Set_Property, Rds_Services
|
||||
Declare function Database_Services, Error_Services
|
||||
Declare function Get_Property
|
||||
|
||||
$Insert EVENT_SETUP
|
||||
$Insert LOGICAL
|
||||
$Insert RDS_EQUATES
|
||||
|
||||
GoToEvent Event for CtrlEntId else
|
||||
// Event not implemented
|
||||
end
|
||||
|
||||
Return EventFlow or 1
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// EVENT HANDLERS
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Event WINDOW.CREATE(CreateParam)
|
||||
ResponseValue = Set_Property(@Window, '@responsevalue', 0)
|
||||
RDSNo = CreateParam
|
||||
If RowExists('RDS', RDSNo) then
|
||||
Set_Property(@Window : '.EDL_RDS', 'TEXT', RDSNo)
|
||||
GoSub Refresh
|
||||
end else
|
||||
ResponseValue = Set_Property(@Window, '@responsevalue', 0)
|
||||
Post_Event(@Window, 'CLOSE')
|
||||
end
|
||||
|
||||
End Event
|
||||
|
||||
Event WINDOW.CLOSE(CancelFlag)
|
||||
ResponseValue = Get_Property(@Window, '@responsevalue')
|
||||
End_Dialog(@Window, ResponseValue)
|
||||
end event
|
||||
|
||||
//Signature buttons
|
||||
|
||||
Event PUB_SIGN_UNLOAD_EX_1.CLICK()
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
Rds_Services('SignUnloadExtra1', RDSNo, @USER4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Unload Extra 1 Signed!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
GoSub Refresh
|
||||
end event
|
||||
|
||||
Event PUB_SIGN_LOAD_EX_1.CLICK()
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
Rds_Services('SignLoadExtra1', RDSNo, @USER4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Load Extra 1 Signed!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
GoSub Refresh
|
||||
end event
|
||||
|
||||
Event PUB_SIGN_UNLOAD_EX_2.CLICK()
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
Rds_Services('SignUnloadExtra2', RDSNo, @USER4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Unload Extra 2 Signed!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
GoSub Refresh
|
||||
end event
|
||||
|
||||
Event PUB_SIGN_LOAD_EX_2.CLICK()
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
Rds_Services('SignLoadExtra2', RDSNo, @USER4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Load Extra 2 Signed!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
GoSub Refresh
|
||||
end event
|
||||
|
||||
//Clear Signature Buttons
|
||||
|
||||
Event PUB_CLEAR_UNLOAD_EX_1.CLICK()
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
Rds_Services('UnsignUnloadExtra1', RDSNo, @User4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Unload Extra 1 unsigned!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
GoSub Refresh
|
||||
end event
|
||||
|
||||
Event PUB_CLEAR_LOAD_EX_1.CLICK()
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
Rds_Services('UnsignLoadExtra1', RDSNo, @User4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Load Extra 1 unsigned!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
GoSub Refresh
|
||||
end event
|
||||
|
||||
Event PUB_CLEAR_UNLOAD_EX_2.CLICK()
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
Rds_Services('UnsignUnloadExtra2', RDSNo, @User4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Unload Extra 2 unsigned!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
GoSub Refresh
|
||||
end event
|
||||
|
||||
Event PUB_CLEAR_LOAD_EX_2.CLICK()
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
Rds_Services('UnsignLoadExtra2', RDSNo, @User4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Load Extra 2 unsigned!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
GoSub Refresh
|
||||
end event
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// INTERNAL GO-SUBS
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
***************
|
||||
Refresh:
|
||||
***************
|
||||
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
If RowExists('RDS', RDSNo) then
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||
//Unload Extra 1
|
||||
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
|
||||
UnloadExtra1UserFirstLast = xlate( 'LSL_USERS', UnloadExtra1Signature, 'FIRST_LAST', 'X' )
|
||||
UnloadExtra1Date = OConv(RDSRec<RDS_OP_OUT_EX1_DATE$>, 'D')
|
||||
UnloadExtra1Time = Oconv(RDSRec<RDS_OP_OUT_EX1_TIME$>, 'MT')
|
||||
//Load Extra 1
|
||||
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
|
||||
LoadExtra1UserFirstLast = xlate( 'LSL_USERS', LoadExtra1Signature, 'FIRST_LAST', 'X' )
|
||||
LoadExtra1Date = Oconv(RDSRec<RDS_OP_IN_EX2_DATE$>, 'D')
|
||||
LoadExtra1Time = Oconv(RDSRec<RDS_OP_IN_EX2_TIME$>, 'MT')
|
||||
//Unload Extra 2
|
||||
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
|
||||
UnloadExtra2UserFirstLast = xlate( 'LSL_USERS', UnloadExtra2Signature, 'FIRST_LAST', 'X' )
|
||||
UnloadExtra2Date = Oconv(RDSRec<RDS_OP_OUT_EX2_DATE$>, 'D')
|
||||
UnloadExtra2Time = Oconv(RDSRec<RDS_OP_OUT_EX2_TIME$>, 'MT')
|
||||
//Load Extra 2
|
||||
LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$>
|
||||
LoadExtra2UserFirstLast = xlate( 'LSL_USERS', LoadExtra2Signature, 'FIRST_LAST', 'X' )
|
||||
LoadExtra2Date = Oconv(RDSRec<RDS_OP_IN_EX3_DATE$>, 'D')
|
||||
LoadExtra2Time = Oconv(RDSRec<RDS_OP_IN_EX3_TIME$>, 'MT')
|
||||
|
||||
//Populate text fields
|
||||
Set_Property(@Window : '.EDL_UNLOAD_EX_1_USER', 'TEXT', UnloadExtra1UserFirstLast)
|
||||
Set_Property(@Window : '.EDL_UNLOAD_EX_1_DATE', 'TEXT', UnloadExtra1Date)
|
||||
Set_Property(@Window : '.EDL_UNLOAD_EX_1_TIME', 'TEXT', UnloadExtra1Time)
|
||||
Set_Property(@Window : '.EDL_LOAD_EX_1_USER', 'TEXT', LoadExtra1UserFirstLast)
|
||||
Set_Property(@Window : '.EDL_LOAD_EX_1_DATE', 'TEXT', LoadExtra1Date)
|
||||
Set_Property(@Window : '.EDL_LOAD_EX_1_TIME', 'TEXT', LoadExtra1Time)
|
||||
Set_Property(@Window : '.EDL_UNLOAD_EX_2_USER', 'TEXT', UnloadExtra2UserFirstLast)
|
||||
Set_Property(@Window : '.EDL_UNLOAD_EX_2_DATE', 'TEXT', UnloadExtra2Date)
|
||||
Set_Property(@Window : '.EDL_UNLOAD_EX_2_TIME', 'TEXT', UnloadExtra2Time)
|
||||
Set_Property(@Window : '.EDL_LOAD_EX_2_USER', 'TEXT', LoadExtra2UserFirstLast)
|
||||
Set_Property(@Window : '.EDL_LOAD_EX_2_DATE', 'TEXT', LoadExtra2Date)
|
||||
Set_Property(@Window : '.EDL_LOAD_EX_2_TIME', 'TEXT', LoadExtra2Time)
|
||||
end else
|
||||
ResponseValue = Set_Property(@Window, '@responsevalue', 0)
|
||||
Post_Event(@Window, 'CLOSE')
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
|
||||
Compile function NDW_LOAD_UNLOAD_EXTRA_EVENTS(CtrlEntId, Event, @PARAMS)
|
||||
#pragma precomp SRP_PreCompiler
|
||||
#window NDW_LOAD_UNLOAD_EXTRA
|
||||
|
||||
Declare subroutine End_Dialog, Post_Event, Database_Services, Error_Services, Msg
|
||||
Declare subroutine Set_Property, Rds_Services, Set_Status, Rlist, Obj_Post_Log
|
||||
Declare function Database_Services, Error_Services, Qa_Services, Reactor_Services
|
||||
Declare function Get_Property, Dialog_Box
|
||||
$Insert EVENT_SETUP
|
||||
$Insert LOGICAL
|
||||
$Insert RDS_EQUATES
|
||||
$Insert REACT_LL_EQUATES
|
||||
$Insert REACTOR_EQUATES
|
||||
$Insert MSG_EQUATES
|
||||
|
||||
GoToEvent Event for CtrlEntId else
|
||||
// Event not implemented
|
||||
end
|
||||
|
||||
Return EventFlow or 1
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// EVENT HANDLERS
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Event WINDOW.CREATE(CreateParam)
|
||||
ResponseValue = Set_Property(@Window, '@responsevalue', 0)
|
||||
RDSNo = CreateParam
|
||||
If RowExists('RDS', RDSNo) then
|
||||
Set_Property(@Window : '.EDL_RDS', 'TEXT', RDSNo)
|
||||
GoSub Refresh
|
||||
end else
|
||||
ResponseValue = Set_Property(@Window, '@responsevalue', 0)
|
||||
Post_Event(@Window, 'CLOSE')
|
||||
end
|
||||
|
||||
End Event
|
||||
|
||||
Event WINDOW.CLOSE(CancelFlag)
|
||||
ResponseValue = Get_Property(@Window, '@responsevalue')
|
||||
End_Dialog(@Window, ResponseValue)
|
||||
end event
|
||||
|
||||
//Signature buttons
|
||||
|
||||
Event PUB_SIGN_UNLOAD_EX_1.CLICK()
|
||||
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
initParams = ''
|
||||
initParams<4> = 'Sign Unload Extra 1'
|
||||
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, initParams)
|
||||
Valid = Response<1>
|
||||
|
||||
If Valid then
|
||||
Rds_Services('SignUnloadExtra1', RDSNo, @USER4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Unload Extra 1 Signed!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
end
|
||||
GoSub Refresh
|
||||
end event
|
||||
|
||||
Event PUB_SIGN_LOAD_EX_1.CLICK()
|
||||
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||
OldReactorNo = RDSRec<RDS_REACTOR$>
|
||||
NewReactorNo = Get_Property(@Window : '.EDL_REACTOR1', 'TEXT')
|
||||
initParams = ''
|
||||
initParams<4> = 'Sign Load Extra 1'
|
||||
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, initParams)
|
||||
Valid = Response<1>
|
||||
|
||||
If Valid then
|
||||
If Qa_Services('LoadExtra1stReady', RDSNo) AND (OldReactorNo NE NewReactorNo) then
|
||||
Gosub ReactorChange
|
||||
end
|
||||
|
||||
If Error_Services('NoError') then
|
||||
Rds_Services('SignLoadExtra1', RDSNo, @USER4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Load Extra 1 Signed!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
End else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
end
|
||||
GoSub Refresh
|
||||
|
||||
end event
|
||||
|
||||
Event PUB_SIGN_UNLOAD_EX_2.CLICK()
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
initParams = ''
|
||||
initParams<4> = 'Sign Unload Extra 2'
|
||||
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, initParams)
|
||||
Valid = Response<1>
|
||||
|
||||
If Valid then
|
||||
Rds_Services('SignUnloadExtra2', RDSNo, @USER4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Unload Extra 2 Signed!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
end
|
||||
GoSub Refresh
|
||||
end event
|
||||
|
||||
Event PUB_SIGN_LOAD_EX_2.CLICK()
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||
OldReactorNo = RDSRec<RDS_REACTOR$>
|
||||
NewReactorNo = Get_Property(@Window : '.EDL_REACTOR2', 'TEXT')
|
||||
initParams = ''
|
||||
initParams<4> = 'Sign Load Extra 2'
|
||||
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, initParams)
|
||||
Valid = Response<1>
|
||||
|
||||
If Valid then
|
||||
If Qa_Services('LoadExtra2ndReady', RDSNo) AND (OldReactorNo NE NewReactorNo) then
|
||||
Gosub ReactorChange
|
||||
end
|
||||
|
||||
If Error_Services('NoError') then
|
||||
Rds_Services('SignLoadExtra2', RDSNo, @USER4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Load Extra 2 Signed!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
End else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
end
|
||||
|
||||
GoSub Refresh
|
||||
|
||||
end event
|
||||
|
||||
//Clear Signature Buttons
|
||||
|
||||
Event PUB_CLEAR_UNLOAD_EX_1.CLICK()
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
Rds_Services('UnsignUnloadExtra1', RDSNo, @User4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Unload Extra 1 unsigned!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
GoSub Refresh
|
||||
end event
|
||||
|
||||
Event PUB_CLEAR_LOAD_EX_1.CLICK()
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
Rds_Services('UnsignLoadExtra1', RDSNo, @User4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Load Extra 1 unsigned!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
GoSub Refresh
|
||||
end event
|
||||
|
||||
Event PUB_CLEAR_UNLOAD_EX_2.CLICK()
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
Rds_Services('UnsignUnloadExtra2', RDSNo, @User4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Unload Extra 2 unsigned!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
GoSub Refresh
|
||||
end event
|
||||
|
||||
Event PUB_CLEAR_LOAD_EX_2.CLICK()
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
Rds_Services('UnsignLoadExtra2', RDSNo, @User4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Load Extra 2 unsigned!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
GoSub Refresh
|
||||
end event
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// INTERNAL GO-SUBS
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
***************
|
||||
Refresh:
|
||||
***************
|
||||
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
If RowExists('RDS', RDSNo) then
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||
if Error_Services('NoError') then
|
||||
UnloadSigned = RDSRec<RDS_OPERATOR_OUT$>
|
||||
ReactorNo = RDSRec<RDS_REACTOR$>
|
||||
//Unload Extra 1
|
||||
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
|
||||
UnloadExtra1UserFirstLast = xlate( 'LSL_USERS', UnloadExtra1Signature, 'FIRST_LAST', 'X' )
|
||||
UnloadExtra1Date = OConv(RDSRec<RDS_OP_OUT_EX1_DATE$>, 'D')
|
||||
UnloadExtra1Time = Oconv(RDSRec<RDS_OP_OUT_EX1_TIME$>, 'MT')
|
||||
//Load Extra 1
|
||||
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
|
||||
LoadExtra1UserFirstLast = xlate( 'LSL_USERS', LoadExtra1Signature, 'FIRST_LAST', 'X' )
|
||||
LoadExtra1Date = Oconv(RDSRec<RDS_OP_IN_EX2_DATE$>, 'D')
|
||||
LoadExtra1Time = Oconv(RDSRec<RDS_OP_IN_EX2_TIME$>, 'MT')
|
||||
LoadExtra1Reactor = RDSRec<RDS_LOAD_EXTRA_1_REACTOR$>
|
||||
//Unload Extra 2
|
||||
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
|
||||
UnloadExtra2UserFirstLast = xlate( 'LSL_USERS', UnloadExtra2Signature, 'FIRST_LAST', 'X' )
|
||||
UnloadExtra2Date = Oconv(RDSRec<RDS_OP_OUT_EX2_DATE$>, 'D')
|
||||
UnloadExtra2Time = Oconv(RDSRec<RDS_OP_OUT_EX2_TIME$>, 'MT')
|
||||
//Load Extra 2
|
||||
LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$>
|
||||
LoadExtra2UserFirstLast = xlate( 'LSL_USERS', LoadExtra2Signature, 'FIRST_LAST', 'X' )
|
||||
LoadExtra2Date = Oconv(RDSRec<RDS_OP_IN_EX3_DATE$>, 'D')
|
||||
LoadExtra2Time = Oconv(RDSRec<RDS_OP_IN_EX3_TIME$>, 'MT')
|
||||
LoadExtra2Reactor = RDSRec<RDS_LOAD_EXTRA_2_REACTOR$>
|
||||
|
||||
//Populate text fields
|
||||
Set_Property(@Window : '.EDL_UNLOAD_EX_1_USER', 'TEXT', UnloadExtra1UserFirstLast)
|
||||
Set_Property(@Window : '.EDL_UNLOAD_EX_1_DATE', 'TEXT', UnloadExtra1Date)
|
||||
Set_Property(@Window : '.EDL_UNLOAD_EX_1_TIME', 'TEXT', UnloadExtra1Time)
|
||||
Set_Property(@Window : '.EDL_LOAD_EX_1_USER', 'TEXT', LoadExtra1UserFirstLast)
|
||||
Set_Property(@Window : '.EDL_LOAD_EX_1_DATE', 'TEXT', LoadExtra1Date)
|
||||
Set_Property(@Window : '.EDL_LOAD_EX_1_TIME', 'TEXT', LoadExtra1Time)
|
||||
Set_Property(@Window : '.EDL_UNLOAD_EX_2_USER', 'TEXT', UnloadExtra2UserFirstLast)
|
||||
Set_Property(@Window : '.EDL_UNLOAD_EX_2_DATE', 'TEXT', UnloadExtra2Date)
|
||||
Set_Property(@Window : '.EDL_UNLOAD_EX_2_TIME', 'TEXT', UnloadExtra2Time)
|
||||
Set_Property(@Window : '.EDL_LOAD_EX_2_USER', 'TEXT', LoadExtra2UserFirstLast)
|
||||
Set_Property(@Window : '.EDL_LOAD_EX_2_DATE', 'TEXT', LoadExtra2Date)
|
||||
Set_Property(@Window : '.EDL_LOAD_EX_2_TIME', 'TEXT', LoadExtra2Time)
|
||||
If LoadExtra1Reactor NE '' then
|
||||
Set_Property(@Window : '.EDL_REACTOR1', 'TEXT', LoadExtra1Reactor)
|
||||
end else
|
||||
Set_Property(@Window : '.EDL_REACTOR1', 'TEXT', ReactorNo)
|
||||
end
|
||||
If LoadExtra2Reactor NE '' then
|
||||
Set_Property(@Window : '.EDL_REACTOR2', 'TEXT', LoadExtra2Reactor)
|
||||
end else
|
||||
Set_Property(@Window : '.EDL_REACTOR2', 'TEXT', ReactorNo)
|
||||
end
|
||||
If UnloadSigned EQ '' then
|
||||
Set_Property(@Window : '.EDL_REACTOR1', 'ENABLED', True$)
|
||||
Set_Property(@Window : '.EDL_REACTOR2', 'ENABLED', True$)
|
||||
end else
|
||||
Set_Property(@Window : '.EDL_REACTOR1', 'ENABLED', False$)
|
||||
Set_Property(@Window : '.EDL_REACTOR2', 'ENABLED', False$)
|
||||
end
|
||||
If UnloadExtra1Signature NE '' then
|
||||
Set_Property(@Window : '.PUB_SIGN_UNLOAD_EX_1', 'ENABLED', False$)
|
||||
Set_Property(@Window : '.PUB_CLEAR_UNLOAD_EX_1', 'ENABLED', True$)
|
||||
end else
|
||||
Set_Property(@Window : '.PUB_SIGN_UNLOAD_EX_1', 'ENABLED', True$)
|
||||
Set_Property(@Window : '.PUB_CLEAR_UNLOAD_EX_1', 'ENABLED', False$)
|
||||
end
|
||||
If UnloadExtra2Signature NE '' then
|
||||
Set_Property(@Window : '.PUB_SIGN_UNLOAD_EX_2', 'ENABLED', False$)
|
||||
Set_Property(@Window : '.PUB_CLEAR_UNLOAD_EX_2', 'ENABLED', True$)
|
||||
end else
|
||||
Set_Property(@Window : '.PUB_SIGN_UNLOAD_EX_2', 'ENABLED', True$)
|
||||
Set_Property(@Window : '.PUB_CLEAR_UNLOAD_EX_2', 'ENABLED', False$)
|
||||
end
|
||||
If LoadExtra1Signature NE '' then
|
||||
Set_Property(@Window : '.PUB_SIGN_LOAD_EX_1', 'ENABLED', False$)
|
||||
Set_Property(@Window : '.PUB_CLEAR_LOAD_EX_1', 'ENABLED', True$)
|
||||
end else
|
||||
Set_Property(@Window : '.PUB_SIGN_LOAD_EX_1', 'ENABLED', True$)
|
||||
Set_Property(@Window : '.PUB_CLEAR_LOAD_EX_1', 'ENABLED', False$)
|
||||
end
|
||||
If LoadExtra2Signature NE '' then
|
||||
Set_Property(@Window : '.PUB_SIGN_LOAD_EX_2', 'ENABLED', False$)
|
||||
Set_Property(@Window : '.PUB_CLEAR_LOAD_EX_2', 'ENABLED', True$)
|
||||
end else
|
||||
Set_Property(@Window : '.PUB_SIGN_LOAD_EX_2', 'ENABLED', True$)
|
||||
Set_Property(@Window : '.PUB_CLEAR_LOAD_EX_2', 'ENABLED', False$)
|
||||
end
|
||||
end else
|
||||
Msg(@Window, 'Error reading RDS record from database.')
|
||||
end
|
||||
|
||||
end else
|
||||
ResponseValue = Set_Property(@Window, '@responsevalue', 0)
|
||||
Post_Event(@Window, 'CLOSE')
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
ReactorChange:
|
||||
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||
if Error_Services('NoError') then
|
||||
WONo = RDSRec<RDS_WO$>
|
||||
ReactorNo = ''
|
||||
LLChosen = ''
|
||||
ChangePermitted = False$
|
||||
Begin Case
|
||||
|
||||
Case Control EQ 'PUB_SIGN_LOAD_EX_1'
|
||||
ReactorNo = Get_Property(@Window : '.EDL_REACTOR1', 'TEXT')
|
||||
ReactorField = RDS_LOAD_EXTRA_1_REACTOR$
|
||||
Case Control EQ 'PUB_SIGN_LOAD_EX_2'
|
||||
ReactorNo = Get_Property(@Window : '.EDL_REACTOR2', 'TEXT')
|
||||
ReactorField = RDS_LOAD_EXTRA_2_REACTOR$
|
||||
Case Otherwise$
|
||||
|
||||
End Case
|
||||
|
||||
If ReactorNo NE '' then
|
||||
PickPlace = Xlate('REACTOR', ReactorNo, 'PICK_PLACE', 'X')
|
||||
If (Reactor_Services('GetReactorAvailChamberCount', ReactorNo) NE 0) OR (PickPlace EQ False$) then
|
||||
Query = 'SELECT REACT_STATE WITH SCHED_WO CONTAINING ':WONo
|
||||
GoSub ClearCursors
|
||||
Set_Status(0)
|
||||
RList(Query, TARGET_ACTIVELIST$, '', '' '')
|
||||
SchedReactors = ''
|
||||
EOF = False$
|
||||
Loop
|
||||
ReadNext SchedReactor else EOF = True$
|
||||
Until EOF
|
||||
SchedReactors<0, -1> = SchedReactor
|
||||
Repeat
|
||||
|
||||
Locate ReactorNo in SchedReactors using @VM setting vPos then
|
||||
If PickPlace EQ True$ then
|
||||
LLDisabled = XLATE('REACTOR', ReactorNo, 'ACTIVE_LL_DISABLED', 'X')
|
||||
IF LLDisabled NE '' then
|
||||
ReactLLRec = Database_Services('ReadDataRow', 'REACT_LL', LLDisabled)
|
||||
SideDisabled = ReactLLRec<REACT_LL_DISABLED$>
|
||||
QualMode = ReactLLRec<REACT_LL_QUAL_MODE$>
|
||||
Begin Case
|
||||
Case SideDisabled EQ 'L'
|
||||
LLChosen = 'R'
|
||||
Case SideDisabled EQ 'R'
|
||||
LLChosen = 'L'
|
||||
End Case
|
||||
end else
|
||||
Def = ''
|
||||
Def<MCAPTION$> = 'Select Load Lock'
|
||||
Def<MTYPE$> = 'BLeft,Right'
|
||||
Def<MTEXT$> = 'Please select a load lock.'
|
||||
Def<MMODAL$> = 'A'
|
||||
LLResponse = Msg(@Window, Def)
|
||||
Begin Case
|
||||
Case LLResponse EQ 1
|
||||
LLChosen = 'L'
|
||||
Case LLResponse EQ 2
|
||||
LLChosen = 'R'
|
||||
End Case
|
||||
end
|
||||
If LLChosen NE '' then
|
||||
ChangePermitted = True$
|
||||
end else
|
||||
Error_Services('Add', 'You must select a load lock for this lot.')
|
||||
end
|
||||
end else
|
||||
ChangePermitted = True$
|
||||
end
|
||||
end else
|
||||
Swap @VM with ',' in SchedReactors
|
||||
Error_Services('Add', 'Assigned reactor, ':ReactorNo:', does not equal any scheduled reactor(s), ':SchedReactors:'.')
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', ReactorNo: 'does not have the capacity necessary for this lot.')
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Invalid Reactor number.')
|
||||
end
|
||||
If ChangePermitted then
|
||||
RDSRec<RDS_REACTOR$> = ReactorNo
|
||||
RDSRec<ReactorField> = ReactorNo
|
||||
RDSRec<RDS_LOAD_LOCK_SIDE$> = LLChosen
|
||||
Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, False$)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Reactor successfully changed!')
|
||||
end else
|
||||
Msg(@Window, 'Error changing reactor!')
|
||||
end
|
||||
end
|
||||
end else
|
||||
Msg(@Window, 'Error reading RDS from database!')
|
||||
end
|
||||
|
||||
|
||||
return
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
ClearCursors:
|
||||
For counter = 0 to 8
|
||||
ClearSelect counter
|
||||
Next counter
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -50,7 +50,7 @@ Equ HEIGHT$ to 4
|
||||
|
||||
Declare function GetCommandLine, MemberOf, obj_Install, obj_Notes_Sent, FindWindow, ShowWindow, Next_Key
|
||||
Declare function Environment_Services, Reactor_Services, Database_Services, obj_Tool, Messaging_Services, SRP_JSON
|
||||
Declare function Notes_Services, RTI_Xlate_Controller
|
||||
Declare function Notes_Services, RTI_Xlate_Controller, Test_Run_Services, LSL_Users_Services, Datetime
|
||||
Declare subroutine Set_Env, obj_Appwindow, Get_BMP_Info, obj_Login, obj_Calib_List, End_Window, Start_Window, Next_Key
|
||||
Declare subroutine Database_Services, obj_React_Status, Obj_React_Mode, obj_Tool_Log, RList, Messaging_Services, RTP27
|
||||
Declare subroutine Notes_Services, Obj_Note_Ptrs, Comm_Note_Ptrs, SRP_Run_Command, PlaceDialog, GetEngineVersion
|
||||
@ -404,6 +404,16 @@ Event WINDOW.TIMER()
|
||||
|
||||
Gosub SetSnoozeButtonState
|
||||
|
||||
CurrDtm = Datetime()
|
||||
CurrShiftStartDtm = LSL_USERS_SERVICES('GetCurrentShiftStartDtm', CurrDtm)
|
||||
|
||||
TWStats = Test_Run_Services('GetTestWaferUsageStats', @USER4, CurrShiftStartDtm, Datetime())
|
||||
LastUsed = TWStats<1>
|
||||
LastUsed = Oconv(LastUsed, 'DT2/^H')
|
||||
QtyUsed = TWStats<2>
|
||||
Set_Property(@Window: '.LBL_LAST_TW_USED', 'TEXT', 'TW Last Used by User: ' :LastUsed)
|
||||
Set_Property(@Window: '.LBL_TW_USED', 'TEXT', 'TW Used by User: ' :QtyUsed)
|
||||
|
||||
Set_Property(@WINDOW:'.CURRENT_TIME','TEXT','Current Time: ':OCONV( TIME(), 'MTHS' ))
|
||||
Set_Property(@WINDOW:'.CURRENT_DATE','TEXT','Date: ':OCONV( DATE(), 'D2/' ))
|
||||
If Get_Property(@Window, '@CLOSE') then
|
||||
@ -853,3 +863,5 @@ return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -50,6 +50,7 @@ Compile function NDW_MATERIAL_TRACK_PRO_REPORT_EVENTS(CtrlEntId, Event, @PARAMS)
|
||||
|
||||
Declare function Form_Services, Database_Services, RTI_Task_Submit, RTI_Task_Status, MemberOf
|
||||
Declare subroutine SRP_Show_Window, Send_Message, Set_Property, Database_Services, Material_Track, Report_Services
|
||||
Declare subroutine PlaceDialog
|
||||
|
||||
$Insert EVENT_SETUP
|
||||
$Insert LOGICAL
|
||||
@ -97,8 +98,7 @@ Event WINDOW.CREATE(CreateParam)
|
||||
GoSub Setup_OLE_Controls
|
||||
GoSub EnableGenerateReportButton
|
||||
|
||||
FormSize = ''
|
||||
SRP_Show_Window(@Window, '', 'C', 'C', 1, '', False$, False$, FormSize)
|
||||
PlaceDialog(-2, -2)
|
||||
|
||||
End Event
|
||||
|
||||
@ -127,7 +127,7 @@ Event PUB_GEN_REPORT.CLICK()
|
||||
LocationEnabled = Flags<0, vPos>
|
||||
If LocationEnabled then RptLocations<0, -1> = Location
|
||||
Next Location
|
||||
|
||||
|
||||
Report_Services('PrintMaterialTrackReport', RptColumns, RptLocations, NoMatFlag, OldReport)
|
||||
|
||||
end event
|
||||
|
@ -39,8 +39,6 @@ $Insert POPUP_EQUATES
|
||||
$Insert NOTIFICATION_EQUATES
|
||||
$Insert LSL_USERS_EQUATES
|
||||
|
||||
EQU READONLY_GREEN$ TO 192 + (220*256) + (192*65536)
|
||||
|
||||
Declare function Admin_User, Database_Services, Error_Services, Active_Directory_Services, SRP_Array
|
||||
Declare subroutine PlaceDialog, Error_Services, Database_Services, Btree.Extract, ErrMsg
|
||||
|
||||
@ -643,3 +641,4 @@ return
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -45,8 +45,7 @@ EQU COL$PMID to 1
|
||||
EQU COL$DESC to 2
|
||||
EQU COL$DATECOMP to 3
|
||||
EQU COL$DATEDUE to 4
|
||||
EQU COL$LATE to 5
|
||||
EQU COL$USER to 6
|
||||
EQU COL$USER to 5
|
||||
|
||||
// Update the arguments so that the OpenInsight OLE event will treate the ActiveX event as a native event handler.
|
||||
If Event EQ 'OLE' then
|
||||
@ -102,7 +101,7 @@ Event PUB_EXPORT_TO_EXCEL.CLICK()
|
||||
|
||||
if FilePath NE '' then
|
||||
PmHistoryOutput = ''
|
||||
PmHistoryOutput<1> = 'PM ID' : @VM : 'Description' : @VM : 'Complete Date' : @VM : 'Due Date' : @VM : 'Late' : @VM : 'User'
|
||||
PmHistoryOutput<1> = 'PM ID' : @VM : 'Description' : @VM : 'Complete Date' : @VM : 'Due Date' : @VM : 'User'
|
||||
PMHistoryArray = Get_Property(@Window : '.OLE_HIST_TABLE', "OLE.ARRAY")
|
||||
PMHistoryArray = SRP_Array('Rotate',PMHistoryArray)
|
||||
for each DataRow in PmHistoryArray using @FM setting dPos
|
||||
@ -152,13 +151,10 @@ RunReport:
|
||||
PMRec = Database_Services('ReadDataRow', 'PM', PMId)
|
||||
SchedDtm = SRP_Datetime('Combine', PMRec<PM_SCHED_DT$>, PMRec<PM_SCHED_TM$>)
|
||||
DueByDTM = obj_PM_Spec('LateStart',PMId:@RM:PMSpecRecord)
|
||||
Late = Xlate('PM', PMId, 'LATE', 'X')
|
||||
If Late then Late = 'Yes' else Late = 'No'
|
||||
PMHistoryArray<pPos, COL$PMID> = PMId
|
||||
PMHistoryArray<pPos, COL$DESC> = PMDescription
|
||||
PMHistoryArray<pPos, COL$DATECOMP> = OCONV(PMRec<PM_COMP_DTM$>, 'DT')
|
||||
PMHistoryArray<pPos, COL$DATEDUE> = OCONV(SchedDtm, 'DT')
|
||||
PMHistoryArray<pPos, COL$LATE> = Late
|
||||
PMHistoryArray<pPos, COL$USER> = OConv(PMRec<PM_COMP_BY$>, '[XLATE_CONV,LSL_USERS*FIRST_LAST]')
|
||||
While Msg(@window, MsgUp, pPos, MSGINSTUPDATE$) ; * update the gauge and check if cancel was pressed
|
||||
Next PMId
|
||||
@ -191,9 +187,9 @@ Setup_OLE_Controls:
|
||||
EdtTableCtrl = @Window : '.OLE_HIST_TABLE'
|
||||
Set_Property(EdtTableCtrl, 'OLE.Redraw', False$)
|
||||
//Set up columns
|
||||
Set_Property(EdtTableCtrl, "OLE.Dimension", 6);*Define number of columns
|
||||
Set_Property(EdtTableCtrl, "OLE.Dimension", 5);*Define number of columns
|
||||
|
||||
HeaderTitles = 'PM ID':@VM:'Desc':@VM:'Date Completed':@VM:'Sched Due':@VM:'Late':@VM:'User Completed'; *Define the column header titles
|
||||
HeaderTitles = 'PM ID':@VM:'Desc':@VM:'Date Completed':@VM:'Sched Due':@VM:'User Completed'; *Define the column header titles
|
||||
Set_Property(EdtTableCtrl, "OLE.TitleList", HeaderTitles); *Set the column titles
|
||||
|
||||
//Set the column Sizes
|
||||
@ -203,7 +199,7 @@ Setup_OLE_Controls:
|
||||
ColSize<1> = 45
|
||||
Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$PMID:"]", ColSize)
|
||||
//Column 2
|
||||
ColSize<1> = 200
|
||||
ColSize<1> = 250
|
||||
ColSize<4> = True$
|
||||
Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$DESC:"]", ColSize)
|
||||
ColSize<4> = False$
|
||||
@ -211,13 +207,10 @@ Setup_OLE_Controls:
|
||||
ColSize<1> = 120
|
||||
Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$DATECOMP:"]", ColSize)
|
||||
//Column 4
|
||||
ColSize<1> = 110
|
||||
ColSize<1> = 135
|
||||
Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$DATEDUE:"]", ColSize)
|
||||
//Column 5
|
||||
ColSize<1> = 50
|
||||
Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$LATE:"]", ColSize)
|
||||
//Column 6
|
||||
ColSize<1> = 160
|
||||
ColSize<1> = 185
|
||||
Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$USER:"]", ColSize)
|
||||
|
||||
Set_Property(EdtTableCtrl, 'OLE.Border', 'XP Flat')
|
||||
@ -234,3 +227,4 @@ Setup_OLE_Controls:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
@ -44,7 +44,7 @@ $insert SUPPLEMENTS_EQUATES
|
||||
equ WOCust$ to 2
|
||||
|
||||
Declare subroutine SRP_Show_Window, Rds_Services, ErrMsg, Start_Window, Placedialog, Supplement_Services, Hold_Services
|
||||
Declare subroutine Labeling_Services
|
||||
Declare subroutine Labeling_Services
|
||||
Declare function Database_Services, Material_Services, Rds_Services, RGB, SRP_Array, MemberOf, Supplement_Services
|
||||
Declare function Hold_Services, Datetime, Printer_Select
|
||||
|
||||
@ -59,11 +59,11 @@ If Event EQ 'OLE' then
|
||||
Transfer Param1 to Event
|
||||
Transfer Param2 to Param1
|
||||
Transfer Param3 to Param2
|
||||
* Transfer Param4 to Param3
|
||||
* Transfer Param5 to Param4
|
||||
* Transfer Param6 to Param5
|
||||
* Transfer Param7 to Param6
|
||||
* Transfer Param8 to Param7
|
||||
Transfer Param4 to Param3
|
||||
Transfer Param5 to Param4
|
||||
Transfer Param6 to Param5
|
||||
Transfer Param7 to Param6
|
||||
Transfer Param8 to Param7
|
||||
end
|
||||
|
||||
GoToEvent Event for CtrlEntID
|
||||
@ -186,78 +186,83 @@ Event PUB_ENG_OPTIONS.CLICK()
|
||||
|
||||
NumRows = DCount(WOMatKeys, @VM)
|
||||
|
||||
Begin Case
|
||||
|
||||
Case SelOpt EQ 'CLEAN_INSP'
|
||||
Caption = "Updating Clean & Insp specs for selected RDS cassettes..."
|
||||
ServiceModules = 'CLEAN_INSP_SERVICES'
|
||||
Services = 'UpdateAllCleanInsp'
|
||||
ServiceModules = ''
|
||||
Services = ''
|
||||
Caption = ''
|
||||
|
||||
For each Sel in SelOpt using @VM
|
||||
If Sel EQ 'CLEAN_INSP' then
|
||||
Caption<0, -1> = "Updating Clean & Insp specs for selected RDS cassettes..."
|
||||
ServiceModules<0, -1> = 'CLEAN_INSP_SERVICES'
|
||||
Services<0, -1> = 'UpdateAllCleanInsp'
|
||||
end
|
||||
|
||||
Case SelOpt EQ 'QA_MET'
|
||||
Caption = "Updating QA Metrology specs for selected RDS cassettes..."
|
||||
ServiceModules = 'WO_MAT_QA_SERVICES'
|
||||
Services = 'UpdateQAMet'
|
||||
If SelOpt EQ 'QA_MET' then
|
||||
Caption<0, -1> = "Updating QA Metrology specs for selected RDS cassettes..."
|
||||
ServiceModules<0, -1> = 'WO_MAT_QA_SERVICES'
|
||||
Services<0, -1> = 'UpdateQAMet'
|
||||
end
|
||||
|
||||
Case SelOpt EQ 'UPDATE_RDS_LAYER'
|
||||
Caption = "Updating RDS Layer specs for selected RDS cassettes..."
|
||||
ServiceModules = 'RDS_LAYER_SERVICES'
|
||||
Services = 'UpdateRDSLayerSpecs'
|
||||
If SelOpt EQ 'UPDATE_RDS_LAYER' then
|
||||
Caption<0, -1> = "Updating RDS Layer specs for selected RDS cassettes..."
|
||||
ServiceModules<0, -1> = 'RDS_LAYER_SERVICES'
|
||||
Services<0, -1> = 'UpdateRDSLayerSpecs'
|
||||
end
|
||||
|
||||
Case SelOpt EQ 'CLEAN_INSP':@VM:'QA_MET'
|
||||
Caption = "Updating Clean & Insp and QA Metrology specs for selected RDS cassettes..."
|
||||
ServiceModules = 'CLEAN_INSP_SERVICES':@VM:'WO_MAT_QA_SERVICES'
|
||||
Services = 'UpdateAllCleanInsp':@VM:'UpdateQAMet'
|
||||
|
||||
Case SelOpt EQ 'QA_MET':@VM:'UPDATE_RDS_LAYER'
|
||||
Caption = "Updating RDS Layer and QA Metrology specs for selected RDS cassettes..."
|
||||
ServiceModules = 'WO_MAT_QA_SERVICES':@VM:'RDS_LAYER_SERVICES'
|
||||
Services = 'UpdateQAMet':@VM:'UpdateRDSLayerSpecs'
|
||||
|
||||
Case SelOpt EQ 'CLEAN_INSP':@VM: 'UPDATE_RDS_LAYER'
|
||||
Caption = "Updating RDS Layer and Clean & Insp specs for selected RDS cassettes..."
|
||||
ServiceModules = 'CLEAN_INSP_SERVICES':@VM:'RDS_LAYER_SERVICES'
|
||||
Services = 'UpdateAllCleanInsp':@VM:'UpdateRDSLayerSpecs'
|
||||
|
||||
Case SelOpt EQ 'CLEAN_INSP':@VM:'QA_MET':@VM: 'UPDATE_RDS_LAYER'
|
||||
Caption = "Updating Clean & Insp, QA Metrology, and RDS Layer specs for selected RDS cassettes..."
|
||||
ServiceModules = 'CLEAN_INSP_SERVICES':@VM:'WO_MAT_QA_SERVICES' :@VM: 'RDS_LAYER_SERVICES'
|
||||
Services = 'UpdateAllCleanInsp':@VM:'UpdateQAMet' :@VM: 'UpdateRDSLayerSpecs'
|
||||
|
||||
End Case
|
||||
If SelOpt EQ 'UPDATE_RDS_TEST' then
|
||||
Caption<0, -1> = "Updating RDS Test specs for selected RDS cassettes..."
|
||||
ServiceModules<0, -1> = 'RDS_TEST_SERVICES'
|
||||
Services<0, -1> = 'UpdateRDSTestSpecs'
|
||||
end
|
||||
Next Sel
|
||||
|
||||
Swap @VM with CRLF$ in Caption
|
||||
|
||||
If ServiceModules NE '' then
|
||||
Def = ""
|
||||
ErrorMsg = ''
|
||||
Def = ''
|
||||
Def<MCAPTION$> = Caption
|
||||
Def<MTYPE$> = "GC"
|
||||
Def<MEXTENT$> = NumRows
|
||||
Def<MTEXTWIDTH$> = 600
|
||||
MsgUp = Msg(@WINDOW, Def) ;* Start gas guage message
|
||||
Def<MCOL$> = -2
|
||||
Def<MROW$> = -2
|
||||
MsgUp = Msg(@Window, Def) ;* Start gas guage message
|
||||
For each WOMatKey in WOMatKeys using @VM setting vPos
|
||||
Running = Msg(@WINDOW, MsgUp, vPos, MSGINSTUPDATE$) ;* Update gas guage
|
||||
Running = Msg(@Window, MsgUp, vPos, MSGINSTUPDATE$) ;* Update gas guage
|
||||
For each ServiceModule in ServiceModules using @VM setting sPos
|
||||
Service = Services<0, sPos>
|
||||
If Service = 'UpdateRDSLayerSpecs' then
|
||||
If ( (Service _EQC 'UpdateRDSLayerSpecs') or (Service _EQC 'UpdateRDSTestSpecs') ) then
|
||||
RDSKey = SelRDSList<4, vPos>
|
||||
Ans = Function(@ServiceModule(Service, RDSKey))
|
||||
end else
|
||||
Ans = Function(@ServiceModule(Service, WOMatKey))
|
||||
end
|
||||
If Error_Services('HasError') then
|
||||
Error_Services('DisplayError')
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
Until (ErrorMsg NE '')
|
||||
Next ServiceModule
|
||||
Until (ErrorMsg NE '')
|
||||
Next WOMatKey
|
||||
Msg(@WINDOW,MsgUp) ;* Take gas guage down
|
||||
|
||||
Msg(@Window,MsgUp) ;* Take gas guage down
|
||||
end
|
||||
|
||||
If Error_Services('NoError') then
|
||||
Def = ""
|
||||
Def = ''
|
||||
Def<MCOL$> = -2
|
||||
Def<MROW$> = -2
|
||||
If (ErrorMsg EQ '') then
|
||||
Def<MICON$> = '*'
|
||||
Def<MCAPTION$> = 'Success'
|
||||
Def<MTEXT$> = "Update complete!"
|
||||
Def<MTYPE$> = "BO"
|
||||
MsgUp = Msg(@window, Def)
|
||||
Def<MTEXT$> = 'Update complete!'
|
||||
end else
|
||||
Def<MICON$> = 'H'
|
||||
Def<MCAPTION$> = 'Update failed!'
|
||||
Def<MTEXT$> = ErrorMsg
|
||||
end
|
||||
Def<MTYPE$> = "BO"
|
||||
MsgUp = Msg(@Window, Def, 'OK')
|
||||
end
|
||||
|
||||
end event
|
||||
@ -277,7 +282,7 @@ Event PUB_ON_HOLD.CLICK()
|
||||
HoldEntity = 'RDS'
|
||||
HoldType = 'HOLD'
|
||||
HoldData = ''
|
||||
HoldData = Dialog_Box('DIALOG_HOLD',@WINDOW,Transition:@FM:@FM:HoldType)
|
||||
HoldData = Dialog_Box('DIALOG_HOLD',@Window,Transition:@FM:@FM:HoldType)
|
||||
If HoldData NE 'Cancel' then
|
||||
GoSub GetView
|
||||
Hold_Services('EnableMultipleHolds', WOMatKeys, HoldEntity, RDSKeys, 'NDW_RDS_QUERY', '', HoldData)
|
||||
@ -289,7 +294,7 @@ Event PUB_ON_HOLD.CLICK()
|
||||
MsgInfo<MTYPE$> = 'BNY'
|
||||
MsgInfo<MTEXT$> = 'Hold Successful. Would you like to print label(s)?'
|
||||
MsgInfo<MICON$> = '!'
|
||||
PrintLabel = Msg(@WINDOW,MsgInfo,'')
|
||||
PrintLabel = Msg(@Window,MsgInfo,'')
|
||||
HoldBy = HoldData<1>
|
||||
Reason = HoldData<2>
|
||||
Stage = HoldData<4>
|
||||
@ -333,7 +338,7 @@ Event PUB_OFF_HOLD.CLICK()
|
||||
Transition = True$
|
||||
HoldType = 'HOLD'
|
||||
HoldData = ''
|
||||
HoldData = Dialog_Box('DIALOG_HOLD',@WINDOW,Transition:@FM:@FM:HoldType)
|
||||
HoldData = Dialog_Box('DIALOG_HOLD',@Window,Transition:@FM:@FM:HoldType)
|
||||
If HoldData NE 'Cancel' then
|
||||
GoSub GetView
|
||||
Hold_Services('DisableMultipleHolds', WOMatKeys, 'RDS', RDSKeys, 'NDW_RDS_QUERY', '', HoldData)
|
||||
@ -666,7 +671,7 @@ CheckSelectedForHolds:
|
||||
Until HoldOnFlag EQ True$ and HoldOffFlag EQ True$
|
||||
Next K
|
||||
end
|
||||
if MemberOf(@USER4, 'ENG_TECH') OR MemberOf(@USER4, 'LEAD') OR MemberOf(@USER4, 'SUPERVISOR') then
|
||||
if MemberOf(@User4, 'ENG_TECH') OR MemberOf(@User4, 'LEAD') OR MemberOf(@User4, 'SUPERVISOR') then
|
||||
// IF ANY SELECTED LOTS ARE ON HOLD, ENABLE PUB_OFF_HOLD
|
||||
Set_Property(@Window:'.PUB_OFF_HOLD', 'ENABLED', HoldOffFlag)
|
||||
end else
|
||||
|
@ -723,12 +723,16 @@ Event OLE_SCHEDULE.OnContextMenuClick(Item, UserData)
|
||||
Description = AddEventDetails<5>
|
||||
WaferQty = AddEventDetails<6>
|
||||
NewApptID = Schedule_Services('AddSchedEvent', ReactorNo, WorkOrder, StartDTM, StopDTM, Description, WaferQty)
|
||||
NewAppt = Schedule_Services('GetScheduleEvent', NewApptID)
|
||||
If Error_Services('NoError') then
|
||||
GoSub RefreshReactor
|
||||
If NewApptID NE '' then
|
||||
SchedRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', NewApptID)
|
||||
Schedule_Services('NotifySupervisorsIfSameDayChange', SchedRec)
|
||||
If Error_Services('NoError') then
|
||||
NewAppt = Schedule_Services('GetScheduleEvent', NewApptID)
|
||||
If Error_Services('NoError') then
|
||||
GoSub RefreshReactor
|
||||
If NewApptID NE '' then
|
||||
SchedRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', NewApptID)
|
||||
Schedule_Services('NotifySupervisorsIfSameDayChange', SchedRec)
|
||||
end
|
||||
end else
|
||||
Error_Services('DisplayError')
|
||||
end
|
||||
end else
|
||||
Error_Services('DisplayError')
|
||||
|
@ -39,8 +39,6 @@ $Insert POPUP_EQUATES
|
||||
$Insert SEC_GROUPS_EQUATES
|
||||
$Insert LSL_USERS_EQUATES
|
||||
|
||||
EQU READONLY_GREEN$ TO 192 + (220*256) + (192*65536)
|
||||
|
||||
Declare function Admin_User, Database_Services, Error_Services, Active_Directory_Services, SRP_Array
|
||||
Declare subroutine PlaceDialog, Error_Services, Database_Services, Btree.Extract, ErrMsg
|
||||
|
||||
@ -726,3 +724,4 @@ UnlockRec:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
@ -97,17 +97,7 @@ Event WINDOW.CREATE(CreateParam)
|
||||
LogData<5> = ToolLoc
|
||||
LogData<6> = @Window:'.CREATE'
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||
QAMetComplete = ''
|
||||
|
||||
If CassID NE '' then
|
||||
If RowExists('WM_OUT', CassID) then
|
||||
WOMatKey = Xlate('WM_OUT', CassID, 'WO_MAT_KEY', 'X')
|
||||
end else
|
||||
WOMatKey = Xlate('RDS', CassID, 'WO_MAT_KEY', 'X')
|
||||
end
|
||||
QAMetComplete = Wo_Mat_Qa_Services('GetQAMetComplete', WOMatKey)
|
||||
end
|
||||
|
||||
|
||||
Convert '.' to '*' in CassID
|
||||
ExpectedQty = ''
|
||||
ExpectedWfrMap = ''
|
||||
@ -115,8 +105,6 @@ Event WINDOW.CREATE(CreateParam)
|
||||
Set_Property(@Window:'.EDL_CASS_ID', 'TEXT', CassID)
|
||||
|
||||
Begin Case
|
||||
Case (CassID NE '' AND QAMetComplete EQ False$)
|
||||
ErrorMsg = 'Wafer Counter Operation Not Allowed. QA Metrology Incomplete.'
|
||||
Case ( (CassID EQ '') and (ToolLoc EQ '') )
|
||||
// Alternate workflow
|
||||
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass ID')
|
||||
@ -333,42 +321,32 @@ Event EDL_CASS_BARCODE.LOSTFOCUS(Flag, FocusID)
|
||||
Begin Case
|
||||
Case RowExists('RDS', CassetteID)
|
||||
WOMatKey = Xlate('RDS', CassetteID, 'WO_MAT_KEY', 'X')
|
||||
QAMetComplete = Wo_Mat_Qa_Services('GetQAMetComplete', WOMatKey)
|
||||
If QAMetComplete EQ True$ then
|
||||
ExpectedQty = Xlate('RDS', CassetteID, 'WFRS_OUT', 'X')
|
||||
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
|
||||
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass RDS')
|
||||
Set_Property(@Window:'.LBL_CASS_BARCODE', 'TEXT', 'Cass RDS 2D')
|
||||
|
||||
WOMatKey = Xlate('RDS', CassetteID, 'WO_MAT_KEY', 'X')
|
||||
CurrWfrMap = WO_Mat_Services('GetWaferMap', WOMatKey)
|
||||
If Error_Services('NoError') then
|
||||
ExpectedWfrMap = CurrWfrMap
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
ExpectedQty = Xlate('RDS', CassetteID, 'WFRS_OUT', 'X')
|
||||
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
|
||||
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass RDS')
|
||||
Set_Property(@Window:'.LBL_CASS_BARCODE', 'TEXT', 'Cass RDS 2D')
|
||||
|
||||
WOMatKey = Xlate('RDS', CassetteID, 'WO_MAT_KEY', 'X')
|
||||
CurrWfrMap = WO_Mat_Services('GetWaferMap', WOMatKey)
|
||||
If Error_Services('NoError') then
|
||||
ExpectedWfrMap = CurrWfrMap
|
||||
end else
|
||||
ErrorMsg = 'Wafer Counter Operation Not Allowed. A Metrology stage is incomplete.'
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
|
||||
Case RowExists('WM_OUT', CassetteID)
|
||||
WOMatKey = Xlate('WM_OUT', CassetteID, 'WO_MAT_KEY', 'X')
|
||||
QAMetComplete = Wo_Mat_Qa_Services('GetQAMetComplete', WOMatKey)
|
||||
If QAMetComplete EQ True$ then
|
||||
ExpectedQty = Xlate('WM_OUT', CassetteID, 'WAFER_CNT', 'X')
|
||||
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
|
||||
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass WMO')
|
||||
Set_Property(@Window:'.LBL_CASS_BARCODE', 'TEXT', 'Cass WMO 2D')
|
||||
|
||||
CurrWfrMap = WM_Out_Services('GetWaferMap', CassetteID)
|
||||
If Error_Services('NoError') then
|
||||
ExpectedWfrMap = CurrWfrMap
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
ExpectedQty = Xlate('WM_OUT', CassetteID, 'WAFER_CNT', 'X')
|
||||
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
|
||||
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass WMO')
|
||||
Set_Property(@Window:'.LBL_CASS_BARCODE', 'TEXT', 'Cass WMO 2D')
|
||||
|
||||
CurrWfrMap = WM_Out_Services('GetWaferMap', CassetteID)
|
||||
If Error_Services('NoError') then
|
||||
ExpectedWfrMap = CurrWfrMap
|
||||
end else
|
||||
ErrorMsg = 'Wafer Counter Operation Not Allowed. QA Metrology Incomplete.'
|
||||
end
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
End Case
|
||||
|
||||
If ErrorMsg EQ '' then
|
||||
@ -423,7 +401,7 @@ end event
|
||||
|
||||
|
||||
Event EDL_TOOL_BARCODE.LOSTFOCUS(Flag, FocusID)
|
||||
|
||||
|
||||
If Flag EQ 1 then
|
||||
ErrorMsg = ''
|
||||
ScanData = Get_Property(CtrlEntID, 'TEXT')
|
||||
@ -438,110 +416,155 @@ Event EDL_TOOL_BARCODE.LOSTFOCUS(Flag, FocusID)
|
||||
Cnt = DCount(ScanData, '|')
|
||||
If Cnt EQ 2 then
|
||||
WaferSize = Field(ScanData, '|', 1)
|
||||
Area = Field(ScanData, '|', 2)
|
||||
Def = ""
|
||||
Def<MTEXT$> = "Retreiving Wafer Counter Data..."
|
||||
Def<MTYPE$> = "U"
|
||||
CassID = Get_Property(@Window:'.EDL_CASS_BARCODE', 'TEXT')
|
||||
MsgUp = Msg(@window, Def) ;* display the processing message
|
||||
WcJson = Wafer_Counter_Services('GetWaferCounterJSON', WaferSize, Area, CassID)
|
||||
Msg(@window, MsgUp) ;* take down the processing message
|
||||
If Error_Services('NoError') then
|
||||
objJSON = ''
|
||||
If SRP_JSON(objJSON, 'Parse', WcJson) EQ '' then
|
||||
ScanDtm = SRP_JSON(objJSON, 'GetValue', 'dateTimeFormatted')
|
||||
ToolID = SRP_JSON(objJSON, 'GetValue', 'equipmentId')
|
||||
WaferCount = SRP_JSON(objJSON, 'GetValue', 'total')
|
||||
SlotMap = SRP_JSON(objJSON, 'GetValue', 'slotMap')
|
||||
SRP_JSON(objJSON, 'Release')
|
||||
Wafer_Counter_Services('AddScan', CassID, WaferCount, ScanDtm, ToolID, @User4, Area, SlotMap)
|
||||
If Error_Services('NoError') then
|
||||
Set_Property(@Window:'.EDL_SCAN_DTM', 'TEXT', ScanDtm)
|
||||
Set_Property(@Window:'.EDL_TOOL_ID', 'TEXT', ToolID)
|
||||
Set_Property(@Window:'.EDL_WAFER_COUNT', 'TEXT', WaferCount)
|
||||
EmptyColorArray = RED$ : @FM : '' : @FM : '' : @FM : ''
|
||||
FilledColorArray = GREEN$ : @FM : '' : @FM : '' : @FM : ''
|
||||
RowIndex = 1
|
||||
ResultArray = ''
|
||||
ExpectedWfrMap = Get_Property(@Window, '@EXPECTED_WFR_MAP')
|
||||
|
||||
For SlotIndex = 1 to 25
|
||||
SlotFilled = SlotMap[SlotIndex, 1]
|
||||
|
||||
ExpectedVal = ExpectedWfrMap[SlotIndex, 1]
|
||||
ResultArray<1, SlotIndex> = 26 - SlotIndex
|
||||
If SlotFilled EQ ExpectedVal then
|
||||
ResultArray<2, SlotIndex> = ''
|
||||
end else
|
||||
ResultArray<2, SlotIndex> = 'Error'
|
||||
end
|
||||
|
||||
RowIndex += 1
|
||||
Next SlotIndex
|
||||
ExpectedQty = Get_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT')
|
||||
Set_Property(@Window:'.EDT_WAFER_COUNTER', 'ARRAY', ResultArray)
|
||||
|
||||
RowIndex = 1
|
||||
For SlotIndex = 1 to 25
|
||||
SlotFilled = SlotMap[SlotIndex, 1]
|
||||
If SlotFilled then
|
||||
CellColorArray = FilledColorArray
|
||||
end else
|
||||
CellColorArray = EmptyColorArray
|
||||
end
|
||||
Send_Message(@Window:'.EDT_WAFER_COUNTER', 'COLOR_BY_POS', 2, RowIndex, CellColorArray)
|
||||
RowIndex += 1
|
||||
Next SlotIndex
|
||||
|
||||
Begin Case
|
||||
Case WaferCount NE ExpectedQty
|
||||
ErrorMsg = 'Scanned wafer count "':WaferCount:'" does not match expected quantity "':ExpectedQty:'".'
|
||||
Case SlotMap NE ExpectedWfrMap
|
||||
ErrorMsg = 'Scanned wafer map does not match expected wafer map.'
|
||||
Case Otherwise$
|
||||
SuccessMessage = 'Wafer count verification complete!'
|
||||
|
||||
LogData = ''
|
||||
LogData<1> = OConv(Datetime(), 'DT2/^H')
|
||||
LogData<2> = @User4
|
||||
LogData<3> = SuccessMessage
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||
|
||||
MsgStruct = ""
|
||||
MsgStruct<MTEXTWIDTH$> = MSG_WIDTH$
|
||||
MsgStruct<MCOL$> = -300
|
||||
MsgStruct<MROW$> = 500
|
||||
MsgStruct<MTYPE$> = "T4"
|
||||
Msg(@Window, MsgStruct, 'PROCESS_COMPLETE', '', SuccessMessage)
|
||||
|
||||
AltFlow = Get_Property(@Window, '@ALTERNATE')
|
||||
If AltFlow then
|
||||
GoSub ClearForm
|
||||
end else
|
||||
End_Dialog(@Window, True$)
|
||||
end
|
||||
End Case
|
||||
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error parsing tool scan data.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
Area = Field(ScanData, '|', 2) ; // This is a proxy for the operation being performed
|
||||
|
||||
If Area EQ 'FQA' then
|
||||
CassetteID = Get_Property(@Window:'.EDL_CASS_ID', 'TEXT')
|
||||
Begin Case
|
||||
Case RowExists('RDS', CassetteID)
|
||||
WOMatKey = Xlate('RDS', CassetteID, 'WO_MAT_KEY', 'X')
|
||||
QAMetComplete = Wo_Mat_Qa_Services('GetQAMetComplete', WOMatKey)
|
||||
If QAMetComplete EQ True$ then
|
||||
ExpectedQty = Xlate('RDS', CassetteID, 'WFRS_OUT', 'X')
|
||||
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
|
||||
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass RDS')
|
||||
Set_Property(@Window:'.LBL_CASS_BARCODE', 'TEXT', 'Cass RDS 2D')
|
||||
|
||||
WOMatKey = Xlate('RDS', CassetteID, 'WO_MAT_KEY', 'X')
|
||||
CurrWfrMap = WO_Mat_Services('GetWaferMap', WOMatKey)
|
||||
If Error_Services('NoError') then
|
||||
ExpectedWfrMap = CurrWfrMap
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Wafer Counter Operation Not Allowed. A Metrology stage is incomplete.'
|
||||
end
|
||||
Case RowExists('WM_OUT', CassetteID)
|
||||
WOMatKey = Xlate('WM_OUT', CassetteID, 'WO_MAT_KEY', 'X')
|
||||
QAMetComplete = Wo_Mat_Qa_Services('GetQAMetComplete', WOMatKey)
|
||||
If QAMetComplete EQ True$ then
|
||||
ExpectedQty = Xlate('WM_OUT', CassetteID, 'WAFER_CNT', 'X')
|
||||
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
|
||||
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass WMO')
|
||||
Set_Property(@Window:'.LBL_CASS_BARCODE', 'TEXT', 'Cass WMO 2D')
|
||||
|
||||
CurrWfrMap = WM_Out_Services('GetWaferMap', CassetteID)
|
||||
If Error_Services('NoError') then
|
||||
ExpectedWfrMap = CurrWfrMap
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Wafer Counter Operation Not Allowed. QA Metrology Incomplete.'
|
||||
end
|
||||
End Case
|
||||
end
|
||||
|
||||
If ErrorMsg EQ '' then
|
||||
|
||||
Def = ""
|
||||
Def<MTEXT$> = "Retreiving Wafer Counter Data..."
|
||||
Def<MTYPE$> = "U"
|
||||
CassID = Get_Property(@Window:'.EDL_CASS_BARCODE', 'TEXT')
|
||||
MsgUp = Msg(@window, Def) ;* display the processing message
|
||||
WcJson = Wafer_Counter_Services('GetWaferCounterJSON', WaferSize, Area, CassID)
|
||||
Msg(@window, MsgUp) ;* take down the processing message
|
||||
If Error_Services('NoError') then
|
||||
objJSON = ''
|
||||
If SRP_JSON(objJSON, 'Parse', WcJson) EQ '' then
|
||||
ScanDtm = SRP_JSON(objJSON, 'GetValue', 'dateTimeFormatted')
|
||||
ToolID = SRP_JSON(objJSON, 'GetValue', 'equipmentId')
|
||||
WaferCount = SRP_JSON(objJSON, 'GetValue', 'total')
|
||||
SlotMap = SRP_JSON(objJSON, 'GetValue', 'slotMap')
|
||||
SRP_JSON(objJSON, 'Release')
|
||||
Wafer_Counter_Services('AddScan', CassID, WaferCount, ScanDtm, ToolID, @User4, Area, SlotMap)
|
||||
If Error_Services('NoError') then
|
||||
Set_Property(@Window:'.EDL_SCAN_DTM', 'TEXT', ScanDtm)
|
||||
Set_Property(@Window:'.EDL_TOOL_ID', 'TEXT', ToolID)
|
||||
Set_Property(@Window:'.EDL_WAFER_COUNT', 'TEXT', WaferCount)
|
||||
EmptyColorArray = RED$ : @FM : '' : @FM : '' : @FM : ''
|
||||
FilledColorArray = GREEN$ : @FM : '' : @FM : '' : @FM : ''
|
||||
RowIndex = 1
|
||||
ResultArray = ''
|
||||
ExpectedWfrMap = Get_Property(@Window, '@EXPECTED_WFR_MAP')
|
||||
|
||||
For SlotIndex = 1 to 25
|
||||
SlotFilled = SlotMap[SlotIndex, 1]
|
||||
|
||||
ExpectedVal = ExpectedWfrMap[SlotIndex, 1]
|
||||
ResultArray<1, SlotIndex> = 26 - SlotIndex
|
||||
If SlotFilled EQ ExpectedVal then
|
||||
ResultArray<2, SlotIndex> = ''
|
||||
end else
|
||||
ResultArray<2, SlotIndex> = 'Error'
|
||||
end
|
||||
|
||||
RowIndex += 1
|
||||
Next SlotIndex
|
||||
ExpectedQty = Get_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT')
|
||||
Set_Property(@Window:'.EDT_WAFER_COUNTER', 'ARRAY', ResultArray)
|
||||
|
||||
RowIndex = 1
|
||||
For SlotIndex = 1 to 25
|
||||
SlotFilled = SlotMap[SlotIndex, 1]
|
||||
If SlotFilled then
|
||||
CellColorArray = FilledColorArray
|
||||
end else
|
||||
CellColorArray = EmptyColorArray
|
||||
end
|
||||
Send_Message(@Window:'.EDT_WAFER_COUNTER', 'COLOR_BY_POS', 2, RowIndex, CellColorArray)
|
||||
RowIndex += 1
|
||||
Next SlotIndex
|
||||
|
||||
Begin Case
|
||||
Case WaferCount NE ExpectedQty
|
||||
ErrorMsg = 'Scanned wafer count "':WaferCount:'" does not match expected quantity "':ExpectedQty:'".'
|
||||
Case SlotMap NE ExpectedWfrMap
|
||||
ErrorMsg = 'Scanned wafer map does not match expected wafer map.'
|
||||
Case Otherwise$
|
||||
SuccessMessage = 'Wafer count verification complete!'
|
||||
|
||||
LogData = ''
|
||||
LogData<1> = OConv(Datetime(), 'DT2/^H')
|
||||
LogData<2> = @User4
|
||||
LogData<3> = SuccessMessage
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||
|
||||
MsgStruct = ""
|
||||
MsgStruct<MTEXTWIDTH$> = MSG_WIDTH$
|
||||
MsgStruct<MCOL$> = -300
|
||||
MsgStruct<MROW$> = 500
|
||||
MsgStruct<MTYPE$> = "T4"
|
||||
Msg(@Window, MsgStruct, 'PROCESS_COMPLETE', '', SuccessMessage)
|
||||
|
||||
AltFlow = Get_Property(@Window, '@ALTERNATE')
|
||||
If AltFlow then
|
||||
GoSub ClearForm
|
||||
end else
|
||||
End_Dialog(@Window, True$)
|
||||
end
|
||||
End Case
|
||||
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error parsing tool scan data.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Invalid Tool Barcode Scan.'
|
||||
end
|
||||
end else
|
||||
|
||||
LogData = ''
|
||||
LogData<1> = OConv(Datetime(), 'DT2/^H')
|
||||
LogData<2> = @User4
|
||||
LogData<3> = 'Verification process canceled'
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||
|
||||
End_Dialog(@Window, False$)
|
||||
end
|
||||
If ErrorMsg NE '' then
|
||||
@ -624,9 +647,3 @@ ClearForm:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1221,7 +1221,6 @@ Event PUB_REM_CASS.CLICK()
|
||||
WmInKeys = ''
|
||||
for each CassetteToVoid in CassettesToVoid using @FM
|
||||
WmInKeys<1, -1> = CassetteToVoid<1,4>
|
||||
//Work_Order_Services('SignVoidWMI', WMIToVoid, @USER4)
|
||||
Next CassetteToVoid
|
||||
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'SignVoidWMI':SD$:WmInKeys:SD$:WoNo:SD$:@USER4)
|
||||
If Error_Services('HasError') then
|
||||
@ -1240,7 +1239,6 @@ Event PUB_REM_CASS.CLICK()
|
||||
CassNo = XLATE('RDS', RDSToVoid, RDS_CASS_NO$, 'X')
|
||||
WOMatKey = WONo : '*' : CassNo
|
||||
WoMatKeyList<1, -1> = WoMatKey
|
||||
//Work_Order_Services('SignVoidNonEPP', WOMatKey, @USER4)
|
||||
If Error_Services('HasError') then
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
@ -1332,7 +1330,7 @@ Event PUB_REM_WM_OUT.CLICK()
|
||||
WmOutKeys<1, -1> = CassetteToVoid<1,3>
|
||||
Until ErrorMessage NE ''
|
||||
Next CassetteToVoid
|
||||
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'SignVoidWMO':SD$:WmInKeys:SD$:WoNo:SD$:@USER4)
|
||||
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'SignVoidWMO':SD$:WmOutKeys:SD$:WoNo:SD$:@USER4)
|
||||
If Error_Services('HasError') then
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
|
@ -20,9 +20,9 @@ COMPILE FUNCTION obj_Post_Log(Method,Parms)
|
||||
|
||||
|
||||
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, Get_Property, obj_RDS, Database_Services, Environment_Services
|
||||
DECLARE FUNCTION Logging_Services, Datetime, SRP_DateTime, GetTickCount
|
||||
DECLARE FUNCTION Logging_Services, Datetime, SRP_DateTime, GetTickCount, SRP_Datetime
|
||||
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, Send_Dyn, RList, obj_WO_Log, Send_Event, obj_RDS
|
||||
DECLARE SUBROUTINE obj_WO_Mat, Send_Info, obj_Notes, ErrMsg, Logging_Services, Mona_Services
|
||||
DECLARE SUBROUTINE obj_WO_Mat, Send_Info, obj_Notes, ErrMsg, Logging_Services, Mona_Services, Database_Services
|
||||
|
||||
|
||||
$INSERT POST_LOG_EQUATES
|
||||
@ -222,12 +222,44 @@ Post:
|
||||
|
||||
IF Get_Status(errCode) THEN
|
||||
Set_Status(0)
|
||||
obj_Tables('UnlockRec',PlParms)
|
||||
obj_Tables('UnlockRec',UFParms)
|
||||
ClearSelect CursorVar
|
||||
// 4/22/19 Added unlock statement to prevent POST_LOG service from locking up
|
||||
Unlock hSysLists, ServiceKeyID else Null
|
||||
RETURN
|
||||
|
||||
Tablename = Field(UFParms, @RM, 1, 1)
|
||||
Key = Field(UFParms, @RM, 2, 1)
|
||||
Database_Services('ReleaseKeyIDLock', Tablename, Key)
|
||||
|
||||
CurrDtm = Datetime()
|
||||
FailureNotificationSent = PostLogRec<POST_LOG_FAILURE_NOTIFICATION_SENT$>
|
||||
FailureNotificationDtm = PostLogRec<POST_LOG_FAILURE_NOTIFICATION_DTM$>
|
||||
If FailureNotificationDtm NE '' then
|
||||
SendReminder = ( SRP_Datetime('HourSpan', FailureNotificationDtm, CurrDtm) GE 1 )
|
||||
end else
|
||||
SendReminder = False$
|
||||
end
|
||||
If ( (FailureNotificationSent NE True$) or (SendReminder EQ True$) ) then
|
||||
PostLogRec<POST_LOG_FAILED$> = True$
|
||||
PostLogRec<POST_LOG_FAILURE_REASON$> = errCode
|
||||
PostLogRec<POST_LOG_FAILURE_NOTIFICATION_SENT$> = True$
|
||||
PostLogRec<POST_LOG_FAILURE_NOTIFICATION_DTM$> = CurrDtm
|
||||
Database_Services('WriteDataRow', 'POST_LOG', PostLogKey, PostLogRec, True$, False$, False$)
|
||||
|
||||
// Notify OI_SYSADMIN group
|
||||
Server = Environment_Services('GetServer')
|
||||
Recipients = ''
|
||||
SentFrom = 'SYSTEM'
|
||||
Subject = 'Obj_Post_Log("Post") Error'
|
||||
Message = OConv(CurrDtm, 'DT2/^H')
|
||||
Message<2> = 'Error on server ':Server
|
||||
Message<3> = 'Failed to write record ':Tablename:' ':Key:' . Error_Services error message: ':errCode
|
||||
Swap @FM with \0D0A\ in Message
|
||||
AttachWindow = ''
|
||||
AttachKey = ''
|
||||
SendToGroup = 'OI_SYSADMIN'
|
||||
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
|
||||
obj_Notes('Create',Parms)
|
||||
end else
|
||||
Database_Services('ReleaseKeyIDLock', 'POST_LOG', PostLogKey)
|
||||
end
|
||||
|
||||
END ELSE
|
||||
obj_Tables('DeleteRec',PlParms)
|
||||
END
|
||||
|
@ -2108,5 +2108,3 @@ GetQAMet:
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
@ -18,6 +18,7 @@ COMPILE FUNCTION obj_RDS(Method,Parms)
|
||||
|
||||
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, NextKey, obj_WO_Verify, obj_Prod_Spec, Send_Dyn, obj_RDS_Makeup
|
||||
DECLARE FUNCTION obj_RDS2, obj_RDS_Test, obj_WO_Mat, obj_Clean_Insp, obj_PRS_Prop, Database_Services, RDS_Services
|
||||
DECLARE FUNCTION Return_To_Fab_Services
|
||||
DECLARE FUNCTION Logging_Services, Environment_Services, Error_Services, Signature_Services, Lot_Services, Supplement_Services
|
||||
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, obj_WO_Step, obj_RDS_Layer, obj_RDS_Test, obj_WM_In
|
||||
DECLARE SUBROUTINE Btree.Extract, RDS_React_Run, Environment_Services, Logging_Services, Error_Services, Send_Info
|
||||
@ -135,6 +136,13 @@ CurrStatus:
|
||||
RDSCnt = COUNT(RDSNos,@VM) + (RDSNos NE '')
|
||||
FOR R = 1 TO RDSCnt
|
||||
|
||||
OpenRTF = Return_To_Fab_Services('GetOpenReturnToFabRecordIdByCassId', RDSNos<R>)
|
||||
|
||||
IF OpenRTF NE '' THEN
|
||||
ReturnVals<1,R> = 'RTF' ;* Open RTF on RDS *
|
||||
GOTO StatusHere
|
||||
END
|
||||
|
||||
NCRStatuses = XLATE('NCR',RDSRec<RDS_NCR_KEYS$>,7,'X')
|
||||
|
||||
IF INDEX(NCRStatuses,'O',1) THEN
|
||||
@ -1242,3 +1250,4 @@ CalcThickTarget:
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
@ -18,7 +18,7 @@ COMPILE FUNCTION obj_Reactor_Log(Method,Parms)
|
||||
*/
|
||||
|
||||
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, ErrMsg, Btree.Extract, obj_React_Item_Hist, Update_Index, obj_Post_Log
|
||||
Declare subroutine Error_Services, Database_Services, React_Item_Services
|
||||
Declare subroutine Error_Services, Database_Services, React_Item_Services, Reactor_Services
|
||||
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, obj_React_Item, obj_Calendar, Database_Services
|
||||
|
||||
|
||||
@ -117,7 +117,7 @@ PostReactItems:
|
||||
InstRINos = ReactorLogRec<REACTOR_LOG_INST_RI_NO$>
|
||||
|
||||
CurrRINos = XLATE('REACTOR_LOG', RLNo, 'CURR_RI_NO', 'X')
|
||||
|
||||
ReactorType = Xlate('REACTOR', ReactNo, REACTOR_REACT_TYPE$, 'X')
|
||||
//Check to make sure that everything is valid before adding or removing anything
|
||||
ValidationFailureReason = ''
|
||||
for each InstRINo in InstRINos using @VM
|
||||
@ -125,6 +125,23 @@ PostReactItems:
|
||||
If InstRIRec<REACT_ITEM_RETIRE_DT$> NE '' then
|
||||
ValidationFailureReason = 'Unable to install Reactor Item No. ' : InstRINo : ' because its status is retired!'
|
||||
end
|
||||
If InstRIRec<REACT_ITEM_RI_TYPE$> EQ 'S' then
|
||||
If InstRIRec<REACT_ITEM_PKT_SIZE$> EQ '' then
|
||||
ValidationFailureReason = 'Unable to install Reactor Item No. ' : InstRINo : '. Pocket/Ring Size cannot be empty for Susceptor Reactor Items.'
|
||||
end
|
||||
If InstRIRec<REACT_ITEM_PKT_QTY$> EQ '' then
|
||||
ValidationFailureReason = 'Unable to install Reactor Item No. ' : InstRINo : '. Pocket Qty cannot be empty for Susceptor Reactor Items.'
|
||||
end
|
||||
end
|
||||
If (InstRIRec<REACT_ITEM_RI_TYPE$> NE 'RE') AND (InstRIRec<REACT_ITEM_RI_TYPE$> NE 'LE') then
|
||||
If InstRIRec<REACT_ITEM_SERIAL_NO$> EQ '' then
|
||||
ValidationFailureReason = 'Unable to install Reactor Item No. ' : InstRINo : '. Serial Number cannot be blank to non-elevator Reactor Items.'
|
||||
end
|
||||
end
|
||||
// Only check first three characters so that ASM parts can be installed in an ASM+ reactor
|
||||
If (InstRIRec<REACT_ITEM_PART_TYPE$>[1, 3] NE ReactorType[1, 3]) then
|
||||
ValidationFailureReason = 'Unable to install Reactor Item No. ' : InstRINo : '. Reactor Type must match Reactor Item Part Type.'
|
||||
end
|
||||
Until ValidationFailureReason NE ''
|
||||
Next InstRINo
|
||||
|
||||
@ -147,9 +164,17 @@ PostReactItems:
|
||||
|
||||
obj_React_Item_Hist('Install',oriParms)
|
||||
|
||||
IF Get_Status(errCode) THEN
|
||||
|
||||
END
|
||||
IF Not(Get_Status(errCode)) THEN
|
||||
RIKey = InstRINos<1,I>
|
||||
RIRec = Xlate('REACT_ITEM', RIKey, '', 'X')
|
||||
RIType = RIRec<REACT_ITEM_RI_TYPE$>
|
||||
If RIType EQ 'S' then
|
||||
PktSize = Xlate('REACT_ITEM', RIKey, 'PKT_SIZE_DESC', 'X')
|
||||
PktQty = RIRec<REACT_ITEM_PKT_QTY$>
|
||||
Reactor_Services('SetWaferSize', ReactNo, PktSize)
|
||||
Reactor_Services('SetPocketQty', ReactNo, PktQty)
|
||||
end
|
||||
END
|
||||
END ;* End of LOCATE check for Install RI number already in the reactor
|
||||
|
||||
NEXT I
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -20,6 +20,7 @@ DECLARE SUBROUTINE obj_Clean_Insp, Btree.Extract, Send_Info, obj_WO_Wfr, ErrMsg,
|
||||
|
||||
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, NextKey, obj_Prod_Spec, Send_Dyn, obj_Clean_Insp
|
||||
DECLARE FUNCTION obj_RDS_Test, obj_Test_Point_Map, obj_Popup, obj_WO_Wfr, Logging_Services, Environment_Services
|
||||
Declare function Return_To_Fab_Services
|
||||
|
||||
$INSERT APP_INSERTS
|
||||
$INSERT REACT_RUN_EQUATES
|
||||
@ -262,6 +263,13 @@ END
|
||||
|
||||
LSKeys = ReactRunRec<REACT_RUN_RDS_LAYER_KEYS$>
|
||||
|
||||
OpenRTF = Return_To_Fab_Services('GetOpenReturnToFabRecordIdByCassId', RDSNo)
|
||||
|
||||
IF OpenRTF NE '' THEN
|
||||
Result = 'RTF' ;* Open RTF on WO_MAT *
|
||||
RETURN
|
||||
END
|
||||
|
||||
MetOutOfSpec = SUM(XLATE('RDS_LAYER',LSKeys,'TEST_OUT_OF_SPEC','X')) ;* Updated for Metrology update 4/16/2006 JCH
|
||||
|
||||
IF MetOutOfSpec > 0 THEN
|
||||
@ -2278,3 +2286,4 @@ END
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
@ -205,8 +205,6 @@ WriteRec:
|
||||
|
||||
IF TestRec = '' THEN
|
||||
DELETE TableVar,TableKey ELSE Null
|
||||
* ErrorMsg = 'Blank table rec with ':QUOTE(TableKey):' on ':QUOTE(TableName):' table.'; *added 4/9/21 for debugging
|
||||
* Set_FSError()
|
||||
END ELSE
|
||||
Set_Status(0)
|
||||
rv = Get_Status(errCode)
|
||||
@ -215,7 +213,6 @@ WriteRec:
|
||||
END ELSE
|
||||
ErrorMsg = 'Unable to write ':QUOTE(TableKey):' on ':QUOTE(TableName):' table.'
|
||||
END
|
||||
|
||||
END
|
||||
|
||||
If ( (TableName NE '') and (TableKey NE '') ) then
|
||||
@ -235,20 +232,9 @@ WriteRec:
|
||||
LogData<7> = 'Record self locked: ':Database_Services('IsKeyIDSelfLocked', TableName, TableKey)
|
||||
LogData<9> = 'Call stack: ':RetStack()
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||
|
||||
Recipients = ''
|
||||
SendFrom = 'System'
|
||||
Subject = 'obj_Tables("WriteRec") failed to release lock'
|
||||
AttachWindow = TableName
|
||||
AttachKey = TableKey
|
||||
SendToGroup = 'FI_SUPPORT'
|
||||
MessageParms = Recipients:@RM:SendFrom:@RM:Subject:@RM:UnlockError:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
|
||||
obj_Notes('Create',MessageParms)
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
END
|
||||
|
||||
RETURN
|
||||
|
@ -19,7 +19,7 @@ Compile Function obj_WM_Out(Method,Parms)
|
||||
|
||||
Declare Function Get_Status, Msg, Utility, obj_Tables, NextKey, obj_WO_Verify, obj_Prod_Spec, Send_Dyn, obj_RDS_Makeup
|
||||
Declare Function obj_RDS2, obj_WM_Out, Delete, Signature_Services, Environment_Services, Logging_Services
|
||||
Declare Function Database_Services, SRP_Array
|
||||
Declare Function Database_Services, SRP_Array, Return_To_Fab_Services
|
||||
Declare Subroutine Set_Status, Msg, obj_Tables, Send_Dyn, obj_WO_Step, obj_RDS_Layer, obj_RDS_Test, Btree.Extract
|
||||
Declare Subroutine Extract_SI_Keys, obj_WM_Out, obj_WO_Mat, obj_Post_Log, obj_WO_Mat_Log, ErrMsg, obj_WO_Wfr
|
||||
Declare Subroutine Logging_Services, Material_Services, Database_Services, Update_Index, Work_Order_Services
|
||||
@ -382,12 +382,18 @@ CurrStatus:
|
||||
CurrLocation = XLATE('WO_MAT',WOMatKey,'CURR_LOCATION','X')
|
||||
END
|
||||
|
||||
|
||||
IF WOMatRec<WO_MAT_HOLD$> = 1 AND WOMatRec<WO_MAT_HOLD_ENTITY$,1> = 'WM_OUT' THEN
|
||||
Result = 'HOLD' ;* Box is on Hold
|
||||
RETURN
|
||||
END
|
||||
|
||||
OpenRTF = Return_To_Fab_Services('GetOpenReturnToFabRecordIdByCassId', WMOutKey)
|
||||
|
||||
IF OpenRTF NE '' THEN
|
||||
Result = 'RTF' ;* Open RTF on WM_OUT *
|
||||
RETURN
|
||||
END
|
||||
|
||||
|
||||
IF WMOutRec<WM_OUT_SHIP_NO$> NE '' THEN
|
||||
Result = 'SHIP'
|
||||
@ -646,7 +652,12 @@ NextOpenSlots:
|
||||
IsMULot = WMOutRec EQ True$
|
||||
IsFQASigned = WMOutRec<WM_OUT_SUP_VER_SIG$> NE ''
|
||||
IsVoided = WMOutRec<WM_OUT_VOID$>
|
||||
If Not(IsMULot) AND Not(IsFQASigned) AND Not(IsVoided) then
|
||||
WOMatKey = WONo : '*' : CassNo
|
||||
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey, True$, 0, False$)
|
||||
WOMatHold = WOMatRec<WO_MAT_HOLD$>
|
||||
WOMatHoldEntity = WOMatRec<WO_MAT_HOLD_ENTITY$>
|
||||
IsOnHold = WOMatHold EQ True$ and WOMatHoldEntity EQ 'WM_OUT'
|
||||
If Not(IsMULot) AND Not(IsFQASigned) AND Not(IsVoided) AND Not(IsOnHold) then
|
||||
FOR N = SlotCnt TO 1 STEP -1
|
||||
IF WMOutRec<WM_OUT_SLOT_NO$,N> NE '' AND WMOutRec<WM_OUT_RDS$,N> = '' AND WMOutRec<WM_OUT_SLOT_NCR$,N> = '' AND WMOutRec<WM_OUT_UMW_CASS_ID$,N> = '' THEN
|
||||
|
||||
@ -1988,3 +1999,6 @@ ConvertCleanInsp:
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -28,7 +28,7 @@ Compile Function obj_WO_Mat(Method,Parms)
|
||||
Declare Function Get_Status, Msg, Utility, obj_Tables, Dialog_Box,NextKey, Popup, Get_Property, obj_RDS, RetStack
|
||||
Declare Function Database_Services, GaN_Services, Logging_Services, Environment_Services, Signature_Services
|
||||
Declare Function obj_WO_Mat, obj_WM_In, obj_WM_Out, obj_Prod_Spec, obj_Clean_Insp, obj_Calendar, obj_Popup
|
||||
Declare Function Error_Services, Memberof, Datetime, GetTickCount
|
||||
Declare Function Error_Services, Memberof, Datetime, GetTickCount, Return_To_Fab_Services
|
||||
Declare Subroutine Set_Status, Msg, obj_Tables, Send_Dyn, Btree.Extract, ErrMsg, Send_Dyn, RList, obj_WO_Log, Send_Event
|
||||
Declare Subroutine obj_RDS, Extract_SI_Keys, obj_Pend_Ship_Labels, obj_WO_Mat_QA, Work_Order_Services, Service_Services
|
||||
Declare Subroutine obj_notes, obj_Clean_Insp, obj_Post_Log, Send_Info, obj_WO_Mat_Log, obj_SAP, obj_WO_Mat, obj_WO_Wfr
|
||||
@ -664,13 +664,22 @@ CurrStatus:
|
||||
RETURN
|
||||
END
|
||||
|
||||
WMIKey = WOMatRec<WO_MAT_WMI_KEY$>
|
||||
WMOKey = WOMatRec<WO_MAT_WMO_KEY$>
|
||||
|
||||
OpenRTF = Return_To_Fab_Services('GetOpenReturnToFabRecordIdByCassId', WMOKey)
|
||||
|
||||
IF OpenRTF NE '' THEN
|
||||
Result = 'RTF' ;* Open RTF on WO_MAT *
|
||||
Result = Oconv(Result, '[WO_MAT_CURR_STATUS_CONV]')
|
||||
RETURN
|
||||
END
|
||||
|
||||
IF WOMatRec<WO_MAT_SHIP_NO$> NE '' THEN
|
||||
Result = 'SHIP'
|
||||
RETURN
|
||||
END
|
||||
|
||||
WMIKey = WOMatRec<WO_MAT_WMI_KEY$>
|
||||
WMOKey = WOMatRec<WO_MAT_WMO_KEY$>
|
||||
|
||||
LocCnt = COUNT(WOMatRec<WO_MAT_INV_LOCATION$>,@VM) + (WOMatRec<WO_MAT_INV_LOCATION$> NE '')
|
||||
|
||||
@ -3284,7 +3293,20 @@ ReportStatus:
|
||||
WMIStatus = WOMatRec<WO_MAT_WMI_CURR_STATUS$>
|
||||
WMOStatus = WOMatRec<WO_MAT_WMO_CURR_STATUS$>
|
||||
|
||||
IF WMOStatus = 'COMP' THEN
|
||||
|
||||
|
||||
OpenRTF = Return_To_Fab_Services('GetOpenReturnToFabRecordIdByCassId', RDSNo)
|
||||
If OpenRTF EQ '' then
|
||||
OpenRTF = Return_To_Fab_Services('GetOpenReturnToFabRecordIdByCassId', WMOKey)
|
||||
end
|
||||
|
||||
IF OpenRTF NE '' THEN
|
||||
Result = 'RTF' ;* Open RTF on WO_MAT *
|
||||
Result = Oconv(Result, '[WO_MAT_CURR_STATUS_CONV]')
|
||||
RETURN
|
||||
END
|
||||
|
||||
IF WMOStatus = 'COMP' THEN
|
||||
WMOStatus = obj_WO_Mat('CurrStatus',WOMatKey:@RM:WOMatRec)
|
||||
END
|
||||
|
||||
@ -5714,3 +5736,5 @@ ExpCOA:
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -14,7 +14,6 @@ COMPILE FUNCTION obj_WO_React(Method,Parms)
|
||||
|
||||
*/
|
||||
|
||||
|
||||
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, NextKey, obj_Prod_Spec, obj_WO_Mat_QA, GetTickCount
|
||||
Declare function Environment_Services, Database_Services
|
||||
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, RList, ErrMsg, Btree.Extract, obj_WO_Mat_QA, Mona_Services
|
||||
@ -70,222 +69,213 @@ RETURN Result
|
||||
AddRdsNo:
|
||||
* * * * * * *
|
||||
|
||||
StartTick = GetTickCount()
|
||||
MetricName = 'AddRdsNo'
|
||||
StartTick = GetTickCount()
|
||||
MetricName = 'AddRdsNo'
|
||||
|
||||
WONo = Parms[1,@RM]
|
||||
StepNo = Parms[COL2()+1,@RM]
|
||||
ReactNo = Parms[COL2()+1,@RM]
|
||||
RdsNo = Parms[COL2()+1,@RM]
|
||||
CassNo = Parms[COL2()+1,@RM]
|
||||
WONo = Parms[1,@RM]
|
||||
StepNo = Parms[COL2()+1,@RM]
|
||||
ReactNo = Parms[COL2()+1,@RM]
|
||||
RdsNo = Parms[COL2()+1,@RM]
|
||||
CassNo = Parms[COL2()+1,@RM]
|
||||
|
||||
IF WONo = '' THEN RETURN
|
||||
IF StepNo = '' THEN RETURN
|
||||
IF ReactNo = '' THEN RETURN
|
||||
IF RdsNo = '' THEN RETURN
|
||||
IF CassNo = '' THEN RETURN
|
||||
IF WONo = '' THEN RETURN
|
||||
IF StepNo = '' THEN RETURN
|
||||
IF ReactNo = '' THEN RETURN
|
||||
IF RdsNo = '' THEN RETURN
|
||||
IF CassNo = '' THEN RETURN
|
||||
|
||||
WOReactKey = WONo:'*':StepNo:'*':ReactNo
|
||||
|
||||
otParms = 'WO_REACT':@RM:WOReactKey
|
||||
|
||||
WOReactRec = obj_Tables('ReadOnlyRec',otParms)
|
||||
RDSNos = WOReactRec<WO_REACT_RDS_NO$>
|
||||
CassNos = WOReactRec<WO_REACT_CASS_NO$>
|
||||
|
||||
PSNos = XLATE('WO_LOG',WoNo,'PROD_VER_STEP_PSN','X')
|
||||
PSNo = PSNos<1,StepNo>
|
||||
|
||||
QAMetData = obj_Prod_Spec('GetQAMet',PSNo:@RM:@RM:1) ;* * * Get Reactor Scheduled QA Metrology * * *
|
||||
|
||||
IF QAMetData = '' THEN RETURN ;* No reactor scheduled QA_MET specified
|
||||
|
||||
Start = QAMetData<COL$QA_MET_START>
|
||||
Interval = QAMetData<COL$QA_MET_INTERVAL>
|
||||
Stage = QAMetData<COL$QA_MET_STAGE>
|
||||
MetPropCd = QAMetData<COL$QA_MET_PROP>
|
||||
GOSUB BuildAllTestPos ;* Set RDSNos, Start and Interval -> returns AllTestPos
|
||||
|
||||
* * * Find where the the RDS being added will be in the list. * * *
|
||||
|
||||
LOCATE RDSNo IN WOReactRec<WO_REACT_RDS_NO$> USING @VM SETTING InsPos THEN
|
||||
WOReactKey = WONo:'*':StepNo:'*':ReactNo
|
||||
|
||||
otParms = 'WO_REACT':@RM:WOReactKey
|
||||
WOReactRec = obj_Tables('UnlockRec',otParms)
|
||||
|
||||
RETURN ;* RDSNo already in this list -> nothing to do.
|
||||
WOReactRec = obj_Tables('ReadOnlyRec',otParms)
|
||||
RDSNos = WOReactRec<WO_REACT_RDS_NO$>
|
||||
CassNos = WOReactRec<WO_REACT_CASS_NO$>
|
||||
|
||||
END ELSE
|
||||
PSNos = XLATE('WO_LOG',WoNo,'PROD_VER_STEP_PSN','X')
|
||||
PSNo = PSNos<1,StepNo>
|
||||
|
||||
LOCATE InsPos IN AllTestPos USING @VM SETTING TrimPos ELSE Null
|
||||
|
||||
QAMetData = obj_Prod_Spec('GetQAMet',PSNo:@RM:@RM:1) ;* * * Get Reactor Scheduled QA Metrology * * *
|
||||
|
||||
IF QAMetData = '' THEN RETURN ;* No reactor scheduled QA_MET specified
|
||||
|
||||
Start = QAMetData<COL$QA_MET_START>
|
||||
Interval = QAMetData<COL$QA_MET_INTERVAL>
|
||||
Stage = QAMetData<COL$QA_MET_STAGE>
|
||||
MetPropCd = QAMetData<COL$QA_MET_PROP>
|
||||
GOSUB BuildAllTestPos ;* Set RDSNos, Start and Interval -> returns AllTestPos
|
||||
|
||||
* * * Find where the the RDS being added will be in the list. * * *
|
||||
|
||||
LOCATE RDSNo IN WOReactRec<WO_REACT_RDS_NO$> USING @VM SETTING InsPos THEN
|
||||
|
||||
otParms = 'WO_REACT':@RM:WOReactKey
|
||||
WOReactRec = obj_Tables('UnlockRec',otParms)
|
||||
|
||||
RETURN ;* RDSNo already in this list -> nothing to do.
|
||||
|
||||
END ELSE
|
||||
|
||||
LOCATE InsPos IN AllTestPos USING @VM SETTING TrimPos ELSE Null
|
||||
|
||||
ChangePosList = FIELD(AllTestPos,@VM,TrimPos,SeqCnt)
|
||||
GOSUB RemSchedQA ;* Removes unsigned QAMet from cassettes scheduled past the box being removed
|
||||
|
||||
END
|
||||
|
||||
WOReactRec = INSERT(WOReactRec,WO_REACT_RDS_NO$,InsPos,0,RDSNo)
|
||||
WOReactRec = INSERT(WOReactRec,WO_REACT_CASS_NO$,InsPos,0,CassNo) ;* Inserts the passed in RDSNo & associated cassette number from the data fields
|
||||
|
||||
RDSNos = WOReactRec<WO_REACT_RDS_NO$> ;* List after insert
|
||||
CassNos = WOReactRec<WO_REACT_CASS_NO$> ;* List after insert
|
||||
|
||||
* * * Now build list for cassette
|
||||
|
||||
GOSUB BuildAllTestPos
|
||||
ChangePosList = FIELD(AllTestPos,@VM,TrimPos,SeqCnt)
|
||||
GOSUB RemSchedQA ;* Removes unsigned QAMet from cassettes scheduled past the box being removed
|
||||
|
||||
END
|
||||
// Add QAMet spec data to cassettes now associated with the test
|
||||
// positions after removing the RDS & Cassno from the lists
|
||||
GOSUB AddSchedQA
|
||||
|
||||
WOReactRec = INSERT(WOReactRec,WO_REACT_RDS_NO$,InsPos,0,RDSNo)
|
||||
WOReactRec = INSERT(WOReactRec,WO_REACT_CASS_NO$,InsPos,0,CassNo) ;* Inserts the passed in RDSNo & associated cassette number from the data fields
|
||||
otParms = FIELDSTORE(otParms,@RM,4,0,WOReactRec)
|
||||
// Done with updates to the WO_REACT record
|
||||
obj_Tables('WriteOnlyRec',otParms)
|
||||
|
||||
RDSNos = WOReactRec<WO_REACT_RDS_NO$> ;* List after insert
|
||||
CassNos = WOReactRec<WO_REACT_CASS_NO$> ;* List after insert
|
||||
Result = Log
|
||||
|
||||
* * * Now build list for cassette
|
||||
|
||||
GOSUB BuildAllTestPos
|
||||
ChangePosList = FIELD(AllTestPos,@VM,TrimPos,SeqCnt)
|
||||
|
||||
GOSUB AddSchedQA ;* Add QAMet spec data to cassettes now associated with the test positions after removing the RDS & Cassno from the lists
|
||||
|
||||
otParms = FIELDSTORE(otParms,@RM,4,0,WOReactRec)
|
||||
obj_Tables('WriteOnlyRec',otParms) ;* Done with updates to the WO_REACT record
|
||||
|
||||
Result = Log
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
* * * * * * *
|
||||
RemRDSNo:
|
||||
* * * * * * *
|
||||
|
||||
StartTick = GetTickCount()
|
||||
MetricName = 'RemRDSNo'
|
||||
StartTick = GetTickCount()
|
||||
MetricName = 'RemRDSNo'
|
||||
|
||||
WONo = Parms[1,@RM]
|
||||
StepNo = Parms[COL2()+1,@RM]
|
||||
ReactNo = Parms[COL2()+1,@RM]
|
||||
RdsNo = Parms[COL2()+1,@RM]
|
||||
CassNo = Parms[COL2()+1,@RM]
|
||||
WONo = Parms[1,@RM]
|
||||
StepNo = Parms[COL2()+1,@RM]
|
||||
ReactNo = Parms[COL2()+1,@RM]
|
||||
RdsNo = Parms[COL2()+1,@RM]
|
||||
CassNo = Parms[COL2()+1,@RM]
|
||||
|
||||
IF WONo = '' THEN RETURN
|
||||
IF StepNo = '' THEN RETURN
|
||||
IF ReactNo = '' THEN RETURN
|
||||
IF RdsNo = '' THEN RETURN
|
||||
IF CassNo = '' THEN RETURN
|
||||
IF WONo = '' THEN RETURN
|
||||
IF StepNo = '' THEN RETURN
|
||||
IF ReactNo = '' THEN RETURN
|
||||
IF RdsNo = '' THEN RETURN
|
||||
IF CassNo = '' THEN RETURN
|
||||
|
||||
WOReactKey = WONo:'*':StepNo:'*':ReactNo
|
||||
WOReactKey = WONo:'*':StepNo:'*':ReactNo
|
||||
|
||||
otParms = 'WO_REACT':@RM:WOReactKey
|
||||
// 10/12/18 Changed to ReadOnlyRec as per Francois' instructions. - djs
|
||||
WOReactRec = obj_Tables('ReadOnlyRec',otParms)
|
||||
otParms = 'WO_REACT':@RM:WOReactKey
|
||||
|
||||
WOReactRec = obj_Tables('ReadOnlyRec',otParms)
|
||||
|
||||
RDSNos = WOReactRec<WO_REACT_RDS_NO$>
|
||||
CassNos = WOReactRec<WO_REACT_CASS_NO$>
|
||||
RDSNos = WOReactRec<WO_REACT_RDS_NO$>
|
||||
CassNos = WOReactRec<WO_REACT_CASS_NO$>
|
||||
|
||||
PSNos = XLATE('WO_LOG',WoNo,'PROD_VER_STEP_PSN','X')
|
||||
PSNo = PSNos<1,StepNo>
|
||||
PSNos = XLATE('WO_LOG',WoNo,'PROD_VER_STEP_PSN','X')
|
||||
PSNo = PSNos<1,StepNo>
|
||||
|
||||
QAMetData = obj_Prod_Spec('GetQAMet',PSNo:@RM:@RM:1) ;* * * Get Reactor Scheduled QA Metrology * * *
|
||||
QAMetData = obj_Prod_Spec('GetQAMet',PSNo:@RM:@RM:1) ;* * * Get Reactor Scheduled QA Metrology * * *
|
||||
|
||||
Start = QAMetData<COL$QA_MET_START>
|
||||
Interval = QAMetData<COL$QA_MET_INTERVAL>
|
||||
Stage = QAMetData<COL$QA_MET_STAGE>
|
||||
MetPropCd = QAMetData<COL$QA_MET_PROP>
|
||||
Start = QAMetData<COL$QA_MET_START>
|
||||
Interval = QAMetData<COL$QA_MET_INTERVAL>
|
||||
Stage = QAMetData<COL$QA_MET_STAGE>
|
||||
MetPropCd = QAMetData<COL$QA_MET_PROP>
|
||||
|
||||
GOSUB BuildAllTestPos ;* Set RDSNos, Start and Interval -> returns AllTestPos
|
||||
GOSUB BuildAllTestPos ;* Set RDSNos, Start and Interval -> returns AllTestPos
|
||||
|
||||
IF AllTestPos NE '' THEN
|
||||
IF AllTestPos NE '' THEN
|
||||
|
||||
* * * Find where the the RDS being removed is in the list. * * *
|
||||
* * * Find where the the RDS being removed is in the list. * * *
|
||||
|
||||
LOCATE RDSNo IN WOReactRec<WO_REACT_RDS_NO$> USING @VM SETTING RemPos THEN
|
||||
LOCATE RDSNo IN WOReactRec<WO_REACT_RDS_NO$> USING @VM SETTING RemPos THEN
|
||||
|
||||
LOCATE RemPos IN AllTestPos USING @VM SETTING TrimPos ELSE Null
|
||||
|
||||
ChangePosList = FIELD(AllTestPos,@VM,TrimPos,SeqCnt)
|
||||
|
||||
GOSUB RemSchedQA ;* Removes unsigned QAMet from cassettes scheduled past the box being removed
|
||||
END ELSE
|
||||
|
||||
otParms = 'WO_REACT':@RM:WOReactKey
|
||||
WOReactRec = obj_Tables('UnlockRec',otParms)
|
||||
LOCATE RemPos IN AllTestPos USING @VM SETTING TrimPos ELSE Null
|
||||
|
||||
ChangePosList = FIELD(AllTestPos,@VM,TrimPos,SeqCnt)
|
||||
|
||||
GOSUB RemSchedQA ;* Removes unsigned QAMet from cassettes scheduled past the box being removed
|
||||
END ELSE
|
||||
|
||||
otParms = 'WO_REACT':@RM:WOReactKey
|
||||
WOReactRec = obj_Tables('UnlockRec',otParms)
|
||||
|
||||
RETURN ;* RDSNo is not in this list -> nothing to do.
|
||||
END
|
||||
END ;* End of check for AllTestPos null
|
||||
RETURN ;* RDSNo is not in this list -> nothing to do.
|
||||
END
|
||||
END ;* End of check for AllTestPos null
|
||||
|
||||
WOReactRec = DELETE(WOReactRec,WO_REACT_RDS_NO$,RemPos,0)
|
||||
WOReactRec = DELETE(WOReactRec,WO_REACT_CASS_NO$,RemPos,0) ;* Removes the passed in RDSNo & associated cassette number from the data fields
|
||||
WOReactRec = DELETE(WOReactRec,WO_REACT_RDS_NO$,RemPos,0)
|
||||
WOReactRec = DELETE(WOReactRec,WO_REACT_CASS_NO$,RemPos,0) ;* Removes the passed in RDSNo & associated cassette number from the data fields
|
||||
|
||||
RDSNos = WOReactRec<WO_REACT_RDS_NO$> ;* List after removal
|
||||
CassNos = WOReactRec<WO_REACT_CASS_NO$> ;* List after removal
|
||||
RDSNos = WOReactRec<WO_REACT_RDS_NO$> ;* List after removal
|
||||
CassNos = WOReactRec<WO_REACT_CASS_NO$> ;* List after removal
|
||||
|
||||
* * * Now build list for cassette
|
||||
|
||||
GOSUB BuildAllTestPos
|
||||
ChangePosList = FIELD(AllTestPos,@VM,TrimPos,SeqCnt)
|
||||
* * * Now build list for cassette
|
||||
|
||||
GOSUB BuildAllTestPos
|
||||
ChangePosList = FIELD(AllTestPos,@VM,TrimPos,SeqCnt)
|
||||
|
||||
GOSUB AddSchedQA ;* Add QAMet spec data to cassettes now associated with the test positions after removing the RDS & Cassno from the lists
|
||||
otParms = FIELDSTORE(otParms,@RM,4,0,WOReactRec)
|
||||
// 10/12/18 Changed to WriteOnlyRec as per Francois' instructions. - djs
|
||||
obj_Tables('WriteOnlyRec',otParms) ;* Done with updates to the WO_REACT record
|
||||
GOSUB AddSchedQA ;* Add QAMet spec data to cassettes now associated with the test positions after removing the RDS & Cassno from the lists
|
||||
otParms = FIELDSTORE(otParms,@RM,4,0,WOReactRec)
|
||||
|
||||
Result = Log
|
||||
obj_Tables('WriteOnlyRec',otParms) ;* Done with updates to the WO_REACT record
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
Result = Log
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
************** Internal Methods *************
|
||||
|
||||
* * * * * * *
|
||||
BuildAllTestPos:
|
||||
* * * * * * *
|
||||
|
||||
AllTestPos = ''
|
||||
AllTestPos = ''
|
||||
|
||||
RDSCnt = COUNT(RDSNos,@VM) + (RDSNos NE '')
|
||||
SeqCnt = 0
|
||||
RDSCnt = COUNT(RDSNos,@VM) + (RDSNos NE '')
|
||||
SeqCnt = 0
|
||||
|
||||
|
||||
FOR TestSeq = 1 TO RDSCnt
|
||||
IF REM((TestSeq - Start),Interval) = 0 THEN
|
||||
AllTestPos<1,-1> = TestSeq ;* Build list of list positions to have QAMet scheduled
|
||||
SeqCnt += 1
|
||||
END
|
||||
NEXT TestSeq
|
||||
FOR TestSeq = 1 TO RDSCnt
|
||||
IF REM((TestSeq - Start),Interval) = 0 THEN
|
||||
AllTestPos<1,-1> = TestSeq ;* Build list of list positions to have QAMet scheduled
|
||||
SeqCnt += 1
|
||||
END
|
||||
NEXT TestSeq
|
||||
|
||||
Log := 'AllTestPos: ':AllTestPos:@FM
|
||||
Log := 'AllTestPos: ':AllTestPos:@FM
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
* * * * * * *
|
||||
RemSchedQA:
|
||||
* * * * * * *
|
||||
|
||||
chgCnt = COUNT(ChangePosList,@VM) + (ChangePosList NE '')
|
||||
chgCnt = COUNT(ChangePosList,@VM) + (ChangePosList NE '')
|
||||
|
||||
FOR I = 1 TO chgCnt
|
||||
RemCassNo = CassNos<1,ChangePoslist<1,I>>
|
||||
Log:= 'RemSched on CassNo: ':RemCassNo:@FM
|
||||
|
||||
owmParms = WONo:@RM:StepNo:@RM:RemCassNo:@RM:Stage:@RM:MetPropCd
|
||||
|
||||
obj_WO_Mat_QA('RemQAMet',owmParms) ;* Unschedule test boxes before list change
|
||||
|
||||
IF Get_Status(errCode) THEN
|
||||
ErrMsg(errCode)
|
||||
END
|
||||
|
||||
|
||||
*obj_WO_Mat('RemQAMet',owmParms) ;* Dead 6/5/2015 JCH - Remove after a few days
|
||||
|
||||
*IF Get_Status(errCode) THEN
|
||||
* ErrMsg(errCode)
|
||||
*END
|
||||
NEXT I
|
||||
FOR I = 1 TO chgCnt
|
||||
RemCassNo = CassNos<1,ChangePoslist<1,I>>
|
||||
Log:= 'RemSched on CassNo: ':RemCassNo:@FM
|
||||
|
||||
owmParms = WONo:@RM:StepNo:@RM:RemCassNo:@RM:Stage:@RM:MetPropCd
|
||||
|
||||
obj_WO_Mat_QA('RemQAMet',owmParms) ;* Unschedule test boxes before list change
|
||||
|
||||
IF Get_Status(errCode) THEN
|
||||
ErrMsg(errCode)
|
||||
END
|
||||
|
||||
NEXT I
|
||||
|
||||
RETURN
|
||||
|
||||
@ -294,47 +284,39 @@ RETURN
|
||||
AddSchedQA:
|
||||
* * * * * * *
|
||||
|
||||
chgCnt = COUNT(ChangePosList,@VM) + (ChangePosList NE '')
|
||||
chgCnt = COUNT(ChangePosList,@VM) + (ChangePosList NE '')
|
||||
|
||||
FOR I = 1 TO chgCnt
|
||||
AddCassNo = CassNos<1,ChangePoslist<1,I>>
|
||||
|
||||
Log:= 'AddSched on CassNo: ':AddCassNo:@FM
|
||||
|
||||
owmParms = WONo:@RM
|
||||
owmParms := StepNo:@RM
|
||||
owmParms := AddCassNo:@RM
|
||||
owmParms := QAMetData<COL$QA_MET_STAGE>:@RM
|
||||
owmParms := QAMetData<COL$QA_MET_TEST>:@RM
|
||||
owmParms := QAMetData<COL$QA_MET_PROP>:@RM
|
||||
owmParms := QAMetData<COL$QA_MET_TOOL_CLASS>:@RM
|
||||
owmParms := QAMetData<COL$QA_MET_MIN>:@RM
|
||||
owmParms := QAMetData<COL$QA_MET_MAX>:@RM
|
||||
owmParms := QAMetData<COL$QA_MET_SLOT>:@RM
|
||||
owmParms := QAMetData<COL$QA_MET_RECIPE>:@RM
|
||||
owmParms := QAMetData<COL$QA_MET_RECIPE_PATTERN>:@RM
|
||||
owmParms := QAMetData<COL$QA_MET_WFR_QTY>:@RM
|
||||
owmParms := QAMetData<COL$QA_MET_WFR_TYPE>:@RM
|
||||
owmParms := QAMetData<COL$QA_MET_REACT_SCHED>:@RM
|
||||
owmParms := QAMetData<COL$QA_MET_SHIP_DOC>:@RM
|
||||
owmParms := QAMetData<COL$QA_MET_PHASE_MIN> ; // 10/15/18 - djs - Added Phase Min Spec for HgCV
|
||||
|
||||
|
||||
obj_WO_Mat_QA('AddQAMet', owmParms) ;* Schedule test boxes after list change
|
||||
|
||||
IF Get_Status(errCode) THEN
|
||||
ErrMsg(errCode)
|
||||
END
|
||||
|
||||
*obj_WO_Mat('AddQAMet',owmParms) ;* Dead 6/5/2015 JCH - remove after a few days
|
||||
|
||||
*IF Get_Status(errCode) THEN
|
||||
* ErrMsg(errCode)
|
||||
*END
|
||||
|
||||
|
||||
|
||||
NEXT I
|
||||
FOR I = 1 TO chgCnt
|
||||
AddCassNo = CassNos<1,ChangePoslist<1,I>>
|
||||
|
||||
Log:= 'AddSched on CassNo: ':AddCassNo:@FM
|
||||
|
||||
owmParms = WONo:@RM
|
||||
owmParms := StepNo:@RM
|
||||
owmParms := AddCassNo:@RM
|
||||
owmParms := QAMetData<COL$QA_MET_STAGE>:@RM
|
||||
owmParms := QAMetData<COL$QA_MET_TEST>:@RM
|
||||
owmParms := QAMetData<COL$QA_MET_PROP>:@RM
|
||||
owmParms := QAMetData<COL$QA_MET_TOOL_CLASS>:@RM
|
||||
owmParms := QAMetData<COL$QA_MET_MIN>:@RM
|
||||
owmParms := QAMetData<COL$QA_MET_MAX>:@RM
|
||||
owmParms := QAMetData<COL$QA_MET_SLOT>:@RM
|
||||
owmParms := QAMetData<COL$QA_MET_RECIPE>:@RM
|
||||
owmParms := QAMetData<COL$QA_MET_RECIPE_PATTERN>:@RM
|
||||
owmParms := QAMetData<COL$QA_MET_WFR_QTY>:@RM
|
||||
owmParms := QAMetData<COL$QA_MET_WFR_TYPE>:@RM
|
||||
owmParms := QAMetData<COL$QA_MET_REACT_SCHED>:@RM
|
||||
owmParms := QAMetData<COL$QA_MET_SHIP_DOC>:@RM
|
||||
owmParms := QAMetData<COL$QA_MET_PHASE_MIN> ; // 10/15/18 - djs - Added Phase Min Spec for HgCV
|
||||
|
||||
|
||||
obj_WO_Mat_QA('AddQAMet', owmParms) ;* Schedule test boxes after list change
|
||||
|
||||
IF Get_Status(errCode) THEN
|
||||
ErrMsg(errCode)
|
||||
END
|
||||
|
||||
NEXT I
|
||||
|
||||
RETURN
|
||||
|
||||
|
@ -117,11 +117,24 @@ API oiwizard.POST
|
||||
ParseResponse = SRP_JSON(hWizardJSON, 'PARSE', WizardJSON)
|
||||
If (ParseResponse EQ '') then
|
||||
// Validate credentials and create a new session
|
||||
UserID = SRP_JSON(hWizardJSON, 'GetValue', 'userID')
|
||||
Password = SRP_JSON(hWizardJSON, 'GetValue', 'password')
|
||||
UserID = SRP_JSON(hWizardJSON, 'GetValue', 'userID')
|
||||
Password = SRP_JSON(hWizardJSON, 'GetValue', 'password')
|
||||
ADUsername = SRP_JSON(hWizardJSON, 'GetValue', 'adUsername')
|
||||
SRP_JSON(hWizardJSON, 'Release')
|
||||
Authenticated = Active_Directory_Services('AuthenticateUser', UserID, Password, 'Infineon')
|
||||
If Authenticated then
|
||||
Domain = 'Infineon'
|
||||
Begin Case
|
||||
Case ( (UserID NE '') and (Password NE '') )
|
||||
Authenticated = Active_Directory_Services('AuthenticateUser', UserID, Password, Domain)
|
||||
Authorized = Active_Directory_Services('AuthorizeUser', UserID, Domain)
|
||||
Case (ADUsername NE '')
|
||||
Authenticated = True$
|
||||
Authorized = Active_Directory_Services('AuthorizeUser', ADUsername, Domain)
|
||||
If Authorized then UserId = ADUsername
|
||||
Case Otherwise$
|
||||
Authenticated = False$
|
||||
Authorized = False$
|
||||
End Case
|
||||
If Authenticated and Authorized then
|
||||
LSLUserID = Security_Services('GetLSLUser', UserID)
|
||||
If LSLUserID NE '' then
|
||||
OIWizardID = OI_Wizard_Services('CreateWizardID', LSLUserID)
|
||||
@ -235,3 +248,4 @@ API oiwizard.checkidleoisessionvalid.GET
|
||||
end
|
||||
|
||||
end api
|
||||
|
||||
|
@ -450,11 +450,7 @@ Main:
|
||||
lsData<I,7> = PropRec<PRS_PROP_TOOL$>
|
||||
lsData<I,8> = PropRec<PRS_PROP_MET_WFR_TYPE$>
|
||||
lsData<I,9> = PropRec<PRS_PROP_MET_RECIPE$>
|
||||
If (PropRec<PRS_PROP_TOOL$> _NEC 'HgCV') then
|
||||
lsData<I,10> = PropRec<PRS_PROP_MET_RECIPE_PATTERN$>
|
||||
end else
|
||||
lsData<I,10> = ''
|
||||
end
|
||||
lsData<I,10> = PropRec<PRS_PROP_MET_RECIPE_PATTERN$>
|
||||
lsData<I,11> = PropRec<PRS_PROP_MET_INTERVAL$>
|
||||
lsData<I,12> = PropRec<PRS_PROP_PROVEIN_WFR_TYPE$>
|
||||
|
||||
@ -468,11 +464,7 @@ Main:
|
||||
lsData<I,7> = lsData<I,7>:CRLF$:PropRec<PRS_PROP_TOOL$>
|
||||
lsData<I,8> = lsData<I,8>:CRLF$:PropRec<PRS_PROP_MET_WFR_TYPE$>
|
||||
lsData<I,9> = lsData<I,9>:CRLF$:PropRec<PRS_PROP_MET_RECIPE$>
|
||||
If (PropRec<PRS_PROP_TOOL$> _NEC 'HgCV') then
|
||||
lsData<I,10> = lsData<I,10>:CRLF$:PropRec<PRS_PROP_MET_RECIPE_PATTERN$>
|
||||
end else
|
||||
lsData<I,10> = lsData<I,10>:CRLF$
|
||||
end
|
||||
lsData<I,10> = lsData<I,10>:CRLF$:PropRec<PRS_PROP_MET_RECIPE_PATTERN$>
|
||||
lsData<I,11> = lsData<I,11>:CRLF$:PropRec<PRS_PROP_MET_INTERVAL$>
|
||||
lsData<I,12> = lsData<I,12>:CRLF$:PropRec<PRS_PROP_PROVEIN_WFR_TYPE$>
|
||||
|
||||
@ -840,14 +832,10 @@ Main:
|
||||
end else
|
||||
colData<StepNo,STEP_PRODUCT$> = CHAR(185):obj_Met_Prop('GetPropDesc',StageRec<PRS_STAGE_MET_PROP$,M>)
|
||||
end
|
||||
If (StageRec<PRS_STAGE_MET_TOOL_CLASS$,M> _NEC 'HgCV') then
|
||||
colData<StepNo,STEP_RECIPE$> = StageRec<PRS_STAGE_MET_RECIPE$,M>:CRLF$:StageRec<PRS_STAGE_MET_RECIPE_PATTERN$,M>
|
||||
end else
|
||||
colData<StepNo,STEP_RECIPE$> = StageRec<PRS_STAGE_MET_RECIPE$,M>
|
||||
end
|
||||
colData<StepNo,STEP_SPEC_TOL$> = StageRec<PRS_STAGE_MET_MIN$,M>:' - ':StageRec<PRS_STAGE_MET_MAX$,M>:' ':obj_Met_Prop('GetUnitsDesc',StageRec<PRS_STAGE_MET_PROP$,M>)
|
||||
colData<StepNo,STEP_SIZE$> = StageRec<PRS_STAGE_MET_WFR_QTY$,M>
|
||||
colData<StepNo,STEP_FREQ$> = StageRec<PRS_STAGE_MET_INTERVAL$,M>
|
||||
colData<StepNo,STEP_RECIPE$> = StageRec<PRS_STAGE_MET_RECIPE$,M>:CRLF$:StageRec<PRS_STAGE_MET_RECIPE_PATTERN$,M>
|
||||
colData<StepNo,STEP_SPEC_TOL$> = StageRec<PRS_STAGE_MET_MIN$,M>:' - ':StageRec<PRS_STAGE_MET_MAX$,M>:' ':obj_Met_Prop('GetUnitsDesc',StageRec<PRS_STAGE_MET_PROP$,M>)
|
||||
colData<StepNo,STEP_SIZE$> = StageRec<PRS_STAGE_MET_WFR_QTY$,M>
|
||||
colData<StepNo,STEP_FREQ$> = StageRec<PRS_STAGE_MET_INTERVAL$,M>
|
||||
if processName EQ 'FQA' then
|
||||
colData<StepNo,STEP_CTRL_METHOD$> = "WI"
|
||||
colData<StepNo,STEP_REACT_PLAN$> = "EpiMSA WI-0485"
|
||||
|
@ -28,7 +28,7 @@ OPEN 'REACTOR_LOG' TO ReactLogTable ELSE
|
||||
RETURN
|
||||
END
|
||||
|
||||
OPEN 'DICT.REACTOR_LOG' TO @DICT ELSE
|
||||
OPEN 'DICT.REACTOR_LOG' TO hReactLogDict ELSE
|
||||
ErrorMsg = 'Unable to open "DICT.Reactor_LOG" table.'
|
||||
ErrMsg(ErrorTitle:@SVM:ErrorMsg)
|
||||
RETURN
|
||||
@ -430,3 +430,4 @@ END
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
@ -11,6 +11,7 @@ $insert recipe_layer_info_equ
|
||||
$insert msg_equates
|
||||
$insert logical
|
||||
$insert shipping_info_equ
|
||||
$insert TOOL_CLASS_EQUATES
|
||||
|
||||
equ CrLf$ to char(13):char(10)
|
||||
|
||||
@ -19,10 +20,10 @@ declare function memberof, scroll_enable
|
||||
ReturnVar = 0
|
||||
declare function set_property, fieldcount, get_property, msg, editcell, send_event, dialog_box
|
||||
declare subroutine create_note
|
||||
Branches = 'LOAD_SURFACE_DEF,SET_MEASURE,LOAD_TOOL_RECIPE,SURFSCAN_CLICK,VALIDATE_DOPANT,VALIDATE_MINMAX,SET_SCANNED_IMAGE,VALIDATE_RECIPE,AKRION_RECIPE_CHECK,TW_TYPE_CHECK'
|
||||
Branches = 'LOAD_SURFACE_DEF,SET_MEASURE,LOAD_TOOL_RECIPE,LOAD_TOOL_PATTERN,SURFSCAN_CLICK,VALIDATE_DOPANT,VALIDATE_MINMAX,SET_SCANNED_IMAGE,VALIDATE_RECIPE,AKRION_RECIPE_CHECK,TW_TYPE_CHECK'
|
||||
convert ',' to @fm in Branches
|
||||
locate Branch in Branches using @fm setting Bpos then
|
||||
on Bpos gosub load_surface_def, set_measure, load_tool_recipe, surfscan_click, validate_dopant, validate_minmax, set_scanned_image, validate_recipe, akrion_recipe_check, tw_type_check
|
||||
on Bpos gosub load_surface_def, set_measure, load_tool_recipe, load_tool_pattern, surfscan_click, validate_dopant, validate_minmax, set_scanned_image, validate_recipe, akrion_recipe_check, tw_type_check
|
||||
end else
|
||||
Void = msg( '', 'Invalid Branch ':Bpos:' passed to prod_spec_comm' )
|
||||
end
|
||||
@ -111,13 +112,24 @@ return
|
||||
LOAD_TOOL_RECIPE:
|
||||
Tool = get_property( @window:'.TOOL', 'TEXT' )
|
||||
convert @lower_case to @upper_case in Tool
|
||||
RecipeList = xlate( 'LISTBOX_CONFIG', Tool:'_RECIPES', '', 'X' )
|
||||
RecipeList = xlate( 'TOOL_CLASS', Tool, TOOL_CLASS_RECIPES$, 'X' )
|
||||
convert @vm to @fm in RecipeList
|
||||
if RecipeList <> '' then
|
||||
Void = set_property( @window:'.RECIPE', 'LIST', RecipeList )
|
||||
end
|
||||
return
|
||||
*============================================================================*
|
||||
*============================================================================*
|
||||
LOAD_TOOL_PATTERN:
|
||||
Tool = get_property( @window:'.TOOL', 'TEXT' )
|
||||
convert @lower_case to @upper_case in Tool
|
||||
PatternList = Xlate('TOOL_CLASS', Tool, TOOL_CLASS_PATTERN$, 'X')
|
||||
CONVERT @VM To @FM IN PatternList
|
||||
If PatternList Ne '' Then
|
||||
Void = Set_Property(@Window:'.PATTERN', 'LIST', PatternList)
|
||||
End
|
||||
return
|
||||
*============================================================================*
|
||||
SURFSCAN_CLICK:
|
||||
CtrlToUse = get_property( @window, '@SurfScanCtl' )
|
||||
if get_property( @window:'.':CtrlToUse, 'CHECK' ) then
|
||||
|
@ -34,11 +34,12 @@ $Insert QA_MET_EQUATES
|
||||
$Insert RDS_TEST_EQUATES
|
||||
$Insert RDS_TEST_PROP_EQUATES
|
||||
$Insert PRS_LAYER_EQU
|
||||
$Insert PRS_PROP_EQUATES
|
||||
|
||||
Options SpecTypes = 'CLEAN', 'SURFSCAN', 'THICK', 'THICKA', 'RES', 'SRES', 'CRES', 'CONC'
|
||||
|
||||
Declare function Database_Services, Psn_Services, obj_Prod_Spec, Error_Services, SRP_JSON, Cust_Epi_Part_Services
|
||||
Declare function Prod_Ver_Services, PRS_Stage_Services, SRP_Array
|
||||
Declare function Prod_Ver_Services, PRS_Stage_Services, SRP_Array, Tool_Class_Services
|
||||
Declare subroutine Database_Services, Psn_Services, Error_Services, SRP_JSON, Extract_Si_Keys
|
||||
|
||||
GoToService else
|
||||
@ -104,6 +105,77 @@ Service GetRecipes(PSNo)
|
||||
|
||||
end service
|
||||
|
||||
Service GetMetrologyRecipesAndPatterns(PSNo)
|
||||
|
||||
ErrorMsg = ''
|
||||
RecipesAndPatterns = ''
|
||||
CurrIdx = 1
|
||||
If PSNo NE '' then
|
||||
If RowExists('PROD_SPEC', PSNo) then
|
||||
PropKeys = ''
|
||||
Extract_Si_Keys('PRS_PROP', 'PS_NO', PSNo, PropKeys)
|
||||
for each PropKey in PropKeys using @VM setting pPos
|
||||
Recipe = Xlate('PRS_PROP', PropKey, PRS_PROP_RECIPE$, 'X')
|
||||
Pattern = Xlate('PRS_PROP', PropKey, PRS_PROP_PATTERN$, 'X')
|
||||
Tool = Xlate('PRS_PROP', PropKey, PRS_PROP_TOOL$, 'X')
|
||||
Convert @LOWER_CASE to @UPPER_CASE in Tool
|
||||
|
||||
If Recipe NE '' and Pattern NE '' and Tool NE '' then
|
||||
PatternSize = Tool_Class_Services('GetNumberOfPointsForPattern', Tool, Pattern)
|
||||
|
||||
If Error_Services('NoError') then
|
||||
Entry = Recipe:@VM:Pattern:@VM:PatternSize:@VM:Tool
|
||||
RecipesAndPatterns<CurrIdx> = Entry
|
||||
CurrIdx = CurrIdx + 1
|
||||
end
|
||||
end
|
||||
Next PropKey
|
||||
|
||||
PRSStageKeys = ''
|
||||
Extract_Si_Keys('PRS_STAGE', 'PS_NO', PSNo, PRSStageKeys)
|
||||
for each PRSStageKey in PRSStageKeys using @VM setting sPos
|
||||
Recipes = Xlate('PRS_STAGE', PRSStageKey, PRS_STAGE_MET_RECIPE$, 'X')
|
||||
for each Recipe in Recipes using @VM setting rPos
|
||||
Pattern = Xlate('PRS_STAGE', PRSStageKey, PRS_STAGE_MET_RECIPE_PATTERN$, 'X')<1, rPos>
|
||||
Tool = Xlate('PRS_STAGE', PRSStageKey, PRS_STAGE_MET_TOOL_CLASS$, 'X')<1, rPos>
|
||||
Convert @LOWER_CASE to @UPPER_CASE in Tool
|
||||
|
||||
If Recipe NE '' and Tool NE '' and Pattern NE '' then
|
||||
PatternSize = Tool_Class_Services('GetNumberOfPointsForPattern', Tool, Pattern)
|
||||
|
||||
If Error_Services('NoError') then
|
||||
Entry = Recipe:@VM:Pattern:@VM:PatternSize:@VM:Tool
|
||||
RecipesAndPatterns<CurrIdx> = Entry
|
||||
CurrIdx = CurrIdx + 1
|
||||
end
|
||||
end
|
||||
Next Recipe
|
||||
SurfScanRecipes = Xlate('PRS_STAGE', PRSStageKey, PRS_STAGE_SURFSCAN_RECIPE$, 'X')
|
||||
If SurfScanRecipes NE '' then
|
||||
for each SurfScanRecipe in SurfScanRecipes using @VM setting ssPos
|
||||
Entry = SurfScanRecipe:@VM:'':@VM:'':@VM:'TENCOR'
|
||||
RecipesAndPatterns<CurrIdx> = Entry
|
||||
CurrIdx = CurrIdx + 1
|
||||
Next SurfScanRecipe
|
||||
end
|
||||
Next PRSStageKey
|
||||
|
||||
RecipesAndPatterns = SRP_Array('Clean', RecipesAndPatterns, 'TrimAndMakeUnique')
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. PROD_SPEC record "':PSNo:'" does not exist.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Null PSNo passed into service.'
|
||||
end
|
||||
|
||||
If ErrorMsg EQ '' then
|
||||
Response = RecipesAndPatterns
|
||||
end else
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
Service GetAllMetrologyRecipes(PSNo, GetSurfscan, GetClean, GetRes, GetThick)
|
||||
|
||||
Recipes = ''
|
||||
@ -1085,6 +1157,22 @@ Service ConvertRecordToJSON(KeyID, Record, ItemURL)
|
||||
SRP_JSON(objStageArray, 'Release')
|
||||
end
|
||||
|
||||
RecipesAndPatterns = PSN_Services('GetMetrologyRecipesAndPatterns', KeyID)
|
||||
If SRP_JSON(objRecipesAndPatternsArray, 'New', 'Array') then
|
||||
for each RecipeAndPattern in RecipesAndPatterns using @FM setting rpPos
|
||||
If SRP_JSON(objRecipeAndPattern, 'New', 'Object') then
|
||||
SRP_JSON(objRecipeAndPattern, 'SetValue', 'recipe', RecipeAndPattern<1, 1>, 'String')
|
||||
SRP_JSON(objRecipeAndPattern, 'SetValue', 'pattern', RecipeAndPattern<1, 2>, 'String')
|
||||
SRP_JSON(objRecipeAndPattern, 'SetValue', 'patternSize', RecipeAndPattern<1, 3>, 'Number')
|
||||
SRP_JSON(objRecipeAndPattern, 'SetValue', 'tool', RecipeAndPattern<1, 4>, 'String')
|
||||
SRP_JSON(objRecipesAndPatternsArray, 'Add', objRecipeAndPattern)
|
||||
SRP_JSON(objRecipeAndPattern, 'Release')
|
||||
end
|
||||
Next RecipeAndPattern
|
||||
SRP_JSON(objProdSpec, 'Set', 'recipesAndPatterns', objRecipesAndPatternsArray)
|
||||
SRP_JSON(objRecipesAndPatternsArray, 'Release')
|
||||
end
|
||||
|
||||
SRP_JSON(objJSON, 'Set', 'prodSpec', objProdSpec)
|
||||
SRP_JSON(objProdSpec, 'Release')
|
||||
end
|
||||
@ -1167,3 +1255,4 @@ return
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -145,7 +145,7 @@ Declare subroutine RTI_Set_Debugger, Database_Services, Btree.Extract, Extract_
|
||||
Declare subroutine Set_Status, Sleepery, Winyield, Yield, SRP_COM, QA_Services, Logging_Services, Obj_RDS
|
||||
Declare subroutine Validate, obj_WO_Mat, obj_WO_Mat_Log, obj_React_Status, Record_Lock, obj_React_State, obj_Post_Log
|
||||
Declare subroutine RDS_Services, obj_WO_React, RDS_React_Run, Signature_Services, SQL_Services, SRP_Stopwatch
|
||||
Declare subroutine Override_Services, Reactor_Services, Lot_Services, Obj_Notes, Mona_Services, Service_Services
|
||||
Declare subroutine Override_Services, Reactor_Services, Lot_Services, Mona_Services, Service_Services, Obj_Notes
|
||||
Declare subroutine Transaction_Services
|
||||
Declare function SRP_Sort_Array, Metrology_Services, obj_RDS_Test, obj_Test_Point_Map, Database_Services
|
||||
Declare function Work_Order_Services, SRP_JSON, Logging_Services, Environment_Services, SRP_Trim, Error_Services
|
||||
@ -1828,22 +1828,6 @@ Service SignPreEpiStage(RDSNo, Username, WaferQty, Reactor, ScanEntry)
|
||||
PSNo = RDSRec<RDS_PROD_SPEC_ID$>
|
||||
WOStep = Xlate('RDS', RDSNo, 'WO_STEP', 'X')
|
||||
|
||||
BEGIN CASE
|
||||
CASE OrgReactNo = '' AND Reactor NE ''
|
||||
obj_WO_React('AddRdsNo',WONo:@RM:WOStep:@RM:Reactor:@RM:RDSNo:@RM:CassNo:@RM:PSNo)
|
||||
|
||||
CASE OrgReactNo NE '' AND Reactor = ''
|
||||
obj_WO_React('RemRdsNo',WONo:@RM:WOStep:@RM:OrgReactNo:@RM:RDSNo:@RM:CassNo:@RM:PSNo)
|
||||
|
||||
CASE OrgReactNo NE Reactor
|
||||
obj_WO_React('RemRdsNo',WONo:@RM:WOStep:@RM:OrgReactNo:@RM:RDSNo:@RM:CassNo:@RM:PSNo)
|
||||
obj_WO_React('AddRdsNo',WONo:@RM:WOStep:@RM:Reactor:@RM:RDSNo:@RM:CassNo:@RM:PSNo)
|
||||
|
||||
CASE Otherwise$
|
||||
NULL
|
||||
|
||||
END CASE
|
||||
|
||||
// Need to update/save RDS record before calling RDS_React_Run
|
||||
RDSRec<RDS_REACTOR$> = Reactor
|
||||
RDSRec<RDS_VERIFY_QTY$> = WaferQty
|
||||
@ -2013,11 +1997,11 @@ end service
|
||||
Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOpt)
|
||||
StartTick = GetTickCount()
|
||||
MetricName = 'LoadSignatureReady'
|
||||
|
||||
ErrorMsg = ''
|
||||
Error_Services('Clear')
|
||||
If (RDSNo EQ '') or (Username EQ '') or (WaferQty EQ '') then
|
||||
ErrorMessage = 'Process Error: RDSNo, Username, or WaferQty not supplied in the ':Service:' service.'
|
||||
Error_Services('Set', ErrorMessage)
|
||||
ErrorMsg = 'Process Error: RDSNo, Username, or WaferQty not supplied in the ':Service:' service.'
|
||||
Error_Services('Set', ErrorMsg)
|
||||
Response = False$
|
||||
return
|
||||
end
|
||||
@ -2055,15 +2039,15 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
|
||||
ReactorCapacity = Reactor_Services('GetReactorAvailChamberCount', Reactor)
|
||||
If ReactorCapacity LE 0 then
|
||||
|
||||
ErrorMessage = 'Process Error: Reactor ' : Reactor : ' does not have the capacity for this lot.'
|
||||
Error_Services('Set', ErrorMessage)
|
||||
ErrorMsg = 'Process Error: Reactor ' : Reactor : ' does not have the capacity for this lot.'
|
||||
Error_Services('Set', ErrorMsg)
|
||||
Response = False$
|
||||
return
|
||||
end
|
||||
|
||||
If WaferQty NE SchedQty then
|
||||
ErrorMessage = 'Process Error: Verified wafer quantity does not match the scheduled quantity.'
|
||||
Error_Services('Set', ErrorMessage)
|
||||
ErrorMsg = 'Process Error: Verified wafer quantity does not match the scheduled quantity.'
|
||||
Error_Services('Set', ErrorMsg)
|
||||
Response = False$
|
||||
return
|
||||
end
|
||||
@ -2083,8 +2067,8 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
|
||||
// the parameters. If they do not confirm them, then we need to stop the load signature.
|
||||
RDSLayerAckReq = Xlate('RDS', RDSNo, 'RDS_LAYER_ACK_REQ', 'X')
|
||||
If RDSLayerAckReq EQ True$ then
|
||||
ErrorMessage = 'RDS layer parameters must be reviewed for accuracy and acknowledged before the load operation can be signed.'
|
||||
Error_Services('Set', ErrorMessage)
|
||||
ErrorMsg = 'RDS layer parameters must be reviewed for accuracy and acknowledged before the load operation can be signed.'
|
||||
Error_Services('Set', ErrorMsg)
|
||||
Response = False$
|
||||
return
|
||||
end
|
||||
@ -2167,9 +2151,9 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
|
||||
ROTRStatus = ReactorRec<REACTOR_ROTR_STATUS$>
|
||||
|
||||
If ROTRStatus EQ 'F' then
|
||||
ErrorMessage = 'Process Error: Unable to load reactor due to ROTR load block. ' |
|
||||
ErrorMsg = 'Process Error: Unable to load reactor due to ROTR load block. ' |
|
||||
: 'A lead or supervisor must clear the ROTR load block.'
|
||||
Error_Services('Set', ErrorMessage)
|
||||
Error_Services('Set', ErrorMsg)
|
||||
Response = False$
|
||||
return
|
||||
end
|
||||
@ -2252,35 +2236,149 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
|
||||
// Add check for supplement signatures
|
||||
UnacknowledgedSupp = Supplement_Services('UnacknowledgedSupplementCheck', 'RDS', RDSNo, 'LOAD')
|
||||
If UnacknowledgedSupp NE FALSE$ then
|
||||
ErrorMessage = 'The LOAD stage supplements must be acknowledged before the load operation can be signed.'
|
||||
Error_Services('Set', ErrorMessage)
|
||||
ErrorMsg = 'The LOAD stage supplements must be acknowledged before the load operation can be signed.'
|
||||
Error_Services('Set', ErrorMsg)
|
||||
Response = False$
|
||||
return
|
||||
end
|
||||
|
||||
If Error_Services('NoError') then
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
If ErrorMsg EQ '' then
|
||||
Response = True$
|
||||
end else
|
||||
Response = False$
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
end service
|
||||
|
||||
Service UnsignLoadSignatureReady(RDSNo)
|
||||
|
||||
ErrorMessage = ''
|
||||
UnsignEligible = True$
|
||||
|
||||
If RowExists('RDS', RDSNo) then
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo, True$, 0, False$)
|
||||
If Error_Services('NoError') then
|
||||
WONo = RDSRec<RDS_WO$>
|
||||
CassNo = RDSRec<RDS_CASS_NO$>
|
||||
WoMatKey = WONo : '*' : CassNo
|
||||
If RowExists('WO_MAT', WoMatKey) then
|
||||
WOMatCurrStatus = obj_WO_Mat('CurrStatus',WOMatKey)
|
||||
|
||||
//Cases to check for various statuses that should block unsigning the unload.
|
||||
Begin Case
|
||||
Case WOMatCurrStatus EQ 'HOLD'
|
||||
ErrorMessage = 'Cassette is on HOLD and may not have the signature removed.'
|
||||
Case Otherwise$
|
||||
|
||||
End Case
|
||||
|
||||
If ErrorMessage EQ '' then
|
||||
//Check if any subsequent signature are set. If so RDS is not eligible.
|
||||
UnloadExtra1Sig = RDSRec<RDS_OP_OUT_EX1$>
|
||||
LoadExtra1Sig = RDSRec<RDS_OP_IN_EX2$>
|
||||
UnloadExtra2Sig = RDSRec<RDS_OP_OUT_EX2$>
|
||||
LoadExtra2Sig = RDSRec<RDS_OP_IN_EX3$>
|
||||
UnloadSig = RDSRec<RDS_OPERATOR_OUT$>Xlate('RDS', RDSNo, 'OPERATOR_OUT', 'X')
|
||||
CISigs = Xlate('RDS', RDSNo, 'LWI_CI_SIG', 'X')
|
||||
swap @VM with '' in CISigs
|
||||
ReactorType = XLATE('RDS', RDSNo, 'REACTOR_TYPE', 'X')
|
||||
If ReactorType NE 'EPP' Then
|
||||
FQASig = Xlate('RDS', RDSNo, 'SUP_VER_SIG', 'X')
|
||||
end else
|
||||
WMOutKey = Xlate('RDS', RDSNo, 'WM_OUT_KEY', 'X')
|
||||
FQASig = Xlate('WM_OUT', WMOutKey, 'SUP_VER_SIG', 'X')
|
||||
end
|
||||
|
||||
Begin Case
|
||||
Case FQASig NE ''
|
||||
ErrorMessage = 'FQA Signature is set.'
|
||||
Case CISigs NE ''
|
||||
ErrorMessage = 'Clean and Inspect Signatures are set.'
|
||||
Case UnloadSig NE ''
|
||||
ErrorMessage = 'Unload signature is set.'
|
||||
Case LoadExtra2Sig NE ''
|
||||
ErrorMessage = 'Load extra 2 signature is set.'
|
||||
Case UnloadExtra2Sig NE ''
|
||||
ErrorMessage = 'Unload extra 2 signature is set.'
|
||||
Case LoadExtra1Sig NE ''
|
||||
ErrorMessage = 'Load extra 1 signature is set.'
|
||||
Case UnloadExtra1Sig NE ''
|
||||
ErrorMessage = 'Unload extra 1 signature is set.'
|
||||
End Case
|
||||
|
||||
|
||||
end
|
||||
end else
|
||||
ErrorMessage = 'Unable to locate the WO_MAT record for this RDS in the WO_MAT table.'
|
||||
end
|
||||
end else
|
||||
ErrorMessage = 'Error reading RDS Record. ' : Error_Services('GetMessage')
|
||||
end
|
||||
|
||||
end else
|
||||
ErrorMessage = 'Unable to locate RDS in the RDS Table.'
|
||||
end
|
||||
|
||||
If ErrorMessage NE '' then
|
||||
UnsignEligible = False$
|
||||
ErrorMessage = 'Process Error: Unable to verify the load signature is Eligible to be unsigned: ' : ErrorMessage
|
||||
Error_Services('Add', ErrorMessage)
|
||||
end
|
||||
|
||||
Response = UnsignEligible
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service LoadExtra1stReady(RDSNo)
|
||||
|
||||
ErrorMsg = ''
|
||||
Response = False$
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
||||
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
|
||||
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
|
||||
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
|
||||
LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$>
|
||||
StandardUnloadSignature = RDSRec<RDS_OPERATOR_OUT$>
|
||||
If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature EQ '' And LoadExtra2Signature EQ ''AND UnloadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
|
||||
Response = True$
|
||||
if Error_Services('NoError') then
|
||||
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
||||
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
|
||||
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
|
||||
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
|
||||
LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$>
|
||||
StandardUnloadSignature = RDSRec<RDS_OPERATOR_OUT$>
|
||||
Reactor = RDSRec<RDS_REACTOR$>
|
||||
|
||||
If Reactor NE '' then
|
||||
WONo = RDSRec<RDS_WO$>
|
||||
Query = 'SELECT REACT_STATE WITH SCHED_WO CONTAINING ':WONo
|
||||
GoSub ClearCursors
|
||||
Set_Status(0)
|
||||
RList(Query, TARGET_ACTIVELIST$, '', '' '')
|
||||
SchedReactors = ''
|
||||
EOF = False$
|
||||
Loop
|
||||
ReadNext SchedReactor else EOF = True$
|
||||
Until EOF
|
||||
SchedReactors<0, -1> = SchedReactor
|
||||
Repeat
|
||||
|
||||
Locate Reactor in SchedReactors using @VM setting vPos then
|
||||
If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature EQ '' And LoadExtra2Signature EQ ''AND UnloadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
|
||||
Response = True$
|
||||
end else
|
||||
ErrorMsg = 'RDS is not eligible to have Load Extra 1 signed.'
|
||||
end
|
||||
end else
|
||||
Swap @VM with ',' in SchedReactors
|
||||
ErrorMsg = 'Assigned reactor, ':Reactor:', does not equal any scheduled reactor(s), ':SchedReactors:'.'
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
|
||||
If ErrorMsg NE '' then
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
end service
|
||||
@ -2288,54 +2386,106 @@ end service
|
||||
|
||||
Service UnsignLoadExtra1stReady(RDSNo)
|
||||
|
||||
ErrorMsg = ''
|
||||
Response = False$
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
||||
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
|
||||
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
|
||||
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
|
||||
LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$>
|
||||
StandardUnloadSignature = RDSRec<RDS_OPERATOR_OUT$>
|
||||
If LoadExtra1Signature NE '' then
|
||||
If UnloadExtra2Signature EQ '' AND LoadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
|
||||
Response = True$
|
||||
end
|
||||
if Error_Services('NoError') then
|
||||
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
||||
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
|
||||
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
|
||||
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
|
||||
LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$>
|
||||
StandardUnloadSignature = RDSRec<RDS_OPERATOR_OUT$>
|
||||
If LoadExtra1Signature NE '' then
|
||||
If UnloadExtra2Signature EQ '' AND LoadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
|
||||
Response = True$
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
|
||||
|
||||
If ErrorMsg NE '' then
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service LoadExtra2ndReady(RDSNo)
|
||||
|
||||
ErrorMsg = ''
|
||||
Response = False$
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
||||
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
|
||||
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
|
||||
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
|
||||
LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$>
|
||||
StandardUnloadSignature = RDSRec<RDS_OPERATOR_OUT$>
|
||||
If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature NE '' AND UnloadExtra2Signature NE '' And LoadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
|
||||
Response = True$
|
||||
If Error_Services('NoError') then
|
||||
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
||||
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
|
||||
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
|
||||
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
|
||||
LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$>
|
||||
StandardUnloadSignature = RDSRec<RDS_OPERATOR_OUT$>
|
||||
Reactor = RDSRec<RDS_REACTOR$>
|
||||
|
||||
If Reactor NE '' then
|
||||
WONo = RDSRec<RDS_WO$>
|
||||
Query = 'SELECT REACT_STATE WITH SCHED_WO CONTAINING ':WONo
|
||||
ClearSelect
|
||||
Set_Status(0)
|
||||
RList(Query, TARGET_ACTIVELIST$, '', '' '')
|
||||
SchedReactors = ''
|
||||
EOF = False$
|
||||
Loop
|
||||
ReadNext SchedReactor else EOF = True$
|
||||
Until EOF
|
||||
SchedReactors<0, -1> = SchedReactor
|
||||
Repeat
|
||||
|
||||
Locate Reactor in SchedReactors using @VM setting vPos then
|
||||
If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature NE '' AND UnloadExtra2Signature NE '' And LoadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
|
||||
Response = True$
|
||||
end else
|
||||
ErrorMsg = 'RDS is not eligible to have the Load Extra 2 set.'
|
||||
end
|
||||
end else
|
||||
Swap @VM with ',' in SchedReactors
|
||||
ErrorMsg = 'Assigned reactor, ':Reactor:', does not equal any scheduled reactor(s), ':SchedReactors:'.'
|
||||
Response = False$
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
|
||||
If ErrorMsg NE '' then
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service UnsignLoadExtra2ndReady(RDSNo)
|
||||
|
||||
ErrorMsg = ''
|
||||
Response = False$
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
||||
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
|
||||
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
|
||||
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
|
||||
LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$>
|
||||
StandardUnloadSignature = RDSRec<RDS_OPERATOR_OUT$>
|
||||
If LoadExtra2Signature NE '' then
|
||||
If StandardUnloadSignature EQ '' then
|
||||
Response = True$
|
||||
end
|
||||
If Error_Services('NoError') then
|
||||
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
||||
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
|
||||
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
|
||||
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
|
||||
LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$>
|
||||
StandardUnloadSignature = RDSRec<RDS_OPERATOR_OUT$>
|
||||
If LoadExtra2Signature NE '' then
|
||||
If StandardUnloadSignature EQ '' then
|
||||
Response = True$
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
|
||||
If ErrorMsg NE '' then
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
end service
|
||||
@ -2400,62 +2550,6 @@ Service SignLoadStage(RDSNo, Username, WaferQty, LLSide, ScanEntry)
|
||||
Response = False$
|
||||
return
|
||||
end
|
||||
|
||||
IF ReactorType NE 'EPP' THEN
|
||||
|
||||
WOMatRec = XLATE('WO_MAT',WONo:'*':CassNo,'','X')
|
||||
WOMatSigProfile = WOMatRec<WO_MAT_SIG_PROFILE$>
|
||||
SigAction = WOStep:'LOAD'
|
||||
|
||||
LOCATE SigAction IN WOMatSigProfile USING @VM SETTING Pos THEN
|
||||
WOMatSig = WOMatRec<WO_MAT_SIGNATURE$,Pos>
|
||||
CurrDTM = OCONV(WOMatRec<WO_MAT_SIG_DTM$,Pos>,'DT/4^HS')
|
||||
END ELSE
|
||||
WOMatSig = ''
|
||||
END
|
||||
RDSSig = Xlate('RDS', RDSNo, 'OPERATOR_IN', 'X')
|
||||
|
||||
BEGIN CASE
|
||||
CASE WOMatSig = '' AND RDSSig NE ''
|
||||
|
||||
* Signature missing on WO_MAT
|
||||
SigDate = RDSRec<RDS_DATE_IN$>
|
||||
SigTime = RDSRec<RDS_TIME_IN$>
|
||||
owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:'LOAD':@RM:RDSSig:@RM:SigDate:' ':SigTime
|
||||
* Sets LOAD signature
|
||||
IF Get_Status(errCode) THEN
|
||||
ErrorMsg = 'Process Error: Error calling obj_WO_Mat("SetSignature"). Error code: ':errCode
|
||||
Error_Services('Set', ErrorMsg)
|
||||
Response = False$
|
||||
END else
|
||||
Response = True$
|
||||
end
|
||||
return
|
||||
|
||||
CASE RDSSig = '' AND WOMatSig NE ''
|
||||
|
||||
* Signature missing on RDS
|
||||
CurrDate = CurrDTM[1,' ']
|
||||
CurrTime = CurrDTM[COL2()+1,' ']
|
||||
RDSRec<RDS_OPERATOR_IN$> = WOMatSig
|
||||
RDSRec<RDS_DATE_IN$> = IConv(CurrDate, 'D')
|
||||
RDSRec<RDS_TIME_IN$> = IConv(CurrTime, 'MT')
|
||||
Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$)
|
||||
Response = True$
|
||||
return
|
||||
|
||||
CASE RDSSig NE '' AND WOMatSig NE ''
|
||||
ErrorMsg = 'Process Error: Load stage has already been signed.'
|
||||
Error_Services('Set', ErrorMsg)
|
||||
Response = False$
|
||||
RETURN
|
||||
|
||||
CASE Otherwise$
|
||||
Null
|
||||
// Continue
|
||||
END CASE
|
||||
|
||||
END
|
||||
|
||||
SigDt = OCONV( Date(), 'D2/' )
|
||||
SigTm = OCONV( Time(), 'MTS' )
|
||||
@ -3682,6 +3776,52 @@ Service SignFQAStage(RDSNo, Username)
|
||||
|
||||
end service
|
||||
|
||||
Service UnsignPreEpiReady(RDSNo)
|
||||
|
||||
ErrorMsg = ''
|
||||
UnsignPreEpiReady = False$
|
||||
|
||||
If RDSNo NE '' then
|
||||
If RowExists('RDS', RDSNo) then
|
||||
If Error_Services('NoError') then
|
||||
//Call on the same logic to determine if the unsign LOAD signature is ready
|
||||
UnsignLoadReady = QA_Services('UnsignLoadSignatureReady', RDSNo)
|
||||
if Error_Services('NoError') then
|
||||
If UnsignLoadReady then
|
||||
//Check if LOAD signature is present
|
||||
LoadSig = Database_Services('ReadDataColumn', 'RDS', RDSNo, RDS_OPERATOR_IN$, True$, 0, False$)
|
||||
If Error_Services('NoError') then
|
||||
If LoadSig EQ '' then
|
||||
UnsignPreEpiReady = True$
|
||||
end else
|
||||
ErrorMsg = 'Load signature is set.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'A signature beyond pre-epi exists. Please check later stages of this RDS.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'RDS ' : RDSNo : ' was not found in database.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'RDS No was null'
|
||||
end
|
||||
|
||||
If ErrorMsg NE '' then
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
Response = UnsignPreEpiReady
|
||||
|
||||
end service
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
@ -3695,3 +3835,12 @@ ClearCursors:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -67,7 +67,8 @@ Declare function Error_Services, Database_Services, obj_RDS_Test, Logging_Ser
|
||||
Declare function Tool_Parms_Services, Signature_Services, obj_WO_Mat_QA, Datetime, Override_Services
|
||||
Declare function Rds_Services, SRP_DateTime, SRP_Math, obj_WO_Mat, Lot_Services, SRP_Array
|
||||
Declare function Lot_Event_Services, GetTickCount, Work_Order_Services
|
||||
Declare subroutine Error_Services, Database_Services, Logging_Services, Service_Services, Mona_Services
|
||||
Declare subroutine Error_Services, Database_Services, Logging_Services, Service_Services, obj_WO_React
|
||||
Declare Subroutine Mona_Services
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\RDS'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
@ -623,6 +624,7 @@ return
|
||||
|
||||
WRITE_RECORD_PRE:
|
||||
|
||||
ErrorMsg = ''
|
||||
StartTick = GetTickCount()
|
||||
MetricName = 'WriteRecordPre'
|
||||
|
||||
@ -766,10 +768,10 @@ WRITE_RECORD_PRE:
|
||||
|
||||
// Look for UNLOAD_DTM override
|
||||
Override = Override_Services('GetOverride', 'RDS', RDSNo, 'UNLOAD_DTM')
|
||||
|
||||
|
||||
Begin Case
|
||||
|
||||
Case ( (OrigLoadSig NE '') and (OrigReactor NE NewReactor) )
|
||||
Case ( (OrigTimeOutSig NE '') and (OrigReactor NE NewReactor) )
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = @USER4
|
||||
@ -778,28 +780,11 @@ WRITE_RECORD_PRE:
|
||||
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
|
||||
|
||||
// User is attempting to erase data that is prohibited from being erased Set the FS104 error and block the write.
|
||||
Error_Services('Add', 'Reactor number cannot be changed or removed once the load signature is set!')
|
||||
OrigFileError = 104:': Reactor number cannot be changed or removed once the load signature is set!'
|
||||
ErrorMsg = 'Reactor number cannot be changed or removed once the unload signature is set!'
|
||||
OrigFileError = 104:': Reactor number cannot be changed or removed once the unload signature is set!'
|
||||
Status = 0
|
||||
Record = ''
|
||||
ActionFlow = ACTION_STOP$
|
||||
|
||||
Case ( (OrigVerSig NE '') and (NewVerSig EQ '') ) or ( (OrigVerDate NE '') and (NewVerDate EQ '') ) |
|
||||
or ( (OrigVerTime NE '') and (NewVerTime EQ '') ) or ( (NewVerDate EQ '') and (NewVerTime NE '') ) |
|
||||
or ( (NewVerDate NE '') and (NewVerTime EQ '') )
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = @USER4
|
||||
LogData<3> = RDSKeyID
|
||||
LogData<4> = 'Signature data cannot be removed!'
|
||||
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
|
||||
|
||||
// User is attempting to erase data that is prohibited from being erased Set the FS104 error and block the write.
|
||||
Error_Services('Add', 'Signature data cannot be removed!')
|
||||
OrigFileError = 104:': Signature data cannot be removed!'
|
||||
Status = 0
|
||||
Record = ''
|
||||
ActionFlow = ACTION_STOP$
|
||||
|
||||
Case ( (VerDTM GT CurrDTM) or (LoadDTM GT CurrDTM) or (LoadEx2DTM GT CurrDTM) or (LoadEx3DTM GT CurrDTM) |
|
||||
or (UnloadEx1DTM GT CurrDTM) or (UnloadEx2DTM GT CurrDTM) or (UnloadDTM GT CurrDTM) |
|
||||
@ -812,7 +797,7 @@ WRITE_RECORD_PRE:
|
||||
LogData<4> = 'Signature datetime is greater than current datetime!'
|
||||
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
|
||||
|
||||
Error_Services('Add', 'Signature datetime is greater than current datetime!')
|
||||
ErrorMsg = 'Signature datetime is greater than current datetime!'
|
||||
OrigFileError = 104:': Signature datetime is greater than current datetime!'
|
||||
Status = 0
|
||||
Record = ''
|
||||
@ -833,7 +818,7 @@ WRITE_RECORD_PRE:
|
||||
LogData<4> = 'Signature datetime is less than a previous signature datetime!'
|
||||
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
|
||||
|
||||
Error_Services('Add', 'Signature datetime is less than a previous signature datetime!')
|
||||
ErrorMsg = 'Signature datetime is less than a previous signature datetime!'
|
||||
OrigFileError = 104:': Signature datetime is less than a previous signature datetime!'
|
||||
Status = 0
|
||||
Record = ''
|
||||
@ -848,7 +833,7 @@ WRITE_RECORD_PRE:
|
||||
LogData<4> = 'Cassette runtime exceeds three days!'
|
||||
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
|
||||
|
||||
Error_Services('Add', 'Cassette runtime exceeds three days!')
|
||||
ErrorMsg = 'Cassette runtime exceeds three days!'
|
||||
OrigFileError = 104:': Cassette runtime exceeds three days!'
|
||||
Status = 0
|
||||
Record = ''
|
||||
@ -861,11 +846,16 @@ WRITE_RECORD_PRE:
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
If ErrorMsg NE '' then
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
|
||||
WRITE_RECORD:
|
||||
|
||||
|
||||
StartTick = GetTickCount()
|
||||
MetricName = 'WriteRecord'
|
||||
|
||||
@ -880,6 +870,32 @@ WRITE_RECORD:
|
||||
OrigDateOut = OrigRecord<RDS_DATE_OUT$>
|
||||
NewDateOut = Record<RDS_DATE_OUT$>
|
||||
|
||||
RDSNo = {SEQ}
|
||||
Reactor = Record<RDS_REACTOR$>
|
||||
OrgReactNo = OrigRecord<RDS_REACTOR$>
|
||||
CassNo = Record<RDS_CASS_NO$>
|
||||
PSNo = Record<RDS_PROD_SPEC_ID$>
|
||||
WOStep = Xlate('RDS', RDSNo, 'WO_STEP', 'X')
|
||||
|
||||
BEGIN CASE
|
||||
CASE OrgReactNo = '' AND Reactor NE ''
|
||||
//Assignment to a reactor where there was no prior assigned reactor
|
||||
obj_WO_React('AddRdsNo',WONo:@RM:WOStep:@RM:Reactor:@RM:RDSNo:@RM:CassNo:@RM:PSNo)
|
||||
|
||||
CASE OrgReactNo NE '' AND Reactor = ''
|
||||
//Reactor Assignment is being cleared.
|
||||
obj_WO_React('RemRdsNo',WONo:@RM:WOStep:@RM:OrgReactNo:@RM:RDSNo:@RM:CassNo:@RM:PSNo)
|
||||
|
||||
CASE OrgReactNo NE Reactor
|
||||
//Reactor Assignment is changing
|
||||
obj_WO_React('RemRdsNo',WONo:@RM:WOStep:@RM:OrgReactNo:@RM:RDSNo:@RM:CassNo:@RM:PSNo)
|
||||
obj_WO_React('AddRdsNo',WONo:@RM:WOStep:@RM:Reactor:@RM:RDSNo:@RM:CassNo:@RM:PSNo)
|
||||
|
||||
CASE Otherwise$
|
||||
NULL
|
||||
|
||||
END CASE
|
||||
|
||||
If ( ( (OrigDateOut EQ '') and (NewDateOut NE '') ) ) then
|
||||
// Mark this cassette as processed in the schedule event record
|
||||
DatetimeOut = {DATETIME_OUT}
|
||||
@ -1002,4 +1018,3 @@ Restore_System_Variables:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
@ -99,6 +99,13 @@ API rds.ID.PUT
|
||||
end api
|
||||
|
||||
|
||||
API rds.ID.zpl.HEAD
|
||||
API rds.ID.zpl.GET
|
||||
|
||||
GoSub CreateZPLItem
|
||||
|
||||
end api
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@ -128,3 +135,29 @@ CreateHALItem:
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// CreateZPLItem
|
||||
//
|
||||
// Creates a HAL+JSON object with the ZPL for the given WM_IN row
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
CreateZPLItem:
|
||||
|
||||
RdsKey = ParentSegment
|
||||
ZPL = Rds_Services('GetRdsZpl', RdsKey)
|
||||
If Error_Services('NoError') then
|
||||
StatusCode = 200
|
||||
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||
HTTP_Services('SetResponseBody', ZPL, False$, 'text/plain')
|
||||
If Assigned(Message) then
|
||||
HTTP_Services('SetResponseStatus', StatusCode, Message)
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', StatusCode)
|
||||
end
|
||||
end else
|
||||
Message = Error_Services('GetMessage')
|
||||
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
|
||||
end
|
||||
|
||||
return
|
||||
|
@ -82,8 +82,6 @@ Equ COL$MET_SIG_DTM to 12
|
||||
|
||||
Equ MSG_WIDTH$ to 600
|
||||
|
||||
EQU READONLY_GREEN$ TO 192 + (220*256) + (192*65536)
|
||||
|
||||
Declare subroutine ErrMsg, Set_Status, obj_WO_Mat, obj_WO_Mat_Log, obj_RDS, Set_Property, Send_Event, Database_Services
|
||||
Declare subroutine Dialog_Box, Qa_Services, Obj_React_Ll, Start_Window, obj_React_Status, Reactor_Services, Rds_Services
|
||||
Declare subroutine Lot_Event_Services, Override_Log_Services, Logging_Services
|
||||
@ -170,7 +168,7 @@ end event
|
||||
|
||||
|
||||
Event PUB_SIGN.CLICK()
|
||||
|
||||
|
||||
RDSNo = Get_Property(@WINDOW:'.RDS_NO','TEXT')
|
||||
ReactorType = Get_Property(@WINDOW:'.REACTOR_TYPE','TEXT')
|
||||
LoadLockVal = Get_Property(@WINDOW:'.LOAD_LOCK_SIDE_HIDDEN','TEXT')
|
||||
@ -183,365 +181,354 @@ Event PUB_SIGN.CLICK()
|
||||
LSIDArray = Get_Property(@WINDOW:'.RDS_LS_ID','ARRAY')
|
||||
Preauthenticated = FALSE$
|
||||
SignEventType = Get_Property(CtrlEntID, 'TEXT')
|
||||
|
||||
WoMatKey = WONo : '*' : CassNo
|
||||
|
||||
Begin Case
|
||||
|
||||
Case SignEventType EQ 'Sign'
|
||||
|
||||
RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP')
|
||||
WfrQty = Get_Property(@WINDOW:'.WAFERS_IN','TEXT')
|
||||
LLSide = Get_Property(@Window:'.LOAD_LOCK_SIDE', 'DEFPROP')
|
||||
|
||||
Reactor = Get_Property(@Window:'.REACTOR', 'TEXT')
|
||||
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', Reactor)
|
||||
ReactorType = ReactorRec<REACTOR_REACT_TYPE$>
|
||||
ROTREnabled = Xlate('REACTOR', Reactor, 'ENABLE_ROTR', 'X')
|
||||
|
||||
// Don't allow tracking in on down reactor
|
||||
ReactorCurrModeKey = Xlate('REACTOR_CHILD_KEY_IDS_NG', Reactor, 1, 'X')
|
||||
ReactCurrModeRec = Database_Services('ReadDataRow','REACT_MODE_NG', ReactorCurrModeKey, '','','')
|
||||
CurrReactMode = ReactCurrModeRec<REACT_MODE_NG_MODE$>
|
||||
CurrE10State = Xlate('REACTOR_MODES', CurrReactMode, REACTOR_MODES_E10_STATE$, 'X')
|
||||
|
||||
Override = False$
|
||||
UserVerification = ''
|
||||
OverrideGroups = 'LEAD':@VM:'SUPERVISOR':@VM:'ENGINEERING':@VM:'ENG_TECH':@VM:'ROTR_OVERRIDE'
|
||||
|
||||
ReactorIsDown = CurrE10State _NEC 'PRODUCTIVE'
|
||||
If (ReactorIsDown EQ True$) then
|
||||
// Allow override during prove in
|
||||
If ReactorType EQ 'EPP' then
|
||||
If RDS_Services('IsEpiProTestRun', RDSNo) then Override = True$
|
||||
end
|
||||
|
||||
If Override EQ False$ then
|
||||
UserMsg = "Reactor down. Override required from a lead or supervisor."
|
||||
UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups:@FM:'':@FM:UserMsg)
|
||||
Override = UserVerification<1>
|
||||
end
|
||||
end
|
||||
|
||||
If (ReactorIsDown NE True$) OR (Override EQ True$) then
|
||||
If (ReactorType EQ 'ASM+' OR ReactorType EQ 'HTR' OR ReactorType EQ 'ASM') AND (ROTREnabled EQ True$) then
|
||||
ROTRStatus = ReactorRec<REACTOR_ROTR_STATUS$>
|
||||
If ROTRStatus EQ 'F' then
|
||||
FailReason = ReactorRec<REACTOR_ROTR_STATUS_REASON$>
|
||||
Message = 'Unable to load reactor.' : CRLF$ : FailReason
|
||||
RotrOverrideCount = ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$>
|
||||
If RotrOverrideCount EQ '' then RotrOverrideCount = 0
|
||||
Message := CRLF$ : RotrOverrideCount : ' override(s) were performed since the ROTR block was originally set.'
|
||||
Message := CRLF$ : 'A lead or supervisor must override to clear ROTR status.'
|
||||
Reactor = Database_Services('ReadDataColumn', 'RDS', RDSNo, RDS_REACTOR$, True$, 0, False$)
|
||||
If Error_Services('NoError') then
|
||||
If Reactor NE '' then
|
||||
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', Reactor)
|
||||
if Error_Services('NoError') then
|
||||
ReactorType = ReactorRec<REACTOR_REACT_TYPE$>
|
||||
ROTREnabled = Xlate('REACTOR', Reactor, 'ENABLE_ROTR', 'X')
|
||||
|
||||
Response = Msg(@Window, '', 'RDS_ROTR_OVERRIDE', '', Message)
|
||||
// Don't allow tracking in on down reactor
|
||||
ReactorCurrModeKey = Xlate('REACTOR_CHILD_KEY_IDS_NG', Reactor, 1, 'X')
|
||||
ReactCurrModeRec = Database_Services('ReadDataRow','REACT_MODE_NG', ReactorCurrModeKey, '','','')
|
||||
CurrReactMode = ReactCurrModeRec<REACT_MODE_NG_MODE$>
|
||||
CurrE10State = Xlate('REACTOR_MODES', CurrReactMode, REACTOR_MODES_E10_STATE$, 'X')
|
||||
|
||||
Begin Case
|
||||
Case Response EQ 1
|
||||
Response = True$ ; // User Clicked Override
|
||||
Case Response EQ 2
|
||||
Response = False$ ; // User Clicked Cancel
|
||||
Case Response EQ char(27)
|
||||
Response = False$ ; // User Pressed Escape Key
|
||||
End Case
|
||||
Override = False$
|
||||
UserVerification = ''
|
||||
OverrideGroups = 'LEAD':@VM:'SUPERVISOR':@VM:'ENGINEERING':@VM:'ENG_TECH':@VM:'ROTR_OVERRIDE'
|
||||
|
||||
If Response EQ True$ then
|
||||
If UserVerification EQ '' then
|
||||
UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups)
|
||||
ReactorIsDown = CurrE10State _NEC 'PRODUCTIVE'
|
||||
If (ReactorIsDown EQ True$) then
|
||||
// Allow override during prove in
|
||||
If ReactorType EQ 'EPP' then
|
||||
If RDS_Services('IsEpiProTestRun', RDSNo) then Override = True$
|
||||
end
|
||||
Valid = UserVerification<1>
|
||||
If Valid EQ True$ then
|
||||
// Prompt user for a comment
|
||||
ResponseComment = Dialog_Box('NDW_ADD_COMMENT', @WINDOW)
|
||||
|
||||
IF ResponseComment<2> NE '' THEN
|
||||
// Clear ROTR reactor load block.
|
||||
overrideLogTable = 'RDS':@VM:'REACTOR'
|
||||
overrideLogKey = RDSNo:@VM:Reactor
|
||||
overrideLogUser = Response<2>
|
||||
overrideLogComment = ResponseComment<2>
|
||||
overrideLogCategory = 'ROTR_BLOCK'
|
||||
overrideLogCause = FailReason
|
||||
orKey = Override_Log_Services('Create', overrideLogTable, overrideLogKey, overrideLogUser, overrideLogComment, overrideLogCategory, overrideLogCause)
|
||||
|
||||
If Override EQ False$ then
|
||||
UserMsg = "Reactor down. Override required from a lead or supervisor."
|
||||
UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups:@FM:'':@FM:UserMsg)
|
||||
Override = UserVerification<1>
|
||||
end
|
||||
end
|
||||
|
||||
If (ReactorIsDown NE True$) OR (Override EQ True$) then
|
||||
If (ReactorType EQ 'ASM+' OR ReactorType EQ 'HTR' OR ReactorType EQ 'ASM') AND (ROTREnabled EQ True$) then
|
||||
ROTRStatus = ReactorRec<REACTOR_ROTR_STATUS$>
|
||||
If ROTRStatus EQ 'F' then
|
||||
FailReason = ReactorRec<REACTOR_ROTR_STATUS_REASON$>
|
||||
Message = 'Unable to load reactor.' : CRLF$ : FailReason
|
||||
RotrOverrideCount = ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$>
|
||||
If RotrOverrideCount EQ '' then RotrOverrideCount = 0
|
||||
Message := CRLF$ : RotrOverrideCount : ' override(s) were performed since the ROTR block was originally set.'
|
||||
Message := CRLF$ : 'A lead or supervisor must override to clear ROTR status.'
|
||||
|
||||
//Add override key to RDS
|
||||
RDSRec = Xlate('RDS', RDSNo, '', 'X')
|
||||
RDSRec = Insert(RDSRec, RDS_OVERRIDE_KEYS$, 1, 0, orKey)
|
||||
Response = Msg(@Window, '', 'RDS_ROTR_OVERRIDE', '', Message)
|
||||
|
||||
ReactorRec<REACTOR_ROTR_STATUS$> = 'P'
|
||||
|
||||
rotrStatusReason = ReactorRec<REACTOR_ROTR_STATUS_REASON$>
|
||||
ReactorRec<REACTOR_PREVIOUS_ROTR_STATUS_REASON$> = rotrStatusReason
|
||||
ReactorRec<REACTOR_ROTR_STATUS_REASON$> = ''
|
||||
|
||||
ReactorRec<REACTOR_PREVIOUS_ROTR_OVERRIDE_RDS$> = RDSNo
|
||||
|
||||
rotrOverrideCount = ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$>
|
||||
ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$> = rotrOverrideCount + 1
|
||||
|
||||
Database_Services('WriteDataRow', 'REACTOR', Reactor, ReactorRec, True$, False$, True$)
|
||||
Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$)
|
||||
Begin Case
|
||||
Case Response EQ 1
|
||||
Response = True$ ; // User Clicked Override
|
||||
Case Response EQ 2
|
||||
Response = False$ ; // User Clicked Cancel
|
||||
Case Response EQ char(27)
|
||||
Response = False$ ; // User Pressed Escape Key
|
||||
End Case
|
||||
|
||||
If Response EQ True$ then
|
||||
If UserVerification EQ '' then
|
||||
UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups)
|
||||
end
|
||||
Valid = UserVerification<1>
|
||||
If Valid EQ True$ then
|
||||
// Prompt user for a comment
|
||||
ResponseComment = Dialog_Box('NDW_ADD_COMMENT', @WINDOW)
|
||||
|
||||
IF ResponseComment<2> NE '' THEN
|
||||
// Clear ROTR reactor load block.
|
||||
overrideLogTable = 'RDS':@VM:'REACTOR'
|
||||
overrideLogKey = RDSNo:@VM:Reactor
|
||||
overrideLogUser = Response<2>
|
||||
overrideLogComment = ResponseComment<2>
|
||||
overrideLogCategory = 'ROTR_BLOCK'
|
||||
overrideLogCause = FailReason
|
||||
orKey = Override_Log_Services('Create', overrideLogTable, overrideLogKey, overrideLogUser, overrideLogComment, overrideLogCategory, overrideLogCause)
|
||||
|
||||
//Add override key to RDS
|
||||
RDSRec = Xlate('RDS', RDSNo, '', 'X')
|
||||
RDSRec = Insert(RDSRec, RDS_OVERRIDE_KEYS$, 1, 0, orKey)
|
||||
|
||||
ReactorRec<REACTOR_ROTR_STATUS$> = 'P'
|
||||
|
||||
rotrStatusReason = ReactorRec<REACTOR_ROTR_STATUS_REASON$>
|
||||
ReactorRec<REACTOR_PREVIOUS_ROTR_STATUS_REASON$> = rotrStatusReason
|
||||
ReactorRec<REACTOR_ROTR_STATUS_REASON$> = ''
|
||||
|
||||
ReactorRec<REACTOR_PREVIOUS_ROTR_OVERRIDE_RDS$> = RDSNo
|
||||
|
||||
rotrOverrideCount = ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$>
|
||||
ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$> = rotrOverrideCount + 1
|
||||
|
||||
Database_Services('WriteDataRow', 'REACTOR', Reactor, ReactorRec, True$, False$, True$)
|
||||
Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$)
|
||||
|
||||
end else
|
||||
//No Comment added. Block Load Signaure
|
||||
Msg(@Window, 'A comment is required to perform an ROTR Block Override', '', '', '')
|
||||
return
|
||||
end
|
||||
end else
|
||||
// ROTR override not verified. Block load signature.
|
||||
return
|
||||
end
|
||||
end else
|
||||
// Block load signature
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
SupplAckReq = Supplement_Services('UnacknowledgedSupplementCheck', 'RDS', RDSNo, 'LOAD')
|
||||
IF (SupplAckReq NE FALSE$) then
|
||||
Response = Dialog_Box('NDW_RDS_SUPP_SIG', @Window, RDSNo :@FM: 'LOAD' :@FM: FALSE$)
|
||||
If Response EQ False$ then
|
||||
return
|
||||
end else
|
||||
//No Comment added. Block Load Signaure
|
||||
Msg(@Window, 'A comment is required to perform an ROTR Block Override', '', '', '')
|
||||
PreAuthenticated = TRUE$
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
RDSLayerAckReq = Xlate('RDS', RDSNo, 'RDS_LAYER_ACK_REQ', 'X')
|
||||
If RDSLayerAckReq EQ True$ then
|
||||
ErrorMessage = 'RDS layer parameters must be reviewed for accuracy and acknowledged before the load operation can be signed.'
|
||||
ErrMsg(ErrorMessage)
|
||||
LayerKeys = Xlate('RDS', RDSNo, 'RDS_LAYER_KEYS', 'X')
|
||||
// Just display the first layer
|
||||
RDSLSID = LayerKeys<0, 1>
|
||||
Dialog_Box('RDS_LAYER', @Window, RDSLSID)
|
||||
|
||||
RDSLayerAck = Xlate('RDS', RDSNo, 'RDS_LAYER_ACK', 'X')
|
||||
If ( (RDSLayerAck EQ False$) or (RDSLayerAck EQ '') ) then
|
||||
ErrorMessage = 'RDS layer parameters were not acknowledged. Sign load stage event aborting.'
|
||||
ErrMsg(ErrorMessage)
|
||||
return
|
||||
end
|
||||
end else
|
||||
// ROTR override not verified. Block load signature.
|
||||
return
|
||||
end
|
||||
end else
|
||||
// Block load signature
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
SupplAckReq = Supplement_Services('UnacknowledgedSupplementCheck', 'RDS', RDSNo, 'LOAD')
|
||||
IF (SupplAckReq NE FALSE$) then
|
||||
Response = Dialog_Box('NDW_RDS_SUPP_SIG', @Window, RDSNo :@FM: 'LOAD' :@FM: FALSE$)
|
||||
If Response EQ False$ then
|
||||
return
|
||||
end else
|
||||
PreAuthenticated = TRUE$
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
RDSLayerAckReq = Xlate('RDS', RDSNo, 'RDS_LAYER_ACK_REQ', 'X')
|
||||
If RDSLayerAckReq EQ True$ then
|
||||
ErrorMessage = 'RDS layer parameters must be reviewed for accuracy and acknowledged before the load operation can be signed.'
|
||||
ErrMsg(ErrorMessage)
|
||||
LayerKeys = Xlate('RDS', RDSNo, 'RDS_LAYER_KEYS', 'X')
|
||||
// Just display the first layer
|
||||
RDSLSID = LayerKeys<0, 1>
|
||||
Dialog_Box('RDS_LAYER', @Window, RDSLSID)
|
||||
|
||||
RDSLayerAck = Xlate('RDS', RDSNo, 'RDS_LAYER_ACK', 'X')
|
||||
If ( (RDSLayerAck EQ False$) or (RDSLayerAck EQ '') ) then
|
||||
ErrorMessage = 'RDS layer parameters were not acknowledged. Sign load stage event aborting.'
|
||||
ErrMsg(ErrorMessage)
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
FWIInstAckReq = Xlate('RDS', RDSNo, 'FWI_INST_ACK_REQ', 'X')
|
||||
If (FWIInstAckReq EQ True$) then
|
||||
Response = RDS_Services('RDSVerifyInst', RDSNo, 'FWI')
|
||||
If Response EQ False$ then return
|
||||
end
|
||||
|
||||
LoadInstAckReq = Xlate('RDS', RDSNo, 'LOAD_INST_ACK_REQ', 'X')
|
||||
If (LoadInstAckReq EQ True$) then
|
||||
Response = RDS_Services('RDSVerifyInst', RDSNo, 'LOAD')
|
||||
If Response EQ False$ then return
|
||||
end
|
||||
|
||||
SupplAckReq = Xlate('RDS', RDSNo, 'SUPPL_ACK_REQ', 'X')
|
||||
IF (SupplAckReq EQ True$) then
|
||||
Response = Dialog_Box('NDW_RDS_SUPP_SIG', @Window, RDSNo)
|
||||
If Response EQ False$ then return
|
||||
end
|
||||
//Check if TW Required
|
||||
if XLATE('APP_INFO', 'NEW_TW_SYSTEM_ACTIVE_SWITCH', 1, 'X') EQ True$ AND (ReactorType EQ 'HTR' OR ReactorType EQ 'ASM' OR ReactorType 'ASM+') then
|
||||
UsingTestWafers = False$
|
||||
IsTWReqd = RDS_Services('IsTWLoggingReqd', RDSNo)
|
||||
ExistingTestWafersLogged = Test_Run_Services('GetTestRunKeysByRDS', RdsNo)
|
||||
If ExistingTestWafersLogged NE True$ then
|
||||
If Not(IsTWReqd) then
|
||||
//Test wafer logging is NOT required here.
|
||||
If ReactorType NE 'EPP' then
|
||||
UsingTestWafers = Msg(@Window, '', 'YESNO', '', 'Test Wafer Usage logging is not required on this load.':@FM:'Are any test wafers loaded?')
|
||||
If UsingTestWafers EQ True$ then
|
||||
TWLogResult = Dialog_Box('NDW_LOG_TEST_WAFER_USAGE', @Window, RDSNo : @VM : 'STANDARD' : @VM : 'REACTOR' : @VM : Reactor)
|
||||
If TWLogResult NE True$ then
|
||||
ContinueSign = Msg(@Window, '', 'YESNO', '', 'Continue?':@FM:'Test wafer logging was cancelled. Do you wish to continue signing?')
|
||||
If Not(ContinueSign) then return
|
||||
end
|
||||
end
|
||||
end
|
||||
end else
|
||||
//Test wafer logging is Required here.
|
||||
Begin Case
|
||||
Case ReactorType EQ 'ASM' OR ReactorType EQ 'HTR'
|
||||
UsingTestWafers = Msg(@Window, '', 'YESNO', '', 'A test wafer is required to be ran with this load for metrology on this run':@FM:'Are any test wafers loaded?')
|
||||
Case ReactorType EQ 'ASM+'
|
||||
UsingTestWafers = Msg(@Window, '', 'YESNO', '', 'A test wafer is required to be ran with this load for metrology on the next run.':@FM:'Are any test wafers loaded?')
|
||||
End Case
|
||||
If UsingTestWafers EQ True$ then
|
||||
//User has stated that they are using test wafers
|
||||
TWLogResult = Dialog_Box('NDW_LOG_TEST_WAFER_USAGE', @Window, RDSNo : @VM : 'STANDARD' : @VM : 'REACTOR' : @VM : Reactor)
|
||||
If TWLogResult NE True$ then
|
||||
//User exited the the TW log prompt answering that they are not using any test wafers.
|
||||
UserMsg = "Unable to sign load because test wafer logging is required on this run. A supervisor or lead may override."
|
||||
OverrideGroups = 'LEAD':@VM:'SUPERVISOR':@VM:'ENGINEERING':@VM:'ENG_TECH'
|
||||
UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups:@FM:'':@FM:UserMsg)
|
||||
Override = UserVerification<1>
|
||||
OverrideUser = UserVerification<2>
|
||||
If Override then
|
||||
Override_log_services('Create', 'RDS', RDSNo, OverrideUser, '', 'TW_USAGE', '')
|
||||
|
||||
FWIInstAckReq = Xlate('RDS', RDSNo, 'FWI_INST_ACK_REQ', 'X')
|
||||
If (FWIInstAckReq EQ True$) then
|
||||
Response = RDS_Services('RDSVerifyInst', RDSNo, 'FWI')
|
||||
If Response EQ False$ then return
|
||||
end
|
||||
|
||||
LoadInstAckReq = Xlate('RDS', RDSNo, 'LOAD_INST_ACK_REQ', 'X')
|
||||
If (LoadInstAckReq EQ True$) then
|
||||
Response = RDS_Services('RDSVerifyInst', RDSNo, 'LOAD')
|
||||
If Response EQ False$ then return
|
||||
end
|
||||
|
||||
SupplAckReq = Xlate('RDS', RDSNo, 'SUPPL_ACK_REQ', 'X')
|
||||
IF (SupplAckReq EQ True$) then
|
||||
Response = Dialog_Box('NDW_RDS_SUPP_SIG', @Window, RDSNo)
|
||||
If Response EQ False$ then return
|
||||
end
|
||||
//Check if TW Required
|
||||
if XLATE('APP_INFO', 'NEW_TW_SYSTEM_ACTIVE_SWITCH', 1, 'X') EQ True$ AND (ReactorType EQ 'HTR' OR ReactorType EQ 'ASM' OR ReactorType 'ASM+') then
|
||||
UsingTestWafers = False$
|
||||
IsTWReqd = RDS_Services('IsTWLoggingReqd', RDSNo)
|
||||
ExistingTestWafersLogged = Test_Run_Services('GetTestRunKeysByRDS', RdsNo)
|
||||
If ExistingTestWafersLogged NE True$ then
|
||||
If Not(IsTWReqd) then
|
||||
//Test wafer logging is NOT required here.
|
||||
If ReactorType NE 'EPP' then
|
||||
UsingTestWafers = Msg(@Window, '', 'YESNO', '', 'Test Wafer Usage logging is not required on this load.':@FM:'Are any test wafers loaded?')
|
||||
If UsingTestWafers EQ True$ then
|
||||
TWLogResult = Dialog_Box('NDW_LOG_TEST_WAFER_USAGE', @Window, RDSNo : @VM : 'STANDARD' : @VM : 'REACTOR' : @VM : Reactor)
|
||||
If TWLogResult NE True$ then
|
||||
ContinueSign = Msg(@Window, '', 'YESNO', '', 'Continue?':@FM:'Test wafer logging was cancelled. Do you wish to continue signing?')
|
||||
If Not(ContinueSign) then return
|
||||
end
|
||||
end
|
||||
end
|
||||
end else
|
||||
return
|
||||
//Test wafer logging is Required here.
|
||||
Begin Case
|
||||
Case ReactorType EQ 'ASM' OR ReactorType EQ 'HTR'
|
||||
UsingTestWafers = Msg(@Window, '', 'YESNO', '', 'A test wafer is required to be ran with this load for metrology on this run':@FM:'Are any test wafers loaded?')
|
||||
Case ReactorType EQ 'ASM+'
|
||||
UsingTestWafers = Msg(@Window, '', 'YESNO', '', 'A test wafer is required to be ran with this load for metrology on the next run.':@FM:'Are any test wafers loaded?')
|
||||
End Case
|
||||
If UsingTestWafers EQ True$ then
|
||||
//User has stated that they are using test wafers
|
||||
TWLogResult = Dialog_Box('NDW_LOG_TEST_WAFER_USAGE', @Window, RDSNo : @VM : 'STANDARD' : @VM : 'REACTOR' : @VM : Reactor)
|
||||
If TWLogResult NE True$ then
|
||||
//User exited the the TW log prompt answering that they are not using any test wafers.
|
||||
UserMsg = "Unable to sign load because test wafer logging is required on this run. A supervisor or lead may override."
|
||||
OverrideGroups = 'LEAD':@VM:'SUPERVISOR':@VM:'ENGINEERING':@VM:'ENG_TECH'
|
||||
UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups:@FM:'':@FM:UserMsg)
|
||||
Override = UserVerification<1>
|
||||
OverrideUser = UserVerification<2>
|
||||
If Override then
|
||||
Override_log_services('Create', 'RDS', RDSNo, OverrideUser, '', 'TW_USAGE', '')
|
||||
end else
|
||||
return
|
||||
end
|
||||
end
|
||||
end else
|
||||
//User has stated that they are NOT using test wafers
|
||||
UserMsg = "Unable to sign load because test wafer logging is required on this run. A supervisor or lead may override."
|
||||
OverrideGroups = 'LEAD':@VM:'SUPERVISOR':@VM:'ENGINEERING':@VM:'ENG_TECH'
|
||||
UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups:@FM:'':@FM:UserMsg)
|
||||
Override = UserVerification<1>
|
||||
OverrideUser = UserVerification<2>
|
||||
If Override then
|
||||
Override_log_services('Create', 'RDS', RDSNo, OverrideUser, '', 'TW_USAGE', '')
|
||||
end else
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end else
|
||||
//User has stated that they are NOT using test wafers
|
||||
UserMsg = "Unable to sign load because test wafer logging is required on this run. A supervisor or lead may override."
|
||||
OverrideGroups = 'LEAD':@VM:'SUPERVISOR':@VM:'ENGINEERING':@VM:'ENG_TECH'
|
||||
UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups:@FM:'':@FM:UserMsg)
|
||||
Override = UserVerification<1>
|
||||
OverrideUser = UserVerification<2>
|
||||
If Override then
|
||||
Override_log_services('Create', 'RDS', RDSNo, OverrideUser, '', 'TW_USAGE', '')
|
||||
end else
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
ReadyToSign = QA_Services('LoadSignatureReady', RDSNo, @User4, WfrQty, LLSide)
|
||||
If ReadyToSign EQ True$ then
|
||||
If PreAuthenticated EQ FALSE$ then
|
||||
initParams = ''
|
||||
initParams<4> = 'Sign Load'
|
||||
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, initParams)
|
||||
Valid = Response<1>
|
||||
If (Valid EQ True$) then
|
||||
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
|
||||
|
||||
ReadyToSign = QA_Services('LoadSignatureReady', RDSNo, @User4, WfrQty, LLSide)
|
||||
If ReadyToSign EQ True$ then
|
||||
If PreAuthenticated EQ FALSE$ then
|
||||
initParams = ''
|
||||
initParams<4> = 'Sign Load'
|
||||
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, initParams)
|
||||
Valid = Response<1>
|
||||
If (Valid EQ True$) then
|
||||
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
|
||||
end
|
||||
end else
|
||||
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
|
||||
end
|
||||
end
|
||||
If Error_Services('HasError') then
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
ErrMsg(ErrorMsg)
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
Msg(@Window, ErrorMsg)
|
||||
end
|
||||
end else
|
||||
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
|
||||
Msg(@Window, "Reactor load signature not allowed on a down reactor.")
|
||||
end
|
||||
end
|
||||
If Error_Services('HasError') then
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
ErrMsg(ErrorMsg)
|
||||
end else
|
||||
Msg(@Window, "RDS is not assigned to a reactor.")
|
||||
end
|
||||
end else
|
||||
Msg(@Window, "Reactor load signature not allowed on a down reactor.")
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
Msg(@Window, ErrorMsg)
|
||||
end
|
||||
|
||||
GoSub OLE_LL_Status
|
||||
Set_Property(@Window, 'SAVEWARN', False$)
|
||||
Send_Event(@Window, 'READ')
|
||||
|
||||
Case SignEventType EQ 'Unsign'
|
||||
// 1. Check if on hold. If so, then block event and inform user
|
||||
WOMatKey = WONo:'*':CassNo
|
||||
WOMatCurrStatus = obj_WO_Mat('CurrStatus',WOMatKey)
|
||||
IF WOMatCurrStatus = 'HOLD' THEN
|
||||
ErrorMessage = 'Process Error':@SVM:'Cassette is on Hold and may not have the signature removed.':CRLF$:CRLF$
|
||||
ErrMsg(ErrorMessage)
|
||||
RETURN 0
|
||||
END
|
||||
// 2.
|
||||
// a. For Non-EPP - Check if LWII, LWIS, or FQA has been signed. If so, then block event and inform user
|
||||
// b. For EPP - Check Clean_Insp actions to see if an inspection or surfscan has been completed
|
||||
// Also check the FQA signature (MO_QA)
|
||||
UnloadSig = Xlate('RDS', RDSNo, 'OPERATOR_OUT', 'X')
|
||||
ReactorType = Xlate('RDS', RDSNo, 'REACTOR_TYPE','X')
|
||||
CISigs = Xlate('RDS', RDSNo, 'LWI_CI_SIG', 'X')
|
||||
Convert @VM to '' in CISigs
|
||||
IF ReactorType NE 'EPP' THEN
|
||||
FQASig = Xlate('RDS', RDSNo, 'SUP_VER_SIG', 'X')
|
||||
END ELSE
|
||||
WMOutKey = Xlate('RDS', RDSNo, 'WM_OUT_KEY', 'X')
|
||||
FQASig = Xlate('WM_OUT', WMOutKey, 'SUP_VER_SIG', 'X')
|
||||
END
|
||||
If ( (UnloadSig NE '') or (CISigs NE '') or (FQASig NE '') ) then
|
||||
// UNLOAD, LWII, LWIS, or FQA already signed. Block unload unsign event.
|
||||
ErrorMessage = 'Process Error':@SVM:'UNLOAD, LWII, LWIS, or FQA already signed. Cannot unsign unload event.' |
|
||||
: CRLF$ : CRLF$
|
||||
ErrMsg(ErrorMessage)
|
||||
Return 0
|
||||
end
|
||||
// 1. Check if RDS Load signature is eligible to be set.
|
||||
IsEligible = QA_Services('UnsignLoadSignatureReady', RDSNo)
|
||||
|
||||
// 3. Lead/Supervisor/Engineer/EngTech override
|
||||
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4 : @FM : 'LEAD' : @VM : 'SUPERVISOR':@VM:'ENGINEER':@VM:'ENG_TECH')
|
||||
Valid = Response<1>
|
||||
OverrideUser = Response<2>
|
||||
|
||||
If Valid then
|
||||
|
||||
Machine = Environment_Services('GetServer')
|
||||
Headers = 'Logging DTM' : @FM : 'Machine' : @FM : 'Log'
|
||||
ColumnWidths = 20 : @FM : 15 : @FM : 300
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Lot'
|
||||
makeDirSuccess = Utility("MAKEDIR", LogPath)
|
||||
LogFileName = 'R':RDSNo:'.csv'
|
||||
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ' ', Headers, ColumnWidths, False$, False$)
|
||||
LogData = ''
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS') ; // Logging DTM
|
||||
LogData<2> = Machine
|
||||
LogData<3> = 'LOAD stage unsigned for RDS ':RDSNo:' by user ':@User4
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
|
||||
|
||||
// 4. Remove WO_MAT Unload signature, date, and time
|
||||
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
|
||||
SigProf = WOMatRec<WO_MAT_SIG_PROFILE$>
|
||||
Sigs = WOMatRec<WO_MAT_SIGNATURE$>
|
||||
SigDTMs = WOMatRec<WO_MAT_SIG_DTM$>
|
||||
Locate '1LOAD' in SigProf using @VM setting vPos then
|
||||
Sigs<1, vPos> = ''
|
||||
SigDTMs<1, vPos> = ''
|
||||
WOMatRec<WO_MAT_SIGNATURE$> = Sigs
|
||||
WOMatRec<WO_MAT_SIG_DTM$> = SigDTMs
|
||||
obj_React_Status('HandleLoadUnsign',Reactor:@RM:WONo:@RM:CassNo:@RM:RDSNo:@RM:OverrideUser)
|
||||
end
|
||||
|
||||
// 5. Remove '1LOAD' material log entry (i.e. WO_MAT<INV...> columns)
|
||||
InvActions = WOMatRec<WO_MAT_INV_ACTION$>
|
||||
Locate '1LOAD' in InvActions using @VM setting vPos then
|
||||
WOMatRec<WO_MAT_INV_WH$> = Delete(WOMatRec<WO_MAT_INV_WH$>, 0, vPos, 0)
|
||||
WOMatRec<WO_MAT_INV_LOCATION$> = Delete(WOMatRec<WO_MAT_INV_LOCATION$>, 0, vPos, 0)
|
||||
WOMatRec<WO_MAT_INV_ACTION$> = Delete(WOMatRec<WO_MAT_INV_ACTION$>, 0, vPos, 0)
|
||||
WOMatRec<WO_MAT_INV_DTM$> = Delete(WOMatRec<WO_MAT_INV_DTM$>, 0, vPos, 0)
|
||||
WOMatRec<WO_MAT_INV_USER$> = Delete(WOMatRec<WO_MAT_INV_USER$>, 0, vPos, 0)
|
||||
WOMatRec<WO_MAT_INV_TAG$> = Delete(WOMatRec<WO_MAT_INV_TAG$>, 0, vPos, 0)
|
||||
WOMatRec<WO_MAT_INV_TOOL_ID$> = Delete(WOMatRec<WO_MAT_INV_TOOL_ID$>, 0, vPos, 0)
|
||||
WOMatRec<WO_MAT_INV_LOC$> = Delete(WOMatRec<WO_MAT_INV_LOC$>, 0, vPos, 0)
|
||||
WOMatRec<WO_MAT_INV_SCAN_ENTRY$> = Delete(WOMatRec<WO_MAT_INV_SCAN_ENTRY$>, 0, vPos, 0)
|
||||
end
|
||||
Database_Services('WriteDataRow', 'WO_MAT', WOMatKey, WOMatRec, True$, False$, True$)
|
||||
|
||||
// 6. Remove RDS Unload signature, date, and time
|
||||
// NOTE: This needs to occur before item #5 to avoid RDS_ACTIONS restoring the load signature
|
||||
Set_Property(@Window:'.OP_IN', 'TEXT', '')
|
||||
Set_Property(@Window:'.OP_IN_NAME', 'TEXT', '')
|
||||
Set_Property(@Window:'.OP_IN_DATE', 'TEXT', '')
|
||||
Set_Property(@Window:'.OP_IN_TIME', 'TEXT', '')
|
||||
IOOptions = Get_Property(@Window, 'IOOPTIONS')
|
||||
IOOptions<6> = True$
|
||||
Set_Property(@Window, 'IOOPTIONS', IOOptions)
|
||||
Send_Event(@Window, 'WRITE')
|
||||
IOOptions<6> = False$
|
||||
Set_Property(@Window, 'IOOPTIONS', IOOptions)
|
||||
|
||||
Reactor = Get_Property(@Window:'.REACTOR', 'TEXT')
|
||||
Rds_Services('AddComment', RDSNo, 'Load Stage Unsigned from Reactor ' : Reactor)
|
||||
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', Reactor)
|
||||
PreviousRotrOverrideRds = ReactorRec<REACTOR_PREVIOUS_ROTR_OVERRIDE_RDS$>
|
||||
|
||||
// Check if ROTR override was preformed when signing this load
|
||||
If (PreviousRotrOverrideRds EQ RDSNo) then
|
||||
// Reset the override flag
|
||||
ReactorRec<REACTOR_ROTR_STATUS$> = 'F'
|
||||
PreviousRotrStatusReason = ReactorRec<REACTOR_PREVIOUS_ROTR_STATUS_REASON$>
|
||||
ReactorRec<REACTOR_ROTR_STATUS_REASON$> = PreviousRotrStatusReason
|
||||
RotrOverrideCount = ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$>
|
||||
ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$> = Max(0, (RotrOverrideCount - 1))
|
||||
end
|
||||
Database_Services('WriteDataRow', 'REACTOR', Reactor, ReactorRec, True$, False$, True$)
|
||||
If ReactorType EQ 'EPP' then
|
||||
Reactor_Services('DecrementWfrMetrics', RDSNo)
|
||||
end
|
||||
Set_Property(@Window:'.PUB_SIGN', 'TEXT', 'Sign')
|
||||
If IsEligible then
|
||||
// 3. Lead/Supervisor/Engineer/EngTech override
|
||||
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4 : @FM : 'LEAD' : @VM : 'SUPERVISOR':@VM:'ENGINEER':@VM:'ENG_TECH')
|
||||
Valid = Response<1>
|
||||
OverrideUser = Response<2>
|
||||
|
||||
If Valid then
|
||||
|
||||
Machine = Environment_Services('GetServer')
|
||||
Headers = 'Logging DTM' : @FM : 'Machine' : @FM : 'Log'
|
||||
ColumnWidths = 20 : @FM : 15 : @FM : 300
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Lot'
|
||||
makeDirSuccess = Utility("MAKEDIR", LogPath)
|
||||
LogFileName = 'R':RDSNo:'.csv'
|
||||
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ' ', Headers, ColumnWidths, False$, False$)
|
||||
LogData = ''
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS') ; // Logging DTM
|
||||
LogData<2> = Machine
|
||||
LogData<3> = 'LOAD stage unsigned for RDS ':RDSNo:' by user ':@User4
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
|
||||
|
||||
// 4. Remove WO_MAT Unload signature, date, and time
|
||||
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
|
||||
SigProf = WOMatRec<WO_MAT_SIG_PROFILE$>
|
||||
Sigs = WOMatRec<WO_MAT_SIGNATURE$>
|
||||
SigDTMs = WOMatRec<WO_MAT_SIG_DTM$>
|
||||
Locate '1LOAD' in SigProf using @VM setting vPos then
|
||||
Sigs<1, vPos> = ''
|
||||
SigDTMs<1, vPos> = ''
|
||||
WOMatRec<WO_MAT_SIGNATURE$> = Sigs
|
||||
WOMatRec<WO_MAT_SIG_DTM$> = SigDTMs
|
||||
obj_React_Status('HandleLoadUnsign',Reactor:@RM:WONo:@RM:CassNo:@RM:RDSNo:@RM:OverrideUser)
|
||||
end
|
||||
|
||||
// 5. Remove '1LOAD' material log entry (i.e. WO_MAT<INV...> columns)
|
||||
InvActions = WOMatRec<WO_MAT_INV_ACTION$>
|
||||
Locate '1LOAD' in InvActions using @VM setting vPos then
|
||||
WOMatRec<WO_MAT_INV_WH$> = Delete(WOMatRec<WO_MAT_INV_WH$>, 0, vPos, 0)
|
||||
WOMatRec<WO_MAT_INV_LOCATION$> = Delete(WOMatRec<WO_MAT_INV_LOCATION$>, 0, vPos, 0)
|
||||
WOMatRec<WO_MAT_INV_ACTION$> = Delete(WOMatRec<WO_MAT_INV_ACTION$>, 0, vPos, 0)
|
||||
WOMatRec<WO_MAT_INV_DTM$> = Delete(WOMatRec<WO_MAT_INV_DTM$>, 0, vPos, 0)
|
||||
WOMatRec<WO_MAT_INV_USER$> = Delete(WOMatRec<WO_MAT_INV_USER$>, 0, vPos, 0)
|
||||
WOMatRec<WO_MAT_INV_TAG$> = Delete(WOMatRec<WO_MAT_INV_TAG$>, 0, vPos, 0)
|
||||
WOMatRec<WO_MAT_INV_TOOL_ID$> = Delete(WOMatRec<WO_MAT_INV_TOOL_ID$>, 0, vPos, 0)
|
||||
WOMatRec<WO_MAT_INV_LOC$> = Delete(WOMatRec<WO_MAT_INV_LOC$>, 0, vPos, 0)
|
||||
WOMatRec<WO_MAT_INV_SCAN_ENTRY$> = Delete(WOMatRec<WO_MAT_INV_SCAN_ENTRY$>, 0, vPos, 0)
|
||||
end
|
||||
Database_Services('WriteDataRow', 'WO_MAT', WOMatKey, WOMatRec, True$, False$, True$)
|
||||
|
||||
// 6. Remove RDS Unload signature, date, and time
|
||||
// NOTE: This needs to occur before item #5 to avoid RDS_ACTIONS restoring the load signature
|
||||
Set_Property(@Window:'.OP_IN', 'TEXT', '')
|
||||
Set_Property(@Window:'.OP_IN_NAME', 'TEXT', '')
|
||||
Set_Property(@Window:'.OP_IN_DATE', 'TEXT', '')
|
||||
Set_Property(@Window:'.OP_IN_TIME', 'TEXT', '')
|
||||
IOOptions = Get_Property(@Window, 'IOOPTIONS')
|
||||
IOOptions<6> = True$
|
||||
Set_Property(@Window, 'IOOPTIONS', IOOptions)
|
||||
Send_Event(@Window, 'WRITE')
|
||||
IOOptions<6> = False$
|
||||
Set_Property(@Window, 'IOOPTIONS', IOOptions)
|
||||
|
||||
Reactor = Get_Property(@Window:'.REACTOR', 'TEXT')
|
||||
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', Reactor)
|
||||
PreviousRotrOverrideRds = ReactorRec<REACTOR_PREVIOUS_ROTR_OVERRIDE_RDS$>
|
||||
|
||||
// Check if ROTR override was preformed when signing this load
|
||||
If (PreviousRotrOverrideRds EQ RDSNo) then
|
||||
// Reset the override flag
|
||||
ReactorRec<REACTOR_ROTR_STATUS$> = 'F'
|
||||
PreviousRotrStatusReason = ReactorRec<REACTOR_PREVIOUS_ROTR_STATUS_REASON$>
|
||||
ReactorRec<REACTOR_ROTR_STATUS_REASON$> = PreviousRotrStatusReason
|
||||
RotrOverrideCount = ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$>
|
||||
ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$> = Max(0, (RotrOverrideCount - 1))
|
||||
end
|
||||
Database_Services('WriteDataRow', 'REACTOR', Reactor, ReactorRec, True$, False$, True$)
|
||||
If ReactorType EQ 'EPP' then
|
||||
Reactor_Services('DecrementWfrMetrics', RDSNo)
|
||||
end
|
||||
Set_Property(@Window:'.PUB_SIGN', 'TEXT', 'Sign')
|
||||
|
||||
end else
|
||||
Return 0
|
||||
end
|
||||
end else
|
||||
Return 0
|
||||
end
|
||||
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
Msg(@Window, ErrorMessage)
|
||||
end
|
||||
End Case
|
||||
Post_Event(@Window, 'READ')
|
||||
|
||||
@ -582,7 +569,6 @@ Event LL_R_STATUS.OnClick()
|
||||
|
||||
end event
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@ -740,3 +726,6 @@ OLE_LL_Status:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -51,8 +51,6 @@ $insert REACT_STATUS_EQUATES
|
||||
$insert SUPPL_INFO_ARRAY_EQU
|
||||
$insert CLEAN_INSP_EQUATES
|
||||
|
||||
EQU READONLY_GREEN$ TO 192 + (220*256) + (192*65536)
|
||||
|
||||
Equ COL$LOG_FILE to 1
|
||||
Equ COL$LOG_DTM to 2
|
||||
Equ COL$ACTION to 3
|
||||
@ -67,7 +65,7 @@ Equ COL$TOOL_ID to 10
|
||||
Declare subroutine ErrMsg, Set_Status, obj_WO_Mat, obj_WO_Mat_Log, obj_RDS, Set_Property, Send_Event, Database_Services
|
||||
Declare subroutine Qa_Services, RDS_Services, Dialog_Box
|
||||
Declare function Dialog_Box, Msg, MemberOf, obj_WO_Mat, Database_Services, Get_Property, obj_React_Status, Get_Status
|
||||
Declare function QA_Services, Database_Services, Supplement_Services
|
||||
Declare function QA_Services, Database_Services, Supplement_Services, RDS_Services
|
||||
|
||||
SubclassInfo = Form_Services('FindSubclassControl')
|
||||
Subclass = SubclassInfo<1>
|
||||
@ -95,20 +93,16 @@ Return EventFlow else EVENT_CONTINUE$
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Event WINDOW.CREATE(CreateParam)
|
||||
|
||||
|
||||
GoSub SetupControls
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event WINDOW.READ()
|
||||
// Disable reactor edit line control if the RDS has been loaded.
|
||||
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
|
||||
If RDSNo NE '' then
|
||||
LoadSig = Xlate('RDS', RDSNo, 'OPERATOR_IN', 'X')
|
||||
If LoadSig NE '' then
|
||||
Set_Property(@Window:'.REACTOR', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.REACTOR', 'BACKCOLOR', READONLY_GREEN$)
|
||||
end
|
||||
end
|
||||
|
||||
GoSub SetupControls
|
||||
|
||||
end event
|
||||
|
||||
|
||||
@ -132,6 +126,76 @@ end event
|
||||
|
||||
Event PUB_SIGN.CLICK()
|
||||
|
||||
ButtonText = Get_Property(@Window:'.PUB_SIGN', 'TEXT')
|
||||
|
||||
Begin Case
|
||||
Case ButtonText EQ 'Sign'
|
||||
GoSub SignPreEpi
|
||||
Case ButtonText EQ 'Unsign'
|
||||
GoSub UnsignPreEpi
|
||||
End Case
|
||||
|
||||
If Error_Services('HasError') then
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
ErrMsg(ErrorMsg)
|
||||
end
|
||||
Set_Property(@Window, 'SAVEWARN', False$)
|
||||
Set_Status(0)
|
||||
Send_Event(@Window, 'READ')
|
||||
|
||||
end event
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
SetupControls:
|
||||
|
||||
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
|
||||
|
||||
GoSub ReactorEdlCtrlSetup
|
||||
GoSub PubSignCtrlSetup
|
||||
|
||||
return
|
||||
|
||||
ReactorEdlCtrlSetup:
|
||||
|
||||
// Disable reactor edit line control if the RDS has been assigned.
|
||||
If RDSNo NE '' then
|
||||
PreEpiSig = Database_Services('ReadDataColumn', 'RDS', RDSNo, RDS_PRE_EPI_SIG$, True$, 0, False$)
|
||||
If Error_Services('NoError') then
|
||||
If PreEpiSig NE '' then
|
||||
Set_Property(@Window:'.REACTOR', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.REACTOR', 'BACKCOLOR', READONLY_GREEN$)
|
||||
end else
|
||||
Set_Property(@Window:'.REACTOR', 'ENABLED', True$)
|
||||
Set_Property(@Window:'.REACTOR', 'BACKCOLOR', EDIT_ACTIVE_WHITE$)
|
||||
end
|
||||
end else
|
||||
Set_Property(@Window:'.REACTOR', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.REACTOR', 'BACKCOLOR', READONLY_GREEN$)
|
||||
end
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
PubSignCtrlSetup:
|
||||
|
||||
If RDSNo NE '' then
|
||||
PreEpiSig = Database_Services('ReadDataColumn', 'RDS', RDSNo, RDS_PRE_EPI_SIG$, True$, 0, False$)
|
||||
If Error_Services('NoError') then
|
||||
If PreEpiSig NE '' then
|
||||
Set_Property(@Window:'.PUB_SIGN', 'TEXT', 'Unsign')
|
||||
end else
|
||||
Set_Property(@Window:'.PUB_SIGN', 'TEXT', 'Sign')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
SignPreEpi:
|
||||
|
||||
RDSNo = Get_Property(@Window:'.RDS_NO' ,'DEFPROP')
|
||||
WfrQty = Get_Property(@Window:'.VERIFY_QTY','TEXT')
|
||||
Reactor = Get_Property(@Window:'.REACTOR' ,'TEXT')
|
||||
@ -156,23 +220,29 @@ Event PUB_SIGN.CLICK()
|
||||
Valid = Response<1>
|
||||
If (Valid EQ True$) then
|
||||
QA_Services('SignPreEpiStage', RDSNo, @USER4, WfrQty, Reactor)
|
||||
end
|
||||
end
|
||||
end else
|
||||
QA_Services('SignPreEpiStage', RDSNo, @USER4, WfrQty, Reactor)
|
||||
end
|
||||
end
|
||||
If Error_Services('HasError') then
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
ErrMsg(ErrorMsg)
|
||||
end
|
||||
Set_Property(@Window, 'SAVEWARN', False$)
|
||||
Set_Status(0)
|
||||
Send_Event(@Window, 'READ')
|
||||
|
||||
end event
|
||||
return
|
||||
|
||||
UnsignPreEpi:
|
||||
|
||||
RDSNo = Get_Property(@Window:'.RDS_NO','DEFPROP')
|
||||
VerCheckParams = ''
|
||||
VerCheckParams<4> = 'Permission needed for Pre-Epi Unsign on RDS# ' : RDSNo
|
||||
UserVerCheck = Dialog_Box('NDW_VERIFY_USER', @Window, '':@FM:'':@FM:'':@FM:VerCheckParams)
|
||||
ValidUserCheck = UserVerCheck<1>
|
||||
If ValidUserCheck then
|
||||
ValidUserId = UserVerCheck<2>
|
||||
If ValidUserId NE '' then
|
||||
RDS_Services('UnsignPreEpiSignature', RDSNo, ValidUserId)
|
||||
end
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
204
LSL2/STPROC/RDS_TEST_SERVICES.txt
Normal file
204
LSL2/STPROC/RDS_TEST_SERVICES.txt
Normal 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
|
||||
|
@ -93,7 +93,7 @@ Equ ACTION$SPEC_SURFSCAN_RECIPE TO 8
|
||||
Declare subroutine ErrMsg, Set_Status, obj_WO_Mat, obj_WO_Mat_Log, obj_RDS, Set_Property, Send_Event, Database_Services
|
||||
Declare subroutine Dialog_Box, Msg, MemberOf, obj_WO_Mat, Get_Property, obj_React_Status, Get_Status, Override_Services
|
||||
Declare subroutine record_lock, obj_React_Status, Post_Event, obj_React_State, obj_Post_Log, Qa_Services, Reactor_Services
|
||||
Declare Subroutine Rds_Services, WO_MAT_Services, Message_Box, Reactor_Log_Services, Schedule_Services
|
||||
Declare Subroutine Rds_Services, WO_MAT_Services, Message_Box, Reactor_Log_Services, Schedule_Services, Dialog_Response_Log_Services
|
||||
|
||||
Declare function dialog_box, msg, Get_Status, obj_WO_Mat, Get_Status, obj_Clean_Insp, obj_Reactor, Get_Property
|
||||
Declare function QA_Services, Database_Services, Set_Property, Rds_Services, Qa_Services, Memberof, Reactor_Services
|
||||
@ -315,6 +315,9 @@ Event PUB_SIGN.CLICK()
|
||||
WoMatRecord<WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$> = TWLogResult
|
||||
If TWLogResult NE True$ then
|
||||
ErrMsg = 'Unload blocked! You must run a test wafer before signing the unload'
|
||||
Dialog_Response_Log_Services('AddDialogResponseLog', RDSNo, 'RDS', @User4, 'HTR_LAST_BOX_TW', 'Test wafer not logged when one was required. Unload signature was blocked. User was prompted.')
|
||||
end else
|
||||
Dialog_Response_Log_Services('AddDialogResponseLog', RDSNo, 'RDS', @User4, 'HTR_LAST_BOX_TW', 'Test wafer was logged when one was required. Unload signature was allowed. User was prompted.')
|
||||
end
|
||||
If ErrMsg NE '' then
|
||||
Database_Services('WriteDataRow', 'WO_MAT', WoMatKey, WoMatRecord, True$, False$, False$)
|
||||
@ -322,6 +325,8 @@ Event PUB_SIGN.CLICK()
|
||||
ErrMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
end else
|
||||
Dialog_Response_Log_Services('AddDialogResponseLog', RDSNo, 'RDS', @User4, 'HTR_LAST_BOX_TW', 'Test wafer was logged prior when one was required. Unload signature was allowed. User was not prompted.')
|
||||
end
|
||||
end
|
||||
end else
|
||||
@ -474,3 +479,4 @@ Setup_OLE_Controls:
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
@ -41,8 +41,9 @@ Function Reactitems_API(@API)
|
||||
$insert APP_INSERTS
|
||||
$insert API_SETUP
|
||||
$insert HTTP_INSERTS
|
||||
$Insert REACT_ITEM_EQUATES
|
||||
|
||||
Declare subroutine OI_Wizard_Services, SRP_JSON, Database_Services
|
||||
Declare subroutine OI_Wizard_Services, SRP_JSON, Database_Services, React_Item_Services
|
||||
Declare function React_Item_Services, SRP_JSON, OI_Wizard_Services
|
||||
|
||||
GoToAPI else
|
||||
@ -220,13 +221,17 @@ API ReactItems.ID.PUT
|
||||
SRP_JSON(hJSON, 'Release')
|
||||
KeyID = EndpointSegment
|
||||
Record = React_Item_Services('ConvertJSONToRecord', JSON)
|
||||
If KeyID NE '' and Record NE '' then
|
||||
Database_Services('WriteDataRow', 'REACT_ITEM', KeyID, Record)
|
||||
end
|
||||
If Error_Services('NoError') then
|
||||
StatusCode = 200
|
||||
Message = 'React Item Updated'
|
||||
GoSub CreateHalItem
|
||||
If KeyID NE '' and Record NE '' then
|
||||
React_Item_Services('UpdateReactItem', KeyID, Record)
|
||||
end
|
||||
If Error_Services('NoError') then
|
||||
StatusCode = 200
|
||||
Message = 'React Item Updated'
|
||||
GoSub CreateHalItem
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 400, Error_Services('GetMessage'))
|
||||
end
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 400, Error_Services('GetMessage'))
|
||||
end
|
||||
@ -356,4 +361,3 @@ CreateHALCollection:
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
|
@ -148,9 +148,8 @@ WRITE_RECORD:
|
||||
end else
|
||||
ModeUser = @User4
|
||||
end
|
||||
CurrActiveHgCVOrders = Nica_Orders_Services('GetActiveOrders', 'REACTOR', Name, 'IQS_HGCV_ALARM')
|
||||
CurrActiveProveInOrders = Nica_Orders_Services('GetActiveOrders', 'REACTOR', Name, 'CHANGEOVER')
|
||||
OrderTypeAlreadyActive = ( (CurrActiveHgCVOrders NE '') or (CurrActiveProveInOrders NE '') )
|
||||
CurrActiveHgCVOrders = Nica_Orders_Services('GetActiveOrders', 'REACTOR', Name, 'IQS_HGCV_ALARM')
|
||||
OrderTypeAlreadyActive = (CurrActiveHgCVOrders NE '')
|
||||
If Not(OrderTypeAlreadyActive) then
|
||||
// Only create an order and change the mode if there is not already an active IQS_HGCV_ALARM order
|
||||
OrderResponse = Nica_Orders_Services('CreateNewOrder', 'REACTOR', Name, 'IQS_HGCV_ALARM')
|
||||
@ -228,5 +227,3 @@ Restore_System_Variables:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
@ -165,10 +165,14 @@ Service SignReactorLog(ReactorLogID, UserID)
|
||||
RIPostBy = ReactorLogRec<REACTOR_LOG_RI_POST_BY$>
|
||||
If RIPostBy EQ '' then
|
||||
obj_Reactor_Log('PostReactItems',ReactorLogID:@RM:UserID)
|
||||
// Pull in a fresh copy of the record with the POST_BY signature set
|
||||
ReactorLogRec = Database_Services('ReadDataRow', 'REACTOR_LOG', ReactorLogID)
|
||||
If Get_Status(ErrCode) then
|
||||
ErrorMsg = 'Error in ':Service:' service. Error calling obj_Reactor_Log("PostReactItems"). Error code: ':ErrCode:'.'
|
||||
If Error_Services('NoError') then
|
||||
// Pull in a fresh copy of the record with the POST_BY signature set
|
||||
ReactorLogRec = Database_Services('ReadDataRow', 'REACTOR_LOG', ReactorLogID)
|
||||
If Get_Status(ErrCode) then
|
||||
ErrorMsg = 'Error in ':Service:' service. Error calling obj_Reactor_Log("PostReactItems"). Error code: ':ErrCode:'.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -961,3 +965,4 @@ ClearCursors:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
@ -677,12 +677,93 @@ Service ResetWfrMetric(ReactorNo, MetricType = REACTORMETRIC)
|
||||
|
||||
end service
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// SetWaferSize
|
||||
//
|
||||
// Sets the Reactor's Wafer Size.
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service SetWaferSize(ReactNo, WaferSize)
|
||||
|
||||
ErrMsg = ''
|
||||
If ReactNo EQ '' then
|
||||
ErrMsg := 'ReactNo value is missing.'
|
||||
end
|
||||
If WaferSize EQ '' then
|
||||
ErrMsg := 'WaferSize value is missing.'
|
||||
end
|
||||
If ErrMsg EQ '' then
|
||||
If RowExists('REACTOR', ReactNo) then
|
||||
WaferSizeOptions = Xlate('SYSREPOSPOPUPS', 'LSL2**WAFER_SIZES', 8, 'X')
|
||||
Swap @VM with @FM in WaferSizeOptions
|
||||
Swap @SVM with @VM in WaferSizeOptions
|
||||
WaferSizeOptions = SRP_Array('Rotate', WaferSizeOptions)
|
||||
WaferSizeOptions = WaferSizeOptions<2>
|
||||
If Count(WaferSizeOptions, WaferSize) NE 0 then
|
||||
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactNo)
|
||||
ReactorRec<REACTOR_SUSC_POCKET_SIZE$> = WaferSize
|
||||
Database_Services('WriteDataRow', 'REACTOR', ReactNo, ReactorRec, True$, False$, False$)
|
||||
If Error_Services('HasError') then
|
||||
ErrMsg := Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrMsg := 'Invalid Wafer Size.'
|
||||
end
|
||||
end else
|
||||
ErrMsg := 'The chosen Reactor No. ': ReactNo: ' does not exist.'
|
||||
end
|
||||
end
|
||||
If ErrMsg NE '' then
|
||||
Error_Services('Add', ErrMsg)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// SetPocketQty
|
||||
//
|
||||
// Sets the Reactor's Wafer Size.
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service SetPocketQty(ReactNo, PocketQty)
|
||||
|
||||
ErrMsg = ''
|
||||
If ReactNo EQ '' then
|
||||
ErrMsg := 'ReactNo value is missing.'
|
||||
end
|
||||
If PocketQty EQ '' then
|
||||
ErrMsg := 'PocketQty value is missing.'
|
||||
end
|
||||
If ErrMsg EQ '' then
|
||||
If RowExists('REACTOR', ReactNo) then
|
||||
PocketQtyOptions = Xlate('SYSREPOSPOPUPS', 'LSL2**SUSCEPTOR_POCKETS', 8, 'X')
|
||||
Swap @VM with @FM in PocketQtyOptions
|
||||
Swap @SVM with @VM in PocketQtyOptions
|
||||
PocketQtyOptions = SRP_Array('Rotate', PocketQtyOptions)
|
||||
PocketQtyOptions = PocketQtyOptions<1>
|
||||
If Count(PocketQtyOptions, PocketQty) NE 0 then
|
||||
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactNo)
|
||||
ReactorRec<REACTOR_SUSC_POCKET_QTY$> = PocketQty
|
||||
Database_Services('WriteDataRow', 'REACTOR', ReactNo, ReactorRec, True$, False$, False$)
|
||||
If Error_Services('HasError') then
|
||||
ErrMsg := Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrMsg := 'Invalid Pocket Qty..'
|
||||
end
|
||||
end else
|
||||
ErrMsg := 'The chosen Reactor No. ': ReactNo: ' does not exist.'
|
||||
end
|
||||
end
|
||||
If ErrMsg NE '' then
|
||||
Error_Services('Add', ErrMsg)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// GetReactors
|
||||
//
|
||||
// Returns a JSON formatted array of reactor objects. Reactor number 0 will be ommitted. If the MatchType or MatchSize
|
||||
// arguments are populated, the array will be filterd accordingly.
|
||||
// arguments are populated, the array will be filtered accordingly.
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service GetReactors(MatchType, MatchSize)
|
||||
|
||||
@ -2775,12 +2856,21 @@ Service ConvertRecordToJSON(ReactorNo, ItemURL, CurrUser, FullObject=BOOLEAN)
|
||||
SRP_JSON(objReactor, 'SetValue', 'ArmsCnt', Xlate('REACTOR', ReactorNo, REACTOR_ARMS_WFR_CNT$, 'X'))
|
||||
|
||||
// Add Current Run Status (Current Loaded Cassettes)
|
||||
LoadedRDS = Xlate('REACT_STATUS', ReactorNo, 'LOAD_RDS', 'X')
|
||||
LoadLockLeftRDS = ''
|
||||
LoadLockRightRDS = ''
|
||||
LoadedRDS = Xlate('REACT_STATUS', ReactorNo, 'LOAD_RDS', 'X')
|
||||
If LoadedRDS NE '' then
|
||||
objLoadedRDS = ''
|
||||
If SRP_JSON(objLoadedRDS, 'New', 'Array') then
|
||||
For each RDS in LoadedRDS using @VM setting vPos
|
||||
SRP_JSON(objLoadedRDS, 'AddValue', RDS)
|
||||
LoadLockSide = Xlate('RDS', RDS, 'LOAD_LOCK_SIDE', 'X')
|
||||
Begin Case
|
||||
Case LoadLockSide EQ 'L'
|
||||
LoadLockLeftRDS = RDS
|
||||
Case LoadLockSide EQ 'R'
|
||||
LoadLockRightRDS = RDS
|
||||
End Case
|
||||
Next RDS
|
||||
SRP_JSON(objReactor, 'Set', 'loadedRDS', objLoadedRDS)
|
||||
SRP_JSON(objLoadedRDS, 'Release')
|
||||
@ -2788,6 +2878,8 @@ Service ConvertRecordToJSON(ReactorNo, ItemURL, CurrUser, FullObject=BOOLEAN)
|
||||
end else
|
||||
SRP_JSON(objReactor, 'SetValue', 'loadedRDS', '')
|
||||
end
|
||||
SRP_JSON(objReactor, 'SetValue', 'loadLockLeftRDS', LoadLockLeftRDS)
|
||||
SRP_JSON(objReactor, 'SetValue', 'loadLockRightRDS', LoadLockRightRDS)
|
||||
|
||||
// Add new reactor items here
|
||||
InstItems = Xlate('REACTOR', ReactorNo, REACTOR_CURR_INST_ITEMS$, 'X')
|
||||
@ -3676,7 +3768,7 @@ Service GetReactorAvailChamberCount(ReactNo)
|
||||
StartTick = GetTickCount()
|
||||
MetricName = 'GetReactorAvailChamberCount'
|
||||
|
||||
ErrMsg = 'Error in ReactorServices -> GetReactorAvailChamberCount: '
|
||||
ErrMsg = ''
|
||||
AvailableChamberCount = 0
|
||||
If ReactNo NE '' then
|
||||
If RowExists('REACTOR', ReactNo) then
|
||||
@ -3686,16 +3778,19 @@ Service GetReactorAvailChamberCount(ReactNo)
|
||||
AvailableChamberCount = ReactorCurrCapacity - ReactorCurrLoadCnt
|
||||
end else
|
||||
ErrMsg := 'Reactor ' : ReactNo : ' does not exist.'
|
||||
Error_Services('Add', ErrMsg)
|
||||
end
|
||||
end else
|
||||
ErrMsg := 'Reactor Number was null.'
|
||||
Error_Services('Add', ErrMsg)
|
||||
end
|
||||
Response = AvailableChamberCount
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
If ErrMsg NE '' then
|
||||
ErrMsg = 'Error in ReactorServices -> GetReactorAvailChamberCount: ':ErrMsg
|
||||
Error_Services('Add', ErrMsg)
|
||||
end
|
||||
end service
|
||||
|
||||
|
||||
|
@ -6,7 +6,7 @@ COMPILE FUNCTION React_Item(EntID,Event,Parm1,Parm2,Parm3,Parm4,Parm5)
|
||||
01/13/2014 - John C. Henry, J.C. Henry & Co., Inc. cloned from Graphite
|
||||
*/
|
||||
|
||||
DECLARE SUBROUTINE Set_Property, ErrMsg, obj_Appwindow, Btree.Extract, Send_Event, Post_Event, obj_React_Item
|
||||
DECLARE SUBROUTINE Set_Property, ErrMsg, obj_Appwindow, Btree.Extract, Send_Event, Post_Event, obj_React_Item, Forward_Event
|
||||
DECLARE FUNCTION Get_Property, Send_Message, NextKey, Popup, obj_Calendar, Printer_Select
|
||||
DECLARE FUNCTION Set_Printer, obj_Install, Start_Window, obj_React_Item_Hist, obj_React_Item, Dialog_Box
|
||||
|
||||
@ -15,6 +15,7 @@ $INSERT REACT_ITEM_EQUATES
|
||||
$INSERT REACT_ITEM_HIST_EQUATES
|
||||
$INSERT APPCOLORS
|
||||
$INSERT POPUP_EQUATES
|
||||
$INSERT LOGICAL
|
||||
|
||||
EQU COL$REACT_NO TO 1
|
||||
EQU COL$SVC_HRS TO 2
|
||||
@ -77,6 +78,9 @@ BEGIN CASE
|
||||
CASE EntID = @WINDOW:'.LU_PKT_QTY' AND Event = 'CLICK' ; GOSUB LUPktQty
|
||||
CASE EntID = @WINDOW:'.RETIRE_BUTTON' AND Event = 'CLICK' ; GOSUB RetireItem
|
||||
CASE EntID = @WINDOW:'.PRINT_LABEL' AND Event = 'CLICK' ; GOSUB PrintLabel
|
||||
CASE EntID = @WINDOW:'.RI_TYPE' AND Event = 'CHANGED' ; GOSUB RITypeChange
|
||||
CASE EntID = @WINDOW:'.PKT_SIZE' AND Event = 'CHANGED' ; GOSUB PktSizeChange
|
||||
CASE EntID = @WINDOW:'.PART_TYPE' AND Event = 'LOSTFOCUS' ; GOSUB PktSizeChange
|
||||
|
||||
CASE 1
|
||||
|
||||
@ -142,14 +146,11 @@ RETURN
|
||||
Read:
|
||||
* * * * * * *
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
GOSUB Refresh
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
* * * * * * *
|
||||
Write:
|
||||
* * * * * * *
|
||||
@ -261,9 +262,68 @@ FOR Line = 1 TO ListCnt
|
||||
NEXT N
|
||||
END
|
||||
NEXT Line
|
||||
RIType = Get_Property(@Window:'.RI_TYPE', 'TEXT')
|
||||
If RIType EQ 'S' then
|
||||
Set_Property(@Window:'.SUSC_GROUP', 'ENABLED', True$)
|
||||
Set_Property(@Window:'.PKT_SIZE_LABEL', 'ENABLED', True$)
|
||||
Set_Property(@Window:'.PKT_SIZE', 'ENABLED', True$)
|
||||
Set_Property(@Window:'.LU_PKT_SIZE', 'ENABLED', True$)
|
||||
Set_Property(@Window:'.PKT_SIZE_DESC', 'ENABLED', True$)
|
||||
Set_Property(@Window:'.PKT_QTY_LABEL', 'ENABLED', True$)
|
||||
Set_Property(@Window:'.LU_PKT_QTY', 'ENABLED', True$)
|
||||
Set_Property(@Window:'.PPLUS_RDS_NO_LABEL', 'ENABLED', True$)
|
||||
Set_Property(@Window:'.PPLUS_RDS_NO', 'ENABLED', True$)
|
||||
end else
|
||||
Set_Property(@Window:'.SUSC_GROUP', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.PKT_SIZE_LABEL', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.PKT_SIZE', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.PKT_SIZE', 'TEXT', '')
|
||||
Set_Property(@Window:'.LU_PKT_SIZE', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.PKT_SIZE_DESC', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.PKT_SIZE_DESC', 'TEXT', '')
|
||||
Set_Property(@Window:'PKT_QTY_LABEL', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.PKT_QTY', 'TEXT', '')
|
||||
Set_Property(@Window:'.LU_PKT_QTY', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.PPLUS_RDS_NO_LABEL', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.PPLUS_RDS_NO', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.PPLUS_RDS_NO', 'TEXT', '')
|
||||
end
|
||||
|
||||
RETURN
|
||||
|
||||
* * * * * * *
|
||||
RITypeChange:
|
||||
* * * * * * *
|
||||
|
||||
RIType = Get_Property(@Window:'.RI_TYPE', 'TEXT')
|
||||
If RIType EQ 'S' then
|
||||
Set_Property(@Window:'.SUSC_GROUP', 'ENABLED', True$)
|
||||
Set_Property(@Window:'.PKT_SIZE_LABEL', 'ENABLED', True$)
|
||||
Set_Property(@Window:'.PKT_SIZE', 'ENABLED', True$)
|
||||
Set_Property(@Window:'.LU_PKT_SIZE', 'ENABLED', True$)
|
||||
Set_Property(@Window:'.PKT_SIZE_DESC', 'ENABLED', True$)
|
||||
Set_Property(@Window:'.PKT_QTY_LABEL', 'ENABLED', True$)
|
||||
Set_Property(@Window:'.LU_PKT_QTY', 'ENABLED', True$)
|
||||
Set_Property(@Window:'.PPLUS_RDS_NO_LABEL', 'ENABLED', True$)
|
||||
Set_Property(@Window:'.PPLUS_RDS_NO', 'ENABLED', True$)
|
||||
end else
|
||||
Set_Property(@Window:'.SUSC_GROUP', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.PKT_SIZE_LABEL', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.PKT_SIZE', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.PKT_SIZE', 'TEXT', '')
|
||||
Set_Property(@Window:'.LU_PKT_SIZE', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.PKT_SIZE_DESC', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.PKT_SIZE_DESC', 'TEXT', '')
|
||||
Set_Property(@Window:'PKT_QTY_LABEL', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.PKT_QTY', 'TEXT', '')
|
||||
Set_Property(@Window:'.LU_PKT_QTY', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.PPLUS_RDS_NO_LABEL', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.PPLUS_RDS_NO', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.PPLUS_RDS_NO', 'TEXT', '')
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
|
||||
* * * * * * *
|
||||
RetireItem:
|
||||
@ -443,19 +503,47 @@ RETURN
|
||||
LUPktSize:
|
||||
* * * * * * *
|
||||
|
||||
RetVal = Popup(@WINDOW,'','WAFER_SIZES')
|
||||
|
||||
IF RetVal NE '' THEN
|
||||
oaParms = RetVal:@RM:@WINDOW:'.PKT_SIZE'
|
||||
obj_Appwindow('LUValReturn',oaParms)
|
||||
END
|
||||
Retired = Get_Property(@Window: '.RETIRE_DT', 'TEXT')
|
||||
RIType = Get_Property(@Window:'.RI_TYPE', 'TEXT')
|
||||
If RIType EQ 'S' then
|
||||
PocketQty = ''
|
||||
Set_Property(@Window:'.PKT_QTY', 'TEXT', '')
|
||||
PartType = Get_Property(@Window: '.PART_TYPE', 'TEXT')
|
||||
If (PartType EQ 'HTR') OR (PartType EQ 'EPP') OR (PartType EQ 'ASM') then
|
||||
RetVal = Popup(@WINDOW,TypeOver,'WAFER_SIZES')
|
||||
IF RetVal NE '' THEN
|
||||
oaParms = RetVal:@RM:@WINDOW:'.PKT_SIZE'
|
||||
obj_Appwindow('LUValReturn',oaParms)
|
||||
Begin Case
|
||||
Case PartType EQ 'HTR'
|
||||
If RetVal EQ 8 then
|
||||
PocketQty = 3
|
||||
end else
|
||||
If RetVal EQ 6 then PocketQty = 5
|
||||
end
|
||||
Case PartType EQ 'EPP'
|
||||
If RetVal EQ 8 then
|
||||
PocketQty = 8
|
||||
end else
|
||||
If RetVal EQ 6 then PocketQty = 18
|
||||
end
|
||||
Case PartType EQ 'ASM'
|
||||
If RetVal EQ 8 OR RetVal EQ 6 then PocketQty = 1
|
||||
|
||||
End Case
|
||||
Set_Property(@Window:'.PKT_QTY', 'TEXT', PocketQty)
|
||||
END
|
||||
end else
|
||||
If Retired EQ '' then ErrMsg('A valid Part Type (EPP, ASM, HTR) must be selected before selecting Pocket Size.')
|
||||
end
|
||||
end
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
* * * * * * *
|
||||
* * * * * *
|
||||
LUPktQty:
|
||||
* * * * * * *
|
||||
* * * * * *
|
||||
|
||||
ReactType = Get_Property(@WINDOW:'.REACT_TYPE','INVALUE')
|
||||
|
||||
@ -508,3 +596,43 @@ obj_React_Item('PrintLabel',RINo:@RM:CurrRec)
|
||||
RETURN
|
||||
|
||||
|
||||
PktSizeChange:
|
||||
|
||||
Retired = Get_Property(@Window: '.RETIRE_DT', 'TEXT')
|
||||
RIType = Get_Property(@Window:'.RI_TYPE', 'TEXT')
|
||||
If RIType EQ 'S' then
|
||||
PocketQty = ''
|
||||
Set_Property(@Window:'.PKT_QTY', 'TEXT', '')
|
||||
PktSize = Get_Property(@Window: '.PKT_SIZE', 'TEXT')
|
||||
PartType = Get_Property(@Window: '.PART_TYPE', 'TEXT')
|
||||
If (PartType EQ 'HTR') OR (PartType EQ 'EPP') OR (PartType EQ 'ASM') then
|
||||
If PktSize EQ 6 OR PktSize EQ 8 then
|
||||
Begin Case
|
||||
Case PartType EQ 'HTR'
|
||||
If PktSize EQ 8 then
|
||||
PocketQty = 3
|
||||
end else
|
||||
If PktSize EQ 6 then PocketQty = 5
|
||||
end
|
||||
Case PartType EQ 'EPP'
|
||||
If PktSize EQ 8 then
|
||||
PocketQty = 8
|
||||
end else
|
||||
If PktSize EQ 6 then PocketQty = 18
|
||||
end
|
||||
Case PartType EQ 'ASM'
|
||||
If PktSize EQ 8 OR PktSize EQ 6 then PocketQty = 1
|
||||
|
||||
End Case
|
||||
Set_Property(@Window:'.PKT_QTY', 'TEXT', PocketQty)
|
||||
end else
|
||||
If Retired EQ '' then ErrMsg('A valid Pocket Size (6 or 8 in.) is required.')
|
||||
end
|
||||
end else
|
||||
If Retired EQ '' then ErrMsg('A valid Part Type (EPP, ASM, HTR) must be selected before selecting Pocket Size.')
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
return
|
||||
|
||||
|
@ -135,12 +135,70 @@ return
|
||||
|
||||
WRITE_RECORD_PRE:
|
||||
|
||||
ErrMsg = ''
|
||||
ErrMsg = ''
|
||||
OrigRetireDt = OrigRecord<REACT_ITEM_RETIRE_DT$>
|
||||
NewRetireDt = Record<REACT_ITEM_RETIRE_DT$>
|
||||
|
||||
If OrigRetireDt EQ '' AND NewRetireDt NE '' then
|
||||
RetireBypass = True$
|
||||
end else
|
||||
RetireBypass = False$
|
||||
end
|
||||
|
||||
If RetireBypass EQ False$ then
|
||||
// Req'd parameter checks
|
||||
ItemType = {RI_TYPE}
|
||||
|
||||
// Req'd parameter checks
|
||||
ItemType = {RI_TYPE}
|
||||
|
||||
If ItemType EQ '' then ErrMsg := 'Item Type was not specified. '
|
||||
If ItemType EQ '' then ErrMsg := 'Item Type was not specified. '
|
||||
|
||||
If (ItemType NE 'LE') AND (ItemType NE 'RE') then
|
||||
SerialNo = Record<REACT_ITEM_SERIAL_NO$>
|
||||
If SerialNo EQ '' then
|
||||
ErrMsg := 'Serial No. is required for this Reactor Item type. '
|
||||
end
|
||||
end
|
||||
|
||||
If ItemType EQ 'S' then
|
||||
PocketQty = Record<REACT_ITEM_PKT_QTY$>
|
||||
PocketSize = Record<REACT_ITEM_PKT_SIZE$>
|
||||
If PocketSize EQ '' then
|
||||
ErrMsg := 'Pocket size is required for Susceptor Item Type. '
|
||||
end
|
||||
If PocketQty EQ '' then
|
||||
ErrMsg := 'Pocket quantity is required for Susceptor Item Type. '
|
||||
end
|
||||
If ErrMsg = '' then
|
||||
ExpectedQty = ''
|
||||
Begin Case
|
||||
Case Record<REACT_ITEM_PART_TYPE$> EQ 'ASM'
|
||||
If PocketSize EQ 6 OR PocketSize EQ 8 then
|
||||
ExpectedQty = 1
|
||||
end
|
||||
Case Record<REACT_ITEM_PART_TYPE$> EQ 'HTR'
|
||||
If PocketSize EQ 8 then
|
||||
ExpectedQty = 3
|
||||
end else
|
||||
If PocketSize EQ 6 then ExpectedQty = 5
|
||||
end
|
||||
Case Record<REACT_ITEM_PART_TYPE$> EQ 'EPP'
|
||||
If PocketSize EQ 8 then
|
||||
ExpectedQty = 8
|
||||
end else
|
||||
If PocketSize EQ 6 then ExpectedQty = 18
|
||||
end
|
||||
Case Record<REACT_ITEM_PART_TYPE$> EQ ''
|
||||
ErrMsg := 'Part Type. is required for Susceptor Reactor Item type. '
|
||||
Case Otherwise$
|
||||
ErrMsg := 'Invalid Part Type for Susceptor Reactor Item Type. '
|
||||
End Case
|
||||
If ExpectedQty NE '' then
|
||||
If PocketQty NE ExpectedQty then
|
||||
ErrMsg := 'Invalid Pocket Quantity for Part Type/Pocket Size combination. '
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
If ErrMsg NE '' then
|
||||
Error_Services('Add', 'Error Saving Reactor Item: ' : ErrMsg)
|
||||
@ -149,8 +207,6 @@ WRITE_RECORD_PRE:
|
||||
Record = ''
|
||||
ActionFlow = ACTION_STOP$
|
||||
end else
|
||||
OrigRetireDt = OrigRecord<REACT_ITEM_RETIRE_DT$>
|
||||
NewRetireDt = Record<REACT_ITEM_RETIRE_DT$>
|
||||
OrigNotes = OrigRecord<REACT_ITEM_NOTES$>
|
||||
NewNotes = Record<REACT_ITEM_NOTES$>
|
||||
If ( (OrigRetireDt NE NewRetireDt) or (OrigNotes NE NewNotes) ) then
|
||||
@ -233,3 +289,6 @@ Restore_System_Variables:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -46,7 +46,7 @@ Options BOOLEAN = True$, False$
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
Service GetReactItems(RIType, CurrStatus, EntryDtStart, EntryDtEnd, RetireDtStart, RetireDtEnd, IncludeNullRetireDt=BOOLEAN)
|
||||
Service GetReactItems(RIType, CurrStatus, EntryDtStart, EntryDtEnd, RetireDtStart, RetireDtEnd, IncludeNullRetireDt=BOOLEAN, PartType)
|
||||
|
||||
ErrorMsg = ''
|
||||
Response = ''
|
||||
@ -99,6 +99,9 @@ Service GetReactItems(RIType, CurrStatus, EntryDtStart, EntryDtEnd, RetireDtStar
|
||||
Swap ',' with @VM in CurrStatus
|
||||
SearchString := 'CURR_STATUS_STATIC':@VM:CurrStatus:@FM
|
||||
end
|
||||
If PartType NE '' then
|
||||
SearchString := 'PART_TYPE':@VM:PartType:@FM
|
||||
end
|
||||
Flag = ''
|
||||
RIKeys = ''
|
||||
Btree.Extract(SearchString, 'REACT_ITEM', DictReactItem, RIKeys, 'E', Flag)
|
||||
@ -370,7 +373,7 @@ Service GetReactItemTemplateJSON()
|
||||
end else
|
||||
Error_Services('Add', 'Unable to create JSON representation in the ' : Service : ' service.')
|
||||
end
|
||||
|
||||
|
||||
Response = jsonRecord
|
||||
|
||||
end service
|
||||
@ -381,17 +384,15 @@ Service CreateReactItem(Record)
|
||||
ErrMsg = ''
|
||||
KeyID = ''
|
||||
If Record NE '' then
|
||||
//Need to do some parameter checks here
|
||||
ReactItemType = Record<REACT_ITEM_RI_TYPE$>
|
||||
If ReactItemType EQ '' then
|
||||
ErrMsg := 'React Item Type was blank!' : CRLF$
|
||||
end
|
||||
If ErrMsg EQ '' then
|
||||
KeyID = NextKey('REACT_ITEM')
|
||||
If Error_Services('NoError') and KeyID NE '' then
|
||||
Database_Services('WriteDataRow', 'REACT_ITEM', KeyID, Record)
|
||||
Database_Services('WriteDataRow', 'REACT_ITEM', KeyID, Record, True$, False$, False$)
|
||||
If Error_Services('HasError') then
|
||||
ErrMsg := Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrMsg := 'Failed to generate a key for a new react item. ' : CRLF$
|
||||
ErrMsg := 'Failed to generate a key for a new react item. '
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -457,6 +458,31 @@ Service ConvertRecordToJSONQuick(KeyID, Record, ItemURL)
|
||||
end service
|
||||
|
||||
|
||||
Service UpdateReactItem(RINo, Record)
|
||||
|
||||
ErrorMsg = ''
|
||||
If RINo EQ '' then
|
||||
ErrorMsg := 'React Item ID argument was missing in the ' : Service : ' service. '
|
||||
end
|
||||
If Record EQ '' then
|
||||
ErrorMsg := 'React Item Record argument was missing in the ' : Service : ' service. '
|
||||
end
|
||||
If ErrorMsg EQ '' then
|
||||
If RowExists('REACT_ITEM', RINo) then
|
||||
Database_Services('WriteDataRow', 'REACT_ITEM', RINo, Record, True$, False$, False$)
|
||||
If Error_Services('HasError') then
|
||||
ErrorMsg := Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg := 'React Item not found. '
|
||||
end
|
||||
end
|
||||
If ErrorMsg NE '' then
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
Service UpdateReactItemStatus(RINo)
|
||||
|
||||
If RINo NE '' then
|
||||
@ -493,3 +519,7 @@ ClearCursors:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
174
LSL2/STPROC/RECEIVECASSETTE_API.txt
Normal file
174
LSL2/STPROC/RECEIVECASSETTE_API.txt
Normal 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
|
||||
|
@ -243,4 +243,3 @@ API reports.GET
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
|
@ -150,7 +150,7 @@ Service GetMakeupInventoryReportJSON()
|
||||
end else
|
||||
LotID = Row<0, 2>:'*1*':Row<0, 3>
|
||||
end
|
||||
WcRec = Wafer_Counter_Services('GetLastScan', LotID, 'MU')
|
||||
WcRec = Wafer_Counter_Services('GetLastScan', LotID)
|
||||
WcQty = WcRec<WAFER_COUNTER.SCAN_QTY$>
|
||||
WcDtm = WcRec<WAFER_COUNTER.SCAN_DTM$>
|
||||
|
||||
@ -1446,8 +1446,11 @@ Service GenerateMaterialTrackRows()
|
||||
ErrCode = ''
|
||||
ErrorMsg = ''
|
||||
|
||||
SchedDetTable = ''
|
||||
SchedDetDict = ''
|
||||
|
||||
OPEN 'SCHED_DET_NG' TO SchedDetTable then
|
||||
OPEN 'DICT.SCHED_DET_NG' TO @DICT then
|
||||
OPEN 'DICT.SCHED_DET_NG' TO SchedDetDict then
|
||||
Today = Datetime()
|
||||
|
||||
ReactList = ''
|
||||
@ -1466,12 +1469,12 @@ Service GenerateMaterialTrackRows()
|
||||
END
|
||||
|
||||
Done = 0
|
||||
@ID = ''
|
||||
CurrSchedDetKey = ''
|
||||
LOOP
|
||||
PrevSchedDetKey = @ID
|
||||
READNEXT @ID ELSE Done = 1
|
||||
PrevSchedDetKey = CurrSchedDetKey
|
||||
READNEXT CurrSchedDetKey ELSE Done = 1
|
||||
UNTIL Done
|
||||
READ SchedDetRec FROM SchedDetTable,@ID THEN
|
||||
READ SchedDetRec FROM SchedDetTable,CurrSchedDetKey THEN
|
||||
ReactNo = SchedDetRec<SCHED_DET_NG.REACT_NO$>
|
||||
WONo = SchedDetRec<SCHED_DET_NG.WO_NO$>
|
||||
If ReactNo NE '' then
|
||||
@ -1482,20 +1485,20 @@ Service GenerateMaterialTrackRows()
|
||||
If WONo NE '' then
|
||||
LOCATE WONo IN WOList<Pos> USING @VM SETTING WPos ELSE
|
||||
WOList = INSERT(WOList,Pos,-1,0,WONo)
|
||||
SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,@ID)
|
||||
SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,CurrSchedDetKey)
|
||||
END
|
||||
END
|
||||
END
|
||||
|
||||
REPEAT
|
||||
|
||||
CALL Make.List(0,SchedDetKeys,SchedDetTable,@DICT)
|
||||
CALL Make.List(0, SchedDetKeys, SchedDetTable, SchedDetDict)
|
||||
|
||||
DateRange = 'Effective ':OCONV(Date(),'D4')
|
||||
|
||||
RowIndex = 0
|
||||
AllReportData = ''
|
||||
@RECCOUNT = 0
|
||||
RecCount = 0
|
||||
FirstPass = 1
|
||||
LastRecord = 0
|
||||
FirstLine = 1
|
||||
@ -1506,48 +1509,50 @@ Service GenerateMaterialTrackRows()
|
||||
Prev.ReactNo = ''
|
||||
Last.ReactNo.Break = 1
|
||||
|
||||
CurrSchedDetRec = ''
|
||||
|
||||
Loop
|
||||
|
||||
ReactNo.Break = 0
|
||||
|
||||
READNEXT @ID, Which.Value ELSE
|
||||
READNEXT CurrSchedDetKey, Which.Value ELSE
|
||||
LastRecord = 1
|
||||
ReactNo.Break = 1
|
||||
ReactNo = Prev.ReactNo
|
||||
END
|
||||
|
||||
S.ATID = @ID
|
||||
S.ATID = CurrSchedDetKey
|
||||
Abort = (FirstPass and LastRecord)
|
||||
If Not(Abort) then
|
||||
|
||||
If Not(LastRecord) then
|
||||
|
||||
READO @RECORD FROM SchedDetTable,@ID then
|
||||
READO CurrSchedDetRec FROM SchedDetTable,CurrSchedDetKey then
|
||||
|
||||
// GOTO ReadRecord
|
||||
@RECCOUNT += 1
|
||||
RecCount += 1
|
||||
|
||||
* Calculate Value(s) For Column(s)
|
||||
|
||||
S.StartDtm = {START_DTM}
|
||||
S.ATID = {@ID}
|
||||
S.StartDtm = CurrSchedDetRec<SCHED_DET_NG.START_DTM$>
|
||||
S.ATID = CurrSchedDetKey
|
||||
I.ATID = S.ATID
|
||||
S.ReactNo = {REACT_NO}
|
||||
S.ReactNo = CurrSchedDetRec<SCHED_DET_NG.REACT_NO$>
|
||||
I.ReactNo = S.ReactNo
|
||||
S.WoNo = {WO_NO}
|
||||
S.WoNo = CurrSchedDetRec<SCHED_DET_NG.WO_NO$>
|
||||
I.WoNo = S.WoNo
|
||||
S.SubPartNo = XLATE('WO_LOG', S.WoNo, 'ORD_SUB_PART_NO', 'X')
|
||||
I.SubPartNo = S.SubPartNo
|
||||
S.EpiPartNo = XLATE('WO_LOG', S.WoNo, WO_LOG_EPI_PART_NO$, 'X')
|
||||
I.EpiPartNo = S.EpiPartNo
|
||||
S.WO_Qty = Xlate('WO_LOG', {WO_NO}, WO_LOG_WO_QTY$, 'X')
|
||||
S.WO_Qty = Xlate('WO_LOG', S.WoNo, WO_LOG_WO_QTY$, 'X')
|
||||
I.WO_Qty = S.WO_Qty
|
||||
S.WO_RX_Qty = Xlate('WO_LOG', {WO_NO}, 'RX_QTY', 'X')
|
||||
S.WO_RX_Qty = Xlate('WO_LOG', S.WoNo, 'RX_QTY', 'X')
|
||||
I.WO_RX_Qty = S.WO_RX_Qty
|
||||
S.WO_UnRel_QTY = Xlate('WO_LOG', {WO_NO}, 'UNREL_QTY', 'X')
|
||||
S.WO_UnRel_QTY = Xlate('WO_LOG', S.WoNo, 'UNREL_QTY', 'X')
|
||||
I.WO_UnRel_QTY = S.WO_UnRel_QTY
|
||||
S.REACT_TYPE = Xlate('WO_LOG', {WO_NO}, 'REACT_TYPE', 'X')
|
||||
S.ProdOrdNo = Xlate('WO_LOG', {WO_NO}, 'PROD_ORD_NO', 'X')
|
||||
S.REACT_TYPE = Xlate('WO_LOG', S.WoNo, 'REACT_TYPE', 'X')
|
||||
S.ProdOrdNo = Xlate('WO_LOG', S.WoNo, 'PROD_ORD_NO', 'X')
|
||||
|
||||
Locate 'SR*KTR]' in LocationFilter using @VM setting vPos then
|
||||
KitData = Location_Services('GetLocationCassInfo', S.WONo, 'SR*KTR]')
|
||||
@ -1898,9 +1903,12 @@ Service PrintMaterialTrackReport(RptColumns, LocationFilter, NoMatFlag, OldRepor
|
||||
ErrorTitle = 'Error in service ':Service
|
||||
ErrCode = ''
|
||||
ErrorMsg = ''
|
||||
|
||||
SchedDetTable = ''
|
||||
SchedDetDict = ''
|
||||
|
||||
OPEN 'SCHED_DET_NG' TO SchedDetTable then
|
||||
OPEN 'DICT.SCHED_DET_NG' TO @DICT then
|
||||
OPEN 'DICT.SCHED_DET_NG' TO SchedDetDict then
|
||||
Today = Datetime()
|
||||
|
||||
ReactList = ''
|
||||
@ -1921,13 +1929,13 @@ Service PrintMaterialTrackReport(RptColumns, LocationFilter, NoMatFlag, OldRepor
|
||||
RETURN
|
||||
END
|
||||
|
||||
Done = 0
|
||||
@ID = ''
|
||||
Done = 0
|
||||
CurrSchedDetKey = ''
|
||||
LOOP
|
||||
PrevSchedDetKey = @ID
|
||||
READNEXT @ID ELSE Done = 1
|
||||
PrevSchedDetKey = CurrSchedDetKey
|
||||
READNEXT CurrSchedDetKey ELSE Done = 1
|
||||
UNTIL Done
|
||||
READ SchedDetRec FROM SchedDetTable,@ID THEN
|
||||
READ SchedDetRec FROM SchedDetTable,CurrSchedDetKey THEN
|
||||
ReactNo = SchedDetRec<SCHED_DET_NG.REACT_NO$>
|
||||
WONo = SchedDetRec<SCHED_DET_NG.WO_NO$>
|
||||
If ReactNo NE '' then
|
||||
@ -1938,14 +1946,14 @@ Service PrintMaterialTrackReport(RptColumns, LocationFilter, NoMatFlag, OldRepor
|
||||
If WONo NE '' then
|
||||
LOCATE WONo IN WOList<Pos> USING @VM SETTING WPos ELSE
|
||||
WOList = INSERT(WOList,Pos,-1,0,WONo)
|
||||
SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,@ID)
|
||||
SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,CurrSchedDetKey)
|
||||
END
|
||||
END
|
||||
END
|
||||
|
||||
REPEAT
|
||||
|
||||
CALL Make.List(0,SchedDetKeys,SchedDetTable,@DICT)
|
||||
CALL Make.List(0,SchedDetKeys,SchedDetTable,SchedDetDict)
|
||||
|
||||
Header = "'D'":@VM:obj_Install('Get_Prop','CompTitle'):' Material Tracking by Reactor':@VM:"Page 'P'"
|
||||
MinDemand = 0
|
||||
@ -1988,7 +1996,7 @@ Service PrintMaterialTrackReport(RptColumns, LocationFilter, NoMatFlag, OldRepor
|
||||
Footer = " 'D' 'T'":@VM:@VM:"Page: 'P'"
|
||||
stat = Set_Printer('FOOTER',Footer)
|
||||
If Stat GE 0 then
|
||||
@RECCOUNT = 0
|
||||
RecCount = 0
|
||||
FirstPass = 1
|
||||
LastRecord = 0
|
||||
FirstLine = 1
|
||||
@ -2010,48 +2018,48 @@ Service PrintMaterialTrackReport(RptColumns, LocationFilter, NoMatFlag, OldRepor
|
||||
Prev.ReactNo = ''
|
||||
Last.ReactNo.Break = 1
|
||||
|
||||
CurrSchedDetRec = ''
|
||||
|
||||
Loop
|
||||
|
||||
* Zero Break Flags To False
|
||||
|
||||
ReactNo.Break = 0
|
||||
|
||||
READNEXT @ID, Which.Value ELSE
|
||||
READNEXT CurrSchedDetKey, Which.Value ELSE
|
||||
LastRecord = 1
|
||||
ReactNo.Break = 1
|
||||
ReactNo = Prev.ReactNo
|
||||
END
|
||||
|
||||
S.ATID = @ID
|
||||
S.ATID = CurrSchedDetKey
|
||||
Abort = (FirstPass AND LastRecord)
|
||||
IF Not(Abort) THEN
|
||||
|
||||
IF Not(LastRecord) then
|
||||
READO @RECORD FROM SchedDetTable,@ID then
|
||||
READO CurrSchedDetRec FROM SchedDetTable,CurrSchedDetKey then
|
||||
|
||||
@RECCOUNT += 1
|
||||
RecCount += 1
|
||||
|
||||
* Calculate Value(s) For Column(s)
|
||||
|
||||
S.ATID = {@ID}
|
||||
I.ATID = S.ATID
|
||||
S.ReactNo = {REACT_NO}
|
||||
I.ReactNo = S.ReactNo
|
||||
S.WoNo = {WO_NO}
|
||||
I.WoNo = S.WoNo
|
||||
S.SubPartNo = XLATE('WO_LOG', S.WoNo, 'ORD_SUB_PART_NO', 'X')
|
||||
I.SubPartNo = S.SubPartNo
|
||||
S.EpiPartNo = XLATE('WO_LOG', S.WoNo, WO_LOG_EPI_PART_NO$, 'X')
|
||||
I.EpiPartNo = S.EpiPartNo
|
||||
S.WO_Qty = Xlate('WO_LOG', {WO_NO}, WO_LOG_WO_QTY$, 'X')
|
||||
I.WO_Qty = S.WO_Qty
|
||||
S.WO_RX_Qty = Xlate('WO_LOG', {WO_NO}, 'RX_QTY', 'X')
|
||||
I.WO_RX_Qty = S.WO_RX_Qty
|
||||
S.WO_UnRel_QTY = Xlate('WO_LOG', {WO_NO}, 'UNREL_QTY', 'X')
|
||||
I.WO_UnRel_QTY = S.WO_UnRel_QTY
|
||||
S.REACT_TYPE = Xlate('WO_LOG', {WO_NO}, 'REACT_TYPE', 'X')
|
||||
S.ProdOrdNo = Xlate('WO_LOG', {WO_NO}, 'PROD_ORD_NO', 'X')
|
||||
|
||||
S.ATID = CurrSchedDetKey
|
||||
I.ATID = S.ATID
|
||||
S.ReactNo = CurrSchedDetRec<SCHED_DET_NG.REACT_NO$>
|
||||
I.ReactNo = S.ReactNo
|
||||
S.WoNo = CurrSchedDetRec<SCHED_DET_NG.WO_NO$>
|
||||
I.WoNo = S.WoNo
|
||||
S.SubPartNo = XLATE('WO_LOG', S.WoNo, 'ORD_SUB_PART_NO', 'X')
|
||||
I.SubPartNo = S.SubPartNo
|
||||
S.EpiPartNo = XLATE('WO_LOG', S.WoNo, WO_LOG_EPI_PART_NO$, 'X')
|
||||
I.EpiPartNo = S.EpiPartNo
|
||||
S.WO_Qty = Xlate('WO_LOG', S.WoNo, WO_LOG_WO_QTY$, 'X')
|
||||
I.WO_Qty = S.WO_Qty
|
||||
S.WO_RX_Qty = Xlate('WO_LOG', S.WoNo, 'RX_QTY', 'X')
|
||||
I.WO_RX_Qty = S.WO_RX_Qty
|
||||
S.WO_UnRel_QTY = Xlate('WO_LOG', S.WoNo, 'UNREL_QTY', 'X')
|
||||
I.WO_UnRel_QTY = S.WO_UnRel_QTY
|
||||
S.REACT_TYPE = Xlate('WO_LOG', S.WoNo, 'REACT_TYPE', 'X')
|
||||
S.ProdOrdNo = Xlate('WO_LOG', S.WoNo, 'PROD_ORD_NO', 'X')
|
||||
|
||||
If OldReport then
|
||||
|
||||
@ -2332,7 +2340,9 @@ Service PrintMaterialTrackReport(RptColumns, LocationFilter, NoMatFlag, OldRepor
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service GetOpenNCRReportJson()
|
||||
|
||||
ErrorMessage = ''
|
||||
OpenNCRReportJson = ''
|
||||
OpenNCRKeyList = NCR_Services('GetOpenNCRKeys')
|
||||
@ -2435,4 +2445,3 @@ OipiPrintError:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
@ -1320,3 +1320,4 @@ Service MigrateLegacyRTFRecord(RTFRecordId)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
@ -263,6 +263,7 @@ API scan.ID.PATCH
|
||||
SRP_Stopwatch('Start', 'IDPatchResponseTime')
|
||||
// First confirm that this is a valid Scan ID.
|
||||
jsonScan = Scan_Services('GetScansRow', ScanID, True$)
|
||||
ErrMsg = ''
|
||||
If Error_Services('NoError') then
|
||||
// Confirm that all required data has been scanned before allowing the "accept" field to be updated.
|
||||
ParseResponse = SRP_JSON(objResource, 'Parse', jsonScan)
|
||||
@ -293,7 +294,7 @@ API scan.ID.PATCH
|
||||
end
|
||||
end else
|
||||
ScanNotAcceptableReason = SRP_JSON(objResource, 'GetValue', 'scan.notAcceptableReason')
|
||||
Error_Services('Add', ScanNotAcceptableReason)
|
||||
ErrMsg = ScanNotAcceptableReason
|
||||
end
|
||||
SRP_JSON(objResource, 'Release')
|
||||
end else
|
||||
@ -324,6 +325,8 @@ API scan.ID.PATCH
|
||||
end
|
||||
LogData<6> = ResponseStatusCode
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
|
||||
|
||||
If ErrMsg NE '' then Error_Services('Add', ErrMsg)
|
||||
end api
|
||||
|
||||
|
||||
@ -435,6 +438,3 @@ CreateHALItem:
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
@ -51,6 +51,7 @@ Declare function GetTickCount
|
||||
Declare Subroutine Scan_Services, Memory_Services, Database_Services, SRP_JSON, QA_Services, Error_Services
|
||||
Declare Subroutine obj_WO_Mat_Log, Tool_Parms_Services, RDS_Services, Logging_Services, Supplement_Services
|
||||
Declare Subroutine Test_Run_Services, WO_MAT_Services, Reactor_Log_Services, Schedule_Services, Mona_Services
|
||||
Declare Subroutine Dialog_Response_Log_Services
|
||||
|
||||
Equ CRLF$ to \0D0A\
|
||||
|
||||
@ -213,19 +214,22 @@ Service GetScansRow(ScanID, ReturnJSON)
|
||||
|
||||
ScansRow = ''
|
||||
|
||||
ErrMsg = ''
|
||||
If ScanID NE '' then
|
||||
ScansRow = Database_Services('ReadDataRow', 'SCANS', ScanID)
|
||||
If ReturnJSON EQ True$ then
|
||||
ScansRow = Scan_Services('ConvertMVScanToJSON', ScanID, ScansRow)
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'ScanID argument was missing in the ' : Service : ' service.')
|
||||
ErrMsg = 'ScanID argument was missing in the ' : Service : ' service.'
|
||||
end
|
||||
|
||||
Response = ScansRow
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
If ErrMsg NE '' then Error_Services('Add', ErrMsg)
|
||||
end service
|
||||
|
||||
|
||||
@ -238,14 +242,17 @@ Service SetScansRow(ScanID, ScansRow)
|
||||
StartTick = GetTickCount()
|
||||
MetricName = 'SetScansRow'
|
||||
|
||||
ErrMsg = ''
|
||||
If (ScanID NE '') AND (ScansRow NE '') then
|
||||
Database_Services('WriteDataRow', 'SCANS', ScanID, ScansRow)
|
||||
end else
|
||||
Error_Services('Add', 'ScanID or ScansRow argument was missing in the ' : Service : ' service.')
|
||||
ErrMsg = 'ScanID or ScansRow argument was missing in the ' : Service : ' service.'
|
||||
end
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
If ErrMsg NE '' then Error_Services('Add', ErrMsg)
|
||||
end service
|
||||
|
||||
|
||||
@ -261,6 +268,7 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
StartTick = GetTickCount()
|
||||
MetricName = 'ProcessScanData'
|
||||
|
||||
ErrMsg = ''
|
||||
If ( (ScanID NE '') AND (ScanJSON NE '') ) then
|
||||
hScanJSON = ''
|
||||
ParseResponse = SRP_JSON(hScanJSON, 'PARSE', ScanJSON)
|
||||
@ -299,7 +307,7 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
If RowExists('LOT', LotId) then
|
||||
TWLots = ScansRow<SCANS.TW_LOT_ID$>
|
||||
Locate LotId in TWLots using @VM setting twPos then
|
||||
Error_Services('Add', LotID : ' has already been added as a test wafer lot being used.')
|
||||
ErrMsg = LotID : ' has already been added as a test wafer lot being used.'
|
||||
end else
|
||||
ScansRow<SCANS.TW_LOT_CHANGED$> = True$
|
||||
LotCurrentOperation = Lot_Services('GetLotCurrOperationName', LotId)
|
||||
@ -315,14 +323,14 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
ScansRow<SCANS.TW_LOT_QTY$, twPos> = 1
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', LotID : ' does not have enough wafers to be used.')
|
||||
ErrMsg = LotID : ' does not have enough wafers to be used.'
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', LotID : ' is not at a valid operation for use.')
|
||||
ErrMsg = LotID : ' is not at a valid operation for use.'
|
||||
end
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', LotID : ' is not a valid test wafer lot ID.')
|
||||
ErrMsg = LotID : ' is not a valid test wafer lot ID.'
|
||||
end
|
||||
|
||||
Case Otherwise$
|
||||
@ -349,9 +357,9 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
Case EmployeeAuthorized NE True$
|
||||
// Regardless of the not authorized reason, the scan data will be considered invalid.
|
||||
EmployeeNotAuthorizedReason = {EMPLOYEE_NOT_AUTHORIZED_REASON}
|
||||
Error_Services('Add', EmployeeNotAuthorizedReason)
|
||||
ErrMsg = EmployeeNotAuthorizedReason
|
||||
Case EmployeeActive NE True$
|
||||
Error_Services('Add', 'Inactive employee.')
|
||||
ErrMsg = 'Inactive employee.'
|
||||
Case Otherwise$
|
||||
ScansRow<SCANS.EMPLOYEE_ID$> = {EMPLOYEE_ID}
|
||||
|
||||
@ -394,7 +402,7 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
If (EmployeeAuthorized NE True$) AND ({EMPLOYEE_ID} NE '') then
|
||||
// Regardless of the not authorized reason, the scan data will be considered invalid.
|
||||
EmployeeNotAuthorizedReason = {EMPLOYEE_NOT_AUTHORIZED_REASON}
|
||||
Error_Services('Add', EmployeeNotAuthorizedReason)
|
||||
ErrMsg = EmployeeNotAuthorizedReason
|
||||
end else
|
||||
* If LoadLock EQ '' then LoadLock = 'NA' ; // NA means Not Applicable.
|
||||
ReactorID = ToolID[2, 999]
|
||||
@ -414,10 +422,10 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
ScansRow<SCANS.TOOL_ID$> = ToolID
|
||||
ScansRow<SCANS.LOAD_LOCK$> = LoadLock
|
||||
end else
|
||||
Error_Services('Add', 'Invalid load lock value "':LoadLock:'".')
|
||||
ErrMsg = 'Invalid load lock value "':LoadLock:'".'
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'A load lock side "L" or "R" is required for reactor ':ReactorID:'.')
|
||||
ErrMsg = 'A load lock side "L" or "R" is required for reactor ':ReactorID:'.'
|
||||
end
|
||||
Case (LoadLockReq EQ False$)
|
||||
If ScansRow<SCANS.LOCATION_ID$> NE '' then
|
||||
@ -432,17 +440,17 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
|
||||
end
|
||||
Case ToolType _EQC 'Transfer'
|
||||
Error_Services('Add', 'Tool type ':ToolType:' is not currently supported by the barcode application.')
|
||||
ErrMsg = 'Tool type ':ToolType:' is not currently supported by the barcode application.'
|
||||
// Code below may be implemented down the road.
|
||||
// This is a transfer tool. Just update the scan resource.
|
||||
* ScansRow<SCANS.LOCATION_ID$> = '' ; // Make sure the Location ID is cleared.
|
||||
* ScansRow<SCANS.CASSETTE_IDS$> = ScansRow<SCANS.CASSETTE_IDS$, 1> ; // Make sure only the first Cassette ID is tracked.
|
||||
* ScansRow<SCANS.TRANSFER_TOOL_ID$> = ToolID
|
||||
Case Otherwise$
|
||||
Error_Services('Add', 'Tool type ':ToolType:' is not currently supported by the barcode application.')
|
||||
ErrMsg = 'Tool type ':ToolType:' is not currently supported by the barcode application.'
|
||||
End Case
|
||||
end else
|
||||
Error_Services('Add', ToolID : ' is not a valid tool ID.')
|
||||
ErrMsg = ToolID : ' is not a valid tool ID.'
|
||||
end
|
||||
|
||||
Case ScanData[1, 2] EQ '1L'
|
||||
@ -460,7 +468,7 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
ScansRow<SCANS.TRANSFER_TOOL_ID$> = '' ; // Make sure the Transfer Tool ID is cleared.
|
||||
ScansRow<SCANS.LOCATION_ID$> = LocationID
|
||||
end else
|
||||
Error_Services('Add', LocationID : ' is not a valid location ID.')
|
||||
ErrMsg = LocationID : ' is not a valid location ID.'
|
||||
end
|
||||
|
||||
Case ScanData[1, 2] EQ '1B'
|
||||
@ -475,7 +483,7 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
ScansRow<SCANS.BOAT_ID$> = BoatID
|
||||
ScansRow<SCANS.PL_NUMBER$> = PLNo
|
||||
end else
|
||||
Error_Services('Add', ScanData : ' is not a valid boat ID.')
|
||||
ErrMsg = ScanData : ' is not a valid boat ID.'
|
||||
end
|
||||
Case ScanData[1, 3] EQ 'PWD'
|
||||
// Password/Signature scan. If the scan is not ready to be accepted or the password does
|
||||
@ -490,14 +498,14 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
ScansRow<SCANS.AUTHENTICATED$> = 1
|
||||
end else
|
||||
ScansRow<SCANS.AUTHENTICATED$> = 0
|
||||
Error_Services('Add', 'Invalid password for user ':EmployeeID:'.')
|
||||
ErrMsg = 'Invalid password for user ':EmployeeID:'.'
|
||||
end
|
||||
ScansRow<SCANS.EMPLOYEE_CHANGED$> = True$
|
||||
end else
|
||||
Error_Services('Add', 'An employee ID must be scanned before scanning a password.')
|
||||
ErrMsg = 'An employee ID must be scanned before scanning a password.'
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Invalid password scanned.')
|
||||
ErrMsg = 'Invalid password scanned.'
|
||||
end
|
||||
Case ScanData[1, 8] EQ 'OVERRIDE'
|
||||
|
||||
@ -564,7 +572,7 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
end
|
||||
|
||||
end else
|
||||
Error_Services('Add', 'Selected Employee is not authorized to perform an override')
|
||||
ErrMsg = 'Selected Employee is not authorized to perform an override'
|
||||
end
|
||||
end
|
||||
Case ScanData[1, 2] EQ '5T'
|
||||
@ -650,11 +658,11 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
ScansRow<SCANS.CASSETTE_IDS$> = CassetteID
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', CassetteID : ' is not a valid Cassette ID.')
|
||||
ErrMsg = CassetteID : ' is not a valid Cassette ID.'
|
||||
end
|
||||
End Case
|
||||
|
||||
If Error_Services('NoError') then
|
||||
If ErrMsg EQ '' then
|
||||
// Process Scan row data here to determine the type of scan (i.e. Location, Pre-Epi + Load, or Unload).
|
||||
ScanType = ScansRow<SCANS.SCAN_TYPE$>
|
||||
CassetteIDs = ScansRow<SCANS.CASSETTE_IDS$>
|
||||
@ -681,7 +689,7 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
LastCassScanned = CassetteIDs<0, NumCass>
|
||||
CurrStage = Xlate('RDS', LastCassScanned, 'CURR_STAGE', 'X')
|
||||
If CurrStage EQ 'UNLOAD' then
|
||||
Error_Services('Add', '(':LastCassScanned:') Cassette is currently loaded on a tool and is ineligble for a location scan.')
|
||||
ErrMsg = '(':LastCassScanned:') Cassette is currently loaded on a tool and is ineligble for a location scan.'
|
||||
end
|
||||
|
||||
Case ScanType EQ 'TOOL'
|
||||
@ -755,7 +763,9 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
CassNo = Xlate('RDS', CassetteID, 'CASS_NO', 'X')
|
||||
WOMatKey = WONo:'*':CassNo
|
||||
WOMatLocs = Xlate('WO_MAT', WOMatKey, WO_MAT_INV_LOCATION$, 'X')
|
||||
If Index(WOMatLocs,'PTI',1) else Error_Services('Add', 'Cassette ':CassetteID:' failed due to missing PTI.')
|
||||
If Index(WOMatLocs,'PTI',1) else
|
||||
ErrMsg = 'Cassette ':CassetteID:' failed due to missing PTI.'
|
||||
end
|
||||
end else
|
||||
// EpiPro RDS
|
||||
OutCassNos = Xlate('RDS', CassetteID, 'OUT_CASS_NO', 'X')
|
||||
@ -765,11 +775,13 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
CassNo = OutCassNo
|
||||
WOMatKey = WONo:'*':CassNo
|
||||
WOMatLocs = Xlate('WO_MAT', WOMatKey, WO_MAT_INV_LOCATION$, 'X')
|
||||
If Index(WOMatLocs,'PTI',1) else Error_Services('Add', 'Cassette ':CassetteID:' failed due to missing PTI.')
|
||||
If Index(WOMatLocs,'PTI',1) else
|
||||
ErrMsg = 'Cassette ':CassetteID:' failed due to missing PTI.'
|
||||
end
|
||||
Next OutCassNo
|
||||
end
|
||||
|
||||
If Error_Services('NoError') then
|
||||
If ErrMsg EQ '' then
|
||||
If CurrStatus NE 'HOLD' then
|
||||
If (EmployeeID NE '') then
|
||||
* SupplInstAckReq = Xlate('RDS', RDSNo, 'SUPPL_ACK_REQ' , 'X')
|
||||
@ -973,76 +985,77 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
FirstParmsComp = LSParmsComp<1,1>
|
||||
If (FirstParmsComp EQ False$) then RDS_Services('CopyRDSLayerParameters', RDSNo)
|
||||
//Test Wafer logging verification
|
||||
|
||||
|
||||
// Supplier lot verification
|
||||
ScannedSuppLot = ScansRow<SCANS.SUPPLIER_LOT$>
|
||||
RDSSuppLot = RDSRec<RDS_LOT_NUM$>
|
||||
If (ScannedSuppLot NE '') then
|
||||
If (ScannedSuppLot _EQC RDSSuppLot) then
|
||||
IsTWLoggingReqd = RDS_Services('IsTWLoggingReqd', RDSNo)
|
||||
If IsTWLoggingReqd NE True$ OR TestWaferLotData NE '' then
|
||||
WaferCountAckReq = Xlate('RDS', RDSNo, 'WAFER_COUNT_ACK_REQ', 'X')
|
||||
If WaferCountAckReq EQ False$ then
|
||||
PreStageReady = ''
|
||||
LoadStageReady = ''
|
||||
PreStageReady = QA_Services('PreEpiSignatureReady', RDSNo, Username, WaferQty, Reactor)
|
||||
If PreStageReady EQ True$ then
|
||||
LoadStageReady = QA_Services('LoadSignatureReady', RDSNo, Username, WaferQty, LLSide, True$, Reactor)
|
||||
If (LoadStageReady NE True$) then
|
||||
// Why is it not ready?
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
Begin Case
|
||||
Case IndexC(ErrorMsg, 'supplement', 1)
|
||||
// Clear the error to return a JSON payload and handle the acknowledgements.
|
||||
Error_Services('Clear')
|
||||
Scan_Services('AddNotAcceptableReason', ErrorMsg)
|
||||
Case IndexC(ErrorMsg, 'ROTR', 1)
|
||||
ROTRBlock = Database_Services('ReadDataColumn', 'REACTOR', Reactor, REACTOR_ROTR_STATUS$, True$, 0, False$)
|
||||
ROTRBlockReason = Database_Services('ReadDataColumn', 'REACTOR', Reactor, REACTOR_ROTR_STATUS_REASON$, True$, 0, False$)
|
||||
ROTREnabled = Database_Services('ReadDataColumn', 'REACTOR', Reactor, REACTOR_ENABLE_ROTR$, True$, 0, False$)
|
||||
If ( (ROTRBlock NE 'P') AND (ROTREnabled EQ True$) ) then
|
||||
// Clear the error to return a JSON payload and allow for OVERRIDE scan.
|
||||
ScansRow<SCANS.OVERRIDE_REQD$> = True$
|
||||
ScansRow<SCANS.OVERRIDE_REASON$> = ROTRBlockReason
|
||||
ScansRow<SCANS.OVERRIDE_TYPE$> = 'ROTR'
|
||||
If Error_Services('NoError') then
|
||||
// Supplier lot verification
|
||||
ScannedSuppLot = ScansRow<SCANS.SUPPLIER_LOT$>
|
||||
RDSSuppLot = RDSRec<RDS_LOT_NUM$>
|
||||
If (ScannedSuppLot NE '') then
|
||||
If (ScannedSuppLot _EQC RDSSuppLot) then
|
||||
IsTWLoggingReqd = RDS_Services('IsTWLoggingReqd', RDSNo)
|
||||
If IsTWLoggingReqd NE True$ OR TestWaferLotData NE '' then
|
||||
WaferCountAckReq = Xlate('RDS', RDSNo, 'WAFER_COUNT_ACK_REQ', 'X')
|
||||
If WaferCountAckReq EQ False$ then
|
||||
PreStageReady = ''
|
||||
LoadStageReady = ''
|
||||
PreStageReady = QA_Services('PreEpiSignatureReady', RDSNo, Username, WaferQty, Reactor)
|
||||
If PreStageReady EQ True$ then
|
||||
LoadStageReady = QA_Services('LoadSignatureReady', RDSNo, Username, WaferQty, LLSide, True$, Reactor)
|
||||
If (LoadStageReady NE True$) then
|
||||
// Why is it not ready?
|
||||
ErrMsg = Error_Services('GetMessage')
|
||||
Begin Case
|
||||
Case IndexC(ErrMsg, 'supplement', 1)
|
||||
// Clear the error to return a JSON payload and handle the acknowledgements.
|
||||
Error_Services('Clear')
|
||||
Scan_Services('AddNotAcceptableReason', "ROTR Load Block Enabled")
|
||||
end else
|
||||
ScansRow<SCANS.OVERRIDE_REQD$> = False$
|
||||
ScansRow<SCANS.OVERRIDE_REASON$> = ''
|
||||
ScansRow<SCANS.OVERRIDE_TYPE$> = ''
|
||||
end
|
||||
End Case
|
||||
Scan_Services('AddNotAcceptableReason', ErrMsg)
|
||||
Case IndexC(ErrMsg, 'ROTR', 1)
|
||||
ROTRBlock = Database_Services('ReadDataColumn', 'REACTOR', Reactor, REACTOR_ROTR_STATUS$, True$, 0, False$)
|
||||
ROTRBlockReason = Database_Services('ReadDataColumn', 'REACTOR', Reactor, REACTOR_ROTR_STATUS_REASON$, True$, 0, False$)
|
||||
ROTREnabled = Database_Services('ReadDataColumn', 'REACTOR', Reactor, REACTOR_ENABLE_ROTR$, True$, 0, False$)
|
||||
If ( (ROTRBlock NE 'P') AND (ROTREnabled EQ True$) ) then
|
||||
// Clear the error to return a JSON payload and allow for OVERRIDE scan.
|
||||
ScansRow<SCANS.OVERRIDE_REQD$> = True$
|
||||
ScansRow<SCANS.OVERRIDE_REASON$> = ROTRBlockReason
|
||||
ScansRow<SCANS.OVERRIDE_TYPE$> = 'ROTR'
|
||||
Error_Services('Clear')
|
||||
Scan_Services('AddNotAcceptableReason', "ROTR Load Block Enabled")
|
||||
end else
|
||||
ScansRow<SCANS.OVERRIDE_REQD$> = False$
|
||||
ScansRow<SCANS.OVERRIDE_REASON$> = ''
|
||||
ScansRow<SCANS.OVERRIDE_TYPE$> = ''
|
||||
end
|
||||
End Case
|
||||
end
|
||||
end else
|
||||
// Why is it not ready?
|
||||
ErrMsg = Error_Services('GetMessage')
|
||||
Begin Case
|
||||
Case IndexC(ErrMsg, 'supplement', 1)
|
||||
Error_Services('Clear')
|
||||
Scan_Services('AddNotAcceptableReason', ErrMsg)
|
||||
End Case
|
||||
end
|
||||
end else
|
||||
// Why is it not ready?
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
Begin Case
|
||||
Case IndexC(ErrorMsg, 'supplement', 1)
|
||||
Error_Services('Clear')
|
||||
Scan_Services('AddNotAcceptableReason', ErrorMsg)
|
||||
End Case
|
||||
Scan_Services('AddNotAcceptableReason', 'The cassette wafer count must be verified against the scheduled wafer count to proceed.')
|
||||
end
|
||||
end else
|
||||
Scan_Services('AddNotAcceptableReason', 'The cassette wafer count must be verified against the scheduled wafer count to proceed.')
|
||||
Scan_Services('AddNotAcceptableReason', 'Test wafers are required to be logged with this run.')
|
||||
end
|
||||
end else
|
||||
Scan_Services('AddNotAcceptableReason', 'Test wafers are required to be logged with this run.')
|
||||
ScansRow<SCANS.SUPPLIER_LOT$> = ''
|
||||
ErrMsg = '(':CassetteID:') Supplier lot mismatch.'
|
||||
end
|
||||
end else
|
||||
ScansRow<SCANS.SUPPLIER_LOT$> = ''
|
||||
Error_Services('Add', '(':CassetteID:') Supplier lot mismatch.')
|
||||
Scan_Services('AddNotAcceptableReason', 'Supplier lot scan required in order to complete a tool scan.')
|
||||
end
|
||||
end else
|
||||
Scan_Services('AddNotAcceptableReason', 'Supplier lot scan required in order to complete a tool scan.')
|
||||
ErrMsg = Error_Services('GetMessage')
|
||||
end
|
||||
|
||||
end else
|
||||
Error_Services('Add', '(':CassetteID:') The first run must be completed using the OpenInsight user interface.')
|
||||
ErrMsg = '(':CassetteID:') The first run must be completed using the OpenInsight user interface.'
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', '(':CassetteID:') A pre-clean is required for this RDS. The OpenInsight user interface must be used to proceed.')
|
||||
ErrMsg = '(':CassetteID:') A pre-clean is required for this RDS. The OpenInsight user interface must be used to proceed.'
|
||||
end
|
||||
Case CurrStage _EQC 'LOAD'
|
||||
Action = 'LOAD'
|
||||
@ -1067,13 +1080,13 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
LoadStageReady = QA_Services('LoadSignatureReady', RDSNo, Username, WaferQty, LLSide)
|
||||
If (LoadStageReady NE True$) then
|
||||
// Why is it not ready?
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
ErrMsg = Error_Services('GetMessage')
|
||||
Begin Case
|
||||
Case IndexC(ErrorMsg, 'supplement', 1)
|
||||
Case IndexC(ErrMsg, 'supplement', 1)
|
||||
// Clear the error to return a JSON payload and handle the acknowledgements.
|
||||
Error_Services('Clear')
|
||||
Scan_Services('AddNotAcceptableReason', ErrorMsg)
|
||||
Case IndexC(ErrorMsg, 'ROTR', 1)
|
||||
Scan_Services('AddNotAcceptableReason', ErrMsg)
|
||||
Case IndexC(ErrMsg, 'ROTR', 1)
|
||||
ROTRBlock = Database_Services('ReadDataColumn', 'REACTOR', Reactor, REACTOR_ROTR_STATUS$, True$, 0, False$)
|
||||
ROTRBlockReason = Database_Services('ReadDataColumn', 'REACTOR', Reactor, REACTOR_ROTR_STATUS_REASON$, True$, 0, False$)
|
||||
ROTREnabled = Database_Services('ReadDataColumn', 'REACTOR', Reactor, REACTOR_ENABLE_ROTR$, True$, 0, False$)
|
||||
@ -1098,11 +1111,11 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
Scan_Services('AddNotAcceptableReason', 'The LWI stage engineering instructions must be acknowledged before the load operation can be signed.')
|
||||
end
|
||||
end else
|
||||
ErrorMessage = 'RDS layer parameters must be reviewed for accuracy and acknowledged before the load operation can be signed.'
|
||||
Scan_Services('AddNotAcceptableReason', ErrorMessage)
|
||||
ErrMsg = 'RDS layer parameters must be reviewed for accuracy and acknowledged before the load operation can be signed.'
|
||||
Scan_Services('AddNotAcceptableReason', ErrMsg)
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Scanned tool ':ScanTool:' does not match the scheduled tool ':SchedTool:'. (':RDSNo:')')
|
||||
ErrMsg = 'Scanned tool ':ScanTool:' does not match the scheduled tool ':SchedTool:'. (':RDSNo:')'
|
||||
end
|
||||
end else
|
||||
Scan_Services('AddNotAcceptableReason', 'Test wafers are required to be logged with this run.')
|
||||
@ -1110,7 +1123,7 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
end else
|
||||
|
||||
ScansRow<SCANS.SUPPLIER_LOT$> = ''
|
||||
Error_Services('Add', '(':CassetteID:') Supplier lot mismatch.')
|
||||
ErrMsg = '(':CassetteID:') Supplier lot mismatch.'
|
||||
end
|
||||
end else
|
||||
Scan_Services('AddNotAcceptableReason', 'Supplier lot scan required in order to complete a tool scan.')
|
||||
@ -1126,11 +1139,11 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
UnloadStageReady = QA_Services('UnloadSignatureReady', RDSNo, Username, Reactor)
|
||||
If Not(UnloadStageReady) then
|
||||
// Why is it not ready?
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
ErrMsg = Error_Services('GetMessage')
|
||||
Begin Case
|
||||
Case IndexC(ErrorMsg, 'supplement', 1)
|
||||
Case IndexC(ErrMsg, 'supplement', 1)
|
||||
Error_Services('Clear')
|
||||
Scan_Services('AddNotAcceptableReason', ErrorMsg)
|
||||
Scan_Services('AddNotAcceptableReason', ErrMsg)
|
||||
Case Otherwise$
|
||||
// Keep error on Error_Services stack and return 400 level error.
|
||||
End Case
|
||||
@ -1175,12 +1188,16 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
LastCassInWoTestWaferReqMsg = ''
|
||||
If NextEventScheduled EQ False$ or NextEventIsBlock EQ True$ then
|
||||
LastCassInWoTestWaferReqMsg = 'No material scheduled. Test wafer required.'
|
||||
Dialog_Response_Log_Services('AddDialogResponseLog', RDSNo, 'RDS', @User4, 'HTR_LAST_BOX_TW', 'No test wafer ran with box when one was required. Unload signature was blocked. User was notified.')
|
||||
end else If NextEventHasSamePsn EQ False$ then
|
||||
LastCassInWoTestWaferReqMsg = 'Next work order is a NEW PSN number. Test wafer required.'
|
||||
Dialog_Response_Log_Services('AddDialogResponseLog', RDSNo, 'RDS', @User4, 'HTR_LAST_BOX_TW', 'No test wafer ran with box when one was required. Unload signature was blocked. User was notified.')
|
||||
end
|
||||
|
||||
Scan_Services('AddNotAcceptableReason', LastCassInWoTestWaferReqMsg)
|
||||
end
|
||||
end else
|
||||
Dialog_Response_Log_Services('AddDialogResponseLog', RDSNo, 'RDS', @User4, 'HTR_LAST_BOX_TW', 'Test wafer was already logged with box. Unload signature was allowed. User was not prompted.')
|
||||
end
|
||||
|
||||
WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$> = TestWaferRanSinceLoad
|
||||
@ -1190,12 +1207,10 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrorMessage = 'WO_MAT record was null.'
|
||||
Error_Services('Add', ErrorMessage)
|
||||
ErrMsg = 'WO_MAT record was null.'
|
||||
end
|
||||
end else
|
||||
ErrorMessage = 'Failure to read cassette record. ' : Error_Services('GetMessage')
|
||||
Error_Services('Add', ErrorMessage)
|
||||
ErrMsg = 'Failure to read cassette record. ' : Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1213,24 +1228,23 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
end
|
||||
Case CurrStage _EQC 'COMP'
|
||||
Action = 'COMP'
|
||||
Error_Services('Add', '(':CassetteID:") Cassette has already been FQA'd.")
|
||||
ErrMsg = '(':CassetteID:") Cassette has already been FQA'd."
|
||||
Case Otherwise$
|
||||
Action = CurrStage
|
||||
Error_Services('Set', '(':CassetteID:') The ':CurrStage:' is not currently supported by the barcode application.')
|
||||
ErrMsg = '(':CassetteID:') The ':CurrStage:' is not currently supported by the barcode application.'
|
||||
End Case
|
||||
end else
|
||||
Scan_Services('AddNotAcceptableReason', 'EmployeeID required to complete a tool scan.')
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', '(':CassetteID:') Process Error: cassette is on Hold and may not be signed off.')
|
||||
ErrMsg = '(':CassetteID:') Process Error: cassette is on Hold and may not be signed off.'
|
||||
end
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', '(':CassetteID:') WMI/WMO cassette are not currently supported for tool scans. The OpenInsight user interface must be used in order to proceed.')
|
||||
ErrMsg = '(':CassetteID:') WMI/WMO cassette are not currently supported for tool scans. The OpenInsight user interface must be used in order to proceed.'
|
||||
end
|
||||
end else
|
||||
// Currently we are only supporting loading one cassette onto a tool at a time.
|
||||
Error_Services('Add', '(':CassetteID:') Only one cassette can be loaded onto a tool at a time.')
|
||||
ErrMsg = '(':CassetteID:') Only one cassette can be loaded onto a tool at a time.'
|
||||
end
|
||||
end
|
||||
|
||||
@ -1291,7 +1305,7 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
End Case
|
||||
end
|
||||
// If the the scan data is valid, update the scan log before returning to the calling process.
|
||||
If Error_Services('NoError') then
|
||||
If ErrMsg EQ '' then
|
||||
If Scan_Services('NoNotAcceptableReason') then
|
||||
ScansRow<SCANS.ACCEPTABLE$> = True$
|
||||
ScansRow<SCANS.NOT_ACCEPTABLE_REASON$> = ''
|
||||
@ -1301,7 +1315,7 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
end
|
||||
end else
|
||||
ScansRow<SCANS.ACCEPTABLE$> = False$
|
||||
ScansRow<SCANS.NOT_ACCEPTABLE_REASON$> = Error_Services('GetMessage')
|
||||
ScansRow<SCANS.NOT_ACCEPTABLE_REASON$> = ErrMsg
|
||||
end
|
||||
If ScanData NE '' then
|
||||
ScansRow<SCANS.SCANNED_DATES$, -1> = Date()
|
||||
@ -1309,25 +1323,21 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
ScansRow<SCANS.SCANNED_DATA$, -1> = ScanData
|
||||
end
|
||||
ScansRow<SCANS.ACTION$> = Action
|
||||
// Save error message if present as Database_Services will clear any errors.
|
||||
ErrorMessage = ''
|
||||
If Error_Services('HasError') then
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
Database_Services('WriteDataRow', 'SCANS', ScanID, ScansRow, True$, False$, True$)
|
||||
// Restore pre-existing error message if present.
|
||||
If ErrorMessage NE '' then Error_Services('Add', ErrorMessage)
|
||||
|
||||
Database_Services('WriteDataRow', 'SCANS', ScanID, ScansRow, True$, False$, True$)
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Unable to parse the JSON scan data in the ':Service:' service.')
|
||||
ErrMsg = 'Unable to parse the JSON scan data in the ':Service:' service.'
|
||||
end
|
||||
SRP_JSON(hScanJSON, 'Release')
|
||||
end else
|
||||
Error_Services('Add', 'ScanID or ScanJSON argument was missing in the ' : Service : ' service.')
|
||||
ErrMsg = 'ScanID or ScanJSON argument was missing in the ' : Service : ' service.'
|
||||
end
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
If ErrMsg NE '' then Error_Services('Add', ErrMsg)
|
||||
end service
|
||||
|
||||
|
||||
@ -1339,6 +1349,7 @@ Service AcceptScan(ScanID, ScanJSON)
|
||||
StartTick = GetTickCount()
|
||||
MetricName = 'AcceptScan'
|
||||
|
||||
ErrMsg = ''
|
||||
If ( (ScanID NE '') and (ScanJSON NE '') ) then
|
||||
hBody = ''
|
||||
ParseResponse = SRP_JSON(hBody, 'PARSE', ScanJSON)
|
||||
@ -1371,7 +1382,7 @@ Service AcceptScan(ScanID, ScanJSON)
|
||||
If Error_Services('NoError') AND SendStatus EQ 'Success' then
|
||||
Result = 'Tencor Data Sent Successfully'
|
||||
end else
|
||||
Error_Services('Add', SendStatus)
|
||||
ErrMsg = SendStatus
|
||||
end
|
||||
|
||||
Case ScanType _EQC 'LOCATION'
|
||||
@ -1476,8 +1487,7 @@ Service AcceptScan(ScanID, ScanJSON)
|
||||
end
|
||||
|
||||
IF Get_Status(errCode) THEN
|
||||
ErrorMsg = 'Error calling obj_WO_Mat_Log("Create"). Error code: ':errCode
|
||||
Error_Services('Add', ErrorMsg)
|
||||
ErrMsg = 'Error calling obj_WO_Mat_Log("Create"). Error code: ':errCode
|
||||
END else
|
||||
NumCass = DCount(CassetteIDs, @VM)
|
||||
If NumCass EQ 1 then
|
||||
@ -1540,8 +1550,7 @@ Service AcceptScan(ScanID, ScanJSON)
|
||||
If Error_Services('NoError') then
|
||||
Continue = True$
|
||||
end else
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
Error_Services('Set', ErrorMessage)
|
||||
ErrMsg = Error_Services('GetMessage')
|
||||
Continue = False$
|
||||
end
|
||||
If Continue then
|
||||
@ -1585,8 +1594,7 @@ Service AcceptScan(ScanID, ScanJSON)
|
||||
If Error_Services('NoError') then
|
||||
Continue = True$
|
||||
end else
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
Error_Services('Set', ErrorMessage)
|
||||
ErrMsg = Error_Services('GetMessage')
|
||||
Continue = False$
|
||||
end
|
||||
If Continue then
|
||||
@ -1622,8 +1630,7 @@ Service AcceptScan(ScanID, ScanJSON)
|
||||
PSNo = Xlate('RDS', RDSNo, RDS_PROD_SPEC_ID$, True$, 'X')
|
||||
NewTestRunId = Test_Run_Services('CreateTestRunRecord', TestRunType, 'R', Reactor, PSNo, RDSNo,Username , TestWaferLots, TestWaferLotQtys)
|
||||
If Error_Services('HasError') then
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
Error_Services('Set', ErrorMessage)
|
||||
ErrMsg = Error_Services('GetMessage')
|
||||
Continue = False$
|
||||
end
|
||||
end
|
||||
@ -1640,10 +1647,10 @@ Service AcceptScan(ScanID, ScanJSON)
|
||||
end
|
||||
Case CurrStage _EQC 'COMP'
|
||||
Action = 'COMP'
|
||||
Error_Services('Set', '(':CassetteID:") Cassette has already been FQA'd.")
|
||||
ErrMsg = '(':CassetteID:") Cassette has already been FQA'd."
|
||||
Case Otherwise$
|
||||
Action = CurrStage
|
||||
Error_Services('Set', '(':CassetteID:') The ':CurrStage:' is not currently supported by the barcode application.')
|
||||
ErrMsg = '(':CassetteID:') The ':CurrStage:' is not currently supported by the barcode application.'
|
||||
End Case
|
||||
Case CassetteID EQ '' AND TestWaferLots NE ''
|
||||
//Tool scan with ONLY test wafers being logged.
|
||||
@ -1656,12 +1663,10 @@ Service AcceptScan(ScanID, ScanJSON)
|
||||
If NewTestRunId NE '' then
|
||||
Result = 'Test run logged successfully'
|
||||
end else
|
||||
ErrorMessage = 'Error while logging creating test run.'
|
||||
Error_Services('Set', ErrorMessage)
|
||||
ErrMsg = 'Error while logging creating test run.'
|
||||
end
|
||||
end else
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
Error_Services('Set', ErrorMessage)
|
||||
ErrMsg = Error_Services('GetMessage')
|
||||
end
|
||||
Case Otherwise$
|
||||
//null
|
||||
@ -1669,34 +1674,30 @@ Service AcceptScan(ScanID, ScanJSON)
|
||||
End Case
|
||||
end
|
||||
|
||||
If Error_Services('NoError') then
|
||||
If ErrMsg EQ '' then
|
||||
ScansRow<SCANS.NOT_ACCEPTABLE_REASON$> = 'This scan has already been accepted.'
|
||||
end else
|
||||
ScansRow<SCANS.NOT_ACCEPTABLE_REASON$> = Error_Services('GetMessage')
|
||||
ScansRow<SCANS.NOT_ACCEPTABLE_REASON$> = ErrMsg
|
||||
end
|
||||
ScansRow<SCANS.ACCEPTABLE$> = False$
|
||||
If Assigned(Result) then ScansRow<SCANS.RESULT$> = Result
|
||||
// Save error message if present as Database_Services will clear any errors.
|
||||
ErrorMessage = ''
|
||||
If Error_Services('HasError') then
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
Scan_Services('SetScansRow', ScanID, ScansRow)
|
||||
// Restore pre-existing error message if present.
|
||||
If ErrorMessage NE '' then Error_Services('Add', ErrorMessage)
|
||||
|
||||
Scan_Services('SetScansRow', ScanID, ScansRow)
|
||||
end else
|
||||
Error_Services('Add', 'The accepted.status field is missing from the JSON object in the ':Service:' service.')
|
||||
ErrMsg = 'The accepted.status field is missing from the JSON object in the ':Service:' service.'
|
||||
end
|
||||
SRP_JSON(hBody, 'Release')
|
||||
end else
|
||||
Error_Services('Add', 'Unable to parse the JSON scan resource in the ':Service:' service.')
|
||||
ErrMsg = 'Unable to parse the JSON scan resource in the ':Service:' service.'
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'ScanID or ScanJSON argument was missing in the ' : Service : ' service.')
|
||||
ErrMsg = 'ScanID or ScanJSON argument was missing in the ' : Service : ' service.'
|
||||
end
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
If ErrMsg NE '' then Error_Services('Add', ErrMsg)
|
||||
end service
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
@ -1714,6 +1715,7 @@ Service ConvertMVScanToJSON(ScanID, mvScan, itemURL)
|
||||
|
||||
mvScanChanged = False$
|
||||
|
||||
ErrMsg = ''
|
||||
If ScanID NE '' then
|
||||
|
||||
If mvScan EQ '' then mvScan = Database_Services('ReadDataRow', 'SCANS', ScanID)
|
||||
@ -2167,17 +2169,19 @@ Service ConvertMVScanToJSON(ScanID, mvScan, itemURL)
|
||||
Database_Services('WriteDataRow', 'SCANS', {SCAN_ID}, mvScan, True$, False$, False$)
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Unable to create JSON representation in the ' : Service : ' service.')
|
||||
ErrMsg = 'Unable to create JSON representation in the ' : Service : ' service.'
|
||||
end
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'ScanID argument was missing in the ' : Service : ' service.')
|
||||
ErrMsg = 'ScanID argument was missing in the ' : Service : ' service.'
|
||||
end
|
||||
|
||||
Response = jsonScan
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
If ErrMsg NE '' then Error_Services('Add', ErrMsg)
|
||||
end service
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
@ -2415,3 +2419,7 @@ ClearCursors:
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -30,22 +30,23 @@ Function Schedule_Services(@Service, @Params)
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert SERVICE_SETUP
|
||||
$insert RLIST_EQUATES
|
||||
$insert REACTOR_EQUATES
|
||||
$insert SCHED_DET_NG_EQUATES
|
||||
$insert WO_LOG_EQUATES
|
||||
$Insert APP_INSERTS
|
||||
$Insert SERVICE_SETUP
|
||||
$Insert RLIST_EQUATES
|
||||
$Insert REACTOR_EQUATES
|
||||
$Insert SCHED_DET_NG_EQUATES
|
||||
$Insert WO_LOG_EQUATES
|
||||
$Insert WO_MAT_EQUATES
|
||||
$insert WO_SCHEDULE_NG_EQUATES
|
||||
$insert COMPANY_EQUATES
|
||||
$insert PROD_VER_EQUATES
|
||||
$insert PRS_LAYER_EQU
|
||||
$insert SCHEDULE_EVENT_SUMMMARY_EQUATES
|
||||
$insert EPI_PART_EQUATES
|
||||
$insert PROD_SPEC_EQUATES
|
||||
$insert SCHED_HIST_EQUATES
|
||||
$Insert WO_SCHEDULE_NG_EQUATES
|
||||
$Insert COMPANY_EQUATES
|
||||
$Insert PROD_VER_EQUATES
|
||||
$Insert PRS_LAYER_EQU
|
||||
$Insert SCHEDULE_EVENT_SUMMMARY_EQUATES
|
||||
$Insert EPI_PART_EQUATES
|
||||
$Insert PROD_SPEC_EQUATES
|
||||
$Insert SCHED_HIST_EQUATES
|
||||
$Insert RDS_EQUATES
|
||||
$Insert WM_IN_EQUATES
|
||||
|
||||
Equ new_exist$ To 0 ; * Reduce Mode 0
|
||||
Equ next_cur$ To 1
|
||||
@ -59,7 +60,7 @@ Declare subroutine Mona_Services
|
||||
Declare function SRP_Array, Schedule_Services, Memory_Services, Database_Services, SRP_Sort_Array, Datetime
|
||||
Declare function Epi_Part_Services, SRP_Math, SRP_Hash, obj_Prod_Spec, Logging_Services, Environment_Services
|
||||
Declare function Work_Order_Services, RTI_CreateGUID, Reactor_Services, Schedule_Services, NextKey, SRP_Datetime
|
||||
Declare function SRP_Time, Lsl_Users_Services, GetTickCount
|
||||
Declare function SRP_Time, Lsl_Users_Services, GetTickCount, obj_WO_Mat
|
||||
|
||||
Date = Oconv(Date(), 'D4/')
|
||||
LogFileName = Date[7, 4] : '-' : Date[1, 2] : '-' : Date[4, 2] : ' Scheduler Log.csv'
|
||||
@ -385,7 +386,6 @@ end service
|
||||
Service GetScheduleEventSummary(SchedDetKeyID, IncludeWaferDetails)
|
||||
|
||||
If IncludeWaferDetails NE True$ then IncludeWaferDetails = False$
|
||||
|
||||
ScheduleEventSummary = ''
|
||||
If SchedDetKeyID NE '' then
|
||||
SchedDetRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', SchedDetKeyID)
|
||||
@ -442,10 +442,10 @@ Service GetScheduleEventSummary(SchedDetKeyID, IncludeWaferDetails)
|
||||
Begin Case
|
||||
Case BackColor NE ''
|
||||
// Set in the schedule detail record. Use current color.
|
||||
Case HotLotFlag
|
||||
BackColor = 'LightCoral'
|
||||
Case WOClosedFlag
|
||||
BackColor = 'LightGray'
|
||||
Case HotLotFlag
|
||||
BackColor = 'LightCoral'
|
||||
Case HardBlock
|
||||
BackColor = 'LightGoldenRodYellow'
|
||||
Case BlockOut
|
||||
@ -807,6 +807,7 @@ Service GetCurrentEvent(ReactNo)
|
||||
MetricName = 'GetCurrentEvent'
|
||||
|
||||
SchedDetKey = ''
|
||||
ErrorMsg = ''
|
||||
If ReactNo NE '' then
|
||||
CurrDTM = Datetime()
|
||||
Query = 'SELECT SCHED_DET_NG WITH REACT_NO EQ "':ReactNo:'" AND WITH EVENT_COMP NE 1 BY START_DTM'
|
||||
@ -818,20 +819,22 @@ Service GetCurrentEvent(ReactNo)
|
||||
ReadNext SchedDetKey else EOF = True$
|
||||
Response = SchedDetKey
|
||||
end else
|
||||
ErrorMsg = 'Error in service ':Service:' module. Error code ':errCode
|
||||
Error_Services('Add', ErrorMsg)
|
||||
ErrorMsg = 'Error in service ':Service:' module. Error code ':errCode
|
||||
end
|
||||
GoSub ClearCursors
|
||||
end
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||
end service
|
||||
|
||||
Service CurrentEventIsBlock(ReactNo)
|
||||
StartTick = GetTickCount()
|
||||
MetricName = 'CurrentEventIsBlock'
|
||||
|
||||
ErrorMsg = ''
|
||||
If ReactNo NE '' then
|
||||
CurrentSchedDetKey = Schedule_Services('GetCurrentEvent', ReactNo)
|
||||
|
||||
@ -847,15 +850,15 @@ Service CurrentEventIsBlock(ReactNo)
|
||||
end else
|
||||
Error = Error_Services('GetMessage')
|
||||
ErrorMsg = 'Error in service ':Service:' module. ':Error
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.'
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||
end service
|
||||
|
||||
Service GetNextEvent(ReactNo)
|
||||
@ -863,6 +866,7 @@ Service GetNextEvent(ReactNo)
|
||||
MetricName = 'GetNextEvent'
|
||||
|
||||
SchedDetKey = ''
|
||||
ErrorMsg = ''
|
||||
If ReactNo NE '' then
|
||||
CurrDTM = Datetime()
|
||||
Query = 'SELECT SCHED_DET_NG WITH REACT_NO EQ "':ReactNo:'" AND WITH EVENT_COMP NE 1 BY START_DTM'
|
||||
@ -875,25 +879,24 @@ Service GetNextEvent(ReactNo)
|
||||
ReadNext SchedDetKey else EOF = True$
|
||||
If EOF EQ True$ then
|
||||
ErrorMsg = 'Error in service ':Service:' module. No incomplete events in schedule'
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end else
|
||||
ReadNext SchedDetKey else EOF = True$
|
||||
If EOF EQ True$ then
|
||||
ErrorMsg = 'Error in service ':Service:' module. No incomplete events in schedule after current event'
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end else
|
||||
Response = SchedDetKey
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in service ':Service:' module. Error code ':errCode
|
||||
Error_Services('Add', ErrorMsg)
|
||||
ErrorMsg = 'Error in service ':Service:' module. Error code ':errCode
|
||||
end
|
||||
GoSub ClearCursors
|
||||
end
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||
end service
|
||||
|
||||
Service GetEngagedEvent(ReactNo)
|
||||
@ -947,6 +950,7 @@ Service NextEventIsSamePsn(ReactNo)
|
||||
MetricName = 'NextEventIsSamePsn'
|
||||
|
||||
Response = False$
|
||||
ErrorMsg = ''
|
||||
If ReactNo NE '' then
|
||||
CurrentSchedDetKey = Schedule_Services('GetCurrentEvent', ReactNo)
|
||||
|
||||
@ -987,17 +991,19 @@ Service NextEventIsSamePsn(ReactNo)
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.'
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||
end service
|
||||
|
||||
Service NextEventIsBlock(ReactNo)
|
||||
StartTick = GetTickCount()
|
||||
MetricName = 'NextEventIsBlock'
|
||||
|
||||
ErrorMsg = ''
|
||||
If ReactNo NE '' then
|
||||
NextSchedDetKey = Schedule_Services('GetNextEvent', ReactNo)
|
||||
|
||||
@ -1013,15 +1019,15 @@ Service NextEventIsBlock(ReactNo)
|
||||
end else
|
||||
Error = Error_Services('GetMessage')
|
||||
ErrorMsg = 'Error in service ':Service:' module. ':Error
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.'
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||
end service
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
@ -1240,14 +1246,59 @@ Service AdjustScheduleEvents(ReactNo)
|
||||
LogData<3> = 'Event quantity: ':EventRec<SCHED_DET_NG.EVENT_TOTAL_WFRS$>
|
||||
Schedule_Services('LogActivity', ReactNo, LogData)
|
||||
LogData<3> = 'Event complete: ':OConv(EventRec<SCHED_DET_NG.EVENT_COMP$>, "Btrue,false")
|
||||
Schedule_Services('LogActivity', ReactNo, LogData)
|
||||
LogData<3> = 'Event unprocessed cassettes: ':EventRec<SCHED_DET_NG.UNPROCESSED_CASS$>
|
||||
Schedule_Services('LogActivity', ReactNo, LogData)
|
||||
LogData<3> = 'Event processed cassettes: ':EventRec<SCHED_DET_NG.PROCESSED_CASS$>
|
||||
Schedule_Services('LogActivity', ReactNo, LogData)
|
||||
|
||||
EventAdjustment = Schedule_Services('GetEventAdjustment', EventKey)
|
||||
UnprocessedCass = EventRec<SCHED_DET_NG.UNPROCESSED_CASS$>
|
||||
ProcessedCass = EventRec<SCHED_DET_NG.PROCESSED_CASS$>
|
||||
AllCassList = SRP_Array('Join', UnprocessedCass, ProcessedCass, 'OR', @VM)
|
||||
AllCassList = SRP_Array('SortSimpleList', AllCassList, 'AscendingNumbers', @VM)
|
||||
EventComp = (UnprocessedCass EQ '')
|
||||
|
||||
// Check each cassette to see if it was voided
|
||||
VoidedQty = 0
|
||||
WONo = EventRec<SCHED_DET_NG.WO_NO$>
|
||||
EventWfrs = EventRec<SCHED_DET_NG.EVENT_TOTAL_WFRS$>
|
||||
VoidedCassList = ''
|
||||
VoidedWfrQty = 0
|
||||
For each CassNo in AllCassList using @VM
|
||||
If Epipro then
|
||||
WmInKey = WoNo:'*1*':CassNo
|
||||
Voided = Xlate('WM_IN', WmInKey, 'VOID', 'X')
|
||||
CassQty = Xlate('WM_IN', WmInKey, 'WFR_CNT', 'X')
|
||||
end else
|
||||
WOMatKey = WoNo:'*':CassNo
|
||||
Voided = Xlate('WO_MAT', WOMatKey, 'VOID', 'X')
|
||||
CassQty = Xlate('WO_MAT', WOMatKey, 'WAFER_QTY', 'X')
|
||||
end
|
||||
If Voided then
|
||||
VoidedCassList<0, -1> = CassNo
|
||||
VoidedWfrQty += CassQty
|
||||
end
|
||||
Next CassNo
|
||||
UnprocessedCass = SRP_Array('Join', UnprocessedCass, VoidedCassList, 'NOT', @VM)
|
||||
ProcessedCass = SRP_Array('Join', ProcessedCass, VoidedCassList, 'NOT', @VM)
|
||||
AllCassList = SRP_Array('Join', AllCassList, VoidedCassList, 'NOT', @VM)
|
||||
EventWfrs -= VoidedWfrQty
|
||||
EventRec<SCHED_DET_NG.UNPROCESSED_CASS$> = UnprocessedCass
|
||||
EventRec<SCHED_DET_NG.PROCESSED_CASS$> = ProcessedCass
|
||||
EventRec<SCHED_DET_NG.EVENT_TOTAL_WFRS$> = EventWfrs
|
||||
Database_Services('WriteDataRow', 'SCHED_DET_NG', EventKey, EventRec, True$, False$, True$)
|
||||
|
||||
// Check each unprocessed cassette to ensure it does not need to be moved to the processed column
|
||||
For each CassNo in UnprocessedCass using @VM
|
||||
Schedule_Services('MarkCassProcessed', WONo, CassNo, Datetime())
|
||||
Next CassNo
|
||||
|
||||
EventRec = Schedule_Services('GetScheduleDetail', EventKey)
|
||||
UnprocessedCass = EventRec<SCHED_DET_NG.UNPROCESSED_CASS$>
|
||||
ProcessedCass = EventRec<SCHED_DET_NG.PROCESSED_CASS$>
|
||||
AllCassList = SRP_Array('Join', UnprocessedCass, ProcessedCass, 'OR', @VM)
|
||||
AllCassList = SRP_Array('SortSimpleList', AllCassList, 'AscendingNumbers', @VM)
|
||||
EventAdjustment = Schedule_Services('GetEventAdjustment', EventKey)
|
||||
EventComp = (UnprocessedCass EQ '')
|
||||
|
||||
If Not(EventRec<SCHED_DET_NG.EVENT_COMP$>) and EventComp then
|
||||
LogData = ''
|
||||
@ -1258,9 +1309,7 @@ Service AdjustScheduleEvents(ReactNo)
|
||||
end
|
||||
|
||||
EventRec<SCHED_DET_NG.EVENT_COMP$> = EventComp
|
||||
WONo = EventRec<SCHED_DET_NG.WO_NO$>
|
||||
ReactNo = EventRec<SCHED_DET_NG.REACT_NO$>
|
||||
EventWfrs = EventRec<SCHED_DET_NG.EVENT_TOTAL_WFRS$>
|
||||
WOQty = Xlate('WO_LOG', WONo, 'QTY', 'X')
|
||||
// If work order event is engaged then set start DTM to first cassette DTM in.
|
||||
// If previous event end time overlaps (e.g. soft block finished sooner than scheduled)
|
||||
@ -2251,8 +2300,9 @@ end service
|
||||
// Saves the event to the database.
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service AddSchedEvent(ReactorNo, WorkOrderNo, StartDTM, StopDTM, Description, WaferQty)
|
||||
|
||||
|
||||
// Create a unique key ID for the new event
|
||||
ErrorMsg = ''
|
||||
NewEventKeyID = RTI_CreateGUID()
|
||||
NewEventRec = ''
|
||||
NewEventRec<SCHED_DET_NG.REACT_NO$> = ReactorNo
|
||||
@ -2262,16 +2312,17 @@ Service AddSchedEvent(ReactorNo, WorkOrderNo, StartDTM, StopDTM, Description, Wa
|
||||
NewEventRec<SCHED_DET_NG.EVENT_TOTAL_WFRS$> = WaferQty
|
||||
EpiPro = (Xlate('WO_LOG', WorkOrderNo, 'REACT_TYPE', 'X') EQ 'EPP')
|
||||
CurrDTM = Datetime()
|
||||
EventProcCassList = ''
|
||||
EventUnprocCassList = ''
|
||||
LastLoadedRDS = ''
|
||||
LastUnloadedRDS = ''
|
||||
EventProcCassList = ''
|
||||
EventUnprocCassList = ''
|
||||
LastLoadedRDS = ''
|
||||
LastUnloadedRDS = ''
|
||||
// Determine start cassette and slot number
|
||||
PrevSchedQty = Schedule_Services('GetScheduledWfrQty', WorkOrderNo)
|
||||
StartCass = SRP_Math('CEILING', ( (PrevSchedQty + 1) / 25))
|
||||
If StartCass EQ 0 then StartCass = 1
|
||||
PrevSchedQty = Schedule_Services('GetScheduledWfrQty', WorkOrderNo)
|
||||
VoidedQty = Work_Order_Services('GetVoidedWaferCount', WorkOrderNo)
|
||||
StartCass = SRP_Math('CEILING', ( (PrevSchedQty + VoidedQty + 1) / 25))
|
||||
If StartCass EQ 0 then StartCass = 1
|
||||
StartSlot = Mod(PrevSchedQty, 25) + 1
|
||||
TotalSchedQty = PrevSchedQty + WaferQty
|
||||
TotalSchedQty = PrevSchedQty + WaferQty + VoidedQty
|
||||
StopCass = SRP_Math('CEILING', ( TotalSchedQty / 25 ) )
|
||||
StopSlot = Mod(TotalSchedQty, 25)
|
||||
If StopSlot EQ 0 then StopSlot = 25
|
||||
@ -2279,128 +2330,192 @@ Service AddSchedEvent(ReactorNo, WorkOrderNo, StartDTM, StopDTM, Description, Wa
|
||||
RDSKeys = ''
|
||||
If EpiPro then
|
||||
For CassNo = StartCass to StopCass
|
||||
WMIKey = WorkOrderNo:'*1*':CassNo
|
||||
WMIRdsList = Xlate('WM_IN', WMIKey, 'RDS_NO', 'X')
|
||||
If WMIRdsList NE '' then
|
||||
Begin Case
|
||||
Case ( (CassNo EQ StartCass) and (CassNo EQ StopCass) )
|
||||
StartIndex = StartSlot
|
||||
StopIndex = StopSlot
|
||||
Case CassNo EQ StartCass
|
||||
StartIndex = StartSlot
|
||||
StopIndex = 25
|
||||
Case CassNo EQ StopCass
|
||||
StartIndex = 1
|
||||
StopIndex = StopSlot
|
||||
Case Otherwise$
|
||||
StartIndex = 1
|
||||
StopIndex = 25
|
||||
End Case
|
||||
For SlotIndex = StartIndex to StopIndex
|
||||
RDSKeys<0, -1> = WMIRdsList<0, SlotIndex>
|
||||
Next SlotIndex
|
||||
WMIKey = WorkOrderNo:'*1*':CassNo
|
||||
If RowExists('WM_IN', WMIKey) then
|
||||
WMIRec = Database_Services('ReadDataRow', 'WM_IN', WMIKey)
|
||||
end else
|
||||
// No RDS keys exist for this cassette yet, so it's unprocessed
|
||||
EventUnprocCassList<0, -1> = CassNo
|
||||
// Material not received yet
|
||||
WMIRec = ''
|
||||
end
|
||||
If Error_Services('NoError') then
|
||||
Voided = WMIRec<WM_IN_VOID$>
|
||||
If Not(Voided) then
|
||||
WMIRdsList = WMIRec<WM_IN_RDS_NO$>
|
||||
If WMIRdsList NE '' then
|
||||
Begin Case
|
||||
Case ( (CassNo EQ StartCass) and (CassNo EQ StopCass) )
|
||||
StartIndex = StartSlot
|
||||
StopIndex = StopSlot
|
||||
Case CassNo EQ StartCass
|
||||
StartIndex = StartSlot
|
||||
StopIndex = 25
|
||||
Case CassNo EQ StopCass
|
||||
StartIndex = 1
|
||||
StopIndex = StopSlot
|
||||
Case Otherwise$
|
||||
StartIndex = 1
|
||||
StopIndex = 25
|
||||
End Case
|
||||
For SlotIndex = StartIndex to StopIndex
|
||||
RDSKeys<0, -1> = WMIRdsList<0, SlotIndex>
|
||||
Next SlotIndex
|
||||
end else
|
||||
// No RDS keys exist for this cassette yet, so it's unprocessed
|
||||
EventUnprocCassList<0, -1> = CassNo
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
Until (ErrorMsg NE '')
|
||||
Next CassNo
|
||||
|
||||
If RDSKeys NE '' then
|
||||
RDSKeys = SRP_Array('Clean', RDSKeys, 'TrimAndMakeUnique', @VM)
|
||||
For each RDSKey in RDSKeys using @VM setting vPos
|
||||
DtmOut = Xlate('RDS', RDSKey, 'DATETIME_OUT', 'X')
|
||||
WMIKeys = Xlate('RDS', RDSKey, 'WM_IN_KEY', 'X')
|
||||
For each WMIKey in WMIKeys using @VM
|
||||
CassNo = Field(WMIKey, '*', 3)
|
||||
If DtmOut NE '' then
|
||||
LastUnloadedRDS = RDSKey
|
||||
Locate CassNo in EventProcCassList using @VM setting Dummy else
|
||||
EventProcCassList<0, -1> = CassNo
|
||||
end
|
||||
If (ErrorMsg EQ '') then
|
||||
If RDSKeys NE '' then
|
||||
RDSKeys = SRP_Array('Clean', RDSKeys, 'TrimAndMakeUnique', @VM)
|
||||
For each RDSKey in RDSKeys using @VM setting vPos
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKey)
|
||||
If Error_Services('NoError') then
|
||||
DateOut = RDSRec<RDS_DATE_OUT$>
|
||||
TimeOut = RDSRec<RDS_TIME_OUT$>
|
||||
TimeOut = TimeOut/86400
|
||||
TimeOut = SRP_Math('ROUND', TimeOut, 5)
|
||||
TimeOut = TimeOut[2, 6]
|
||||
DtmOut = DateOut:TimeOut
|
||||
end else
|
||||
Locate CassNo in EventUnprocCassList using @VM setting Dummy else
|
||||
EventUnprocCassList<0, -1> = CassNo
|
||||
end
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
Next WMIKey
|
||||
Next RDSKey
|
||||
If (ErrorMsg EQ '' ) then
|
||||
WMIKeys = Xlate('RDS', RDSKey, 'WM_IN_KEY', 'X')
|
||||
For each WMIKey in WMIKeys using @VM
|
||||
CassNo = Field(WMIKey, '*', 3)
|
||||
If DtmOut NE '' then
|
||||
LastUnloadedRDS = RDSKey
|
||||
Locate CassNo in EventProcCassList using @VM setting Dummy else
|
||||
EventProcCassList<0, -1> = CassNo
|
||||
end
|
||||
end else
|
||||
Locate CassNo in EventUnprocCassList using @VM setting Dummy else
|
||||
EventUnprocCassList<0, -1> = CassNo
|
||||
end
|
||||
end
|
||||
Next WMIKey
|
||||
end
|
||||
Until (ErrorMsg NE '')
|
||||
Next RDSKey
|
||||
end
|
||||
|
||||
EventUnprocCassList = SRP_Array('SortSimpleList', EventUnprocCassList, 'AscendingNumbers', @VM)
|
||||
// This line ensures EpiPro cassettes are not recorded as both processed and unprocessed.
|
||||
EventProcCassList = SRP_Array('Join', EventProcCassList, EventUnprocCassList, 'NOT', @VM)
|
||||
end
|
||||
|
||||
EventUnprocCassList = SRP_Array('SortSimpleList', EventUnprocCassList, 'AscendingNumbers', @VM)
|
||||
// This line ensures EpiPro cassettes are not recorded as both processed and unprocessed.
|
||||
EventProcCassList = SRP_Array('Join', EventProcCassList, EventUnprocCassList, 'NOT', @VM)
|
||||
|
||||
end else
|
||||
|
||||
For CassNo = StartCass to StopCass
|
||||
WOMatKey = WorkOrderNo:'*':CassNo
|
||||
RDSKey = Xlate('WO_MAT', WOMatKey, 'RDS_NO', 'X')
|
||||
DtmOut = Xlate('RDS', RDSKey, 'DATETIME_OUT', 'X')
|
||||
If DtmOut NE '' then
|
||||
LastUnloadedRDS = RDSKey
|
||||
Locate CassNo in EventProcCassList using @VM setting Dummy else
|
||||
EventProcCassList<0, -1> = CassNo
|
||||
DtmOut = ''
|
||||
WOMatKey = WorkOrderNo:'*':CassNo
|
||||
If RowExists('WO_MAT', WOMatKey) then
|
||||
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
|
||||
end else
|
||||
// Material not received yet
|
||||
WOMatRec = ''
|
||||
end
|
||||
If Error_Services('NoError') then
|
||||
Voided = WOMatRec<WO_MAT_VOID$>
|
||||
If Not(Voided) then
|
||||
RDSKey = WOMatRec<WO_MAT_RDS_NO$>
|
||||
If (RDSKey NE '') then
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKey)
|
||||
If Error_Services('NoError') then
|
||||
DateOut = RDSRec<RDS_DATE_OUT$>
|
||||
TimeOut = RDSRec<RDS_TIME_OUT$>
|
||||
TimeOut = TimeOut/86400
|
||||
TimeOut = SRP_Math('ROUND', TimeOut, 5)
|
||||
TimeOut = TimeOut[2, 6]
|
||||
DtmOut = DateOut:TimeOut
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
end
|
||||
end else
|
||||
Locate CassNo in EventUnprocCassList using @VM setting Dummy else
|
||||
EventUnprocCassList<0, -1> = CassNo
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
|
||||
If (ErrorMsg EQ '') then
|
||||
If (DtmOut NE '') then
|
||||
LastUnloadedRDS = RDSKey
|
||||
Locate CassNo in EventProcCassList using @VM setting Dummy else
|
||||
EventProcCassList<0, -1> = CassNo
|
||||
end
|
||||
end else
|
||||
Locate CassNo in EventUnprocCassList using @VM setting Dummy else
|
||||
EventUnprocCassList<0, -1> = CassNo
|
||||
end
|
||||
end
|
||||
end
|
||||
Until (ErrorMsg NE '')
|
||||
Next CassNo
|
||||
end
|
||||
|
||||
EventComp = (EventUnprocCassList EQ '')
|
||||
If EventComp then StopDtm = Xlate('RDS', LastUnloadedRDS, 'DATETIME_OUT', 'X')
|
||||
If (ErrorMsg EQ '') then
|
||||
|
||||
// Update event
|
||||
NewEventRec<SCHED_DET_NG.EVENT_COMP$> = EventComp
|
||||
NewEventRec<SCHED_DET_NG.PROCESSED_CASS$> = EventProcCassList
|
||||
NewEventRec<SCHED_DET_NG.UNPROCESSED_CASS$> = EventUnprocCassList
|
||||
NewEventRec<SCHED_DET_NG.STOP_DTM$> = StopDtm
|
||||
Database_Services('WriteDataRow', 'SCHED_DET_NG', NewEventKeyID, NewEventRec)
|
||||
|
||||
If Error_Services('NoError') then
|
||||
// Determine where to insert the event in the REACTOR record linked list
|
||||
// Add the event to the REACTOR record event list
|
||||
ReactRec = Database_Services('ReadDataRow', 'REACTOR', ReactorNo)
|
||||
ReactSchedEvents = ReactRec<REACTOR_SCHED_EVENTS$>
|
||||
CurrNumEvents = DCount(ReactSchedEvents, @VM)
|
||||
// Add our new event key ID to the reactor event list
|
||||
NewNumEvents = CurrNumEvents + 1
|
||||
InsertPos = ''
|
||||
For EventIndex = 1 to CurrNumEvents Step 1
|
||||
ThisEventKey = ReactSchedEvents<0, EventIndex>
|
||||
ThisStartDTM = Xlate('SCHED_DET_NG', ThisEventKey, 'START_DTM', 'X')
|
||||
IF ThisStartDTM GT StartDTM then
|
||||
// We found our location
|
||||
InsertPos = EventIndex
|
||||
end
|
||||
Until InsertPos NE ''
|
||||
Next EventIndex
|
||||
If InsertPos EQ '' then InsertPos = NewNumEvents
|
||||
ReactSchedEvents = Insert(ReactSchedEvents, 0, InsertPos, 0, NewEventKeyID)
|
||||
ReactRec<REACTOR_SCHED_EVENTS$> = ReactSchedEvents
|
||||
Database_Services('WriteDataRow', 'REACTOR', ReactorNo, ReactRec)
|
||||
EventComp = (EventUnprocCassList EQ '')
|
||||
If EventComp then StopDtm = Xlate('RDS', LastUnloadedRDS, 'DATETIME_OUT', 'X')
|
||||
|
||||
// Check if there is an overlap with the previous event. If so, then set previous event's stop DTM to this event's
|
||||
// start DTM.
|
||||
If NewNumEvents GT 1 then
|
||||
PrevEventKey = ReactSchedEvents<0, (NewNumEvents - 1)>
|
||||
If PrevEventKey NE '' then
|
||||
PrevEventRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', PrevEventKey)
|
||||
PrevEventStopDTM = PrevEventRec<SCHED_DET_NG.STOP_DTM$>
|
||||
If PrevEventStopDTM GT StartDTM then
|
||||
PrevEventStopDTM = StartDTM
|
||||
PrevEventRec<SCHED_DET_NG.STOP_DTM$> = PrevEventStopDTM
|
||||
Database_Services('WriteDataRow', 'SCHED_DET_NG', PrevEventKey, PrevEventRec, True$, False$, True$)
|
||||
// Update event
|
||||
NewEventRec<SCHED_DET_NG.EVENT_COMP$> = EventComp
|
||||
NewEventRec<SCHED_DET_NG.PROCESSED_CASS$> = EventProcCassList
|
||||
NewEventRec<SCHED_DET_NG.UNPROCESSED_CASS$> = EventUnprocCassList
|
||||
NewEventRec<SCHED_DET_NG.STOP_DTM$> = StopDtm
|
||||
Database_Services('WriteDataRow', 'SCHED_DET_NG', NewEventKeyID, NewEventRec)
|
||||
|
||||
If Error_Services('NoError') then
|
||||
// Determine where to insert the event in the REACTOR record linked list
|
||||
// Add the event to the REACTOR record event list
|
||||
ReactRec = Database_Services('ReadDataRow', 'REACTOR', ReactorNo)
|
||||
ReactSchedEvents = ReactRec<REACTOR_SCHED_EVENTS$>
|
||||
CurrNumEvents = DCount(ReactSchedEvents, @VM)
|
||||
// Add our new event key ID to the reactor event list
|
||||
NewNumEvents = CurrNumEvents + 1
|
||||
InsertPos = ''
|
||||
For EventIndex = 1 to CurrNumEvents Step 1
|
||||
ThisEventKey = ReactSchedEvents<0, EventIndex>
|
||||
ThisStartDTM = Xlate('SCHED_DET_NG', ThisEventKey, 'START_DTM', 'X')
|
||||
IF ThisStartDTM GT StartDTM then
|
||||
// We found our location
|
||||
InsertPos = EventIndex
|
||||
end
|
||||
Until InsertPos NE ''
|
||||
Next EventIndex
|
||||
If InsertPos EQ '' then InsertPos = NewNumEvents
|
||||
ReactSchedEvents = Insert(ReactSchedEvents, 0, InsertPos, 0, NewEventKeyID)
|
||||
ReactRec<REACTOR_SCHED_EVENTS$> = ReactSchedEvents
|
||||
Database_Services('WriteDataRow', 'REACTOR', ReactorNo, ReactRec)
|
||||
|
||||
// Check if there is an overlap with the previous event. If so, then set previous event's stop DTM to this event's
|
||||
// start DTM.
|
||||
If NewNumEvents GT 1 then
|
||||
PrevEventKey = ReactSchedEvents<0, (NewNumEvents - 1)>
|
||||
If PrevEventKey NE '' then
|
||||
PrevEventRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', PrevEventKey)
|
||||
PrevEventStopDTM = PrevEventRec<SCHED_DET_NG.STOP_DTM$>
|
||||
If PrevEventStopDTM GT StartDTM then
|
||||
PrevEventStopDTM = StartDTM
|
||||
PrevEventRec<SCHED_DET_NG.STOP_DTM$> = PrevEventStopDTM
|
||||
Database_Services('WriteDataRow', 'SCHED_DET_NG', PrevEventKey, PrevEventRec, True$, False$, True$)
|
||||
end
|
||||
end
|
||||
end
|
||||
// Record schedule change in SCHED_HIST table
|
||||
Schedule_Services('AddSchedHist', NewEventKeyID, ReactorNo, 'ADD', @User4)
|
||||
Response = NewEventKeyID
|
||||
end
|
||||
// Record schedule change in SCHED_HIST table
|
||||
Schedule_Services('AddSchedHist', NewEventKeyID, ReactorNo, 'ADD', @User4)
|
||||
Response = NewEventKeyID
|
||||
end
|
||||
|
||||
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||
|
||||
end service
|
||||
|
||||
|
||||
@ -3147,7 +3262,7 @@ end service
|
||||
|
||||
|
||||
Service MarkCassProcessed(WONo, CassNo, ProcessedDTM)
|
||||
|
||||
|
||||
If ((WONo NE '') and (CassNo NE '') and (ProcessedDTM NE '') ) then
|
||||
If Num(ProcessedDTM) then ProcessedDTM = OConv(ProcessedDTM, 'DT2/^H')
|
||||
// Find the SCHED_DET_NG event record that contains the cassette number
|
||||
@ -3195,19 +3310,33 @@ Service MarkCassProcessed(WONo, CassNo, ProcessedDTM)
|
||||
CassComp = True$
|
||||
end
|
||||
end else
|
||||
CassComp = True$
|
||||
WOMatKey = WoNo:'*':CassNo
|
||||
CurrWaferCount = obj_WO_Mat('CurrWaferCnt', WOMatKey)
|
||||
RDSNo = Xlate('WO_MAT', WOMatKey, 'RDS_NO', 'X')
|
||||
DateOut = Xlate('RDS', RDSNo, 'DATE_OUT', 'X')
|
||||
CassComp = ( (CurrWaferCount EQ 0) or (DateOut NE '') )
|
||||
end
|
||||
UnprocessedCassettes = SchedDetNGRec<SCHED_DET_NG.UNPROCESSED_CASS$>
|
||||
|
||||
If CassComp then
|
||||
RecChanged = False$
|
||||
UnprocessedCassettes = SchedDetNGRec<SCHED_DET_NG.UNPROCESSED_CASS$>
|
||||
Locate CassNo in UnprocessedCassettes using @VM setting vPos then
|
||||
UnprocessedCassettes = Delete(UnprocessedCassettes, 0, vPos, 0)
|
||||
ProcessedCassettes = SchedDetNGRec<SCHED_DET_NG.PROCESSED_CASS$>
|
||||
ProcessedCassettes<0, -1> = CassNo
|
||||
UnprocessedCassettes = Delete(UnprocessedCassettes, 0, vPos, 0)
|
||||
RecChanged = True$
|
||||
end
|
||||
ProcessedCassettes = SchedDetNGRec<SCHED_DET_NG.PROCESSED_CASS$>
|
||||
Locate CassNo in ProcessedCassettes using @VM setting vPos else
|
||||
ProcessedCassettes<0, -1> = CassNo
|
||||
ProcessedCassettes = SRP_Array('Clean', ProcessedCassettes, 'TrimAndMakeUnique', @VM)
|
||||
ProcessedCassettes = SRP_Array('SortSimpleList', ProcessedCassettes, 'AscendingNumbers', @VM)
|
||||
RecChanged = True$
|
||||
end
|
||||
If RecChanged then
|
||||
SchedDetNGRec<SCHED_DET_NG.UNPROCESSED_CASS$> = UnprocessedCassettes
|
||||
SchedDetNGRec<SCHED_DET_NG.PROCESSED_CASS$> = ProcessedCassettes
|
||||
Database_Services('WriteDataRow', 'SCHED_DET_NG', SchedDetNGKey, SchedDetNGRec, True$, False$, True$)
|
||||
Done = True$
|
||||
end
|
||||
Done = True$
|
||||
end
|
||||
Until Done EQ True$
|
||||
Repeat
|
||||
@ -3596,5 +3725,3 @@ CreateScheduleChangeNotification:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
159
LSL2/STPROC/SEMI_VEND_CODE_API.txt
Normal file
159
LSL2/STPROC/SEMI_VEND_CODE_API.txt
Normal 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
|
||||
|
124
LSL2/STPROC/SEMI_VEND_CODE_SERVICES.txt
Normal file
124
LSL2/STPROC/SEMI_VEND_CODE_SERVICES.txt
Normal 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
|
||||
|
@ -456,6 +456,7 @@ Service AcknowledgeSupplement(SupplID, EntryUser)
|
||||
StartTick = GetTickCount()
|
||||
MetricName = 'AcknowledgeSupplement'
|
||||
|
||||
ErrMsg = ''
|
||||
If ( (SupplID NE '') and (EntryUser NE '') ) then
|
||||
OldRec = Xlate('SUPPLEMENTS', SupplID, '', 'X', '')
|
||||
If OldRec NE '' then
|
||||
@ -469,19 +470,21 @@ Service AcknowledgeSupplement(SupplID, EntryUser)
|
||||
Supplement_Services('LogSupplementChange', NewRec, 'Acknowledged', EntryUser)
|
||||
end else
|
||||
Response = FALSE$
|
||||
Error_Services('Add', 'Error editing Supplement record.')
|
||||
ErrMsg = 'Error editing Supplement record.'
|
||||
end
|
||||
end else
|
||||
Response = FALSE$
|
||||
Error_Services('Add', 'Record does not exist.')
|
||||
ErrMsg = 'Record does not exist.'
|
||||
end
|
||||
end else
|
||||
Response = FALSE$
|
||||
Error_Services('Add', 'SupplID or EntryUser was missing in the ' : Service : ' service.')
|
||||
ErrMsg = 'SupplID or EntryUser was missing in the ' : Service : ' service.'
|
||||
end
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
If ErrMsg NE '' then Error_Services('Add', ErrMsg)
|
||||
end service
|
||||
|
||||
|
||||
@ -501,6 +504,7 @@ Service UnacknowledgedSupplementCheck(LotType=LOTTYPES, LotID, Stage=STAGES)
|
||||
|
||||
UnackList = ''
|
||||
Response = False$
|
||||
ErrMsg = ''
|
||||
If ( (LotType NE '') and (LotID NE '') and (Stage NE '') ) then
|
||||
KeyList = ''
|
||||
Query = ''
|
||||
@ -518,23 +522,25 @@ Service UnacknowledgedSupplementCheck(LotType=LOTTYPES, LotID, Stage=STAGES)
|
||||
If AckField NE True$ then UnackList<-1> = Key
|
||||
Next Key
|
||||
end else
|
||||
Error_Services('Add', 'Error in ':Service:' service. Error opening SUPPLEMENTS table.')
|
||||
ErrMsg = 'Error in ':Service:' service. Error opening SUPPLEMENTS table.'
|
||||
end
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Error in ':Service:' service. Error calling Btree.Extract')
|
||||
ErrMsg = 'Error in ':Service:' service. Error calling Btree.Extract'
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Error in ':Service:' service. Error opening SUPPLEMENTS dictionary.')
|
||||
ErrMsg = 'Error in ':Service:' service. Error opening SUPPLEMENTS dictionary.'
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'LotType, LotID, or Stage was missing in the ' : Service : ' service.')
|
||||
ErrMsg = 'LotType, LotID, or Stage was missing in the ' : Service : ' service.'
|
||||
end
|
||||
|
||||
If UnackList NE '' then Response = UnackList
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
If ErrMsg NE '' then Error_Services('Add', ErrMsg)
|
||||
end service
|
||||
|
||||
|
||||
@ -552,6 +558,7 @@ Service LogSupplementChange(SupplementRec, EditEvent, EntryUser)
|
||||
StartTick = GetTickCount()
|
||||
MetricName = 'LogSupplementChange'
|
||||
|
||||
ErrMsg = ''
|
||||
If ( (SupplementRec NE '') and (EditEvent NE '') and (EntryUser NE '') ) then
|
||||
SupplementText = SupplementRec<SUPPLEMENTS_SUPPL_TEXT$>
|
||||
LotType = SupplementRec<SUPPLEMENTS_LOT_TYPE$>
|
||||
@ -565,11 +572,13 @@ Service LogSupplementChange(SupplementRec, EditEvent, EntryUser)
|
||||
End Case
|
||||
|
||||
end else
|
||||
Error_Services('Add', 'LotType, LotID, or Stage was missing in the ' : Service : ' service.')
|
||||
ErrMsg = 'LotType, LotID, or Stage was missing in the ' : Service : ' service.'
|
||||
end
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
If ErrMsg NE '' then Error_Services('Add', ErrMsg)
|
||||
end service
|
||||
|
||||
|
||||
@ -670,3 +679,4 @@ Service SendNotifications(RDSList, EditEvent, Instructions, EntryUser)
|
||||
|
||||
end service
|
||||
|
||||
|
||||
|
40
LSL2/STPROC/TEST_PSN_SERVICES.txt
Normal file
40
LSL2/STPROC/TEST_PSN_SERVICES.txt
Normal 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
|
@ -2,6 +2,7 @@ Compile function TEST_RUN_Services(@Service, @Params)
|
||||
#pragma precomp SRP_PreCompiler
|
||||
$insert LOGICAL
|
||||
$Insert APP_INSERTS
|
||||
$Insert SERVICE_SETUP
|
||||
$Insert TEST_WAFER_PROD_EQUATES
|
||||
$Insert TEST_WAFER_TYPES_DISPO_OPTIONS_EQUATES
|
||||
$Insert TEST_RUN_EQUATES
|
||||
@ -10,7 +11,7 @@ $Insert TEST_RUN_OBJ_EQUATES
|
||||
$Insert LOT_EQUATES
|
||||
$Insert LOT_OPERATION_EQUATES
|
||||
|
||||
Declare function Nextkey, Error_Services, Environment_Services, OConv, Logging_Services, SRP_Hashtable, Lot_Services, GetTickCount
|
||||
Declare function Nextkey, Error_Services, Environment_Services, OConv, Logging_Services, SRP_Hashtable, Lot_Services, GetTickCount, Xlate
|
||||
Declare function SRP_Datetime, Database_Services, Test_Run_Services, File_Services, Status, delete, Insert, Datetime, SRP_Json, MemberOf
|
||||
Declare subroutine Database_Services, Btree.Extract, Error_Services, Logging_Services, Rlist, Test_Run_Services, Lot_Services, SRP_Json
|
||||
Declare subroutine Mona_Services
|
||||
@ -331,6 +332,71 @@ Service GetTestWaferLots(ShowOnlyOpenLots)
|
||||
Response = TestWaferLotKeys
|
||||
end service
|
||||
|
||||
Service GetTestRunsByUsername(Username, StartDTM, StopDTM)
|
||||
|
||||
If Username NE '' then
|
||||
Begin Case
|
||||
Case StartDTM EQ '' AND StopDTM EQ ''
|
||||
//Set search date for last 12 hour period
|
||||
StopDTM = SRP_Datetime('Now')
|
||||
StartDTM = SRP_Datetime('AddHours', StopDTM, -12)
|
||||
Case StartDTM EQ '' AND StopDTM NE ''
|
||||
//Set search start date 12 hours prior to stopDTM
|
||||
StartDTM = SRP_Datetime('AddHours', StopDTM, -12)
|
||||
Case StartDTM NE '' AND StopDTM EQ ''
|
||||
//Set search start date to current dtm
|
||||
StopDTM = SRP_Datetime('Now')
|
||||
End Case
|
||||
|
||||
table = "TEST_RUN"
|
||||
Open "DICT ":table To hTestRunDict Else
|
||||
Error_Services('Add', 'Error opening TEST_RUN dictionary')
|
||||
End
|
||||
If Error_Services('NoError') then
|
||||
srch_strng = "RUN_DTM":@VM:StartDTM:'~':StopDTM:@FM: "LSL_USER_ID":@VM:UserName:@FM
|
||||
keylist = ""
|
||||
option = ""
|
||||
flag = ""
|
||||
Btree.Extract(srch_strng, table, hTestRunDict, keylist, option, flag)
|
||||
Swap @VM with @FM in keylist
|
||||
Response = keylist
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Username missing.')
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
Service GetTestWaferUsageStats(Username, StartDTM, StopDTM)
|
||||
|
||||
MostRecentDTM = ''
|
||||
WafersUsed = 0
|
||||
If Username NE '' then
|
||||
KeyList = Test_Run_Services('GetTestRunsByUsername', Username, StartDTM, StopDTM)
|
||||
If KeyList NE '' then
|
||||
For Each Key in KeyList
|
||||
TestRunRec = Xlate('TEST_RUN', Key, '', 'X')
|
||||
If MostRecentDTM EQ '' then
|
||||
MostRecentDTM = TestRunRec<TEST_RUN_RUN_DTM$>
|
||||
end else
|
||||
If MostRecentDTM LT TestRunRec<TEST_RUN_RUN_DTM$> then
|
||||
MostRecentDTM = TestRunRec<TEST_RUN_RUN_DTM$>
|
||||
end
|
||||
end
|
||||
WaferQty = Dcount(TestRunRec<TEST_RUN_TEST_RUN_WAFER_IDS$>, @VM)
|
||||
WafersUsed += WaferQty
|
||||
Next Key
|
||||
end
|
||||
Response = ''
|
||||
Response<1> = MostRecentDTM
|
||||
Response<2> = WafersUsed
|
||||
end else
|
||||
Error_Services('Add', 'Username missing.')
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service CreateTestRunRecord(RunTypeID, EqpType, EqpID, PSNo, RDSNo, UserID, TWLotIds, TWLotQtys, ManualQtyAdjust)
|
||||
|
||||
StartTick = GetTickCount()
|
||||
@ -688,6 +754,7 @@ Service GetTestWaferUsageByDateSpan(StartDtm, StopDtm)
|
||||
end service
|
||||
|
||||
Service GetTestRunKeysByDateSpan(StartDtm, StopDtm)
|
||||
|
||||
Begin Case
|
||||
Case StartDTM EQ '' AND StopDTM EQ ''
|
||||
//Set search date for last 24 hour period
|
||||
@ -714,8 +781,6 @@ Service GetTestRunKeysByDateSpan(StartDtm, StopDtm)
|
||||
Response = keylist
|
||||
end
|
||||
|
||||
|
||||
|
||||
end service
|
||||
|
||||
Service GetTestRunKeysByEqp(EquipType, EquipID)
|
||||
@ -820,13 +885,3 @@ Service IsNewTWSystemActive(UserId)
|
||||
|
||||
end service
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -27,6 +27,8 @@ Service GetNumberOfPointsForPattern(ToolClass, PatternName)
|
||||
end
|
||||
end
|
||||
|
||||
Convert @LOWER_CASE to @UPPER_CASE in ToolClass
|
||||
|
||||
If Error_Services('NoError') then
|
||||
ToolClassRecord = Database_Services('ReadDataRow', 'TOOL_CLASS', ToolClass)
|
||||
If Error_Services('HasError') then
|
||||
@ -48,3 +50,4 @@ Service GetNumberOfPointsForPattern(ToolClass, PatternName)
|
||||
end
|
||||
end
|
||||
End Service
|
||||
|
||||
|
@ -381,5 +381,3 @@ API wafercounter.ID.GET
|
||||
HTTP_Services('SetResponseStatus', ResponseCode, ErrorMessage)
|
||||
|
||||
end api
|
||||
|
||||
|
||||
|
116
LSL2/STPROC/WEB_OI_WIZARD_EVENTS.txt
Normal file
116
LSL2/STPROC/WEB_OI_WIZARD_EVENTS.txt
Normal 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
132
LSL2/STPROC/WM_IN_API.txt
Normal 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
|
||||
|
@ -46,23 +46,48 @@ Compile function WM_IN_Services(@Service, @Params)
|
||||
|
||||
***********************************************************************************************************************/
|
||||
#pragma precomp SRP_PreCompiler
|
||||
$insert LOGICAL
|
||||
$Insert SERVICE_SETUP
|
||||
|
||||
$Insert SERVICE_SETUP
|
||||
$insert APP_INSERTS
|
||||
$Insert UNIT_EQUATES
|
||||
$Insert MSG_EQUATES
|
||||
$Insert DICT_EQUATES
|
||||
$Insert WM_IN_EQUATES
|
||||
$Insert WO_LOG_EQUATES
|
||||
$Insert PROD_SPEC_EQUATES
|
||||
$Insert WO_MAT_EQUATES
|
||||
$Insert CUST_EPI_PART_EQUATES
|
||||
$Insert QUOTE_SPEC_EQU
|
||||
$Insert WO_STEP_EQUATES
|
||||
|
||||
EQU PI$LEFT TO 1
|
||||
EQU PI$TOP TO 2
|
||||
EQU PI$RIGHT TO 3
|
||||
EQU PI$BOTTOM TO 4
|
||||
EQU PI$WIDTH TO 5
|
||||
EQU PI$HEIGHT TO 6
|
||||
EQU PI$SIZE TO 7
|
||||
|
||||
EQU PS$TOOL TO 1
|
||||
EQU PS$TYPE TO 2
|
||||
EQU PS$RECIPE TO 3
|
||||
EQU PS$FREQ TO 4
|
||||
EQU PS$PATTERN TO 11
|
||||
|
||||
Declare function PSN_Services, SRP_Rotate_Array, Datetime, Database_Services, Environment_Services, Logging_Services
|
||||
Declare subroutine Database_Services, Set_Status, obj_Wo_Mat_Log, Logging_Services, Extract_Si_Keys
|
||||
Declare function obj_Install, SRP_Json
|
||||
Declare subroutine Database_Services, Set_Status, obj_Wo_Mat_Log, Logging_Services, Extract_Si_Keys, Btree.Extract
|
||||
Declare subroutine SRP_Json
|
||||
|
||||
GoToService
|
||||
GoToService else
|
||||
Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
|
||||
end
|
||||
|
||||
Return Response or ""
|
||||
Return Response else ''
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// SERVICES
|
||||
//-----------------------------------------------------------------------------
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Services
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
@ -76,15 +101,13 @@ Return Response or ""
|
||||
Service GetComments(WMINNo)
|
||||
|
||||
CommentArray = ''
|
||||
WMInRow = Database_Services('ReadDataRow', 'WM_IN', WMInNo)
|
||||
|
||||
WMInRow = Database_Services('ReadDataRow', 'WM_IN', WMInNo)
|
||||
CommentDates = Oconv(WMInRow<WM_IN_EPP_COMMENT_DATE$>, 'DT')
|
||||
CommentUsers = WMInRow<WM_IN_EPP_COMMENT_USER$>
|
||||
Comments = WMInRow<WM_IN_EPP_COMMENT_NOTE$>
|
||||
|
||||
CommentList = CommentDates :@FM: CommentUsers :@FM: Comments
|
||||
Comments = WMInRow<WM_IN_EPP_COMMENT_NOTE$>
|
||||
CommentList = CommentDates :@FM: CommentUsers :@FM: Comments
|
||||
CommentArray = SRP_Rotate_Array(CommentList)
|
||||
Response = CommentArray
|
||||
Response = CommentArray
|
||||
|
||||
End Service
|
||||
|
||||
@ -368,3 +391,557 @@ Service VerifyWOMatWMIKeyIndex(WMIKey)
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service GetWMInKeys(WOLogId)
|
||||
|
||||
ErrorMsg = ''
|
||||
WMInKeys = ''
|
||||
|
||||
If WOLogId NE '' then
|
||||
Open 'DICT.WM_IN' to hWmInDict then
|
||||
SearchString = ''
|
||||
SearchString := 'WO_NO':@VM:WOLogId:@FM
|
||||
Btree.Extract(SearchString, 'WM_IN', hWmInDict, WMInKeys, 0, 0)
|
||||
end else
|
||||
ErrorMsg = 'Error opening WM_IN dictionary.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'WOLogId was null'
|
||||
end
|
||||
|
||||
If ErrorMsg NE '' then
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
Response = WMInKeys
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service GetWmInZpl(WmInKey)
|
||||
|
||||
ZPL = ''
|
||||
ErrorMsg = ''
|
||||
If WmInKey NE '' then
|
||||
Swap '-' with '*' in WmInKey
|
||||
Swap '.' with '*' in WmInKey
|
||||
If RowExists('WM_IN', WmInKey) then
|
||||
WONo = Field(WmInKey, '*', 1, 1)
|
||||
WOStep = Field(WmInKey, '*', 2, 1)
|
||||
WOStepKeys = XLATE('WO_LOG',WONo,WO_LOG_WO_STEP_KEY$,'X')
|
||||
IF INDEX(WOStepKeys,@VM,1) THEN
|
||||
PrintWONo = WONo:'.':WOStep
|
||||
END ELSE
|
||||
PrintWONo = WONo
|
||||
END
|
||||
WORec = XLATE('WO_LOG',WONo,'','X')
|
||||
ReqShipDate = OCONV(WORec<WO_LOG_PROMISE_SHIP_DT$>,'D2/')
|
||||
CustNo = WORec<WO_LOG_CUST_NO$>
|
||||
CustName = XLATE('COMPANY',CustNo,'ABBREV_OR_CO_NAME','X')
|
||||
Captive = XLATE('COMPANY',CustNo,'CAPTIVE','X')
|
||||
PONo = WORec<WO_LOG_CUST_PO_NO$>
|
||||
PSNo = XLATE('WO_STEP',WONo:'*':WOStep,WO_STEP_PROD_SPEC_ID$,'X')
|
||||
PSRec = XLATE('PROD_SPEC',PSNo,'','X')
|
||||
CustSpecNo = ''
|
||||
IF Captive THEN
|
||||
CustSpecNos = PSRec<PROD_SPEC_SPEC_NUM$>
|
||||
CustSpecDescs = PSRec<PROD_SPEC_SPEC_DESC$>
|
||||
CustSpecRevNos = PSRec<PROD_SPEC_REV_NUM$>
|
||||
CustSpecRevDts = PSRec<PROD_SPEC_REV_DATE$>
|
||||
SpecCnt = COUNT(CustSpecNos,@VM) + (CustSpecNos NE '')
|
||||
FOR I = 1 TO SpecCnt
|
||||
IF CustSpecDescs<1,I> _EQC 'GENERAL' THEN
|
||||
CustSpecNo = CustSpecNos<1,I>
|
||||
CustSpecDesc = CustSpecDescS<1,I>
|
||||
CustSpecRevNo = CustSpecRevNos<1,I>
|
||||
CustSpecRevDt = OCONV(CustSpecRevDts<1,I>,'D4/')
|
||||
END
|
||||
UNTIL CustSpecNo NE ''
|
||||
NEXT I
|
||||
END
|
||||
EpiPartNo = WORec<WO_LOG_EPI_PART_NO$>
|
||||
CustEpiPartRec = XLATE('CUST_EPI_PART',CustNo:'*':EpiPartNo,'','X')
|
||||
ShipBagReq = CustEpiPartRec<CUST_EPI_PART_SHIP_BAG_REQ$>
|
||||
PreSurfscan = PSRec<PROD_SPEC_PRE_SURFSCAN$>
|
||||
FirstSurfscan = PSRec<PROD_SPEC_FIRST_SURFSCAN$>
|
||||
PostCleanSurfScan = PSRec<PROD_SPEC_POST_CLEAN_SURFSCAN$>
|
||||
SubPreClean = XLATE( 'PROD_SPEC', PSNo, 'SUB_PRE_CLEAN', 'X' )
|
||||
SubPostClean = XLATE( 'PROD_SPEC', PSNo, 'SUB_POST_CLEAN', 'X' )
|
||||
PreCleanTool = SubPreClean ;* Temporary for 2x4 -> 4x4 conversion
|
||||
PostCleanTool = SubPostClean
|
||||
PreAkrionRecipe = XLATE( 'PROD_SPEC', PSNo, 'PRE_AKRION_RECIPE', 'X' )
|
||||
PostAkrionRecipe = XLATE( 'PROD_SPEC', PSNo, 'POST_AKRION_RECIPE', 'X' )
|
||||
RecipeNo = XLATE( 'PROD_SPEC', PSNo, 'RECIPE_NO_L1', 'X' )
|
||||
RecipeName = XLATE( 'PROD_SPEC', PSNo, 'RECIPE_NAME_L1', 'X' )
|
||||
SpecType = OCONV( XLATE( 'PROD_SPEC', PSNo, 'SPEC_TYPE', 'X' ), '[SPEC_TYPE_CONV]' )
|
||||
SubOxide = OCONV( XLATE( 'PROD_SPEC', PSNo, 'SUB_OXIDE_STRIP', 'X' ), 'B' )
|
||||
ThickTarget = OCONV( XLATE( 'PROD_SPEC', PSNo, 'THICK_TARGET_ALL', 'X' ), 'MD3' )
|
||||
ResTarget = OCONV( XLATE( 'PROD_SPEC', PSNo, 'RES_TARGET_ALL', 'X' ), 'MD3' )
|
||||
ThickUnit = XLATE( 'PROD_SPEC', PSNo, 'THICK_UNITS_ALL', 'X' )
|
||||
ResUnit = XLATE( 'PROD_SPEC', PSNo , 'RES_UNITS_ALL', 'X' )
|
||||
Dopant = XLATE( 'PROD_SPEC', PSNo, 'DOPANT_L1', 'X' )
|
||||
RecipeNo = XLATE( 'PROD_SPEC', PSNo, 'RECIPE_NO', 'X' )
|
||||
RecipeInfo = XLATE( 'RECIPE', RecipeNo, 'RECIPE_NAME_NO', 'X' )
|
||||
CleaningReqs = ''
|
||||
ThickCnt = FIELDCOUNT( ThickTarget<1>, @VM )
|
||||
PrintThickTargets = ''
|
||||
FOR J = 1 TO ThickCnt
|
||||
PrintThickTargets<1,J> = ThickTarget<1,J>:ThickUnit<1,J>
|
||||
NEXT J
|
||||
ResCnt = FIELDCOUNT( ResTarget<1>, @VM )
|
||||
PrintResTargets = ''
|
||||
FOR J = 1 TO ResCnt
|
||||
IF ResTarget<1,J>[1,1] = '.' THEN
|
||||
TargetVal = '0':ResTarget<1,J>
|
||||
END ELSE
|
||||
TargetVal = ResTarget<1,J>
|
||||
END
|
||||
PrintResTargets<1,J> = TargetVal:ResUnit<1,J>
|
||||
NEXT J
|
||||
APreRec = ''
|
||||
APostRec = ''
|
||||
IF ( PreAkrionRecipe<1> <> '' ) THEN
|
||||
APreRec = ' ':PreAkrionRecipe:' '
|
||||
SubOxide = 'No' ;* If Akrion then no oxide strip
|
||||
END
|
||||
IF ( PostAkrionRecipe<1> <> '' ) THEN
|
||||
APostRec = ' ':PostAkrionRecipe
|
||||
END
|
||||
PrintCleaningReqs = TRIM( 'Strip:':SubOxide:' Pre:':SubPreClean:APreRec:' Post:':SubPostClean:APostRec )
|
||||
swap UNIT_MICROMETER$ with 'um' in PrintThickTargets
|
||||
swap UNIT_OHM_CM$ with 'ohm.cm' in PrintThickTargets
|
||||
swap UNIT_OHM_PER_SQ$ with 'ohm/sq' in PrintThickTargets
|
||||
swap UNIT_A$ with 'A' in PrintThickTargets
|
||||
swap UNIT_MICROMETER$ with 'um' in PrintResTargets
|
||||
swap UNIT_OHM_CM$ with 'ohm.cm' in PrintResTargets
|
||||
swap UNIT_OHM_PER_SQ$ with 'ohm/sq' in PrintResTargets
|
||||
swap UNIT_A$ with 'A' in PrintResTargets
|
||||
|
||||
PrintWMInKey = WMInKey
|
||||
CONVERT '*' TO '.' IN PrintWMInKey
|
||||
CassNo = FIELD(WMInKey,'*',3)
|
||||
WOMatKey = WONo:'*':CassNo
|
||||
WOMatRec = XLATE('WO_MAT',WOMatKey,'','X')
|
||||
LotNo = WOMatRec<WO_MAT_LOT_NO$>
|
||||
WfrQty = WOMatRec<WO_MAT_WAFER_QTY$>
|
||||
CustPartNo = WOMatRec<WO_MAT_CUST_PART_NO$>
|
||||
SubPartNo = WOMatRec<WO_MAT_SUB_PART_NO$>
|
||||
OrderItem = WOMatRec<WO_MAT_ORDER_ITEM$>
|
||||
Vendor = WOMatRec<WO_MAT_SUB_VEND_CD$>
|
||||
OrderDetKey = WORec<WO_LOG_ORDER_NO$>:'*':OrderItem
|
||||
LOCATE CustPartNo IN CustEpiPartRec<CUST_EPI_PART_CUST_PART_NO$> USING @VM SETTING Pos THEN
|
||||
CustPartDesc = CustEpiPartRec<CUST_EPI_PART_CUST_PART_DESC$,Pos>
|
||||
END ELSE
|
||||
CustPartDesc = ''
|
||||
END
|
||||
PartNo = CustPartNo
|
||||
PartDesc = CustPartDesc
|
||||
SuppCd = TRIM(SubPartNo[-1,'B-'])
|
||||
IF LEN(SuppCd) NE '2' THEN SuppCd =''
|
||||
If CassNo EQ 1 then
|
||||
SpecEpi = PSRec<prod_spec_spec_epi$>
|
||||
SpecSub = PSRec<PROD_SPEC_SPEC_SUBSTRATE$>
|
||||
ThkSmile = PSRec<PROD_SPEC_THICK_SMILE_REQ$>
|
||||
ThkShift = Field(PSRec, @FM, PROD_SPEC_THICK_LIMIT_SHIFT$)
|
||||
ResShift = Field(PSRec, @FM, PROD_SPEC_RES_LIMIT_SHIFT$)
|
||||
SSRecipe = XLATE('PRS_STAGE', PSNo:'*LWI', 5, 'X')
|
||||
PCRecipe = XLATE('PRS_STAGE', PSNo, 'POST_CLEAN_SURFSCAN_RECIPE', 'X')
|
||||
WaferSize = Field(SpecSub, @VM, QSSubWafersize$)
|
||||
convert char(248) to @fm in SpecEpi ;* char(248) is used to separate layers
|
||||
layerCount = fieldcount( SpecEpi, @fm )
|
||||
layerInfo = SpecEpi<layerCount>
|
||||
// If this is just 1 layer, we're returning that info, if 3 layers, we're returning layer 3 (combo)
|
||||
ThkData = Field(layerInfo, @VM, QSEpiThickMeasure$)
|
||||
ResData = Field(layerInfo, @VM, QSEpiResMeasure$)
|
||||
ConData = Field(layerInfo, @VM, QSEpiConcMeasure$)
|
||||
CResData = Field(layerInfo, @VM, QSEpiCresMeasure$)
|
||||
ThkMin = OCONV(Field(layerInfo, @VM, QSEpiMinThick$), 'MD3')
|
||||
ThkMax = OCONV(Field(layerInfo, @VM, QSEpiMaxThick$), 'MD3')
|
||||
ThkTarg = ''
|
||||
If ThkMin NE '' Then ThkTarg = oConv(iconv((ThkMin+ThkMax)/2, 'MD3'), 'MD3')
|
||||
ResMin = OCONV(Field(layerInfo, @VM, QSEpiResMinThick$), 'MD3')
|
||||
ResMax = OCONV(Field(layerInfo, @VM, QSEpiResMaxThick$), 'MD3')
|
||||
ResTarg = ''
|
||||
If ResMin NE '' Then ResTarg = oConv(iconv((ResMin+ResMax)/2, 'MD3'), 'MD3')
|
||||
ConMin = OCONV(Field(layerInfo, @VM, QSEpiConcMinThick$), 'MD3')
|
||||
ConMax = OCONV(Field(layerInfo, @VM, QSEpiConcMaxThick$), 'MD3')
|
||||
ConTarg = ''
|
||||
If ConMin NE '' Then ConTarg = oConv(iconv((ConMin+ConMax)/2, 'MD3'), 'MD3')
|
||||
CResMin = OCONV(Field(layerInfo, @VM, QSEpiCresMin$), 'MD3')
|
||||
CResMax = OCONV(Field(layerInfo, @VM, QSEpiCresMax$), 'MD3')
|
||||
CResTarg = ''
|
||||
If CResMin NE '' Then CResTarg = oConv(iconv((CResMin+CResMax)/2, 'MD3'), 'MD3')
|
||||
ThkTool = Field(ThkData, '~', PS$TOOL)
|
||||
ThkType = Field(ThkData, '~', PS$TYPE)
|
||||
ThkRecipe = Field(ThkData, '~', PS$RECIPE)
|
||||
ThkFreq = Field(ThkData, '~', PS$FREQ)
|
||||
ThkPattern = Field(ThkData, '~', PS$PATTERN)
|
||||
ResTool = Field(ResData, '~', PS$TOOL)
|
||||
ResType = Field(ResData, '~', PS$TYPE)
|
||||
ResRecipe = Field(ResData, '~', PS$RECIPE)
|
||||
ResFreq = Field(ResData, '~', PS$FREQ)
|
||||
ResPattern = Field(ResData, '~', PS$PATTERN)
|
||||
ConTool = Field(ConData, '~', PS$TOOL)
|
||||
ConType = Field(ConData, '~', PS$TYPE)
|
||||
ConRecipe = Field(ConData, '~', PS$RECIPE)
|
||||
ConFreq = Field(ConData, '~', PS$FREQ)
|
||||
ConPattern = Field(ConData, '~', PS$PATTERN)
|
||||
CResTool = Field(CResData, '~', PS$TOOL)
|
||||
CResType = Field(CResData, '~', PS$TYPE)
|
||||
CResRecipe = Field(CResData, '~', PS$RECIPE)
|
||||
CResFreq = Field(CResData, '~', PS$FREQ)
|
||||
CResPattern = Field(CResData, '~', PS$PATTERN)
|
||||
IF ThkMin EQ '' THEN ThkMin = '--'
|
||||
IF ThkMax EQ '' THEN ThkMax = '--'
|
||||
IF ThkTarg EQ '' THEN ThkTarg = '--'
|
||||
IF ThkTool EQ '' THEN ThkTool = '--'
|
||||
IF ThkType EQ '' THEN ThkType = '--'
|
||||
IF ThkRecipe EQ '' THEN ThkRecipe = '--'
|
||||
IF ThkPattern EQ '' THEN ThkPattern = '--'
|
||||
IF ThkFreq EQ '' THEN ThkFreq = '--'
|
||||
IF ResMin EQ '' THEN ResMin = '--'
|
||||
IF ResMax EQ '' THEN ResMax = '--'
|
||||
IF ResTarg EQ '' THEN ResTarg = '--'
|
||||
IF ResTool EQ '' THEN ResTool = '--'
|
||||
IF ResType EQ '' THEN ResType = '--'
|
||||
IF ResRecipe EQ '' THEN ResRecipe = '--'
|
||||
IF ResPattern EQ '' THEN ResPattern = '--'
|
||||
IF ResFreq EQ '' THEN ResFreq = '--'
|
||||
IF ConMin EQ '' THEN ConMin = '--'
|
||||
IF ConMax EQ '' THEN ConMax = '--'
|
||||
IF ConTarg EQ '' THEN ConTarg = '--'
|
||||
IF ConTool EQ '' THEN ConTool = '--'
|
||||
IF ConType EQ '' THEN ConType = '--'
|
||||
IF ConRecipe EQ '' THEN ConRecipe = '--'
|
||||
IF ConPattern EQ '' THEN ConPattern = '--'
|
||||
IF ConFreq EQ '' THEN ConFreq = '--'
|
||||
IF CResMin EQ '' THEN CResMin = '--'
|
||||
IF CResMax EQ '' THEN CResMax = '--'
|
||||
IF CResTarg EQ '' THEN CResTarg = '--'
|
||||
IF CResTool EQ '' THEN CResTool = '--'
|
||||
IF CResType EQ '' THEN CResType = '--'
|
||||
IF CResRecipe EQ '' THEN CResRecipe = '--'
|
||||
IF CResPattern EQ '' THEN CResPattern = '--'
|
||||
IF CResFreq EQ '' THEN CResFreq = '--'
|
||||
Swap @VM with ' / ' in SSRecipe
|
||||
IF PCRecipe EQ '' Then PCRecipe = '--'
|
||||
If ThkSmile EQ '' OR ThkSmile EQ '0' then
|
||||
ThkSmile = 'N'
|
||||
end else
|
||||
ThkSmile = 'Y'
|
||||
end
|
||||
If ThkShift EQ '' OR ThkShift EQ '0' then
|
||||
ThkShift = 'N'
|
||||
end else
|
||||
ThkShift = 'Y'
|
||||
end
|
||||
If ResShift EQ '' OR ResShift EQ '0' then
|
||||
ResShift = 'N'
|
||||
end else
|
||||
ResShift = 'Y'
|
||||
end
|
||||
if Len(ThkMin) > 6 then
|
||||
ThkMin = ThkMin[1,6]
|
||||
end
|
||||
if Len(ThkMax) > 6 then
|
||||
ThkMax = ThkMax[1,6]
|
||||
end
|
||||
if Len(ThkTarg) > 6 then
|
||||
ThkTarg = ThkTarg[1,6]
|
||||
end
|
||||
if Len(ResMin) > 6 then
|
||||
ResMin = ResMin[1,6]
|
||||
end
|
||||
if Len(ResMax) > 6 then
|
||||
ResMax = ResMax[1,6]
|
||||
end
|
||||
if Len(ResTarg) > 6 then
|
||||
ResTarg = ResTarg[1,6]
|
||||
end
|
||||
if Len(ConMin) > 6 then
|
||||
ConMin = ConMin[1,6]
|
||||
end
|
||||
if Len(ConMax) > 6 then
|
||||
ConMax = ConMax[1,6]
|
||||
end
|
||||
if Len(ConTarg) > 6 then
|
||||
ConTarg = ConTarg[1,6]
|
||||
end
|
||||
if Len(CResMin) > 6 then
|
||||
CResMin = CResMin[1,6]
|
||||
end
|
||||
if Len(CResMax) > 6 then
|
||||
CResMax = CResMax[1,6]
|
||||
end
|
||||
if Len(CResTarg) > 6 then
|
||||
CResTarg = CResTarg[1,6]
|
||||
end
|
||||
****** Begin ZPL
|
||||
ZPL := '^XA'
|
||||
ZPL := '^LH10,0'
|
||||
ZPL := '^PR2' ;* Print speed 2 inches per second
|
||||
ZPL := '^LL406' ;* Label length @203 dpi
|
||||
ZPL := '^PW900'
|
||||
ZPL := '^MD0' ;* Media darkness
|
||||
ZPL := '^MMT' ;* Media mode t=tear off mode
|
||||
****** 1st/2nd Line
|
||||
ZPL := '^FO30,20^A0,,40^FDWO ':WONo:'^FS'
|
||||
ZPL := '^FO590,10^A050,30^FDPSN ':PSNo:'^FS'
|
||||
ZPL := '^FO555,40^A050,30^FDDopant ':Dopant:'^FS'
|
||||
****** 3rd Line - headers
|
||||
ZPL := '^FO85,100^A050,23^FDMin^FS'
|
||||
ZPL := '^FO145,100^A050,23^FDTarg^FS'
|
||||
ZPL := '^FO210,100^A050,23^FDMax^FS'
|
||||
ZPL := '^FO280,100^A050,23^FDTool^FS'
|
||||
ZPL := '^FO330,100^A050,23^FDType^FS'
|
||||
ZPL := '^FO470,100^A050,23^FDRecipe^FS'
|
||||
ZPL := '^FO600,100^A050,23^FDPattern^FS'
|
||||
ZPL := '^FO740,100^A050,23^FDFreq^FS'
|
||||
****** 4th Line - Thickness (Thk)
|
||||
ZPL := '^FO70,130^GB720,0,3^FS'
|
||||
ZPL := '^FO70,130^GB0,160,3^FS'
|
||||
ZPL := '^FO10,140^A050,23^FDThk:^FS'
|
||||
ZPL := '^FO80,140^A050,23^FD':ThkMin:'^FS'
|
||||
ZPL := '^FO145,140^A050,23^FD':ThkTarg:'^FS'
|
||||
ZPL := '^FO210,140^A050,23^FD':ThkMax:'^FS'
|
||||
ZPL := '^FO280,140^A050,23^FD':ThkTool[1,5]:'^FS'
|
||||
ZPL := '^FO330,140^A050,23^FD':ThkType[1,11]:'^FS'
|
||||
ZPL := '^FO470,140^A050,23^FD':ThkRecipe[1,11]:'^FS'
|
||||
ZPL := '^FO600,140^A050,23^FD':ThkPattern[1,11]:'^FS'
|
||||
ZPL := '^FO750,140^A050,23^FD':ThkFreq:'^FS'
|
||||
****** 5th Line - Resistivity (Res)
|
||||
ZPL := '^FO10,170^GB780,0,3^FS'
|
||||
ZPL := '^FO10,180^A050,23^FDRes:^FS'
|
||||
ZPL := '^FO80,180^A050,23^FD':ResMin:'^FS'
|
||||
ZPL := '^FO145,180^A050,23^FD':ResTarg:'^FS'
|
||||
ZPL := '^FO210,180^A050,23^FD':ResMax:'^FS'
|
||||
ZPL := '^FO280,180^A050,23^FD':ResTool[1,5]:'^FS'
|
||||
ZPL := '^FO330,180^A050,23^FD':ResType[1,11]:'^FS'
|
||||
ZPL := '^FO470,180^A050,23^FD':ResRecipe[1,11]:'^FS'
|
||||
ZPL := '^FO600,180^A050,23^FD':ResPattern[1,11]:'^FS'
|
||||
ZPL := '^FO750,180^A050,23^FD':ResFreq:'^FS'
|
||||
****** 6th Line - Contact (Con)
|
||||
ZPL := '^FX***LINE 4'
|
||||
ZPL := '^FO10,210^GB780,0,3^FS'
|
||||
ZPL := '^FO10,220^A050,23^FDCon:^FS'
|
||||
ZPL := '^FO80,220^A050,23^FD':ConMin:'^FS'
|
||||
ZPL := '^FO145,220^A050,23^FD':ConTarg:'^FS'
|
||||
ZPL := '^FO210,220^A050,23^FD':ConMax:'^FS'
|
||||
ZPL := '^FO280,220^A050,23^FD':ConTool[1,5]:'^FS'
|
||||
ZPL := '^FO330,220^A050,23^FD':ConType[1,11]:'^FS'
|
||||
ZPL := '^FO470,220^A050,23^FD':ConRecipe[1,11]:'^FS'
|
||||
ZPL := '^FO600,220^A050,23^FD':ConPattern[1,11]:'^FS'
|
||||
ZPL := '^FO750,220^A050,23^FD':ConFreq:'^FS'
|
||||
****** 7th Line - Contact Resistance (CRes)
|
||||
ZPL := '^FO10,250^GB780,0,3^FS'
|
||||
ZPL := '^FO10,260^A050,23^FDCRes:^FS'
|
||||
ZPL := '^FO80,260^A050,23^FD':CResMin:'^FS'
|
||||
ZPL := '^FO145,260^A050,23^FD':CResTarg:'^FS'
|
||||
ZPL := '^FO210,260^A050,23^FD':CResMax:'^FS'
|
||||
ZPL := '^FO280,260^A050,23^FD':CResTool[1,5]:'^FS'
|
||||
ZPL := '^FO330,260^A050,23^FD':CResType[1,11]:'^FS'
|
||||
ZPL := '^FO470,260^A050,23^FD':CResRecipe[1,11]:'^FS'
|
||||
ZPL := '^FO600,260^A050,23^FD':CResPattern[1,11]:'^FS'
|
||||
ZPL := '^FO750,260^A050,23^FD':CResFreq:'^FS'
|
||||
ZPL := '^FO10,290^GB780,0,3^FS'
|
||||
****** 8th Line - Special Instructions
|
||||
ZPL := '^FO10,310^A050,23^FDSurfScan: ':SSRecipe:'^FS'
|
||||
ZPL := '^FO10,340^A050,23^FDPostClean: ':PCRecipe:'^FS'
|
||||
ZPL := '^FO10,370^A050,23^FDWafer Size: ':WaferSize:'^FS'
|
||||
ZPL := '^FO500,310^A050,23^FDSmile Required: ':ThkSmile:'^FS'
|
||||
ZPL := '^FO500,340^A050,23^FDSPC Thk Shift: ':ThkShift:'^FS'
|
||||
ZPL := '^FO500,370^A050,23^FDSPC Res Shift: ':ResShift:'^FS'
|
||||
ZPL := '^XZ':CRLF$
|
||||
****** End Cheet Sheet ZPL
|
||||
end
|
||||
For cnt = 1 to 2
|
||||
ZPL := '^XA'
|
||||
ZPL := '^LH0,0'
|
||||
ZPL := '^PR2' ;* Print speed 2 inches per second
|
||||
ZPL := '^LL406' ;* Label length @203 dpi
|
||||
ZPL := '^PW900'
|
||||
ZPL := '^MD8' ;* Media darkness
|
||||
ZPL := '^MMT' ;* Media mode t=tear off mode
|
||||
ZPL := '^FO15,15^GB795,398,3,B^FS' ;* Border
|
||||
ZPL:= '^FO680,25^A0,36^FDWM In^FS'
|
||||
****** First Line
|
||||
Company = 'IFX Epi Services'
|
||||
ZPL := '^FO30,25^A0,,36^FD':Company:'^FS'
|
||||
ZPL := '^FO290,25^AC,18^FDWO No:^FS':CRLF$
|
||||
ZPL := '^FO370,25^A045,36^FD':PrintWONo:'^FS':CRLF$
|
||||
IF CassNo = 1 THEN
|
||||
ZPL := '^FO535,20^GB120,40,40,,3^FS':CRLF$
|
||||
ZPL := '^FO540,25^AC,18^FR^FDCass:^FS':CRLF$
|
||||
ZPL := '^FO600,25^A045,36^FR^FD':CassNo:'^FS':CRLF$
|
||||
END ELSE
|
||||
ZPL := '^FO540,25^AC,18^FDCass:^FS':CRLF$
|
||||
ZPL := '^FO600,25^A045,36^FD':CassNo:'^FS':CRLF$
|
||||
END
|
||||
****** Second Line
|
||||
ZPL := '^FO30,70^AC,18^FDWM In:^FS':CRLF$
|
||||
ZPL := '^FO120,70^A050,30^FD':PrintWMInKey:'^FS':CRLF$
|
||||
ZPL := '^BY2,2.0':CRLF$
|
||||
ZPL := '^FO300,60^B3,,37,N^FD':'I':PrintWMInKey:'^FS':CRLF$
|
||||
ZPL := '^BY2,3.0':CRLF$
|
||||
ZPL := '^FO700,70^AC,18^FDQty:^FS':CRLF$
|
||||
ZPL := '^FO760,70^A045,25^FD':WfrQty:'^FS':CRLF$
|
||||
****** Third Line
|
||||
ZPL := '^FO30,105^AC,18^FDShip Dt:^FS'
|
||||
ZPL := '^FO140,105^A0,,25^FD':ReqShipDate:'^FS':CRLF$
|
||||
ZPL := '^FO250,105^AC,18^FDCust:^FS':CRLF$
|
||||
ZPL := '^FO320,105^A045,25^FD':CustName:'^FS':CRLF$
|
||||
ZPL := '^FO560,105^AC,18^FDPO:^FS':CRLF$
|
||||
ZPL := '^FO600,105^A045,25^FD':PONo:'^FS':CRLF$
|
||||
****** Separator bar
|
||||
ZPL := '^FO15,128^GB795,1^FS'
|
||||
****** Fourth Line
|
||||
ZPL := '^FO30,135^AC,18^FDLot No:^FS':CRLF$
|
||||
ZPL := '^FO120,135^A0,20^FD':LotNo:'^FS':CRLF$
|
||||
ZPL := '^FO410,135^AC,18^FDPart No:^FS':CRLF$
|
||||
ZPL := '^FO510,135^A0,20^FD':PartNo:'^FS':CRLF$
|
||||
****** Fifth Line
|
||||
ZPL := '^FO30,160^AC,18^FDSub PN:^FS':CRLF$
|
||||
ZPL := '^FO120,160^A0,20^FD':SubPartNo:'^FS':CRLF$
|
||||
IF SuppCd NE '' THEN
|
||||
ZPL := '^FO410,160^AC,18^FDSupp Cd:^FS':CRLF$
|
||||
ZPL := '^FO510,160^A0,20^FD':SuppCd:'^FS':CRLF$
|
||||
ZPL := '^BY2,2.0':CRLF$
|
||||
ZPL := '^FO610,160^A040,20^B3,,23,N^FD':SuppCd:'^FS':CRLF$
|
||||
ZPL := '^BY2,3.0':CRLF$
|
||||
END
|
||||
****** Separator bar
|
||||
ZPL := '^FO15,183^GB795,1^FS'
|
||||
****** Seventh Line
|
||||
ZPL := '^FO30,210^AC,18^FDPre:^FS':CRLF$
|
||||
ZPL := '^FO90,210^A0,20^FD':SubPreClean:'^FS':CRLF$
|
||||
IF PreAkrionRecipe NE '' THEN
|
||||
ZPL := '^FO210,210^AC,18^FDAkrion:^FS':CRLF$
|
||||
ZPL := '^FO300,210^A0,20^FD':PreAkrionRecipe:'^FS':CRLF$
|
||||
ZPL := '^BY2,2.0':CRLF$
|
||||
ZPL := '^FO450,210^A040,20^B3,,23,N^FD':PreAkrionRecipe:'^FS':CRLF$
|
||||
ZPL := '^BY2,3.0':CRLF$
|
||||
END
|
||||
****** Eighth Line
|
||||
ZPL := '^FO30,235^AC,18^FDRecipe:^FS':CRLF$
|
||||
ZPL := '^FO120,235^A0,20^FD':RecipeInfo:'^FS':CRLF$
|
||||
ZPL := '^FO410,235^AC,18^FDEpi Dopant:^FS':CRLF$
|
||||
ZPL := '^FO560,235^A040,20^FD':Dopant:'^FS':CRLF$
|
||||
****** Tenth, Eleventh and Twelfth Lines
|
||||
ZPL := '^FO30,285^AC,18^FDThk Spec:^FS':CRLF$
|
||||
FOR M = 1 TO COUNT(PrintThickTargets,@VM) + (PrintThickTargets NE '')
|
||||
BaseLine = 285 + (M-1)*20
|
||||
ZPL := '^FO140,':BaseLine:'^A040,20^FD':PrintThickTargets<1,M>:'^FS':CRLF$
|
||||
NEXT M
|
||||
ZPL := '^FO410,285^AC,18^FDRes Spec:^FS':CRLF$
|
||||
FOR M = 1 TO COUNT(PrintResTargets,@VM) + (PrintResTargets NE '')
|
||||
BaseLine = 285 + (M-1)*20
|
||||
ZPL := '^FO520,':BaseLine:'^A040,20^FD':PrintResTargets<1,M>:'^FS':CRLF$
|
||||
NEXT M
|
||||
****** Separator bar
|
||||
ZPL := '^FO15,373^GB795,1^FS'
|
||||
****** Fourteenth Line
|
||||
ZPL := '^FO30,385^AC,18^FDProd Spec No:^FS':CRLF$
|
||||
ZPL := '^FO190,385^A0,25^FD':PSNo:'^FS':CRLF$
|
||||
IF SpecType = 'Production' THEN
|
||||
SpecType = 'Prod'
|
||||
end else IF SpecType = 'Pre-Production' THEN
|
||||
SpecType = 'Pre'
|
||||
end
|
||||
ZPL := '^FO275,385^AC,18^FDSpec Type:^FS':CRLF$
|
||||
ZPL := '^FO400,385^A0,25^FD':SpecType:'^FS':CRLF$
|
||||
****** Data Matrix barcode
|
||||
ZPL := '^FO720,280^CI28':CRLF$
|
||||
ZPL := '^BXN,2,200^FDP':PartNo:'|S':SubPartNo:'|1T':PrintWMInKey:'|2T':LotNo:'|':PSNo:'|Q':WfrQty:'|1V':Vendor:'|SEQ':Cnt:'^FS':CRLF$
|
||||
ZPL:= '^XZ'
|
||||
Next
|
||||
* Check to see if they get the monitor wafers based on the PSN
|
||||
MonitorWafer = CustEpiPartRec<CUST_EPI_PART_MONITOR_WAFER_LABEL$>
|
||||
IF MonitorWafer THEN
|
||||
RDSIds = ''
|
||||
ZPL := '^XA^CFD'
|
||||
ZPL := '^LH0,0'
|
||||
ZPL := '^PR2' ;* Print speed 2 inches per second
|
||||
ZPL := '^LL325' ;* Label length in dots
|
||||
ZPL := '^MD15' ;* Media darkness
|
||||
ZPL := '^MMT':CRLF$ ;* Media mode t=tear off mode
|
||||
ZPL := '^FO30,30^A060,40^FDMonitor Wafer^FS':CRLF$
|
||||
ZPL := '^FO550,30^A060,40^FDReactor#_____^FS':CRLF$
|
||||
ZPL := '^FO30,70^A060,40^FDDate_____________^FS':CRLF$
|
||||
ZPL := '^FO30,130^A060,40^FDCustomer Name: ':CustName<I>:'^FS':CRLF$
|
||||
ZPL := '^FO30,190^A060,40^FDRDS#: ':RDSIds<I>:'^FS':CRLF$
|
||||
ZPL := '^FO400,190^A060,40^FDLot#: ':LotNo<I>:'^FS':CRLF$
|
||||
ZPL := '^FO30,250^A060,40^FDThick Avg__________^FS':CRLF$
|
||||
ZPL := '^FO400,250^A060,40^FDWafer Type__________^FS':CRLF$
|
||||
ZPL := '^FO30,280^A060,40^FDRes Avg____________^FS':CRLF$
|
||||
ZPL := '^FO400,280^A060,40^FDWafer Type__________^FS':CRLF$
|
||||
ZPL := '^XZ'
|
||||
END
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. WM_IN ':WmInKey:' does not exist.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Null WmInKey passed in.'
|
||||
end
|
||||
|
||||
If ErrorMsg EQ '' then
|
||||
Response = ZPL
|
||||
end else
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service ConvertRecordToJSON(KeyID, Record, ItemURL)
|
||||
|
||||
jsonRecord = ''
|
||||
|
||||
If KeyID NE '' then
|
||||
|
||||
If Record EQ '' then Record = Database_Services('ReadDataRow', 'WM_IN', KeyID)
|
||||
If Error_Services('NoError') then
|
||||
@DICT = Database_Services('GetTableHandle', 'DICT.WM_IN')
|
||||
@ID = KeyID
|
||||
@RECORD = Record
|
||||
objJSON = ''
|
||||
If SRP_JSON(objJSON, 'New', 'Object') then
|
||||
objWmIn = ''
|
||||
If SRP_JSON(objWmIn, 'New', 'Object') then
|
||||
SRP_JSON(objWmIn, 'SetValue', 'keyId', @ID)
|
||||
SRP_JSON(objJSON, 'Set', 'wmIn', objWmIn)
|
||||
SRP_JSON(objWmIn, 'Release')
|
||||
end
|
||||
|
||||
If itemURL NE '' then
|
||||
// The itemURL was passed in so add HAL+JSON properties.
|
||||
// Create the _links property and then all link objects needed for this resource.
|
||||
objLinks = ''
|
||||
If SRP_JSON(objLinks, 'New', 'Object') then
|
||||
// Create a self link.
|
||||
objLink = ''
|
||||
If SRP_JSON(objLink, 'New', 'Object') then
|
||||
SRP_JSON(objLink, 'SetValue', 'href', ItemURL, 'String')
|
||||
SRP_JSON(objLink, 'SetValue', 'title', 'Self', 'String')
|
||||
SRP_JSON(objLinks, 'Set', 'self', objLink)
|
||||
SRP_JSON(objLink, 'Release')
|
||||
end
|
||||
SRP_JSON(objJSON, 'Set', '_links', objLinks)
|
||||
SRP_JSON(objLinks, 'Release')
|
||||
end
|
||||
// Create the _class property for this resource.
|
||||
SRP_JSON(objJSON, 'SetValue', '_class', 'resource')
|
||||
end
|
||||
jsonRecord = SRP_JSON(objJSON, 'Stringify', 'Styled')
|
||||
SRP_JSON(objJSON, 'Release')
|
||||
end else
|
||||
Error_Services('Add', 'Unable to create JSON representation in the ' : Service : ' service.')
|
||||
end
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'KeyID argument was missing in the ' : Service : ' service.')
|
||||
end
|
||||
|
||||
Response = jsonRecord
|
||||
|
||||
End Service
|
||||
|
||||
|
130
LSL2/STPROC/WM_OUT_API.txt
Normal file
130
LSL2/STPROC/WM_OUT_API.txt
Normal 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
|
@ -49,7 +49,7 @@ Compile function WM_Out_Services(@Service, @Params)
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$Insert SERVICE_SETUP
|
||||
$Insert LOGICAL
|
||||
$Insert APP_INSERTS
|
||||
$Insert MSG_EQUATES
|
||||
$Insert DICT_EQUATES
|
||||
$Insert WM_OUT_EQUATES
|
||||
@ -57,20 +57,28 @@ $Insert WO_MAT_EQUATES
|
||||
$Insert WO_LOG_EQUATES
|
||||
$Insert COMPANY_EQUATES
|
||||
$Insert RETURN_TO_FAB_LOTS_EQUATES
|
||||
$INSERT PROD_SPEC_EQUATES
|
||||
$INSERT WO_STEP_EQUATES
|
||||
$INSERT EPI_PART_EQUATES
|
||||
$INSERT CUST_EPI_PART_EQUATES
|
||||
$INSERT PRS_STAGE_EQUATES
|
||||
$insert UNIT_EQUATES
|
||||
|
||||
Declare function Database_Services, SRP_JSON, Error_Services, Clean_Insp_Services, WO_Mat_QA_Services
|
||||
Declare function PSN_Services, SRP_Rotate_Array, Datetime, Return_To_Fab_Services, Environment_Services
|
||||
Declare function Logging_Services
|
||||
Declare subroutine Database_Services, SRP_JSON, Error_Services, Extract_Si_Keys, Set_Status, obj_wo_mat_log
|
||||
Declare subroutine Logging_Services
|
||||
Declare subroutine Logging_Services, Btree.Extract
|
||||
|
||||
GoToService
|
||||
GoToService else
|
||||
Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
|
||||
end
|
||||
|
||||
Return Response or ""
|
||||
Return Response else ''
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// SERVICES
|
||||
//-----------------------------------------------------------------------------
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Services
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
@ -645,3 +653,299 @@ Service VerifyWOMatWMOKeyIndex(WMOKey)
|
||||
|
||||
end service
|
||||
|
||||
Service GetWMOutKeys(WOLogId)
|
||||
|
||||
ErrorMsg = ''
|
||||
WMOutKeys = ''
|
||||
|
||||
If WOLogId NE '' then
|
||||
Open 'DICT.WM_OUT' to hWmOutDict then
|
||||
SearchString = ''
|
||||
SearchString := 'WO_NO':@VM:WOLogId:@FM
|
||||
Btree.Extract(SearchString, 'WM_OUT', hWmOutDict, WMOutKeys, 0, 0)
|
||||
end else
|
||||
ErrorMsg = 'Error opening WM_OUT dictionary.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'WOLogId was null'
|
||||
end
|
||||
|
||||
If ErrorMsg NE '' then
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
Response = WMOutKeys
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service GetWmOutZpl(WmOutKey)
|
||||
|
||||
ZPL = ''
|
||||
ErrorMsg = ''
|
||||
If WmOutKey NE '' then
|
||||
Swap '-' with '*' in WmOutKey
|
||||
Swap '.' with '*' in WmOutKey
|
||||
If RowExists('WM_OUT', WmOutKey) then
|
||||
WONo = Field(WmOutKey, '*', 1, 1)
|
||||
WOStep = Field(WmOutKey, '*', 2, 1)
|
||||
WOStepKeys = XLATE('WO_LOG', WONo, WO_LOG_WO_STEP_KEY$, 'X')
|
||||
IF INDEX(WOStepKeys,@VM,1) THEN
|
||||
PrintWONo = WONo:'.':WOStep
|
||||
END ELSE
|
||||
PrintWONo = WONo
|
||||
END
|
||||
WORec = XLATE('WO_LOG',WONo,'','X')
|
||||
ReqShipDate = OCONV(WORec<WO_LOG_PROMISE_SHIP_DT$>,'D2/')
|
||||
CustNo = WORec<WO_LOG_CUST_NO$>
|
||||
CustName = XLATE('COMPANY',CustNo,'ABBREV_OR_CO_NAME','X')
|
||||
Captive = XLATE('COMPANY',CustNo,'CAPTIVE','X')
|
||||
PONo = WORec<WO_LOG_CUST_PO_NO$>
|
||||
PSNo = XLATE('WO_STEP',WONo:'*':WOStep,WO_STEP_PROD_SPEC_ID$,'X')
|
||||
PSRec = XLATE('PROD_SPEC',PSNo,'','X')
|
||||
|
||||
CustSpecNo = ''
|
||||
IF Captive THEN
|
||||
CustSpecNos = PSRec<PROD_SPEC_SPEC_NUM$>
|
||||
CustSpecDescs = PSRec<PROD_SPEC_SPEC_DESC$>
|
||||
CustSpecRevNos = PSRec<PROD_SPEC_REV_NUM$>
|
||||
CustSpecRevDts = PSRec<PROD_SPEC_REV_DATE$>
|
||||
SpecCnt = COUNT(CustSpecNos,@VM) + (CustSpecNos NE '')
|
||||
FOR I = 1 TO SpecCnt
|
||||
IF CustSpecDescs<1,I> _EQC 'GENERAL' THEN
|
||||
CustSpecNo = CustSpecNos<1,I>
|
||||
CustSpecDesc = CustSpecDescS<1,I>
|
||||
CustSpecRevNo = CustSpecRevNos<1,I>
|
||||
CustSpecRevDt = OCONV(CustSpecRevDts<1,I>,'D4/')
|
||||
END
|
||||
UNTIL CustSpecNo NE ''
|
||||
NEXT I
|
||||
END
|
||||
|
||||
EpiPartNo = WORec<WO_LOG_EPI_PART_NO$>
|
||||
CustEpiPartRec = XLATE('CUST_EPI_PART',CustNo:'*':EpiPartNo,'','X')
|
||||
ShipBagReq = CustEpiPartRec<CUST_EPI_PART_SHIP_BAG_REQ$>
|
||||
PreSurfscan = XLATE('PRS_STAGE',PSNo:'*PRE',PRS_STAGE_SURFSCAN_SIG_REQ$,'X')
|
||||
FirstSurfscan = XLATE('PRS_STAGE',PSNo:'*WFR',PRS_STAGE_SURFSCAN_SIG_REQ$,'X')
|
||||
PostCleanSurfScan = XLATE('PRS_STAGE',PSNo:'*POST',PRS_STAGE_SURFSCAN_SIG_REQ$,'X')
|
||||
PostCleanSSSampleQty = XLATE('PRS_STAGE',PSNo:'*POST',PRS_STAGE_SS_SAMP_QTY$, 'X' )
|
||||
PostCleanSurfscanRecipe = XLATE('PRS_STAGE',PSNo:'*POST',PRS_STAGE_SURFSCAN_RECIPE$,'X')
|
||||
PostCleanSurfDefects = XLATE('PRS_STAGE',PSNo:'*POST',PRS_STAGE_SURF_DEFECTS$,'X')
|
||||
PostCleanSurfHaze = OCONV(XLATE('PRS_STAGE',PSNo:'*POST',PRS_STAGE_SURF_HAZE$,'X'),'MD2')
|
||||
SubPreClean = XLATE('PRS_STAGE',PSNo:'*PRE','TOOL_DISPLAY','X')
|
||||
SubPostClean = XLATE('PRS_STAGE',PSNo:'*POST','TOOL_DISPLAY','X')
|
||||
PreCleanTool = XLATE('PRS_STAGE',PSNo:'*PRE','TOOL_DISPLAY','X')
|
||||
PostCleanTool = XLATE('PRS_STAGE',PSNo:'*POST','TOOL_DISPLAY','X')
|
||||
PreAkrionRecipe = XLATE('PRS_STAGE',PSNo:'*PRE',PRS_STAGE_CLEAN_RECIPE$,'X')
|
||||
PostAkrionRecipe = XLATE('PRS_STAGE',PSNo:'*POST',PRS_STAGE_CLEAN_RECIPE$,'X')
|
||||
* * * * * * * * Following needs update to point to the PRS_LAYER & PRS_STAGE tables as required.
|
||||
* * * * * * * * It's the required part that needs sorted out JCH 1/28/2014
|
||||
RecipeNo = XLATE( 'PROD_SPEC', PSNo, 'RECIPE_NO_L1', 'X' )
|
||||
RecipeName = XLATE( 'PROD_SPEC', PSNo, 'RECIPE_NAME_L1', 'X' )
|
||||
SpecType = OCONV( XLATE( 'PROD_SPEC', PSNo, 'SPEC_TYPE', 'X' ), '[SPEC_TYPE_CONV]' )
|
||||
SubOxide = OCONV( XLATE( 'PROD_SPEC', PSNo, 'SUB_OXIDE_STRIP', 'X' ), 'B' )
|
||||
ThickTarget = OCONV( XLATE( 'PROD_SPEC', PSNo, 'THICK_TARGET_ALL', 'X' ), 'MD3' )
|
||||
ResTarget = OCONV( XLATE( 'PROD_SPEC', PSNo, 'RES_TARGET_ALL', 'X' ), 'MD3' )
|
||||
ThickUnit = XLATE( 'PROD_SPEC', PSNo, 'THICK_UNITS_ALL', 'X' )
|
||||
ResUnit = XLATE( 'PROD_SPEC', PSNo , 'RES_UNITS_ALL', 'X' )
|
||||
Dopant = XLATE( 'PROD_SPEC', PSNo, 'DOPANT_L1', 'X' )
|
||||
RecipeNo = XLATE( 'PROD_SPEC', PSNo, 'RECIPE_NO', 'X' )
|
||||
RecipeInfo = XLATE( 'RECIPE', RecipeNo, 'RECIPE_NAME_NO', 'X' )
|
||||
CleaningReqs = ''
|
||||
|
||||
ThickCnt = FIELDCOUNT( ThickTarget<1>, @VM )
|
||||
PrintThickTargets = ''
|
||||
FOR J = 1 TO ThickCnt
|
||||
PrintThickTargets<1,J> = ThickTarget<1,J>:ThickUnit<1,J>
|
||||
NEXT J
|
||||
|
||||
ResCnt = FIELDCOUNT( ResTarget<1>, @VM )
|
||||
PrintResTargets = ''
|
||||
FOR J = 1 TO ResCnt
|
||||
IF ResTarget<1,J>[1,1] = '.' THEN
|
||||
TargetVal = '0':ResTarget<1,J>
|
||||
END ELSE
|
||||
TargetVal = ResTarget<1,J>
|
||||
END
|
||||
PrintResTargets<1,J> = TargetVal:ResUnit<1,J>
|
||||
NEXT J
|
||||
|
||||
APreRec = ''
|
||||
APostRec = ''
|
||||
IF ( PreAkrionRecipe<1> <> '' ) THEN
|
||||
APreRec = ' ':PreAkrionRecipe:' '
|
||||
SubOxide = 'No' ;* If Akrion then no oxide strip
|
||||
END
|
||||
|
||||
IF ( PostAkrionRecipe<1> <> '' ) THEN
|
||||
APostRec = ' ':PostAkrionRecipe
|
||||
END
|
||||
|
||||
PrintCleaningReqs = TRIM( 'Strip:':SubOxide:' Pre:':SubPreClean:APreRec:' Post:':SubPostClean:APostRec )
|
||||
|
||||
swap UNIT_MICROMETER$ with 'um' in PrintThickTargets
|
||||
swap UNIT_OHM_CM$ with 'ohm.cm' in PrintThickTargets
|
||||
swap UNIT_OHM_PER_SQ$ with 'ohm/sq' in PrintThickTargets
|
||||
swap UNIT_A$ with 'A' in PrintThickTargets
|
||||
|
||||
swap UNIT_MICROMETER$ with 'um' in PrintResTargets
|
||||
swap UNIT_OHM_CM$ with 'ohm.cm' in PrintResTargets
|
||||
swap UNIT_OHM_PER_SQ$ with 'ohm/sq' in PrintResTargets
|
||||
swap UNIT_A$ with 'A' in PrintResTargets
|
||||
|
||||
MakeupBox = XLATE('WM_OUT',WMOutKey,WM_OUT_MAKEUP_BOX$ ,'X')
|
||||
|
||||
PrintWMOutKey = WMOutKey
|
||||
CONVERT '*' TO '.' IN PrintWMOutKey
|
||||
|
||||
CassNo = FIELD(WMOutKey,'*',3)
|
||||
LotNo = 'Multiple'
|
||||
WfrQty = XLATE('WM_OUT',WMOutKey,'WFRS_SCHED','X')
|
||||
SubPartNo = WORec<WO_LOG_ORD_SUB_PART_NO$>
|
||||
CustPartNo = WORec<WO_LOG_CUST_PART_NO$>
|
||||
EpiPartNo = WORec<WO_LOG_EPI_PART_NO$>
|
||||
CustPartDesc = XLATE('EPI_PART',EpiPartNo,EPI_PART_EPI_PART_DESC$,'X')
|
||||
PartNo = CustPartNo ;* Temporary for 4x2 to 4x4 conversion
|
||||
PartDesc = CustPartDesc ;* Temporary for 4x2 to 4x4 conversion
|
||||
SubVendCode = WORec<WO_LOG_EXP_VEND_CD$>
|
||||
Vendor = XLATE('SEMI_VEND_CODE', SubVendCode, 'EPI_VEND_CD', 'X')
|
||||
|
||||
SuppCd = TRIM(SubPartNo[-1,'B-'])
|
||||
IF LEN(SuppCd) NE '2' THEN SuppCd =''
|
||||
|
||||
For cnt = 1 to 2
|
||||
***** Start of label ZPL
|
||||
ZPL := '^XA'
|
||||
***** Label setup
|
||||
ZPL := '^LH0,0'
|
||||
ZPL := '^PR2' ;* Print speed 2 inches per second
|
||||
ZPL := '^LL406' ;* Label length 203 dpi
|
||||
ZPL := '^PW900' ;* Print width 900 dpi
|
||||
ZPL := '^MD2' ;* Media darkness
|
||||
ZPL := '^MMT':CRLF$ ;* Media mode t=tear off mode
|
||||
***** Border
|
||||
ZPL := '^FO10,5^GB795,398,3,B^FS':CRLF$
|
||||
****** First Line
|
||||
Company = 'IFX Epi Services'
|
||||
ZPL := '^FO30,20^A0,45,36^FD':Company:'^FS':CRLF$
|
||||
ZPL := '^FO290,25^AC,18^FDWO No:^FS':CRLF$
|
||||
ZPL := '^FO370,20^A045,36^FD':PrintWONo:'^FS':CRLF$
|
||||
IF CassNo = 1 THEN
|
||||
ZPL := '^FO535,15^GB120,40,40,,3^FS':CRLF$
|
||||
ZPL := '^FO540,25^AC,18^FR^FDCass:^FS':CRLF$
|
||||
ZPL := '^FO600,20^A045,36^FR^FD':CassNo:'^FS':CRLF$
|
||||
END ELSE
|
||||
ZPL := '^FO540,25^AC,18^FDCass:^FS':CRLF$
|
||||
ZPL := '^FO600,20^A045,36^FD':CassNo:'^FS':CRLF$
|
||||
END
|
||||
ZPL:= '^FO665,20^A045,36^FDWM Out^FS':CRLF$
|
||||
****** Second Line
|
||||
ZPL:= '^FO30,70^AC,18^FDWM Out:^FS':CRLF$
|
||||
ZPL:= '^FO120,65^A050,30^FD':PrintWMOutKey:'^FS':CRLF$
|
||||
ZPL := '^BY2,2.0':CRLF$
|
||||
ZPL := '^FO300,58^B3,,37,N^FD':'O':PrintWMOutKey:'^FS':CRLF$
|
||||
ZPL := '^BY2,3.0':CRLF$
|
||||
ZPL:= '^FO700,60^AC,18^FDQty:^FS':CRLF$
|
||||
ZPL:= '^FO760,60^A045,25^FD':WfrQty:'^FS':CRLF$
|
||||
****** Third Line
|
||||
ZPL:= '^FO30,100^AC,18^FDShip Dt:^FS':CRLF$
|
||||
ZPL:= '^FO140,100^A0,,25^FD':ReqShipDate:'^FS':CRLF$
|
||||
ZPL:= '^FO250,100^AC,18^FDCust:^FS':CRLF$
|
||||
ZPL:= '^FO320,100^A045,25^FD':CustName:'^FS':CRLF$
|
||||
ZPL:= '^FO560,100^AC,18^FDPO:^FS':CRLF$
|
||||
ZPL:= '^FO600,100^A045,25^FD':PONo:'^FS':CRLF$
|
||||
****** Separator bar
|
||||
ZPL:= '^FO15,125^GB790,1^FS':CRLF$
|
||||
****** Fourth Line
|
||||
ZPL := '^FO30,130^AC,18^FDLot No:^FS':CRLF$
|
||||
ZPL := '^FO120,130^A0,20^FD':LotNo:'^FS':CRLF$
|
||||
ZPL := '^FO410,130^AC,18^FDPart No:^FS':CRLF$
|
||||
ZPL := '^FO510,130^A0,20^FD':PartNo:'^FS':CRLF$
|
||||
****** Fifth Line
|
||||
ZPL := '^FO30,155^AC,18^FDSub PN:^FS':CRLF$
|
||||
ZPL := '^FO120,155^A0,20^FD':SubPartNo:'^FS':CRLF$
|
||||
IF SuppCd NE '' THEN
|
||||
ZPL := '^FO410,155^AC,18^FDSupp Cd:^FS':CRLF$
|
||||
ZPL := '^FO510,155^A0,20^FD':SuppCd:'^FS':CRLF$
|
||||
ZPL := '^BY2,2.0':CRLF$
|
||||
ZPL := '^FO610,155^A040,20^B3,,23,N^FD':SuppCd:'^FS':CRLF$
|
||||
ZPL := '^BY2,3.0':CRLF$
|
||||
END
|
||||
****** Separator bar
|
||||
ZPL := '^FO15,180^GB790,1^FS':CRLF$
|
||||
IF MakeupBox THEN
|
||||
ZPL := '^FO410,190^A050,30^FD* * * M a k e u p B o x * * *^FS':CRLF$
|
||||
END ELSE
|
||||
ZPL := '^FO410,190^AC,18^FDReact Type:^FS':CRLF$
|
||||
ZPL := '^FO560,190^A0,20^FDEpiPro^FS':CRLF$
|
||||
END
|
||||
****** Seventh Line
|
||||
ZPL := '^FO30,190^AC,18^FDPre:^FS':CRLF$
|
||||
ZPL := '^FO90,190^A0,20^FD':SubPreClean:'^FS':CRLF$
|
||||
IF PreAkrionRecipe NE '' THEN
|
||||
ZPL := '^FO210,190^AC,18^FDAkrion:^FS':CRLF$
|
||||
ZPL := '^FO300,190^A0,20^FD':PreAkrionRecipe:'^FS':CRLF$
|
||||
ZPL := '^BY2,2.0':CRLF$
|
||||
ZPL := '^FO450,190^A040,20^B3,,23,N^FD':PreAkrionRecipe:'^FS':CRLF$
|
||||
ZPL := '^BY2,3.0':CRLF$
|
||||
END
|
||||
****** Eighth Line
|
||||
ZPL := '^FO30,225^AC,18^FDRecipe:^FS':CRLF$
|
||||
ZPL := '^FO120,225^A0,20^FD':RecipeInfo:'^FS':CRLF$
|
||||
ZPL := '^FO410,225^AC,18^FDEpi Dopant:^FS':CRLF$
|
||||
ZPL := '^FO560,225^A040,20^FD':Dopant:'^FS':CRLF$
|
||||
****** Ninth, Tenth and Eleventh Lines
|
||||
ZPL := '^FO30,260^AC,18^FDThk Spec:^FS':CRLF$
|
||||
FOR M = 1 TO COUNT(PrintThickTargets,@VM) + (PrintThickTargets NE '')
|
||||
BaseLine = 260 + (M-1)*20
|
||||
ZPL := '^FO140,':BaseLine:'^A040,20^FD':PrintThickTargets<1,M>:'^FS':CRLF$
|
||||
NEXT M
|
||||
ZPL := '^FO410,260^AC,18^FDRes Spec:^FS':CRLF$
|
||||
FOR M = 1 TO COUNT(PrintResTargets,@VM) + (PrintResTargets NE '')
|
||||
BaseLine = 260 + (M-1)*20
|
||||
ZPL := '^FO520,':BaseLine:'^A040,20^FD':PrintResTargets<1,M>:'^FS':CRLF$
|
||||
NEXT M
|
||||
IF PostAkrionRecipe NE '' THEN
|
||||
ZPL := '^FO30,335^AC,18^FDPost:^FS':CRLF$
|
||||
ZPL := '^FO90,335^A0,20^FD':SubPostClean:'^FS':CRLF$
|
||||
ZPL := '^FO210,335^AC,18^FDAkrion:^FS':CRLF$
|
||||
ZPL := '^FO300,335^A0,20^FD':PostAkrionRecipe:'^FS':CRLF$
|
||||
ZPL := '^BY2,2.0':CRLF$
|
||||
ZPL := '^FO450,335^A040,20^B3,,23,N^FD':PostAkrionRecipe:'^FS':CRLF$
|
||||
ZPL := '^BY2,3.0':CRLF$
|
||||
END ELSE
|
||||
ZPL := '^FO30,335^AC,18^FDPost:^FS':CRLF$
|
||||
ZPL := '^FO120,335^A0,20^FD':SubPostClean:'^FS':CRLF$
|
||||
END
|
||||
****** Separator bar
|
||||
ZPL := '^FO15,365^GB790,1^FS':CRLF$
|
||||
****** Data Matrix barcode
|
||||
ZPL := '^FO720,280^CI28':CRLF$
|
||||
ZPL := '^BXN,2,200^FDP':PartNo:'|S':SubPartNo:'|1T':PrintWMOutKey:'|2T':LotNo:'|':PSNo:'|Q':WfrQty:'|1V':Vendor:'|SEQ':Cnt:'^FS':CRLF$
|
||||
****** Fourteenth Line
|
||||
ZPL := '^FO30,375^AC,18^FDProd Spec No:^FS':CRLF$
|
||||
ZPL := '^FO190,375^A0,25^FD':PSNo:'^FS':CRLF$
|
||||
IF SpecType = 'Production' THEN SpecType = 'Prod'
|
||||
IF SpecType = 'Pre-Production' THEN SpecType = 'Pre'
|
||||
ZPL := '^FO275,375^AC,18^FDSpec Type:^FS':CRLF$
|
||||
ZPL := '^FO400,375^A0,25^FD':SpecType:'^FS':CRLF$
|
||||
ZPL := '^FO480,375^AC,18^FDBag:^FS':CRLF$
|
||||
ZPL := '^FO530,375^A0,20^FD':ShipBagReq:'^FS':CRLF$
|
||||
***** End of Label
|
||||
ZPL := '^XZ'
|
||||
Next
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. WM_OUT ':WmOutKey:' does not exist.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Null WmOutKey passed in.'
|
||||
end
|
||||
|
||||
If ErrorMsg EQ '' then
|
||||
Response = ZPL
|
||||
end else
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
@ -51,17 +51,18 @@ $Insert IFX_EQUATES
|
||||
$Insert CUST_EPI_PART_EQUATES
|
||||
|
||||
Equ MAX_NUM_CASS$ to 150
|
||||
Equ NUM_ATTEMPTS$ to 10
|
||||
|
||||
Declare subroutine Error_Services, Work_Order_Services, Memory_Services, RList, Database_Services, SRP_JSON
|
||||
Declare subroutine Btree.Extract, Set_Status, obj_WO_Log, obj_Notes, Print_Wo_Mat_In_Labels, Print_Wo_Mat_Out_Labels
|
||||
Declare subroutine Print_Wmi_Labels, Print_Wmo_Labels, ErrMsg, Print_Cass_Labels, Logging_Services, Service_Services
|
||||
Declare subroutine obj_WO_Mat_Log, WO_Mat_Services, Work_Order_Services, Transaction_Services, Extract_Si_Keys
|
||||
Declare subroutine Mona_Services, Lot_Event_Services, RDS_Services, Lot_Services, WM_In_Services, WM_Out_Services
|
||||
Declare subroutine obj_WO_Mat, obj_Post_Log
|
||||
Declare subroutine obj_WO_Mat, obj_Post_Log, Delay
|
||||
Declare function SRP_Array, Work_Order_Services, Memory_Services, Database_Services, SRP_Sort_Array, SRP_JSON
|
||||
Declare function Company_Services, obj_Prod_Spec, Schedule_Services, obj_WO_Log, obj_WO_Step, Memberof, Datetime
|
||||
Declare function Environment_Services, Logging_Services, Hold_Services, Signature_Services, Lot_Services
|
||||
Declare function SRP_Datetime, RTI_CreateGUID, RDS_Services, UCase
|
||||
Declare function SRP_Datetime, RTI_CreateGUID, RDS_Services, UCase, Date_Services
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
@ -1140,6 +1141,86 @@ Service UpdateReleasedQty(WONo)
|
||||
end service
|
||||
|
||||
|
||||
Service AdjustReleasedQty(WONo, AdjustQty)
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
LogTime = Oconv(Time(), 'MTS')
|
||||
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Adjust Released Qty Log.csv'
|
||||
Headers = 'Logging DTM' : @FM : 'WONo' : @FM : 'Notes'
|
||||
objAdjRelLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$,',', Headers, '', False$, False$)
|
||||
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
||||
OrigRelQty = ''
|
||||
RelQty = ''
|
||||
UnrelQty = ''
|
||||
ErrorMsg = ''
|
||||
Begin Case
|
||||
Case (WONo EQ '')
|
||||
ErrorMsg = 'Error in ':Service:' service. Null WONo passed into service'
|
||||
Case (AdjustQty EQ '')
|
||||
ErrorMsg = 'Error in ':Service:' service. Null AdjustQty passed into service'
|
||||
Case Not(Num(AdjustQty))
|
||||
ErrorMsg = 'Error in ':Service:' service. AdjustQty is not a number'
|
||||
Case Index(AdjustQty, '.', 1)
|
||||
ErrorMsg = 'Error in ':Service:' service. AdjustQty cannot be a decimal value'
|
||||
Case Otherwise$
|
||||
Null
|
||||
End Case
|
||||
If (ErrorMsg EQ '' ) then
|
||||
If RowExists('WO_LOG', WONo) then
|
||||
For Attempt = 1 to NUM_ATTEMPTS$
|
||||
If Attempt GT 0 then Delay(Attempt)
|
||||
HaveLock = Database_Services('GetKeyIDLock', 'WO_LOG', WONo, True$)
|
||||
If HaveLock then
|
||||
WORec = Database_Services('ReadDataRow', 'WO_LOG', WONo)
|
||||
If Error_Services('NoError') then
|
||||
WOQty = WORec<WO_LOG_WO_QTY$>
|
||||
OrigRelQty = WORec<WO_LOG_REL_QTY_STATIC$>
|
||||
RelQty = OrigRelQty + AdjustQty
|
||||
UnrelQty = WOQty - RelQty
|
||||
If UnrelQty LT 0 then UnrelQty = 0
|
||||
WORec<WO_LOG_REL_QTY_STATIC$> = RelQty
|
||||
WORec<WO_LOG_UNREL_QTY_STATIC$> = UnRelQty
|
||||
Database_Services('WriteDataRow', 'WO_LOG', WONo, WORec, True$, False$, False$)
|
||||
If Error_Services('HasError') then
|
||||
ErrorMsg = 'Error in ':Service:' service. Failed to write ':RelQty:' on REL_QTY_STATIC '
|
||||
ErrorMsg := 'field and ':UnrelQty:' on UNREL_QTY_STATIC field of WO_LOG record ':WONo:'.'
|
||||
ErrorMsg := 'Error message: ':Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Failed to read record ':WONo:' from the WO_LOG table. '
|
||||
ErrorMsg := 'Error message: ':Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
If ( Not(HaveLock) and (Attempt GE NUM_ATTEMPTS$) ) then
|
||||
ErrorMsg = 'Error in ':Service:' service. Failed to lock WO_LOG ':WoNo:' for update after ':Attempt:' attempts.'
|
||||
end
|
||||
Until HaveLock or (ErrorMsg NE '')
|
||||
Next Attempt
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. ':WONo:' does not exist in the WO_LOG table.'
|
||||
end
|
||||
end
|
||||
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDtm
|
||||
LogData<2> = WONo
|
||||
If ErrorMsg EQ '' then
|
||||
LogResult = 'Successfully adjusted WO_LOG ':WONo:' released and unreleased quantities by ':AdjustQty
|
||||
LogResult := '. Updated WO_LOG record ':WONo:' field REL_QTY_STATIC with released quantity ':RelQty
|
||||
LogResult := ' and field UNREL_QTY_STATIC with unreleased quantity ':UnRelQty:'.'
|
||||
LogData<3> = LogResult
|
||||
Logging_Services('AppendLog', objAdjRelLog, LogData, @RM, @FM)
|
||||
end else
|
||||
LogResult = 'Failed to adjust WO_LOG ':WONo:' released and unreleased quantities by ':AdjustQty:'.'
|
||||
LogData<3> = LogResult
|
||||
Logging_Services('AppendLog', objAdjRelLog, LogData, @RM, @FM)
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service UpdateReceivedQty(WONo)
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
|
||||
@ -1155,8 +1236,10 @@ Service UpdateReceivedQty(WONo)
|
||||
If WONo NE '' then
|
||||
If RowExists('WO_LOG', WONo) then
|
||||
WORec = Database_Services('ReadDataRow', 'WO_LOG', WONo)
|
||||
If Error_Services('NoError') then
|
||||
RXQty = obj_WO_Log('RxQty', WONo:@RM:WORec)
|
||||
If Error_Services('NoError') then
|
||||
WOQty = WORec<WO_LOG_WO_QTY$>
|
||||
RXQty = obj_WO_Log('RxQty', WONo:@RM:WORec)
|
||||
OpenQty = WOQty - RXQty
|
||||
Open 'WO_LOG' to hTable then
|
||||
ReadV OrigRXQty from hTable, WONo, WO_LOG_RX_QTY_STATIC$ then
|
||||
If OrigRXQty NE RXQty then
|
||||
@ -1169,6 +1252,19 @@ Service UpdateReceivedQty(WONo)
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error reading RX_QTY_STATIC column from WO_LOG ':WONo:'.'
|
||||
end
|
||||
If ErrorMsg EQ '' then
|
||||
ReadV OrigOpenQty from hTable, WONo, WO_LOG_OPEN_QTY_STATIC$ then
|
||||
If OrigOpenQty NE OpenQty then
|
||||
WriteV OpenQty on hTable, WONo, WO_LOG_OPEN_QTY_STATIC$ else
|
||||
ErrorMsg = 'Error in ':Service:' service. Failed to write received quantity ':RXQty
|
||||
ErrorMsg := ' to the OPEN_QTY_STATIC field of WO_LOG record ':WONo:'.'
|
||||
ErrorMsg := '@FILE_ERROR: ':@FILE_ERROR
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error reading OPEN_QTY_STATIC column from WO_LOG ':WONo:'.'
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Failed to open the WO_LOG table.'
|
||||
end
|
||||
@ -1200,6 +1296,84 @@ Service UpdateReceivedQty(WONo)
|
||||
end service
|
||||
|
||||
|
||||
Service AdjustReceivedQty(WONo, AdjustQty)
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
LogTime = Oconv(Time(), 'MTS')
|
||||
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Adjust Received Qty Log.csv'
|
||||
Headers = 'Logging DTM' : @FM : 'WONo' : @FM : 'Notes'
|
||||
objAdjRecLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$,',', Headers, '', False$, False$)
|
||||
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
||||
RXQty = ''
|
||||
OrigRXQty = ''
|
||||
ErrorMsg = ''
|
||||
Begin Case
|
||||
Case (WONo EQ '')
|
||||
ErrorMsg = 'Error in ':Service:' service. Null WONo passed into service'
|
||||
Case (AdjustQty EQ '')
|
||||
ErrorMsg = 'Error in ':Service:' service. Null AdjustQty passed into service'
|
||||
Case Not(Num(AdjustQty))
|
||||
ErrorMsg = 'Error in ':Service:' service. AdjustQty is not a number'
|
||||
Case Index(AdjustQty, '.', 1)
|
||||
ErrorMsg = 'Error in ':Service:' service. AdjustQty cannot be a decimal value'
|
||||
Case Otherwise$
|
||||
Null
|
||||
End Case
|
||||
If (ErrorMsg EQ '' ) then
|
||||
If RowExists('WO_LOG', WONo) then
|
||||
For Attempt = 1 to NUM_ATTEMPTS$
|
||||
If Attempt GT 0 then Delay(Attempt)
|
||||
HaveLock = Database_Services('GetKeyIDLock', 'WO_LOG', WONo, True$)
|
||||
If HaveLock then
|
||||
WORec = Database_Services('ReadDataRow', 'WO_LOG', WONo)
|
||||
If Error_Services('NoError') then
|
||||
WOQty = WORec<WO_LOG_WO_QTY$>
|
||||
OrigRxQty = WORec<WO_LOG_RX_QTY_STATIC$>
|
||||
RxQty = OrigRxQty + AdjustQty
|
||||
OpenQty = WOQty - RXQty
|
||||
WORec<WO_LOG_RX_QTY_STATIC$> = RxQty
|
||||
WORec<WO_LOG_OPEN_QTY_STATIC$> = OpenQty
|
||||
Database_Services('WriteDataRow', 'WO_LOG', WONo, WORec, True$, False$, False$)
|
||||
If Error_Services('HasError') then
|
||||
ErrorMsg = 'Error in ':Service:' service. Failed to write ':RxQty:' on RX_QTY_STATIC field '
|
||||
ErrorMsg := 'and ':OpenQty:' on OPEN_QTY_STATIC to WO_LOG ':WONo:'. Error message: '
|
||||
ErrorMsg := Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Failed to read record ':WONo:' from the WO_LOG table. '
|
||||
ErrorMsg := 'Error message: ':Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
If ( Not(HaveLock) and (Attempt GE NUM_ATTEMPTS$) ) then
|
||||
ErrorMsg = 'Error in ':Service:' service. Failed to lock WO_LOG ':WoNo:' for update after ':Attempt:' attempts.'
|
||||
end
|
||||
Until HaveLock or (ErrorMsg NE '')
|
||||
Next Attempt
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. ':WONo:' does not exist in the WO_LOG table.'
|
||||
end
|
||||
end
|
||||
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDtm
|
||||
LogData<2> = WONo
|
||||
If ErrorMsg EQ '' then
|
||||
LogResult = 'Successfully adjusted WO_LOG ':WONo:' received and open quantities by ':AdjustQty
|
||||
LogResult := '. Updated WO_LOG record ':WONo:' field RX_QTY_STATIC with received quantity ':RXQty
|
||||
LogResult := ' and field OPEN_QTY_STATIC with open quantity ':OpenQty:'.'
|
||||
LogData<3> = LogResult
|
||||
Logging_Services('AppendLog', objAdjRecLog, LogData, @RM, @FM)
|
||||
end else
|
||||
LogResult = 'Failed to adjust WO_LOG ':WONo:' received and open quantities by ':AdjustQty
|
||||
LogData<3> = LogResult
|
||||
Logging_Services('AppendLog', objAdjRecLog, LogData, @RM, @FM)
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service UpdateShippedQty(WONo)
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
|
||||
@ -1331,83 +1505,124 @@ end service
|
||||
|
||||
Service ConvertRecordToJSON(WONo, Record, ItemURL)
|
||||
|
||||
jsonRecord = ''
|
||||
ErrorMsg = ''
|
||||
jsonRecord = ''
|
||||
IF WONo NE '' then
|
||||
If Record EQ '' then Record = Database_Services('ReadDataRow', 'WO_LOG', WONo)
|
||||
If Error_Services('NoError') then
|
||||
@DICT = Database_Services('GetTableHandle', 'DICT.WO_LOG')
|
||||
@ID = WONo
|
||||
@RECORD = Record
|
||||
objJSON = ''
|
||||
If SRP_JSON(objJSON, 'New', 'Object') then
|
||||
objWOLog = ''
|
||||
If SRP_JSON(objWOLog, 'New', 'Object') then
|
||||
SRP_JSON(objWOLog, 'SetValue', 'KeyId', @ID)
|
||||
SRP_JSON(objWOLog, 'SetValue', 'ProdOrdNo', {PROD_ORD_NO})
|
||||
SRP_JSON(objWOLog, 'SetValue', 'PSN', {PROD_SPEC_ID})
|
||||
SRP_JSON(objWOLog, 'SetValue', 'EpiPartNo', {EPI_PART_NO})
|
||||
SRP_JSON(objWOLog, 'SetValue', 'HOT_FLAG', {HOT_FLAG})
|
||||
//Create a list of cassettes
|
||||
CassIDs = {WO_MAT_KEY}
|
||||
objChildCassettes = ''
|
||||
If SRP_JSON(objChildCassettes, 'New', 'Array') then
|
||||
If CassIDs NE '' then
|
||||
for each Cass in CassIDs using @VM setting vPos
|
||||
SAPBatchNo = XLATE('WO_MAT', Cass, WO_MAT_SAP_BATCH_NO$, 'X')
|
||||
SAPTXDtm = XLATE('WO_MAT', Cass, WO_MAT_SAP_TX_DTM$, 'X')
|
||||
RDSNo = XLATE('WO_MAT', Cass, WO_MAT_RDS_NO$, 'X')
|
||||
ShipNo = XLATE('WO_MAT', Cass, WO_MAT_SHIP_NO$, 'X')
|
||||
//Add in each indv. cassette object
|
||||
objChildCassette = ''
|
||||
If SRP_JSON(objChildCassette, 'New', 'Object') then
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'KeyId', Cass)
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'SAPBatchNo', SAPBatchNo)
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'SAPTXDtm', OCONV(SAPTXDtm, 'DT'))
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'RDSNo', RDSNo)
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'ShipNo', ShipNo)
|
||||
SRP_JSON(objChildCassettes, 'Add', objChildCassette)
|
||||
SRP_JSON(objChildCassette, 'Release')
|
||||
end
|
||||
|
||||
Next Cass
|
||||
end else
|
||||
SRP_JSON(objWOLog, 'SetValue', 'ChildCassettes', '')
|
||||
end
|
||||
SRP_JSON(objWOLog, 'Set', 'ChildCassettes', objChildCassettes)
|
||||
SRP_JSON(objChildCassettes, 'Release')
|
||||
end
|
||||
SRP_JSON(objJSON, 'Set', 'WO_Log', objWOLog)
|
||||
SRP_JSON(objWOLog, 'Release')
|
||||
end
|
||||
If itemURL NE '' then
|
||||
// The itemURL was passed in so add HAL+JSON properties.
|
||||
// Create the _links property and then all link objects needed for this resource.
|
||||
objLinks = ''
|
||||
If SRP_JSON(objLinks, 'New', 'Object') then
|
||||
// Create a self link.
|
||||
objLink = ''
|
||||
If SRP_JSON(objLink, 'New', 'Object') then
|
||||
SRP_JSON(objLink, 'SetValue', 'href', ItemURL, 'String')
|
||||
SRP_JSON(objLink, 'SetValue', 'title', 'Self', 'String')
|
||||
SRP_JSON(objLinks, 'Set', 'self', objLink)
|
||||
SRP_JSON(objLink, 'Release')
|
||||
end
|
||||
SRP_JSON(objJSON, 'Set', '_links', objLinks)
|
||||
SRP_JSON(objLinks, 'Release')
|
||||
end
|
||||
EpiPartNo = Record<WO_LOG_EPI_PART_NO$>
|
||||
EpiPartRec = Database_Services('ReadDataRow', 'EPI_PART', EpiPartNo)
|
||||
If Error_Services('NoError') then
|
||||
SubSuppBy = EpiPartRec<EPI_PART_SUB_SUPP_BY$> ;* L - EpiSvcs supplied, C - Customer Supplied
|
||||
ProdVerNo = Record<WO_LOG_PROD_VER_NO$>
|
||||
ProdVerRec = Database_Services('ReadDataRow', 'PROD_VER', ProdVerNo)
|
||||
If Error_Services('NoError') then
|
||||
SubPartNo = ProdVerRec<PROD_VER_SUB_PART_NO$>
|
||||
// Create the JSON response object
|
||||
objJSON = ''
|
||||
If SRP_JSON(objJSON, 'New', 'Object') then
|
||||
objWOLog = ''
|
||||
If SRP_JSON(objWOLog, 'New', 'Object') then
|
||||
SRP_JSON(objWOLog, 'SetValue', 'KeyId', WONo)
|
||||
SRP_JSON(objWOLog, 'SetValue', 'ProdOrdNo', Record<WO_LOG_PROD_ORD_NO$>)
|
||||
SRP_JSON(objWOLog, 'SetValue', 'PSN', Xlate('WO_LOG', WONo, 'PS_NO', 'X'))
|
||||
SRP_JSON(objWOLog, 'SetValue', 'EpiPartNo', EpiPartNo)
|
||||
SRP_JSON(objWOLog, 'SetValue', 'HotFlag', Record<WO_LOG_HOT_FLAG$>)
|
||||
SRP_JSON(objWOLog, 'SetValue', 'WoQty', Record<WO_LOG_WO_QTY$>)
|
||||
SRP_JSON(objWOLog, 'SetValue', 'RxQty', Record<WO_LOG_RX_QTY_STATIC$>)
|
||||
SRP_JSON(objWOLog, 'SetValue', 'RelQty', Record<WO_LOG_REL_QTY_STATIC$>)
|
||||
SRP_JSON(objWOLog, 'SetValue', 'UnRelQty', Record<WO_LOG_UNREL_QTY_STATIC$>)
|
||||
SRP_JSON(objWOLog, 'SetValue', 'ShipQty', Record<WO_LOG_SHIP_QTY_STATIC$>)
|
||||
SRP_JSON(objWOLog, 'SetValue', 'ScrapQty', Record<WO_LOG_SCRAP_QTY_STATIC$>)
|
||||
SRP_JSON(objWOLog, 'SetValue', 'OpenQty', Record<WO_LOG_OPEN_QTY_STATIC$>)
|
||||
SRP_JSON(objWOLog, 'SetValue', 'CustNo', Record<WO_LOG_CUST_NO$>)
|
||||
SRP_JSON(objWOLog, 'SetValue', 'Customer', Xlate('WO_LOG', WONo, 'CUST_NAME', 'X'))
|
||||
|
||||
// Create the _class property for this resource.
|
||||
SRP_JSON(objJSON, 'SetValue', '_class', 'resource')
|
||||
ExpectedVendorCd = Record<WO_LOG_EXP_VEND_CD$>
|
||||
If ( (Len(ExpectedVendorCd) NE 2) or (SubSuppBy NE 'L') ) then ExpectedVendorCd = ''
|
||||
SRP_JSON(objWOLog, 'SetValue', 'ExpectedVendorCd', ExpectedVendorCd)
|
||||
SRP_JSON(objWOLog, 'SetValue', 'SubPartNo', SubPartNo)
|
||||
|
||||
// Create a list of cassettes
|
||||
CassIDs = Record<WO_LOG_WO_MAT_KEY$>
|
||||
objChildCassettes = ''
|
||||
If SRP_JSON(objChildCassettes, 'New', 'Array') then
|
||||
If CassIDs NE '' then
|
||||
for each Cass in CassIDs using @VM setting vPos
|
||||
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', Cass)
|
||||
If Error_Services('NoError') then
|
||||
// Add in each indv. cassette object
|
||||
objChildCassette = ''
|
||||
If SRP_JSON(objChildCassette, 'New', 'Object') then
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'KeyId', Cass)
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'CassNo', Field(Cass, '*', 2, 1))
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'SAPBatchNo', WOMatRec<WO_MAT_SAP_BATCH_NO$>)
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'SAPTXDtm', Date_Services('ConvertDateTimeToISO8601', WOMatRec<WO_MAT_SAP_TX_DTM$>))
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'RDSNo', WOMatRec<WO_MAT_RDS_NO$>)
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'ShipNo', WOMatRec<WO_MAT_SHIP_NO$>)
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'LotNo', WOMatRec<WO_MAT_LOT_NO$>)
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'Qty', WOMatRec<WO_MAT_WAFER_QTY$>)
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'CustPartNo', WOMatRec<WO_MAT_CUST_PART_NO$>)
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'SubPartNo', WOMatRec<WO_MAT_SUB_PART_NO$>)
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'VendorCd', WOMatRec<WO_MAT_SUB_VEND_CD$>)
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'RecDtm', Date_Services('ConvertDateTimeToISO8601', WOMatRec<WO_MAT_RX_DTM$>))
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'RelDtm', Date_Services('ConvertDateTimeToISO8601', WOMatRec<WO_MAT_REL_DTM$>))
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'RecUser', OConv(WOMatRec<WO_MAT_RX_BY$>, '[XLATE_CONV,LSL_USERS*FIRST_LAST]'))
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'RelUser', OConv(WOMatRec<WO_MAT_REL_BY$>, '[XLATE_CONV,LSL_USERS*FIRST_LAST]' ))
|
||||
SRP_JSON(objChildCassettes, 'Add', objChildCassette)
|
||||
SRP_JSON(objChildCassette, 'Release')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||
end
|
||||
Next Cass
|
||||
end else
|
||||
SRP_JSON(objWOLog, 'SetValue', 'ChildCassettes', '')
|
||||
end
|
||||
SRP_JSON(objWOLog, 'Set', 'ChildCassettes', objChildCassettes)
|
||||
SRP_JSON(objChildCassettes, 'Release')
|
||||
end
|
||||
SRP_JSON(objJSON, 'Set', 'WO_Log', objWOLog)
|
||||
SRP_JSON(objWOLog, 'Release')
|
||||
end
|
||||
If itemURL NE '' then
|
||||
// The itemURL was passed in so add HAL+JSON properties.
|
||||
// Create the _links property and then all link objects needed for this resource.
|
||||
objLinks = ''
|
||||
If SRP_JSON(objLinks, 'New', 'Object') then
|
||||
// Create a self link.
|
||||
objLink = ''
|
||||
If SRP_JSON(objLink, 'New', 'Object') then
|
||||
SRP_JSON(objLink, 'SetValue', 'href', ItemURL, 'String')
|
||||
SRP_JSON(objLink, 'SetValue', 'title', 'Self', 'String')
|
||||
SRP_JSON(objLinks, 'Set', 'self', objLink)
|
||||
SRP_JSON(objLink, 'Release')
|
||||
end
|
||||
SRP_JSON(objJSON, 'Set', '_links', objLinks)
|
||||
SRP_JSON(objLinks, 'Release')
|
||||
end
|
||||
// Create the _class property for this resource.
|
||||
SRP_JSON(objJSON, 'SetValue', '_class', 'resource')
|
||||
end
|
||||
jsonRecord = SRP_JSON(objJSON, 'Stringify', 'Styled')
|
||||
SRP_JSON(objJSON, 'Release')
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Unable to create JSON object'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||
end
|
||||
jsonRecord = SRP_JSON(objJSON, 'Stringify', 'Styled')
|
||||
SRP_JSON(objJSON, 'Release')
|
||||
end else
|
||||
Error_Services('Add', 'Unable to create JSON representation in the ' : Service : ' service.')
|
||||
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'KeyID argument was missing in the ' : Service : ' service.')
|
||||
ErrorMsg = 'Error in ':Service:' service. Null WONo passed into service.'
|
||||
end
|
||||
|
||||
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||
Response = jsonRecord
|
||||
|
||||
end service
|
||||
@ -2128,7 +2343,39 @@ Service UpdateOpenWorkOrderData()
|
||||
LogData<4> = ErrorMsg
|
||||
Logging_Services('AppendLog', objVerifyWOMatKeysLog, LogData, @RM, @FM)
|
||||
MonaStatus = 'critical'
|
||||
end
|
||||
end
|
||||
Work_Order_Services('UpdateReceivedQty', NextOpenWoLogKey)
|
||||
If Error_Services('HasError') then
|
||||
LogData<1> = OConv(Datetime(), 'DT/^S')
|
||||
ErrorMsg = 'Error calling UpdateReceivedQty for WO_LOG ':NextOpenWoLogKey:'. ':Error_Services('GetMessage')
|
||||
LogData<4> = ErrorMsg
|
||||
Logging_Services('AppendLog', objVerifyWOMatKeysLog, LogData, @RM, @FM)
|
||||
MonaStatus = 'critical'
|
||||
end
|
||||
Work_Order_Services('UpdateReleasedQty', NextOpenWoLogKey)
|
||||
If Error_Services('HasError') then
|
||||
LogData<1> = OConv(Datetime(), 'DT/^S')
|
||||
ErrorMsg = 'Error calling UpdateReleasedQty for WO_LOG ':NextOpenWoLogKey:'. ':Error_Services('GetMessage')
|
||||
LogData<4> = ErrorMsg
|
||||
Logging_Services('AppendLog', objVerifyWOMatKeysLog, LogData, @RM, @FM)
|
||||
MonaStatus = 'critical'
|
||||
end
|
||||
Work_Order_Services('UpdateScrappedQty', NextOpenWoLogKey)
|
||||
If Error_Services('HasError') then
|
||||
LogData<1> = OConv(Datetime(), 'DT/^S')
|
||||
ErrorMsg = 'Error calling UpdateScrappedQty for WO_LOG ':NextOpenWoLogKey:'. ':Error_Services('GetMessage')
|
||||
LogData<4> = ErrorMsg
|
||||
Logging_Services('AppendLog', objVerifyWOMatKeysLog, LogData, @RM, @FM)
|
||||
MonaStatus = 'critical'
|
||||
end
|
||||
Work_Order_Services('UpdateShippedQty', NextOpenWoLogKey)
|
||||
If Error_Services('HasError') then
|
||||
LogData<1> = OConv(Datetime(), 'DT/^S')
|
||||
ErrorMsg = 'Error calling UpdateShippedQty for WO_LOG ':NextOpenWoLogKey:'. ':Error_Services('GetMessage')
|
||||
LogData<4> = ErrorMsg
|
||||
Logging_Services('AppendLog', objVerifyWOMatKeysLog, LogData, @RM, @FM)
|
||||
MonaStatus = 'critical'
|
||||
end
|
||||
end
|
||||
end else
|
||||
LogData<1> = OConv(Datetime(), 'DT/^S')
|
||||
@ -2313,6 +2560,107 @@ Service UpdateWorkOrderData(WONo)
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service GetWoLogZpl(WoNo)
|
||||
|
||||
ZPL = ''
|
||||
ErrorMsg = ''
|
||||
If WoNo NE '' then
|
||||
If RowExists('WO_LOG', WoNo) then
|
||||
WOStepKeys = XLATE('WO_LOG',WONo,WO_LOG_WO_STEP_KEY$,'X')
|
||||
IF INDEX(WOStepKeys,@VM,1) THEN
|
||||
PrintWONo = WONo:'.':WOStep
|
||||
END ELSE
|
||||
PrintWONo = WONo
|
||||
END
|
||||
WORec = XLATE('WO_LOG',WONo,'','X')
|
||||
ReqShipDate = OCONV(WORec<WO_LOG_PROMISE_SHIP_DT$>,'D2/')
|
||||
CustNo = WORec<WO_LOG_CUST_NO$>
|
||||
CustName = XLATE('COMPANY',CustNo,'ABBREV_OR_CO_NAME','X')
|
||||
ZPL := '^XA^CFD'
|
||||
ZPL := '^LH0,0'
|
||||
ZPL := '^PR2' ;* Print speed 2 inches per second
|
||||
ZPL := '^LL325' ;* Label length in dots
|
||||
ZPL := '^MD15' ;* Media darkness
|
||||
ZPL := '^PQ2' ;* Print 2 labels for each pass through here
|
||||
ZPL := '^MMT':CRLF$ ;* Media mode t=tear off mode
|
||||
IF INDEX(PrintWONo,'.',1) THEN
|
||||
ZPL := '^FO10,30^A0,220,210^FD':PrintWONo:'^FS':CRLF$
|
||||
END ELSE
|
||||
ZPL := '^FO70,30^A0,220,210^FD':PrintWONo:'^FS':CRLF$
|
||||
END
|
||||
CharCnt = Len(CustName)
|
||||
NameLength = CharCnt*72
|
||||
WhiteSpace = INT(((2103 - NameLength)/2103) * 806)
|
||||
StartingXPos = INT(WhiteSpace/2)
|
||||
ZPL:= '^FO':StartingXPos:',230^A0,75,72^FD':CustName:'^FS':CRLF$
|
||||
ZPL:= '^FO160,320^A080,50^FD':'Commit Date: ':OCONV( XLATE( 'WO_LOG', WONo, WO_LOG_COMMIT_DATE$, 'X' ), 'D2/' ):'^FS':CRLF$
|
||||
ZPL:= '^XZ'
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. WO_LOG ':WoNo:' does not exist.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Null WoNo passed in.'
|
||||
end
|
||||
|
||||
If ErrorMsg EQ '' then
|
||||
Response = ZPL
|
||||
end else
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service GetVoidedWaferCount(WorkOrderNo)
|
||||
|
||||
ErrorMsg = ''
|
||||
VoidedWaferCount = 0
|
||||
If WorkOrderNo NE '' then
|
||||
If RowExists('WO_LOG', WorkOrderNo) then
|
||||
ReactorType = Xlate('WO_LOG', WorkOrderNo, 'PS_REACTOR_TYPE', 'X')
|
||||
If ReactorType EQ 'EPP' then
|
||||
Query = 'SELECT WM_IN WITH WO_NO EQ ':WorkOrderNo:' AND WITH VOID EQ ':True$
|
||||
Rlist(Query, TARGET_ACTIVELIST$, '', '', '')
|
||||
ErrCode = ''
|
||||
If Not(Get_Status(ErrCode)) then
|
||||
EOF = False$
|
||||
Loop
|
||||
Readnext WmInKey else EOF = True$
|
||||
Until EOF
|
||||
VoidedWaferCount += Xlate('WM_IN', WmInKey, 'WFR_CNT', 'X')
|
||||
Repeat
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service: 'service. Error calling RList. Error code: ':ErrCode
|
||||
end
|
||||
end else
|
||||
Query = 'SELECT WO_MAT WITH WO_NO EQ ':WorkOrderNo:' AND WITH VOID EQ ':True$
|
||||
Rlist(Query, TARGET_ACTIVELIST$, '', '', '')
|
||||
ErrCode = ''
|
||||
If Not(Get_Status(ErrCode)) then
|
||||
EOF = False$
|
||||
Loop
|
||||
Readnext WoMatKey else EOF = True$
|
||||
Until EOF
|
||||
VoidedWaferCount += Xlate('WO_MAT', WoMatKey, 'WAFER_QTY', 'X')
|
||||
Repeat
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service: 'service. Error calling RList. Error code: ':ErrCode
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service: 'service. WO_LOG ':WorkOrderNo:' does not exist.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service: 'service. Null WorkOrderNo passed into service.'
|
||||
end
|
||||
|
||||
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||
Response = VoidedWaferCount
|
||||
|
||||
end service
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -35,16 +35,15 @@ Function Wo_API(@API)
|
||||
10/20/23 xxx Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
Declare function Environment_Services, SRP_Datetime, Logging_Services, Work_Order_Services
|
||||
Declare Subroutine Btree.Extract, Logging_Services, Http_Services
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert API_SETUP
|
||||
$insert HTTP_INSERTS
|
||||
|
||||
Declare function Environment_Services, SRP_Datetime, Logging_Services, Work_Order_Services
|
||||
Declare Subroutine Btree.Extract, Logging_Services, Http_Services
|
||||
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
LogTime = Oconv(Time(), 'MTS')
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\API\Materials\WO'
|
||||
@ -55,6 +54,8 @@ LoggingDTM = LogDate : ' ' : LogTime
|
||||
ResponseCode = ''
|
||||
ResponseMessage = ''
|
||||
LogData = ''
|
||||
Response = ''
|
||||
|
||||
GoToAPI else
|
||||
// The specific resource endpoint doesn't have a API handler yet.
|
||||
ResponseCode = 204
|
||||
@ -76,14 +77,6 @@ Return Response OR ''
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
API wo.HEAD
|
||||
API wo.GET
|
||||
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
|
||||
API wo.ID.HEAD
|
||||
API wo.ID.GET
|
||||
|
||||
@ -91,7 +84,20 @@ API wo.ID.GET
|
||||
|
||||
end api
|
||||
|
||||
|
||||
API wo.ID.zpl.HEAD
|
||||
API wo.ID.zpl.GET
|
||||
|
||||
GoSub CreateZPLItem
|
||||
|
||||
end api
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
CreateHALItem:
|
||||
|
||||
ResponseCode = 200
|
||||
MaterialKey = EndpointSegment
|
||||
WOLogKey = ''
|
||||
@ -122,7 +128,7 @@ CreateHALItem:
|
||||
|
||||
end
|
||||
IF WOLogKey NE '' then
|
||||
JSON = Work_Order_Services('ConvertRecordToJSON', WOLogKey, '', FullEndpointURL)
|
||||
JSON = Work_Order_Services('ConvertRecordToJSON', WOLogKey, '', FullEndpointURL)
|
||||
end else
|
||||
IF ResponseCode NE 500 then
|
||||
ResponseCode = 406
|
||||
@ -148,4 +154,32 @@ CreateHALItem:
|
||||
Message = Error_Services('GetMessage')
|
||||
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// CreateZPLItem
|
||||
//
|
||||
// Creates a HAL+JSON object with the ZPL for the given WM_IN row
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
CreateZPLItem:
|
||||
|
||||
WoLogKey = ParentSegment
|
||||
ZPL = Work_Order_Services('GetWoLogZpl', WoLogKey)
|
||||
|
||||
If Error_Services('NoError') then
|
||||
StatusCode = 200
|
||||
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||
HTTP_Services('SetResponseBody', ZPL, False$, 'text/plain')
|
||||
If Assigned(Message) then
|
||||
HTTP_Services('SetResponseStatus', StatusCode, Message)
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', StatusCode)
|
||||
end
|
||||
end else
|
||||
Message = Error_Services('GetMessage')
|
||||
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
|
||||
end
|
||||
|
||||
return
|
||||
|
@ -616,13 +616,25 @@ WRITE_RECORD:
|
||||
NewRelDtm = Record<WO_MAT_REL_DTM$>
|
||||
OrigRecDtm = OrigRecord<WO_MAT_RX_DTM$>
|
||||
NewRecDtm = Record<WO_MAT_RX_DTM$>
|
||||
AdjustQty = NewWfrQty - OrigWfrQty
|
||||
|
||||
If ( ( (OrigWfrQty NE '' ) and (OrigWfrQty NE NewWfrQty) ) or ( (OrigRecDtm EQ '') and (NewRecDtm NE '') ) ) then
|
||||
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'UpdateReceivedQty':SD$:WONo)
|
||||
end
|
||||
If ( ( (OrigWfrQty NE '') and (OrigWfrQty NE NewWfrQty) ) or ( (OrigRelDtm EQ '') and (NewRelDtm NE '') ) ) then
|
||||
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'UpdateReleasedQty':SD$:WONo)
|
||||
end
|
||||
If ( (OrigWfrQty NE '' ) and (OrigWfrQty NE NewWfrQty) and (OrigRecDtm NE '' and NewRecDtm NE '') ) then
|
||||
// Cassette already received, but casssette quantity has changed.
|
||||
If AdjustQty NE 0 then Work_Order_Services('AdjustReceivedQty', WONo, AdjustQty)
|
||||
end
|
||||
If ( (OrigRecDtm EQ '') and (NewRecDtm NE '') ) then
|
||||
// Cassette was just received. Increment received quantity of work order by the entire cassette wafer count.
|
||||
Work_Order_Services('AdjustReceivedQty', WONo, NewWfrQty)
|
||||
end
|
||||
|
||||
If ( (OrigWfrQty NE '') and (OrigWfrQty NE NewWfrQty) and ( (OrigRelDtm NE '') and (NewRelDtm NE '') ) ) then
|
||||
// Cassette already released, but casssette quantity has changed.
|
||||
If AdjustQty NE 0 then Work_Order_Services('AdjustReleasedQty', WONo, AdjustQty)
|
||||
end
|
||||
If ( (OrigRelDtm EQ '') and (NewRelDtm NE '') ) then
|
||||
// Cassette was just released. Increment released quantity of work order by the entire cassette wafer count.
|
||||
Work_Order_Services('AdjustReleasedQty', WONo, NewWfrQty)
|
||||
end
|
||||
|
||||
If {REACTOR_TYPE} NE 'EPP' then
|
||||
If {MAKEUP_BOX} then
|
||||
|
@ -44,6 +44,7 @@ Declare Subroutine Logging_Services
|
||||
$insert APP_INSERTS
|
||||
$insert API_SETUP
|
||||
$insert HTTP_INSERTS
|
||||
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
LogTime = Oconv(Time(), 'MTS')
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\API\Materials\WO_MAT'
|
||||
@ -54,6 +55,8 @@ LoggingDTM = LogDate : ' ' : LogTime
|
||||
ResponseCode = ''
|
||||
ResponseMessage = ''
|
||||
LogData = ''
|
||||
Response = ''
|
||||
|
||||
GoToAPI else
|
||||
// The specific resource endpoint doesn't have a API handler yet.
|
||||
HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.')
|
||||
@ -67,14 +70,6 @@ Return Response OR ''
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
API wo_mat.HEAD
|
||||
API wo_mat.GET
|
||||
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
|
||||
API wo_mat.ID.HEAD
|
||||
API wo_mat.ID.GET
|
||||
|
||||
@ -82,6 +77,12 @@ API wo_mat.ID.GET
|
||||
|
||||
end api
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
CreateHalItem:
|
||||
|
||||
ResponseCode = 200
|
||||
@ -119,4 +120,6 @@ CreateHalItem:
|
||||
LogData<4> = ResponseCode
|
||||
LogData<5> = ResponseMessage
|
||||
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM)
|
||||
|
||||
return
|
||||
|
||||
|
@ -182,6 +182,7 @@ WRITE_RECORD_PRE:
|
||||
Case Record EQ ''
|
||||
|
||||
// Unscheduled record write attempt. Block the write and log the event.
|
||||
// Empty WO_MAT_QA records can cause undesireable issues processing lots.
|
||||
ErrorMessage = 'Empty WO_MAT_QA profile. Unscheduled record write attempt!'
|
||||
Error_Services('Add', 'FS104: ':ErrorMessage)
|
||||
OrigFileError = 104 : @FM : ErrorMessage
|
||||
@ -200,21 +201,8 @@ WRITE_RECORD_PRE:
|
||||
LogData<4> = Stack
|
||||
LogData<5> = CRLF$:RecordSnapshot:CRLF$
|
||||
LogData<6> = 'FS104: ':ErrorMessage
|
||||
|
||||
// Sending a null message will send the LogData instead
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, '', '', '')
|
||||
|
||||
// Send an internal OI message to OI admins
|
||||
Recipients = Xlate('SEC_GROUPS', 'OI_ADMIN', 'USER', 'X')
|
||||
SentFrom = 'SYSTEM'
|
||||
Subject = 'Unscheduled WO_MAT_QA record write attempt.'
|
||||
Message = ErrorMessage
|
||||
AttachWindow = ''
|
||||
AttachKey = ''
|
||||
SendToGroup = ''
|
||||
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
|
||||
obj_Notes('Create',Parms)
|
||||
|
||||
Status = 0
|
||||
Record = ''
|
||||
ActionFlow = ACTION_STOP$
|
||||
|
@ -57,6 +57,8 @@ $Insert PRS_LAYER_EQUATES
|
||||
$Insert PRS_STAGE_EQUATES
|
||||
$Insert PROD_VER_EQUATES
|
||||
$Insert QA_MET_EQUATES ;* Used in GetQAMet data structure return variable
|
||||
$Insert RDS_EQUATES
|
||||
$Insert WO_REACT_EQUATES
|
||||
|
||||
Declare function Database_Services, SRP_JSON, Error_Services, obj_Prod_Spec, Wo_Mat_Qa_Services
|
||||
Declare subroutine Database_Services, SRP_JSON, Error_Services
|
||||
@ -192,130 +194,168 @@ End Service
|
||||
|
||||
|
||||
Service UpdateQAMet(WOMatKey)
|
||||
|
||||
|
||||
WOMatQARec = ''
|
||||
ErrorMsg = ''
|
||||
If (WOMatKey NE '') then
|
||||
|
||||
WONo = Field(WOMatKey, '*', 1)
|
||||
CassNo = Field(WOMatKey, '*', 2)
|
||||
|
||||
* * * * * * * * Build QA_MET profile - Work Order scheduled only * * * * * * * *
|
||||
WOStepKeys = XLATE('WO_LOG', WONo, WO_LOG_WO_STEP_KEY$, 'X')
|
||||
|
||||
StepCnt = DCount(WOStepKeys,@VM)
|
||||
|
||||
EpiProPSNo = ''
|
||||
EpiProPSRec = ''
|
||||
|
||||
MetLine = 1
|
||||
|
||||
// Get original WO_MAT_QA record to copy any test results
|
||||
OrigWOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatKey)
|
||||
OrigQAStages = OrigWOMatQARec<WO_MAT_QA_STAGE$>
|
||||
OrigQAProfiles = OrigWOMatQARec<WO_MAT_QA_PROFILE$>
|
||||
OrigQASlots = OrigWOMatQARec<WO_MAT_QA_SLOT$>
|
||||
OrigQASlotTests = OrigWOMatQARec<WO_MAT_QA_SLOT_TEST$>
|
||||
OrigQAResults = OrigWOMatQARec<WO_MAT_QA_RESULT$>
|
||||
OrigQASigs = OrigWOMatQARec<WO_MAT_QA_SIG$>
|
||||
OrigQASigDtms = OrigWOMatQARec<WO_MAT_QA_SIG_DTM$>
|
||||
OrigQAStdResults = OrigWOMatQARec<WO_MAT_QA_STD_RESULT$>
|
||||
OrigQADataPoints = OrigWOMatQARec<WO_MAT_QA_DATA_POINTS$>
|
||||
OrigQAMinResults = OrigWOMatQARec<WO_MAT_QA_MIN_RESULT$>
|
||||
OrigQAMaxResults = OrigWOMatQARec<WO_MAT_QA_MAX_RESULT$>
|
||||
OrigQARangeResults = OrigWOMatQARec<WO_MAT_QA_RANGE_PCT_RESULT$>
|
||||
OrigQAEdgeResults = OrigWOMatQARec<WO_MAT_QA_EDGE_MEAN_RESULT$>
|
||||
OrigQA5mmResults = OrigWOMatQARec<WO_MAT_QA_5MM_PCT_RESULT$>
|
||||
OrigQAOutOfSpecs = OrigWOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
|
||||
OrigQAFailReasons = OrigWOMatQARec<WO_MAT_QA_FAIL_REASON$>
|
||||
|
||||
* WO_MAT record is used to check for pre-existing signatures jch 6/7/2015
|
||||
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
|
||||
|
||||
FOR WOStepNo = 1 TO StepCnt
|
||||
PSNo = XLATE('WO_STEP', WOStepKeys<1,WOStepNo>, WO_STEP_PROD_SPEC_ID$, 'X')
|
||||
PSRec = Database_Services('ReadDataRow', 'PROD_SPEC', PSNo)
|
||||
QAMetData = obj_Prod_Spec('GetQAMet',PSNo:@RM:PSRec)
|
||||
QAStages = QAMetData<COL$QA_MET_STAGE>
|
||||
StageCnt = COUNT(QAStages,@VM) + (QAStages NE '')
|
||||
|
||||
FOR StageNo = 1 TO StageCnt
|
||||
Stage = QAMetData<COL$QA_MET_STAGE,StageNo>
|
||||
|
||||
MetTest = QAMetData<COL$QA_MET_TEST,StageNo> ;* StageRec<PRS_STAGE_MET_TEST$>
|
||||
|
||||
Interval = QAMetData<COL$QA_MET_INTERVAL,StageNo> ;* StageRec<PRS_STAGE_MET_INTERVAL$,StageNo>
|
||||
Start = QAMetData<COL$QA_MET_START,StageNo> ;* StageRec<PRS_STAGE_MET_START$,StageNo>
|
||||
ReactSched = QAMetData<COL$QA_MET_REACT_SCHED,StageNo> ;* StageRec<PRS_STAGE_MET_REACT_SCHED$,StageNo>
|
||||
TestFlag = 0
|
||||
|
||||
IF Interval NE '' AND Start NE '' THEN
|
||||
IF Interval = Start THEN
|
||||
IF REM(CassNo,Interval) = 0 THEN TestFlag = 1
|
||||
END ELSE
|
||||
IF ABS((Start + INT(CassNo/Interval)*Interval) - CassNo) = 0 THEN TestFlag = 1
|
||||
END
|
||||
IF TestFlag AND NOT(ReactSched) THEN
|
||||
WOMatQARec<WO_MAT_QA_PROFILE$,MetLine> = WOStepNo:QAMetData<COL$QA_MET_TEST,StageNo> ;* StageRec<PRS_STAGE_MET_TEST$,N>
|
||||
WOMatQARec<WO_MAT_QA_PROP$,MetLine> = QAMetData<COL$QA_MET_PROP,StageNo> ;* StageRec<PRS_STAGE_MET_PROP$,N>
|
||||
WOMatQARec<WO_MAT_QA_TOOL_CLASS$,MetLine> = QAMetData<COL$QA_MET_TOOL_CLASS,StageNo> ;* StageRec<PRS_STAGE_MET_TOOL_CLASS$,N>
|
||||
WOMatQARec<WO_MAT_QA_STAGE$,MetLine> = QAMetData<COL$QA_MET_STAGE,StageNo>
|
||||
WOMatQARec<WO_MAT_QA_MIN$,MetLine> = QAMetData<COL$QA_MET_MIN,StageNo> ;* StageRec<PRS_STAGE_MET_MIN$,N>
|
||||
WOMatQARec<WO_MAT_QA_MAX$,MetLine> = QAMetData<COL$QA_MET_MAX,StageNo> ;* StageRec<PRS_STAGE_MET_MAX$,N>
|
||||
WOMatQARec<WO_MAT_QA_SLOT$,MetLine> = QAMetData<COL$QA_MET_SLOT,StageNo> ;* StageRec<PRS_STAGE_MET_SLOT$,N>
|
||||
WOMatQARec<WO_MAT_QA_RECIPE$,MetLine> = QAMetData<COL$QA_MET_RECIPE,StageNo> ;* StageRec<PRS_STAGE_MET_RECIPE$,N>
|
||||
WOMatQARec<WO_MAT_QA_RECIPE_PATTERN$,MetLine> = QAMetData<COL$QA_MET_RECIPE_PATTERN,StageNo> ;* StageRec<PRS_STAGE_MET_RECIPE_PATTERN$,StageNo>
|
||||
WOMatQARec<WO_MAT_QA_WFR_QTY$,MetLine> = QAMetData<COL$QA_MET_WFR_QTY,StageNo> ;* StageRec<PRS_STAGE_MET_WFR_QTY$,StageNo>
|
||||
WOMatQARec<WO_MAT_QA_WFR_TYPE$,MetLine> = QAMetData<COL$QA_MET_WFR_TYPE,StageNo> ;* StageRec<PRS_STAGE_MET_WFR_TYPE$,StageNo>
|
||||
WOMatQARec<WO_MAT_QA_REACT_SCHED$,MetLine> = ReactSched ;* StageRec<PRS_STAGE_MET_REACT_SCHED$,StageNo>
|
||||
WOMatQARec<WO_MAT_QA_SHIP_DOC$,MetLine> = QAMetData<COL$QA_MET_SHIP_DOC,StageNo> ;* StageRec<PRS_STAGE_MET_SHIP_DOC$,StageNo>
|
||||
WOMatQARec<WO_MAT_QA_PHASE_MIN$,MetLine> = QAMetData<COL$QA_MET_PHASE_MIN,StageNo>
|
||||
|
||||
If OrigWOMatQARec NE '' then
|
||||
CurrStage = QAMetData<COL$QA_MET_STAGE,StageNo>
|
||||
CurrProfile = WOStepNo:QAMetData<COL$QA_MET_TEST,StageNo>
|
||||
CurrSlot = QAMetData<COL$QA_MET_SLOT,StageNo>
|
||||
// Copy any existing results from the original WO_MAT_QA record.
|
||||
If OrigQAStages NE '' then
|
||||
Found = False$
|
||||
For each OrigQAStage in OrigQAStages using @VM setting sPos
|
||||
OrigQAProfile = OrigQAProfiles<0, sPos>
|
||||
OrigQASlot = OrigQASlots<0, sPos>
|
||||
If ( (CurrStage EQ OrigQAStage) and (CurrProfile EQ OrigQAProfile) and (CurrSlot EQ OrigQASlot) ) then
|
||||
Found = True$
|
||||
WOMatQARec<WO_MAT_QA_SLOT_TEST$,MetLine> = OrigQASlotTests<0, sPos>
|
||||
WOMatQARec<WO_MAT_QA_RESULT$,MetLine> = OrigQAResults<0, sPos>
|
||||
WOMatQARec<WO_MAT_QA_SIG$,MetLine> = OrigQASigs<0, sPos>
|
||||
WOMatQARec<WO_MAT_QA_SIG_DTM$,MetLine> = OrigQASigDtms<0, sPos>
|
||||
WOMatQARec<WO_MAT_QA_STD_RESULT$,MetLine> = OrigQAStdResults<0, sPos>
|
||||
WOMatQARec<WO_MAT_QA_DATA_POINTS$,MetLine> = OrigQADataPoints<0, sPos>
|
||||
WOMatQARec<WO_MAT_QA_MIN_RESULT$,MetLine> = OrigQAMinResults<0, sPos>
|
||||
WOMatQARec<WO_MAT_QA_MAX_RESULT$,MetLine> = OrigQAMaxResults<0, sPos>
|
||||
WOMatQARec<WO_MAT_QA_RANGE_PCT_RESULT$,MetLine> = OrigQARangeResults<0, sPos>
|
||||
WOMatQARec<WO_MAT_QA_EDGE_MEAN_RESULT$,MetLine> = OrigQAEdgeResults<0, sPos>
|
||||
WOMatQARec<WO_MAT_QA_5MM_PCT_RESULT$,MetLine> = OrigQA5mmResults<0, sPos>
|
||||
WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$,MetLine> = OrigQAOutOfSpecs<0, sPos>
|
||||
WOMatQARec<WO_MAT_QA_FAIL_REASON$,MetLine> = OrigQAFailReasons<0, sPos>
|
||||
end
|
||||
Until Found
|
||||
Next OrigQAStage
|
||||
end
|
||||
end
|
||||
MetLine += 1
|
||||
END
|
||||
END
|
||||
|
||||
NEXT StageNo
|
||||
|
||||
NEXT WOStepNo
|
||||
|
||||
Database_Services('WriteDataRow', 'WO_MAT_QA', WONo:'*':CassNo, WOMatQARec)
|
||||
|
||||
WONo = Field(WOMatKey, '*', 1)
|
||||
CassNo = Field(WOMatKey, '*', 2)
|
||||
RDSNo = Database_Services('ReadDataColumn', 'WO_MAT', WOMatKey, WO_MAT_RDS_NO$)
|
||||
If Error_Services('NoError') then
|
||||
If (RDSNo NE '') then
|
||||
// Check if it has been assigned to a reactor
|
||||
ReactNo = Database_Services('ReadDataColumn', 'RDS', RDSNo, RDS_REACTOR$)
|
||||
If Error_Services('HasError') then
|
||||
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
// Either not signed into a reactor yet or this WO_MAT is EpiPro and therefore there is no
|
||||
// 1-to-1 RDS record. Because of this, reactor scheduled QA met is not possible with EpiPro.
|
||||
ReactNo = ''
|
||||
end
|
||||
If (ErrorMsg EQ '') then
|
||||
WOStepKeys = Database_Services('ReadDataColumn', 'WO_LOG', WONo, WO_LOG_WO_STEP_KEY$)
|
||||
If Error_Services('NoError') then
|
||||
StepCnt = DCount(WOStepKeys,@VM)
|
||||
MetLine = 1
|
||||
// Get original WO_MAT_QA record to copy any test results
|
||||
OrigWOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatKey)
|
||||
OrigQAStages = OrigWOMatQARec<WO_MAT_QA_STAGE$>
|
||||
OrigQAProfiles = OrigWOMatQARec<WO_MAT_QA_PROFILE$>
|
||||
OrigQASlots = OrigWOMatQARec<WO_MAT_QA_SLOT$>
|
||||
OrigQASlotTests = OrigWOMatQARec<WO_MAT_QA_SLOT_TEST$>
|
||||
OrigQAResults = OrigWOMatQARec<WO_MAT_QA_RESULT$>
|
||||
OrigQASigs = OrigWOMatQARec<WO_MAT_QA_SIG$>
|
||||
OrigQASigDtms = OrigWOMatQARec<WO_MAT_QA_SIG_DTM$>
|
||||
OrigQAStdResults = OrigWOMatQARec<WO_MAT_QA_STD_RESULT$>
|
||||
OrigQADataPoints = OrigWOMatQARec<WO_MAT_QA_DATA_POINTS$>
|
||||
OrigQAMinResults = OrigWOMatQARec<WO_MAT_QA_MIN_RESULT$>
|
||||
OrigQAMaxResults = OrigWOMatQARec<WO_MAT_QA_MAX_RESULT$>
|
||||
OrigQARangeResults = OrigWOMatQARec<WO_MAT_QA_RANGE_PCT_RESULT$>
|
||||
OrigQAEdgeResults = OrigWOMatQARec<WO_MAT_QA_EDGE_MEAN_RESULT$>
|
||||
OrigQA5mmResults = OrigWOMatQARec<WO_MAT_QA_5MM_PCT_RESULT$>
|
||||
OrigQAOutOfSpecs = OrigWOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
|
||||
OrigQAFailReasons = OrigWOMatQARec<WO_MAT_QA_FAIL_REASON$>
|
||||
|
||||
FOR WOStepNo = 1 TO StepCnt
|
||||
PSNo = Database_Services('ReadDataColumn', 'WO_STEP', WOStepKeys<1,WOStepNo>, WO_STEP_PROD_SPEC_ID$)
|
||||
If Error_Services('NoError') then
|
||||
PSRec = Database_Services('ReadDataRow', 'PROD_SPEC', PSNo)
|
||||
If Error_Services('NoError') then
|
||||
QAMetData = obj_Prod_Spec('GetQAMet',PSNo:@RM:PSRec)
|
||||
QAStages = QAMetData<COL$QA_MET_STAGE>
|
||||
StageCnt = DCount(QAStages,@VM)
|
||||
|
||||
If (ReactNo NE '') then
|
||||
WOReactKey = WONo:'*':WOStepNo:'*':ReactNo
|
||||
end else
|
||||
WOReactKey = ''
|
||||
end
|
||||
|
||||
If (WOReactKey NE '') then
|
||||
WOReactRDSNos = Database_Services('ReadDataColumn', 'WO_REACT', WOReactKey, WO_REACT_RDS_NO$)
|
||||
If Error_Services('HasError') then
|
||||
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
|
||||
If (ErrorMsg EQ '') then
|
||||
For StageNo = 1 to StageCnt
|
||||
Stage = QAMetData<COL$QA_MET_STAGE,StageNo>
|
||||
MetTest = QAMetData<COL$QA_MET_TEST,StageNo> ;* StageRec<PRS_STAGE_MET_TEST$>
|
||||
Interval = QAMetData<COL$QA_MET_INTERVAL,StageNo> ;* StageRec<PRS_STAGE_MET_INTERVAL$,StageNo>
|
||||
Start = QAMetData<COL$QA_MET_START,StageNo> ;* StageRec<PRS_STAGE_MET_START$,StageNo>
|
||||
ReactSched = QAMetData<COL$QA_MET_REACT_SCHED,StageNo> ;* StageRec<PRS_STAGE_MET_REACT_SCHED$,StageNo>
|
||||
TestFlag = False$
|
||||
|
||||
If ( (Interval NE '') and (Start NE '') ) then
|
||||
// Add Work Order scheduled tests (i.e., not reactor scheduled tests)
|
||||
If Not(ReactSched) then
|
||||
If Interval = Start then
|
||||
If ( Rem(CassNo, Interval) EQ 0 ) then TestFlag = True$
|
||||
end else
|
||||
If ( Abs( (Start + Int(CassNo / Interval)*Interval) - CassNo ) EQ 0) then TestFlag = True$
|
||||
end
|
||||
end else
|
||||
Locate RDSNo in WOReactRDSNos using @VM setting TestSeq then
|
||||
If ( Rem( (TestSeq - Start), Interval) EQ 0 ) then TestFlag = True$
|
||||
end
|
||||
end
|
||||
If TestFlag then
|
||||
WOMatQARec<WO_MAT_QA_PROFILE$,MetLine> = WOStepNo:MetTest
|
||||
WOMatQARec<WO_MAT_QA_PROP$,MetLine> = QAMetData<COL$QA_MET_PROP,StageNo>
|
||||
WOMatQARec<WO_MAT_QA_TOOL_CLASS$,MetLine> = QAMetData<COL$QA_MET_TOOL_CLASS,StageNo>
|
||||
WOMatQARec<WO_MAT_QA_STAGE$,MetLine> = Stage
|
||||
WOMatQARec<WO_MAT_QA_MIN$,MetLine> = QAMetData<COL$QA_MET_MIN,StageNo>
|
||||
WOMatQARec<WO_MAT_QA_MAX$,MetLine> = QAMetData<COL$QA_MET_MAX,StageNo>
|
||||
WOMatQARec<WO_MAT_QA_SLOT$,MetLine> = QAMetData<COL$QA_MET_SLOT,StageNo>
|
||||
WOMatQARec<WO_MAT_QA_RECIPE$,MetLine> = QAMetData<COL$QA_MET_RECIPE,StageNo>
|
||||
WOMatQARec<WO_MAT_QA_RECIPE_PATTERN$,MetLine> = QAMetData<COL$QA_MET_RECIPE_PATTERN,StageNo>
|
||||
WOMatQARec<WO_MAT_QA_WFR_QTY$,MetLine> = QAMetData<COL$QA_MET_WFR_QTY,StageNo>
|
||||
WOMatQARec<WO_MAT_QA_WFR_TYPE$,MetLine> = QAMetData<COL$QA_MET_WFR_TYPE,StageNo>
|
||||
WOMatQARec<WO_MAT_QA_REACT_SCHED$,MetLine> = ReactSched
|
||||
WOMatQARec<WO_MAT_QA_SHIP_DOC$,MetLine> = QAMetData<COL$QA_MET_SHIP_DOC,StageNo>
|
||||
WOMatQARec<WO_MAT_QA_PHASE_MIN$,MetLine> = QAMetData<COL$QA_MET_PHASE_MIN,StageNo>
|
||||
|
||||
If OrigWOMatQARec NE '' then
|
||||
CurrStage = QAMetData<COL$QA_MET_STAGE,StageNo>
|
||||
CurrProfile = WOStepNo:MetTest
|
||||
CurrSlot = QAMetData<COL$QA_MET_SLOT,StageNo>
|
||||
// Copy any existing results from the original WO_MAT_QA record.
|
||||
If OrigQAStages NE '' then
|
||||
Found = False$
|
||||
For each OrigQAStage in OrigQAStages using @VM setting sPos
|
||||
OrigQAProfile = OrigQAProfiles<0, sPos>
|
||||
OrigQASlot = OrigQASlots<0, sPos>
|
||||
If ( (CurrStage EQ OrigQAStage) and (CurrProfile EQ OrigQAProfile) and (CurrSlot EQ OrigQASlot) ) then
|
||||
Found = True$
|
||||
WOMatQARec<WO_MAT_QA_SLOT_TEST$,MetLine> = OrigQASlotTests<0, sPos>
|
||||
WOMatQARec<WO_MAT_QA_RESULT$,MetLine> = OrigQAResults<0, sPos>
|
||||
WOMatQARec<WO_MAT_QA_SIG$,MetLine> = OrigQASigs<0, sPos>
|
||||
WOMatQARec<WO_MAT_QA_SIG_DTM$,MetLine> = OrigQASigDtms<0, sPos>
|
||||
WOMatQARec<WO_MAT_QA_STD_RESULT$,MetLine> = OrigQAStdResults<0, sPos>
|
||||
WOMatQARec<WO_MAT_QA_DATA_POINTS$,MetLine> = OrigQADataPoints<0, sPos>
|
||||
WOMatQARec<WO_MAT_QA_MIN_RESULT$,MetLine> = OrigQAMinResults<0, sPos>
|
||||
WOMatQARec<WO_MAT_QA_MAX_RESULT$,MetLine> = OrigQAMaxResults<0, sPos>
|
||||
WOMatQARec<WO_MAT_QA_RANGE_PCT_RESULT$,MetLine> = OrigQARangeResults<0, sPos>
|
||||
WOMatQARec<WO_MAT_QA_EDGE_MEAN_RESULT$,MetLine> = OrigQAEdgeResults<0, sPos>
|
||||
WOMatQARec<WO_MAT_QA_5MM_PCT_RESULT$,MetLine> = OrigQA5mmResults<0, sPos>
|
||||
WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$,MetLine> = OrigQAOutOfSpecs<0, sPos>
|
||||
WOMatQARec<WO_MAT_QA_FAIL_REASON$,MetLine> = OrigQAFailReasons<0, sPos>
|
||||
end
|
||||
Until Found
|
||||
Next OrigQAStage
|
||||
end
|
||||
end
|
||||
MetLine += 1
|
||||
end
|
||||
end
|
||||
Next StageNo
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||
end
|
||||
Until (ErrorMsg NE '')
|
||||
Next WOStepNo
|
||||
If (ErrorMsg EQ '') then
|
||||
Database_Services('WriteDataRow', 'WO_MAT_QA', WONo:'*':CassNo, WOMatQARec)
|
||||
If Error_Services('HasError') then ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Null WOMatKey passed in.'
|
||||
end
|
||||
|
||||
If ErrorMsg NE '' then
|
||||
If (ErrorMsg NE '') then
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end else
|
||||
Response = WOMatQARec
|
||||
@ -420,36 +460,58 @@ end service
|
||||
|
||||
|
||||
Service GetQAMetComplete(WOMatKey)
|
||||
|
||||
|
||||
ErrorMsg = ''
|
||||
QAMetComplete = True$
|
||||
|
||||
If WOMatKey NE '' then
|
||||
// Lack of WO_MAT_QA record may not be an error here. Gen5 Products do not have WO_MAT_QA Records
|
||||
If Rowexists('WO_MAT_QA', WOMatKey) then
|
||||
Response = ''
|
||||
QAMetRec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatKey, '', True$, 0, False$)
|
||||
Stages = QAMetRec<WO_MAT_QA_STAGE$>
|
||||
Results = QAMetRec<WO_MAT_QA_RESULT$>
|
||||
StageCount = Count(Stages, @VM)
|
||||
For I = 1 to StageCount
|
||||
If Results<1,I> EQ '' then
|
||||
Response = False$
|
||||
QAMetRec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatKey, '', True$, 0, False$)
|
||||
If Error_Services('NoError') then
|
||||
Stages = QAMetRec<WO_MAT_QA_STAGE$>
|
||||
Results = QAMetRec<WO_MAT_QA_RESULT$>
|
||||
StageCount = DCount(Stages, @VM)
|
||||
QAStagePresent = False$
|
||||
For I = 1 to StageCount
|
||||
If Stages<1, I> EQ 'QA' then QAStagePresent = True$
|
||||
If Results<1,I> EQ '' then
|
||||
QAMetComplete = False$
|
||||
end
|
||||
Until QAMetComplete EQ False$
|
||||
Next I
|
||||
If QAMetComplete EQ True$ AND QAStagePresent = True$ then
|
||||
QAMUMetComplete = WO_Mat_QA_Services('GetMUWaferQAComplete', WOMatKey)
|
||||
If Error_Services('NoError') then
|
||||
If Not(QAMUMetComplete) then
|
||||
QAMetComplete = False$
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
Until Response EQ False$
|
||||
Next I
|
||||
If Response = '' then
|
||||
Response = Wo_Mat_Qa_Services('GetMUWaferQAComplete', WOMatKey)
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
Response = True$
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Missing WOMatKey parameter.')
|
||||
ErrorMsg = 'Missing WOMatKey parameter.'
|
||||
end
|
||||
|
||||
If ErrorMsg EQ '' then
|
||||
Response = QAMetComplete
|
||||
end else
|
||||
Response = False$
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service GetMUWaferQAComplete(WOMatKey)
|
||||
|
||||
|
||||
ErrorMsg = ''
|
||||
|
||||
If WOMatKey NE '' then
|
||||
Response = True$
|
||||
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WoMatKey, True$, 0, False$)
|
||||
@ -487,12 +549,15 @@ Service GetMUWaferQAComplete(WOMatKey)
|
||||
Next Box
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Failed to open WO_MAT record.')
|
||||
ErrorMsg = 'Failed to open WO_MAT record.'
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Missing WOMatKey parameter.')
|
||||
ErrorMsg = 'Missing WOMatKey parameter.'
|
||||
end
|
||||
|
||||
If ErrorMsg NE '' then
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
|
@ -55,7 +55,7 @@ $Insert SERVICE_SETUP
|
||||
$Insert DICT_EQUATES
|
||||
|
||||
Declare function Database_Services, Error_Services, SRP_Json, SRP_Com, Environment_Services, Logging_Services
|
||||
Declare function Datetime, Rds_Services, GetTickCount, SRP_Array
|
||||
Declare function Datetime, Rds_Services, GetTickCount, SRP_Array, Date_Services
|
||||
Declare subroutine Error_Services, SRP_Json, SRP_Com, Wo_Mat_Services, Database_Services, Logging_Services
|
||||
Declare subroutine obj_wo_mat_log, Set_Status, Rds_Services, Signature_Services, Mona_Services, Btree.Extract
|
||||
Declare subroutine Transaction_Services
|
||||
@ -86,6 +86,7 @@ Return Response or ""
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Service ConvertRecordToJSON(WOMatKey, Record, ItemURL)
|
||||
|
||||
jsonRecord = ''
|
||||
IF WOMatKey NE '' then
|
||||
If Record EQ '' then Record = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
|
||||
@ -290,6 +291,50 @@ Service ConvertRecordToJSON(WOMatKey, Record, ItemURL)
|
||||
End Service
|
||||
|
||||
|
||||
Service ConvertRecordToJsonOIWizard(WOMatKey, WOMatRec)
|
||||
|
||||
Json = ''
|
||||
If WOMatKey NE '' then
|
||||
If WOMatRec EQ '' then WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
|
||||
If Error_Services('NoError') then
|
||||
objJSON = ''
|
||||
If SRP_JSON(objJSON, 'New', 'Object') then
|
||||
objWOMat = ''
|
||||
If SRP_JSON(objWOMat, 'New', 'Object') then
|
||||
SRP_JSON(objWOMat, 'SetValue', 'KeyId', WOMatKey)
|
||||
SRP_JSON(objWOMat, 'SetValue', 'CassNo', Field(WOMatKey, '*', 2, 1))
|
||||
SRP_JSON(objWOMat, 'SetValue', 'SAPBatchNo', WOMatRec<WO_MAT_SAP_BATCH_NO$>)
|
||||
SRP_JSON(objWOMat, 'SetValue', 'SAPTXDtm', Date_Services('ConvertDateTimeToISO8601', WOMatRec<WO_MAT_SAP_TX_DTM$>))
|
||||
SRP_JSON(objWOMat, 'SetValue', 'RDSNo', WOMatRec<WO_MAT_RDS_NO$>)
|
||||
SRP_JSON(objWOMat, 'SetValue', 'ShipNo', WOMatRec<WO_MAT_SHIP_NO$>)
|
||||
SRP_JSON(objWOMat, 'SetValue', 'LotNo', WOMatRec<WO_MAT_LOT_NO$>)
|
||||
SRP_JSON(objWOMat, 'SetValue', 'Qty', WOMatRec<WO_MAT_WAFER_QTY$>)
|
||||
SRP_JSON(objWOMat, 'SetValue', 'CustPartNo', WOMatRec<WO_MAT_CUST_PART_NO$>)
|
||||
SRP_JSON(objWOMat, 'SetValue', 'SubPartNo', WOMatRec<WO_MAT_SUB_PART_NO$>)
|
||||
SRP_JSON(objWOMat, 'SetValue', 'VendorCd', WOMatRec<WO_MAT_SUB_VEND_CD$>)
|
||||
SRP_JSON(objWOMat, 'SetValue', 'RecDtm', Date_Services('ConvertDateTimeToISO8601', WOMatRec<WO_MAT_RX_DTM$>))
|
||||
SRP_JSON(objWOMat, 'SetValue', 'RelDtm', Date_Services('ConvertDateTimeToISO8601', WOMatRec<WO_MAT_REL_DTM$>))
|
||||
SRP_JSON(objWOMat, 'SetValue', 'RecUser', OConv(WOMatRec<WO_MAT_RX_BY$>, '[XLATE_CONV,LSL_USERS*FIRST_LAST]'))
|
||||
SRP_JSON(objWOMat, 'SetValue', 'RelUser', OConv(WOMatRec<WO_MAT_REL_BY$>, '[XLATE_CONV,LSL_USERS*FIRST_LAST]' ))
|
||||
SRP_JSON(objJSON, 'Set', 'WO_Mat', objWOMat)
|
||||
SRP_JSON(objWOMat, 'Release')
|
||||
Json = SRP_JSON(objJSON, 'Stringify', 'Fast')
|
||||
end else
|
||||
Error_Services('Add', 'Unable to create JSON representation in the ' : Service : ' service.')
|
||||
end
|
||||
SRP_JSON(objJSON, 'Release')
|
||||
end else
|
||||
Error_Services('Add', 'Unable to create JSON representation in the ' : Service : ' service.')
|
||||
end
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'KeyID argument was missing in the ' : Service : ' service.')
|
||||
end
|
||||
Response = Json
|
||||
|
||||
end service
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// GetWaferMap
|
||||
//
|
||||
@ -447,37 +492,43 @@ Service CassetteIsLastInWo(WoMatKey)
|
||||
|
||||
IsLastInWo = False$
|
||||
|
||||
ErrMsg = ''
|
||||
If Unassigned(WoMatKey) or WoMatKey EQ '' or RowExists('WO_MAT', WoMatKey) NE True$ then
|
||||
Error_Services('Add', 'invalid WO_MAT key')
|
||||
ErrMsg = 'invalid WO_MAT key'
|
||||
end
|
||||
|
||||
WO = Field(WoMatKey, '*', 1)
|
||||
If WO EQ '' then
|
||||
Error_Services('Add', 'WO# not found in WO_MAT record')
|
||||
ErrMsg = 'WO# not found in WO_MAT record'
|
||||
end
|
||||
If Error_Services('NoError') and Num(WO) EQ False$ then
|
||||
Error_Services('Add', 'WO# is not numeric')
|
||||
If ErrMsg EQ '' and Num(WO) EQ False$ then
|
||||
ErrMsg = 'WO# is not numeric'
|
||||
end
|
||||
|
||||
CassNo = Field(WoMatKey, '*', 2)
|
||||
If Error_Services('NoError') and CassNo EQ '' then
|
||||
Error_Services('Add', 'Cassette# not found in WO_MAT record')
|
||||
If ErrMsg EQ '' and CassNo EQ '' then
|
||||
ErrMsg = 'Cassette# not found in WO_MAT record'
|
||||
end
|
||||
If Error_Services('NoError') and Num(CassNo) EQ False$ then
|
||||
Error_Services('Add', 'Cassette# is not numeric')
|
||||
If ErrMsg EQ '' and Num(CassNo) EQ False$ then
|
||||
ErrMsg = 'Cassette# is not numeric'
|
||||
end
|
||||
|
||||
If Error_Services('NoError') then
|
||||
If ErrMsg EQ '' then
|
||||
WoMatKeys = Xlate('WO_LOG', WO, WO_LOG_WO_MAT_KEY$, 'X')
|
||||
If Error_Services('NoError') and WoMatKeys NE '' then
|
||||
If WoMatKeys NE '' then
|
||||
TotalCassettes = DCount(WoMatKeys, @VM)
|
||||
IsLastInWo = TotalCassettes EQ CassNo
|
||||
end else
|
||||
ErrMsg = 'WO_MAT keys not found in WO_LOG for WO ':WO
|
||||
end
|
||||
end
|
||||
|
||||
If Error_Services('HasError') then
|
||||
ErrMsg = Error_Services('GetMessage')
|
||||
|
||||
Response = IsLastInWo
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
If ErrMsg NE '' then
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDtm
|
||||
LogData<2> = WOMatKey
|
||||
@ -488,11 +539,6 @@ Service CassetteIsLastInWo(WoMatKey)
|
||||
|
||||
Error_Services('Add', ErrMsg)
|
||||
end
|
||||
|
||||
Response = IsLastInWo
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
end service
|
||||
|
||||
@ -546,34 +592,49 @@ Service SetWoMatVoidFlag(WoMatKey, Username)
|
||||
end service
|
||||
|
||||
|
||||
Service MakeupFlagOn(RDSNo)
|
||||
Service MakeupFlagOn(WOMatKey)
|
||||
|
||||
EpiCheck = Rds_Services('IsEpiPro', RDSNo)
|
||||
BioRadDown = False$
|
||||
Bio4Down = False$
|
||||
Bio5Down = False$
|
||||
Bio4LogKey = Xlate('TOOL', 'BIORAD4', 'CURR_MODE_KEY', 'X')
|
||||
Bio5LogKey = Xlate('TOOL', 'BIORAD5', 'CURR_MODE_KEY', 'X')
|
||||
Bio4Mode = Xlate('TOOL_LOG', Bio4LogKey, 'TOOL_MODE', 'X')
|
||||
Bio5Mode = Xlate('TOOL_LOG', Bio5LogKey, 'TOOL_MODE', 'X')
|
||||
|
||||
If (Bio4Mode NE 'PROD') AND (Bio4Mode NE 'LIM') then Bio4Down = True$
|
||||
If (Bio5Mode NE 'PROD') AND (Bio5Mode NE 'LIM') then Bio5Down = True$
|
||||
|
||||
If (Bio4Down) AND (Bio5Down) then BioRadDown = True$
|
||||
|
||||
If EpiCheck EQ False$ then
|
||||
WOMatKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X')
|
||||
WOMatQARec = XLATE('WO_MAT_QA',WOMatKey,'','X')
|
||||
PropRow = WOMatQARec<3>
|
||||
If (Count(PropRow, 'THICK') NE 0) AND (BioRadDown EQ False$) then
|
||||
CurrentStage = Rds_Services('GetCurrentStage', RDSNo)
|
||||
If CurrentStage EQ 'COMP' then
|
||||
Signature_Services('UnsignFQAStage', RDSNo)
|
||||
end
|
||||
Rds_Services('ApplyQA100PercentADE', RDSNo)
|
||||
end
|
||||
end
|
||||
ErrorMsg = ''
|
||||
If (WOMatKey NE '') then
|
||||
If RowExists('WO_MAT', WOMatKey) then
|
||||
RDSNo = Database_Services('ReadDataColumn', 'WO_MAT', WOMatKey, WO_MAT_RDS_NO$)
|
||||
If Error_Services('NoError') then
|
||||
EpiCheck = Rds_Services('IsEpiPro', RDSNo)
|
||||
BioRadDown = False$
|
||||
Bio4Down = False$
|
||||
Bio5Down = False$
|
||||
Bio4LogKey = Xlate('TOOL', 'BIORAD4', 'CURR_MODE_KEY', 'X')
|
||||
Bio5LogKey = Xlate('TOOL', 'BIORAD5', 'CURR_MODE_KEY', 'X')
|
||||
Bio4Mode = Xlate('TOOL_LOG', Bio4LogKey, 'TOOL_MODE', 'X')
|
||||
Bio5Mode = Xlate('TOOL_LOG', Bio5LogKey, 'TOOL_MODE', 'X')
|
||||
|
||||
If (Bio4Mode NE 'PROD') AND (Bio4Mode NE 'LIM') then Bio4Down = True$
|
||||
If (Bio5Mode NE 'PROD') AND (Bio5Mode NE 'LIM') then Bio5Down = True$
|
||||
|
||||
If (Bio4Down) AND (Bio5Down) then BioRadDown = True$
|
||||
|
||||
If EpiCheck EQ False$ then
|
||||
WOMatKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X')
|
||||
WOMatQARec = XLATE('WO_MAT_QA',WOMatKey,'','X')
|
||||
PropRow = WOMatQARec<3>
|
||||
If (Count(PropRow, 'THICK') NE 0) AND (BioRadDown EQ False$) then
|
||||
CurrentStage = Rds_Services('GetCurrentStage', RDSNo)
|
||||
If CurrentStage EQ 'COMP' then
|
||||
Signature_Services('UnsignFQAStage', RDSNo)
|
||||
end
|
||||
Rds_Services('ApplyQA100PercentADE', RDSNo)
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error reading RDS_NO from WO_MAT record ':WOMatKey:'. '
|
||||
ErrorMsg := 'Error message: ':Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. WO_MAT record ':WOMatKey:' does not exist.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Null WOMatKey passed into service.'
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
@ -696,4 +757,3 @@ Service VerifyWOLogWOMatKeyColumn(WOMatKey)
|
||||
|
||||
end service
|
||||
|
||||
|
||||
|
@ -242,6 +242,10 @@ Equ API_COLOR_BTNTEXT$ To 18
|
||||
Equ API_COLOR_INACTIVECAPTIONTEXT$ To 19
|
||||
Equ API_COLOR_BTNHIGHLIGHT$ To 20
|
||||
|
||||
// Edit Line Color Equates
|
||||
Equ READONLY_GREEN$ TO 192 + (220*256) + (192*65536)
|
||||
Equ EDIT_ACTIVE_WHITE$ TO 16777215
|
||||
|
||||
// Preference Manager
|
||||
Equ ImagePath$ to Memory_Services('GetValue', 'PM_CURRENT_IMAGE_PATH') : '\'
|
||||
PMSystemFont = Memory_Services('GetValue', 'PM_SYSTEM_FONT')
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user