Compare commits
78 Commits
722bc63bdb
...
52b3b20b4e
Author | SHA1 | Date | |
---|---|---|---|
52b3b20b4e | |||
3d786a7916 | |||
1b94adb0d1 | |||
315abcde86 | |||
05e0fb3eda | |||
cbb52c469b | |||
712cec903a | |||
6e829bd06a | |||
8604a83966 | |||
52504272f9 | |||
b485de10ef | |||
261e13ceac | |||
ad6ed9c002 | |||
beaac0d38a | |||
a2f61d11c9 | |||
acd7949e85 | |||
128bf2ef8d | |||
705237545f | |||
baa9af3e1a | |||
2fa474880d | |||
399f568b15 | |||
99d6abc3f2 | |||
a2c467e9cb | |||
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 |
@ -46,52 +46,53 @@
|
||||
"<1,37>": "6MACTRONIX #3",
|
||||
"<1,38>": "6MACTRONIX #4",
|
||||
"<1,39>": "8INLESS",
|
||||
"<1,40>": "8INLESS2",
|
||||
"<1,41>": "BAGGER1",
|
||||
"<1,42>": "BAGGER2",
|
||||
"<1,43>": "BAGGER3",
|
||||
"<1,44>": "BAGGER4",
|
||||
"<1,45>": "6INFF01",
|
||||
"<1,46>": "6INFF02",
|
||||
"<1,47>": "6INFF03",
|
||||
"<1,48>": "6INFF04",
|
||||
"<1,49>": "6INFF05",
|
||||
"<1,50>": "6INFF06",
|
||||
"<1,51>": "6INFF07",
|
||||
"<1,52>": "6INFF08",
|
||||
"<1,53>": "6INFF09",
|
||||
"<1,54>": "6INFF10",
|
||||
"<1,55>": "8INNF01",
|
||||
"<1,56>": "8INNF02",
|
||||
"<1,57>": "8INNF03",
|
||||
"<1,58>": "8INNF04",
|
||||
"<1,59>": "8INNF05",
|
||||
"<1,60>": "8INFF01",
|
||||
"<1,61>": "8INFF02",
|
||||
"<1,62>": "8INFF03",
|
||||
"<1,63>": "8INFF04",
|
||||
"<1,64>": "MACTRONIX #1",
|
||||
"<1,65>": "MACTRONIX #2 ",
|
||||
"<1,66>": "MACTRONIX #3",
|
||||
"<1,67>": "MACTRONIX #4",
|
||||
"<1,68>": "MACTRONIX #5",
|
||||
"<1,69>": "MACTRONIX #6",
|
||||
"<1,70>": "MACTRONIX #7",
|
||||
"<1,71>": "TALL_PITCH1",
|
||||
"<1,72>": "TALL_PITCH2",
|
||||
"<1,73>": "TALL_PITCH3",
|
||||
"<1,74>": "TALL_PITCH4",
|
||||
"<1,75>": "WC6INCH1",
|
||||
"<1,76>": "WC6INCH2",
|
||||
"<1,77>": "WC6INCH3",
|
||||
"<1,78>": "WC6INCH4",
|
||||
"<1,79>": "WC8INCH1",
|
||||
"<1,80>": "WC8INCH2",
|
||||
"<1,81>": "WC8INCH3",
|
||||
"<1,82>": "ELLP01",
|
||||
"<1,83>": "LEAKCHK01",
|
||||
"<1,84>": "LEAKCHK02",
|
||||
"<1,85>": "TBI #1"
|
||||
"<1,40>": "BAGGER1",
|
||||
"<1,41>": "BAGGER2",
|
||||
"<1,42>": "BAGGER3",
|
||||
"<1,43>": "BAGGER4",
|
||||
"<1,44>": "PACK1",
|
||||
"<1,45>": "PACK2",
|
||||
"<1,46>": "6INFF01",
|
||||
"<1,47>": "6INFF02",
|
||||
"<1,48>": "6INFF03",
|
||||
"<1,49>": "6INFF04",
|
||||
"<1,50>": "6INFF05",
|
||||
"<1,51>": "6INFF06",
|
||||
"<1,52>": "6INFF07",
|
||||
"<1,53>": "6INFF08",
|
||||
"<1,54>": "6INFF09",
|
||||
"<1,55>": "6INFF10",
|
||||
"<1,56>": "8INNF01",
|
||||
"<1,57>": "8INNF02",
|
||||
"<1,58>": "8INNF03",
|
||||
"<1,59>": "8INNF04",
|
||||
"<1,60>": "8INNF05",
|
||||
"<1,61>": "8INFF01",
|
||||
"<1,62>": "8INFF02",
|
||||
"<1,63>": "8INFF03",
|
||||
"<1,64>": "8INFF04",
|
||||
"<1,65>": "MACTRONIX #1",
|
||||
"<1,66>": "MACTRONIX #2 ",
|
||||
"<1,67>": "MACTRONIX #3",
|
||||
"<1,68>": "MACTRONIX #4",
|
||||
"<1,69>": "MACTRONIX #5",
|
||||
"<1,70>": "MACTRONIX #6",
|
||||
"<1,71>": "MACTRONIX #7",
|
||||
"<1,72>": "TALL_PITCH1",
|
||||
"<1,73>": "TALL_PITCH2",
|
||||
"<1,74>": "TALL_PITCH3",
|
||||
"<1,75>": "TALL_PITCH4",
|
||||
"<1,76>": "WC6INCH1",
|
||||
"<1,77>": "WC6INCH2",
|
||||
"<1,78>": "WC6INCH3",
|
||||
"<1,79>": "WC6INCH4",
|
||||
"<1,80>": "WC8INCH1",
|
||||
"<1,81>": "WC8INCH2",
|
||||
"<1,82>": "WC8INCH3",
|
||||
"<1,83>": "ELLP01",
|
||||
"<1,84>": "LEAKCHK01",
|
||||
"<1,85>": "LEAKCHK02",
|
||||
"<1,86>": "TBI #1"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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
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
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>": "-2",
|
||||
"<3>": "-1",
|
||||
"<4>": "-1",
|
||||
"<5>": "16777215",
|
||||
"<5>": "-2",
|
||||
"<6>": {
|
||||
"<6,1>": {
|
||||
"<6,1,1>": "Tahoma",
|
||||
@ -43,7 +43,8 @@
|
||||
"<8,9>": "G5+",
|
||||
"<8,10>": "Char",
|
||||
"<8,11>": "Leakcheck",
|
||||
"<8,12>": "Scrubber"
|
||||
"<8,12>": "Scrubber",
|
||||
"<8,13>": "Packer"
|
||||
},
|
||||
"<9>": {
|
||||
"<9,1>": {
|
||||
@ -80,7 +81,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
|
||||
|
||||
|
240
LSL2/STPROC/ARCHIVE_ACTIONS.txt
Normal file
240
LSL2/STPROC/ARCHIVE_ACTIONS.txt
Normal file
@ -0,0 +1,240 @@
|
||||
Function ARCHIVE_Actions(Action, CalcColName, FSList, Handle, Name, FMC, Record, Status, OrigRecord, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)
|
||||
/***********************************************************************************************************************
|
||||
|
||||
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.
|
||||
|
||||
Name : RDS_Actions
|
||||
|
||||
Description : Handles calculated columns and MFS calls for the current table.
|
||||
|
||||
Notes : This function uses @ID, @RECORD, and @DICT to make sure {ColumnName} references work correctly.
|
||||
If called from outside of a calculated column these will need to be set and restored.
|
||||
|
||||
Parameters :
|
||||
Action [in] -- Name of the action to be taken
|
||||
CalcColName [in] -- Name of the calculated column that needs to be processed. Normally this should only be
|
||||
populated when the CalcField action is being used.
|
||||
FSList [in] -- The list of MFSs and the BFS name for the current file or volume. This is an @SVM
|
||||
delimited array, with the current MFS name as the first value in the array, and the BFS
|
||||
name as the last value. Normally set by a calling MFS.
|
||||
Handle [in] -- The file handle of the file or media map being accessed. Note, this does contain the
|
||||
entire handle structure that the Basic+ Open statement would provide. Normally set by a
|
||||
calling MFS.
|
||||
Name [in] -- The name (key) of the record or file being accessed. Normally set by a calling MFS.
|
||||
FMC [in] -- Various functions. Normally set by a calling MFS.
|
||||
Record [in] -- The entire record (for record-oriented functions) or a newly-created handle (for
|
||||
"get handle" functions). Normally set by a calling MFS.
|
||||
Status [in/out] -- Indicator of the success or failure of an action. Normally set by the calling MFS but
|
||||
for some actions can be set by the action handler to indicate failure.
|
||||
OrigRecord [in] -- Original content of the record being processed by the current action. This is
|
||||
automatically being assigned by the WRITE_RECORD and DELETE_RECORD actions within
|
||||
BASE_MFS.
|
||||
Param1-10 [in/out] -- Additional request parameter holders
|
||||
ActionFlow [out] -- Used to control the action chain (see the ACTION_SETUP insert for more information.)
|
||||
Can also be used to return a special value, such as the results of the CalcField
|
||||
method.
|
||||
|
||||
History : (Date, Initials, Notes)
|
||||
04/10/18 dmb Original programmer.
|
||||
10/04/18 djs Added a trigger within the WRITE_RECORD event, which fires when the reactor number has
|
||||
changed. When this occurs the related RDS_LAYER records for this RDS record are populated
|
||||
with the most recent associated TOOL_PARMS record. (related by PSN and Reactor)
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$Insert FILE.SYSTEM.EQUATES
|
||||
$Insert ACTION_SETUP
|
||||
$Insert RLIST_EQUATES
|
||||
$Insert APP_INSERTS
|
||||
$Insert IFX_EQUATES
|
||||
$Insert ARCHIVE_EQUATES
|
||||
|
||||
Equ COMMA$ to ','
|
||||
|
||||
Declare function Error_Services, Database_Services, obj_RDS_Test, Logging_Services, Environment_Services
|
||||
Declare function Tool_Parms_Services, Signature_Services, obj_WO_Mat_QA, Datetime, Override_Services
|
||||
Declare function Rds_Services, SRP_DateTime, SRP_Math, obj_WO_Mat, Lot_Services, SRP_Array
|
||||
Declare function Lot_Event_Services, GetTickCount, Work_Order_Services, Archive_Services
|
||||
Declare subroutine Error_Services, Database_Services, Logging_Services, Service_Services, obj_WO_React
|
||||
Declare Subroutine Mona_Services
|
||||
|
||||
If KeyID then GoSub Initialize_System_Variables
|
||||
|
||||
Begin Case
|
||||
|
||||
Case Action _EQC 'CalculateColumn' ; GoSub CalculateColumn
|
||||
Case Action _EQC 'READ_RECORD_PRE' ; GoSub READ_RECORD_PRE
|
||||
Case Action _EQC 'READ_RECORD' ; GoSub READ_RECORD
|
||||
Case Action _EQC 'READONLY_RECORD_PRE' ; GoSub READONLY_RECORD_PRE
|
||||
Case Action _EQC 'READONLY_RECORD' ; GoSub READONLY_RECORD
|
||||
Case Action _EQC 'WRITE_RECORD_PRE' ; GoSub WRITE_RECORD_PRE
|
||||
Case Action _EQC 'WRITE_RECORD' ; GoSub WRITE_RECORD
|
||||
Case Action _EQC 'DELETE_RECORD_PRE' ; GoSub DELETE_RECORD_PRE
|
||||
Case Action _EQC 'DELETE_RECORD' ; GoSub DELETE_RECORD
|
||||
Case Otherwise$ ; Status = 'Invalid Action'
|
||||
|
||||
End Case
|
||||
|
||||
If KeyID then GoSub Restore_System_Variables
|
||||
|
||||
If Assigned(ActionFlow) else ActionFlow = ACTION_CONTINUE$
|
||||
|
||||
Return ActionFlow
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Calculated Columns
|
||||
//
|
||||
// The typical structure of a calculated column will look like this:
|
||||
//
|
||||
// Declare function Database_Services
|
||||
//
|
||||
// @ANS = Database_Services('CalculateColumn')
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
CalculateColumn:
|
||||
|
||||
// Make sure the ActionFlow return variable is cleared in case nothing is calculated.
|
||||
ActionFlow = ''
|
||||
|
||||
return
|
||||
|
||||
// ----- MFS calls -----------------------------------------------------------------------------------------------------
|
||||
|
||||
READ_RECORD_PRE:
|
||||
// In order to stop a record from being read in this action these lines of code must be used:
|
||||
//
|
||||
// OrigFileError = 100 : @FM : KeyID
|
||||
// Status = 0
|
||||
// Record = ''
|
||||
// ActionFlow = ACTION_STOP$
|
||||
|
||||
* This code prevents an anomaly where an @SVM appears when the value is read
|
||||
* and causes an error when copying the record to SQL.
|
||||
|
||||
return
|
||||
|
||||
READ_RECORD:
|
||||
|
||||
// In order to stop a record from being read in this action these lines of code must be used:
|
||||
//
|
||||
// OrigFileError = 100 : @FM : KeyID
|
||||
// Status = 0
|
||||
// Record = ''
|
||||
|
||||
return
|
||||
|
||||
|
||||
READONLY_RECORD_PRE:
|
||||
// In order to stop a record from being read in this action these lines of code must be used:
|
||||
//
|
||||
// OrigFileError = 100 : @FM : KeyID
|
||||
// Status = 0
|
||||
// Record = ''
|
||||
// ActionFlow = ACTION_STOP$
|
||||
return
|
||||
|
||||
|
||||
READONLY_RECORD:
|
||||
// In order to stop a record from being read in this action these lines of code must be used:
|
||||
//
|
||||
// OrigFileError = 100 : @FM : KeyID
|
||||
// Status = 0
|
||||
// Record = ''
|
||||
|
||||
return
|
||||
|
||||
WRITE_RECORD_PRE:
|
||||
|
||||
|
||||
return
|
||||
|
||||
|
||||
WRITE_RECORD:
|
||||
|
||||
return
|
||||
|
||||
|
||||
DELETE_RECORD_PRE:
|
||||
|
||||
ActionFlow = ACTION_STOP$
|
||||
|
||||
return
|
||||
|
||||
|
||||
DELETE_RECORD:
|
||||
|
||||
ActionFlow = ACTION_STOP$
|
||||
|
||||
return
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
ClearCursors:
|
||||
For counter = 0 to 8
|
||||
ClearSelect counter
|
||||
Next counter
|
||||
return
|
||||
|
||||
|
||||
Initialize_System_Variables:
|
||||
|
||||
// Save these for restoration later
|
||||
SaveDict = @DICT
|
||||
SaveID = @ID
|
||||
SaveRecord = @RECORD
|
||||
OrigFileError = @FILE.ERROR
|
||||
|
||||
// Now make sure @DICT, ID, and @RECORD are populated
|
||||
CurrentDictName = ''
|
||||
If @DICT then
|
||||
DictHandle = @DICT<1, 2>
|
||||
Locate DictHandle in @TABLES(5) Using @FM Setting fPos then
|
||||
CurrentDictName = Field(@TABLES(0), @FM, fPos, 1)
|
||||
end
|
||||
end
|
||||
|
||||
If CurrentDictName NE DictName then
|
||||
Open DictName to @DICT else Status = 'Unable to initialize @DICT'
|
||||
end
|
||||
|
||||
@ID = KeyID
|
||||
If Record else
|
||||
// Record might not have been passed in. Read the record from the database table just to make sure.
|
||||
@FILE.ERROR = ''
|
||||
Open TableName to hTable then
|
||||
FullFSList = hTable[1, 'F' : @VM]
|
||||
BFS = FullFSList[-1, 'B' : @SVM]
|
||||
LastHandle = hTable[-1, 'B' : \0D\]
|
||||
FileHandle = \0D\ : LastHandle[1, @VM]
|
||||
|
||||
Call @BFS(READO.RECORD, BFS, FileHandle, KeyID, FMC, Record, ReadOStatus)
|
||||
end
|
||||
end
|
||||
@RECORD = Record
|
||||
|
||||
return
|
||||
|
||||
|
||||
Restore_System_Variables:
|
||||
|
||||
Transfer SaveDict to @DICT
|
||||
Transfer SaveID to @ID
|
||||
Transfer SaveRecord to @RECORD
|
||||
@FILE.ERROR = OrigFileError
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
238
LSL2/STPROC/ARCHIVE_API.txt
Normal file
238
LSL2/STPROC/ARCHIVE_API.txt
Normal file
@ -0,0 +1,238 @@
|
||||
Function Archive_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 : Archive_API
|
||||
|
||||
Description : API logic for the Archive 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 Archive[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Archive.POST
|
||||
- Archive.ID.PUT
|
||||
- Archive.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)
|
||||
10/10/25 xxx Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert API_SETUP
|
||||
$insert HTTP_INSERTS
|
||||
$insert SRPJSONX
|
||||
|
||||
Declare Function OI_WIZARD_SERVICES, ARCHIVE_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 archive.HEAD
|
||||
API archive.GET
|
||||
|
||||
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
|
||||
ArchiveIds = Archive_Services('GetAllArchiveIDs')
|
||||
ArchiveListJson = ''
|
||||
GoSub GenerateArchiveListJson
|
||||
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||
HTTP_Services('SetResponseBody', ArchiveListJson, False$, 'application/hal+json')
|
||||
If Assigned(Message) then
|
||||
HTTP_Services('SetResponseStatus', 201, Message)
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 201)
|
||||
end
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 401, 'Invalid session. Reauthentication required.')
|
||||
end
|
||||
|
||||
end api
|
||||
|
||||
|
||||
API archive.getarchive.HEAD
|
||||
API archive.getarchive.GET
|
||||
|
||||
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
|
||||
ArchiveId = Http_Services('GetQueryField', 'ArchiveId')
|
||||
ArchiveJson = Archive_Services('ConvertArchiveRecordToJson', ArchiveId)
|
||||
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||
HTTP_Services('SetResponseBody', ArchiveJson, False$, 'application/hal+json')
|
||||
If Assigned(Message) then
|
||||
HTTP_Services('SetResponseStatus', 201, Message)
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 201)
|
||||
end
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 401, 'Invalid session. Reauthentication required.')
|
||||
end
|
||||
|
||||
|
||||
end api
|
||||
|
||||
|
||||
API archive.findarchivebyrecord.HEAD
|
||||
API archive.findarchivebyrecord.GET
|
||||
|
||||
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
|
||||
|
||||
Table = Http_Services('GetQueryField', 'Table')
|
||||
RecordId = Http_Services('GetQueryField', 'RecordId')
|
||||
ArchiveIds = Archive_Services('GetArchiveIDsByRecord', RecordId, Table)
|
||||
|
||||
SRP_JsonX_Begin('JSON', '{')
|
||||
SRP_JsonX('ArchiveRecords','[')
|
||||
for each ArchiveId in ArchiveIds using @FM
|
||||
ThisArchiveJson = Archive_Services('ConvertArchiveRecordToJson', ArchiveId)
|
||||
SRP_JsonX(ThisArchiveJson)
|
||||
Next ArchiveId
|
||||
SRP_JsonX(']')
|
||||
ArchiveJson = SRP_JsonX_End('Pretty')
|
||||
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||
HTTP_Services('SetResponseBody', ArchiveJson, False$, 'application/hal+json')
|
||||
If Assigned(Message) then
|
||||
HTTP_Services('SetResponseStatus', 201, Message)
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 201)
|
||||
end
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 401, 'Invalid session. Reauthentication required.')
|
||||
end
|
||||
|
||||
end api
|
||||
|
||||
|
||||
API archive.findarchivebymetadata.HEAD
|
||||
API archive.findarchivebymetadata.GET
|
||||
|
||||
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
|
||||
MetaDataType = Http_Services('GetQueryField', 'MetaDataType')
|
||||
SearchValues = Http_Services('GetQueryField', 'SearchValue')
|
||||
ArchiveIds = Archive_Services('GetArchiveIDsByMetaData', MetaDataType, SearchValues)
|
||||
|
||||
SRP_JsonX_Begin('JSON', '{')
|
||||
SRP_JsonX('ArchiveRecords','[')
|
||||
for each ArchiveId in ArchiveIds using @FM
|
||||
ThisArchiveJson = Archive_Services('ConvertArchiveRecordToJson', ArchiveId)
|
||||
SRP_JsonX(ThisArchiveJson)
|
||||
Next ArchiveId
|
||||
SRP_JsonX(']')
|
||||
ArchiveJson = SRP_JsonX_End('Pretty')
|
||||
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||
HTTP_Services('SetResponseBody', ArchiveJson, False$, 'application/hal+json')
|
||||
If Assigned(Message) then
|
||||
HTTP_Services('SetResponseStatus', 201, Message)
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 201)
|
||||
end
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 401, 'Invalid session. Reauthentication required.')
|
||||
end
|
||||
|
||||
end api
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
GenerateArchiveListJson:
|
||||
|
||||
If Assigned(ArchiveListJson) AND Assigned(ArchiveIds) then
|
||||
SRP_JsonX_Begin('JSON', '{')
|
||||
SRP_JsonX('Archives', '[')
|
||||
for each ArchiveId in ArchiveIds using @FM
|
||||
ArchiveType = Field(ArchiveId, '*', 1)
|
||||
ArchiveParent = Field(ArchiveId, '*', 2)
|
||||
CreationDtm = Date_Services('ConvertDateTimeToISO8601', XLATE('ARCHIVE', ArchiveId, ARCHIVE_ARCHIVE_CREATION_DTM$, 'X'))
|
||||
RecordCount = DCOUNT(XLATE('ARCHIVE', ArchiveId, ARCHIVE_CHILD_RECORD$, 'X'), @VM)
|
||||
SRP_JsonX('{')
|
||||
SRP_JsonX('ArchiveId', ArchiveId, 'String')
|
||||
SRP_JsonX('ArchiveType', ArchiveType, 'String')
|
||||
SRP_JsonX('ArchiveParent', ArchiveParent, 'String')
|
||||
SRP_JsonX('CreationDtm', CreationDtm, 'String')
|
||||
SRP_JsonX('RecordCount', RecordCount)
|
||||
SRP_JsonX('}')
|
||||
Next ArchiveId
|
||||
SRP_JsonX(']')
|
||||
ArchiveListJson = SRP_JsonX_End('Pretty')
|
||||
end
|
||||
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -211,7 +211,7 @@ Service SendReminders()
|
||||
CalDueRecipients = Xlate('NOTIFICATION', 'CALIB_DUE_NOTIFY', NOTIFICATION_USER_ID$, 'X')
|
||||
|
||||
CheckDt = OConv(Date() + 15, 'D4/')
|
||||
SelectSent = 'SELECT CALIB_LIST WITH NEXT_CAL_DT < ':QUOTE(CheckDt):' BY NEXT_CAL_DT'
|
||||
SelectSent = 'SELECT CALIB_LIST WITH NEXT_CAL_DT < ':QUOTE(CheckDt):' AND WITH EQ_LOC NE "Out of Service" BY NEXT_CAL_DT'
|
||||
RList(SelectSent,TARGET_ACTIVELIST$,'','','')
|
||||
|
||||
NoteText = ''
|
||||
|
@ -696,8 +696,14 @@ PerformQuery:
|
||||
end
|
||||
|
||||
If ErrorMsg EQ '' then
|
||||
WOKeys = SRP_Array('SortSimpleList', WOKeys, 'DescendingNumbers', @VM)
|
||||
End_Dialog(@WINDOW,WOKeys)
|
||||
If WOKeys NE '' then
|
||||
WOKeys = SRP_Array('SortSimpleList', WOKeys, 'DescendingNumbers', @VM)
|
||||
End_Dialog(@WINDOW,WOKeys)
|
||||
end else
|
||||
Def = ''
|
||||
Def<MICON$> = '*'
|
||||
Msg(@Window, Def, 'OK', '', 'Query Results':@FM:'No work orders found')
|
||||
end
|
||||
end else
|
||||
Msg(@Window, '', 'OK', '', 'Process Error':@FM:ErrorMsg)
|
||||
end
|
||||
|
@ -233,13 +233,7 @@ 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
|
||||
@ -384,9 +378,9 @@ 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)
|
||||
@ -1769,21 +1763,7 @@ 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
|
||||
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(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
|
||||
Send_Event(@WINDOW,'WRITE') ;************* 6/30/2010
|
||||
|
||||
FieldNo = WO_MAT_EPO_MAKEUP_BOX$
|
||||
FieldNo = WO_MAT_EPO_MAKEUP_BOX$
|
||||
|
||||
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue)
|
||||
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue)
|
||||
|
||||
IF Get_Status(errCode) THEN ErrMsg(errCode)
|
||||
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)
|
||||
* 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.')
|
||||
@ -966,6 +973,7 @@ end service
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service WriteDataColumn(TableName, KeyID, ColumnNo, Value, IgnoreSelfLock, IgnoreMFSRoutines, IgnoreAllLocks)
|
||||
|
||||
ErrorMsg = ''
|
||||
If TableName NE '' AND KeyID NE '' AND ColumnNo NE '' then
|
||||
|
||||
If ( Num(ColumnNo) and (ColumnNo GT 0) ) then
|
||||
@ -1002,7 +1010,13 @@ Service WriteDataColumn(TableName, KeyID, ColumnNo, Value, IgnoreSelfLock, Ignor
|
||||
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.')
|
||||
|
@ -220,10 +220,17 @@ Service GetWeekNum(InputDate)
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service ConvertDateTimeToISO8601(DatetimeToConv)
|
||||
|
||||
Response = OConv(DatetimeToConv, "[SRP_DATETIME,()YYYY-MM-DD hh:mm:ss.000Z]")
|
||||
swap ' ' with 'T' in Response
|
||||
Response = OConv(DatetimeToConv, "[SRP_DATETIME,()YYYY-MM-DD'T'hh:mm:ss.000Z]")
|
||||
|
||||
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
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
|
133
LSL2/STPROC/DEARCHIVE_API.txt
Normal file
133
LSL2/STPROC/DEARCHIVE_API.txt
Normal file
@ -0,0 +1,133 @@
|
||||
Function Dearchive_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 : Dearchive_API
|
||||
|
||||
Description : API logic for the Dearchive 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 Dearchive[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Dearchive.POST
|
||||
- Dearchive.ID.PUT
|
||||
- Dearchive.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)
|
||||
10/14/25 xxx Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert API_SETUP
|
||||
$insert HTTP_INSERTS
|
||||
$Insert IFX_EQUATES
|
||||
|
||||
Declare subroutine Service_Services, Logging_Services
|
||||
Declare function OI_Wizard_Services, Logging_Services, Environment_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 dearchive.ID.POST
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Archive\DeArchiving'
|
||||
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'
|
||||
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
|
||||
LoggingDTM = LogDate : ' ' : LogTime
|
||||
|
||||
ErrorMsg = ''
|
||||
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
|
||||
ArchiveId = EndpointSegment
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM;
|
||||
LogData<2> = ArchiveId
|
||||
LogData<3> = 'Attempting to add de-archival to the process queue.'
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
|
||||
swap '__' with '*' in ArchiveId
|
||||
If RowExists('ARCHIVE', ArchiveId) then
|
||||
Service_Services('PostProcedure', 'ARCHIVE_SERVICES', 'DeArchiveDataFromTxt':SD$:ArchiveId)
|
||||
If Error_Services('NoError') then
|
||||
Message = 'Successfully queued data for de-archive.'
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM;
|
||||
LogData<2> = ArchiveId
|
||||
LogData<3> = Message
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
|
||||
end else
|
||||
ErrorMsg = 'Error queueing de-archiving.'
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM;
|
||||
LogData<2> = ArchiveId
|
||||
LogData<3> = ErrorMsg
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Archive record not found in database.'
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM;
|
||||
LogData<2> = ArchiveId
|
||||
LogData<3> = ErrorMsg
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
|
||||
end
|
||||
|
||||
If ErrorMsg NE '' then
|
||||
HTTP_Services('SetResponseStatus', 500, ErrorMsg)
|
||||
end else
|
||||
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||
If Assigned(Message) then
|
||||
HTTP_Services('SetResponseStatus', 201, Message)
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 201)
|
||||
end
|
||||
end
|
||||
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 500, 'Invalid session. Reauthentication required.')
|
||||
end
|
||||
|
||||
end api
|
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,14 +80,15 @@ Service GetServer()
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service IsProd()
|
||||
|
||||
Machine = Environment_Services('GetServer')
|
||||
IsProd = False$
|
||||
If Machine _NEC "messa012" and Machine _NEC "mestsa01ec" and Machine _NEC "mestsa09ec" and Machine _NEC "mestsa010ec" and Machine _NEC "mestsa011ec" and Machine _NEC "mestsa012ec" and Machine _NEC "mestsa024ec" and Machine _NEC "MESTST1010" and Machine _NEC "MESTST1009" then
|
||||
IsProd = True$
|
||||
end
|
||||
Response = IsProd
|
||||
Machine = Environment_Services('GetServer')
|
||||
IsProd = False$
|
||||
If Machine _NEC "messa012" and Machine _NEC "mestsa01ec" and Machine _NEC "mestsa09ec" and Machine _NEC "mestsa010ec" and Machine _NEC "mestsa011ec" and Machine _NEC "mestsa012ec" and Machine _NEC "mestsa024ec" and Machine _NEC "MESTST1010" and Machine _NEC "MESTST1009" then
|
||||
IsProd = True$
|
||||
end
|
||||
Response = IsProd
|
||||
|
||||
end service
|
||||
|
||||
@ -117,13 +118,13 @@ Service GetApplicationRootIP()
|
||||
Machine = Environment_Services('GetServer')
|
||||
|
||||
Begin Case
|
||||
Case Machine EQ 'MESSA005' ; ApplicationRootIP = '\\messa005.infineon.com'
|
||||
Case Machine EQ 'MESSA005' ; ApplicationRootIP = '\\messa005.infineon.com'
|
||||
Case Machine EQ 'MESTSA01EC' ; ApplicationRootIP = '\\10.95.140.13'
|
||||
Case Machine EQ 'MESTSA09EC' ; ApplicationRootIP = '\\10.95.140.62'
|
||||
Case Machine EQ 'MESTSA010EC' ; ApplicationRootIP = '\\10.95.140.63'
|
||||
Case Machine EQ 'MESTSA011EC' ; ApplicationRootIP = '\\10.95.140.64'
|
||||
Case Machine EQ 'MESTSA012EC' ; ApplicationRootIP = '\\10.95.140.65'
|
||||
Case Machine EQ 'MESTSA024EC' ; ApplicationRootIP = '\\10.95.140.66'
|
||||
Case Machine EQ 'MESTSA09EC' ; ApplicationRootIP = '\\10.95.140.62'
|
||||
Case Machine EQ 'MESTSA010EC' ; ApplicationRootIP = '\\10.95.140.63'
|
||||
Case Machine EQ 'MESTSA011EC' ; ApplicationRootIP = '\\10.95.140.64'
|
||||
Case Machine EQ 'MESTSA012EC' ; ApplicationRootIP = '\\10.95.140.65'
|
||||
Case Machine EQ 'MESTSA024EC' ; ApplicationRootIP = '\\10.95.140.66'
|
||||
Case Machine EQ 'MESSA012' ; ApplicationRootIP = '\\10.95.176.50'
|
||||
Case Machine EQ 'MESST5201' ; ApplicationRootIP = '\\10.95.140.14'
|
||||
Case Machine EQ 'MESST5202' ; ApplicationRootIP = '\\10.95.140.14'
|
||||
@ -207,15 +208,15 @@ end service
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service GetSpcFilesharePath()
|
||||
|
||||
IsProd = Environment_Services("IsProd")
|
||||
IsProd = Environment_Services("IsProd")
|
||||
|
||||
If IsProd EQ True$ then
|
||||
Response = '\\mesfs.infineon.com\EC_SPC_Si_Import\TXT'
|
||||
end else
|
||||
Path = Environment_Services('GetApplicationRootPath'):'\SPC_Data'
|
||||
MakeDirSuccess = Utility("MAKEDIR", Path)
|
||||
Response = Path
|
||||
end
|
||||
If IsProd EQ True$ then
|
||||
Response = '\\mesfs.infineon.com\EC_SPC_Si_Import\TXT'
|
||||
end else
|
||||
Path = Environment_Services('GetApplicationRootPath'):'\SPC_Data'
|
||||
MakeDirSuccess = Utility("MAKEDIR", Path)
|
||||
Response = Path
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
@ -227,15 +228,15 @@ end service
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service GetSPCDataPath()
|
||||
|
||||
IsProd = Environment_Services("IsProd")
|
||||
IsProd = Environment_Services("IsProd")
|
||||
|
||||
If IsProd EQ True$ then
|
||||
Response = '\\messa04ec.infineon.com\OI_SPC_Data_Transfer'
|
||||
end else
|
||||
Path = Environment_Services('GetApplicationRootPath'):'\SPC_Data'
|
||||
MakeDirSuccess = Utility("MAKEDIR", Path)
|
||||
Response = Path
|
||||
end
|
||||
If IsProd EQ True$ then
|
||||
Response = '\\messa04ec.infineon.com\OI_SPC_Data_Transfer'
|
||||
end else
|
||||
Path = Environment_Services('GetApplicationRootPath'):'\SPC_Data'
|
||||
MakeDirSuccess = Utility("MAKEDIR", Path)
|
||||
Response = Path
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
@ -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
|
||||
//
|
||||
@ -322,11 +344,11 @@ Service GetLocalRootPath()
|
||||
Case Machine EQ 'MESSA012' ; LocalRootPath = 'D:'
|
||||
Case Machine EQ 'MESSA01EC' ; LocalRootPath = 'D:'
|
||||
Case Machine EQ 'MESTSA01EC' ; LocalRootPath = 'D:'
|
||||
Case Machine EQ 'MESTSA09EC' ; LocalRootPath = 'D:'
|
||||
Case Machine EQ 'MESTSA010EC' ; LocalRootPath = 'D:'
|
||||
Case Machine EQ 'MESTSA011EC' ; LocalRootPath = 'D:'
|
||||
Case Machine EQ 'MESTSA012EC' ; LocalRootPath = 'D:'
|
||||
Case Machine EQ 'MESTSA024EC' ; LocalRootPath = 'D:'
|
||||
Case Machine EQ 'MESTSA09EC' ; LocalRootPath = 'D:'
|
||||
Case Machine EQ 'MESTSA010EC' ; LocalRootPath = 'D:'
|
||||
Case Machine EQ 'MESTSA011EC' ; LocalRootPath = 'D:'
|
||||
Case Machine EQ 'MESTSA012EC' ; LocalRootPath = 'D:'
|
||||
Case Machine EQ 'MESTSA024EC' ; LocalRootPath = 'D:'
|
||||
Case Machine EQ 'MESST6501' ; LocalRootPath = 'C:' ; // This is a map to the user's actual C drive.
|
||||
Case Machine EQ 'MESST6502' ; LocalRootPath = 'C:' ; // This is a map to the user's actual C drive.
|
||||
Case Machine EQ 'MESTST1006' ; LocalRootPath = 'C:' ; // This is a map to the user's actual C drive.
|
||||
@ -456,19 +478,19 @@ end service
|
||||
|
||||
Service GetSQLScrapeConnectionString()
|
||||
|
||||
Machine = Environment_Services('GetServer')
|
||||
Begin Case
|
||||
Case Machine = 'MESSA01EC'
|
||||
// PROD SQL Servers
|
||||
ConnectionString = 'Provider=MSOLEDBSQL.1;Password=0okm9ijn;Persist Security Info=True;User ID=srpadmin;Initial Catalog=LSL2SQL;Data Source=MESSQLEC1.infineon.com\PROD1,53959;Initial File Name="";Trust Server Certificate=True;Server SPN="";Authentication="";Access Token=""'
|
||||
Case ( (Machine = 'MESTSA01EC') or (Machine = 'MESTSA09EC') or (Machine = 'MESTSA010EC') or (Machine = 'MESTSA011EC') or (Machine = 'MESTSA012EC') )
|
||||
// DEV SQL Servers
|
||||
Machine = Environment_Services('GetServer')
|
||||
Begin Case
|
||||
Case Machine = 'MESSA01EC'
|
||||
// PROD SQL Servers
|
||||
ConnectionString = 'Provider=MSOLEDBSQL.1;Password=0okm9ijn;Persist Security Info=True;User ID=srpadmin;Initial Catalog=LSL2SQL;Data Source=MESSQLEC1.infineon.com\PROD1,53959;Initial File Name="";Trust Server Certificate=True;Server SPN="";Authentication="";Access Token=""'
|
||||
Case ( (Machine = 'MESTSA01EC') or (Machine = 'MESTSA09EC') or (Machine = 'MESTSA010EC') or (Machine = 'MESTSA011EC') or (Machine = 'MESTSA012EC') )
|
||||
// DEV SQL Servers
|
||||
ConnectionString = 'Provider=MSOLEDBSQL.1;Password=Fisql2023!;Persist Security Info=True;User ID=fisql;Initial Catalog=LSL2SQL;Data Source=10.95.140.27\TEST1,50572;Initial File Name="";Trust Server Certificate=True;Server SPN="";Authentication="";Access Token=""'
|
||||
Case Otherwise$
|
||||
// Default to DEV SQL Servers just in case
|
||||
ConnectionString = 'Provider=MSOLEDBSQL.1;Password=Fisql2023!;Persist Security Info=True;User ID=fisql;Initial Catalog=LSL2SQL;Data Source=10.95.140.27\TEST1,50572;Initial File Name="";Trust Server Certificate=True;Server SPN="";Authentication="";Access Token=""'
|
||||
End Case
|
||||
Response = ConnectionString
|
||||
Case Otherwise$
|
||||
// Default to DEV SQL Servers just in case
|
||||
ConnectionString = 'Provider=MSOLEDBSQL.1;Password=Fisql2023!;Persist Security Info=True;User ID=fisql;Initial Catalog=LSL2SQL;Data Source=10.95.140.27\TEST1,50572;Initial File Name="";Trust Server Certificate=True;Server SPN="";Authentication="";Access Token=""'
|
||||
End Case
|
||||
Response = ConnectionString
|
||||
|
||||
end service
|
||||
|
||||
@ -493,65 +515,65 @@ end service
|
||||
|
||||
Service GetTempPath()
|
||||
|
||||
TempDirectory = Str(\00\, 1024)
|
||||
GetTempPath(Len(TempDirectory), TempDirectory)
|
||||
Convert \00\ to '' in TempDirectory
|
||||
Response = TempDirectory
|
||||
TempDirectory = Str(\00\, 1024)
|
||||
GetTempPath(Len(TempDirectory), TempDirectory)
|
||||
Convert \00\ to '' in TempDirectory
|
||||
Response = TempDirectory
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service GetMonaResource()
|
||||
|
||||
If Environment_Services("IsProd") then
|
||||
Response = "OPENINSIGHT_MES_OP_FE"
|
||||
end else
|
||||
Response = "OPENINSIGHT_MES_OP_FE_DEV"
|
||||
end
|
||||
If Environment_Services("IsProd") then
|
||||
Response = "OPENINSIGHT_MES_OP_FE"
|
||||
end else
|
||||
Response = "OPENINSIGHT_MES_OP_FE_DEV"
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service GetMonInBufferedWorkerApiUrl()
|
||||
|
||||
If Environment_Services("IsProd") then
|
||||
Response = "https://messa014.infineon.com:7851"
|
||||
end else
|
||||
Response = "https://mestsa008.infineon.com:7851"
|
||||
end
|
||||
If Environment_Services("IsProd") then
|
||||
Response = "https://messa014.infineon.com:7851"
|
||||
end else
|
||||
Response = "https://mestsa008.infineon.com:7851"
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service GetProveInApiUrl()
|
||||
|
||||
If Environment_Services("IsProd") then
|
||||
Response = "https://messa014.infineon.com:8851"
|
||||
end else
|
||||
Response = "https://mestsa008.infineon.com:8851"
|
||||
end
|
||||
If Environment_Services("IsProd") then
|
||||
Response = "https://messa014.infineon.com:8851"
|
||||
end else
|
||||
Response = "https://mestsa008.infineon.com:8851"
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service GetIfxEmailServer()
|
||||
|
||||
Response = 'smtp.intra.infineon.com'
|
||||
Response = 'smtp.intra.infineon.com'
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service GetEnvironmentVariable(VariableName)
|
||||
|
||||
If VariableName NE '' then
|
||||
VarLength = GetEnvironmentVariable(VariableName, "", 0) + 1
|
||||
VarValue = space(VarLength+1)
|
||||
VarLength = GetEnvironmentVariable(VariableName, VarValue, VarLength)
|
||||
VarValue = VarValue[1, VarLength]
|
||||
Response = VarValue
|
||||
end else
|
||||
Error_Services('Add', 'Error in service ':Service:'. Null VariableName passed in')
|
||||
end
|
||||
If VariableName NE '' then
|
||||
VarLength = GetEnvironmentVariable(VariableName, "", 0) + 1
|
||||
VarValue = space(VarLength+1)
|
||||
VarLength = GetEnvironmentVariable(VariableName, VarValue, VarLength)
|
||||
VarValue = VarValue[1, VarLength]
|
||||
Response = VarValue
|
||||
end else
|
||||
Error_Services('Add', 'Error in service ':Service:'. Null VariableName passed in')
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
@ -579,7 +601,28 @@ Service GetScrapeServerPort()
|
||||
|
||||
end service
|
||||
|
||||
Service GetTextDataBackupRootDir()
|
||||
|
||||
Machine = Environment_Services('GetServer')
|
||||
DataBackupDir = ''
|
||||
|
||||
Begin Case
|
||||
Case Machine = 'MESSA01EC'
|
||||
// PROD SQL Servers
|
||||
DataBackupDir = '\\MESFS.INFINEON.COM\MES_OpenInsight_Backups\DataBackups\'
|
||||
Case ( (Machine = 'MESTSA01EC') or (Machine = 'MESTSA09EC') or (Machine = 'MESTSA010EC') or (Machine = 'MESTSA011EC') or (Machine = 'MESTSA012EC') )
|
||||
// DEV SQL Servers
|
||||
DataBackupDir = 'd:\MES_OpenInsight_Backups\DataBackups\'
|
||||
Case Otherwise$
|
||||
// Default to DEV SQL Servers just in case
|
||||
DataBackupDir = 'd:\MES_OpenInsight_Backups\DataBackups\'
|
||||
End Case
|
||||
Response = DataBackupDir
|
||||
|
||||
end service
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
@ -425,6 +425,38 @@ Service PrintReactorLabel(ReactNo, LoadLockSide=LOAD_LOCK_SIDE)
|
||||
end service
|
||||
|
||||
|
||||
Service GetReactorLabelZPL(ReactNo, LoadLockSide=LOAD_LOCK_SIDE)
|
||||
|
||||
If ( (ReactNo NE '') and (LoadLockSide NE '') ) then
|
||||
BaseZpl = '^XA^MD30^PR1^LH10,10^FO35,5^BY2^B3N,,80,N^FD10SR{ReactNo}.{LoadLockSidePrefix}^FS^FO10,105^A045,90^FB400,1,,C^FDR{ReactNo} {LoadLockSide}^FS^XZ'
|
||||
Convert 'R' to '' in ReactNo
|
||||
If LoadLockSide _EQC 'Both' then
|
||||
LoadLockSidePrefix = 'L'
|
||||
ZplLeft = BaseZpl
|
||||
Swap '{ReactNo}' with ReactNo in ZplLeft
|
||||
Swap '{LoadLockSidePrefix}' with LoadLockSidePrefix in ZplLeft
|
||||
Swap '{LoadLockSide}' with 'Left' in ZplLeft
|
||||
ZplRight = BaseZpl
|
||||
LoadLockSidePrefix = 'R'
|
||||
Swap '{ReactNo}' with ReactNo in ZplRight
|
||||
Swap '{LoadLockSidePrefix}' with LoadLockSidePrefix in ZplRight
|
||||
Swap '{LoadLockSide}' with 'Right' in ZplRight
|
||||
Zpl = ZplLeft:ZplRight
|
||||
end else
|
||||
LoadLockSidePrefix = LoadLockSide[1, 1]
|
||||
Zpl = BaseZpl
|
||||
Swap '{ReactNo}' with ReactNo in Zpl
|
||||
Swap '{LoadLockSidePrefix}' with LoadLockSidePrefix in Zpl
|
||||
Swap '{LoadLockSide}' with LoadLockSide in Zpl
|
||||
end
|
||||
Response = Zpl
|
||||
end else
|
||||
Error_Services('Add', 'Error in ':Service:' service. Null ReactNo or LoadLockSide passed in.')
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service GetReturnToFabLabelZPL(RTFId)
|
||||
|
||||
ZPLStringLabel = ''
|
||||
@ -460,5 +492,3 @@ Service GetReturnToFabLabelZPL(RTFId)
|
||||
|
||||
end service
|
||||
|
||||
|
||||
|
||||
|
@ -111,7 +111,6 @@ API Lock.HEAD
|
||||
|
||||
|
||||
API Lock.POST
|
||||
|
||||
OIWizardID = ''
|
||||
Cookies = HTTP_Services('GetHTTPCookie')
|
||||
For each Cookie in Cookies using ';'
|
||||
|
@ -326,7 +326,7 @@ Service CreateNewLot(LotType, ProdName, LotQty, VendorPartNo, VendorLotNo, Vendo
|
||||
Lot_Services('OpenLot', CreatedLotNumber)
|
||||
if Error_Services('NoError') then
|
||||
// Move lot in
|
||||
Lot_Services('MoveInLot', CreatedLotNumber, Username)
|
||||
Lot_Services('StartLot', CreatedLotNumber, 'SYSTEM')
|
||||
if Error_Services('NoError') then
|
||||
If PrinterID NE 'WEB' then
|
||||
// If PrinterID is set to WEB this means the request comes from OI_Wizard and the client is going to handle printing.
|
||||
@ -792,6 +792,33 @@ Service IsLotMovedIn(LotId)
|
||||
|
||||
end service
|
||||
|
||||
Service IsLastOperation(LotId, LotOperationId)
|
||||
|
||||
ErrorMsg = ''
|
||||
Response = False$
|
||||
|
||||
If LotId NE '' then
|
||||
If LotOperationId NE '' then
|
||||
AllOpsInSeq = Lot_Services('GetLotOperationSequence', LotId)
|
||||
if Error_Services('NoError') then
|
||||
LastLotOperation = AllOpsInSeq[-1, "B":@FM]
|
||||
If LotOperationId EQ LastLotOperation then Response = True$
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'LotOperationId was null.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'LotId was null.'
|
||||
end
|
||||
|
||||
If ErrorMsg NE '' then
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service IsOperationCompleted(LotOperationId)
|
||||
|
||||
@ -819,8 +846,14 @@ Service StartLot(LotId, Operator)
|
||||
If RowExists('LOT', LotId) then
|
||||
Lot_Event_Services('CreateLotEvent', LotId, Datetime(), 'LOT_START', 'Lot started.', '', Operator)
|
||||
If Error_Services('NoError') then
|
||||
Lot_Services('MoveInLot', LotId, Operator)
|
||||
If Error_Services('HasError') then ErrorMessage = Error_Services('GetMessage')
|
||||
CurrOperation = Lot_Services('GetLotCurrOperationName', LotId)
|
||||
Lot_Event_Services('CreateLotEvent', LotId, Datetime(), 'ARRIVAL', 'Lot arrived at operation ' : CurrOperation : '.', '', Operator)
|
||||
if Error_Services('NoError') then
|
||||
Lot_Services('MoveInLot', LotId, Operator)
|
||||
If Error_Services('HasError') then ErrorMessage = Error_Services('GetMessage')
|
||||
end else
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
@ -958,12 +991,7 @@ Service MoveInLot(LotID, Operator)
|
||||
CurrOperation = XLATE('LOT_OPERATION', ThisLotCurrOperationID, LOT_OPERATION_OPERATION_ID$, 'X')
|
||||
If Error_Services('NoError') then
|
||||
Lot_Event_Services('CreateLotEvent', LotId, Datetime(), 'MOVE_IN', 'Lot moved into operation ' : CurrOperation : '.', '', Operator)
|
||||
If Error_Services('NoError') then
|
||||
Lot_Event_Services('CreateLotEvent', LotId, Datetime(), 'ARRIVAL', 'Lot arrived at operation ' : CurrOperation : '.', '', Operator)
|
||||
If Error_Services('HasError') then ErrorMessage = Error_Services('GetMessage')
|
||||
end else
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
If Error_Services('HasError') then ErrorMessage = Error_Services('GetMessage')
|
||||
end else
|
||||
ErrorMessage = 'Error in Move In process for Lot id ' : LotId : '. ' : Error_Services('GetMessage')
|
||||
end
|
||||
@ -1018,6 +1046,7 @@ Service MoveOutLot(LotID, Operator)
|
||||
WaferQty = ThisLotRec<LOT_WAFER_QTY$>
|
||||
If Error_Services('NoError') then
|
||||
ThisLotCurrOperationID = Lot_Services('GetLotCurrOperationId', LotId)
|
||||
ThisLotCurrOperationName = XLATE('LOT_OPERATION', ThisLotCurrOperationID, LOT_OPERATION_OPERATION_ID$, 'X')
|
||||
If ThisLotCurrOperationID NE '' then
|
||||
If Lot_Services('IsLotMovedIn', LotId) then
|
||||
ThisLotCurrOperationRec = Database_Services('ReadDataRow', 'LOT_OPERATION', ThisLotCurrOperationID)
|
||||
@ -1029,7 +1058,23 @@ Service MoveOutLot(LotID, Operator)
|
||||
LotType = XLATE('LOT', LotId, LOT_TYPE$, 'X')
|
||||
CurrOperation = XLATE('LOT_OPERATION', ThisLotCurrOperationID, LOT_OPERATION_OPERATION_ID$, 'X')
|
||||
If Error_Services('NoError') then
|
||||
Lot_Event_Services('CreateLotEvent', LotId, Datetime(), 'MOVE_OUT', 'Lot moved out of operation ' : CurrOperation : '.', '', Operator)
|
||||
IsLastLotOp = Lot_Services('IsLastOperation', LotId, ThisLotCurrOperationID)
|
||||
if Error_Services('NoError') then
|
||||
Lot_Event_Services('CreateLotEvent', LotId, Datetime(), 'MOVE_OUT', 'Lot moved out of operation ' : ThisLotCurrOperationName : '.', '', Operator)
|
||||
If Error_Services('NoError') then
|
||||
If Not(IsLastLotOp) then
|
||||
NewCurrOperation = Lot_Services('GetLotCurrOperationName', LotId)
|
||||
Lot_Event_Services('CreateLotEvent', LotId, Datetime(), 'ARRIVAL', 'Lot arrived at operation ' : NewCurrOperation : '.', '', Operator)
|
||||
end else
|
||||
Lot_Services('CloseLot', LotId)
|
||||
if Error_Services('HasError') then
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMessage = 'Error in Move In process for Lot id ' : LotId : '. ' : Error_Services('GetMessage')
|
||||
end
|
||||
@ -1229,9 +1274,7 @@ Service OpenLot(LotId)
|
||||
LotRec = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$)
|
||||
LotRec<LOT_OPEN$> = True$
|
||||
Database_Services('WriteDataRow', 'LOT', LotId, LotRec, True$, False$, False$)
|
||||
If Error_Services('NoError') then
|
||||
Lot_Event_Services('CreateLotEvent', LotId, Datetime(), 'LOT_START', 'Lot created.', '', 'SYSTEM')
|
||||
end else
|
||||
If Error_Services('HasError') then
|
||||
ErrorMessage = 'Error setting lot ' : LotId : ' to open.' : Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
@ -1272,51 +1315,39 @@ Service CloseLot(LotId)
|
||||
end service
|
||||
|
||||
|
||||
Service AutoCloseTestWaferLot(LotId, CloseUserId)
|
||||
Service AutoCloseLot(LotId, CloseUserId)
|
||||
|
||||
AutoCloseTime = Datetime()
|
||||
ErrorMessage = ''
|
||||
If MemberOf(CloseUserId, 'LEAD') OR MemberOf(CloseUserId, 'SUPERVISOR') OR CloseUserId EQ 'SYSTEM' then
|
||||
LotOperations = Lot_Services('GetLotOperationSequence', LotId)
|
||||
for LotOperationIndex = 1 to DCount(LotOperations, @FM)
|
||||
Until ErrorMessage NE ''
|
||||
ThisLotOperationId = LotOperations<LotOperationIndex>
|
||||
ThisOperationCompleted = Lot_Services('IsOperationCompleted', ThisLotOperationId)
|
||||
If Error_Services('NoError') then
|
||||
if Not(ThisOperationCompleted) then
|
||||
ThisLotOperationRec = Database_Services('ReadDataRow', 'LOT_OPERATION', ThisLotOperationId)
|
||||
if Error_Services('NoError') then
|
||||
CurrLotQty = Database_Services('ReadDataColumn', 'LOT', LotId, LOT_WAFER_QTY$, True$, 0, False$)
|
||||
If ThisLotOperationRec<LOT_OPERATION_DATETIME_IN$> EQ '' then
|
||||
ThisLotOperationRec<LOT_OPERATION_DATETIME_IN$> = AutoCloseTime
|
||||
end
|
||||
If ThisLotOperationRec<LOT_OPERATION_DATETIME_OUT$> EQ '' then
|
||||
ThisLotOperationRec<LOT_OPERATION_DATETIME_OUT$> = AutoCloseTime
|
||||
end
|
||||
if ThisLotOperationRec<LOT_OPERATION_OPERATOR_IN_ID$> EQ '' then
|
||||
ThisLotOperationRec<LOT_OPERATION_OPERATOR_IN_ID$> = CloseUserId
|
||||
end
|
||||
if ThisLotOperationRec<LOT_OPERATION_OPERATOR_OUT_ID$> EQ '' then
|
||||
ThisLotOperationRec<LOT_OPERATION_OPERATOR_OUT_ID$> = CloseUserId
|
||||
end
|
||||
if ThisLotOperationRec<LOT_OPERATION_DATETIME_START$> EQ '' then
|
||||
ThisLotOperationRec<LOT_OPERATION_DATETIME_START$> = AutoCloseTime
|
||||
end
|
||||
if ThisLotOperationRec<LOT_OPERATION_DATETIME_STOP$> EQ '' then
|
||||
ThisLotOperationRec<LOT_OPERATION_DATETIME_STOP$> = AutoCloseTime
|
||||
end
|
||||
If ThisLotOperationRec<LOT_OPERATION_WAFER_IN_QTY$> EQ '' then
|
||||
ThisLotOperationRec<LOT_OPERATION_WAFER_IN_QTY$> = CurrLotQty
|
||||
end
|
||||
If ThisLotOperationRec<LOT_OPERATION_WAFER_OUT_QTY$> EQ '' then
|
||||
ThisLotOperationRec<LOT_OPERATION_WAFER_OUT_QTY$> = CurrLotQty
|
||||
end
|
||||
Database_Services('WriteDataRow', 'LOT_OPERATION', ThisLotOperationId, ThisLotOperationRec, True$, False$, False$)
|
||||
If Error_Services('HasError') then
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
MovedIn = Lot_Services('IsLotMovedIn', LotId)
|
||||
If MovedIn then
|
||||
Lot_Services('MoveOutLot', LotId, CloseUserId)
|
||||
If Error_Services('HasError') then
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end else
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
Lot_Services('MoveInLot', LotId, CloseUserId)
|
||||
If Error_Services('NoError') then
|
||||
If Lot_Services('IsLastOperation', LotId, ThisLotOperationId) then
|
||||
Lot_Services('MoveOutLot', LotId, CloseUserId)
|
||||
If Error_Services('HasError') then
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
@ -1326,31 +1357,12 @@ Service AutoCloseTestWaferLot(LotId, CloseUserId)
|
||||
ErrorMessage = CloseUserId : ' does not have permission to close this lot.'
|
||||
end
|
||||
If ErrorMessage EQ '' then
|
||||
// Close Lot as there were no validation failures.
|
||||
Lot_Services('CloseLot', LotId)
|
||||
If Error_Services('NoError') then
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = LotId
|
||||
LogData<3> = CloseUserId
|
||||
LogData<4> = 'Successfully marked lot as closed.'
|
||||
Logging_Services('AppendLog', objLotClosureLog, LogData, @RM, @FM, False$)
|
||||
end else
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = LotId
|
||||
LogData<3> = CloseUserId
|
||||
LogData<4> = 'Error marking lot as closed.' : ErrorMessage
|
||||
Logging_Services('AppendLog', objLotClosureLog, LogData, @RM, @FM, False$)
|
||||
// Send a message to FI
|
||||
Recipients = Xlate('NOTIFICATION', 'FI_SUPPORT', NOTIFICATION_USER_ID$, 'X')
|
||||
SentFrom = 'SYSTEM'
|
||||
Subject = 'TEST WAFER LOT AUTO-CLOSURE FAILURE'
|
||||
Message = 'Error in ' : service : ' with lot id ' : LotId : ' attempting to set CLOSE flag on lot. ' : ErrorMessage
|
||||
Obj_Notes('Create',Recipients:@RM:SentFrom:@RM:Subject:@RM:Message)
|
||||
Error_Services('Add', 'Error in ' : service : ' with lot ' : LotId : ':' : ErrorMessage)
|
||||
end
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = LotId
|
||||
LogData<3> = CloseUserId
|
||||
LogData<4> = 'Successfully marked lot as closed.'
|
||||
Logging_Services('AppendLog', objLotClosureLog, LogData, @RM, @FM, False$)
|
||||
end else
|
||||
ErrorMessage = 'Error in ' : service : ' with lot ' : LotId : ':' : ErrorMessage
|
||||
LogData = ''
|
||||
@ -1413,7 +1425,7 @@ Service ReduceLotWaferCount(LotId, ReductionQty, OperatorId)
|
||||
// Write Lot Event
|
||||
Lot_Event_Services('CreateLotEvent', LotId, Datetime(), 'REDUCE_WAFER_QTY', 'Reduced wafer count by ' : ReductionQty, '', OperatorId, False$, '')
|
||||
if LotNewWfrQty EQ 0 AND LotType EQ 'TW' then
|
||||
ServiceParms = 'AutoCloseTestWaferLot' : SD$ : LotId : SD$ : 'SYSTEM'
|
||||
ServiceParms = 'AutoCloseLot' : SD$ : LotId : SD$ : 'SYSTEM'
|
||||
Service_Services('PostProcedure', 'LOT_SERVICES', ServiceParms)
|
||||
If Error_Services('HasError') then
|
||||
Recipients = Xlate('NOTIFICATION', 'FI_SUPPORT', NOTIFICATION_USER_ID$, 'X')
|
||||
@ -1618,3 +1630,5 @@ 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
|
||||
|
||||
|
||||
|
||||
|
@ -82,12 +82,15 @@ $Insert NOTIFICATION_EQUATES
|
||||
$Insert RLIST_EQUATES
|
||||
$Insert WM_OUT_EQUATES
|
||||
$Insert IQS_VIOL_DATA_EQUATES
|
||||
$Insert FEATURE_FLAGS_EQUATES
|
||||
|
||||
Common /MetrologyServices/ MachineType@, LegacyLotId@
|
||||
|
||||
Equ RETRY_ATTEMPTS$ TO 3
|
||||
Equ MINUTES_UNTIL_RETRY$ TO 3
|
||||
|
||||
Equ IMPORT_VALIDATION_IDX$ TO 99
|
||||
|
||||
Equ ORP$THICK_READS TO 1
|
||||
Equ ORP$SHEET_RHO_READS TO 2
|
||||
Equ ORP$HGCV1_READS TO 3
|
||||
@ -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<IMPORT_VALIDATION_IDX$> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].IndexOf'); // Validation
|
||||
END
|
||||
ForOffset = (RecordIndex - 1) * FieldPositionIncrement;
|
||||
Result<FieldPosition + ForOffset> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Site'); // Position
|
||||
@ -404,6 +408,7 @@ end service
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service ImportMetrologyFiles(Machine=MACHINE_TYPES)
|
||||
|
||||
ErrMsg = ''
|
||||
If Machine NE '' then
|
||||
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
|
||||
Lock hSysLists, ServiceKeyID:'*':Machine then
|
||||
@ -430,10 +435,10 @@ Service ImportMetrologyFiles(Machine=MACHINE_TYPES)
|
||||
Case Machine _EQC 'SRP'
|
||||
DataPath = Environment_Services('GetApplicationRootPath') : '\Metrology\MET08ANLYSDIFAAST230\Source\MET08ANLYSDIFAAST230\'
|
||||
Case Otherwise$
|
||||
Error_Services('Add', 'Error in ':Service:' service. Unsupported Machine "':Machine:'" passed into service')
|
||||
ErrMsg = 'Error in ':Service:' service. Unsupported Machine "':Machine:'" passed into service'
|
||||
End Case
|
||||
|
||||
If Error_Services('NoError') then
|
||||
If Error_Services('NoError') and ErrMsg EQ '' then
|
||||
SearchPattern = '*.pdsf';
|
||||
InitDir DataPath:SearchPattern
|
||||
FileList = DirList()
|
||||
@ -525,23 +530,28 @@ Service ImportMetrologyFiles(Machine=MACHINE_TYPES)
|
||||
*************************
|
||||
* Import metrology data *
|
||||
*************************
|
||||
|
||||
IF RunData NE '' then
|
||||
Metrology_Services('ImportMetrologyRunData', Machine, DataPath, FileName, RunData)
|
||||
AllowImport = Metrology_Services('AllowImport', RunData)
|
||||
If AllowImport EQ True$ then
|
||||
Metrology_Services('ImportMetrologyRunData', Machine, DataPath, FileName, RunData)
|
||||
end else
|
||||
ErrMsg = 'Import validation failed'
|
||||
Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : ErrMsg);
|
||||
end
|
||||
END ELSE
|
||||
Error_Services('Add', 'RunData argument was missing')
|
||||
Metrology_Services('LogResults', '', '', 'UID001', Service : ' : ' : Error_Services('GetMessage'))
|
||||
ErrMsg = 'RunData argument was missing'
|
||||
Metrology_Services('LogResults', '', '', 'UID001', Service : ' : ' : ErrMsg)
|
||||
END
|
||||
|
||||
If Error_Services('NoError') then
|
||||
Continue = True$
|
||||
If Error_Services('NoError') and ErrMsg EQ '' then
|
||||
Continue = True$
|
||||
end else
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
FQAError = IndexC(ErrorMessage, 'FQA has already been signed', 1)
|
||||
If ( Index(ErrorMessage, 'UID002', 1) and (ImportAttempts LE RETRY_ATTEMPTS$) and Not(FQAError) ) then
|
||||
Continue = False$
|
||||
If ErrMsg EQ '' then ErrMsg = Error_Services('GetMessage')
|
||||
FQAError = IndexC(ErrMsg, 'FQA has already been signed', 1)
|
||||
If ( Index(ErrMsg, 'UID002', 1) and (ImportAttempts LE RETRY_ATTEMPTS$) and Not(FQAError) ) then
|
||||
Continue = False$
|
||||
end else
|
||||
Continue = True$
|
||||
Continue = True$
|
||||
end
|
||||
end
|
||||
|
||||
@ -561,10 +571,9 @@ Service ImportMetrologyFiles(Machine=MACHINE_TYPES)
|
||||
Metrology_Services('LogResults', '', Machine, 'UID001', 'Delete : ' : FileName : ', Size : ' : FileSize : ', Error : ' : ErrCode)
|
||||
end
|
||||
END else
|
||||
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
If ErrMsg EQ '' then ErrMsg = Error_Services('GetMessage')
|
||||
MetrologyLog = Database_Services('ReadDataRow', 'SYSLISTS', UCase(Machine):'_METROLOGY_LOG')
|
||||
MetrologyLog := ErrorMessage : @FM
|
||||
MetrologyLog := ErrMsg : @FM
|
||||
Database_Services('WriteDataRow', 'SYSLISTS', UCase(Machine):'_METROLOGY_LOG', MetrologyLog, True$)
|
||||
end
|
||||
|
||||
@ -577,7 +586,8 @@ Service ImportMetrologyFiles(Machine=MACHINE_TYPES)
|
||||
NEXT FileLoopIndex
|
||||
|
||||
end else
|
||||
Metrology_Services('LogResults', '', '', 'UID001', Error_Services('GetMessage'))
|
||||
If ErrMsg EQ '' then ErrMsg = Error_Services('GetMessage')
|
||||
Metrology_Services('LogResults', '', '', 'UID001', ErrMsg)
|
||||
end
|
||||
Unlock hSysLists, ServiceKeyID:'*':Machine else Null
|
||||
end
|
||||
@ -585,6 +595,8 @@ Service ImportMetrologyFiles(Machine=MACHINE_TYPES)
|
||||
Metrology_Services('LogResults', '', '', 'UID001', 'Null Machine passed into service')
|
||||
end
|
||||
|
||||
If ErrMsg NE '' then Error_Services('Add', ErrMsg)
|
||||
|
||||
end service
|
||||
|
||||
|
||||
@ -3203,6 +3215,13 @@ Service ScanNumDataPointsMatchesRdsTestSpecThickMPattern(RdsNo, RecipeLayer, Sca
|
||||
Response = MatchFound
|
||||
end service
|
||||
|
||||
Service AllowImport(RunData)
|
||||
MetrologyImportValidationFeatureFlag = Xlate('FEATURE_FLAGS', 'METROLOGY_IMPORT_VALIDATION', FEATURE_FLAGS.ENABLED$, 'X')
|
||||
FeatureDisabled = MetrologyImportValidationFeatureFlag NE True$
|
||||
ImportValidated = RunData<IMPORT_VALIDATION_IDX$> EQ '' or RunData<IMPORT_VALIDATION_IDX$> EQ 1
|
||||
Response = FeatureDisabled or ImportValidated
|
||||
end service
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
@ -3646,3 +3665,5 @@ LoadRunDataToDatabase:
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
@ -273,7 +273,8 @@ WRITE_RECORD:
|
||||
Next RDSNo
|
||||
|
||||
If (OrgQty NE NewQty) then
|
||||
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'UpdateScrappedQty':SD$:WorkOrderNo)
|
||||
ScrapAdj = NewQty - OrgQty
|
||||
Work_Order_Services('AdjustScrappedQty', WorkOrderNo, ScrapAdj)
|
||||
end
|
||||
|
||||
// On the write of the record, read then write associated WM_IN and WM_OUT records to trigger the WM_MFS.
|
||||
@ -294,44 +295,41 @@ WRITE_RECORD:
|
||||
Database_Services('WriteDataRow', 'WM_OUT', WMOKey, WMORec, True$, True$, False$)
|
||||
end
|
||||
|
||||
SAPTestFlag = Xlate('APP_INFO', 'SAP_TEST_FLAG', 1, 'X')
|
||||
If SAPTestFlag then
|
||||
// If NCR created after cassette has received a batch number, then inform SAP of new quantities
|
||||
SAPBatchNo = Xlate('WO_MAT', WOMatKey, 'SAP_BATCH_NO', 'X')
|
||||
IF SAPBatchNo NE '' THEN
|
||||
// If NCR created after cassette has received a batch number, then inform SAP of new quantities
|
||||
SAPBatchNo = Xlate('WO_MAT', WOMatKey, 'SAP_BATCH_NO', 'X')
|
||||
IF SAPBatchNo NE '' THEN
|
||||
|
||||
IF (ReactorType = 'EPP') OR (ReactorType = 'EpiPro') THEN
|
||||
WMOutKey = Xlate('WO_MAT', WOMatKey, 'WMO_KEY', 'X')
|
||||
CassStatus = Xlate('WM_OUT', WMOutKey, 'CURR_STATUS', 'X')
|
||||
IF (ReactorType = 'EPP') OR (ReactorType = 'EpiPro') THEN
|
||||
WMOutKey = Xlate('WO_MAT', WOMatKey, 'WMO_KEY', 'X')
|
||||
CassStatus = Xlate('WM_OUT', WMOutKey, 'CURR_STATUS', 'X')
|
||||
|
||||
END ELSE
|
||||
// Non-EpiPro
|
||||
RDSNo = Xlate('WO_MAT', WoMatKey, 'RDS_NO', 'X')
|
||||
CassStatus = Xlate('RDS', RDSNo, 'CURR_STATUS', 'X')
|
||||
END
|
||||
END ELSE
|
||||
// Non-EpiPro
|
||||
RDSNo = Xlate('WO_MAT', WoMatKey, 'RDS_NO', 'X')
|
||||
CassStatus = Xlate('RDS', RDSNo, 'CURR_STATUS', 'X')
|
||||
END
|
||||
|
||||
// Add SAP transaction
|
||||
IF OrigRecord = '' THEN
|
||||
TransQty = NewQty
|
||||
END ELSE
|
||||
TransQty = NewQty - OrgQty
|
||||
END
|
||||
IF TransQty NE 0 THEN
|
||||
obj_SAP('AddTransaction','SCRAP_IN':@RM:WorkOrderNo:@RM:CassNo:@RM:TransQty)
|
||||
// Add SAP transaction
|
||||
IF OrigRecord = '' THEN
|
||||
TransQty = NewQty
|
||||
END ELSE
|
||||
TransQty = NewQty - OrgQty
|
||||
END
|
||||
IF TransQty NE 0 THEN
|
||||
obj_SAP('AddTransaction','SCRAP_IN':@RM:WorkOrderNo:@RM:CassNo:@RM:TransQty)
|
||||
|
||||
If TransQty LT 0 then
|
||||
// Log negative SAP scrap transaction to capture metrics to submit for SAP change request
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = @User4
|
||||
LogData<3> = Name
|
||||
LogData<4> = SAPBatchNo
|
||||
LogData<5> = TransQty
|
||||
Logging_Services('AppendLog', objSAPLog, LogData, @RM, @FM)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
If TransQty LT 0 then
|
||||
// Log negative SAP scrap transaction to capture metrics to submit for SAP change request
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = @User4
|
||||
LogData<3> = Name
|
||||
LogData<4> = SAPBatchNo
|
||||
LogData<5> = TransQty
|
||||
Logging_Services('AppendLog', objSAPLog, LogData, @RM, @FM)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
OrigStatus = OrigRecord<NCR_STATUS$>
|
||||
NewStatus = Record<NCR_STATUS$>
|
||||
@ -666,6 +664,7 @@ WRITE_RECORD:
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
DELETE_RECORD_PRE:
|
||||
@ -746,11 +745,13 @@ DELETE_RECORD:
|
||||
Pass_To_SQL('WRITE', 'RDS', RDSNo)
|
||||
Next RDSNo
|
||||
|
||||
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'UpdateScrappedQty':SD$:WorkOrderNo)
|
||||
OrgQty = Sum(obj_NCR('RejQty',NCRNo:@RM:OrigRecord))
|
||||
NewQty = 0
|
||||
AdjustQty = NewQty - OrgQty
|
||||
Work_Order_Services('AdjustScrappedQty', WorkOrderNo, AdjustQty)
|
||||
|
||||
return
|
||||
|
||||
|
||||
// ----- Internal Methods ----------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
@ -3,13 +3,15 @@ Compile function NDW_LOAD_UNLOAD_EXTRA_EVENTS(CtrlEntId, Event, @PARAMS)
|
||||
#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
|
||||
|
||||
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
|
||||
@ -42,47 +44,102 @@ 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'))
|
||||
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')
|
||||
Rds_Services('SignLoadExtra1', RDSNo, @USER4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Load Extra 1 Signed!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
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')
|
||||
Rds_Services('SignUnloadExtra2', RDSNo, @USER4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Unload Extra 2 Signed!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
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')
|
||||
Rds_Services('SignLoadExtra2', RDSNo, @USER4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Load Extra 2 Signed!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
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
|
||||
@ -143,40 +200,94 @@ 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')
|
||||
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
|
||||
|
||||
//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')
|
||||
@ -184,4 +295,116 @@ Refresh:
|
||||
|
||||
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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,587 +0,0 @@
|
||||
Function NDW_Main_Events_Dev(CtrlEntId, Event, @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.
|
||||
|
||||
Name : NDW_Main_Events
|
||||
|
||||
Description : This function acts as a commuter module for all events related to this window.
|
||||
|
||||
Notes : Commuter Modules are automatically called from the Promoted_Events function which is called by the
|
||||
application-specific promoted event handler. This makes it possible to add QuickEvents that need to
|
||||
execute Basic+ logic without having use the Form Designer to make the association, although this is
|
||||
limited to the events which are currently promoted.
|
||||
|
||||
If the form needs to call the commuter module directly then the QuickEvent parameters should be
|
||||
formatted like this:
|
||||
|
||||
'@SELF','@EVENT',['@PARAM1','@PARAMx']
|
||||
|
||||
Parameters :
|
||||
CtrlEntId [in] -- The fully qualified name of the control calling the promoted event
|
||||
Event [in] -- The event being executed. See the Notes section regarding "PRE" events
|
||||
Param1-15 [in] -- Additional event parameter holders
|
||||
EventFlow [out] -- Set to 1 or 0 so the calling event knows whether or not to chain forward. See comments in
|
||||
EVENT_SETUP insert
|
||||
|
||||
History : (Date, Initials, Notes)
|
||||
05/08/18 dmb Created initial commuter module.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
#Window NDW_MAIN
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert EVENT_SETUP
|
||||
$insert MSG_EQUATES
|
||||
$insert ENVIRON_CONSTANTS
|
||||
$insert NOTIFICATION_EQUATES
|
||||
$insert REACT_MODE_EQU
|
||||
$insert REACT_UTIL_EQU
|
||||
$insert TOOL_EQUATES
|
||||
$insert RLIST_EQUATES
|
||||
|
||||
Equ WIDTH$ to 3
|
||||
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 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
|
||||
|
||||
SubclassInfo = Form_Services('FindSubclassControl')
|
||||
Subclass = SubclassInfo<1>
|
||||
|
||||
// Update the arguments so that the OpenInsight OLE event will treate the ActiveX event as a native event handler.
|
||||
If Event EQ 'OLE' then
|
||||
Transfer Event to OIEvent
|
||||
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
|
||||
end
|
||||
|
||||
GoToEvent Event for CtrlEntID
|
||||
|
||||
Return EventFlow else EVENT_CONTINUE$
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Events
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Event WINDOW.CREATE(CreateParam)
|
||||
|
||||
GoSub Setup_OLE_Controls
|
||||
|
||||
Server = Environment_Services('GetServer')
|
||||
Command = GetCommandLine()
|
||||
Command = Trim(Command)
|
||||
Convert ' ' to @FM in Command
|
||||
Convert @Lower_Case to @Upper_Case in Command
|
||||
NumArguments = DCount(Command, @FM)
|
||||
Done = False$
|
||||
For ArgCnt = 1 to NumArguments
|
||||
Argument = Command<ArgCnt>
|
||||
If Argument[1, 3] EQ '/UN' then
|
||||
@USER4 = Argument[-1, 'B=']
|
||||
Done = True$
|
||||
end
|
||||
Until Done
|
||||
Next ArgCnt
|
||||
|
||||
|
||||
IF @USER4 = 'INDEXER' THEN
|
||||
void = Start_Window( 'IDXSVR', '', '', '', '' )
|
||||
Post_Event(@Window, 'CLOSE')
|
||||
RETURN 0
|
||||
END
|
||||
|
||||
IF @USER4 = 'VISION' THEN
|
||||
void = Start_Window( 'VISION_COMM', @WINDOW, '', '', '' )
|
||||
RETURN 0
|
||||
END
|
||||
|
||||
IF @USER4 = 'ADCSVR' THEN
|
||||
* void = Start_Window( 'ADCSVR', @window, '', '', '' )
|
||||
void = Start_Window( 'SERVICE_MANAGER', '', '', '', '' )
|
||||
Post_Event(@Window, 'CLOSE')
|
||||
RETURN 0
|
||||
END
|
||||
|
||||
IF @USER4 = 'SAP' THEN
|
||||
void = Start_Window( 'DIALOG_SAP_COMM', '', '', '', '')
|
||||
Post_Event(@Window, 'CLOSE')
|
||||
RETURN 0
|
||||
END
|
||||
|
||||
Start_Window('NDW_MESSAGING_PROCESSOR', @Window)
|
||||
|
||||
@USER4 = @USERNAME
|
||||
|
||||
AccessLevel = Dialog_Box('LOGON', @Window)
|
||||
If (AccessLevel EQ -1) OR (AccessLevel EQ '') then
|
||||
Set_Property(@Window, '@CLOSE', 1)
|
||||
end
|
||||
If AccessLevel GE 0 then
|
||||
|
||||
IF MemberOf(@USER4, 'OI_ADMIN') OR @USER4 = 'MIS' THEN
|
||||
Set_Env(ENV_DEBUGGER_ENABLED$, 1, 1)
|
||||
Set_Env(ENV_DEBUGGER_INTERCEPT_PROC$,'',1)
|
||||
|
||||
* This section added 9/17/2014 JCH for FTPQueueing for manual batch transmits
|
||||
|
||||
OPEN 'FTP_QUEUE' TO FTPQueue THEN
|
||||
SELECT FTPQueue
|
||||
|
||||
RecCnt = 0
|
||||
Done = 0
|
||||
LOOP
|
||||
READNEXT QueueKey ELSE Done = 1
|
||||
UNTIL Done
|
||||
RecCnt += 1
|
||||
REPEAT
|
||||
|
||||
Set_Property(@Window : '.PUB_SHIP_DATA_QUEUE','DEFPROP',RecCnt:' in Ship Data Queue')
|
||||
Set_Property(@Window : '.PUB_SHIP_DATA_QUEUE','VISIBLE',1)
|
||||
END
|
||||
|
||||
END ELSE
|
||||
|
||||
Set_Env(ENV_DEBUGGER_ENABLED$, 2, 1)
|
||||
Set_Env(ENV_DEBUGGER_INTERCEPT_PROC$,'EPI_USER_DEBUG',1)
|
||||
|
||||
Set_Property(@Window : '.PUB_SHIP_DATA_QUEUE','VISIBLE',0)
|
||||
END
|
||||
|
||||
|
||||
IF MemberOf(@USER4,'EMAIL_PDF_QUEUE') THEN
|
||||
|
||||
* This section added 7/31/2015 JCH for Shipment eMail Queueing for manual batch transmits
|
||||
|
||||
OPEN 'SHIP_EMAIL_QUEUE' TO Ship_eMailQueue THEN
|
||||
SELECT Ship_eMailQueue
|
||||
|
||||
RecCnt = 0
|
||||
Done = 0
|
||||
LOOP
|
||||
READNEXT QueueKey ELSE Done = 1
|
||||
UNTIL Done
|
||||
RecCnt += 1
|
||||
REPEAT
|
||||
|
||||
Set_Property(@Window : '.PUB_SHIP_DOC_QUEUE','DEFPROP',RecCnt:' in Ship Doc Queue')
|
||||
Set_Property(@Window : '.PUB_SHIP_DOC_QUEUE','VISIBLE',1)
|
||||
END
|
||||
|
||||
END
|
||||
|
||||
GraphicPath = obj_Install('Get_Prop','ColorBMP')
|
||||
|
||||
IF GraphicPath NE '' THEN
|
||||
Set_Property(@WINDOW:'.BITMAP_2','BITMAP',GraphicPath)
|
||||
Get_BMP_Info(GraphicPath,BmSize,BmWidth,BmHeight)
|
||||
|
||||
BMAspectRatio = BmWidth/BmHeight
|
||||
|
||||
MainSize = Get_Property(@WINDOW,'SIZE')
|
||||
|
||||
WinWidth = MainSize<WIDTH$>
|
||||
WinHeight = MainSize<HEIGHT$>
|
||||
|
||||
IF BmHeight > INT(WinHeight * .666) THEN
|
||||
Set_Property(@WINDOW:'.BITMAP_2','IMAGECLIP',0) ;* Allow Resize of bitmap
|
||||
BmDispHeight = INT(WinHeight * .666)
|
||||
BmDispWidth = INT(BmDispHeight*(BmWidth/BmHeight))
|
||||
END ELSE
|
||||
Set_Property(@WINDOW:'.BITMAP_2','IMAGECLIP',0) ;* Allow Resize of bitmap
|
||||
BmDispHeight = INT(WinHeight * .20)
|
||||
BmDispWidth = INT(BmDispHeight * BMAspectRatio)
|
||||
END
|
||||
|
||||
Xorg = INT((WinWidth - BmDispWidth) / 2 )
|
||||
Yorg = INT((WinHeight - BmDispHeight) / 3)
|
||||
|
||||
Set_Property(@WINDOW:'.BITMAP_2','SIZE',Xorg:@FM:Yorg:@FM:BmDispWidth:@FM:BmDispHeight)
|
||||
Set_Property(@WINDOW:'.BITMAP_2','VISIBLE',1)
|
||||
END
|
||||
|
||||
Company = obj_Install('Get_Prop','CompTitle')
|
||||
WinTitle = Get_Property(@WINDOW,'TEXT')
|
||||
Machine = ''
|
||||
If (Server EQ 'MESST6501') or (Server EQ 'MESST6502') or (Server EQ 'MESTST1006')then
|
||||
Machine = 'Server'
|
||||
end else
|
||||
Machine = 'Client'
|
||||
end
|
||||
|
||||
WinTitle = Get_Property(@WINDOW,'TEXT')
|
||||
LSL2Version = Xlate('LSL_USERS', @User4, 'LSL2_VERSION', 'X')
|
||||
OCXVersion = Xlate('LSL_USERS', @User4, 'OCX_VERSION', 'X')
|
||||
Set_Property(@WINDOW,'TEXT',Company:' ':WinTitle: ' - ':Machine: ' - v':LSL2Version:' - ocx.v':OCXVersion)
|
||||
|
||||
rv = Set_Property(@WINDOW:'.CURRENT_USER', 'TEXT', 'User: ':oconv( @user4, '[XLATE_CONV,LSL_USERS*FIRST_LAST]' ))
|
||||
rv = Set_Property(@WINDOW:'.OLE_PIC_CURRENT_USER','OLE.Caption','User: ':OCONV( @USER4, '[XLATE_CONV,LSL_USERS*FIRST_LAST]' ))
|
||||
rv = Set_Property(@WINDOW:'.GROUP_1', 'VISIBLE', 1)
|
||||
|
||||
Recipients = XLATE('NOTIFICATION','CONFIG_LIMITED',NOTIFICATION_USER_ID$,'X')
|
||||
|
||||
LOCATE @USER4 IN Recipients USING @VM SETTING Pos THEN
|
||||
obj_Login('LateShip')
|
||||
END
|
||||
|
||||
NotesSent = obj_Notes_Sent('GetUserKeys',@USER4)
|
||||
NewMessages = XLATE('NOTE_PTRS',@USER4,'NEW_MESSAGES','X')
|
||||
|
||||
IF NotesSent NE '' OR NewMessages > 0 THEN
|
||||
Void = Start_Window( 'NOTE_PTRS', @WINDOW, '*CENTER', '', '' )
|
||||
END
|
||||
|
||||
IF MemberOf(@USER4, 'SPEC_CHANGE') OR MemberOf(@USER4, 'OI_ADMIN') THEN
|
||||
Set_Property(@WINDOW:'.MENU.ENGINEERING.TOOL_CLASS_-_RECIPES__PATTERNS','VISIBLE',1)
|
||||
END ELSE
|
||||
Set_Property(@WINDOW:'.MENU.ENGINEERING.TOOL_CLASS_-_RECIPES__PATTERNS','VISIBLE',0)
|
||||
END
|
||||
|
||||
Ctrls = @WINDOW:'.MENU.ADMIN.FABTIME_SUPPORT':@RM ; Props = 'ENABLED':@RM
|
||||
Ctrls := @WINDOW:'.MENU.MAINT.REACTOR_MAINTENANCE':@RM ; Props := 'ENABLED':@RM
|
||||
Ctrls := @WINDOW:'.MENU.ADM.SYSTEM_CONFIG':@RM ; Props := 'ENABLED':@RM
|
||||
Ctrls := @WINDOW:'.MENU.ADM.TOOLS':@RM ; Props := 'ENABLED':@RM
|
||||
Ctrls := @WINDOW:'.MENU.ADM.RAS':@RM ; Props := 'ENABLED':@RM
|
||||
Ctrls := @WINDOW:'.MENU.ADM.DEVELOPER':@RM ; Props := 'ENABLED':@RM
|
||||
Ctrls := @WINDOW:'.MENU.ADMIN.DEV.ARCHIVE' ; Props := 'ENABLED'
|
||||
IF Memberof(@user4, 'OI_ADMIN') THEN
|
||||
Vals = 1
|
||||
END ELSE
|
||||
Vals = 0
|
||||
END
|
||||
Set_Property(Ctrls,Props,Vals) ; * Sets the enabled property ON/OFF for the record mark delimited variables Ctrls,Props, and Vals
|
||||
|
||||
Ctrls := @WINDOW:'.MENU.ADMIN.SAP_INTERFACE':@RM ; Props := 'ENABLED':@RM
|
||||
Ctrls := @WINDOW:'.MENU.ADM.WAREHOUSE':@RM ; Props := 'ENABLED':@RM
|
||||
Ctrls := @WINDOW:'.MENU.ADMIN.SAP_INTERFACE.SAP_COMM_MONITOR':@RM ; Props := 'VISIBLE':@RM
|
||||
|
||||
IF Memberof(@user4, 'OI_ADMIN') OR Memberof(@user4, 'OI_SUPERUSER') THEN
|
||||
Vals = 1
|
||||
END ELSE
|
||||
Vals = 0
|
||||
END
|
||||
Set_Property(Ctrls,Props,Vals) ; * Sets the enabled property ON/OFF for the record mark delimited variables Ctrls,Props, and Vals
|
||||
|
||||
Ctrls = @WINDOW:'.MENU.ADM.THRUPUT_TARGETS':@RM ; Props = 'ENABLED':@RM
|
||||
Ctrls := @WINDOW:'.MENU.PROD.REACTOR_RUN' ; Props := 'ENABLED'
|
||||
IF Memberof(@user4,'CONFIG_LIMITED') THEN
|
||||
Vals = 1
|
||||
END ELSE
|
||||
Vals = 0
|
||||
END
|
||||
Set_Property(Ctrls,Props,Vals) ; * Sets the enabled property ON/OFF for the record mark delimited variables Ctrls,Props, and Vals
|
||||
|
||||
If Not(MemberOf(@USER4, 'LEAD')) AND Not(MemberOf(@USER4, 'SUPERVISOR')) then
|
||||
Set_Property(@Window : '.MENU.ADMIN.TOOLS_EVAC', 'VISIBLE', 0)
|
||||
end
|
||||
|
||||
If @User4 NE 'DAN_CR' then
|
||||
Set_Property(@Window : '.MENU.MATERIAL.PTO_MATERIAL_SCAN', 'VISIBLE', 0)
|
||||
end
|
||||
|
||||
CalDueRecipients = XLATE('NOTIFICATION','CALIB_DUE_NOTIFY',NOTIFICATION_USER_ID$,'X')
|
||||
|
||||
LOCATE @USER4 IN CalDueRecipients USING @VM SETTING POS THEN
|
||||
obj_Calib_List('SendReminders') ;* New system added 3/18/2010 JCH
|
||||
END
|
||||
|
||||
stat = Set_Property(@WINDOW,'TIMER',1200000:@FM:0) ;* Start the Keep Alive Timer event and run every 20 Minutes * * * * * * * * * * * *
|
||||
stat = Set_Property(@WINDOW,'STATUSLINE',@WINDOW:'.STATUS_LINE') ;* Setup status line
|
||||
|
||||
SRP_Show_Window(@Window, '', 'C', 'C', 1, '', False$, False$)
|
||||
Eventflow = 0
|
||||
end else
|
||||
End_Window(@Window)
|
||||
end
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event WINDOW.READ()
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event WINDOW.CLOSE(CancelFlag)
|
||||
|
||||
Void = Set_Property(@WINDOW,'TIMER','')
|
||||
UNLOCK All
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event WINDOW.CLEAR(bSaveKey, bSuppressWarning, bMaintainFocus, CtrlIDFocus)
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event WINDOW.TIMER()
|
||||
|
||||
Close = Get_Property(@Window, '@CLOSE')
|
||||
CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS')
|
||||
|
||||
OPEN 'SYSLISTS' TO ListsFile THEN
|
||||
Station = @STATION
|
||||
Station = Station[1,'_']
|
||||
ListKey = Station:'*KEEP_ALIVE'
|
||||
ListRec = @USERNAME:@FM:CurrDTM
|
||||
WRITE ListRec ON ListsFile,ListKey ELSE NULL
|
||||
END
|
||||
|
||||
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
|
||||
Send_Event(@Window, 'CLOSE')
|
||||
end
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event OLE_LAUNCHER.OnLaunchAttempt(Params)
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event PUB_SHIP_DATA_QUEUE.CLICK()
|
||||
|
||||
Start_Window('DIALOG_FTP_QUEUE', @Window)
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event PUB_SHIP_DOC_QUEUE.CLICK()
|
||||
|
||||
Start_Window('DIALOG_EMAIL_SHIPMENT', @Window)
|
||||
* Send_Message(@Window : '.OLE_DIRECT_CONNECT', 'OLE.Broadcast', 'Booyaa!')
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event MENU.REACT_STAT.MENU()
|
||||
|
||||
Start_Window('REACT_STATUS_EVEN',@WINDOW,'')
|
||||
Start_Window('REACT_STATUS_ODD',@WINDOW,'')
|
||||
Start_Window('NDW_TOOL_STATUS_GAN',@WINDOW,'')
|
||||
Start_Window('TOOL_STATUS',@WINDOW,'')
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event MENU.WIN.PROD.RMC.MENU()
|
||||
|
||||
IF MemberOf(@USER4, 'DATA_ENTRY') OR MemberOf(@USER4, 'SUPERVISOR') THEN
|
||||
Start_Window('REACT_MODE_CHG', @WINDOW, '*CENTER','','')
|
||||
END ELSE
|
||||
MsgInfo = ''
|
||||
MsgInfo<MCOL$> = -2
|
||||
MsgInfo<MROW$> = -2
|
||||
MsgInfo<MTEXT$> = 'You must be a Supervisor or Technician in order to change reactor modes...'
|
||||
MsgInfo<MICON$> = 'H'
|
||||
void = Msg('',MsgInfo)
|
||||
END
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event MENU.ADMIN.SAP_INTERFACE.SAP_COMM_MONITOR.MENU()
|
||||
|
||||
rv = Start_Window('DIALOG_SAP_COMM', '')
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event MENU.ADMIN.TOOLS_EVAC.MENU()
|
||||
|
||||
// Require the user to acknowledge using their application password.
|
||||
* Valid = Dialog_Box('QUOTE_SIG_PWD_ENTRY', @WINDOW, @USER4 : @VM : XLATE('LSL_USERS', @USER4, LSL_USERS_PASSWORD$, 'X'))
|
||||
MsgOverride = ''
|
||||
MsgOverride<MDEFBTN$> = 2 ; // Default to Cancel button.
|
||||
Valid = Msg(@Window, MsgOverride, 'OK_CANCEL', '', 'Evac Procedures' : @FM : 'Please confirm that you wish to put all tools into Evac mode.')
|
||||
|
||||
If Valid EQ '' then
|
||||
UserName = Oconv(@USER4, '[XLATE_CONV,LSL_USERS*FIRST_LAST]')
|
||||
CurrDate = Date()
|
||||
CurrTime = Time()
|
||||
EvacMode = 'Facilities (UnSched)'
|
||||
EvacNotes = 'Fab Evac'
|
||||
NumberTools = 0
|
||||
|
||||
// Step 1 - Update the Reactor Tools. This logic is based on the script event handler in the REACT_MODE_CHG.APPLY
|
||||
// pushbutton control.
|
||||
|
||||
ReactorNos = Reactor_Services('GetReactorNumbers')
|
||||
For Each ReactorNo in ReactorNos using @FM
|
||||
ReactModeRow = Database_Services('ReadDataRow', 'CONFIG', 'REACT_MODE' : ReactorNo)
|
||||
ReactModeDesc = ReactModeRow<Mode$>
|
||||
If ReactModeDesc _NEC 'Shutdown' then
|
||||
ReactUtilID = ReactModeRow<ReactUtilID$>
|
||||
ReactLogID = ReactModeRow<ReactorLogID$>
|
||||
If ReactUtilID NE '' then
|
||||
ReactUtilRow = Database_Services('ReadDataRow', 'REACT_UTIL', ReactUtilID)
|
||||
ReactUtilRow<REACT_UTIL_END_DATE$> = CurrDate
|
||||
ReactUtilRow<REACT_UTIL_END_TIME$> = CurrTime
|
||||
ReactUtilRow<REACT_UTIL_MODE_FINISH_USER$> = @USER4
|
||||
Database_Services('WriteDataRow', 'REACT_UTIL', ReactUtilID, ReactUtilRow, True$, '', True$)
|
||||
end else
|
||||
ReactUtilRow = ''
|
||||
end
|
||||
|
||||
hReactUtil = Database_Services('GetTableHandle', 'REACT_UTIL')
|
||||
KeyToUse = Next_Key('REACT_UTIL', hReactUtil, 'NEXT', '')
|
||||
NewReactUtilRow = ''
|
||||
NewReactUtilRow<REACT_UTIL_REACTOR$> = ReactorNo
|
||||
NewReactUtilRow<REACT_UTIL_NOTES$> = EvacNotes
|
||||
NewReactUtilRow<REACT_UTIL_MODE$> = 'S'
|
||||
NewReactUtilRow<REACT_UTIL_START_DATE$> = CurrDate
|
||||
NewReactUtilRow<REACT_UTIL_START_TIME$> = CurrTime
|
||||
NewReactUtilRow<REACT_UTIL_MODE_START_USER$> = @USER4
|
||||
WorkOrderNo = ReactUtilRow<REACT_UTIL_WO$>
|
||||
NewReactUtilRow<REACT_UTIL_WO$> = WorkOrderNo
|
||||
NewReactUtilRow<REACT_UTIL_CUST_NO$> = Xlate('WO_LOG', WorkOrderNo, WO_LOG_CUST_NO$, 'X')
|
||||
NewReactUtilRow<REACT_UTIL_REACTOR_LOG_ID$> = ''
|
||||
Database_Services('WriteDataRow', 'REACT_UTIL', KeyToUse, NewReactUtilRow, True$, '', True$)
|
||||
Database_Services('ReleaseKeyIDLock', 'REACT_UTIL', KeyToUse)
|
||||
Next_Key('REACT_UTIL', HReactUtil, 'UPDATE', KeyToUse)
|
||||
|
||||
NewReactModeRow = ''
|
||||
NewReactModeRow<Mode$> = EvacMode
|
||||
NewReactModeRow<Username$> = UserName
|
||||
NewReactModeRow<Date$> = Oconv(CurrDate, 'D4/')
|
||||
NewReactModeRow<Time$> = Oconv(CurrTime, 'MTH')
|
||||
NewReactModeRow<ReactUtilID$> = KeyToUse
|
||||
NewReactModeRow<ReactorLogID$> = ''
|
||||
NewReactModeRow<Note$> = EvacNotes
|
||||
|
||||
CurrDTM = NewReactModeRow<Date$> : ' ' : NewReactModeRow<Time$>
|
||||
PrevModeKey = Xlate('REACTOR_CHILD_KEY_IDS', ReactorNo, REACTOR_CHILD_KEY_IDS_REACT_MODE_KEY_IDS$, 'X')<1, 1>
|
||||
OpenDTM = Field(PrevModeKey, '*', 2)
|
||||
OpenDTM = Oconv(OpenDTM, 'DT4/^S')
|
||||
CurrMode = Oconv(Xlate('REACTOR', ReactorNo, 'CURR_MODE', 'X'), '[REACT_MODE_CONV]')
|
||||
ProdModes = 'Production':@VM
|
||||
ProdModes := 'Production (incr sampling)'
|
||||
Locate CurrMode in ProdModes Using @VM Setting vPos then
|
||||
Locate EvacMode in ProdModes Using @VM Setting vPos else
|
||||
OutOfProdDTM = NewReactModeRow<Date$> : ' ' : NewReactModeRow<Time$>
|
||||
obj_React_Status('SetOutOfProdDTM', ReactorNo : @RM : OutOfProdDTM)
|
||||
end ; // End of check on New Mode
|
||||
end ; // End of check on Current Mode
|
||||
|
||||
Database_Services('WriteDataRow', 'CONFIG', 'REACT_MODE' : ReactorNo, NewReactModeRow, True$, '', True$)
|
||||
If Error_Services('NoError') then
|
||||
NumberTools += 1
|
||||
If CurrMode NE '' then
|
||||
// Close the currently active mode
|
||||
crParms = ReactorNo
|
||||
crParms := @RM : OpenDTM
|
||||
crParms := @RM : CurrDTM
|
||||
crParms := @RM : @USER4
|
||||
crParms := @RM : NewReactModeRow<Note$>
|
||||
crParms := @RM : NewReactModeRow<ReactUtilID$>
|
||||
crParms := @RM : NewReactModeRow<ReactorLogID$>
|
||||
obj_React_Mode('Close', crParms)
|
||||
end
|
||||
// Create new active mode record
|
||||
crParms = ReactorNo
|
||||
crParms := @RM : CurrDTM
|
||||
crParms := @RM : @USER4
|
||||
crParms := @RM : NewReactModeRow<Mode$>
|
||||
crParms := @RM : NewReactModeRow<Note$>
|
||||
crParms := @RM : NewReactModeRow<ReactUtilID$>
|
||||
crParms := @RM : NewReactModeRow<ReactorLogID$>
|
||||
obj_React_Mode('Create', crParms)
|
||||
end
|
||||
end
|
||||
Next ReactorNo
|
||||
|
||||
// Step 2 - Update the Silicon Tools. This logic is based on the TBClick gosub in the Comm_Dialog_Tool_Status
|
||||
// commuter module. This commuter module supports the TOOL_STATUS form.
|
||||
|
||||
ToolIDs = obj_Tool('KeysByType') ; // All tool IDs sorted by TOOL_TYPE
|
||||
For Each ToolID in ToolIDs using @VM
|
||||
ToolRow = Database_Services('ReadDataRow', 'TOOL', ToolID)
|
||||
CurrModeKey = ToolRow<TOOL_CURR_MODE_KEY$>
|
||||
CurrMode = Xlate('TOOL', ToolID, 'CURR_MODE', 'X')<1, 1>
|
||||
If CurrMode NE 'OUT' AND CurrMode NE 'FACILITIES (UnSched)' then
|
||||
If CurrMode EQ '' then
|
||||
obj_Tool_Log('InitialLog', ToolID)
|
||||
CurrMode = 'OUT'
|
||||
end
|
||||
|
||||
NumberTools += 1
|
||||
CurrModeDTM = Field(CurrModeKey, '*', 2)
|
||||
CurrModeDTM = Oconv(CurrModeDTM, 'DT4/^S')
|
||||
Parms = ToolID : @RM
|
||||
Parms := CurrModeDTM : @RM
|
||||
Parms := 'FACILITIES (UnSched)' : @RM
|
||||
Parms := EvacNotes
|
||||
obj_Tool_Log('SetMode', Parms)
|
||||
end
|
||||
Next ToolID
|
||||
|
||||
// Step 3 - Update the GaN Tools. This logic is based on the ToolOptions gosub in the GaN_Tool_Status commuter
|
||||
// module. This commuter module supports the GAN_TOOL_STATUS form.
|
||||
|
||||
SelectSent = 'SELECT TOOL WITH TOOL_PROC "G" AND WITH CLASS NE "G_REACT" BY TOOL_WH BY TOOL_TYPE'
|
||||
RList(SelectSent, TARGET_ACTIVELIST$, '', '', '')
|
||||
EOF = False$
|
||||
Loop
|
||||
Readnext ToolID else EOF = True$
|
||||
Until EOF
|
||||
ToolRow = Database_Services('ReadDataRow', 'TOOL', ToolID)
|
||||
CurrModeKey = ToolRow<TOOL_CURR_MODE_KEY$>
|
||||
CurrMode = Xlate('TOOL', ToolID, 'CURR_MODE', 'X')<1, 1>
|
||||
If CurrMode NE 'OUT' AND CurrMode NE 'FACILITIES (UnSched)' then
|
||||
If CurrMode EQ '' then
|
||||
obj_Tool_Log('InitialLog', ToolID)
|
||||
CurrMode = 'OUT'
|
||||
end
|
||||
|
||||
NumberTools += 1
|
||||
CurrModeDTM = Field(CurrModeKey, '*', 2)
|
||||
CurrModeDTM = Oconv(CurrModeDTM, 'DT4/^S')
|
||||
Parms = ToolID : @RM
|
||||
Parms := CurrModeDTM : @RM
|
||||
Parms := 'FACILITIES (UnSched)' : @RM
|
||||
Parms := EvacNotes
|
||||
obj_Tool_Log('SetMode', Parms)
|
||||
end
|
||||
Repeat
|
||||
Msg(@Window, '', 'OK', '', 'Evac Procedures' : @FM : NumberTools : ' tools have been placed into Evac mode.')
|
||||
end
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event MENU.ADMIN.DEVELOPER.SESSION_MANAGER.MENU()
|
||||
|
||||
rv = Start_Window('NDW_SESSION_MANAGER', '')
|
||||
|
||||
end event
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Setup_OLE_Controls:
|
||||
|
||||
Qualify = ''
|
||||
Qualify<1> = 1
|
||||
Qualify<4> = 0
|
||||
|
||||
Ctrl = @Window : '.OLE_LAUNCHER'
|
||||
Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnLaunchAttempt', Qualify)
|
||||
|
||||
return
|
@ -1,422 +0,0 @@
|
||||
Compile function NDW_MATERIAL_TRACK_PRO_REPORT_EVENTS(CtrlEntId, Event, @PARAMS)
|
||||
/***********************************************************************************************************************
|
||||
|
||||
Name : NDW_MATERIAL_TRACK_PRO_REPORT_EVENTS
|
||||
|
||||
Description : Commuter module for the NDW_MATERIAL_TRACK_PRO_REPORT_EVENTS form.
|
||||
|
||||
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)
|
||||
10/29/20 djs Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
#pragma precomp SRP_PreCompiler
|
||||
#window NDW_MATERIAL_TRACK_PRO_REPORT
|
||||
|
||||
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
|
||||
|
||||
$Insert EVENT_SETUP
|
||||
$Insert LOGICAL
|
||||
$Insert REPORT_CONFIG_EQUATES
|
||||
|
||||
SubclassInfo = Form_Services('FindSubclassControl')
|
||||
Subclass = SubclassInfo<1>
|
||||
|
||||
// Update the arguments so that the OpenInsight OLE event will treate the ActiveX event as a native event handler.
|
||||
If Event EQ 'OLE' then
|
||||
Transfer Event to OIEvent
|
||||
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
|
||||
end
|
||||
|
||||
GoToEvent Event for CtrlEntId else
|
||||
// Event not implemented
|
||||
end
|
||||
|
||||
Return EventFlow or 1
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// EVENT HANDLERS
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Event WINDOW.CREATE(CreateParam)
|
||||
|
||||
RptConfigKey = 'MATERIAL_TRACK*':@User4
|
||||
If RowExists('REPORT_CONFIG', RptConfigKey) then
|
||||
UserSettings = Database_Services('ReadDataRow', 'REPORT_CONFIG', RptConfigKey)
|
||||
Set_Property(@Window:'.PUB_SAVE_SETTINGS', 'ENABLED', False$)
|
||||
end else
|
||||
UserSettings = ''
|
||||
Set_Property(@Window:'.PUB_SAVE_SETTINGS', 'ENABLED', True$)
|
||||
end
|
||||
|
||||
If MemberOf(@User4, 'OI_ADMIN') then Set_Property(@Window:'.CHK_OLD_REPORT', 'VISIBLE', True$)
|
||||
|
||||
GoSub Setup_OLE_Controls
|
||||
GoSub EnableGenerateReportButton
|
||||
|
||||
FormSize = ''
|
||||
SRP_Show_Window(@Window, '', 'C', 'C', 1, '', False$, False$, FormSize)
|
||||
|
||||
End Event
|
||||
|
||||
|
||||
Event PUB_GEN_REPORT.CLICK()
|
||||
|
||||
// Gather settings from form
|
||||
ColFltrArray = Get_Property(@Window:'.OLE_EDT_COL_FILTER', 'OLE.ARRAY')
|
||||
LocFltrArray = Get_Property(@Window:'.OLE_EDT_LOC_FILTER', 'OLE.ARRAY')
|
||||
NoMatFlag = Get_Property(@Window:'.CHK_NO_MAT_FOUND', 'CHECK')
|
||||
OldReport = Get_Property(@Window:'.CHK_OLD_REPORT', 'CHECK')
|
||||
|
||||
RptColumns = ''
|
||||
RptLocations = ''
|
||||
|
||||
Columns = ColFltrArray<1>
|
||||
Flags = ColFltrArray<2>
|
||||
For each Column in Columns using @VM setting vPos
|
||||
ColumnEnabled = Flags<0, vPos>
|
||||
If ColumnEnabled then RptColumns<0, -1> = Column
|
||||
Next Column
|
||||
|
||||
Locations = LocFltrArray<1>
|
||||
Flags = LocFltrArray<3>
|
||||
For each Location in Locations using @VM setting vPos
|
||||
LocationEnabled = Flags<0, vPos>
|
||||
If LocationEnabled then RptLocations<0, -1> = Location
|
||||
Next Location
|
||||
|
||||
Report_Services('PrintMaterialTrackReport', RptColumns, RptLocations, NoMatFlag, OldReport)
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event PUB_SAVE_SETTINGS.CLICK()
|
||||
|
||||
RptConfigKey = 'MATERIAL_TRACK*':@User4
|
||||
If RowExists('REPORT_CONFIG', RptConfigKey) then
|
||||
UserSettings = Database_Services('ReadDataRow', 'REPORT_CONFIG', RptConfigKey)
|
||||
end else
|
||||
UserSettings = ''
|
||||
end
|
||||
|
||||
// Gather settings from form
|
||||
ColFltrArray = Get_Property(@Window:'.OLE_EDT_COL_FILTER', 'OLE.ARRAY')
|
||||
LocFltrArray = Get_Property(@Window:'.OLE_EDT_LOC_FILTER', 'OLE.ARRAY')
|
||||
NoMatFoundFlag = Get_Property(@Window:'.CHK_NO_MAT_FOUND', 'CHECK')
|
||||
RptColumns = ''
|
||||
RptLocations = ''
|
||||
|
||||
Columns = ColFltrArray<1>
|
||||
Flags = ColFltrArray<2>
|
||||
For each Column in Columns using @VM setting vPos
|
||||
ColumnEnabled = Flags<0, vPos>
|
||||
If ColumnEnabled then RptColumns<0, -1> = Column
|
||||
Next Column
|
||||
UserSettings<REPORT_CONFIG.REPORT_COLUMNS$> = Flags
|
||||
|
||||
Locations = LocFltrArray<1>
|
||||
Flags = LocFltrArray<3>
|
||||
For each Location in Locations using @VM setting vPos
|
||||
LocationEnabled = Flags<0, vPos>
|
||||
If LocationEnabled then RptLocations<0, -1> = Location
|
||||
Next Location
|
||||
UserSettings<REPORT_CONFIG.LOCATION_FILTER$> = Flags
|
||||
UserSettings<REPORT_CONFIG.NO_MAT_FOUND$> = NoMatFoundFlag
|
||||
Database_Services('WriteDataRow', 'REPORT_CONFIG', RptConfigKey, UserSettings, True$, False$, True$)
|
||||
Set_Property(CtrlEntID, 'ENABLED', False$)
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event OLE_EDT_COL_FILTER.OnCheckChanged(Cell, OldValue, NewValue)
|
||||
|
||||
GoSub EnableSaveButton
|
||||
GoSub EnableGenerateReportButton
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event OLE_EDT_LOC_FILTER.OnCheckChanged(Cell, OldValue, NewValue)
|
||||
|
||||
GoSub EnableReportColumns
|
||||
GoSub EnableSaveButton
|
||||
GoSub EnableGenerateReportButton
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event CHK_NO_MAT_FOUND.CLICK()
|
||||
|
||||
GoSub EnableSaveButton
|
||||
GoSub EnableGenerateReportButton
|
||||
|
||||
end event
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Setup_OLE_Controls:
|
||||
|
||||
// Report Columns
|
||||
RptCols = ''
|
||||
RptCols<1, 1> = 'React No'
|
||||
RptCols<1, 2> = 'React Type'
|
||||
RptCols<1, 3> = 'WO No'
|
||||
RptCols<1, 4> = 'SAP Prod No'
|
||||
RptCols<1, 5> = 'Sub Part No'
|
||||
RptCols<1, 6> = 'Epi Part No'
|
||||
RptCols<1, 7> = 'WO Qty'
|
||||
RptCols<1, 8> = 'RX Qty'
|
||||
RptCols<1, 9> = 'UnRel Qty'
|
||||
RptCols<1, 10> = 'Kit Location'
|
||||
RptCols<1, 11> = 'Kit Qty'
|
||||
RptCols<1, 12> = '+/-'
|
||||
RptCols<1, 13> = 'Kit RO'
|
||||
RptCols<1, 14> = 'PTI RO'
|
||||
RptCols<1, 15> = 'Load'
|
||||
RptCols<1, 16> = 'Comments'
|
||||
|
||||
RptColsEnabled = ''
|
||||
If UserSettings NE '' then
|
||||
RptColsEnabled = UserSettings<REPORT_CONFIG.REPORT_COLUMNS$>
|
||||
end else
|
||||
For each Col in RptCols using @VM setting vPos
|
||||
RptColsEnabled<0, -1> = True$
|
||||
Next Col
|
||||
end
|
||||
|
||||
NoMatFoundFlag = UserSettings<REPORT_CONFIG.NO_MAT_FOUND$>
|
||||
Set_Property(@Window:'.CHK_NO_MAT_FOUND', 'CHECK', NoMatFoundFlag)
|
||||
|
||||
RptColsArray = RptCols:@FM:RptColsEnabled
|
||||
|
||||
// Location Filters
|
||||
LocFilters = ''
|
||||
LocFilters<1, 1> = 'SR*KTR]'
|
||||
LocFilters<1, 2> = '1K*PTI'
|
||||
LocFilters<1, 3> = 'CR*BE'
|
||||
LocFilters<1, 4> = 'CR*BO'
|
||||
LocFilters<1, 5> = 'CR*TUN'
|
||||
LocFilters<1, 6> = 'CR*EPR'
|
||||
LocFilters<1, 7> = 'CR*FE'
|
||||
LocFilters<1, 8> = 'CR*FEH'
|
||||
LocFilters<1, 9> = 'CR*FO'
|
||||
LocFilters<1, 10> = 'CR*FOH'
|
||||
|
||||
LocDescriptions = ''
|
||||
LocsEnabled = ''
|
||||
If UserSettings NE '' then
|
||||
LocsEnabled = UserSettings<REPORT_CONFIG.LOCATION_FILTER$>
|
||||
For each Loc in LocFilters using @VM setting vPos
|
||||
If vPos GT 1 then
|
||||
LocDescriptions<0, -1> = Xlate('LOCATION', Loc, 'DESC', 'X')
|
||||
end else
|
||||
LocDescriptions<0, -1> = 'All Kit Racks'
|
||||
end
|
||||
Next Loc
|
||||
end else
|
||||
For each Loc in LocFilters using @VM setting vPos
|
||||
LocsEnabled<0, -1> = True$
|
||||
If vPos GT 1 then
|
||||
LocDescriptions<0, -1> = Xlate('LOCATION', Loc, 'DESC', 'X')
|
||||
end else
|
||||
LocDescriptions<0, -1> = 'All Kit Racks'
|
||||
end
|
||||
Next Loc
|
||||
end
|
||||
|
||||
LocFltrArray = LocFilters:@FM:LocDescriptions:@FM:LocsEnabled
|
||||
|
||||
ColFltrCtrl = @Window:'.OLE_EDT_COL_FILTER'
|
||||
LocFltrCtrl = @Window:'.OLE_EDT_LOC_FILTER'
|
||||
|
||||
// Qualify OLE events that we want to intercept
|
||||
Qualifier = ''
|
||||
Qualifier<1> = 1
|
||||
Qualifier<4> = 0 ; * process synchronously (i.e. immediately)
|
||||
Send_Message(ColFltrCtrl, 'QUALIFY_EVENT', 'OLE.OnCheckChanged', Qualifier)
|
||||
Send_Message(LocFltrCtrl, 'QUALIFY_EVENT', 'OLE.OnCheckChanged', Qualifier)
|
||||
|
||||
NumColFltrCols = 2
|
||||
NumColFltrRows = DCount(RptCols, @VM)
|
||||
NumLocFltrCols = 3
|
||||
NumLocFltrRows = DCount(LocFilters, @VM)
|
||||
|
||||
HeaderFontArray = 'Segoe UI':@SVM:8:@SVM:700
|
||||
ColFltrDimArray = NumColFltrCols : @FM : NumColFltrRows
|
||||
LocFltrDimArray = NumLocFltrCols : @FM : NumLocFltrRows
|
||||
DataColArray = ''
|
||||
DataColArray<4> = True$ ; // Autosize column
|
||||
|
||||
HeaderTitles = 'Column':@VM:'Enabled'
|
||||
Set_Property(ColFltrCtrl, "OLE.TitleList", HeaderTitles)
|
||||
Set_Property(ColFltrCtrl, "OLE.CellFont[All; All]", 'Segoe UI':@SVM:8)
|
||||
Set_Property(ColFltrCtrl, "OLE.Dimension", ColFltrDimArray)
|
||||
Set_Property(ColFltrCtrl, "OLE.HeaderFont[All; 1]", HeaderFontArray)
|
||||
Set_Property(ColFltrCtrl, "OLE.HeaderColumn[1]", '':@FM:False$:@FM)
|
||||
Set_Property(ColFltrCtrl, "OLE.HeaderAlignment[All; 1]", "Top":@FM:"Center":@FM:"Center")
|
||||
Set_Property(ColFltrCtrl, "OLE.HeaderColors[All; 1]", @FM:"{200, 200, 200}")
|
||||
Set_Property(ColFltrCtrl, "OLE.CellType[2; All]", "Check Box")
|
||||
Set_Property(ColFltrCtrl, "OLE.CellAlignment[2; All]", "Top":@FM:"Center":@FM:"Center")
|
||||
Set_Property(ColFltrCtrl, "OLE.DataColumn[1]", DataColArray)
|
||||
Set_Property(ColFltrCtrl, "OLE.ARRAY", RptColsArray)
|
||||
Set_Property(ColFltrCtrl, "OLE.CellCheckEnabled[2; 1-3]", False)
|
||||
CellColorArray = 'None':@FM:"{240, 240, 240}"
|
||||
Set_Property(ColFltrCtrl, "OLE.CellColors[All; 1-3]", CellColorArray)
|
||||
Set_Property(ColFltrCtrl, "OLE.CellProtection[All; 1-3]", 'FUL')
|
||||
|
||||
|
||||
HeaderTitles = 'Location':@VM:'Description':@VM:'Enabled'
|
||||
Set_Property(LocFltrCtrl, "OLE.TitleList", HeaderTitles)
|
||||
Set_Property(LocFltrCtrl, "OLE.CellFont[All; All]", 'Segoe UI':@SVM:8)
|
||||
Set_Property(LocFltrCtrl, "OLE.Dimension", LocFltrDimArray)
|
||||
Set_Property(LocFltrCtrl, "OLE.LIST", '')
|
||||
Set_Property(LocFltrCtrl, "OLE.HeaderFont[All; 1]", HeaderFontArray)
|
||||
Set_Property(LocFltrCtrl, "OLE.HeaderColumn[1]", '':@FM:False$:@FM)
|
||||
Set_Property(LocFltrCtrl, "OLE.HeaderAlignment[All; 1]", "Top":@FM:"Center":@FM:"Center")
|
||||
Set_Property(LocFltrCtrl, "OLE.HeaderColors[All; 1]", @FM:"{200, 200, 200}")
|
||||
Set_Property(LocFltrCtrl, "OLE.CellType[3; All]", "Check Box")
|
||||
Set_Property(LocFltrCtrl, "OLE.DataColumn[2]", DataColArray)
|
||||
Set_Property(LocFltrCtrl, "OLE.CellAlignment[3; All]", "Top":@FM:"Center":@FM:"Center")
|
||||
Set_Property(LocFltrCtrl, "OLE.ARRAY", LocFltrArray)
|
||||
|
||||
return
|
||||
|
||||
|
||||
EnableSaveButton:
|
||||
|
||||
// Enable save settings button if necessary
|
||||
RptConfigKey = 'MATERIAL_TRACK*':@User4
|
||||
If RowExists('REPORT_CONFIG', RptConfigKey) then
|
||||
UserSettings = Database_Services('ReadDataRow', 'REPORT_CONFIG', RptConfigKey)
|
||||
end else
|
||||
UserSettings = ''
|
||||
end
|
||||
|
||||
// Gather settings from form
|
||||
ColFltrArray = Get_Property(@Window:'.OLE_EDT_COL_FILTER', 'OLE.ARRAY')
|
||||
LocFltrArray = Get_Property(@Window:'.OLE_EDT_LOC_FILTER', 'OLE.ARRAY')
|
||||
|
||||
NewColFlags = ColFltrArray<2>
|
||||
CurrColFlags = UserSettings<REPORT_CONFIG.REPORT_COLUMNS$>
|
||||
|
||||
NewLocFlags = LocFltrArray<3>
|
||||
CurrLocFlags = UserSettings<REPORT_CONFIG.LOCATION_FILTER$>
|
||||
|
||||
NewNoMatFoundFlag = Get_Property(@Window:'.CHK_NO_MAT_FOUND', 'CHECK')
|
||||
CurrNoMatFoundFlag = UserSettings<REPORT_CONFIG.NO_MAT_FOUND$>
|
||||
|
||||
ChangeDetected = ( (NewColFlags NE CurrColFlags) or (NewLocFlags NE CurrLocFlags) or (NewNoMatFoundFlag NE CurrNoMatFoundFlag) )
|
||||
Set_Property(@Window:'.PUB_SAVE_SETTINGS', 'ENABLED', ChangeDetected)
|
||||
|
||||
return
|
||||
|
||||
|
||||
EnableGenerateReportButton:
|
||||
|
||||
// Gather settings from form
|
||||
LocFltrArray = Get_Property(@Window:'.OLE_EDT_LOC_FILTER', 'OLE.ARRAY')
|
||||
NoMaterialFlag = Get_Property(@Window:'.CHK_NO_MAT_FOUND', 'CHECK')
|
||||
LocFlags = LocFltrArray<3>
|
||||
ButtonEnabled = ( (Sum(LocFlags) GT 0) or (NoMaterialFlag EQ True$) )
|
||||
Set_Property(@Window:'.PUB_GEN_REPORT', 'ENABLED', ButtonEnabled)
|
||||
|
||||
return
|
||||
|
||||
|
||||
EnableReportColumns:
|
||||
|
||||
ColFltrCtrl = @Window:'.OLE_EDT_COL_FILTER'
|
||||
LocFltrCtrl = @Window:'.OLE_EDT_LOC_FILTER'
|
||||
|
||||
// Gather settings from form
|
||||
LocFltrArray = Get_Property(LocFltrCtrl, 'OLE.ARRAY')
|
||||
|
||||
LocFlags = LocFltrArray<3>
|
||||
KitRackFlag = LocFlags<0, 1>
|
||||
PTIRackFlag = LocFlags<0, 2>
|
||||
LoadedFlags = Field(LocFlags, @VM , 3, 8)
|
||||
LoadedColEnabled = (Sum(LoadedFlags) GT 0)
|
||||
EnabledCellColorArray = 'None':@FM:'None'
|
||||
DisabledCellColorArray = 'None':@FM:"{240, 240, 240}"
|
||||
If KitRackFlag EQ True$ then
|
||||
Set_Property(ColFltrCtrl, "OLE.CellCheck[2; 10-13]", True$)
|
||||
Set_Property(ColFltrCtrl, "OLE.CellColors[All; 10-13]", EnabledCellColorArray)
|
||||
Set_Property(ColFltrCtrl, "OLE.CellProtection[All; 10-13]", 'SEL')
|
||||
Set_Property(ColFltrCtrl, "OLE.CellCheckEnabled[2; 10-13]", True$)
|
||||
end else
|
||||
Set_Property(ColFltrCtrl, "OLE.CellCheck[2; 10-13]", False$)
|
||||
Set_Property(ColFltrCtrl, "OLE.CellColors[All; 10-13]", DisabledCellColorArray)
|
||||
Set_Property(ColFltrCtrl, "OLE.CellProtection[All; 10-13]", 'FUL')
|
||||
Set_Property(ColFltrCtrl, "OLE.CellCheckEnabled[2; 10-13]", False$)
|
||||
end
|
||||
If PTIRackFlag EQ True$ then
|
||||
Set_Property(ColFltrCtrl, "OLE.CellCheck[2; 14]", True$)
|
||||
Set_Property(ColFltrCtrl, "OLE.CellColors[All; 14]", EnabledCellColorArray)
|
||||
Set_Property(ColFltrCtrl, "OLE.CellProtection[All; 14]", 'SEL')
|
||||
Set_Property(ColFltrCtrl, "OLE.CellCheckEnabled[2; 14]", True$)
|
||||
end else
|
||||
Set_Property(ColFltrCtrl, "OLE.CellCheck[2; 14]", False$)
|
||||
Set_Property(ColFltrCtrl, "OLE.CellColors[All; 14]", DisabledCellColorArray)
|
||||
Set_Property(ColFltrCtrl, "OLE.CellProtection[All; 14]", 'FUL')
|
||||
Set_Property(ColFltrCtrl, "OLE.CellCheckEnabled[2; 14]", False$)
|
||||
end
|
||||
If LoadedColEnabled EQ True$ then
|
||||
Set_Property(ColFltrCtrl, "OLE.CellCheck[2; 15]", True$)
|
||||
Set_Property(ColFltrCtrl, "OLE.CellColors[All; 15]", EnabledCellColorArray)
|
||||
Set_Property(ColFltrCtrl, "OLE.CellProtection[All; 15]", 'SEL')
|
||||
Set_Property(ColFltrCtrl, "OLE.CellCheckEnabled[2; 15]", True$)
|
||||
end else
|
||||
Set_Property(ColFltrCtrl, "OLE.CellCheck[2; 15]", False$)
|
||||
Set_Property(ColFltrCtrl, "OLE.CellColors[All; 15]", DisabledCellColorArray)
|
||||
Set_Property(ColFltrCtrl, "OLE.CellProtection[All; 15]", 'FUL')
|
||||
Set_Property(ColFltrCtrl, "OLE.CellCheckEnabled[2; 15]", False$)
|
||||
end
|
||||
|
||||
return
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
@ -36,7 +36,7 @@ $Insert APP_INSERTS
|
||||
$Insert EVENT_SETUP
|
||||
$Insert MSG_EQUATES
|
||||
|
||||
Declare function Reactor_Services
|
||||
Declare function Reactor_Services, Labeling_Services, Printer_Select
|
||||
Declare subroutine PlaceDialog, Labeling_Services
|
||||
|
||||
GoToEvent Event for CtrlEntId else
|
||||
@ -77,15 +77,30 @@ end event
|
||||
|
||||
Event PUB_PRINT.CLICK()
|
||||
|
||||
ErrorMsg = ''
|
||||
ReactNo = Get_Property(@Window:'.COB_REACTOR', 'TEXT')
|
||||
LLSide = Get_Property(@Window:'.COB_LOAD_LOCK_SIDE', 'TEXT')
|
||||
Def = ""
|
||||
Def<MTEXT$> = "Printing label..."
|
||||
Def<MTYPE$> = "U"
|
||||
MsgUp = Msg(@window, Def) ;* display the processing message
|
||||
Labeling_Services('PrintReactorLabel', ReactNo, LLSide)
|
||||
Msg(@window, MsgUp) ;* take down the processing message
|
||||
If Error_Services('HasError') then Error_Services('DisplayError')
|
||||
ReactorZpl = Labeling_Services('GetReactorLabelZPL', ReactNo, LLSide)
|
||||
If Error_Services('NoError') then
|
||||
PrintPath = Printer_Select()
|
||||
If PrintPath NE '' then
|
||||
Def = ""
|
||||
Def<MTEXT$> = "Printing label..."
|
||||
Def<MTYPE$> = "U"
|
||||
MsgUp = Msg(@window, Def) ;* display the processing message
|
||||
Msg(@window, MsgUp) ;* take down the processing message
|
||||
Labeling_Services('PrintLabel', ReactorZpl, PrintPath)
|
||||
If Error_Services('HasError') then
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
|
||||
If ErrorMsg NE '' then
|
||||
Msg(@Window, '', 'OK', '', 'Print Error':@FM:ErrorMsg)
|
||||
end
|
||||
|
||||
end event
|
||||
|
||||
|
@ -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
|
||||
ServiceModules = ''
|
||||
Services = ''
|
||||
Caption = ''
|
||||
|
||||
Case SelOpt EQ 'CLEAN_INSP'
|
||||
Caption = "Updating Clean & Insp specs for selected RDS cassettes..."
|
||||
ServiceModules = 'CLEAN_INSP_SERVICES'
|
||||
Services = 'UpdateAllCleanInsp'
|
||||
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'
|
||||
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
|
||||
|
||||
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
|
||||
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)
|
||||
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,16 +97,6 @@ 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 = ''
|
||||
@ -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,41 +321,31 @@ 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')
|
||||
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
|
||||
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')
|
||||
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
|
||||
CurrWfrMap = WM_Out_Services('GetWaferMap', CassetteID)
|
||||
If Error_Services('NoError') then
|
||||
ExpectedWfrMap = CurrWfrMap
|
||||
end else
|
||||
ErrorMsg = 'Wafer Counter Operation Not Allowed. QA Metrology Incomplete.'
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
End Case
|
||||
|
||||
@ -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')
|
||||
Area = Field(ScanData, '|', 2) ; // This is a proxy for the operation being performed
|
||||
|
||||
For SlotIndex = 1 to 25
|
||||
SlotFilled = SlotMap[SlotIndex, 1]
|
||||
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')
|
||||
|
||||
ExpectedVal = ExpectedWfrMap[SlotIndex, 1]
|
||||
ResultArray<1, SlotIndex> = 26 - SlotIndex
|
||||
If SlotFilled EQ ExpectedVal then
|
||||
ResultArray<2, SlotIndex> = ''
|
||||
end else
|
||||
ResultArray<2, SlotIndex> = 'Error'
|
||||
end
|
||||
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')
|
||||
|
||||
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')
|
||||
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
|
||||
|
@ -30,8 +30,7 @@ $Insert NICA_ORDERS_EQUATES
|
||||
$Insert NICA_CHECKLISTS_EQUATES
|
||||
$Insert NICA_ORDERS_CHECKLISTS_EQUATES
|
||||
$Insert RLIST_EQUATES
|
||||
|
||||
Equ SECONDS_IN_DAY$ to 86400
|
||||
$Insert TIME_INSERTS
|
||||
|
||||
Declare function Environment_Services, Database_Services, Error_Services, Logging_Services, Nica_Orders_Services
|
||||
Declare function Httpclient_Services, SRP_JSON, Reactor_Services, Reactor_Log_Services, SRP_Array, Datetime
|
||||
|
@ -1,162 +0,0 @@
|
||||
COMPILE FUNCTION obj_Calib_List(Method,Parms)
|
||||
/*
|
||||
Methods for Calib_List table
|
||||
|
||||
3/18/2010 JCH - Initial Coding
|
||||
|
||||
Properties:
|
||||
|
||||
Methods:
|
||||
|
||||
SendReminders ;* Send Notes reminding of calibrations coming due
|
||||
|
||||
|
||||
*/
|
||||
|
||||
|
||||
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, Dialog_Box, Popup
|
||||
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, RList, obj_Notes
|
||||
|
||||
$INSERT MSG_EQUATES
|
||||
$INSERT CALIB_LIST_EQUATES
|
||||
$INSERT RLIST_EQUATES
|
||||
$INSERT NOTIFICATION_EQU
|
||||
|
||||
EQU PDISPLAY$ TO 8 ;* From Popup_Equates
|
||||
|
||||
EQU CRLF$ TO \0D0A\
|
||||
|
||||
ErrTitle = 'Error in Stored Procedure "obj_Calib_List"'
|
||||
ErrorMsg = ''
|
||||
|
||||
IF NOT(ASSIGNED(Method)) THEN ErrorMsg = 'Unassigned parameter "Method" passed to subroutine'
|
||||
IF NOT(ASSIGNED(Parms)) THEN Parms = ''
|
||||
|
||||
IF ErrorMsg NE '' THEN
|
||||
Set_Status(-1,ErrTitle:@SVM:ErrorMsg)
|
||||
RETURN ''
|
||||
END
|
||||
|
||||
Result = ''
|
||||
|
||||
BEGIN CASE
|
||||
CASE Method = 'SendReminders' ; GOSUB SendReminders
|
||||
|
||||
CASE 1
|
||||
|
||||
END CASE
|
||||
|
||||
IF ErrorMsg NE '' THEN
|
||||
Set_Status(-1,ErrTitle:@SVM:ErrorMsg)
|
||||
RETURN ''
|
||||
END
|
||||
|
||||
RETURN Result
|
||||
|
||||
|
||||
* * * * * * *
|
||||
SendReminders:
|
||||
* * * * * * *
|
||||
|
||||
OPEN 'CALIB_LIST' TO FileIn ELSE
|
||||
ErrorMsg = 'Unable to open "CALIB_LIST" table. (':Method:')'
|
||||
RETURN
|
||||
END
|
||||
|
||||
CheckDt = OCONV(Date()+15,'D4/')
|
||||
SelectSent = 'SELECT CALIB_LIST WITH NEXT_CAL_DT < ':QUOTE(CheckDt):' BY NEXT_CAL_DT'
|
||||
RList(SelectSent,TARGET_ACTIVELIST$,'','','')
|
||||
|
||||
NoteText = ''
|
||||
Depts = ''
|
||||
|
||||
Done = 0
|
||||
LOOP
|
||||
READNEXT CLNo ELSE Done = 1
|
||||
UNTIL Done
|
||||
READ CLRec FROM FileIn,CLNo THEN
|
||||
|
||||
NextCalDt = OCONV(XLATE('CALIB_LIST',CLNo,'NEXT_CAL_DT','X'),'D4/')
|
||||
|
||||
IF NextCalDt NE '' THEN
|
||||
|
||||
CLType = CLRec<CALIB_LIST_CL_TYPE$>
|
||||
Dept = CLRec<CALIB_LIST_DEPT$>
|
||||
IF Dept = '' THEN Dept = 'MET'
|
||||
|
||||
IF CLType = 'E' THEN
|
||||
Desc = CLRec<CALIB_LIST_EQ_DESC$>
|
||||
SN = CLRec<CALIB_LIST_EQ_SN$>
|
||||
Loc = CLRec<CALIB_LIST_EQ_LOC$
|
||||
NewLine = Desc:' (S/N: ':SN:') located in the ':Loc:' is due for calibration on ':NextCalDt:CRLF$
|
||||
END
|
||||
IF CLType = 'S' THEN
|
||||
Desc = CLRec<CALIB_LIST_STD_DESC$>
|
||||
SN = CLRec<CALIB_LIST_STD_SN$>
|
||||
Loc = CLRec<CALIB_LIST_STD_LOC$>
|
||||
NewLine = 'The NIST Standard ':Desc:' (S/N: ':SN:') located in the ':Loc:' is due for calibration on ':NextCalDt:CRLF$
|
||||
END
|
||||
|
||||
LOCATE Dept IN Depts USING @FM SETTING Pos ELSE
|
||||
Depts = INSERT(Depts,Pos,0,0,Dept)
|
||||
END
|
||||
NoteText<Pos> = NoteText<Pos>:NewLine
|
||||
|
||||
END ;* End of check for NextCalDt
|
||||
END ;* End of CLRec read
|
||||
REPEAT
|
||||
|
||||
DeptUsers = ''
|
||||
DeptDescs =''
|
||||
|
||||
PopupLiteral = XLATE('SYSREPOSPOPUPS',@APPID<1>:'**DEPT',PDISPLAY$,'X')
|
||||
|
||||
CONVERT @VM:@SVM TO @FM:@VM IN PopupLiteral
|
||||
|
||||
LiteralCnt = COUNT(PopupLiteral,@FM) + (PopupLiteral NE '')
|
||||
|
||||
FOR I = 1 TO LiteralCnt
|
||||
Dept = PopupLiteral<I,1>
|
||||
DeptDesc = PopupLiteral<I,2>
|
||||
UserNames = PopupLiteral<I,3>
|
||||
LOCATE Dept IN Depts USING @FM SETTING Pos THEN
|
||||
CONVERT ' ' TO '' IN UserNames
|
||||
CONVERT ',' TO @VM IN UserNames
|
||||
DeptUsers<Pos> = UserNames
|
||||
DeptDescs<Pos> = DeptDesc
|
||||
END
|
||||
NEXT I
|
||||
|
||||
NoteSubject = "Equipment Calibration Reminder"
|
||||
|
||||
DeptCnt = COUNT(Depts,@FM) + (Depts NE '')
|
||||
|
||||
FOR I = 1 TO DeptCnt
|
||||
|
||||
IF NoteText<I> NE '' THEN
|
||||
*NoteText<I> = 'Testing during development of new functionality - disregard':CRLF$:NoteText<I>
|
||||
|
||||
Recipients = DeptUsers<I>
|
||||
|
||||
LOCATE @USER4 IN Recipients SETTING Dummy THEN
|
||||
Recipient = @USER4
|
||||
|
||||
SentFrom = 'System'
|
||||
Subject = DeptDescs<I>:" Department - Equipment Calibration Reminder"
|
||||
Message = NoteText<I>
|
||||
AttachWindow = 'MASTER_CALIB_LIST'
|
||||
AttachKeys = ''
|
||||
SendToGroup = ''
|
||||
|
||||
Obj_Notes('Create',Recipient:@RM:'System':@RM:NoteSubject:@RM:NoteText<I>:@RM:'MASTER_CALIB_LIST')
|
||||
|
||||
END
|
||||
|
||||
END
|
||||
|
||||
NEXT I
|
||||
|
||||
|
||||
RETURN
|
||||
|
||||
|
@ -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,10 +18,11 @@ 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
|
||||
DECLARE SUBROUTINE SRP_Stopwatch, Database_Services, Lot_Services, Supplement_Services
|
||||
DECLARE SUBROUTINE SRP_Stopwatch, Database_Services, Lot_Services, Supplement_Services, RDS_Services
|
||||
|
||||
$INSERT MSG_EQUATES
|
||||
$INSERT WO_VERIFY_EQU
|
||||
@ -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
|
||||
@ -367,6 +375,10 @@ Create:
|
||||
Result = ''
|
||||
END ELSE
|
||||
|
||||
RDS_Services('VerifyWOLogRDSKeyIndex', RDSNo)
|
||||
RDS_Services('VerifyWOMatRDSNoIndex', RDSNo)
|
||||
RDS_Services('VerifyWOStepRDSKeyIndex', RDSNo)
|
||||
|
||||
NewLotId = Lot_Services('CreateNewLot', 'RDS', '', WaferQty, SubPartNo, LotNo, SubVendCd, @User4, '', RDSNo)
|
||||
|
||||
If Rds_Services('IsEpiPro', RDSNo) then
|
||||
|
@ -772,9 +772,7 @@ IF NOT(UnloadFailed) THEN
|
||||
end else
|
||||
LotId = Lot_Services('GetLotIdByLegacyLotIdAndType', RDSNo, 'RDS')
|
||||
If Error_Services('NoError') then
|
||||
Lot_Services('MoveOutLot', LotId, @User4) ; // Move out of POST_EPI operation
|
||||
Lot_Services('MoveInLot', LotId, @User4) ; // Move into RDS_CLOSE operation
|
||||
Lot_Services('CloseLot', LotId)
|
||||
Lot_Services('AutoCloseLot', LotId, 'SYSTEM')
|
||||
end
|
||||
end
|
||||
|
||||
@ -1683,3 +1681,4 @@ RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -18,7 +18,7 @@ Declare subroutine Memory_Services, Environment_Services, Logging_Services, Dat
|
||||
|
||||
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, Dialog_Box, obj_WO_Log, NextKey, SRP_Encode
|
||||
DECLARE FUNCTION obj_Prod_Spec, obj_RDS_Test, obj_Popup, Database_Services, SRP_Array, Memory_Services
|
||||
Declare function Environment_Services, Logging_Services, Error_Services
|
||||
Declare function Environment_Services, Logging_Services, Error_Services, Datetime
|
||||
|
||||
|
||||
$insert LOGICAL
|
||||
@ -476,7 +476,9 @@ CopyStats:
|
||||
DestRDSTestRec<RDS_TEST_HGCV1_RES_MAX$> = SourceRDSTestRec<RDS_TEST_HGCV1_RES_MAX$>
|
||||
DestRDSTestRec<RDS_TEST_HGCV1_RES_RANGE$> = SourceRDSTestRec<RDS_TEST_HGCV1_RES_RANGE$>
|
||||
DestRDSTestRec<RDS_TEST_HGCV1_RES_RANGE_PCNT$> = SourceRDSTestRec<RDS_TEST_HGCV1_RES_RANGE_PCNT$>
|
||||
|
||||
DestRDSTestRec<RDS_TEST_COPY_FROM_RDS_TEST_ID$> = SourceRDSTestKey
|
||||
DestRDSTestRec<RDS_TEST_COPY_USER$> = @User4
|
||||
DestRDSTestRec<RDS_TEST_COPY_DTM$> = Datetime()
|
||||
|
||||
RTParms = FieldStore(RTParms, @RM, 2, 1, LockedRDSTestKey)
|
||||
RTParms = FieldStore(RTParms, @RM, 4, 1, DestRDSTestRec)
|
||||
@ -2052,3 +2054,4 @@ END ;* End of STRESS Property
|
||||
|
||||
|
||||
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,8 +164,16 @@ PostReactItems:
|
||||
|
||||
obj_React_Item_Hist('Install',oriParms)
|
||||
|
||||
IF Get_Status(errCode) THEN
|
||||
|
||||
IF Not(Get_Status(errCode)) THEN
|
||||
RIKey = InstRINos<1,I>
|
||||
RIRec = Xlate('REACT_ITEM', RIKey, '', 'X')
|
||||
RIType = RIRec<REACT_ITEM_RI_TYPE$>
|
||||
If RIType EQ 'S' then
|
||||
PktSize = Xlate('REACT_ITEM', RIKey, 'PKT_SIZE_DESC', 'X')
|
||||
PktQty = RIRec<REACT_ITEM_PKT_QTY$>
|
||||
Reactor_Services('SetWaferSize', ReactNo, PktSize)
|
||||
Reactor_Services('SetPocketQty', ReactNo, PktQty)
|
||||
end
|
||||
END
|
||||
END ;* End of LOCATE check for Install RI number already in the reactor
|
||||
|
||||
|
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
|
||||
|
@ -20,7 +20,7 @@ DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, NextKey, obj_WO_Verify, o
|
||||
DECLARE FUNCTION Database_Services, obj_RDS2, Logging_Services, Environment_Services, Error_Services
|
||||
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, obj_WO_Step, obj_RDS_Layer, obj_RDS_Test, Update_Index
|
||||
DECLARE SUBROUTINE obj_Post_Log, obj_WO_Mat_Log,obj_WO_Wfr, Set_Property, Database_Services, Extract_SI_Keys
|
||||
DECLARE SUBROUTINE Logging_Services, obj_Notes
|
||||
DECLARE SUBROUTINE Logging_Services, obj_Notes, WM_In_Services
|
||||
|
||||
$INSERT MSG_EQUATES
|
||||
$INSERT WO_LOG_EQU
|
||||
@ -128,6 +128,9 @@ Create:
|
||||
LogData<7> = WaferQty
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||
Done = True$
|
||||
WM_In_Services('VerifyWoStepWMIKeyIndex', WMInKey)
|
||||
WM_In_Services('VerifyWOLogWMIKeyIndex', WMInKey)
|
||||
WM_In_Services('VerifyWOMatWMIKeyIndex', WMInKey)
|
||||
end
|
||||
Until ( (NumAttempts EQ 10) or (Done EQ True$) )
|
||||
Repeat
|
||||
@ -940,6 +943,3 @@ RepProdTW:
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -19,11 +19,11 @@ 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
|
||||
Declare Subroutine Service_Services, obj_Notes, Delay
|
||||
Declare Subroutine Service_Services, obj_Notes, Delay, WM_Out_Services
|
||||
|
||||
$Insert MSG_EQUATES
|
||||
$Insert APP_INSERTS
|
||||
@ -40,7 +40,7 @@ $Insert CLEAN_INSP_EQUATES
|
||||
$Insert WMO_WFRS_EQUATES
|
||||
$Insert REACT_RUN_EQUATES
|
||||
|
||||
EQU NUM_RETRIES$ TO 50
|
||||
EQU NUM_RETRIES$ TO 60
|
||||
|
||||
ErrTitle = 'Error in Stored Procedure "obj_WM_Out"'
|
||||
ErrorMsg = ''
|
||||
@ -115,13 +115,12 @@ Create:
|
||||
|
||||
WONo = Parms[1,@RM]
|
||||
WOStep = Parms[COL2()+1,@RM]
|
||||
NewCassNos = Parms[COL2()+1,@RM]
|
||||
NewCassNo = Parms[COL2()+1,@RM]
|
||||
CassLoadQty = Parms[COL2()+1,@RM]
|
||||
|
||||
|
||||
IF WONo = '' THEN ErrorMsg = 'Null Parameter "WONo" passed to routine. (':Method:')'
|
||||
IF WOStep = '' THEN ErrorMsg = 'Null Parameter "WOStep" passed to routine. (':Method:')'
|
||||
IF NewCassNos = '' THEN ErrorMsg = 'Null Parameter "NewCassNos" passed to routine. (':Method:')'
|
||||
IF NewCassNo = '' THEN ErrorMsg = 'Null Parameter "NewCassNo" passed to routine. (':Method:')'
|
||||
|
||||
IF ErrorMsg NE '' THEN RETURN
|
||||
|
||||
@ -161,11 +160,8 @@ Create:
|
||||
WORec = XLATE('WO_LOG',WONo,'','X')
|
||||
|
||||
InboundWaferQty = 0
|
||||
FOR I = 1 TO COUNT(NewCassNos,@VM) + (NewCassNos NE '')
|
||||
NewCassNo = NewCassNos<1,I>
|
||||
CassWfrQty = XLATE('WO_MAT',WONo:'*':NewCassNo,WO_MAT_WAFER_QTY$,'X')
|
||||
InboundWaferQty += CassWfrQty
|
||||
NEXT I
|
||||
CassWfrQty = XLATE('WO_MAT',WONo:'*':NewCassNo,WO_MAT_WAFER_QTY$,'X')
|
||||
InboundWaferQty += CassWfrQty
|
||||
|
||||
WMOutKeys = XLATE('WO_STEP',WONo:'*':WOStep,WO_STEP_WM_OUT_KEYS$,'X')
|
||||
|
||||
@ -214,7 +210,7 @@ Create:
|
||||
OutOnlyCassIDs = '' ;* List of Outbound only Cassette IDs added 8/12/1011 JCH
|
||||
|
||||
LOOP
|
||||
UNTIL InboundWaferQty = 0
|
||||
UNTIL InboundWaferQty EQ 0
|
||||
WMOutKey = WONo:'*':WOStep:'*':WMOCassNo
|
||||
WMOutRec = XLATE('WM_OUT',WMOutKey,'','X') ;* In case there is a partial box
|
||||
NewBoxFlag = ''
|
||||
@ -250,7 +246,7 @@ Create:
|
||||
NumAttempts = 0
|
||||
Loop
|
||||
NumAttempts += 1
|
||||
If NumAttempts GT 1 then Delay(NumAttempts)
|
||||
If NumAttempts GT 1 then Delay(1)
|
||||
Database_Services('WriteDataRow', 'WM_OUT', WMOutKey, WMOutRec, True$, False$, False$)
|
||||
If Error_Services('HasError') then
|
||||
// Log the error
|
||||
@ -272,6 +268,9 @@ Create:
|
||||
LogData<6> = WMOCassNo
|
||||
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
|
||||
Done = True$
|
||||
WM_Out_Services('VerifyWOLogWMOKeyIndex', WONo:'*':WOStep:'*':WMOCassNo)
|
||||
WM_Out_Services('VerifyWOMatWMOKeyIndex', WONo:'*':WOStep:'*':WMOCassNo)
|
||||
WM_Out_Services('VerifyWoStepWMOKeyIndex', WONo:'*':WOStep:'*':WMOCassNo)
|
||||
end
|
||||
Until ( (NumAttempts GT NUM_RETRIES$) or (Done EQ True$) )
|
||||
Repeat
|
||||
@ -382,12 +381,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 +651,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
|
||||
|
||||
|
@ -23,7 +23,7 @@ DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, Btree.Extract, ErrMsg,
|
||||
DECLARE SUBROUTINE obj_Order_Change, obj_Vision, obj_Notes, obj_WM_In, obj_WM_Out, Msg, obj_WO_Mat, obj_Reprocess
|
||||
DECLARE SUBROUTINE obj_WO_Wfr, obj_WO_Step, Send_Info, obj_RDS2, obj_RDS, obj_Post_Log, obj_WO_Mat_Log, Sleepery
|
||||
DECLARE SUBROUTINE Environment_Services, Logging_Services, Error_Services, Database_Services, Update_Index
|
||||
DECLARE SUBROUTINE Work_Order_Services, Delay, Transaction_Services
|
||||
DECLARE SUBROUTINE Work_Order_Services, Delay, Transaction_Services, RDS_Services, WM_In_Services, WM_Out_Services
|
||||
|
||||
$INSERT MSG_EQUATES
|
||||
$INSERT ORDER_EQU
|
||||
@ -53,7 +53,7 @@ $INSERT LOGICAL
|
||||
$INSERT APPCOLORS
|
||||
$INSERT WM_IN_EQUATES
|
||||
|
||||
EQU NUM_RETRIES$ TO 50
|
||||
EQU NUM_RETRIES$ TO 60
|
||||
|
||||
EQU CRLF$ TO \0D0A\
|
||||
EQU COMMA$ TO ','
|
||||
@ -103,7 +103,7 @@ BEGIN CASE
|
||||
CASE Method = 'OpenWONos' ; GOSUB OpenWONos
|
||||
CASE Method = 'ShipWONos' ; GOSUB ShipWONos
|
||||
CASE Method = 'WOStepStatus' ; GOSUB WOStepStatus
|
||||
CASE Method = 'ReleaseCassettes' ; GOSUB ReleaseCassettes
|
||||
CASE Method = 'ReleaseCassette' ; GOSUB ReleaseCassette
|
||||
CASE Method = 'RecallWO' ; GOSUB RecallWO
|
||||
CASE Method = 'ChangeLotNo' ; GOSUB ChangeLotNo
|
||||
CASE Method = 'ChangeCassQty' ; GOSUB ChangeCassQty
|
||||
@ -967,11 +967,11 @@ RETURN
|
||||
|
||||
|
||||
* * * * * * *
|
||||
ReleaseCassettes:
|
||||
ReleaseCassette:
|
||||
* * * * * * *
|
||||
|
||||
WONo = Parms[1,@RM]
|
||||
CassNos = Parms[COL2()+1,@RM]
|
||||
CassNo = Parms[COL2()+1,@RM]
|
||||
ReleaseUser = Parms[COL2()+1,@RM]
|
||||
RelDtm = Parms[COL2()+1,@RM]
|
||||
|
||||
@ -979,7 +979,7 @@ ReleaseCassettes:
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
|
||||
LogData<2> = ReleaseUser
|
||||
LogData<3> = WONo
|
||||
LogData<4> = 'WONo: ':WONo:' CassNos: ':CassNos:' ReleaseUser: ':ReleaseUser:' ||| Beginning ReleaseCassettes routine.'
|
||||
LogData<4> = 'WONo: ':WONo:' CassNo: ':CassNo:' ReleaseUser: ':ReleaseUser:' ||| Beginning ReleaseCassette routine.'
|
||||
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
|
||||
|
||||
IF WONo = '' THEN ErrorMsg = 'Null parameter WONo passed to routine (':Method:').'
|
||||
@ -1050,12 +1050,7 @@ ReleaseCassettes:
|
||||
|
||||
OrdSummary = '' ;* Holds Order Detail Lot Numbers and Associated Order Item Numbers
|
||||
|
||||
CassCnt = COUNT(CassNos,@VM) + (CassNos NE '')
|
||||
|
||||
WOMKeys = ''
|
||||
FOR K = 1 TO CassCnt
|
||||
WOMKeys<1,K> = WONo:'*':CassNos<1,K>
|
||||
NEXT K
|
||||
WOMKey = WONo:'*':CassNo
|
||||
|
||||
WOMTableVar = Database_Services('GetTableHandle', 'WO_MAT')
|
||||
|
||||
@ -1065,7 +1060,7 @@ ReleaseCassettes:
|
||||
END
|
||||
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
|
||||
LogData<4> = 'WONo:':WONo:' CassNos:':CassNos:' ||| Trace 1'
|
||||
LogData<4> = 'WONo:':WONo:' CassNo:':CassNo:' ||| Trace 1'
|
||||
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
|
||||
|
||||
EpiPN = WORec<WO_LOG_EPI_PART_NO$>
|
||||
@ -1093,149 +1088,138 @@ ReleaseCassettes:
|
||||
|
||||
// Log variables before obj_WM_Out('Create')
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
|
||||
LogData<4> = 'WONo:':WONo:' WOStep:':WOStep:' CassNos:':CassNos:' WMOLoadQty:':WMOLoadQty
|
||||
LogData<4> = 'WONo:':WONo:' WOStep:':WOStep:' CassNo:':CassNo:' WMOLoadQty:':WMOLoadQty
|
||||
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
|
||||
|
||||
IF ReactorType = 'EPP' THEN
|
||||
Send_Info('Creating WM_OUT records for WOStep ':WOStep:'...')
|
||||
OutOnlyCassIDS = obj_WM_Out('Create',WONO:@RM:WOStep:@RM:CassNos:@RM:WMOLoadQty)
|
||||
OutOnlyCassIDs = obj_WM_Out('Create',WONO:@RM:WOStep:@RM:CassNo:@RM:WMOLoadQty)
|
||||
END ELSE
|
||||
OutOnlyCassIDs = ''
|
||||
END
|
||||
|
||||
StepRDSNos = ''
|
||||
|
||||
CassCnt = COUNT(CassNos,@VM) + (CassNos NE '')
|
||||
|
||||
// Log variables after obj_WM_Out('Create')
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
|
||||
LogData<4> = 'WONo:':WONo:' WOStep:':WOStep:' CassNos:':CassNos:' CassCnt:':CassCnt:' WMOLoadQty:':WMOLoadQty
|
||||
LogData<4> = 'WONo:':WONo:' WOStep:':WOStep:' CassNo:':CassNo:' WMOLoadQty:':WMOLoadQty
|
||||
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
|
||||
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
|
||||
LogData<4> = 'WONo:':WONo:' WOStep:':WOStep:' CassNos:':CassNos:' CassCnt:':CassCnt:' WMOLoadQty:':WMOLoadQty:' ||| Trace 2'
|
||||
LogData<4> = 'WONo:':WONo:' WOStep:':WOStep:' CassNo:':CassNo:' WMOLoadQty:':WMOLoadQty:' ||| Trace 2'
|
||||
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
|
||||
|
||||
FOR N = 1 TO CassCnt
|
||||
IF ReactorType EQ 'EPP' THEN
|
||||
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
|
||||
LogData<4> = 'WONo:':WONo:' WOStep:':WOStep:' CassNos:':CassNos:' CassCnt:':CassCnt:' WMOLoadQty:':WMOLoadQty:' ||| Trace 2.':N
|
||||
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
|
||||
CassWaferQty = XLATE('WO_MAT',WONo:'*':CassNo,WO_MAT_WAFER_QTY$,'X')
|
||||
WMIKey = WONo:'*':WOStep:'*':CassNo
|
||||
obj_WM_IN('Create',WONo:@RM:WOStep:@RM:CassNo:@RM:CassWaferQty)
|
||||
|
||||
CassNo = CassNos<1,N>
|
||||
END ELSE
|
||||
|
||||
IF ReactorType EQ 'EPP' THEN
|
||||
WOMatRec = XLATE('WO_MAT',WoNo:'*':CassNo,'','X')
|
||||
RDSNoCheck = WOMatRec<WO_MAT_RDS_NO$>
|
||||
If RDSNoCheck EQ '' then
|
||||
|
||||
CassWaferQty = XLATE('WO_MAT',WONo:'*':CassNo,WO_MAT_WAFER_QTY$,'X')
|
||||
WMIKey = WONo:'*':WOStep:'*':CassNo
|
||||
obj_WM_IN('Create',WONo:@RM:WOStep:@RM:CassNo:@RM:CassWaferQty)
|
||||
CassLotNo = WOMatRec<WO_MAT_LOT_NO$>
|
||||
CassWaferQty = WOMatRec<WO_MAT_WAFER_QTY$>
|
||||
CassCustPartNo = WOMatRec<WO_MAT_CUST_PART_NO$>
|
||||
CassSubPartNo = WOMatRec<WO_MAT_SUB_PART_NO$>
|
||||
CassSubInvID = ''
|
||||
CassOrderItem = WOMatRec<WO_MAT_ORDER_ITEM$>
|
||||
ReprocessedMat = WOMatRec<WO_MAT_REPROCESSED_MAT$>
|
||||
CassSubVendCd = WOMatRec<WO_MAT_SUB_VEND_CD$>
|
||||
|
||||
END ELSE
|
||||
IF OrderNo = '' THEN
|
||||
QuoteNo = ''
|
||||
END ELSE
|
||||
QuoteNo = XLATE('ORDER_DET',OrderNo:'*':CassOrderItem,ORDER_DET_QUOTE_NO$,'X')
|
||||
END
|
||||
|
||||
WOMatRec = XLATE('WO_MAT',WoNo:'*':CassNo,'','X')
|
||||
RDSNoCheck = WOMatRec<WO_MAT_RDS_NO$>
|
||||
If RDSNoCheck EQ '' then
|
||||
Parms = WONo:@RM
|
||||
Parms := WOStep:@RM
|
||||
Parms := LastStep:@RM
|
||||
Parms := CassNo:@RM
|
||||
Parms := QuoteNo:@RM
|
||||
Parms := OrderNo:@RM
|
||||
Parms := CassOrderItem:@RM
|
||||
Parms := CustNo:@RM
|
||||
Parms := PONo:@RM
|
||||
Parms := ProcPSN:@RM
|
||||
Parms := SubSupplyBy:@RM
|
||||
Parms := SubPreClean:@RM
|
||||
Parms := SubPostClean:@RM
|
||||
Parms := PromiseDt:@RM
|
||||
Parms := CassLotNo:@RM
|
||||
Parms := CassCustPartNo:@RM
|
||||
Parms := CassWaferQty:@RM
|
||||
Parms := CassSubPartNo:@RM
|
||||
Parms := '':@RM ;* QXJ Flag
|
||||
Parms := CassSubVendCd
|
||||
|
||||
CassLotNo = WOMatRec<WO_MAT_LOT_NO$>
|
||||
CassWaferQty = WOMatRec<WO_MAT_WAFER_QTY$>
|
||||
CassCustPartNo = WOMatRec<WO_MAT_CUST_PART_NO$>
|
||||
CassSubPartNo = WOMatRec<WO_MAT_SUB_PART_NO$>
|
||||
CassSubInvID = ''
|
||||
CassOrderItem = WOMatRec<WO_MAT_ORDER_ITEM$>
|
||||
ReprocessedMat = WOMatRec<WO_MAT_REPROCESSED_MAT$>
|
||||
CassSubVendCd = WOMatRec<WO_MAT_SUB_VEND_CD$>
|
||||
IF ReactorType NE 'GAN' then
|
||||
|
||||
IF OrderNo = '' THEN
|
||||
QuoteNo = ''
|
||||
END ELSE
|
||||
QuoteNo = XLATE('ORDER_DET',OrderNo:'*':CassOrderItem,ORDER_DET_QUOTE_NO$,'X')
|
||||
END
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
|
||||
LogData<4> = 'WONo:':WONo:' WOStep:':WOStep:' CassNo:':CassNo:' WMOLoadQty:':WMOLoadQty:' ||| Trace 2.1 - Start obj_RDS("Create")'
|
||||
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
|
||||
Done = False$
|
||||
For AttemptIndex = 1 to NUM_RETRIES$
|
||||
If (AttemptIndex GT 1) then Delay(1)
|
||||
NewRDSNo = obj_RDS('Create',Parms)
|
||||
errCode = ''
|
||||
Begin Case
|
||||
Case Get_Status(errCode)
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
|
||||
LogData<4> = 'WONo:':WONo:' WOStep:':WOStep:' CassNo:':CassNo:' WMOLoadQty:':WMOLoadQty:' ||| Trace 2.1.1 - Attempt ':AttemptIndex:'. Error calling obj_RDS("Create"). Error message: ':errCode
|
||||
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
|
||||
Case (NewRDSNo EQ 0) or (NewRDSNo EQ '')
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
|
||||
LogData<4> = 'WONo:':WONo:' WOStep:':WOStep:' CassNo:':CassNo:' WMOLoadQty:':WMOLoadQty:' ||| Trace 2.1.1 - Attempt ':AttemptIndex:'. Error calling obj_RDS("Create"). Invalid RDSNo ':Quote(RDSNo):' returned.'
|
||||
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
|
||||
Case RowExists('RDS', NewRDSNo)
|
||||
Done = True$
|
||||
End Case
|
||||
Until Done
|
||||
Next AttemptIndex
|
||||
|
||||
Parms = WONo:@RM
|
||||
Parms := WOStep:@RM
|
||||
Parms := LastStep:@RM
|
||||
Parms := CassNo:@RM
|
||||
Parms := QuoteNo:@RM
|
||||
Parms := OrderNo:@RM
|
||||
Parms := CassOrderItem:@RM
|
||||
Parms := CustNo:@RM
|
||||
Parms := PONo:@RM
|
||||
Parms := ProcPSN:@RM
|
||||
Parms := SubSupplyBy:@RM
|
||||
Parms := SubPreClean:@RM
|
||||
Parms := SubPostClean:@RM
|
||||
Parms := PromiseDt:@RM
|
||||
Parms := CassLotNo:@RM
|
||||
Parms := CassCustPartNo:@RM
|
||||
Parms := CassWaferQty:@RM
|
||||
Parms := CassSubPartNo:@RM
|
||||
Parms := '':@RM ;* QXJ Flag
|
||||
Parms := CassSubVendCd
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
|
||||
LogData<4> = 'WONo:':WONo:' WOStep:':WOStep:' CassNo:':CassNo:' WMOLoadQty:':WMOLoadQty:' ||| Trace 2.2 - End obj_RDS("Create")'
|
||||
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
|
||||
|
||||
IF ReactorType NE 'GAN' then
|
||||
If ( (NewRDSNo EQ 0) or (NewRDSNo EQ '') ) then
|
||||
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
|
||||
LogData<4> = 'WONo:':WONo:' WOStep:':WOStep:' CassNos:':CassNos:' CassCnt:':CassCnt:' WMOLoadQty:':WMOLoadQty:' ||| Trace 2.':N:'.1 - Start obj_RDS("Create")'
|
||||
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
|
||||
Done = False$
|
||||
For AttemptIndex = 1 to NUM_RETRIES$
|
||||
If (AttemptIndex GT 1) then Delay(AttemptIndex)
|
||||
NewRDSNo = obj_RDS('Create',Parms)
|
||||
errCode = ''
|
||||
Begin Case
|
||||
Case Get_Status(errCode)
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
|
||||
LogData<4> = 'WONo:':WONo:' WOStep:':WOStep:' CassNos:':CassNos:' CassCnt:':CassCnt:' WMOLoadQty:':WMOLoadQty:' ||| Trace 2.':N:'.1.1 - Attempt ':AttemptIndex:'. Error calling obj_RDS("Create"). Error message: ':errCode
|
||||
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
|
||||
Case (NewRDSNo EQ 0) or (NewRDSNo EQ '')
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
|
||||
LogData<4> = 'WONo:':WONo:' WOStep:':WOStep:' CassNos:':CassNos:' CassCnt:':CassCnt:' WMOLoadQty:':WMOLoadQty:' ||| Trace 2.':N:'.1.1 - Attempt ':AttemptIndex:'. Error calling obj_RDS("Create"). Invalid RDSNo ':Quote(RDSNo):' returned.'
|
||||
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
|
||||
Case RowExists('RDS', NewRDSNo)
|
||||
Done = True$
|
||||
End Case
|
||||
Until Done
|
||||
Next AttemptIndex
|
||||
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
|
||||
LogData<4> = 'WONo:':WONo:' WOStep:':WOStep:' CassNos:':CassNos:' CassCnt:':CassCnt:' WMOLoadQty:':WMOLoadQty:' ||| Trace 2.':N:'.2 - End obj_RDS("Create")'
|
||||
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
|
||||
|
||||
If ( (NewRDSNo EQ 0) or (NewRDSNo EQ '') ) then
|
||||
|
||||
ErrMsg(errCode)
|
||||
ErrorMsg = "RDS '" : NewRDSNo : "' Create Failure - Check for missing data on Work Order"
|
||||
If Error_Services('HasError') then
|
||||
ErrMsg = Error_Services('GetMessage')
|
||||
LogData = LoggingDTM : ',' : ReleaseUser : ',' : WONo : ',' : ErrMsg
|
||||
Logging_Services('AppendLog', objLog, LogData, CRLF$, COMMA$, False$, '', LogData)
|
||||
end
|
||||
|
||||
RTParms = 'RDS'
|
||||
FOR I = 1 TO COUNT(StepRdsNos,@VM) + (StepRdsNos NE '')
|
||||
RdsNo = StepRdsNos<1,I>
|
||||
RTParms = FieldStore(RTParms, @RM, 2, 1, RdsNo)
|
||||
obj_Tables('DeleteRec',RTParms)
|
||||
NEXT I
|
||||
RETURN
|
||||
END else
|
||||
// No error creating RDS record -> add it to the batch list.
|
||||
StepRDSNos<1,-1> = NewRDSNo
|
||||
ErrMsg(errCode)
|
||||
ErrorMsg = "RDS '" : NewRDSNo : "' Create Failure - Check for missing data on Work Order"
|
||||
If Error_Services('HasError') then
|
||||
ErrMsg = Error_Services('GetMessage')
|
||||
LogData = LoggingDTM : ',' : ReleaseUser : ',' : WONo : ',' : ErrMsg
|
||||
Logging_Services('AppendLog', objLog, LogData, CRLF$, COMMA$, False$, '', LogData)
|
||||
end
|
||||
|
||||
IF ReprocessedMat THEN
|
||||
OrgRDSNo = CassLotNo
|
||||
obj_Reprocess('FixUp',OrgRDSNo:@RM:NewRDSNo)
|
||||
END
|
||||
RTParms = 'RDS'
|
||||
FOR I = 1 TO COUNT(StepRdsNos,@VM) + (StepRdsNos NE '')
|
||||
RdsNo = StepRdsNos<1,I>
|
||||
RTParms = FieldStore(RTParms, @RM, 2, 1, RdsNo)
|
||||
obj_Tables('DeleteRec',RTParms)
|
||||
NEXT I
|
||||
RETURN
|
||||
END else
|
||||
// No error creating RDS record -> add it to the batch list.
|
||||
StepRDSNos<1,-1> = NewRDSNo
|
||||
end
|
||||
|
||||
END ;* End of check for GAN reactor
|
||||
END ;* End of Check for existing RDS
|
||||
END ;* End of check for EpiPRO reactor type
|
||||
NEXT N
|
||||
IF ReprocessedMat THEN
|
||||
OrgRDSNo = CassLotNo
|
||||
obj_Reprocess('FixUp',OrgRDSNo:@RM:NewRDSNo)
|
||||
END
|
||||
|
||||
END ;* End of check for GAN reactor
|
||||
END ;* End of Check for existing RDS
|
||||
END ;* End of check for EpiPRO reactor type
|
||||
NEXT WOStep
|
||||
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
|
||||
LogData<4> = 'WONo:':WONo:' WOStep:':WOStep:' CassNos:':CassNos:' CassCnt:':CassCnt:' WMOLoadQty:':WMOLoadQty:' ||| Trace 3'
|
||||
LogData<4> = 'WONo:':WONo:' WOStep:':WOStep:' CassNo:':CassNo:' WMOLoadQty:':WMOLoadQty:' ||| Trace 3'
|
||||
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
|
||||
|
||||
If RelDtm EQ '' then
|
||||
@ -1251,95 +1235,91 @@ ReleaseCassettes:
|
||||
|
||||
MaxShipQty = Xlate('WO_LOG', WONo, 'CUST_EPI_PART_SHIP_QTY', 'X')
|
||||
|
||||
FOR N = 1 TO CassCnt
|
||||
WOMKey = WOMKeys<1,N>
|
||||
CassNo = FIELD(WOMKey,'*',2)
|
||||
// Keep trying to get the lock. Another process may be updating this record at the same time.
|
||||
Done = False$
|
||||
For AttemptIndex = 1 to NUM_RETRIES$
|
||||
CassNo = FIELD(WOMKey,'*',2)
|
||||
// Keep trying to get the lock. Another process may be updating this record at the same time.
|
||||
Done = False$
|
||||
For AttemptIndex = 1 to NUM_RETRIES$
|
||||
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
|
||||
LogData<4> = 'WONo:':WONo:' WOStep:':WOStep:' CassNo:':CassNo:' WMOLoadQty:':WMOLoadQty:' ||| Trace 3.':AttemptIndex
|
||||
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
|
||||
|
||||
If (AttemptIndex GT 1) then Delay(1)
|
||||
HaveLock = Database_Services('GetKeyIDLock', 'WO_MAT', WOMKey, True$)
|
||||
If HaveLock then
|
||||
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
|
||||
LogData<4> = 'WONo:':WONo:' WOStep:':WOStep:' CassNos:':CassNos:' CassCnt:':CassCnt:' WMOLoadQty:':WMOLoadQty:' ||| Trace 3.':AttemptIndex
|
||||
LogData<4> = 'WONo:':WONo:' WOStep:':WOStep:' CassNo:':CassNo:' WMOLoadQty:':WMOLoadQty:' ||| Trace 3.':AttemptIndex:' Have lock!'
|
||||
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
|
||||
|
||||
If (AttemptIndex GT 1) then Delay(AttemptIndex)
|
||||
HaveLock = Database_Services('GetKeyIDLock', 'WO_MAT', WOMKey)
|
||||
If HaveLock then
|
||||
WOMatRec = XLATE('WO_MAT',WOMKey,'','X') ;* We have the lock, so just get the record this way
|
||||
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
|
||||
LogData<4> = 'WONo:':WONo:' WOStep:':WOStep:' CassNos:':CassNos:' CassCnt:':CassCnt:' WMOLoadQty:':WMOLoadQty:' ||| Trace 3.':AttemptIndex:' Have lock!'
|
||||
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
|
||||
IF WOMatRec<WO_MAT_REL_DTM$> = '' THEN
|
||||
WOMatRec<WO_MAT_REL_DTM$> = IConv(RelDTM,'DT')
|
||||
WOMatRec<WO_MAT_REL_BY$> = ReleaseUser
|
||||
WOMatRec<WO_MAT_ORG_COMMIT_DT$> = PromiseDt
|
||||
|
||||
WOMatRec = XLATE('WO_MAT',WOMKey,'','X') ;* We have the lock, so just get the record this way
|
||||
IF SubPreClean = 'No' OR SubPreClean = '' THEN
|
||||
WOMatRec<WO_MAT_WMI_CURR_STATUS$> = 'RTU'
|
||||
END ELSE
|
||||
WOMatRec<WO_MAT_WMI_CURR_STATUS$> = 'PREC'
|
||||
END
|
||||
|
||||
IF WOMatRec<WO_MAT_REL_DTM$> = '' THEN
|
||||
WOMatRec<WO_MAT_REL_DTM$> = IConv(RelDTM,'DT')
|
||||
WOMatRec<WO_MAT_REL_BY$> = ReleaseUser
|
||||
WOMatRec<WO_MAT_ORG_COMMIT_DT$> = PromiseDt
|
||||
WOMatRec<WO_MAT_WMO_CURR_STATUS$> = 'RTB'
|
||||
|
||||
IF SubPreClean = 'No' OR SubPreClean = '' THEN
|
||||
WOMatRec<WO_MAT_WMI_CURR_STATUS$> = 'RTU'
|
||||
END ELSE
|
||||
WOMatRec<WO_MAT_WMI_CURR_STATUS$> = 'PREC'
|
||||
END
|
||||
thisInvDTM = ICONV(RelDTM,'DT')
|
||||
|
||||
WOMatRec<WO_MAT_WMO_CURR_STATUS$> = 'RTB'
|
||||
WHCd = 'SR'
|
||||
LocCd = 'RB'
|
||||
InvAction = 'REL'
|
||||
ScanUserID = ReleaseUser
|
||||
Tag = ''
|
||||
ToolID = ''
|
||||
|
||||
thisInvDTM = ICONV(RelDTM,'DT')
|
||||
LOCATE thisInvDTM IN WOMatRec<WO_MAT_INV_DTM$> BY 'AR' USING @VM SETTING Pos ELSE
|
||||
|
||||
WHCd = 'SR'
|
||||
LocCd = 'RB'
|
||||
InvAction = 'REL'
|
||||
ScanUserID = ReleaseUser
|
||||
Tag = ''
|
||||
ToolID = ''
|
||||
WOMatRec = INSERT(WOMatRec,WO_MAT_INV_WH$,Pos,0,WHCd)
|
||||
WOMatRec = INSERT(WOMatRec,WO_MAT_INV_LOCATION$,Pos,0,LocCd)
|
||||
WOMatRec = INSERT(WOMatRec,WO_MAT_INV_ACTION$,Pos,0,InvAction)
|
||||
WOMatRec = INSERT(WOMatRec,WO_MAT_INV_DTM$,Pos,0,thisInvDTM)
|
||||
WOMatRec = INSERT(WOMatRec,WO_MAT_INV_USER$,Pos,0,ScanUserID)
|
||||
WOMatRec = INSERT(WOMatRec,WO_MAT_INV_TAG$,Pos,0,Tag)
|
||||
WOMatRec = INSERT(WOMatRec,WO_MAT_INV_TOOL_ID$,Pos,0,ToolID)
|
||||
WOMatRec = INSERT(WOMatRec,WO_MAT_INV_SCAN_ENTRY$,Pos,0,False$)
|
||||
|
||||
LOCATE thisInvDTM IN WOMatRec<WO_MAT_INV_DTM$> BY 'AR' USING @VM SETTING Pos ELSE
|
||||
END
|
||||
|
||||
WOMatRec = INSERT(WOMatRec,WO_MAT_INV_WH$,Pos,0,WHCd)
|
||||
WOMatRec = INSERT(WOMatRec,WO_MAT_INV_LOCATION$,Pos,0,LocCd)
|
||||
WOMatRec = INSERT(WOMatRec,WO_MAT_INV_ACTION$,Pos,0,InvAction)
|
||||
WOMatRec = INSERT(WOMatRec,WO_MAT_INV_DTM$,Pos,0,thisInvDTM)
|
||||
WOMatRec = INSERT(WOMatRec,WO_MAT_INV_USER$,Pos,0,ScanUserID)
|
||||
WOMatRec = INSERT(WOMatRec,WO_MAT_INV_TAG$,Pos,0,Tag)
|
||||
WOMatRec = INSERT(WOMatRec,WO_MAT_INV_TOOL_ID$,Pos,0,ToolID)
|
||||
WOMatRec = INSERT(WOMatRec,WO_MAT_INV_SCAN_ENTRY$,Pos,0,False$)
|
||||
WOMatParms = 'WO_MAT':@RM:WOMKey:@RM:WOMTableVar:@RM:WOMatRec
|
||||
obj_Tables('WriteRec',WOMatParms) ;* This writes and unlocks the WO_MAT records
|
||||
|
||||
END
|
||||
|
||||
WOMatParms = 'WO_MAT':@RM:WOMKey:@RM:WOMTableVar:@RM:WOMatRec
|
||||
obj_Tables('WriteRec',WOMatParms) ;* This writes and unlocks the WO_MAT records
|
||||
|
||||
If Not(Get_Status(errCode)) then
|
||||
Done = True$
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
|
||||
LogData<4> = 'WONo:':WONo:' WOStep:':WOStep:' CassNos:':CassNos:' CassCnt:':CassCnt:' WMOLoadQty:':WMOLoadQty:' ||| Trace 3.':AttemptIndex:' Successfully updated WO_MAT record ':WOMKey:' with REL operation.'
|
||||
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
|
||||
end else
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
|
||||
LogData<4> = 'WONo:':WONo:' WOStep:':WOStep:' CassNos:':CassNos:' CassCnt:':CassCnt:' WMOLoadQty:':WMOLoadQty:' ||| Trace 3.':AttemptIndex:' Failed to update WO_MAT record ':WOMKey:' with REL operation.'
|
||||
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
|
||||
end
|
||||
|
||||
IF ReactType = 'EPP' OR ReactType = 'GAN' THEN
|
||||
obj_WO_Wfr('CassRel',WOMKey) ;* Added 3/17/2016 JCH for wafer history
|
||||
END
|
||||
END else
|
||||
If Not(Get_Status(errCode)) then
|
||||
Done = True$
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
|
||||
LogData<4> = 'WONo:':WONo:' WOStep:':WOStep:' CassNos:':CassNos:' CassCnt:':CassCnt:' WMOLoadQty:':WMOLoadQty:' ||| Trace 3.':AttemptIndex:' Error! REL_DTM is not null.'
|
||||
LogData<4> = 'WONo:':WONo:' WOStep:':WOStep:' CassNo:':CassNo:' WMOLoadQty:':WMOLoadQty:' ||| Trace 3.':AttemptIndex:' Successfully updated WO_MAT record ':WOMKey:' with REL operation.'
|
||||
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
|
||||
end else
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
|
||||
LogData<4> = 'WONo:':WONo:' WOStep:':WOStep:' CassNo:':CassNo:' WMOLoadQty:':WMOLoadQty:' ||| Trace 3.':AttemptIndex:' Failed to update WO_MAT record ':WOMKey:' with REL operation.'
|
||||
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
|
||||
end
|
||||
end
|
||||
Until Done
|
||||
Next AttemptIndex
|
||||
|
||||
NEXT N
|
||||
IF ReactType = 'EPP' OR ReactType = 'GAN' THEN
|
||||
obj_WO_Wfr('CassRel',WOMKey) ;* Added 3/17/2016 JCH for wafer history
|
||||
END
|
||||
END else
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
|
||||
LogData<4> = 'WONo:':WONo:' WOStep:':WOStep:' CassNo:':CassNo:' WMOLoadQty:':WMOLoadQty:' ||| Trace 3.':AttemptIndex:' Error! REL_DTM is not null.'
|
||||
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
|
||||
end
|
||||
end
|
||||
Until Done
|
||||
Next AttemptIndex
|
||||
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
|
||||
LogData<4> = 'WONo:':WONo:' WOStep:':WOStep:' CassNos:':CassNos:' CassCnt:':CassCnt:' WMOLoadQty:':WMOLoadQty:' ||| Trace 4'
|
||||
LogData<4> = 'WONo:':WONo:' WOStep:':WOStep:' CassNo:':CassNo:' WMOLoadQty:':WMOLoadQty:' ||| Trace 4'
|
||||
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
|
||||
|
||||
OutOnlyCnt = COUNT(OutOnlyCassIDs,@VM) + (OutOnlyCassIDs NE '')
|
||||
OutOnlyCnt = DCount(OutOnlyCassIDs, @VM)
|
||||
ExistingWOMatKeys = WORec<WO_LOG_WO_MAT_KEY$>
|
||||
NewWOMatKeys = ExistingWOMatKeys
|
||||
FOR I = 1 TO OutOnlyCnt
|
||||
@ -1351,7 +1331,7 @@ ReleaseCassettes:
|
||||
NEXT I
|
||||
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
|
||||
LogData<4> = 'WONo:':WONo:' WOStep:':WOStep:' CassNos:':CassNos:' CassCnt:':CassCnt:' WMOLoadQty:':WMOLoadQty:' ||| Trace 5'
|
||||
LogData<4> = 'WONo:':WONo:' WOStep:':WOStep:' CassNo:':CassNo:' WMOLoadQty:':WMOLoadQty:' ||| Trace 5'
|
||||
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
|
||||
|
||||
ReactNos = obj_Sched('GetReactNos',WONo) ; // 5/26/2-15 JCH Added schedule ReactNos and check for WO_START_DTM$
|
||||
@ -1401,12 +1381,12 @@ ReleaseCassettes:
|
||||
|
||||
If ErrorMsg NE '' then
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
|
||||
LogData<4> = 'WONo:':WONo:' WOStep:':WOStep:' CassNos:':CassNos:' CassCnt:':CassCnt:' WMOLoadQty:':WMOLoadQty:' ||| Error Message: ':ErrorMsg
|
||||
LogData<4> = 'WONo:':WONo:' WOStep:':WOStep:' CassNo:':CassNo:' WMOLoadQty:':WMOLoadQty:' ||| Error Message: ':ErrorMsg
|
||||
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
|
||||
end
|
||||
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
|
||||
LogData<4> = 'WONo:':WONo:' WOStep:':WOStep:' CassNos:':CassNos:' CassCnt:':CassCnt:' WMOLoadQty:':WMOLoadQty:' ||| Ending ReleaseCassettes routine'
|
||||
LogData<4> = 'WONo:':WONo:' WOStep:':WOStep:' CassNo:':CassNo:' WMOLoadQty:':WMOLoadQty:' ||| Ending ReleaseCassette routine'
|
||||
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
|
||||
|
||||
RETURN
|
||||
@ -2348,7 +2328,6 @@ Route:
|
||||
|
||||
IF Get_Status(errCode) THEN RETURN
|
||||
|
||||
|
||||
WOStepKeys = WOLogRec<WO_LOG_WO_STEP_KEY$>
|
||||
|
||||
IF WOStepKeys NE '' THEN
|
||||
@ -2386,7 +2365,6 @@ Route:
|
||||
|
||||
DefWMOCassQtys = XLATE('CUST_EPI_PART',CustNo:'*':EpiPartNo,CUST_EPI_PART_WMO_LOAD_CNT$,'X')
|
||||
|
||||
|
||||
WOStepKeys = ''
|
||||
DefWMOCassQty = ''
|
||||
|
||||
@ -2418,8 +2396,43 @@ Route:
|
||||
WOLogRec<WO_LOG_CUST_PART_NO$> = EpiPN
|
||||
END
|
||||
|
||||
WOLogRec<WO_LOG_PROD_VER_NO$> = ProdVerNo
|
||||
WOLogRec<WO_LOG_CUST_NO$> = CustNo
|
||||
WOLogRec<WO_LOG_PROD_VER_NO$> = ProdVerNo
|
||||
WOLogRec<WO_LOG_CUST_NO$> = CustNo
|
||||
|
||||
WOQty = WOLogRec<WO_LOG_WO_QTY$>
|
||||
If WOQty EQ '' then
|
||||
WOQty = 0
|
||||
WOLogRec<WO_LOG_WO_QTY$> = WOQty
|
||||
end
|
||||
RxQty = WOLogRec<WO_LOG_RX_QTY_STATIC$>
|
||||
If RxQty EQ '' then
|
||||
RxQty = 0
|
||||
WOLOgRec<WO_LOG_RX_QTY_STATIC$> = RxQty
|
||||
end
|
||||
RelQty = WOLogRec<WO_LOG_REL_QTY_STATIC$>
|
||||
If RelQty EQ '' then
|
||||
RelQty = 0
|
||||
WOLogRec<WO_LOG_REL_QTY_STATIC$> = RelQty
|
||||
end
|
||||
UnRelQty = WOLogRec<WO_LOG_UNREL_QTY_STATIC$>
|
||||
If UnRelQty EQ '' then
|
||||
UnRelQty = WOQty - RelQty
|
||||
end
|
||||
OpenQty = WOLogRec<WO_LOG_OPEN_QTY_STATIC$>
|
||||
If OpenQty EQ '' then
|
||||
OpenQty = WOQty - RxQty
|
||||
WOLogRec<WO_LOG_OPEN_QTY_STATIC$> = OpenQty
|
||||
end
|
||||
ScrapQty = WOLogRec<WO_LOG_SCRAP_QTY_STATIC$>
|
||||
If ScrapQty EQ '' then
|
||||
ScrapQty = 0
|
||||
WOLogRec<WO_LOG_SCRAP_QTY_STATIC$> = ScrapQty
|
||||
end
|
||||
ShippedQty = WOLogRec<WO_LOG_STATIC_SHIP_QTY$>
|
||||
If ShippedQty EQ '' then
|
||||
ShippedQty = 0
|
||||
WOLogRec<WO_LOG_STATIC_SHIP_QTY$> = ShippedQty
|
||||
end
|
||||
|
||||
otParms = FIELDSTORE(otParms,@RM,4,0,WOLogRec)
|
||||
obj_Tables('WriteRec',otParms)
|
||||
|
@ -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 '')
|
||||
|
||||
@ -1249,10 +1258,11 @@ AddInvTrans:
|
||||
END
|
||||
END
|
||||
|
||||
OtParms = FieldStore(OtParms,@RM,4,0,WOMatRec) ;* Put record in 4th field of OtParms
|
||||
|
||||
Done = False$
|
||||
NumAttempts = 0
|
||||
OtParms = FieldStore(OtParms,@RM,4,0,WOMatRec) ;* Put record in 4th field of OtParms
|
||||
LogPos = ''
|
||||
ThisEntryAction = ''
|
||||
Done = False$
|
||||
NumAttempts = 0
|
||||
Loop
|
||||
NumAttempts += 1
|
||||
Database_Services('WriteDataRow', 'WO_MAT', WOMatKey, WOMatRec, True$, False$, False$)
|
||||
@ -1301,27 +1311,39 @@ AddInvTrans:
|
||||
Logging_Services('AppendLog', objLogInvTransError, LogData, @RM, @FM)
|
||||
end
|
||||
WOMatRecVerify = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
|
||||
LastEntryIndex = DCount(WOMatRecVerify<WO_MAT_INV_WH$>, @VM)
|
||||
LastEntryAction = WOMatRecVerify<WO_MAT_INV_ACTION$, LastEntryIndex>
|
||||
LastEntryLocCd = WOMatRecVerify<WO_MAT_INV_LOCATION$, LastEntryIndex>
|
||||
If LastEntryAction EQ InvAction AND LastEntryLocCd = LocCd then
|
||||
Done = True$
|
||||
If Pos EQ -1 then
|
||||
LastEntryIndex = DCount(WOMatRecVerify<WO_MAT_INV_WH$>, @VM)
|
||||
LogPos = LastEntryIndex
|
||||
ThisEntryAction = WOMatRecVerify<WO_MAT_INV_ACTION$, LastEntryIndex>
|
||||
ThisEntryLocCd = WOMatRecVerify<WO_MAT_INV_LOCATION$, LastEntryIndex>
|
||||
If ThisEntryAction EQ InvAction AND ThisEntryLocCd = LocCd then
|
||||
Done = True$
|
||||
end
|
||||
end else
|
||||
LogPos = Pos
|
||||
ThisEntryAction = WOMatRecVerify<WO_MAT_INV_ACTION$, Pos>
|
||||
ThisEntryLocCd = WOMatRecVerify<WO_MAT_INV_LOCATION$, Pos>
|
||||
If ThisEntryAction EQ InvAction AND ThisEntryLocCd = LocCd then
|
||||
Done = True$
|
||||
end
|
||||
end
|
||||
Until ( (Done EQ True$) or (NumAttempts EQ 10) )
|
||||
Repeat
|
||||
|
||||
If LogPos EQ '' then LogPos = DCount(WOMatRecVerify<WO_MAT_INV_DTM$>, @VM)
|
||||
|
||||
LogData = ''
|
||||
LogData<1> = WOMatRecVerify<WO_MAT_INV_DTM$, LastEntryIndex>
|
||||
LogData<1> = WOMatRecVerify<WO_MAT_INV_DTM$, LogPos>
|
||||
LogData<2> = WONo
|
||||
LogData<3> = CassNo
|
||||
LogData<4> = WOMatRecVerify<WO_MAT_INV_USER$, LastEntryIndex>
|
||||
LogData<5> = LastEntryIndex
|
||||
LogData<6> = WOMatRecVerify<WO_MAT_INV_TAG$, LastEntryIndex>
|
||||
LogData<7> = WOMatRecVerify<WO_MAT_INV_WH$, LastEntryIndex>
|
||||
LogData<8> = WOMatRecVerify<WO_MAT_INV_LOCATION$, LastEntryIndex>
|
||||
LogData<9> = LastEntryAction
|
||||
LogData<10> = WOMatRecVerify<WO_MAT_INV_TOOL_ID$, LastEntryIndex>
|
||||
LogData<11> = WOMatRecVerify<WO_MAT_INV_SCAN_ENTRY$, LastEntryIndex>
|
||||
LogData<4> = WOMatRecVerify<WO_MAT_INV_USER$, LogPos>
|
||||
LogData<5> = LogPos
|
||||
LogData<6> = WOMatRecVerify<WO_MAT_INV_TAG$, LogPos>
|
||||
LogData<7> = WOMatRecVerify<WO_MAT_INV_WH$, LogPos>
|
||||
LogData<8> = WOMatRecVerify<WO_MAT_INV_LOCATION$, LogPos>
|
||||
LogData<9> = ThisEntryAction
|
||||
LogData<10> = WOMatRecVerify<WO_MAT_INV_TOOL_ID$, LogPos>
|
||||
LogData<11> = WOMatRecVerify<WO_MAT_INV_SCAN_ENTRY$, LogPos>
|
||||
LogData<12> = NumAttempts
|
||||
Logging_Services('AppendLog', WOMatObjLog3, LogData, @RM, @FM)
|
||||
|
||||
@ -3284,7 +3306,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
|
||||
|
||||
@ -5713,4 +5748,3 @@ ExpCOA:
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
@ -551,23 +551,32 @@ RemQAMet:
|
||||
|
||||
IF WOMatQARec<WO_MAT_QA_SIG$,DelPos> = '' THEN
|
||||
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_PROFILE$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_PROP$,DelPos,0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_TOOL_CLASS$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_STAGE$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_MIN$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_MAX$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_SLOT$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_RECIPE$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_RECIPE_PATTERN$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_SIG$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_SIG_DTM$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_STD_MAX$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_STD_RESULT$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_WFR_QTY$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_WFR_TYPE$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_REACT_SCHED$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_SHIP_DOC$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_PROFILE$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_PROP$,DelPos,0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_TOOL_CLASS$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_STAGE$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_MIN$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_MAX$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_SLOT$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_RECIPE$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_RECIPE_PATTERN$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_SIG$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_SIG_DTM$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_STD_MAX$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_STD_RESULT$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_WFR_QTY$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_WFR_TYPE$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_REACT_SCHED$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_SHIP_DOC$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_DATA_POINTS$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_MIN_RESULT$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_MAX_RESULT$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_RANGE_PCT_RESULT$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_EDGE_MEAN_RESULT$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_5MM_PCT_RESULT$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_OUT_OF_SPEC$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_PHASE_MIN$, DelPos, 0)
|
||||
WOMatQARec = DELETE(WOMatQARec, WO_MAT_QA_FAIL_REASON$, DelPos, 0)
|
||||
|
||||
otParms = FIELDSTORE(otParms,@RM,4,0,WOMatQARec)
|
||||
obj_Tables('WriteRec',otParms)
|
||||
@ -754,5 +763,3 @@ QAResults:
|
||||
|
||||
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
|
||||
// Add QAMet spec data to cassettes now associated with the test
|
||||
// positions after removing the RDS & Cassno from the lists
|
||||
GOSUB AddSchedQA
|
||||
|
||||
END
|
||||
otParms = FIELDSTORE(otParms,@RM,4,0,WOReactRec)
|
||||
// Done with updates to the WO_REACT record
|
||||
obj_Tables('WriteOnlyRec',otParms)
|
||||
|
||||
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
|
||||
Result = Log
|
||||
|
||||
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 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
|
||||
|
||||
RDSNos = WOReactRec<WO_REACT_RDS_NO$>
|
||||
CassNos = WOReactRec<WO_REACT_CASS_NO$>
|
||||
WOReactRec = obj_Tables('ReadOnlyRec',otParms)
|
||||
|
||||
PSNos = XLATE('WO_LOG',WoNo,'PROD_VER_STEP_PSN','X')
|
||||
PSNo = PSNos<1,StepNo>
|
||||
RDSNos = WOReactRec<WO_REACT_RDS_NO$>
|
||||
CassNos = WOReactRec<WO_REACT_CASS_NO$>
|
||||
|
||||
QAMetData = obj_Prod_Spec('GetQAMet',PSNo:@RM:@RM:1) ;* * * Get Reactor Scheduled QA Metrology * * *
|
||||
PSNos = XLATE('WO_LOG',WoNo,'PROD_VER_STEP_PSN','X')
|
||||
PSNo = PSNos<1,StepNo>
|
||||
|
||||
Start = QAMetData<COL$QA_MET_START>
|
||||
Interval = QAMetData<COL$QA_MET_INTERVAL>
|
||||
Stage = QAMetData<COL$QA_MET_STAGE>
|
||||
MetPropCd = QAMetData<COL$QA_MET_PROP>
|
||||
QAMetData = obj_Prod_Spec('GetQAMet',PSNo:@RM:@RM:1) ;* * * Get Reactor Scheduled QA Metrology * * *
|
||||
|
||||
GOSUB BuildAllTestPos ;* Set RDSNos, Start and Interval -> returns AllTestPos
|
||||
Start = QAMetData<COL$QA_MET_START>
|
||||
Interval = QAMetData<COL$QA_MET_INTERVAL>
|
||||
Stage = QAMetData<COL$QA_MET_STAGE>
|
||||
MetPropCd = QAMetData<COL$QA_MET_PROP>
|
||||
|
||||
IF AllTestPos NE '' THEN
|
||||
GOSUB BuildAllTestPos ;* Set RDSNos, Start and Interval -> returns AllTestPos
|
||||
|
||||
* * * Find where the the RDS being removed is in the list. * * *
|
||||
IF AllTestPos NE '' THEN
|
||||
|
||||
LOCATE RDSNo IN WOReactRec<WO_REACT_RDS_NO$> USING @VM SETTING RemPos THEN
|
||||
* * * Find where the the RDS being removed is in the list. * * *
|
||||
|
||||
LOCATE RemPos IN AllTestPos USING @VM SETTING TrimPos ELSE Null
|
||||
LOCATE RDSNo IN WOReactRec<WO_REACT_RDS_NO$> USING @VM SETTING RemPos THEN
|
||||
|
||||
ChangePosList = FIELD(AllTestPos,@VM,TrimPos,SeqCnt)
|
||||
LOCATE RemPos IN AllTestPos USING @VM SETTING TrimPos ELSE Null
|
||||
|
||||
GOSUB RemSchedQA ;* Removes unsigned QAMet from cassettes scheduled past the box being removed
|
||||
END ELSE
|
||||
ChangePosList = FIELD(AllTestPos,@VM,TrimPos,SeqCnt)
|
||||
|
||||
otParms = 'WO_REACT':@RM:WOReactKey
|
||||
WOReactRec = obj_Tables('UnlockRec',otParms)
|
||||
GOSUB RemSchedQA ;* Removes unsigned QAMet from cassettes scheduled past the box being removed
|
||||
END ELSE
|
||||
|
||||
RETURN ;* RDSNo is not in this list -> nothing to do.
|
||||
END
|
||||
END ;* End of check for AllTestPos null
|
||||
otParms = 'WO_REACT':@RM:WOReactKey
|
||||
WOReactRec = obj_Tables('UnlockRec',otParms)
|
||||
|
||||
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
|
||||
RETURN ;* RDSNo is not in this list -> nothing to do.
|
||||
END
|
||||
END ;* End of check for AllTestPos null
|
||||
|
||||
RDSNos = WOReactRec<WO_REACT_RDS_NO$> ;* List after removal
|
||||
CassNos = WOReactRec<WO_REACT_CASS_NO$> ;* List after removal
|
||||
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
|
||||
|
||||
* * * Now build list for cassette
|
||||
RDSNos = WOReactRec<WO_REACT_RDS_NO$> ;* List after removal
|
||||
CassNos = WOReactRec<WO_REACT_CASS_NO$> ;* List after removal
|
||||
|
||||
GOSUB BuildAllTestPos
|
||||
ChangePosList = FIELD(AllTestPos,@VM,TrimPos,SeqCnt)
|
||||
* * * Now build list for cassette
|
||||
|
||||
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 BuildAllTestPos
|
||||
ChangePosList = FIELD(AllTestPos,@VM,TrimPos,SeqCnt)
|
||||
|
||||
Result = Log
|
||||
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)
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
obj_Tables('WriteOnlyRec',otParms) ;* Done with updates to the WO_REACT record
|
||||
|
||||
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
|
||||
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
|
||||
owmParms = WONo:@RM:StepNo:@RM:RemCassNo:@RM:Stage:@RM:MetPropCd
|
||||
|
||||
obj_WO_Mat_QA('RemQAMet',owmParms) ;* Unschedule test boxes before list change
|
||||
obj_WO_Mat_QA('RemQAMet',owmParms) ;* Unschedule test boxes before list change
|
||||
|
||||
IF Get_Status(errCode) THEN
|
||||
ErrMsg(errCode)
|
||||
END
|
||||
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
|
||||
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>>
|
||||
FOR I = 1 TO chgCnt
|
||||
AddCassNo = CassNos<1,ChangePoslist<1,I>>
|
||||
|
||||
Log:= 'AddSched on CassNo: ':AddCassNo:@FM
|
||||
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
|
||||
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
|
||||
obj_WO_Mat_QA('AddQAMet', owmParms) ;* Schedule test boxes after list change
|
||||
|
||||
IF Get_Status(errCode) THEN
|
||||
ErrMsg(errCode)
|
||||
END
|
||||
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
|
||||
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
|
||||
|
||||
|
@ -41,9 +41,11 @@ Function OI_Wizard_Actions(Action, CalcColName, FSList, Handle, Name, FMC, Recor
|
||||
***********************************************************************************************************************/
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$insert LOGICAL
|
||||
$insert FILE.SYSTEM.EQUATES
|
||||
$insert ACTION_SETUP
|
||||
$Insert LOGICAL
|
||||
$Insert FILE.SYSTEM.EQUATES
|
||||
$Insert ACTION_SETUP
|
||||
$Insert OI_WIZARD_EQUATES
|
||||
$Insert TIME_INSERTS
|
||||
|
||||
Declare function UCase, Utility_DotNet, Database_Services, Error_Services, Datetime
|
||||
|
||||
@ -140,12 +142,10 @@ VALID:
|
||||
LastDate = {CREATED_DATE}
|
||||
LastTime = {CREATED_TIME}
|
||||
end
|
||||
lastDateTime = Iconv(Oconv(LastDate, 'D4/') : ' ' : Oconv(LastTime, 'MTS'), 'DTS')
|
||||
SessionAge = (Datetime() - lastDateTime) * 86400
|
||||
// 600 seconds = 10 minutes
|
||||
If SessionAge LT 600 then
|
||||
Valid = True$
|
||||
end
|
||||
LastDateTime = Iconv(Oconv(LastDate, 'D4/') : ' ' : Oconv(LastTime, 'MTS'), 'DTS')
|
||||
SessionAge = (Datetime() - LastDateTime) * SECONDS_IN_DAY$
|
||||
MaxAge = HOUR_IN_SECONDS$ * 12
|
||||
If SessionAge LT MaxAge then Valid = True$
|
||||
end
|
||||
ActionFlow = Valid
|
||||
|
||||
@ -164,8 +164,9 @@ EXPIRY:
|
||||
LastTime = {CREATED_TIME}
|
||||
end
|
||||
lastDateTime = Iconv(Oconv(LastDate, 'D4/') : ' ' : Oconv(LastTime, 'MTS'), 'DTS')
|
||||
// Set expiry to last updated datetime (i.e. last time the session was updated/validated) plus 10 minutes
|
||||
Expiry = lastDateTime + (600 / 86400)
|
||||
// Set expiry to last updated datetime (i.e. last time the session was updated/validated)
|
||||
// plus 12 hours (0.5 of a day).
|
||||
Expiry = lastDateTime + 0.5
|
||||
end
|
||||
ActionFlow = Expiry
|
||||
|
||||
@ -288,3 +289,4 @@ Restore_System_Variables:
|
||||
@FILE.ERROR = OrigFileError
|
||||
|
||||
return
|
||||
|
||||
|
@ -1,9 +1,10 @@
|
||||
Compile function OI_Wizard_Services(@Service, @Params)
|
||||
#pragma precomp SRP_PreCompiler
|
||||
$insert LOGICAL
|
||||
$insert OI_WIZARD_EQUATES
|
||||
$insert OI_WIZARD_TRANSACTIONS_EQUATES
|
||||
$Insert LOGICAL
|
||||
$Insert OI_WIZARD_EQUATES
|
||||
$Insert OI_WIZARD_TRANSACTIONS_EQUATES
|
||||
$Insert REACT_MODE_NG_EQUATES
|
||||
$Insert TIME_INSERTS
|
||||
|
||||
Declare function RTI_CreateGUID, Database_Services, Error_Services, SRP_Json, MemberOf
|
||||
Declare function OI_Wizard_Services, Reactor_Services, Reactor_Modes_Services, Datetime
|
||||
@ -198,9 +199,9 @@ Service ValidateSession(OIWizardID)
|
||||
LastTime = OIWizardRec<OI_WIZARD.CREATED_TIME$>
|
||||
end
|
||||
lastDateTime = Iconv(Oconv(LastDate, 'D4/') : ' ' : Oconv(LastTime, 'MTS'), 'DTS')
|
||||
SessionAge = (Datetime() - lastDateTime) * 86400
|
||||
// 600 seconds = 10 minutes
|
||||
If SessionAge LT 600 then
|
||||
SessionAge = (Datetime() - lastDateTime) * SECONDS_IN_DAY$
|
||||
MaxAge = HOUR_IN_SECONDS$ * 12
|
||||
If SessionAge LT MaxAge then
|
||||
OIWizardRec<OI_WIZARD.UPDATED_DATES$, -1> = Date()
|
||||
OIWizardRec<OI_WIZARD.UPDATED_TIMES$, -1> = Time()
|
||||
Database_Services('WriteDataRow', 'OI_WIZARD', OIWizardID, OIWizardRec)
|
||||
@ -498,11 +499,3 @@ Service ConvertMVTransactionToJSON(TransactionID, mvTransaction, itemURL)
|
||||
|
||||
end service
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -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"
|
||||
|
@ -1,481 +0,0 @@
|
||||
COMPILE SUBROUTINE Print_Demand(ReportParm)
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
/*
|
||||
Print Material Demand Report
|
||||
10/27/2016 - John C Henry, J.C. Henry & Co., Inc. - Initial Coding
|
||||
10/05/2017 - Donald Bakke - No longer select SCHED_DET rows with an end date specified.
|
||||
10/24/2018 - Daniel Stieber - Patch added to resolve scheduling conflicts on the same day
|
||||
*/
|
||||
|
||||
DECLARE SUBROUTINE Utility, ErrMsg, Set_Status, Set_Printer, RList, SRP_Stopwatch
|
||||
DECLARE FUNCTION Set_Printer, Get_Printer, Msg, Get_Status, Printer_Select, obj_Install, Dialog_Box, obj_Location
|
||||
DECLARE FUNCTION Schedule_Services
|
||||
|
||||
$INSERT OIPRINT_EQUATES
|
||||
$INSERT SCHED_DET_EQUATES
|
||||
$INSERT WO_LOG_EQUATES
|
||||
$INSERT APPCOLORS
|
||||
$INSERT MSG_EQUATES
|
||||
$INSERT LOGICAL
|
||||
$INSERT SCHEDULE_EQU
|
||||
|
||||
EQU TAB$ TO \09\
|
||||
EQU TARGET_ACTIVELIST$ TO 5
|
||||
|
||||
Main:
|
||||
ErrorTitle = 'Error in stored procedure Print_Demand'
|
||||
ErrCode = ''
|
||||
ErrorMsg = ''
|
||||
SRP_Stopwatch('Reset')
|
||||
SRP_Stopwatch('Start', 'Initializing')
|
||||
OPEN 'SCHED_DET' TO SchedDetTable ELSE
|
||||
ErrorMsg = 'Unable to open "SCHED_DET" table.'
|
||||
ErrMsg(ErrorTitle:@SVM:ErrorMsg)
|
||||
RETURN
|
||||
END
|
||||
|
||||
OPEN 'DICT.SCHED_DET' TO @DICT ELSE
|
||||
ErrorMsg = 'Unable to open "SCHED_DET" table.'
|
||||
ErrMsg(ErrorTitle:@SVM:ErrorMsg)
|
||||
RETURN
|
||||
END
|
||||
|
||||
|
||||
Today = OCONV(Date(),'D4/')
|
||||
|
||||
EndDate = OCONV(Date()+13,'D4/')
|
||||
|
||||
|
||||
ReactList = ''
|
||||
WOList = ''
|
||||
SchedDetKeys = ''
|
||||
PrevReactNo = ''
|
||||
PrevWO = ''
|
||||
|
||||
SelectSent = 'SELECT SCHED_DET WITH SCHED_DT GE ':QUOTE(Today):' BY REACT_NO'
|
||||
|
||||
SRP_Stopwatch('Stop', 'Initializing')
|
||||
SRP_Stopwatch('Start', 'Data Select')
|
||||
|
||||
RList(SelectSent,TARGET_ACTIVELIST$,'','','')
|
||||
IF Get_Status(errCode) THEN
|
||||
ErrMsg(errCode)
|
||||
RETURN
|
||||
END
|
||||
SRP_Stopwatch('Stop', 'Data Select')
|
||||
SRP_Stopwatch('Start', 'Build Key List')
|
||||
Done = 0
|
||||
@ID = ''
|
||||
LOOP
|
||||
PrevSchedDetKey = @ID
|
||||
READNEXT @ID ELSE Done = 1
|
||||
UNTIL Done
|
||||
ReactNo = @ID[1,'*']
|
||||
SchedDt = @ID[COL2()+1,'*']
|
||||
SeqNo = @ID[COL2()+1,'*']
|
||||
|
||||
READ SchedDetRec FROM SchedDetTable,@ID THEN
|
||||
|
||||
WONo = SchedDetRec<SCHED_DET_WO_NO$>
|
||||
|
||||
LOCATE ReactNo IN ReactList BY 'AR' USING @FM SETTING Pos ELSE
|
||||
ReactList = INSERT(ReactList,Pos,0,0,ReactNo)
|
||||
END
|
||||
|
||||
PrevReactNo = Field(PrevSchedDetKey, '*', 1)
|
||||
PrevSchedDt = Field(PrevSchedDetKey, '*', 2)
|
||||
|
||||
LOCATE WONo IN WOList<Pos> USING @VM SETTING WPos ELSE
|
||||
WOList = INSERT(WOList,Pos,-1,0,WONo)
|
||||
// Patch added on 10/24/18 to resolve scheduling conflicts on the same day for
|
||||
// the material track report. - djs
|
||||
If (PrevReactNo EQ ReactNo) and (PrevSchedDt EQ SchedDt) then
|
||||
PrevSeqNo = Field(PrevSchedDetKey, '*', 3)
|
||||
NumWO = DCount(WOList<Pos>, @VM)
|
||||
PrevWONo = WOList<Pos, NumWO - 1>
|
||||
SchedEvents = Schedule_Services('GetScheduleEventSummary', ReactNo, WONo, SchedDt, SeqNo, True$)
|
||||
StartDt = IConv(SchedEvents<SCHEDULE_ENTRY_DATE$>, 'D')
|
||||
PrevSchedEvents = Schedule_Services('GetScheduleEventSummary', ReactNo, PrevWONo, PrevSchedDt, PrevSeqNo, True$)
|
||||
PrevStartDt = IConv(PrevSchedEvents<SCHEDULE_ENTRY_DATE$>, 'D')
|
||||
If StartDt GT PrevStartDt then
|
||||
// This is the common case
|
||||
SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,@ID)
|
||||
end else
|
||||
// Scheduling irregularity - Insert this key in the second to last position.
|
||||
NumKeys = DCount(SchedDetKeys, @FM)
|
||||
InsertPos = NumKeys
|
||||
SchedDetKeys = INSERT(SchedDetKeys,InsertPos,0,0,@ID)
|
||||
end
|
||||
end else
|
||||
SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,@ID)
|
||||
end
|
||||
END
|
||||
END
|
||||
|
||||
REPEAT
|
||||
|
||||
CALL Make.List(0,SchedDetKeys,SchedDetTable,@DICT)
|
||||
SRP_Stopwatch('Stop', 'Build Key List')
|
||||
SRP_Stopwatch('Start', 'Build Report')
|
||||
IF ReportParm = 'T' THEN
|
||||
|
||||
* Tracking Report
|
||||
|
||||
Header = "'D'":@VM:obj_Install('Get_Prop','CompTitle'):' Material Tracking by Reactor':@VM:"Page 'P'"
|
||||
MinDemand = 0
|
||||
|
||||
END
|
||||
|
||||
IF ReportParm = 'D' THEN
|
||||
|
||||
* Demand Report
|
||||
|
||||
MinDemand = Msg(@WINDOW,'','MIN_DEMAND_QTY')
|
||||
Header = "'D'":@VM:obj_Install('Get_Prop','CompTitle'):' Material Demand with Reactor Queue < ':MinDemand:' Cassettes':@VM:"Page 'P'"
|
||||
|
||||
END
|
||||
|
||||
Set_Status(0)
|
||||
|
||||
* Start of printing process
|
||||
|
||||
FileName = 'Print Material Demand'
|
||||
Title = 'Printing Material Demand'
|
||||
|
||||
TopMargin = 1.0
|
||||
BottomMargin = 0.75
|
||||
LeftMargin = 0.25
|
||||
RightMargin = 0.25
|
||||
|
||||
Margins = LeftMargin:@FM:TopMargin:@FM:RightMargin:@FM:BottomMargin
|
||||
|
||||
PageSetup = '1' ;* LandScape
|
||||
PrintSetup = '2' ;* Preview Normal
|
||||
PrintSetup<1,2> = '0' ;* All buttons
|
||||
PrintSetup<1,5> = '1' ;* Page Range
|
||||
PrintSetup<1,6> = 7 ;* full mouse and keyboard support
|
||||
|
||||
PrintPath = ''
|
||||
stat = Set_Printer('INIT',FileName,Title,Margins,PageSetup,PrintSetup,PrintPath)
|
||||
|
||||
IF stat < 0 THEN
|
||||
ErrorMsg = 'Stat = ' : Stat : ', PrintPath = ' : PrintPath
|
||||
GOTO OIPrintErr
|
||||
end
|
||||
DateRange = 'Effective ':OCONV(Date(),'D4')
|
||||
|
||||
Header<-1> = "'T'"
|
||||
Header<-1> = '' ;* Blank line following heading
|
||||
|
||||
font = 'Arial'
|
||||
font<2> = '10'
|
||||
font<4> = '0' ;* Bold
|
||||
|
||||
stat = Set_Printer('FONTHEADFOOT',font) ; IF stat < 0 THEN GOTO OIPrintErr
|
||||
stat = Set_Printer('HEADER',Header) ; IF stat < 0 THEN GOTO OIPrintErr
|
||||
|
||||
Footer = " 'D' 'T'":@VM:@VM:"Page: 'P'"
|
||||
stat = Set_Printer('FOOTER',Footer) ; IF stat < 0 THEN GOTO OIPrintErr
|
||||
|
||||
*
|
||||
@RECCOUNT = 0
|
||||
FirstPass = 1
|
||||
LastRecord = 0
|
||||
FirstLine = 1
|
||||
fontSpacing = 100
|
||||
|
||||
* Make Column Heading
|
||||
|
||||
ColHead = '' ; ColFmt = ''
|
||||
ColHead<1,1> = 'React No' ; ColFmt<1,1> = '+^720'
|
||||
ColHead<1,2> = 'React Type' ; ColFmt<1,2> = '+<^720'
|
||||
ColHead<1,4> = 'WO No' ; ColFmt<1,4> = '+^1000'
|
||||
ColHead<1,5> = 'SAP Prod No' ; ColFmt<1,5> = '+^1000'
|
||||
ColHead<1,6> = 'Sub Part No' ; ColFmt<1,6> = '+<1200'
|
||||
ColHead<1,7> = 'Epi Part No' ; ColFmt<1,7> = '+<1200'
|
||||
ColHead<1,8> = 'WO Qty' ; ColFmt<1,8> = '+>720'
|
||||
ColHead<1,9> = 'RX Qty' ; ColFmt<1,9> = '+>720'
|
||||
ColHead<1,10> = 'UnRel Qty' ; ColFmt<1,10> = '+>720'
|
||||
ColHead<1,11> = 'Kit Location' ; ColFmt<1,11> = '+^1260'
|
||||
ColHead<1,12> = 'Kit Qty' ; ColFmt<1,12> = '+^720'
|
||||
IF ReportParm = 'T' THEN
|
||||
ColHead<1,3> = 'Wafer Size' ; ColFmt<1,3> = '+^1400'
|
||||
ColHead<1,13> = 'PTI Location' ; ColFmt<1,13> = '+^1260'
|
||||
ColHead<1,14> = 'PTI RO' ; ColFmt<1,14> = '+^3380'
|
||||
END ELSE
|
||||
ColHead<1,3> = 'Wafer Size' ; ColFmt<1,3> = '+^1000'
|
||||
ColHead<1,13> = '1K Stage Location' ; ColFmt<1,13> = '+^1260'
|
||||
ColHead<1,14> = 'Stage Qty' ; ColFmt<1,14> = '+^1260'
|
||||
ColHead<1,15> = 'PTI Location' ; ColFmt<1,15> = '+^1260'
|
||||
ColHead<1,16> = 'PTI RO' ; ColFmt<1,16> = '+^1260'
|
||||
END
|
||||
|
||||
|
||||
* Zero Accumulators For Each Break
|
||||
|
||||
Prev.ReactNo = ''
|
||||
Last.ReactNo.Break = 1
|
||||
|
||||
* * * * * * *
|
||||
ReadRecord:
|
||||
* * * * * * *
|
||||
|
||||
* Zero Break Flags To False
|
||||
|
||||
ReactNo.Break=0
|
||||
|
||||
READNEXT @ID, Which.Value ELSE
|
||||
LastRecord = 1
|
||||
ReactNo.Break = 1
|
||||
ReactNo = Prev.ReactNo
|
||||
END
|
||||
|
||||
S.ATID = @ID
|
||||
|
||||
IF FirstPass AND LastRecord THEN
|
||||
GOTO Bail
|
||||
END
|
||||
|
||||
IF LastRecord THEN GOTO BREAKS
|
||||
|
||||
READO @RECORD FROM SchedDetTable,@ID ELSE
|
||||
GOTO ReadRecord
|
||||
END
|
||||
|
||||
@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 = {WO_QTY}
|
||||
I.WO_Qty = S.WO_Qty
|
||||
S.WO_RX_Qty = {WO_RX_QTY}
|
||||
I.WO_RX_Qty = S.WO_RX_Qty
|
||||
S.WO_UnRel_QTY = {WO_UNREL_QTY}
|
||||
I.WO_UnRel_QTY = S.WO_UnRel_QTY
|
||||
S.Sched_DT = {SCHED_DT}
|
||||
I.Sched_DT = S.Sched_DT
|
||||
*Changed Here JRO
|
||||
S.REACT_TYPE = {REACTOR_TYPE}
|
||||
S.WAFER_SIZE = {WAFER_SIZE}
|
||||
S.ProdOrdNo = {PROD_ORD_NO}
|
||||
|
||||
KitData = obj_Location('KitLocations',S.WONo)
|
||||
|
||||
SWAP CRLF$ WITH @VM IN KitData
|
||||
|
||||
S.KitLocation = KitData<1>
|
||||
I.KitLocation = S.KitLocation
|
||||
|
||||
S.KitQty = OCONV(SUM(KitData<2>) * 25,'MD0,Z')
|
||||
I.KitQty = S.KitQty
|
||||
|
||||
S.KitCassCnt = COUNT(KitData<3>,',') + (KitData<3> NE '')
|
||||
I.KitCassCnt = S.KitCassCnt
|
||||
|
||||
StageData = obj_Location('StageLocations',S.WONo)
|
||||
|
||||
SWAP CRLF$ WITH @VM IN StageData
|
||||
|
||||
S.StageLocation = StageData<1>
|
||||
I.StageLocation = S.StageLocation
|
||||
|
||||
S.StageQty = StageData<3>
|
||||
I.StageQty = S.StageQty
|
||||
|
||||
S.StageCassCnt = COUNT(S.StageQty,',') + (S.StageQty NE '')
|
||||
I.StageCassCnt = S.StageCassCnt
|
||||
|
||||
PTIData = obj_Location('PTILocations',S.WONo)
|
||||
|
||||
SWAP CRLF$ WITH @VM IN PTIData
|
||||
|
||||
S.PTILocation = PTIData<1>
|
||||
I.PTILocation = S.PTILocation
|
||||
|
||||
S.PTIQty = PTIData<3>
|
||||
I.PTIQty = S.PTIQty
|
||||
|
||||
S.PTICassCnt = COUNT(S.PTIQty,',') + (S.PTIQty NE '')
|
||||
I.PTICassCnt = S.PTICassCnt
|
||||
|
||||
CassQueueCnt = I.KitCassCnt + I.StageCassCnt + I.PTICassCnt
|
||||
|
||||
* TEST FOR CONTROL BREAK(S)
|
||||
|
||||
IF (S.ReactNo NE Prev.ReactNo) OR ReactNo.Break THEN
|
||||
ReactNo = Prev.ReactNo
|
||||
Prev.ReactNo = S.ReactNo
|
||||
ReactNo.Break += 1
|
||||
END
|
||||
|
||||
IF FirstPass THEN
|
||||
FirstPass=0
|
||||
GOTO DETAIL
|
||||
END
|
||||
|
||||
* * * * * * *
|
||||
BREAKS:
|
||||
* * * * * * *
|
||||
|
||||
* Print Break Total(s) And Accumulate Total(s)
|
||||
|
||||
IF ReactNo.Break THEN
|
||||
|
||||
IF ReportParm = 'D' ELSE
|
||||
stat = Set_Printer('TEXT')
|
||||
END
|
||||
|
||||
END
|
||||
|
||||
|
||||
* Perform Last Record Output If Done
|
||||
|
||||
IF LastRecord THEN
|
||||
|
||||
colData = ''
|
||||
|
||||
|
||||
GOTO Bail
|
||||
|
||||
END
|
||||
|
||||
|
||||
* * * * * * *
|
||||
DETAIL:
|
||||
* * * * * * *
|
||||
|
||||
* Do Conversion If Any
|
||||
|
||||
IF ReportParm = 'T' OR CassQueueCnt < MinDemand THEN
|
||||
|
||||
IF S.REACTNO NE "" THEN S.REACTNO = OCONV(S.REACTNO,"MD0,")
|
||||
IF S.WONO NE "" THEN S.WONO = OCONV(S.WONO,"MD0")
|
||||
IF S.WO_QTY NE "" THEN S.WO_QTY = OCONV(S.WO_QTY,"MD0,")
|
||||
IF S.WO_RX_QTY NE "" THEN S.WO_RX_QTY = OCONV(S.WO_RX_QTY,"MD0,")
|
||||
IF S.WO_UNREL_QTY NE "" THEN S.WO_UNREL_QTY = OCONV(S.WO_UNREL_QTY,"MD0,")
|
||||
IF S.SCHED_DT NE "" THEN S.SCHED_DT = OCONV(S.SCHED_DT,"D4/")
|
||||
|
||||
* PRINT DETAIL LINE
|
||||
|
||||
COLDATA = ''
|
||||
RowNumber = 0
|
||||
CassList = ''
|
||||
|
||||
For each Location in S.PTILocation using @VM setting fPos
|
||||
LocationCassNos = S.PTIQty<0, fPos>
|
||||
If S.React_Type NE 'EPP' then
|
||||
For each CassNo in LocationCassNos using ','
|
||||
WOMatKey = S.WONO:'*':CassNo
|
||||
CurrStatus = Xlate('WO_MAT', WOMatKey, 'CURR_STATUS', 'X')
|
||||
If ( (CurrStatus EQ 'VER') OR (CurrStatus EQ 'LOAD') OR (CurrStatus EQ 'REL') ) then
|
||||
* If ( (CurrStatus EQ 'VER') ) then
|
||||
CassList = Insert(CassList, 0, -1, 0, CassNo)
|
||||
end
|
||||
Next CassNo
|
||||
end else
|
||||
CassList = Insert(CassList, 0, -1, 0, LocationCassNos)
|
||||
end
|
||||
Next Location
|
||||
|
||||
If CassList NE '' then
|
||||
RowNumber += 1
|
||||
Convert @VM to ',' in CassList
|
||||
COLDATA<RowNumber,1> = S.ReactNo
|
||||
COLDATA<RowNumber,2> = S.React_Type
|
||||
COLDATA<RowNumber,3> = S.Wafer_Size
|
||||
COLDATA<RowNumber,4> = S.WoNo
|
||||
SWAP '.1' WITH '' IN S.ProdOrdNo
|
||||
COLDATA<RowNumber,5> = S.ProdOrdNo
|
||||
COLDATA<RowNumber,6> = S.SubPartNo
|
||||
ColData<RowNumber,7> = S.EpiPartNo
|
||||
COLDATA<RowNumber,8> = S.WO_Qty
|
||||
COLDATA<RowNumber,9> = S.WO_RX_Qty
|
||||
COLDATA<RowNumber,10> = S.WO_UnRel_Qty
|
||||
COLDATA<RowNumber,11> = S.KitLocation
|
||||
COLDATA<RowNumber,12> = S.KitQty
|
||||
COLDATA<RowNumber,13> = S.PTILocation<0, fPos>
|
||||
COLDATA<RowNumber,14> = CassList
|
||||
|
||||
If COLDATA NE '' then GoSub PrintTable
|
||||
END
|
||||
END
|
||||
|
||||
GOTO ReadRecord
|
||||
|
||||
|
||||
* * * * * * *
|
||||
Bail:
|
||||
* * * * * * *
|
||||
|
||||
stat = Set_Printer('TERM',1)
|
||||
SRP_Stopwatch('Stop', 'Build Report')
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
* * * * * * *
|
||||
OIPrintErr:
|
||||
* * * * * * *
|
||||
|
||||
ErrMsg(ErrorTitle:@SVM:ErrorMsg)
|
||||
ErrMsg(ErrorTitle:@SVM:'Set_Printer returned errorcode ':stat)
|
||||
stat = Set_Printer('TERM',1)
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
* * * * * *
|
||||
PrintTable:
|
||||
* * * * * *
|
||||
|
||||
PageHeight = Get_Printer('PAGESIZE')<2>
|
||||
PrintableHeight = PageHeight - TopMargin - BottomMargin
|
||||
PrinterHeight = Get_Printer('POS')<2>
|
||||
|
||||
stat = Set_Printer('CALCTABLE',ColFmt:@FM:ColData)
|
||||
TableSize = Get_Printer('CALCTABLE')
|
||||
|
||||
|
||||
TableHeight = TableSize<2>
|
||||
|
||||
fontSpacing = 120
|
||||
|
||||
IF ( TableHeight + PrinterHeight >= PrintableHeight ) OR FirstLine THEN
|
||||
IF NOT(FirstLine) THEN
|
||||
stat = Set_Printer('PAGEBREAK')
|
||||
END
|
||||
FirstLine = 0
|
||||
font<2> = 10
|
||||
font<4> = 1 ;* Bold
|
||||
stat = Set_Printer('FONT',font,'100')
|
||||
|
||||
stat = Set_Printer('ADDTABLE',colFmt,colHead,'',LTGREY$,'',0,TB_ALL)
|
||||
|
||||
|
||||
font<4> = 0
|
||||
stat = Set_Printer('FONT',font,fontSpacing)
|
||||
|
||||
stat = Set_Printer('ADDTABLE',colFmt,'',colData,LTGREY$,'',0,7)
|
||||
|
||||
END ELSE
|
||||
font<2> = 10
|
||||
font<4> = 0
|
||||
stat = Set_Printer('FONT',font,fontSpacing)
|
||||
stat = Set_Printer('ADDTABLE',colFmt,'',colData,LTGREY$,'',1,TB_ALL)
|
||||
|
||||
END
|
||||
|
||||
|
||||
RETURN
|
||||
|
@ -1,534 +0,0 @@
|
||||
COMPILE SUBROUTINE Print_Demand(ReportParm)
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
/*
|
||||
Print Material Demand Report
|
||||
10/27/2016 - John C Henry, J.C. Henry & Co., Inc. - Initial Coding
|
||||
10/05/2017 - Donald Bakke - No longer select SCHED_DET rows with an end date specified.
|
||||
10/24/2018 - Daniel Stieber - Patch added to resolve scheduling conflicts on the same day
|
||||
*/
|
||||
|
||||
DECLARE SUBROUTINE Utility, ErrMsg, Set_Status, Set_Printer, RList, SRP_Stopwatch
|
||||
DECLARE FUNCTION Set_Printer, Get_Printer, Msg, Get_Status, Printer_Select, obj_Install, Dialog_Box, obj_Location
|
||||
DECLARE FUNCTION Schedule_Services
|
||||
|
||||
$INSERT OIPRINT_EQUATES
|
||||
$INSERT SCHED_DET_EQUATES
|
||||
$INSERT WO_LOG_EQUATES
|
||||
$INSERT APPCOLORS
|
||||
$INSERT MSG_EQUATES
|
||||
$INSERT LOGICAL
|
||||
$INSERT SCHEDULE_EQU
|
||||
|
||||
EQU TAB$ TO \09\
|
||||
EQU TARGET_ACTIVELIST$ TO 5
|
||||
|
||||
ErrorTitle = 'Error in stored procedure Print_Demand'
|
||||
ErrCode = ''
|
||||
ErrorMsg = ''
|
||||
SRP_Stopwatch('Reset')
|
||||
SRP_Stopwatch('Start', 'Initializing')
|
||||
OPEN 'SCHED_DET' TO SchedDetTable ELSE
|
||||
ErrorMsg = 'Unable to open "SCHED_DET" table.'
|
||||
ErrMsg(ErrorTitle:@SVM:ErrorMsg)
|
||||
RETURN
|
||||
END
|
||||
|
||||
OPEN 'DICT.SCHED_DET' TO @DICT ELSE
|
||||
ErrorMsg = 'Unable to open "SCHED_DET" table.'
|
||||
ErrMsg(ErrorTitle:@SVM:ErrorMsg)
|
||||
RETURN
|
||||
END
|
||||
|
||||
// Two full week
|
||||
Today = OCONV(Date(),'D4/')
|
||||
EndDate = OCONV(Date()+13,'D4/')
|
||||
|
||||
ReactList = ''
|
||||
WOList = ''
|
||||
SchedDetKeys = ''
|
||||
|
||||
* SelectSent = 'SELECT SCHED_DET WITH SCHED_DT GE ':QUOTE(Today):' AND WITH SCHED_DT LE ':QUOTE(EndDate):' BY REACT_NO'
|
||||
SelectSent = 'SELECT SCHED_DET WITH SCHED_DT GE ':QUOTE(Today):' BY REACT_NO'
|
||||
|
||||
SRP_Stopwatch('Stop', 'Initializing')
|
||||
SRP_Stopwatch('Start', 'Data Select')
|
||||
RList(SelectSent,TARGET_ACTIVELIST$,'','','')
|
||||
IF Get_Status(errCode) THEN
|
||||
ErrMsg(errCode)
|
||||
RETURN
|
||||
END
|
||||
SRP_Stopwatch('Stop', 'Data Select')
|
||||
SRP_Stopwatch('Start', 'Build Key List')
|
||||
Done = 0
|
||||
|
||||
LOOP
|
||||
READNEXT @ID ELSE Done = 1
|
||||
UNTIL Done
|
||||
ReactNo = @ID[1,'*']
|
||||
SchedDt = @ID[COL2()+1,'*']
|
||||
SeqNo = @ID[COL2()+1,'*']
|
||||
* If @User4 EQ 'FRANCOIS_R' and ReactNo EQ '77' then debug
|
||||
READ SchedDetRec FROM SchedDetTable,@ID THEN
|
||||
|
||||
WONo = SchedDetRec<SCHED_DET_WO_NO$>
|
||||
|
||||
LOCATE ReactNo IN ReactList BY 'AR' USING @FM SETTING Pos ELSE
|
||||
ReactList = INSERT(ReactList,Pos,0,0,ReactNo)
|
||||
END
|
||||
|
||||
LOCATE WONo IN WOList<Pos> USING @VM SETTING WPos ELSE
|
||||
WOList = INSERT(WOList,Pos,-1,0,WONo)
|
||||
// Patch added on 10/24/18 to resolve scheduling conflicts on the same day for
|
||||
// the material track report. - djs
|
||||
PrevSchedDetKey = SchedDetKeys[-1, 'B':@FM]
|
||||
PrevReactNo = Field(PrevSchedDetKey, '*', 1)
|
||||
PrevSchedDt = Field(PrevSchedDetKey, '*', 2)
|
||||
If (PrevReactNo EQ ReactNo) and (PrevSchedDt EQ SchedDt) then
|
||||
PrevSeqNo = Field(PrevSchedDetKey, '*', 3)
|
||||
NumWO = DCount(WOList<Pos>, @VM)
|
||||
PrevWONo = WOList<Pos, NumWO - 1>
|
||||
SchedEvents = Schedule_Services('GetScheduleEventSummary', ReactNo, WONo, SchedDt, SeqNo, True$)
|
||||
StartDt = IConv(SchedEvents<SCHEDULE_ENTRY_DATE$>, 'D')
|
||||
PrevSchedEvents = Schedule_Services('GetScheduleEventSummary', ReactNo, PrevWONo, PrevSchedDt, PrevSeqNo, True$)
|
||||
PrevStartDt = IConv(PrevSchedEvents<SCHEDULE_ENTRY_DATE$>, 'D')
|
||||
If StartDt GT PrevStartDt then
|
||||
// This is the common case
|
||||
SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,@ID)
|
||||
end else
|
||||
// Scheduling irregularity - Insert this key in the second to last position.
|
||||
NumKeys = DCount(SchedDetKeys, @FM)
|
||||
InsertPos = NumKeys
|
||||
SchedDetKeys = INSERT(SchedDetKeys,InsertPos,0,0,@ID)
|
||||
end
|
||||
end else
|
||||
SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,@ID)
|
||||
end
|
||||
END
|
||||
END
|
||||
|
||||
REPEAT
|
||||
|
||||
CALL Make.List(0,SchedDetKeys,SchedDetTable,@DICT)
|
||||
SRP_Stopwatch('Stop', 'Build Key List')
|
||||
SRP_Stopwatch('Start', 'Build Report')
|
||||
IF ReportParm = 'T' THEN
|
||||
|
||||
* Tracking Report
|
||||
|
||||
Header = "'D'":@VM:obj_Install('Get_Prop','CompTitle'):' Material Tracking by Reactor':@VM:"Page 'P'"
|
||||
MinDemand = 0
|
||||
|
||||
END
|
||||
|
||||
IF ReportParm = 'D' THEN
|
||||
|
||||
* Demand Report
|
||||
|
||||
MinDemand = Msg(@WINDOW,'','MIN_DEMAND_QTY')
|
||||
Header = "'D'":@VM:obj_Install('Get_Prop','CompTitle'):' Material Demand with Reactor Queue < ':MinDemand:' Cassettes':@VM:"Page 'P'"
|
||||
|
||||
END
|
||||
|
||||
Set_Status(0)
|
||||
|
||||
/*
|
||||
Today = OCONV(Date(),'D4/')
|
||||
Tomorrow = OCONV(Date()+1,'D4/')
|
||||
|
||||
SelectSent = 'SELECT SCHED_DET WITH SCHED_DT = ':QUOTE(Today):' BY REACT_NO'
|
||||
|
||||
RList(SelectSent,TARGET_ACTIVELIST$,'','','')
|
||||
IF Get_Status(errCode) THEN
|
||||
ErrMsg(errCode)
|
||||
RETURN
|
||||
END
|
||||
*/
|
||||
|
||||
* Start of printing process
|
||||
|
||||
FileName = 'Print Material Demand'
|
||||
Title = 'Printing Material Demand'
|
||||
|
||||
TopMargin = 1.0
|
||||
BottomMargin = 0.75
|
||||
LeftMargin = 0.25
|
||||
RightMargin = 0.25
|
||||
|
||||
Margins = LeftMargin:@FM:TopMargin:@FM:RightMargin:@FM:BottomMargin
|
||||
|
||||
PageSetup = '1' ;* LandScape
|
||||
PrintSetup = '2' ;* Preview Normal
|
||||
PrintSetup<1,2> = '0' ;* All buttons
|
||||
PrintSetup<1,5> = '1' ;* Page Range
|
||||
PrintSetup<1,6> = 7 ;* full mouse and keyboard support
|
||||
|
||||
If @UserName EQ 'MESCATXMUSER' then
|
||||
PageSetup = '1' ;* Landscape
|
||||
PrintSetup = '0' ;* Print to specific location
|
||||
PrintPath = Printer_Select(PrinterID) ;* Select printer - Displays popup if PrinterPort not found
|
||||
end else
|
||||
* PrintPath = Printer_Select('',1) ;* Get Default printer path
|
||||
PrintPath = ''
|
||||
end
|
||||
stat = Set_Printer('INIT',FileName,Title,Margins,PageSetup,PrintSetup,PrintPath)
|
||||
|
||||
IF stat < 0 THEN
|
||||
ErrorMsg = 'Stat = ' : Stat : ', PrintPath = ' : PrintPath
|
||||
GOTO OIPrintErr
|
||||
end
|
||||
DateRange = 'Effective ':OCONV(Date(),'D4')
|
||||
|
||||
|
||||
*Header = "'D'":@VM:obj_Install('Get_Prop','CompTitle'):' Material Tracking by Reactor':@VM:"Page 'P'"
|
||||
Header<-1> = "'T'"
|
||||
Header<-1> = '' ;* Blank line following heading
|
||||
|
||||
font = 'Arial'
|
||||
font<2> = '10'
|
||||
font<4> = '0' ;* Bold
|
||||
|
||||
stat = Set_Printer('FONTHEADFOOT',font) ; IF stat < 0 THEN GOTO OIPrintErr
|
||||
stat = Set_Printer('HEADER',Header) ; IF stat < 0 THEN GOTO OIPrintErr
|
||||
|
||||
Footer = " 'D' 'T'":@VM:@VM:"Page: 'P'"
|
||||
stat = Set_Printer('FOOTER',Footer) ; IF stat < 0 THEN GOTO OIPrintErr
|
||||
|
||||
*
|
||||
@RECCOUNT = 0
|
||||
FirstPass = 1
|
||||
LastRecord = 0
|
||||
FirstLine = 1
|
||||
fontSpacing = 100
|
||||
|
||||
* Make Column Heading
|
||||
|
||||
ColHead = '' ; ColFmt = ''
|
||||
ColHead<1,1> = 'React No' ; ColFmt<1,1> = '+^720'
|
||||
ColHead<1,2> = 'WO No' ; ColFmt<1,2> = '+^1260'
|
||||
ColHead<1,3> = 'Sub Part No' ; ColFmt<1,3> = '+<1800'
|
||||
ColHead<1,4> = 'Epi Part No' ; ColFmt<1,4> = '+<1800'
|
||||
ColHead<1,5> = 'WO Qty' ; ColFmt<1,5> = '+>720'
|
||||
ColHead<1,6> = 'RX Qty' ; ColFmt<1,6> = '+>720'
|
||||
ColHead<1,7> = 'UnRel Qty' ; ColFmt<1,7> = '+>720'
|
||||
ColHead<1,8> = 'Kit Location' ; ColFmt<1,8> = '+^1260'
|
||||
ColHead<1,9> = 'Kit Qty' ; ColFmt<1,9> = '+^1260'
|
||||
ColHead<1,10> = '1K Stage Location' ; ColFmt<1,10> = '+^1260'
|
||||
ColHead<1,11> = 'Stage Qty' ; ColFmt<1,11> = '+^1260'
|
||||
ColHead<1,12> = 'PTI Location' ; ColFmt<1,12> = '+^1260'
|
||||
ColHead<1,13> = 'PTI RO' ; ColFmt<1,13> = '+^1260'
|
||||
|
||||
|
||||
* Zero Accumulators For Each Break
|
||||
|
||||
Prev.ReactNo = ''
|
||||
Last.ReactNo.Break = 1
|
||||
|
||||
|
||||
* * * * * * *
|
||||
ReadRecord:
|
||||
* * * * * * *
|
||||
|
||||
* Zero Break Flags To False
|
||||
|
||||
ReactNo.Break=0
|
||||
|
||||
|
||||
READNEXT @ID, Which.Value ELSE
|
||||
LastRecord = 1
|
||||
ReactNo.Break = 1
|
||||
ReactNo = Prev.ReactNo
|
||||
END
|
||||
|
||||
S.ATID = @ID
|
||||
|
||||
IF FirstPass AND LastRecord THEN
|
||||
GOTO Bail
|
||||
END
|
||||
|
||||
IF LastRecord THEN GOTO BREAKS
|
||||
|
||||
|
||||
READO @RECORD FROM SchedDetTable,@ID ELSE
|
||||
GOTO ReadRecord
|
||||
END
|
||||
|
||||
@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 = {WO_QTY}
|
||||
I.WO_Qty = S.WO_Qty
|
||||
S.WO_RX_Qty = {WO_RX_QTY}
|
||||
I.WO_RX_Qty = S.WO_RX_Qty
|
||||
S.WO_UnRel_QTY = {WO_UNREL_QTY}
|
||||
I.WO_UnRel_QTY = S.WO_UnRel_QTY
|
||||
S.Sched_DT = {SCHED_DT}
|
||||
I.Sched_DT = S.Sched_DT
|
||||
|
||||
KitData = obj_Location('KitLocations',S.WONo)
|
||||
|
||||
SWAP CRLF$ WITH @VM IN KitData
|
||||
|
||||
S.KitLocation = KitData<1>
|
||||
I.KitLocation = S.KitLocation
|
||||
|
||||
S.KitQty = OCONV(SUM(KitData<2>) * 25,'MD0,Z')
|
||||
I.KitQty = S.KitQty
|
||||
|
||||
S.KitCassCnt = COUNT(KitData<3>,',') + (KitData<3> NE '')
|
||||
I.KitCassCnt = S.KitCassCnt
|
||||
|
||||
StageData = obj_Location('StageLocations',S.WONo)
|
||||
|
||||
SWAP CRLF$ WITH @VM IN StageData
|
||||
|
||||
S.StageLocation = StageData<1>
|
||||
I.StageLocation = S.StageLocation
|
||||
|
||||
S.StageQty = StageData<3>
|
||||
I.StageQty = S.StageQty
|
||||
|
||||
S.StageCassCnt = COUNT(S.StageQty,',') + (S.StageQty NE '')
|
||||
I.StageCassCnt = S.StageCassCnt
|
||||
|
||||
PTIData = obj_Location('PTILocations',S.WONo)
|
||||
|
||||
SWAP CRLF$ WITH @VM IN PTIData
|
||||
|
||||
S.PTILocation = PTIData<1>
|
||||
I.PTILocation = S.PTILocation
|
||||
|
||||
S.PTIQty = PTIData<3>
|
||||
I.PTIQty = S.PTIQty
|
||||
|
||||
S.PTICassCnt = COUNT(S.PTIQty,',') + (S.PTIQty NE '')
|
||||
I.PTICassCnt = S.PTICassCnt
|
||||
|
||||
|
||||
CassQueueCnt = I.KitCassCnt + I.StageCassCnt + I.PTICassCnt
|
||||
|
||||
|
||||
* TEST FOR CONTROL BREAK(S)
|
||||
|
||||
|
||||
IF (S.ReactNo NE Prev.ReactNo) OR ReactNo.Break THEN
|
||||
ReactNo = Prev.ReactNo
|
||||
Prev.ReactNo = S.ReactNo
|
||||
ReactNo.Break += 1
|
||||
END
|
||||
|
||||
IF FirstPass THEN
|
||||
FirstPass=0
|
||||
GOTO DETAIL
|
||||
END
|
||||
|
||||
* * * * * * *
|
||||
BREAKS:
|
||||
* * * * * * *
|
||||
|
||||
* Print Break Total(s) And Accumulate Total(s)
|
||||
|
||||
IF ReactNo.Break THEN
|
||||
|
||||
IF ReportParm = 'D' ELSE
|
||||
stat = Set_Printer('TEXT')
|
||||
END
|
||||
|
||||
/*
|
||||
ColData = ''
|
||||
ColData<1,1> = ''
|
||||
ColData<1,2> = ''
|
||||
ColData<1,3> = ''
|
||||
ColData<1,4> = ''
|
||||
ColData<1,5> = ''
|
||||
ColData<1,6> = ''
|
||||
ColData<1,7> = ''
|
||||
ColData<1,8> = ''
|
||||
ColData<1,9> = ''
|
||||
ColData<1,10> = ''
|
||||
|
||||
GOSUB PrintTable
|
||||
*/
|
||||
|
||||
|
||||
END
|
||||
|
||||
|
||||
* Perform Last Record Output If Done
|
||||
|
||||
IF LastRecord THEN
|
||||
|
||||
colData = ''
|
||||
|
||||
|
||||
GOTO Bail
|
||||
|
||||
END
|
||||
|
||||
|
||||
* * * * * * *
|
||||
DETAIL:
|
||||
* * * * * * *
|
||||
|
||||
* Do Conversion If Any
|
||||
|
||||
|
||||
IF ReportParm = 'T' OR CassQueueCnt < MinDemand THEN
|
||||
|
||||
IF S.REACTNO NE "" THEN S.REACTNO = OCONV(S.REACTNO,"MD0,")
|
||||
IF S.WONO NE "" THEN S.WONO = OCONV(S.WONO,"MD0")
|
||||
IF S.WO_QTY NE "" THEN S.WO_QTY = OCONV(S.WO_QTY,"MD0,")
|
||||
IF S.WO_RX_QTY NE "" THEN S.WO_RX_QTY = OCONV(S.WO_RX_QTY,"MD0,")
|
||||
IF S.WO_UNREL_QTY NE "" THEN S.WO_UNREL_QTY = OCONV(S.WO_UNREL_QTY,"MD0,")
|
||||
IF S.SCHED_DT NE "" THEN S.SCHED_DT = OCONV(S.SCHED_DT,"D4/")
|
||||
|
||||
* PRINT DETAIL LINE
|
||||
|
||||
* If @User4 EQ 'FRANCOIS_R' then
|
||||
|
||||
COLDATA = ''
|
||||
RowNumber = 0
|
||||
For each Location in S.PTILocation using @VM setting fPos
|
||||
LocationCassNos = S.PTIQty<0, fPos>
|
||||
FilteredCassList = ''
|
||||
|
||||
For each CassNo in LocationCassNos using ','
|
||||
WOMatKey = S.WoNo:'*':CassNo
|
||||
InvActions = Xlate('WO_MAT', WOMatKey, 'INV_ACTION', 'X')
|
||||
NumActions = DCount(InvActions, @VM)
|
||||
CurrAction = InvActions<0, NumActions>
|
||||
If CurrAction EQ 'PLACE' then
|
||||
FilteredCassList<0, -1> = CassNo
|
||||
end
|
||||
Next CassNo
|
||||
If ( (FilteredCassList NE '') and (Location NE '') ) or ( (FilteredCassList EQ '') and (Location EQ '') ) then
|
||||
|
||||
RowNumber += 1
|
||||
Convert @VM to ',' in FilteredCassList
|
||||
COLDATA<RowNumber,1> = S.ReactNo
|
||||
COLDATA<RowNumber,2> = S.WoNo
|
||||
COLDATA<RowNumber,3> = S.SubPartNo
|
||||
ColData<RowNumber,4> = S.EpiPartNo
|
||||
COLDATA<RowNumber,5> = S.WO_Qty
|
||||
COLDATA<RowNumber,6> = S.WO_RX_Qty
|
||||
COLDATA<RowNumber,7> = S.WO_UnRel_Qty
|
||||
COLDATA<RowNumber,8> = S.KitLocation
|
||||
COLDATA<RowNumber,9> = S.KitQty ; *ColFmt<1,9> = '_<1260'
|
||||
COLDATA<RowNumber,10> = S.StageLocation
|
||||
COLDATA<RowNumber,11> = S.StageQty ; *ColFmt<1,11> = '_<1260'
|
||||
COLDATA<RowNumber,12> = S.PTILocation<0, fPos>
|
||||
* COLDATA<fPos,13> = S.PTIQty<0, fPos> ; *ColFmt<1,13> = '_<1260'
|
||||
COLDATA<RowNumber,13> = FilteredCassList
|
||||
end
|
||||
Next Location
|
||||
* end else
|
||||
*
|
||||
* COLDATA = ''
|
||||
* COLDATA<1,1> = S.ReactNo
|
||||
* COLDATA<1,2> = S.WoNo
|
||||
* COLDATA<1,3> = S.SubPartNo
|
||||
* ColData<1,4> = S.EpiPartNo
|
||||
* COLDATA<1,5> = S.WO_Qty
|
||||
* COLDATA<1,6> = S.WO_RX_Qty
|
||||
* COLDATA<1,7> = S.WO_UnRel_Qty
|
||||
* COLDATA<1,8> = S.KitLocation
|
||||
* COLDATA<1,9> = S.KitQty ; *ColFmt<1,9> = '_<1260'
|
||||
* COLDATA<1,10> = S.StageLocation
|
||||
* COLDATA<1,11> = S.StageQty ; *ColFmt<1,11> = '_<1260'
|
||||
* COLDATA<1,12> = S.PTILocation
|
||||
* COLDATA<1,13> = S.PTIQty ; *ColFmt<1,13> = '_<1260'
|
||||
* end
|
||||
|
||||
* If @User4 EQ 'FRANCOIS_R' then
|
||||
If COLDATA NE '' then GoSub PrintTable
|
||||
* end else
|
||||
* GOSUB PrintTable
|
||||
* end
|
||||
|
||||
END
|
||||
|
||||
|
||||
GOTO ReadRecord
|
||||
|
||||
|
||||
* * * * * * *
|
||||
Bail:
|
||||
* * * * * * *
|
||||
|
||||
stat = Set_Printer('TERM',1)
|
||||
SRP_Stopwatch('Stop', 'Build Report')
|
||||
* If @UserName EQ 'FRANCOIS_R' then SRP_Stopwatch('ShowAll')
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
* * * * * * *
|
||||
OIPrintErr:
|
||||
* * * * * * *
|
||||
|
||||
ErrMsg(ErrorTitle:@SVM:ErrorMsg)
|
||||
ErrMsg(ErrorTitle:@SVM:'Set_Printer returned errorcode ':stat)
|
||||
stat = Set_Printer('TERM',1)
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
* * * * * *
|
||||
PrintTable:
|
||||
* * * * * *
|
||||
|
||||
PageHeight = Get_Printer('PAGESIZE')<2>
|
||||
PrintableHeight = PageHeight - TopMargin - BottomMargin
|
||||
PrinterHeight = Get_Printer('POS')<2>
|
||||
|
||||
stat = Set_Printer('CALCTABLE',ColFmt:@FM:ColData)
|
||||
TableSize = Get_Printer('CALCTABLE')
|
||||
|
||||
|
||||
TableHeight = TableSize<2>
|
||||
|
||||
fontSpacing = 120
|
||||
|
||||
IF ( TableHeight + PrinterHeight >= PrintableHeight ) OR FirstLine THEN
|
||||
IF NOT(FirstLine) THEN
|
||||
stat = Set_Printer('PAGEBREAK')
|
||||
END
|
||||
FirstLine = 0
|
||||
font<2> = 10
|
||||
font<4> = 1 ;* Bold
|
||||
stat = Set_Printer('FONT',font,'100')
|
||||
|
||||
stat = Set_Printer('ADDTABLE',colFmt,colHead,'',LTGREY$,'',0,TB_ALL)
|
||||
|
||||
|
||||
font<4> = 0
|
||||
stat = Set_Printer('FONT',font,fontSpacing)
|
||||
|
||||
stat = Set_Printer('ADDTABLE',colFmt,'',colData,LTGREY$,'',0,7)
|
||||
|
||||
END ELSE
|
||||
font<2> = 10
|
||||
font<4> = 0
|
||||
stat = Set_Printer('FONT',font,fontSpacing)
|
||||
stat = Set_Printer('ADDTABLE',colFmt,'',colData,LTGREY$,'',1,TB_ALL)
|
||||
|
||||
END
|
||||
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
@ -1,545 +0,0 @@
|
||||
COMPILE SUBROUTINE Print_Demand(ReportParm)
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
/*
|
||||
Print Material Demand Report
|
||||
10/27/2016 - John C Henry, J.C. Henry & Co., Inc. - Initial Coding
|
||||
10/05/2017 - Donald Bakke - No longer select SCHED_DET rows with an end date specified.
|
||||
10/24/2018 - Daniel Stieber - Patch added to resolve scheduling conflicts on the same day
|
||||
*/
|
||||
|
||||
DECLARE SUBROUTINE Utility, ErrMsg, Set_Status, Set_Printer, RList, SRP_Stopwatch
|
||||
DECLARE FUNCTION Set_Printer, Get_Printer, Msg, Get_Status, Printer_Select, obj_Install, Dialog_Box, obj_Location
|
||||
DECLARE FUNCTION Schedule_Services
|
||||
|
||||
$INSERT OIPRINT_EQUATES
|
||||
$INSERT SCHED_DET_EQUATES
|
||||
$INSERT WO_LOG_EQUATES
|
||||
$INSERT APPCOLORS
|
||||
$INSERT MSG_EQUATES
|
||||
$INSERT LOGICAL
|
||||
$INSERT SCHEDULE_EQU
|
||||
|
||||
EQU TAB$ TO \09\
|
||||
EQU TARGET_ACTIVELIST$ TO 5
|
||||
|
||||
ErrorTitle = 'Error in stored procedure Print_Demand'
|
||||
ErrCode = ''
|
||||
ErrorMsg = ''
|
||||
SRP_Stopwatch('Reset')
|
||||
SRP_Stopwatch('Start', 'Initializing')
|
||||
OPEN 'SCHED_DET' TO SchedDetTable ELSE
|
||||
ErrorMsg = 'Unable to open "SCHED_DET" table.'
|
||||
ErrMsg(ErrorTitle:@SVM:ErrorMsg)
|
||||
RETURN
|
||||
END
|
||||
|
||||
OPEN 'DICT.SCHED_DET' TO @DICT ELSE
|
||||
ErrorMsg = 'Unable to open "SCHED_DET" table.'
|
||||
ErrMsg(ErrorTitle:@SVM:ErrorMsg)
|
||||
RETURN
|
||||
END
|
||||
|
||||
// Two full week
|
||||
Today = OCONV(Date(),'D4/')
|
||||
*Today = OCONV(Date()-60,'D4/')
|
||||
EndDate = OCONV(Date()+13,'D4/')
|
||||
|
||||
|
||||
ReactList = ''
|
||||
WOList = ''
|
||||
SchedDetKeys = ''
|
||||
|
||||
* SelectSent = 'SELECT SCHED_DET WITH SCHED_DT GE ':QUOTE(Today):' AND WITH SCHED_DT LE ':QUOTE(EndDate):' BY REACT_NO'
|
||||
SelectSent = 'SELECT SCHED_DET WITH SCHED_DT GE ':QUOTE(Today):' BY REACT_NO'
|
||||
*SelectSent = 'SELECT SCHED_DET WITH SCHED_DT GE ':QUOTE(Today):' BY REACT_NO'
|
||||
|
||||
|
||||
SRP_Stopwatch('Stop', 'Initializing')
|
||||
SRP_Stopwatch('Start', 'Data Select')
|
||||
RList(SelectSent,TARGET_ACTIVELIST$,'','','')
|
||||
IF Get_Status(errCode) THEN
|
||||
ErrMsg(errCode)
|
||||
RETURN
|
||||
END
|
||||
SRP_Stopwatch('Stop', 'Data Select')
|
||||
SRP_Stopwatch('Start', 'Build Key List')
|
||||
Done = 0
|
||||
|
||||
LOOP
|
||||
READNEXT @ID ELSE Done = 1
|
||||
UNTIL Done
|
||||
ReactNo = @ID[1,'*']
|
||||
SchedDt = @ID[COL2()+1,'*']
|
||||
SeqNo = @ID[COL2()+1,'*']
|
||||
|
||||
READ SchedDetRec FROM SchedDetTable,@ID THEN
|
||||
|
||||
WONo = SchedDetRec<SCHED_DET_WO_NO$>
|
||||
|
||||
LOCATE ReactNo IN ReactList BY 'AR' USING @FM SETTING Pos ELSE
|
||||
ReactList = INSERT(ReactList,Pos,0,0,ReactNo)
|
||||
END
|
||||
|
||||
LOCATE WONo IN WOList<Pos> USING @VM SETTING WPos ELSE
|
||||
WOList = INSERT(WOList,Pos,-1,0,WONo)
|
||||
// Patch added on 10/24/18 to resolve scheduling conflicts on the same day for
|
||||
// the material track report. - djs
|
||||
PrevSchedDetKey = SchedDetKeys[-1, 'B':@FM]
|
||||
PrevReactNo = Field(PrevSchedDetKey, '*', 1)
|
||||
PrevSchedDt = Field(PrevSchedDetKey, '*', 2)
|
||||
If (PrevReactNo EQ ReactNo) and (PrevSchedDt EQ SchedDt) then
|
||||
PrevSeqNo = Field(PrevSchedDetKey, '*', 3)
|
||||
NumWO = DCount(WOList<Pos>, @VM)
|
||||
PrevWONo = WOList<Pos, NumWO - 1>
|
||||
SchedEvents = Schedule_Services('GetScheduleEventSummary', ReactNo, WONo, SchedDt, SeqNo, True$)
|
||||
StartDt = IConv(SchedEvents<SCHEDULE_ENTRY_DATE$>, 'D')
|
||||
PrevSchedEvents = Schedule_Services('GetScheduleEventSummary', ReactNo, PrevWONo, PrevSchedDt, PrevSeqNo, True$)
|
||||
PrevStartDt = IConv(PrevSchedEvents<SCHEDULE_ENTRY_DATE$>, 'D')
|
||||
If StartDt GT PrevStartDt then
|
||||
// This is the common case
|
||||
SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,@ID)
|
||||
end else
|
||||
// Scheduling irregularity - Insert this key in the second to last position.
|
||||
NumKeys = DCount(SchedDetKeys, @FM)
|
||||
InsertPos = NumKeys
|
||||
SchedDetKeys = INSERT(SchedDetKeys,InsertPos,0,0,@ID)
|
||||
end
|
||||
end else
|
||||
SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,@ID)
|
||||
end
|
||||
END
|
||||
END
|
||||
|
||||
REPEAT
|
||||
|
||||
CALL Make.List(0,SchedDetKeys,SchedDetTable,@DICT)
|
||||
SRP_Stopwatch('Stop', 'Build Key List')
|
||||
SRP_Stopwatch('Start', 'Build Report')
|
||||
IF ReportParm = 'T' THEN
|
||||
|
||||
* Tracking Report
|
||||
|
||||
Header = "'D'":@VM:obj_Install('Get_Prop','CompTitle'):' Material Tracking by Reactor':@VM:"Page 'P'"
|
||||
MinDemand = 0
|
||||
|
||||
END
|
||||
|
||||
IF ReportParm = 'D' THEN
|
||||
|
||||
* Demand Report
|
||||
|
||||
MinDemand = Msg(@WINDOW,'','MIN_DEMAND_QTY')
|
||||
Header = "'D'":@VM:obj_Install('Get_Prop','CompTitle'):' Material Demand with Reactor Queue < ':MinDemand:' Cassettes':@VM:"Page 'P'"
|
||||
|
||||
END
|
||||
|
||||
Set_Status(0)
|
||||
|
||||
/*
|
||||
Today = OCONV(Date(),'D4/')
|
||||
Tomorrow = OCONV(Date()+1,'D4/')
|
||||
|
||||
SelectSent = 'SELECT SCHED_DET WITH SCHED_DT = ':QUOTE(Today):' BY REACT_NO'
|
||||
|
||||
RList(SelectSent,TARGET_ACTIVELIST$,'','','')
|
||||
IF Get_Status(errCode) THEN
|
||||
ErrMsg(errCode)
|
||||
RETURN
|
||||
END
|
||||
*/
|
||||
|
||||
* Start of printing process
|
||||
|
||||
FileName = 'Print Material Demand'
|
||||
Title = 'Printing Material Demand'
|
||||
|
||||
TopMargin = 1.0
|
||||
BottomMargin = 0.75
|
||||
LeftMargin = 0.25
|
||||
RightMargin = 0.25
|
||||
|
||||
Margins = LeftMargin:@FM:TopMargin:@FM:RightMargin:@FM:BottomMargin
|
||||
|
||||
PageSetup = '1' ;* LandScape
|
||||
PrintSetup = '2' ;* Preview Normal
|
||||
PrintSetup<1,2> = '0' ;* All buttons
|
||||
PrintSetup<1,5> = '1' ;* Page Range
|
||||
PrintSetup<1,6> = 7 ;* full mouse and keyboard support
|
||||
|
||||
If @UserName EQ 'MESCATXMUSER' then
|
||||
PageSetup = '1' ;* Landscape
|
||||
PrintSetup = '0' ;* Print to specific location
|
||||
PrintPath = Printer_Select(PrinterID) ;* Select printer - Displays popup if PrinterPort not found
|
||||
end else
|
||||
* PrintPath = Printer_Select('',1) ;* Get Default printer path
|
||||
PrintPath = ''
|
||||
end
|
||||
stat = Set_Printer('INIT',FileName,Title,Margins,PageSetup,PrintSetup,PrintPath)
|
||||
|
||||
IF stat < 0 THEN
|
||||
ErrorMsg = 'Stat = ' : Stat : ', PrintPath = ' : PrintPath
|
||||
GOTO OIPrintErr
|
||||
end
|
||||
DateRange = 'Effective ':OCONV(Date(),'D4')
|
||||
|
||||
|
||||
*Header = "'D'":@VM:obj_Install('Get_Prop','CompTitle'):' Material Tracking by Reactor':@VM:"Page 'P'"
|
||||
Header<-1> = "'T'"
|
||||
Header<-1> = '' ;* Blank line following heading
|
||||
|
||||
font = 'Arial'
|
||||
font<2> = '10'
|
||||
font<4> = '0' ;* Bold
|
||||
|
||||
stat = Set_Printer('FONTHEADFOOT',font) ; IF stat < 0 THEN GOTO OIPrintErr
|
||||
stat = Set_Printer('HEADER',Header) ; IF stat < 0 THEN GOTO OIPrintErr
|
||||
|
||||
Footer = " 'D' 'T'":@VM:@VM:"Page: 'P'"
|
||||
stat = Set_Printer('FOOTER',Footer) ; IF stat < 0 THEN GOTO OIPrintErr
|
||||
|
||||
*
|
||||
@RECCOUNT = 0
|
||||
FirstPass = 1
|
||||
LastRecord = 0
|
||||
FirstLine = 1
|
||||
fontSpacing = 100
|
||||
|
||||
* Make Column Heading
|
||||
|
||||
ColHead = '' ; ColFmt = ''
|
||||
ColHead<1,1> = 'React No' ; ColFmt<1,1> = '+^720'
|
||||
ColHead<1,2> = 'React Type' ; ColFmt<1,2> = '+<^720'
|
||||
ColHead<1,3> = 'Wafer Size' ; ColFmt<1,3> = '+^1000'
|
||||
ColHead<1,4> = 'WO No' ; ColFmt<1,4> = '+^1000'
|
||||
ColHead<1,5> = 'Sub Part No' ; ColFmt<1,5> = '+<1200'
|
||||
ColHead<1,6> = 'Epi Part No' ; ColFmt<1,6> = '+<1200'
|
||||
ColHead<1,7> = 'WO Qty' ; ColFmt<1,7> = '+>720'
|
||||
ColHead<1,8> = 'RX Qty' ; ColFmt<1,8> = '+>720'
|
||||
ColHead<1,9> = 'UnRel Qty' ; ColFmt<1,9> = '+>720'
|
||||
ColHead<1,10> = 'Kit Location' ; ColFmt<1,10> = '+^1260'
|
||||
ColHead<1,11> = 'Kit Qty' ; ColFmt<1,11> = '+^720'
|
||||
ColHead<1,12> = '1K Stage Location' ; ColFmt<1,12> = '+^1260'
|
||||
ColHead<1,13> = 'Stage Qty' ; ColFmt<1,13> = '+^1260'
|
||||
ColHead<1,14> = 'PTI Location' ; ColFmt<1,14> = '+^1260'
|
||||
ColHead<1,15> = 'PTI RO' ; ColFmt<1,15> = '+^1260'
|
||||
|
||||
|
||||
* Zero Accumulators For Each Break
|
||||
|
||||
Prev.ReactNo = ''
|
||||
Last.ReactNo.Break = 1
|
||||
|
||||
|
||||
* * * * * * *
|
||||
ReadRecord:
|
||||
* * * * * * *
|
||||
|
||||
* Zero Break Flags To False
|
||||
|
||||
ReactNo.Break=0
|
||||
|
||||
|
||||
READNEXT @ID, Which.Value ELSE
|
||||
LastRecord = 1
|
||||
ReactNo.Break = 1
|
||||
ReactNo = Prev.ReactNo
|
||||
END
|
||||
|
||||
S.ATID = @ID
|
||||
|
||||
IF FirstPass AND LastRecord THEN
|
||||
GOTO Bail
|
||||
END
|
||||
|
||||
IF LastRecord THEN GOTO BREAKS
|
||||
|
||||
|
||||
READO @RECORD FROM SchedDetTable,@ID ELSE
|
||||
GOTO ReadRecord
|
||||
END
|
||||
|
||||
@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 = {WO_QTY}
|
||||
I.WO_Qty = S.WO_Qty
|
||||
S.WO_RX_Qty = {WO_RX_QTY}
|
||||
I.WO_RX_Qty = S.WO_RX_Qty
|
||||
S.WO_UnRel_QTY = {WO_UNREL_QTY}
|
||||
I.WO_UnRel_QTY = S.WO_UnRel_QTY
|
||||
S.Sched_DT = {SCHED_DT}
|
||||
I.Sched_DT = S.Sched_DT
|
||||
*Changed Here JRO
|
||||
S.REACT_TYPE = {REACTOR_TYPE}
|
||||
S.WAFER_SIZE = {WAFER_SIZE}
|
||||
|
||||
KitData = obj_Location('KitLocations',S.WONo)
|
||||
|
||||
SWAP CRLF$ WITH @VM IN KitData
|
||||
|
||||
S.KitLocation = KitData<1>
|
||||
I.KitLocation = S.KitLocation
|
||||
|
||||
S.KitQty = OCONV(SUM(KitData<2>) * 25,'MD0,Z')
|
||||
I.KitQty = S.KitQty
|
||||
|
||||
S.KitCassCnt = COUNT(KitData<3>,',') + (KitData<3> NE '')
|
||||
I.KitCassCnt = S.KitCassCnt
|
||||
|
||||
StageData = obj_Location('StageLocations',S.WONo)
|
||||
|
||||
SWAP CRLF$ WITH @VM IN StageData
|
||||
|
||||
S.StageLocation = StageData<1>
|
||||
I.StageLocation = S.StageLocation
|
||||
|
||||
S.StageQty = StageData<3>
|
||||
I.StageQty = S.StageQty
|
||||
|
||||
S.StageCassCnt = COUNT(S.StageQty,',') + (S.StageQty NE '')
|
||||
I.StageCassCnt = S.StageCassCnt
|
||||
|
||||
PTIData = obj_Location('PTILocations',S.WONo)
|
||||
|
||||
SWAP CRLF$ WITH @VM IN PTIData
|
||||
|
||||
S.PTILocation = PTIData<1>
|
||||
I.PTILocation = S.PTILocation
|
||||
|
||||
S.PTIQty = PTIData<3>
|
||||
I.PTIQty = S.PTIQty
|
||||
|
||||
S.PTICassCnt = COUNT(S.PTIQty,',') + (S.PTIQty NE '')
|
||||
I.PTICassCnt = S.PTICassCnt
|
||||
|
||||
|
||||
CassQueueCnt = I.KitCassCnt + I.StageCassCnt + I.PTICassCnt
|
||||
|
||||
|
||||
* TEST FOR CONTROL BREAK(S)
|
||||
|
||||
|
||||
IF (S.ReactNo NE Prev.ReactNo) OR ReactNo.Break THEN
|
||||
ReactNo = Prev.ReactNo
|
||||
Prev.ReactNo = S.ReactNo
|
||||
ReactNo.Break += 1
|
||||
END
|
||||
|
||||
IF FirstPass THEN
|
||||
FirstPass=0
|
||||
GOTO DETAIL
|
||||
END
|
||||
|
||||
* * * * * * *
|
||||
BREAKS:
|
||||
* * * * * * *
|
||||
|
||||
* Print Break Total(s) And Accumulate Total(s)
|
||||
|
||||
IF ReactNo.Break THEN
|
||||
|
||||
IF ReportParm = 'D' ELSE
|
||||
stat = Set_Printer('TEXT')
|
||||
END
|
||||
|
||||
/*
|
||||
ColData = ''
|
||||
ColData<1,1> = ''
|
||||
ColData<1,2> = ''
|
||||
ColData<1,3> = ''
|
||||
ColData<1,4> = ''
|
||||
ColData<1,5> = ''
|
||||
ColData<1,6> = ''
|
||||
ColData<1,7> = ''
|
||||
ColData<1,8> = ''
|
||||
ColData<1,9> = ''
|
||||
ColData<1,10> = ''
|
||||
|
||||
GOSUB PrintTable
|
||||
*/
|
||||
|
||||
|
||||
END
|
||||
|
||||
|
||||
* Perform Last Record Output If Done
|
||||
|
||||
IF LastRecord THEN
|
||||
|
||||
colData = ''
|
||||
|
||||
|
||||
GOTO Bail
|
||||
|
||||
END
|
||||
|
||||
|
||||
* * * * * * *
|
||||
DETAIL:
|
||||
* * * * * * *
|
||||
|
||||
* Do Conversion If Any
|
||||
|
||||
|
||||
IF ReportParm = 'T' OR CassQueueCnt < MinDemand THEN
|
||||
|
||||
IF S.REACTNO NE "" THEN S.REACTNO = OCONV(S.REACTNO,"MD0,")
|
||||
IF S.WONO NE "" THEN S.WONO = OCONV(S.WONO,"MD0")
|
||||
IF S.WO_QTY NE "" THEN S.WO_QTY = OCONV(S.WO_QTY,"MD0,")
|
||||
IF S.WO_RX_QTY NE "" THEN S.WO_RX_QTY = OCONV(S.WO_RX_QTY,"MD0,")
|
||||
IF S.WO_UNREL_QTY NE "" THEN S.WO_UNREL_QTY = OCONV(S.WO_UNREL_QTY,"MD0,")
|
||||
IF S.SCHED_DT NE "" THEN S.SCHED_DT = OCONV(S.SCHED_DT,"D4/")
|
||||
|
||||
* PRINT DETAIL LINE
|
||||
|
||||
* If @User4 EQ 'FRANCOIS_R' then
|
||||
|
||||
COLDATA = ''
|
||||
RowNumber = 0
|
||||
For each Location in S.PTILocation using @VM setting fPos
|
||||
LocationCassNos = S.PTIQty<0, fPos>
|
||||
FilteredCassList = ''
|
||||
|
||||
For each CassNo in LocationCassNos using ','
|
||||
WOMatKey = S.WoNo:'*':CassNo
|
||||
InvActions = Xlate('WO_MAT', WOMatKey, 'INV_ACTION', 'X')
|
||||
NumActions = DCount(InvActions, @VM)
|
||||
CurrAction = InvActions<0, NumActions>
|
||||
If CurrAction EQ 'PLACE' then
|
||||
FilteredCassList<0, -1> = CassNo
|
||||
end
|
||||
Next CassNo
|
||||
If ( (FilteredCassList NE '') and (Location NE '') ) or ( (FilteredCassList EQ '') and (Location EQ '') ) then
|
||||
|
||||
RowNumber += 1
|
||||
Convert @VM to ',' in FilteredCassList
|
||||
COLDATA<RowNumber,1> = S.ReactNo
|
||||
COLDATA<RowNumber,2> = S.React_Type
|
||||
COLDATA<RowNumber,3> = S.Wafer_Size
|
||||
COLDATA<RowNumber,4> = S.WoNo
|
||||
COLDATA<RowNumber,5> = S.SubPartNo
|
||||
ColData<RowNumber,6> = S.EpiPartNo
|
||||
COLDATA<RowNumber,7> = S.WO_Qty
|
||||
COLDATA<RowNumber,8> = S.WO_RX_Qty
|
||||
COLDATA<RowNumber,9> = S.WO_UnRel_Qty
|
||||
COLDATA<RowNumber,10> = S.KitLocation
|
||||
COLDATA<RowNumber,11> = S.KitQty ; *ColFmt<1,9> = '_<1260'
|
||||
COLDATA<RowNumber,12> = S.StageLocation
|
||||
COLDATA<RowNumber,13> = S.StageQty ; *ColFmt<1,11> = '_<1260'
|
||||
COLDATA<RowNumber,14> = S.PTILocation<0, fPos>
|
||||
* COLDATA<fPos,13> = S.PTIQty<0, fPos> ; *ColFmt<1,13> = '_<1260'
|
||||
COLDATA<RowNumber,15> = FilteredCassList
|
||||
end
|
||||
Next Location
|
||||
* end else
|
||||
*
|
||||
* COLDATA = ''
|
||||
* COLDATA<1,1> = S.ReactNo
|
||||
* COLDATA<1,2> = S.WoNo
|
||||
* COLDATA<1,3> = S.SubPartNo
|
||||
* ColData<1,4> = S.EpiPartNo
|
||||
* COLDATA<1,5> = S.WO_Qty
|
||||
* COLDATA<1,6> = S.WO_RX_Qty
|
||||
* COLDATA<1,7> = S.WO_UnRel_Qty
|
||||
* COLDATA<1,8> = S.KitLocation
|
||||
* COLDATA<1,9> = S.KitQty ; *ColFmt<1,9> = '_<1260'
|
||||
* COLDATA<1,10> = S.StageLocation
|
||||
* COLDATA<1,11> = S.StageQty ; *ColFmt<1,11> = '_<1260'
|
||||
* COLDATA<1,12> = S.PTILocation
|
||||
* COLDATA<1,13> = S.PTIQty ; *ColFmt<1,13> = '_<1260'
|
||||
* end
|
||||
|
||||
* If @User4 EQ 'FRANCOIS_R' then
|
||||
If COLDATA NE '' then GoSub PrintTable
|
||||
* end else
|
||||
* GOSUB PrintTable
|
||||
* end
|
||||
|
||||
END
|
||||
|
||||
|
||||
GOTO ReadRecord
|
||||
|
||||
|
||||
* * * * * * *
|
||||
Bail:
|
||||
* * * * * * *
|
||||
|
||||
stat = Set_Printer('TERM',1)
|
||||
SRP_Stopwatch('Stop', 'Build Report')
|
||||
* If @UserName EQ 'FRANCOIS_R' then SRP_Stopwatch('ShowAll')
|
||||
RETURN
|
||||
debug
|
||||
|
||||
|
||||
|
||||
* * * * * * *
|
||||
OIPrintErr:
|
||||
* * * * * * *
|
||||
|
||||
ErrMsg(ErrorTitle:@SVM:ErrorMsg)
|
||||
ErrMsg(ErrorTitle:@SVM:'Set_Printer returned errorcode ':stat)
|
||||
stat = Set_Printer('TERM',1)
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
* * * * * *
|
||||
PrintTable:
|
||||
* * * * * *
|
||||
|
||||
PageHeight = Get_Printer('PAGESIZE')<2>
|
||||
PrintableHeight = PageHeight - TopMargin - BottomMargin
|
||||
PrinterHeight = Get_Printer('POS')<2>
|
||||
|
||||
stat = Set_Printer('CALCTABLE',ColFmt:@FM:ColData)
|
||||
TableSize = Get_Printer('CALCTABLE')
|
||||
|
||||
|
||||
TableHeight = TableSize<2>
|
||||
|
||||
fontSpacing = 120
|
||||
|
||||
IF ( TableHeight + PrinterHeight >= PrintableHeight ) OR FirstLine THEN
|
||||
IF NOT(FirstLine) THEN
|
||||
stat = Set_Printer('PAGEBREAK')
|
||||
END
|
||||
FirstLine = 0
|
||||
font<2> = 10
|
||||
font<4> = 1 ;* Bold
|
||||
stat = Set_Printer('FONT',font,'100')
|
||||
|
||||
stat = Set_Printer('ADDTABLE',colFmt,colHead,'',LTGREY$,'',0,TB_ALL)
|
||||
|
||||
|
||||
font<4> = 0
|
||||
stat = Set_Printer('FONT',font,fontSpacing)
|
||||
|
||||
stat = Set_Printer('ADDTABLE',colFmt,'',colData,LTGREY$,'',0,7)
|
||||
|
||||
END ELSE
|
||||
font<2> = 10
|
||||
font<4> = 0
|
||||
stat = Set_Printer('FONT',font,fontSpacing)
|
||||
stat = Set_Printer('ADDTABLE',colFmt,'',colData,LTGREY$,'',1,TB_ALL)
|
||||
|
||||
END
|
||||
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
@ -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, SRP_String
|
||||
Declare subroutine Database_Services, Psn_Services, Error_Services, SRP_JSON, Extract_Si_Keys
|
||||
|
||||
GoToService else
|
||||
@ -104,6 +105,83 @@ 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')
|
||||
Recipe = SRP_String('Trim', Recipe, FB)
|
||||
Pattern = Xlate('PRS_PROP', PropKey, PRS_PROP_PATTERN$, 'X')
|
||||
Pattern = SRP_String('Trim', Pattern, FB)
|
||||
Tool = Xlate('PRS_PROP', PropKey, PRS_PROP_TOOL$, 'X')
|
||||
Tool = SRP_String('Trim', Tool, FB)
|
||||
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
|
||||
Recipe = SRP_String('Trim', Recipe, FB)
|
||||
Pattern = Xlate('PRS_STAGE', PRSStageKey, PRS_STAGE_MET_RECIPE_PATTERN$, 'X')<1, rPos>
|
||||
Pattern = SRP_String('Trim', Pattern, FB)
|
||||
Tool = Xlate('PRS_STAGE', PRSStageKey, PRS_STAGE_MET_TOOL_CLASS$, 'X')<1, rPos>
|
||||
Tool = SRP_String('Trim', Tool, FB)
|
||||
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 +1163,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 +1261,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,18 +2386,27 @@ 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
|
||||
@ -2307,16 +2414,50 @@ 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
|
||||
@ -2324,18 +2465,27 @@ 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
|
||||
@ -2401,62 +2551,6 @@ Service SignLoadStage(RDSNo, Username, WaferQty, LLSide, ScanEntry)
|
||||
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' )
|
||||
LoadDTM = SigDt:' ':SigTm
|
||||
@ -3028,9 +3122,7 @@ Service SignUnloadStage(RDSNo, Username, ScanEntry)
|
||||
Lot_Services('MoveInLot', LotId, Username) ; // Move into POST_EPI operation
|
||||
// If no production wafers in this run, then move out of POST_EPI and close the lot.
|
||||
If Rds_Services('IsEpiProTestRun', RDSNo) then
|
||||
Lot_Services('MoveOutLot', LotId, Username) ; // Move out of POST_EPI operation
|
||||
Lot_Services('MoveInLot', LotId, Username) ; // Move into RDS_CLOSE operation
|
||||
Lot_Services('CloseLot', LotId)
|
||||
Lot_Services('AutoCloseLot', LotId, 'SYSTEM')
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -3682,6 +3774,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 +3833,13 @@ 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, Work_Order_Services
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\RDS'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
@ -623,6 +624,7 @@ return
|
||||
|
||||
WRITE_RECORD_PRE:
|
||||
|
||||
ErrorMsg = ''
|
||||
StartTick = GetTickCount()
|
||||
MetricName = 'WriteRecordPre'
|
||||
|
||||
@ -769,7 +771,7 @@ WRITE_RECORD_PRE:
|
||||
|
||||
Begin Case
|
||||
|
||||
Case ( (OrigLoadSig NE '') and (OrigReactor NE NewReactor) )
|
||||
Case ( (OrigTimeOutSig NE '') and (OrigReactor NE NewReactor) )
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = @USER4
|
||||
@ -778,25 +780,8 @@ 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!'
|
||||
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!'
|
||||
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$
|
||||
@ -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,6 +846,11 @@ WRITE_RECORD_PRE:
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
If ErrorMsg NE '' then
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
|
||||
@ -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}
|
||||
@ -889,18 +905,23 @@ WRITE_RECORD:
|
||||
WMIKeys = {WM_IN_KEY}
|
||||
For each WMIKey in WMIKeys using @VM setting vPos
|
||||
CassNo = Field(WMIKey, '*', 3)
|
||||
Service_Services('PostProcedure', 'SCHEDULE_SERVICES', 'MarkCassProcessed':SD$:WONo:SD$:CassNo:SD$:DatetimeOut)
|
||||
Service_Services('PostProcedure', 'SCHEDULE_SERVICES', 'UpdateCassProcStatus':SD$:WONo:SD$:CassNo:SD$:DatetimeOut)
|
||||
Next WMIKey
|
||||
end else
|
||||
CassNo = Record<RDS_CASS_NO$>
|
||||
Service_Services('PostProcedure', 'SCHEDULE_SERVICES', 'MarkCassProcessed':SD$:WONo:SD$:CassNo:SD$:DatetimeOut)
|
||||
Service_Services('PostProcedure', 'SCHEDULE_SERVICES', 'UpdateCassProcStatus':SD$:WONo:SD$:CassNo:SD$:DatetimeOut)
|
||||
end
|
||||
end
|
||||
|
||||
OrigPocketChar = OrigRecord<RDS_POCKET_CHAR$>
|
||||
NewPocketChar = Record<RDS_POCKET_CHAR$>
|
||||
If (OrigPocketChar NE NewPocketChar) then
|
||||
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'UpdateScrappedQty':SD$:WONo)
|
||||
OrigScrapQty = Count(OrigPocketChar, 'TEST')
|
||||
NewScrapQty = Count(NewPocketChar, 'TEST')
|
||||
AdjustQty = NewScrapQty - OrigScrapQty
|
||||
If AdjustQty NE 0 then
|
||||
Work_Order_Services('AdjustScrappedQty', WONo, AdjustQty)
|
||||
end
|
||||
end
|
||||
|
||||
If {WO} NE '' then Service_Services('PostProcedure', 'RDS_SERVICES', 'VerifyWOLogRDSKeyIndex':SD$:Name)
|
||||
|
@ -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
|
||||
@ -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')
|
||||
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')
|
||||
|
||||
// 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')
|
||||
// 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'
|
||||
Override = False$
|
||||
UserVerification = ''
|
||||
OverrideGroups = 'LEAD':@VM:'SUPERVISOR':@VM:'ENGINEERING':@VM:'ENG_TECH':@VM:'ROTR_OVERRIDE'
|
||||
|
||||
ReactorIsDown = CurrE10State _NEC 'PRODUCTIVE'
|
||||
If (ReactorIsDown EQ True$) then
|
||||
// Allow override during prove in
|
||||
If ReactorType EQ 'EPP' then
|
||||
If RDS_Services('IsEpiProTestRun', RDSNo) then Override = True$
|
||||
end
|
||||
|
||||
If Override EQ False$ then
|
||||
UserMsg = "Reactor down. Override required from a lead or supervisor."
|
||||
UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups:@FM:'':@FM:UserMsg)
|
||||
Override = UserVerification<1>
|
||||
end
|
||||
end
|
||||
|
||||
If (ReactorIsDown NE True$) OR (Override EQ True$) then
|
||||
If (ReactorType EQ 'ASM+' OR ReactorType EQ 'HTR' OR ReactorType EQ 'ASM') AND (ROTREnabled EQ True$) then
|
||||
ROTRStatus = ReactorRec<REACTOR_ROTR_STATUS$>
|
||||
If ROTRStatus EQ 'F' then
|
||||
FailReason = ReactorRec<REACTOR_ROTR_STATUS_REASON$>
|
||||
Message = 'Unable to load reactor.' : CRLF$ : FailReason
|
||||
RotrOverrideCount = ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$>
|
||||
If RotrOverrideCount EQ '' then RotrOverrideCount = 0
|
||||
Message := CRLF$ : RotrOverrideCount : ' override(s) were performed since the ROTR block was originally set.'
|
||||
Message := CRLF$ : 'A lead or supervisor must override to clear ROTR status.'
|
||||
|
||||
Response = Msg(@Window, '', 'RDS_ROTR_OVERRIDE', '', Message)
|
||||
|
||||
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)
|
||||
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)
|
||||
|
||||
//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
|
||||
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 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
|
||||
If (ReactorIsDown NE True$) OR (Override EQ True$) then
|
||||
If (ReactorType EQ 'ASM+' OR ReactorType EQ 'HTR' OR ReactorType EQ 'ASM') AND (ROTREnabled EQ True$) then
|
||||
ROTRStatus = ReactorRec<REACTOR_ROTR_STATUS$>
|
||||
If ROTRStatus EQ 'F' then
|
||||
FailReason = ReactorRec<REACTOR_ROTR_STATUS_REASON$>
|
||||
Message = 'Unable to load reactor.' : CRLF$ : FailReason
|
||||
RotrOverrideCount = ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$>
|
||||
If RotrOverrideCount EQ '' then RotrOverrideCount = 0
|
||||
Message := CRLF$ : RotrOverrideCount : ' override(s) were performed since the ROTR block was originally set.'
|
||||
Message := CRLF$ : 'A lead or supervisor must override to clear ROTR status.'
|
||||
|
||||
Response = Msg(@Window, '', 'RDS_ROTR_OVERRIDE', '', Message)
|
||||
|
||||
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)
|
||||
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
|
||||
|
||||
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
|
||||
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)
|
||||
|
||||
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
|
||||
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)
|
||||
|
||||
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
|
||||
//Add override key to RDS
|
||||
RDSRec = Xlate('RDS', RDSNo, '', 'X')
|
||||
RDSRec = Insert(RDSRec, RDS_OVERRIDE_KEYS$, 1, 0, orKey)
|
||||
|
||||
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', '')
|
||||
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
|
||||
return
|
||||
// Block load signature
|
||||
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
|
||||
|
||||
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)
|
||||
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', '')
|
||||
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
|
||||
|
||||
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 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
|
||||
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$)
|
||||
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)
|
||||
// 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
|
||||
|
||||
// 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')
|
||||
|
||||
end else
|
||||
Return 0
|
||||
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>
|
||||
@ -96,19 +94,15 @@ 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)
|
||||
|
||||
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
|
||||
Set_Property(@Window, 'SAVEWARN', False$)
|
||||
Set_Status(0)
|
||||
Send_Event(@Window, 'READ')
|
||||
|
||||
end event
|
||||
return
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
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
|
||||
|
||||
|
||||
|
@ -58,9 +58,9 @@ $Insert NICA_ORDERS_EQUATES
|
||||
$Insert REACTOR_INJECTOR_SETTINGS_EQUATES
|
||||
$Insert REACTOR_RATIOS_EQUATES
|
||||
$Insert REACT_STATE_EQUATES
|
||||
$Insert TIME_INSERTS
|
||||
|
||||
Equ WOCust$ to 2
|
||||
Equ SECONDS_IN_DAY$ to 86400
|
||||
|
||||
// Uptime Percentage Equates
|
||||
Equ PRODUCTIVE$ to 1
|
||||
@ -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
|
||||
|
||||
|
||||
@ -4420,4 +4515,3 @@ ClearCursors:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
@ -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')
|
||||
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
|
||||
|
||||
IF RetVal NE '' THEN
|
||||
oaParms = RetVal:@RM:@WINDOW:'.PKT_SIZE'
|
||||
obj_Appwindow('LUValReturn',oaParms)
|
||||
END
|
||||
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
|
||||
|
||||
|
@ -136,11 +136,69 @@ return
|
||||
WRITE_RECORD_PRE:
|
||||
|
||||
ErrMsg = ''
|
||||
OrigRetireDt = OrigRecord<REACT_ITEM_RETIRE_DT$>
|
||||
NewRetireDt = Record<REACT_ITEM_RETIRE_DT$>
|
||||
|
||||
// Req'd parameter checks
|
||||
ItemType = {RI_TYPE}
|
||||
If OrigRetireDt EQ '' AND NewRetireDt NE '' then
|
||||
RetireBypass = True$
|
||||
end else
|
||||
RetireBypass = False$
|
||||
end
|
||||
|
||||
If ItemType EQ '' then ErrMsg := 'Item Type was not specified. '
|
||||
If RetireBypass EQ False$ then
|
||||
// Req'd parameter checks
|
||||
ItemType = {RI_TYPE}
|
||||
|
||||
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)
|
||||
@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
133
LSL2/STPROC/REARCHIVE_API.txt
Normal file
133
LSL2/STPROC/REARCHIVE_API.txt
Normal file
@ -0,0 +1,133 @@
|
||||
Function Rearchive_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 : Rearchive_API
|
||||
|
||||
Description : API logic for the Rearchive 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 Rearchive[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Rearchive.POST
|
||||
- Rearchive.ID.PUT
|
||||
- Rearchive.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)
|
||||
10/16/25 xxx Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert API_SETUP
|
||||
$insert HTTP_INSERTS
|
||||
$Insert IFX_EQUATES
|
||||
|
||||
Declare subroutine Service_Services, Logging_Services
|
||||
Declare function OI_Wizard_Services, Environment_Services, Logging_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 rearchive.ID.POST
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Archive\ReArchiving'
|
||||
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'
|
||||
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
|
||||
LoggingDTM = LogDate : ' ' : LogTime
|
||||
|
||||
ErrorMsg = ''
|
||||
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
|
||||
ArchiveId = EndpointSegment
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM;
|
||||
LogData<2> = ArchiveId
|
||||
LogData<3> = 'Attempting to add re-archival to the process queue.'
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
|
||||
swap '__' with '*' in ArchiveId
|
||||
If RowExists('ARCHIVE', ArchiveId) then
|
||||
Service_Services('PostProcedure', 'ARCHIVE_SERVICES', 'ReArchive':SD$:ArchiveId)
|
||||
If Error_Services('NoError') then
|
||||
Message = 'Successfully queued data for re-archive.'
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM;
|
||||
LogData<2> = ArchiveId
|
||||
LogData<3> = Message
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
|
||||
end else
|
||||
ErrorMsg = 'Error queueing re-archiving.'
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM;
|
||||
LogData<2> = ArchiveId
|
||||
LogData<3> = ErrorMsg
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Archive record not found in database.'
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM;
|
||||
LogData<2> = ArchiveId
|
||||
LogData<3> = ErrorMsg
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
|
||||
end
|
||||
|
||||
If ErrorMsg NE '' then
|
||||
HTTP_Services('SetResponseStatus', 500, ErrorMsg)
|
||||
end else
|
||||
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||
If Assigned(Message) then
|
||||
HTTP_Services('SetResponseStatus', 201, Message)
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 201)
|
||||
end
|
||||
end
|
||||
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 500, 'Invalid session. Reauthentication required.')
|
||||
end
|
||||
|
||||
end api
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user