Compare commits
56 Commits
extra-file
...
aaf415e62c
| Author | SHA1 | Date | |
|---|---|---|---|
| aaf415e62c | |||
| af279541ae | |||
| 2036ed3289 | |||
| edd09af821 | |||
| febe660fcf | |||
| 245f832445 | |||
| f07e4476a7 | |||
| 12f354dcaa | |||
| d2f98a342d | |||
| b83a3fb57b | |||
| 3e0991f681 | |||
| f1a719d279 | |||
| 40a7a5e5a1 | |||
| 261880fab8 | |||
| 4b7417c1a8 | |||
| c183da951a | |||
| 9d6c4c154f | |||
| 18f17f1d77 | |||
| 4020095d79 | |||
| 422dc69da7 | |||
| a0897d19df | |||
| 8c11300455 | |||
| 537d46ba21 | |||
| 9dcead4eff | |||
| 0872e88869 | |||
| c316aa9164 | |||
| ed6f6cfc0d | |||
| f1316d0e8f | |||
| 487246af46 | |||
| 3acaf60a5f | |||
| 26198b343a | |||
| 30372169ba | |||
| 557221c0d3 | |||
| e09912b8bb | |||
| 993c812252 | |||
| 464a1adebd | |||
| 3211eb5593 | |||
| 981840fd95 | |||
| 7ec010b03f | |||
| 2fa985137f | |||
| c30bb96972 | |||
| a196bffd41 | |||
| 47405863d7 | |||
| 5d1b1f254e | |||
| d6894f2fa4 | |||
| 63d9fe7964 | |||
| 8a5c1572e7 | |||
| 2eff7c5a37 | |||
| d61ae234c9 | |||
| cc2213061c | |||
| 056db6326b | |||
| ea20e6c8a0 | |||
| db1624a25b | |||
| 764603f60b | |||
| 7eacacec8c | |||
| 05340fc53a |
@ -5,7 +5,7 @@
|
|||||||
},
|
},
|
||||||
"body": {
|
"body": {
|
||||||
"record1": {
|
"record1": {
|
||||||
"<1>": "declare function prod_spec_comm\r\ndeclare subroutine forward_event\r\n\r\nforward_event(NewData)\r\nVoid = prod_spec_comm( \"LOAD_TOOL_RECIPE\" )\r\nRETURN 0\r\n"
|
"<1>": "declare function prod_spec_comm\r\ndeclare subroutine forward_event\r\n\r\nforward_event(NewData)\r\nVoid = prod_spec_comm( \"LOAD_TOOL_RECIPE\" )\r\nVoid = prod_spec_comm( \"LOAD_TOOL_PATTERN\" )\r\nRETURN 0\r\n"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -5,7 +5,7 @@
|
|||||||
},
|
},
|
||||||
"body": {
|
"body": {
|
||||||
"record1": {
|
"record1": {
|
||||||
"<1>": "$INSERT RECIPE_EQU\r\n\r\nDECLARE SUBROUTINE Set_List_Box_data, Set_Property\r\nDECLARE FUNCTION Center_Window, Prod_Spec_Comm\r\n\r\nEQU MI$TOOL\t\t\tTO 1\r\nEQU MI$TYPE\t\t\tTO 2\r\nEQU MI$RECIPE\t\tTO 3\r\nEQU MI$FREQ\t\t\tTO 4\r\nEQU MI$PROVE_TYPE\tTO 5\r\nEQU MI$FIRST_CHECK\tTO 6\r\nEQU MI$LAST_CHECK\tTO 7\r\nEQU MI$SPC\t\t\tTO 8\r\nEQU MI$OVERGROW\t\tTO 9\r\nEQU MI$EXP_TW_QTY\tTO 10\r\nEQU MI$PATTERN\t\tTO 11\r\n\r\nIF INDEX( CreateParam, 'CENTER', 1 ) THEN\r\n void = center_window( @window )\r\nEND ELSE\r\n Void = Set_Property( @window, 'VISIBLE', 1 )\r\nEND\r\n\r\nMeasureInfo\t= FIELD( CreateParam, CHAR(245), 1 )\t\t;* 1st passed parameter\r\n\r\nCtrls = @WINDOW:'.TOOL':@RM\t\t\t\t; Props = 'TEXT':@RM\t\t; Vals = FIELD(MeasureInfo,'~',MI$TOOL):@RM\r\nCtrls := @WINDOW:'.TYPE':@RM\t\t\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$TYPE):@RM\r\nCtrls := @WINDOW:'.RECIPE':@RM\t\t\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$RECIPE):@RM\r\nCtrls := @WINDOW:'.FREQ':@RM\t\t\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$FREQ):@RM\r\nCtrls := @WINDOW:'.PROVE_TYPE':@RM\t\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$PROVE_TYPE):@RM\r\nCtrls := @WINDOW:'.FIRST_CHECK':@RM\t\t\t; Props := 'CHECK':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$FIRST_CHECK):@RM\r\nCtrls := @WINDOW:'.LAST_CHECK':@RM\t\t\t; Props := 'CHECK':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$LAST_CHECK):@RM\r\nCtrls := @WINDOW:'.SPC':@RM\t\t\t\t\t; Props := 'CHECK':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$SPC):@RM\r\nCtrls := @WINDOW:'.OVERGROW':@RM\t\t\t; Props := 'CHECK':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$OVERGROW):@RM\r\nCtrls := @WINDOW:'.EXPECTED_TW_QTY':@RM\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$EXP_TW_QTY):@RM\r\nCtrls := @WINDOW:'.PATTERN'\t\t\t\t\t; Props := 'TEXT'\t\t\t; Vals := FIELD(MeasureInfo,'~',MI$PATTERN)\r\n\r\nSet_Property(Ctrls,Props,Vals)\r\nSet_Property(@WINDOW, '@Controls',Ctrls)\r\nSet_Property(@WINDOW, '@Props',Props)\r\n\r\nType = FIELD(CreateParam,CHAR(245),2)\t\t;* 2nd passed parameter\r\n\r\nIF Type = 'RES' THEN\r\n\tvoid = Set_Property(@WINDOW:'.OVERGROW','VISIBLE',1)\r\nEND ELSE\r\n\tvoid = Set_Property(@WINDOW:'.OVERGROW','VISIBLE',0)\r\nEND\r\n\r\nTypeOut = FIELD(CreateParam,CHAR(245),3)\t\t\t;* 3rd passed parameter\r\n\r\nTitle = Get_Property(@WINDOW,'TEXT')\r\nTitle := TypeOut:' ':Title\r\nSet_Property(@WINDOW,'TEXT',Title)\r\n\r\nSet_List_Box_Data(CtrlEntId)\r\n\r\n\r\nToolList = XLATE('LISTBOX_CONFIG',Type:'MEASURETOOL','','X')\r\nCONVERT @VM TO @FM IN ToolList\r\nSet_Property(@WINDOW:'.TOOL','LIST',ToolList)\r\n\r\nTool = Get_Property(@WINDOW:'.TOOL', 'TEXT' )\r\nCONVERT @LOWER_CASE TO @UPPER_CASE IN Tool\r\n\r\nRecipeList = XLATE( 'LISTBOX_CONFIG', Tool:'_RECIPES', '', 'X' )\r\nCONVERT @VM To @FM IN RecipeList\r\n\r\nIF RecipeList NE '' THEN\r\n\tSet_Property(@WINDOW:'.RECIPE','LIST',RecipeList)\r\nEND\r\n\r\nRETURN 1\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"
|
"<1>": "$INSERT RECIPE_EQU\r\n$insert TOOL_CLASS_EQUATES\r\n\r\nDECLARE SUBROUTINE Set_List_Box_data, Set_Property\r\nDECLARE FUNCTION Center_Window, Prod_Spec_Comm\r\n\r\nEQU MI$TOOL\t\t\tTO 1\r\nEQU MI$TYPE\t\t\tTO 2\r\nEQU MI$RECIPE\t\tTO 3\r\nEQU MI$FREQ\t\t\tTO 4\r\nEQU MI$PROVE_TYPE\tTO 5\r\nEQU MI$FIRST_CHECK\tTO 6\r\nEQU MI$LAST_CHECK\tTO 7\r\nEQU MI$SPC\t\t\tTO 8\r\nEQU MI$OVERGROW\t\tTO 9\r\nEQU MI$EXP_TW_QTY\tTO 10\r\nEQU MI$PATTERN\t\tTO 11\r\n\r\nIF INDEX( CreateParam, 'CENTER', 1 ) THEN\r\n void = center_window( @window )\r\nEND ELSE\r\n Void = Set_Property( @window, 'VISIBLE', 1 )\r\nEND\r\n\r\nMeasureInfo\t= FIELD( CreateParam, CHAR(245), 1 )\t\t;* 1st passed parameter\r\n\r\nCtrls = @WINDOW:'.TOOL':@RM\t\t\t\t; Props = 'TEXT':@RM\t\t; Vals = FIELD(MeasureInfo,'~',MI$TOOL):@RM\r\nCtrls := @WINDOW:'.TYPE':@RM\t\t\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$TYPE):@RM\r\nCtrls := @WINDOW:'.RECIPE':@RM\t\t\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$RECIPE):@RM\r\nCtrls := @WINDOW:'.FREQ':@RM\t\t\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$FREQ):@RM\r\nCtrls := @WINDOW:'.PROVE_TYPE':@RM\t\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$PROVE_TYPE):@RM\r\nCtrls := @WINDOW:'.FIRST_CHECK':@RM\t\t\t; Props := 'CHECK':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$FIRST_CHECK):@RM\r\nCtrls := @WINDOW:'.LAST_CHECK':@RM\t\t\t; Props := 'CHECK':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$LAST_CHECK):@RM\r\nCtrls := @WINDOW:'.SPC':@RM\t\t\t\t\t; Props := 'CHECK':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$SPC):@RM\r\nCtrls := @WINDOW:'.OVERGROW':@RM\t\t\t; Props := 'CHECK':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$OVERGROW):@RM\r\nCtrls := @WINDOW:'.EXPECTED_TW_QTY':@RM\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$EXP_TW_QTY):@RM\r\nCtrls := @WINDOW:'.PATTERN'\t\t\t\t\t; Props := 'TEXT'\t\t\t; Vals := FIELD(MeasureInfo,'~',MI$PATTERN)\r\n\r\nSet_Property(Ctrls,Props,Vals)\r\nSet_Property(@WINDOW, '@Controls',Ctrls)\r\nSet_Property(@WINDOW, '@Props',Props)\r\n\r\nType = FIELD(CreateParam,CHAR(245),2)\t\t;* 2nd passed parameter\r\n\r\nIF Type = 'RES' THEN\r\n\tvoid = Set_Property(@WINDOW:'.OVERGROW','VISIBLE',1)\r\nEND ELSE\r\n\tvoid = Set_Property(@WINDOW:'.OVERGROW','VISIBLE',0)\r\nEND\r\n\r\nTypeOut = FIELD(CreateParam,CHAR(245),3)\t\t\t;* 3rd passed parameter\r\n\r\nTitle = Get_Property(@WINDOW,'TEXT')\r\nTitle := TypeOut:' ':Title\r\nSet_Property(@WINDOW,'TEXT',Title)\r\n\r\nToolList = XLATE('LISTBOX_CONFIG',Type:'MEASURETOOL','','X')\r\nCONVERT @VM TO @FM IN ToolList\r\nSet_Property(@WINDOW:'.TOOL','LIST',ToolList)\r\n\r\nTool = Get_Property(@WINDOW:'.TOOL', 'TEXT' )\r\nCONVERT @LOWER_CASE TO @UPPER_CASE IN Tool\r\n\r\nRecipeList = XLATE( 'TOOL_CLASS', Tool, TOOL_CLASS_RECIPES$, 'X' )\r\nCONVERT @VM To @FM IN RecipeList\r\n\r\nIF RecipeList NE '' THEN\r\n\tSet_Property(@WINDOW:'.RECIPE','LIST',RecipeList)\r\nEnd\r\n\r\nPatternList = Xlate('TOOL_CLASS', Tool, TOOL_CLASS_PATTERN$, 'X')\r\nCONVERT @VM To @FM IN PatternList\r\n\r\nIf PatternList Ne '' Then\r\n Set_Property(@Window:'.PATTERN', 'LIST', PatternList)\r\nEnd\r\n\r\nRETURN 1\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -5,7 +5,7 @@
|
|||||||
},
|
},
|
||||||
"body": {
|
"body": {
|
||||||
"record1": {
|
"record1": {
|
||||||
"<1>": "\r\ndeclare function dialog_box\r\n\r\nRDSNo = Get_Property(@Window : '.RDS_NO', 'TEXT')\r\nReturnVal = dialog_box( 'NDW_LOAD_UNLOAD_EXTRA', @window, RDSNo)\r\n/*\r\nVoid = set_property( @window, '@ExSigWrite', 0 )\r\nOrigExSigInfo = get_property( @window, '@ExSigInfo' )\r\nReturnVal = dialog_box( 'RDS_UNLOAD_LOAD_EX', @window, OrigExSigInfo )\r\nif ReturnVal <> 'CANCEL' and ( ReturnVal <> OrigExSigInfo ) then\r\n Void = set_property( @window, '@ExSigInfo', ReturnVal )\r\n Void = set_property( @window, '@ExSigWrite', 1 )\r\n @@window->savewarn = 1\r\nend\r\n*/\r\nRETURN 0\r\n"
|
"<1>": "\r\ndeclare function dialog_box, Get_Property\r\ndeclare subroutine Send_Event, Post_Event, Set_Property\r\n\r\nATRECORD = Get_Property(@Window, 'ATRECORD')\r\nRecCheck = @Record\r\n\r\nRDSNo = Get_Property(@Window : '.RDS_NO', 'TEXT')\r\n\r\nIf ATRECORD NE RecCheck then\r\n OrigIOOptions = Get_Property (@Window, \"IOOPTIONS\")\r\n TempIOOptions = OrigIOOptions\r\n TempIOOptions<6> = 1\r\n Set_Property(@Window, 'IOOPTIONS', TempIOOptions)\r\n Send_Event(@Window, 'WRITE')\r\n Set_Property(@Window, 'IOOPTIONS', OrigIOOptions)\r\nend\r\n\r\nReturnVal = dialog_box( 'NDW_LOAD_UNLOAD_EXTRA', @window, RDSNo)\r\nSet_Property(@window, 'SAVEWARN', 0)\r\nPost_Event(@Window, 'READ')\r\n/*\r\nVoid = set_property( @window, '@ExSigWrite', 0 )\r\nOrigExSigInfo = get_property( @window, '@ExSigInfo' )\r\nReturnVal = dialog_box( 'RDS_UNLOAD_LOAD_EX', @window, OrigExSigInfo )\r\nif ReturnVal <> 'CANCEL' and ( ReturnVal <> OrigExSigInfo ) then\r\n Void = set_property( @window, '@ExSigInfo', ReturnVal )\r\n Void = set_property( @window, '@ExSigWrite', 1 )\r\n @@window->savewarn = 1\r\nend\r\n*/\r\nRETURN 0\r\n"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -22604,10 +22604,10 @@
|
|||||||
"<2>": {
|
"<2>": {
|
||||||
"<2,1>": {
|
"<2,1>": {
|
||||||
"<2,1,1>": {
|
"<2,1,1>": {
|
||||||
"<2,1,1,1>": "SEND_MESSAGE.MESSAGE_W/ATTACHMENT",
|
"<2,1,1,1>": "UNLOAD/LOAD_EXTRA.SIGNATURE_INFO",
|
||||||
"<2,1,1,2>": "PRINT.CUSTOMER_RDS",
|
"<2,1,1,2>": "PRINT.FACTORY_LABELS",
|
||||||
"<2,1,1,3>": "PRINT.FACTORY_LABELS",
|
"<2,1,1,3>": "PRINT.CUSTOMER_RDS",
|
||||||
"<2,1,1,4>": "UNLOAD/LOAD_EXTRA.SIGNATURE_INFO"
|
"<2,1,1,4>": "SEND_MESSAGE.MESSAGE_W/ATTACHMENT"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"<2,2>": {
|
"<2,2>": {
|
||||||
|
|||||||
@ -3591,7 +3591,7 @@
|
|||||||
"<22,2>": "",
|
"<22,2>": "",
|
||||||
"<22,3>": "EDITFIELD",
|
"<22,3>": "EDITFIELD",
|
||||||
"<22,4>": "RDS_PRE_EPI",
|
"<22,4>": "RDS_PRE_EPI",
|
||||||
"<22,5>": "366",
|
"<22,5>": "380",
|
||||||
"<22,6>": "370",
|
"<22,6>": "370",
|
||||||
"<22,7>": "132",
|
"<22,7>": "132",
|
||||||
"<22,8>": "18",
|
"<22,8>": "18",
|
||||||
@ -3731,7 +3731,7 @@
|
|||||||
"<23,2>": "",
|
"<23,2>": "",
|
||||||
"<23,3>": "EDITFIELD",
|
"<23,3>": "EDITFIELD",
|
||||||
"<23,4>": "RDS_PRE_EPI",
|
"<23,4>": "RDS_PRE_EPI",
|
||||||
"<23,5>": "505",
|
"<23,5>": "521",
|
||||||
"<23,6>": "370",
|
"<23,6>": "370",
|
||||||
"<23,7>": "84",
|
"<23,7>": "84",
|
||||||
"<23,8>": "18",
|
"<23,8>": "18",
|
||||||
@ -3871,7 +3871,7 @@
|
|||||||
"<24,2>": "",
|
"<24,2>": "",
|
||||||
"<24,3>": "EDITFIELD",
|
"<24,3>": "EDITFIELD",
|
||||||
"<24,4>": "RDS_PRE_EPI",
|
"<24,4>": "RDS_PRE_EPI",
|
||||||
"<24,5>": "593",
|
"<24,5>": "612",
|
||||||
"<24,6>": "370",
|
"<24,6>": "370",
|
||||||
"<24,7>": "75",
|
"<24,7>": "75",
|
||||||
"<24,8>": "18",
|
"<24,8>": "18",
|
||||||
@ -9835,9 +9835,9 @@
|
|||||||
"<56,3>": "PUSHBUTTON",
|
"<56,3>": "PUSHBUTTON",
|
||||||
"<56,4>": "RDS_PRE_EPI",
|
"<56,4>": "RDS_PRE_EPI",
|
||||||
"<56,5>": "324",
|
"<56,5>": "324",
|
||||||
"<56,6>": "370",
|
"<56,6>": "368",
|
||||||
"<56,7>": "36",
|
"<56,7>": "52",
|
||||||
"<56,8>": "18",
|
"<56,8>": "24",
|
||||||
"<56,9>": "Sign",
|
"<56,9>": "Sign",
|
||||||
"<56,10>": {
|
"<56,10>": {
|
||||||
"<56,10,1>": "0x56000300",
|
"<56,10,1>": "0x56000300",
|
||||||
@ -17211,9 +17211,9 @@
|
|||||||
"<101,2>": "",
|
"<101,2>": "",
|
||||||
"<101,3>": "GROUPBOX",
|
"<101,3>": "GROUPBOX",
|
||||||
"<101,4>": "RDS_PRE_EPI",
|
"<101,4>": "RDS_PRE_EPI",
|
||||||
"<101,5>": "10",
|
"<101,5>": "12",
|
||||||
"<101,6>": "268",
|
"<101,6>": "268",
|
||||||
"<101,7>": "672",
|
"<101,7>": "690",
|
||||||
"<101,8>": "129",
|
"<101,8>": "129",
|
||||||
"<101,9>": "Pre-Epi Verification",
|
"<101,9>": "Pre-Epi Verification",
|
||||||
"<101,10>": {
|
"<101,10>": {
|
||||||
@ -17917,7 +17917,8 @@
|
|||||||
"<1,26,16>": "",
|
"<1,26,16>": "",
|
||||||
"<1,26,17>": "",
|
"<1,26,17>": "",
|
||||||
"<1,26,18>": "",
|
"<1,26,18>": "",
|
||||||
"<1,26,19>": ""
|
"<1,26,19>": "",
|
||||||
|
"<1,26,20>": ""
|
||||||
},
|
},
|
||||||
"<1,27>": {
|
"<1,27>": {
|
||||||
"<1,27,1>": "ITEM",
|
"<1,27,1>": "ITEM",
|
||||||
@ -17938,7 +17939,8 @@
|
|||||||
"<1,27,16>": "",
|
"<1,27,16>": "",
|
||||||
"<1,27,17>": "",
|
"<1,27,17>": "",
|
||||||
"<1,27,18>": "",
|
"<1,27,18>": "",
|
||||||
"<1,27,19>": ""
|
"<1,27,19>": "",
|
||||||
|
"<1,27,20>": ""
|
||||||
},
|
},
|
||||||
"<1,28>": {
|
"<1,28>": {
|
||||||
"<1,28,1>": "POPUP",
|
"<1,28,1>": "POPUP",
|
||||||
@ -18010,9 +18012,9 @@
|
|||||||
"<2>": {
|
"<2>": {
|
||||||
"<2,1>": {
|
"<2,1>": {
|
||||||
"<2,1,1>": {
|
"<2,1,1>": {
|
||||||
"<2,1,1,1>": "SEND_MESSAGE.MESSAGE_W/ATTACHMENT",
|
"<2,1,1,1>": "EDIT.THICKNESS_OVERGROWTH_AVG",
|
||||||
"<2,1,1,2>": "EDIT.SSI_STANDARDS",
|
"<2,1,1,2>": "EDIT.SSI_STANDARDS",
|
||||||
"<2,1,1,3>": "EDIT.THICKNESS_OVERGROWTH_AVG"
|
"<2,1,1,3>": "SEND_MESSAGE.MESSAGE_W/ATTACHMENT"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"<2,2>": {
|
"<2,2>": {
|
||||||
@ -18022,7 +18024,17 @@
|
|||||||
"<2,2,1,3>": "@WINDOW",
|
"<2,2,1,3>": "@WINDOW",
|
||||||
"<2,2,1,4>": "",
|
"<2,2,1,4>": "",
|
||||||
"<2,2,1,5>": "",
|
"<2,2,1,5>": "",
|
||||||
"<2,2,1,6>": ""
|
"<2,2,1,6>": "",
|
||||||
|
"<2,2,1,7>": "",
|
||||||
|
"<2,2,1,8>": "",
|
||||||
|
"<2,2,1,9>": "",
|
||||||
|
"<2,2,1,10>": "",
|
||||||
|
"<2,2,1,11>": "",
|
||||||
|
"<2,2,1,12>": "",
|
||||||
|
"<2,2,1,13>": "",
|
||||||
|
"<2,2,1,14>": "",
|
||||||
|
"<2,2,1,15>": "READROW",
|
||||||
|
"<2,2,1,16>": "0"
|
||||||
},
|
},
|
||||||
"<2,2,2>": {
|
"<2,2,2>": {
|
||||||
"<2,2,2,1>": "E",
|
"<2,2,2,1>": "E",
|
||||||
@ -18152,7 +18164,17 @@
|
|||||||
"<2,2,16,3>": "@WINDOW",
|
"<2,2,16,3>": "@WINDOW",
|
||||||
"<2,2,16,4>": "",
|
"<2,2,16,4>": "",
|
||||||
"<2,2,16,5>": "",
|
"<2,2,16,5>": "",
|
||||||
"<2,2,16,6>": ""
|
"<2,2,16,6>": "",
|
||||||
|
"<2,2,16,7>": "",
|
||||||
|
"<2,2,16,8>": "",
|
||||||
|
"<2,2,16,9>": "",
|
||||||
|
"<2,2,16,10>": "",
|
||||||
|
"<2,2,16,11>": "",
|
||||||
|
"<2,2,16,12>": "",
|
||||||
|
"<2,2,16,13>": "",
|
||||||
|
"<2,2,16,14>": "",
|
||||||
|
"<2,2,16,15>": "GEN",
|
||||||
|
"<2,2,16,16>": "0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"<2,3>": {
|
"<2,3>": {
|
||||||
|
|||||||
16719
LSL2/OIWIN/REACTOR.json
16719
LSL2/OIWIN/REACTOR.json
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
445
LSL2/OIWIN/WEB_OI_WIZARD.json
Normal file
445
LSL2/OIWIN/WEB_OI_WIZARD.json
Normal file
@ -0,0 +1,445 @@
|
|||||||
|
{
|
||||||
|
"header": {
|
||||||
|
"version": 1,
|
||||||
|
"type": "record"
|
||||||
|
},
|
||||||
|
"body": {
|
||||||
|
"record1": {
|
||||||
|
"<1>": "1010",
|
||||||
|
"<2>": "1",
|
||||||
|
"<3>": ""
|
||||||
|
},
|
||||||
|
"record2": {
|
||||||
|
"<1>": {
|
||||||
|
"<1,1>": "WEB_OI_WIZARD",
|
||||||
|
"<1,2>": "",
|
||||||
|
"<1,3>": "WINDOW",
|
||||||
|
"<1,4>": "",
|
||||||
|
"<1,5>": "0",
|
||||||
|
"<1,6>": "0",
|
||||||
|
"<1,7>": "-1184",
|
||||||
|
"<1,8>": "-761",
|
||||||
|
"<1,9>": "OI Wizard",
|
||||||
|
"<1,10>": {
|
||||||
|
"<1,10,1>": "0x84CF0000",
|
||||||
|
"<1,10,2>": "0x100"
|
||||||
|
},
|
||||||
|
"<1,11>": {
|
||||||
|
"<1,11,1>": "0xC000",
|
||||||
|
"<1,11,2>": "0x80000000"
|
||||||
|
},
|
||||||
|
"<1,12>": "",
|
||||||
|
"<1,13>": {
|
||||||
|
"<1,13,1>": "-2",
|
||||||
|
"<1,13,2>": "-2",
|
||||||
|
"<1,13,3>": ""
|
||||||
|
},
|
||||||
|
"<1,14>": "",
|
||||||
|
"<1,15>": "",
|
||||||
|
"<1,16>": "",
|
||||||
|
"<1,17>": "",
|
||||||
|
"<1,18>": {
|
||||||
|
"<1,18,1>": {
|
||||||
|
"<1,18,1,1>": "X",
|
||||||
|
"<1,18,1,2>": "EXECUTE",
|
||||||
|
"<1,18,1,3>": "@WINDOW_EVENTS",
|
||||||
|
"<1,18,1,4>": {
|
||||||
|
"<1,18,1,4,1>": "@SELF",
|
||||||
|
"<1,18,1,4,2>": "@EVENT",
|
||||||
|
"<1,18,1,4,3>": "@PARAM1",
|
||||||
|
"<1,18,1,4,4>": "@PARAM2",
|
||||||
|
"<1,18,1,4,5>": "@PARAM3",
|
||||||
|
"<1,18,1,4,6>": "@PARAM4",
|
||||||
|
"<1,18,1,4,7>": "@PARAM5",
|
||||||
|
"<1,18,1,4,8>": "@PARAM6"
|
||||||
|
},
|
||||||
|
"<1,18,1,5>": "",
|
||||||
|
"<1,18,1,6>": "",
|
||||||
|
"<1,18,1,7>": "",
|
||||||
|
"<1,18,1,8>": "",
|
||||||
|
"<1,18,1,9>": "",
|
||||||
|
"<1,18,1,10>": "",
|
||||||
|
"<1,18,1,11>": "",
|
||||||
|
"<1,18,1,12>": "",
|
||||||
|
"<1,18,1,13>": "",
|
||||||
|
"<1,18,1,14>": "",
|
||||||
|
"<1,18,1,15>": "COMMEVT",
|
||||||
|
"<1,18,1,16>": "0"
|
||||||
|
},
|
||||||
|
"<1,18,2>": {
|
||||||
|
"<1,18,2,1>": "X",
|
||||||
|
"<1,18,2,2>": "EXECUTE",
|
||||||
|
"<1,18,2,3>": "@WINDOW_EVENTS",
|
||||||
|
"<1,18,2,4>": {
|
||||||
|
"<1,18,2,4,1>": "@SELF",
|
||||||
|
"<1,18,2,4,2>": "@EVENT",
|
||||||
|
"<1,18,2,4,3>": "@PARAM1",
|
||||||
|
"<1,18,2,4,4>": "@PARAM2",
|
||||||
|
"<1,18,2,4,5>": "@PARAM3",
|
||||||
|
"<1,18,2,4,6>": "@PARAM4",
|
||||||
|
"<1,18,2,4,7>": "@PARAM5",
|
||||||
|
"<1,18,2,4,8>": "@PARAM6"
|
||||||
|
},
|
||||||
|
"<1,18,2,5>": "",
|
||||||
|
"<1,18,2,6>": "",
|
||||||
|
"<1,18,2,7>": "",
|
||||||
|
"<1,18,2,8>": "",
|
||||||
|
"<1,18,2,9>": "",
|
||||||
|
"<1,18,2,10>": "",
|
||||||
|
"<1,18,2,11>": "",
|
||||||
|
"<1,18,2,12>": "",
|
||||||
|
"<1,18,2,13>": "",
|
||||||
|
"<1,18,2,14>": "",
|
||||||
|
"<1,18,2,15>": "COMMEVT",
|
||||||
|
"<1,18,2,16>": "0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"<1,19>": {
|
||||||
|
"<1,19,1>": "CREATE",
|
||||||
|
"<1,19,2>": "TIMER"
|
||||||
|
},
|
||||||
|
"<1,20>": "",
|
||||||
|
"<1,21>": "",
|
||||||
|
"<1,22>": "",
|
||||||
|
"<1,23>": "",
|
||||||
|
"<1,24>": {
|
||||||
|
"<1,24,1>": "",
|
||||||
|
"<1,24,2>": "0",
|
||||||
|
"<1,24,3>": "0",
|
||||||
|
"<1,24,4>": "0",
|
||||||
|
"<1,24,5>": "",
|
||||||
|
"<1,24,6>": "0",
|
||||||
|
"<1,24,7>": "",
|
||||||
|
"<1,24,8>": "",
|
||||||
|
"<1,24,9>": "",
|
||||||
|
"<1,24,10>": "0",
|
||||||
|
"<1,24,11>": "0",
|
||||||
|
"<1,24,12>": "0",
|
||||||
|
"<1,24,13>": "0",
|
||||||
|
"<1,24,14>": "0",
|
||||||
|
"<1,24,15>": "0",
|
||||||
|
"<1,24,16>": "0",
|
||||||
|
"<1,24,17>": "0"
|
||||||
|
},
|
||||||
|
"<1,25>": "",
|
||||||
|
"<1,26>": "",
|
||||||
|
"<1,27>": "",
|
||||||
|
"<1,28>": "",
|
||||||
|
"<1,29>": "",
|
||||||
|
"<1,30>": "",
|
||||||
|
"<1,31>": "",
|
||||||
|
"<1,32>": "",
|
||||||
|
"<1,33>": "",
|
||||||
|
"<1,34>": "LSL2*IMAGE*ICO*INFINEON",
|
||||||
|
"<1,35>": "",
|
||||||
|
"<1,36>": "",
|
||||||
|
"<1,37>": {
|
||||||
|
"<1,37,1>": "0X10001",
|
||||||
|
"<1,37,2>": "0X10001"
|
||||||
|
},
|
||||||
|
"<1,38>": "",
|
||||||
|
"<1,39>": "",
|
||||||
|
"<1,40>": "",
|
||||||
|
"<1,41>": "",
|
||||||
|
"<1,42>": "",
|
||||||
|
"<1,43>": "",
|
||||||
|
"<1,44>": "",
|
||||||
|
"<1,45>": "",
|
||||||
|
"<1,46>": "",
|
||||||
|
"<1,47>": "",
|
||||||
|
"<1,48>": "",
|
||||||
|
"<1,49>": "",
|
||||||
|
"<1,50>": "",
|
||||||
|
"<1,51>": "",
|
||||||
|
"<1,52>": "",
|
||||||
|
"<1,53>": "",
|
||||||
|
"<1,54>": "",
|
||||||
|
"<1,55>": "",
|
||||||
|
"<1,56>": "",
|
||||||
|
"<1,57>": "",
|
||||||
|
"<1,58>": "",
|
||||||
|
"<1,59>": "",
|
||||||
|
"<1,60>": "",
|
||||||
|
"<1,61>": "",
|
||||||
|
"<1,62>": {
|
||||||
|
"<1,62,1>": "0",
|
||||||
|
"<1,62,2>": "",
|
||||||
|
"<1,62,3>": "",
|
||||||
|
"<1,62,4>": "1",
|
||||||
|
"<1,62,5>": "0",
|
||||||
|
"<1,62,6>": "0",
|
||||||
|
"<1,62,7>": "",
|
||||||
|
"<1,62,8>": "0.50",
|
||||||
|
"<1,62,9>": "5.00",
|
||||||
|
"<1,62,10>": "0.00"
|
||||||
|
},
|
||||||
|
"<1,63>": "",
|
||||||
|
"<1,64>": "",
|
||||||
|
"<1,65>": "",
|
||||||
|
"<1,66>": "",
|
||||||
|
"<1,67>": "",
|
||||||
|
"<1,68>": "",
|
||||||
|
"<1,69>": "",
|
||||||
|
"<1,70>": "",
|
||||||
|
"<1,71>": "",
|
||||||
|
"<1,72>": "",
|
||||||
|
"<1,73>": "",
|
||||||
|
"<1,74>": "",
|
||||||
|
"<1,75>": "",
|
||||||
|
"<1,76>": "",
|
||||||
|
"<1,77>": "",
|
||||||
|
"<1,78>": "",
|
||||||
|
"<1,79>": "",
|
||||||
|
"<1,80>": "",
|
||||||
|
"<1,81>": "",
|
||||||
|
"<1,82>": "",
|
||||||
|
"<1,83>": "",
|
||||||
|
"<1,84>": "",
|
||||||
|
"<1,85>": "",
|
||||||
|
"<1,86>": "",
|
||||||
|
"<1,87>": "",
|
||||||
|
"<1,88>": "",
|
||||||
|
"<1,89>": "",
|
||||||
|
"<1,90>": "",
|
||||||
|
"<1,91>": "",
|
||||||
|
"<1,92>": "",
|
||||||
|
"<1,93>": "",
|
||||||
|
"<1,94>": "",
|
||||||
|
"<1,95>": "",
|
||||||
|
"<1,96>": "",
|
||||||
|
"<1,97>": "",
|
||||||
|
"<1,98>": "",
|
||||||
|
"<1,99>": "",
|
||||||
|
"<1,100>": "",
|
||||||
|
"<1,101>": "",
|
||||||
|
"<1,102>": "",
|
||||||
|
"<1,103>": "",
|
||||||
|
"<1,104>": "",
|
||||||
|
"<1,105>": "",
|
||||||
|
"<1,106>": "0",
|
||||||
|
"<1,107>": "",
|
||||||
|
"<1,108>": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"record3": {
|
||||||
|
"<1>": {
|
||||||
|
"<1,1>": "WEBVIEW_MAIN",
|
||||||
|
"<1,2>": "",
|
||||||
|
"<1,3>": "WEBVIEW",
|
||||||
|
"<1,4>": "WEB_OI_WIZARD",
|
||||||
|
"<1,5>": "9",
|
||||||
|
"<1,6>": "8",
|
||||||
|
"<1,7>": "1167",
|
||||||
|
"<1,8>": "745",
|
||||||
|
"<1,9>": "",
|
||||||
|
"<1,10>": {
|
||||||
|
"<1,10,1>": "0x56000000",
|
||||||
|
"<1,10,2>": "0x0"
|
||||||
|
},
|
||||||
|
"<1,11>": {
|
||||||
|
"<1,11,1>": "0x4",
|
||||||
|
"<1,11,2>": "0x80000000"
|
||||||
|
},
|
||||||
|
"<1,12>": "1",
|
||||||
|
"<1,13>": {
|
||||||
|
"<1,13,1>": "-2",
|
||||||
|
"<1,13,2>": "-2",
|
||||||
|
"<1,13,3>": ""
|
||||||
|
},
|
||||||
|
"<1,14>": "",
|
||||||
|
"<1,15>": "",
|
||||||
|
"<1,16>": "",
|
||||||
|
"<1,17>": "",
|
||||||
|
"<1,18>": {
|
||||||
|
"<1,18,1>": {
|
||||||
|
"<1,18,1,1>": "X",
|
||||||
|
"<1,18,1,2>": "EXECUTE",
|
||||||
|
"<1,18,1,3>": "@WINDOW_EVENTS",
|
||||||
|
"<1,18,1,4>": {
|
||||||
|
"<1,18,1,4,1>": "@SELF",
|
||||||
|
"<1,18,1,4,2>": "@EVENT",
|
||||||
|
"<1,18,1,4,3>": "@PARAM1",
|
||||||
|
"<1,18,1,4,4>": "@PARAM2",
|
||||||
|
"<1,18,1,4,5>": "@PARAM3",
|
||||||
|
"<1,18,1,4,6>": "@PARAM4",
|
||||||
|
"<1,18,1,4,7>": "@PARAM5",
|
||||||
|
"<1,18,1,4,8>": "@PARAM6"
|
||||||
|
},
|
||||||
|
"<1,18,1,5>": "",
|
||||||
|
"<1,18,1,6>": "",
|
||||||
|
"<1,18,1,7>": "",
|
||||||
|
"<1,18,1,8>": "",
|
||||||
|
"<1,18,1,9>": "",
|
||||||
|
"<1,18,1,10>": "",
|
||||||
|
"<1,18,1,11>": "",
|
||||||
|
"<1,18,1,12>": "",
|
||||||
|
"<1,18,1,13>": "",
|
||||||
|
"<1,18,1,14>": "",
|
||||||
|
"<1,18,1,15>": "COMMEVT",
|
||||||
|
"<1,18,1,16>": "0"
|
||||||
|
},
|
||||||
|
"<1,18,2>": {
|
||||||
|
"<1,18,2,1>": "X",
|
||||||
|
"<1,18,2,2>": "EXECUTE",
|
||||||
|
"<1,18,2,3>": "@WINDOW_EVENTS",
|
||||||
|
"<1,18,2,4>": {
|
||||||
|
"<1,18,2,4,1>": "@SELF",
|
||||||
|
"<1,18,2,4,2>": "@EVENT",
|
||||||
|
"<1,18,2,4,3>": "@PARAM1",
|
||||||
|
"<1,18,2,4,4>": "@PARAM2",
|
||||||
|
"<1,18,2,4,5>": "@PARAM3",
|
||||||
|
"<1,18,2,4,6>": "@PARAM4",
|
||||||
|
"<1,18,2,4,7>": "@PARAM5",
|
||||||
|
"<1,18,2,4,8>": "@PARAM6"
|
||||||
|
},
|
||||||
|
"<1,18,2,5>": "",
|
||||||
|
"<1,18,2,6>": "",
|
||||||
|
"<1,18,2,7>": "",
|
||||||
|
"<1,18,2,8>": "",
|
||||||
|
"<1,18,2,9>": "",
|
||||||
|
"<1,18,2,10>": "",
|
||||||
|
"<1,18,2,11>": "",
|
||||||
|
"<1,18,2,12>": "",
|
||||||
|
"<1,18,2,13>": "",
|
||||||
|
"<1,18,2,14>": "",
|
||||||
|
"<1,18,2,15>": "COMMEVT",
|
||||||
|
"<1,18,2,16>": "0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"<1,19>": {
|
||||||
|
"<1,19,1>": "WEBVIEWCREATED",
|
||||||
|
"<1,19,2>": "WEBNAVIGATED"
|
||||||
|
},
|
||||||
|
"<1,20>": "",
|
||||||
|
"<1,21>": "",
|
||||||
|
"<1,22>": "",
|
||||||
|
"<1,23>": "",
|
||||||
|
"<1,24>": "",
|
||||||
|
"<1,25>": "",
|
||||||
|
"<1,26>": "",
|
||||||
|
"<1,27>": "",
|
||||||
|
"<1,28>": "",
|
||||||
|
"<1,29>": "",
|
||||||
|
"<1,30>": "",
|
||||||
|
"<1,31>": "",
|
||||||
|
"<1,32>": "",
|
||||||
|
"<1,33>": "",
|
||||||
|
"<1,34>": "",
|
||||||
|
"<1,35>": "",
|
||||||
|
"<1,36>": "",
|
||||||
|
"<1,37>": "",
|
||||||
|
"<1,38>": "",
|
||||||
|
"<1,39>": "",
|
||||||
|
"<1,40>": "",
|
||||||
|
"<1,41>": "",
|
||||||
|
"<1,42>": "",
|
||||||
|
"<1,43>": "",
|
||||||
|
"<1,44>": "",
|
||||||
|
"<1,45>": "",
|
||||||
|
"<1,46>": "",
|
||||||
|
"<1,47>": "",
|
||||||
|
"<1,48>": "",
|
||||||
|
"<1,49>": "",
|
||||||
|
"<1,50>": "",
|
||||||
|
"<1,51>": "",
|
||||||
|
"<1,52>": "",
|
||||||
|
"<1,53>": "",
|
||||||
|
"<1,54>": "",
|
||||||
|
"<1,55>": "",
|
||||||
|
"<1,56>": "",
|
||||||
|
"<1,57>": "",
|
||||||
|
"<1,58>": {
|
||||||
|
"<1,58,1>": "1",
|
||||||
|
"<1,58,2>": "1",
|
||||||
|
"<1,58,3>": "1",
|
||||||
|
"<1,58,4>": "1",
|
||||||
|
"<1,58,5>": "1",
|
||||||
|
"<1,58,6>": "0",
|
||||||
|
"<1,58,7>": "1",
|
||||||
|
"<1,58,8>": "1",
|
||||||
|
"<1,58,9>": "1",
|
||||||
|
"<1,58,10>": "1",
|
||||||
|
"<1,58,11>": "1",
|
||||||
|
"<1,58,12>": "1",
|
||||||
|
"<1,58,13>": "1"
|
||||||
|
},
|
||||||
|
"<1,59>": "",
|
||||||
|
"<1,60>": "",
|
||||||
|
"<1,61>": "",
|
||||||
|
"<1,62>": "",
|
||||||
|
"<1,63>": "",
|
||||||
|
"<1,64>": "",
|
||||||
|
"<1,65>": "",
|
||||||
|
"<1,66>": "",
|
||||||
|
"<1,67>": "",
|
||||||
|
"<1,68>": "",
|
||||||
|
"<1,69>": "",
|
||||||
|
"<1,70>": "",
|
||||||
|
"<1,71>": "",
|
||||||
|
"<1,72>": "",
|
||||||
|
"<1,73>": "",
|
||||||
|
"<1,74>": "",
|
||||||
|
"<1,75>": "",
|
||||||
|
"<1,76>": "",
|
||||||
|
"<1,77>": "",
|
||||||
|
"<1,78>": "",
|
||||||
|
"<1,79>": "",
|
||||||
|
"<1,80>": "",
|
||||||
|
"<1,81>": "",
|
||||||
|
"<1,82>": "",
|
||||||
|
"<1,83>": "",
|
||||||
|
"<1,84>": "",
|
||||||
|
"<1,85>": "",
|
||||||
|
"<1,86>": "",
|
||||||
|
"<1,87>": "",
|
||||||
|
"<1,88>": "",
|
||||||
|
"<1,89>": "",
|
||||||
|
"<1,90>": "",
|
||||||
|
"<1,91>": "",
|
||||||
|
"<1,92>": "",
|
||||||
|
"<1,93>": "",
|
||||||
|
"<1,94>": {
|
||||||
|
"<1,94,1>": "",
|
||||||
|
"<1,94,2>": "",
|
||||||
|
"<1,94,3>": "",
|
||||||
|
"<1,94,4>": "0",
|
||||||
|
"<1,94,5>": "",
|
||||||
|
"<1,94,6>": "",
|
||||||
|
"<1,94,7>": "0",
|
||||||
|
"<1,94,8>": "",
|
||||||
|
"<1,94,9>": "0",
|
||||||
|
"<1,94,10>": "0"
|
||||||
|
},
|
||||||
|
"<1,95>": {
|
||||||
|
"<1,95,1>": "0",
|
||||||
|
"<1,95,2>": "0",
|
||||||
|
"<1,95,3>": "0",
|
||||||
|
"<1,95,4>": "0",
|
||||||
|
"<1,95,5>": "0",
|
||||||
|
"<1,95,6>": "0",
|
||||||
|
"<1,95,7>": "0",
|
||||||
|
"<1,95,8>": "0",
|
||||||
|
"<1,95,9>": "0",
|
||||||
|
"<1,95,10>": "0",
|
||||||
|
"<1,95,11>": "0"
|
||||||
|
},
|
||||||
|
"<1,96>": "",
|
||||||
|
"<1,97>": "",
|
||||||
|
"<1,98>": "",
|
||||||
|
"<1,99>": "",
|
||||||
|
"<1,100>": "",
|
||||||
|
"<1,101>": "",
|
||||||
|
"<1,102>": "",
|
||||||
|
"<1,103>": "",
|
||||||
|
"<1,104>": "",
|
||||||
|
"<1,105>": "",
|
||||||
|
"<1,106>": "",
|
||||||
|
"<1,107>": "",
|
||||||
|
"<1,108>": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"record4": {
|
||||||
|
"<1>": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -43,6 +43,10 @@
|
|||||||
"<8,3>": {
|
"<8,3>": {
|
||||||
"<8,3,1>": "Update RDS Layer Parameters",
|
"<8,3,1>": "Update RDS Layer Parameters",
|
||||||
"<8,3,2>": "UPDATE_RDS_LAYER"
|
"<8,3,2>": "UPDATE_RDS_LAYER"
|
||||||
|
},
|
||||||
|
"<8,4>": {
|
||||||
|
"<8,4,1>": "Update RDS Test Specs",
|
||||||
|
"<8,4,2>": "UPDATE_RDS_TEST"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"<9>": {
|
"<9>": {
|
||||||
|
|||||||
@ -122,8 +122,12 @@
|
|||||||
"<8,23,1>": "PSV",
|
"<8,23,1>": "PSV",
|
||||||
"<8,23,2>": "Pre Ship Verification"
|
"<8,23,2>": "Pre Ship Verification"
|
||||||
},
|
},
|
||||||
"<8,24>": "",
|
"<8,24>": {
|
||||||
"<8,25>": ""
|
"<8,24,1>": "RTF",
|
||||||
|
"<8,24,2>": "Return To Fab Active"
|
||||||
|
},
|
||||||
|
"<8,25>": "",
|
||||||
|
"<8,26>": ""
|
||||||
},
|
},
|
||||||
"<9>": {
|
"<9>": {
|
||||||
"<9,1>": {
|
"<9,1>": {
|
||||||
@ -141,14 +145,6 @@
|
|||||||
"<9,2,4>": "C",
|
"<9,2,4>": "C",
|
||||||
"<9,2,5>": "",
|
"<9,2,5>": "",
|
||||||
"<9,2,6>": "Current Status Description"
|
"<9,2,6>": "Current Status Description"
|
||||||
},
|
|
||||||
"<9,3>": {
|
|
||||||
"<9,3,1>": "",
|
|
||||||
"<9,3,2>": "",
|
|
||||||
"<9,3,3>": "",
|
|
||||||
"<9,3,4>": "",
|
|
||||||
"<9,3,5>": "",
|
|
||||||
"<9,3,6>": ""
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"<10>": "L",
|
"<10>": "L",
|
||||||
@ -175,8 +171,18 @@
|
|||||||
"<31>": "0",
|
"<31>": "0",
|
||||||
"<32>": "0",
|
"<32>": "0",
|
||||||
"<33>": "0",
|
"<33>": "0",
|
||||||
"<34>": "16777215",
|
"<34>": "-2",
|
||||||
"<35>": "16777215"
|
"<35>": "-2",
|
||||||
|
"<36>": "",
|
||||||
|
"<37>": "",
|
||||||
|
"<38>": "",
|
||||||
|
"<39>": "",
|
||||||
|
"<40>": "-2",
|
||||||
|
"<41>": "1000",
|
||||||
|
"<42>": "",
|
||||||
|
"<43>": "",
|
||||||
|
"<44>": "",
|
||||||
|
"<45>": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -9,7 +9,7 @@
|
|||||||
"<2>": "-1",
|
"<2>": "-1",
|
||||||
"<3>": "-1",
|
"<3>": "-1",
|
||||||
"<4>": "-1",
|
"<4>": "-1",
|
||||||
"<5>": "16777215",
|
"<5>": "-2",
|
||||||
"<6>": {
|
"<6>": {
|
||||||
"<6,1>": {
|
"<6,1>": {
|
||||||
"<6,1,1>": "Tahoma",
|
"<6,1,1>": "Tahoma",
|
||||||
@ -41,28 +41,8 @@
|
|||||||
"<8,2,2>": "High Thruput"
|
"<8,2,2>": "High Thruput"
|
||||||
},
|
},
|
||||||
"<8,3>": {
|
"<8,3>": {
|
||||||
"<8,3,1>": "K2K",
|
"<8,3,1>": "EPP",
|
||||||
"<8,3,2>": "Kit 2000"
|
"<8,3,2>": " EpiPro"
|
||||||
},
|
|
||||||
"<8,4>": {
|
|
||||||
"<8,4,1>": "EPP",
|
|
||||||
"<8,4,2>": " EpiPro"
|
|
||||||
},
|
|
||||||
"<8,5>": {
|
|
||||||
"<8,5,1>": "GAN",
|
|
||||||
"<8,5,2>": "GaN"
|
|
||||||
},
|
|
||||||
"<8,6>": {
|
|
||||||
"<8,6,1>": "STD",
|
|
||||||
"<8,6,2>": "Standard"
|
|
||||||
},
|
|
||||||
"<8,7>": {
|
|
||||||
"<8,7,1>": "HD",
|
|
||||||
"<8,7,2>": "Heavy Duty"
|
|
||||||
},
|
|
||||||
"<8,8>": {
|
|
||||||
"<8,8,1>": "SCADA",
|
|
||||||
"<8,8,2>": "Prototype"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"<9>": {
|
"<9>": {
|
||||||
@ -108,7 +88,17 @@
|
|||||||
"<32>": "0",
|
"<32>": "0",
|
||||||
"<33>": "1",
|
"<33>": "1",
|
||||||
"<34>": "16777215",
|
"<34>": "16777215",
|
||||||
"<35>": "16777215"
|
"<35>": "16777215",
|
||||||
|
"<36>": "",
|
||||||
|
"<37>": "",
|
||||||
|
"<38>": "",
|
||||||
|
"<39>": "",
|
||||||
|
"<40>": "-2",
|
||||||
|
"<41>": "1000",
|
||||||
|
"<42>": "",
|
||||||
|
"<43>": "",
|
||||||
|
"<44>": "",
|
||||||
|
"<45>": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -130,7 +130,11 @@
|
|||||||
"<8,25,1>": "PSV",
|
"<8,25,1>": "PSV",
|
||||||
"<8,25,2>": "Pre Ship Verification"
|
"<8,25,2>": "Pre Ship Verification"
|
||||||
},
|
},
|
||||||
"<8,26>": ""
|
"<8,26>": {
|
||||||
|
"<8,26,1>": "RTF",
|
||||||
|
"<8,26,2>": "Return To Fab Active"
|
||||||
|
},
|
||||||
|
"<8,27>": ""
|
||||||
},
|
},
|
||||||
"<9>": {
|
"<9>": {
|
||||||
"<9,1>": {
|
"<9,1>": {
|
||||||
@ -174,8 +178,18 @@
|
|||||||
"<31>": "0",
|
"<31>": "0",
|
||||||
"<32>": "0",
|
"<32>": "0",
|
||||||
"<33>": "0",
|
"<33>": "0",
|
||||||
"<34>": "16777215",
|
"<34>": "-2",
|
||||||
"<35>": "16777215"
|
"<35>": "-2",
|
||||||
|
"<36>": "",
|
||||||
|
"<37>": "",
|
||||||
|
"<38>": "",
|
||||||
|
"<39>": "",
|
||||||
|
"<40>": "-2",
|
||||||
|
"<41>": "1000",
|
||||||
|
"<42>": "",
|
||||||
|
"<43>": "",
|
||||||
|
"<44>": "",
|
||||||
|
"<45>": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -9,7 +9,7 @@
|
|||||||
"<2>": "-1",
|
"<2>": "-1",
|
||||||
"<3>": "-1",
|
"<3>": "-1",
|
||||||
"<4>": "-1",
|
"<4>": "-1",
|
||||||
"<5>": "16777215",
|
"<5>": "-2",
|
||||||
"<6>": {
|
"<6>": {
|
||||||
"<6,1>": {
|
"<6,1>": {
|
||||||
"<6,1,1>": "Tahoma",
|
"<6,1,1>": "Tahoma",
|
||||||
@ -43,39 +43,19 @@
|
|||||||
"<8,2,3>": "High Thruput"
|
"<8,2,3>": "High Thruput"
|
||||||
},
|
},
|
||||||
"<8,3>": {
|
"<8,3>": {
|
||||||
"<8,3,1>": "4",
|
"<8,3,1>": "5",
|
||||||
"<8,3,2>": "HTR",
|
"<8,3,2>": "HTR",
|
||||||
"<8,3,3>": "High Thruput"
|
"<8,3,3>": "High Thruput"
|
||||||
},
|
},
|
||||||
"<8,4>": {
|
"<8,4>": {
|
||||||
"<8,4,1>": "5",
|
"<8,4,1>": "8",
|
||||||
"<8,4,2>": "HTR",
|
"<8,4,2>": "EPP",
|
||||||
"<8,4,3>": "High Thruput"
|
"<8,4,3>": "EpiPro"
|
||||||
},
|
},
|
||||||
"<8,5>": {
|
"<8,5>": {
|
||||||
"<8,5,1>": "8",
|
"<8,5,1>": "18",
|
||||||
"<8,5,2>": "EPP",
|
"<8,5,2>": "EPP",
|
||||||
"<8,5,3>": "EpiPro"
|
"<8,5,3>": "EpiPro"
|
||||||
},
|
|
||||||
"<8,6>": {
|
|
||||||
"<8,6,1>": "18",
|
|
||||||
"<8,6,2>": "EPP",
|
|
||||||
"<8,6,3>": "EpiPro"
|
|
||||||
},
|
|
||||||
"<8,7>": {
|
|
||||||
"<8,7,1>": "24",
|
|
||||||
"<8,7,2>": "EPP",
|
|
||||||
"<8,7,3>": "EpiPro"
|
|
||||||
},
|
|
||||||
"<8,8>": {
|
|
||||||
"<8,8,1>": "5",
|
|
||||||
"<8,8,2>": "GAN",
|
|
||||||
"<8,8,3>": "G5+"
|
|
||||||
},
|
|
||||||
"<8,9>": {
|
|
||||||
"<8,9,1>": "8",
|
|
||||||
"<8,9,2>": "GAN",
|
|
||||||
"<8,9,3>": "G5"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"<9>": {
|
"<9>": {
|
||||||
@ -129,7 +109,17 @@
|
|||||||
"<32>": "0",
|
"<32>": "0",
|
||||||
"<33>": "1",
|
"<33>": "1",
|
||||||
"<34>": "16777215",
|
"<34>": "16777215",
|
||||||
"<35>": "16777215"
|
"<35>": "16777215",
|
||||||
|
"<36>": "",
|
||||||
|
"<37>": "",
|
||||||
|
"<38>": "",
|
||||||
|
"<39>": "",
|
||||||
|
"<40>": "-2",
|
||||||
|
"<41>": "1000",
|
||||||
|
"<42>": "",
|
||||||
|
"<43>": "",
|
||||||
|
"<44>": "",
|
||||||
|
"<45>": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -9,7 +9,7 @@
|
|||||||
"<2>": "-1",
|
"<2>": "-1",
|
||||||
"<3>": "-1",
|
"<3>": "-1",
|
||||||
"<4>": "-1",
|
"<4>": "-1",
|
||||||
"<5>": "16777215",
|
"<5>": "-2",
|
||||||
"<6>": {
|
"<6>": {
|
||||||
"<6,1>": {
|
"<6,1>": {
|
||||||
"<6,1,1>": "Tahoma",
|
"<6,1,1>": "Tahoma",
|
||||||
@ -33,32 +33,12 @@
|
|||||||
"<7>": "",
|
"<7>": "",
|
||||||
"<8>": {
|
"<8>": {
|
||||||
"<8,1>": {
|
"<8,1>": {
|
||||||
"<8,1,1>": "35",
|
"<8,1,1>": "8",
|
||||||
"<8,1,2>": "35 inch EpiPro"
|
"<8,1,2>": "200mm 8 in"
|
||||||
},
|
},
|
||||||
"<8,2>": {
|
"<8,2>": {
|
||||||
"<8,2,1>": "18",
|
"<8,2,1>": "6",
|
||||||
"<8,2,2>": "18 inch HTR"
|
"<8,2,2>": "150mm 6 in"
|
||||||
},
|
|
||||||
"<8,3>": {
|
|
||||||
"<8,3,1>": "15",
|
|
||||||
"<8,3,2>": "15 inch HTR"
|
|
||||||
},
|
|
||||||
"<8,4>": {
|
|
||||||
"<8,4,1>": "8",
|
|
||||||
"<8,4,2>": "8 inch 200mm"
|
|
||||||
},
|
|
||||||
"<8,5>": {
|
|
||||||
"<8,5,1>": "6",
|
|
||||||
"<8,5,2>": "6 inch 150mm"
|
|
||||||
},
|
|
||||||
"<8,6>": {
|
|
||||||
"<8,6,1>": "5",
|
|
||||||
"<8,6,2>": "5 inch 125mm"
|
|
||||||
},
|
|
||||||
"<8,7>": {
|
|
||||||
"<8,7,1>": "4",
|
|
||||||
"<8,7,2>": "4 inch 100mm"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"<9>": {
|
"<9>": {
|
||||||
@ -104,7 +84,17 @@
|
|||||||
"<32>": "0",
|
"<32>": "0",
|
||||||
"<33>": "1",
|
"<33>": "1",
|
||||||
"<34>": "16777215",
|
"<34>": "16777215",
|
||||||
"<35>": "16777215"
|
"<35>": "16777215",
|
||||||
|
"<36>": "",
|
||||||
|
"<37>": "",
|
||||||
|
"<38>": "",
|
||||||
|
"<39>": "",
|
||||||
|
"<40>": "-2",
|
||||||
|
"<41>": "1000",
|
||||||
|
"<42>": "",
|
||||||
|
"<43>": "",
|
||||||
|
"<44>": "",
|
||||||
|
"<45>": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -9,7 +9,7 @@
|
|||||||
"<2>": "-2",
|
"<2>": "-2",
|
||||||
"<3>": "-1",
|
"<3>": "-1",
|
||||||
"<4>": "-1",
|
"<4>": "-1",
|
||||||
"<5>": "16777215",
|
"<5>": "-2",
|
||||||
"<6>": {
|
"<6>": {
|
||||||
"<6,1>": {
|
"<6,1>": {
|
||||||
"<6,1,1>": "MS Sans Serif",
|
"<6,1,1>": "MS Sans Serif",
|
||||||
@ -105,6 +105,10 @@
|
|||||||
"<8,19>": {
|
"<8,19>": {
|
||||||
"<8,19,1>": "PACK",
|
"<8,19,1>": "PACK",
|
||||||
"<8,19,2>": "Loaded in PT Out"
|
"<8,19,2>": "Loaded in PT Out"
|
||||||
|
},
|
||||||
|
"<8,20>": {
|
||||||
|
"<8,20,1>": "RTF",
|
||||||
|
"<8,20,2>": "Return To Fab Active"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"<9>": {
|
"<9>": {
|
||||||
@ -123,14 +127,6 @@
|
|||||||
"<9,2,4>": "C",
|
"<9,2,4>": "C",
|
||||||
"<9,2,5>": "",
|
"<9,2,5>": "",
|
||||||
"<9,2,6>": "Current Status Description"
|
"<9,2,6>": "Current Status Description"
|
||||||
},
|
|
||||||
"<9,3>": {
|
|
||||||
"<9,3,1>": "",
|
|
||||||
"<9,3,2>": "",
|
|
||||||
"<9,3,3>": "",
|
|
||||||
"<9,3,4>": "",
|
|
||||||
"<9,3,5>": "",
|
|
||||||
"<9,3,6>": ""
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"<10>": "L",
|
"<10>": "L",
|
||||||
@ -158,7 +154,17 @@
|
|||||||
"<32>": "0",
|
"<32>": "0",
|
||||||
"<33>": "1",
|
"<33>": "1",
|
||||||
"<34>": "16777215",
|
"<34>": "16777215",
|
||||||
"<35>": "16777215"
|
"<35>": "16777215",
|
||||||
|
"<36>": "",
|
||||||
|
"<37>": "",
|
||||||
|
"<38>": "",
|
||||||
|
"<39>": "",
|
||||||
|
"<40>": "-2",
|
||||||
|
"<41>": "1000",
|
||||||
|
"<42>": "",
|
||||||
|
"<43>": "",
|
||||||
|
"<44>": "",
|
||||||
|
"<45>": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -9,7 +9,7 @@
|
|||||||
"<2>": "-2",
|
"<2>": "-2",
|
||||||
"<3>": "-1",
|
"<3>": "-1",
|
||||||
"<4>": "-1",
|
"<4>": "-1",
|
||||||
"<5>": "16777215",
|
"<5>": "-2",
|
||||||
"<6>": {
|
"<6>": {
|
||||||
"<6,1>": {
|
"<6,1>": {
|
||||||
"<6,1,1>": "MS Sans Serif",
|
"<6,1,1>": "MS Sans Serif",
|
||||||
@ -189,6 +189,10 @@
|
|||||||
"<8,40>": {
|
"<8,40>": {
|
||||||
"<8,40,1>": "PACK",
|
"<8,40,1>": "PACK",
|
||||||
"<8,40,2>": "Loaded in PT Out"
|
"<8,40,2>": "Loaded in PT Out"
|
||||||
|
},
|
||||||
|
"<8,41>": {
|
||||||
|
"<8,41,1>": "RTF",
|
||||||
|
"<8,41,2>": "Return To Fab Active"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"<9>": {
|
"<9>": {
|
||||||
@ -207,14 +211,6 @@
|
|||||||
"<9,2,4>": "C",
|
"<9,2,4>": "C",
|
||||||
"<9,2,5>": "",
|
"<9,2,5>": "",
|
||||||
"<9,2,6>": "Current Status Description"
|
"<9,2,6>": "Current Status Description"
|
||||||
},
|
|
||||||
"<9,3>": {
|
|
||||||
"<9,3,1>": "",
|
|
||||||
"<9,3,2>": "",
|
|
||||||
"<9,3,3>": "",
|
|
||||||
"<9,3,4>": "",
|
|
||||||
"<9,3,5>": "",
|
|
||||||
"<9,3,6>": ""
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"<10>": "L",
|
"<10>": "L",
|
||||||
@ -242,7 +238,17 @@
|
|||||||
"<32>": "0",
|
"<32>": "0",
|
||||||
"<33>": "1",
|
"<33>": "1",
|
||||||
"<34>": "16777215",
|
"<34>": "16777215",
|
||||||
"<35>": "16777215"
|
"<35>": "16777215",
|
||||||
|
"<36>": "",
|
||||||
|
"<37>": "",
|
||||||
|
"<38>": "",
|
||||||
|
"<39>": "",
|
||||||
|
"<40>": "-2",
|
||||||
|
"<41>": "1000",
|
||||||
|
"<42>": "",
|
||||||
|
"<43>": "",
|
||||||
|
"<44>": "",
|
||||||
|
"<45>": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -27,17 +27,22 @@ $Insert SERVICE_SETUP
|
|||||||
$Insert APP_INSERTS
|
$Insert APP_INSERTS
|
||||||
$Insert REVDOTNETEQUATES
|
$Insert REVDOTNETEQUATES
|
||||||
|
|
||||||
Declare function Logging_Services, Environment_Services, Active_Directory_Services
|
Declare function Logging_Services, Environment_Services, Active_Directory_Services, Database_Services
|
||||||
Declare subroutine Set_Property.Net, Logging_Services, Set_Status, Database_Services
|
Declare function Error_Services, SRP_Array
|
||||||
|
Declare subroutine Set_Property.Net, Logging_Services, Set_Status, Database_Services, Error_Services
|
||||||
|
|
||||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\ActiveDirectory'
|
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\ActiveDirectory'
|
||||||
LogDate = Oconv(Date(), 'D4/')
|
LogDate = Oconv(Date(), 'D4/')
|
||||||
LogTime = Oconv(Time(), 'MTS')
|
LogTime = Oconv(Time(), 'MTS')
|
||||||
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
||||||
|
|
||||||
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ActiveDirectoryAuthLog.csv'
|
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ActiveDirectoryAuthenticationLog.csv'
|
||||||
Headers = 'Logging DTM' : @FM : 'Username' : @FM : 'Authenticated'
|
Headers = 'Logging DTM' : @FM : 'Username' : @FM : 'Authenticated'
|
||||||
objADAuthLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
|
objADAuthenticationLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
|
||||||
|
|
||||||
|
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ActiveDirectoryAuthorizationLog.csv'
|
||||||
|
Headers = 'Logging DTM' : @FM : 'Username' : @FM : 'Authorized'
|
||||||
|
objADAuthorizationLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
|
||||||
|
|
||||||
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ActiveDirectoryLog.csv'
|
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ActiveDirectoryLog.csv'
|
||||||
Headers = 'Logging DTM' : @FM : 'Operation' : @FM : 'Message'
|
Headers = 'Logging DTM' : @FM : 'Operation' : @FM : 'Message'
|
||||||
@ -83,12 +88,43 @@ Service AuthenticateUser(Username, Password, Domain)
|
|||||||
LogData<1> = LoggingDTM
|
LogData<1> = LoggingDTM
|
||||||
LogData<2> = Username
|
LogData<2> = Username
|
||||||
LogData<3> = Authenticated
|
LogData<3> = Authenticated
|
||||||
Logging_Services('AppendLog', objADAuthLog, LogData, @RM, @FM, False$)
|
Logging_Services('AppendLog', objADAuthenticationLog, LogData, @RM, @FM, False$)
|
||||||
Response = Authenticated
|
Response = Authenticated
|
||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
|
Service AuthorizeUser(Username, Domain)
|
||||||
|
|
||||||
|
ErrorMsg = ''
|
||||||
|
Authorized = False$
|
||||||
|
If ( (Username NE '') and (Domain NE '') ) then
|
||||||
|
AuthAdGroups = ''
|
||||||
|
LoginConfig = Database_Services('ReadDataRow', 'SYSENV', 'CFG_LOGIN*LSL2')
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
AuthAdGroups<-1> = LoginConfig<2>
|
||||||
|
AuthAdGroups<-1> = LoginConfig<3>
|
||||||
|
AuthAdGroups<-1> = LoginConfig<4>
|
||||||
|
UserAdGroups = Active_Directory_Services('GetADGroups', Username, Domain)
|
||||||
|
MemberOfAuthGroups = SRP_Array('Join', UserAdGroups, AuthAdGroups, 'AND', @FM)
|
||||||
|
Authorized = (MemberOfAuthGroups NE '')
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Error retrieving active directory authorization groups.'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Username and domain required.'
|
||||||
|
end
|
||||||
|
LogData = ''
|
||||||
|
LogData<1> = LoggingDTM
|
||||||
|
LogData<2> = Username
|
||||||
|
LogData<3> = Authorized
|
||||||
|
Logging_Services('AppendLog', objADAuthorizationLog, LogData, @RM, @FM, False$)
|
||||||
|
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||||
|
Response = Authorized
|
||||||
|
|
||||||
|
end service
|
||||||
|
|
||||||
|
|
||||||
Service GetADGroups(Username, Domain)
|
Service GetADGroups(Username, Domain)
|
||||||
|
|
||||||
ADGroups = ''
|
ADGroups = ''
|
||||||
@ -143,7 +179,6 @@ Service GetADGroups(Username, Domain)
|
|||||||
End Service
|
End Service
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Service GetComputerDomain()
|
Service GetComputerDomain()
|
||||||
|
|
||||||
Domain = ''
|
Domain = ''
|
||||||
@ -166,6 +201,7 @@ Service GetComputerDomain()
|
|||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
// GetADGroupsByString
|
// GetADGroupsByString
|
||||||
//
|
//
|
||||||
@ -303,8 +339,10 @@ Service GetADGroupsByString(SearchString, Domain=DOMAIN, SearchByDescription=DES
|
|||||||
end
|
end
|
||||||
|
|
||||||
Response = ADGroups
|
Response = ADGroups
|
||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
// GetADGroupMembersByGroupDescription
|
// GetADGroupMembersByGroupDescription
|
||||||
//
|
//
|
||||||
@ -319,6 +357,7 @@ end service
|
|||||||
// 9/26/2024 - [JRO] Initial Programmer.
|
// 9/26/2024 - [JRO] Initial Programmer.
|
||||||
//----------------------------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
Service GetADGroupMembersByGroupDescription(DescriptionName, Domain=DOMAIN)
|
Service GetADGroupMembersByGroupDescription(DescriptionName, Domain=DOMAIN)
|
||||||
|
|
||||||
Set_Status(0)
|
Set_Status(0)
|
||||||
ErrMessage = ''
|
ErrMessage = ''
|
||||||
GroupUsers = ''
|
GroupUsers = ''
|
||||||
@ -397,8 +436,10 @@ Service GetADGroupMembersByGroupDescription(DescriptionName, Domain=DOMAIN)
|
|||||||
Error_Services('Add', ErrMessage)
|
Error_Services('Add', ErrMessage)
|
||||||
end
|
end
|
||||||
Response = GroupUsers
|
Response = GroupUsers
|
||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
// GetADGroupMembersByGroupName
|
// GetADGroupMembersByGroupName
|
||||||
//
|
//
|
||||||
@ -413,6 +454,7 @@ end service
|
|||||||
// 9/26/2024 - [JRO] Initial Programmer.
|
// 9/26/2024 - [JRO] Initial Programmer.
|
||||||
//----------------------------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
Service GetADGroupMembersByGroupName(GroupName, Domain=DOMAIN)
|
Service GetADGroupMembersByGroupName(GroupName, Domain=DOMAIN)
|
||||||
|
|
||||||
Set_Status(0)
|
Set_Status(0)
|
||||||
Users = ''
|
Users = ''
|
||||||
ErrMessage = ''
|
ErrMessage = ''
|
||||||
@ -501,8 +543,10 @@ Service GetADGroupMembersByGroupName(GroupName, Domain=DOMAIN)
|
|||||||
Error_Services('Add', ErrMessage)
|
Error_Services('Add', ErrMessage)
|
||||||
end
|
end
|
||||||
Response = Users
|
Response = Users
|
||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
// GetADUserAttributes
|
// GetADUserAttributes
|
||||||
//
|
//
|
||||||
@ -513,6 +557,7 @@ end service
|
|||||||
// First value is the AD User Name, Second value is the Display Name, and third value is the email.
|
// First value is the AD User Name, Second value is the Display Name, and third value is the email.
|
||||||
//----------------------------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
Service GetADUserAttributes(Username, Domain=DOMAIN)
|
Service GetADUserAttributes(Username, Domain=DOMAIN)
|
||||||
|
|
||||||
Set_Status(0)
|
Set_Status(0)
|
||||||
ThisUser = ''
|
ThisUser = ''
|
||||||
ErrMessage = ''
|
ErrMessage = ''
|
||||||
@ -593,5 +638,6 @@ Service GetADUserAttributes(Username, Domain=DOMAIN)
|
|||||||
Error_Services('Add', ErrMessage)
|
Error_Services('Add', ErrMessage)
|
||||||
end
|
end
|
||||||
Response = ThisUser
|
Response = ThisUser
|
||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|||||||
@ -2,10 +2,19 @@ Compile function Archive_Services(@Service, @Params)
|
|||||||
#pragma precomp SRP_PreCompiler
|
#pragma precomp SRP_PreCompiler
|
||||||
$insert LOGICAL
|
$insert LOGICAL
|
||||||
$insert APP_INSERTS
|
$insert APP_INSERTS
|
||||||
|
$Insert WO_LOG_EQUATES
|
||||||
|
$Insert RDS_EQUATES
|
||||||
|
$Insert REACT_RUN_EQUATES
|
||||||
|
$Insert RDS_LAYER_EQUATES
|
||||||
|
$Insert RDS_TEST_EQUATES
|
||||||
|
$Insert ARCHIVE_EQUATES
|
||||||
|
|
||||||
EQU COMMA$ To ','
|
EQU COMMA$ To ','
|
||||||
|
|
||||||
Declare subroutine Change_Log_Services, Logging_Services
|
Declare subroutine Change_Log_Services, Logging_Services, Error_Services, Database_Services
|
||||||
Declare function SRP_Datetime, Logging_Services, Environment_Services, Datetime
|
Declare function SRP_Datetime, Logging_Services, Environment_Services, Datetime
|
||||||
|
Declare function Database_Services, Wo_Mat_Services, Error_Services, RDS_Services
|
||||||
|
Declare function WM_In_Services, WM_Out_Services
|
||||||
|
|
||||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Archive'
|
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Archive'
|
||||||
LogDate = Oconv(Date(), 'D4/')
|
LogDate = Oconv(Date(), 'D4/')
|
||||||
@ -51,7 +60,174 @@ Service ArchiveRecords()
|
|||||||
|
|
||||||
End Service
|
End Service
|
||||||
|
|
||||||
Service DearchiveRecord(Table, ID)
|
Service GetWORelatedRecord(WOLogId)
|
||||||
|
|
||||||
|
ErrorMsg = ''
|
||||||
|
If WOLogId NE '' then
|
||||||
|
If RowExists('WO_LOG', WOLogId) then
|
||||||
|
WOLogRec = Database_Services('ReadDataRow', 'WO_LOG', WOLogId, True$, 0, False$)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
ArchiveRecordId = 'WO_LOG*' : WOLogId
|
||||||
|
ArchiveRecord = ''
|
||||||
|
WOMatKeys = Wo_Mat_Services('GetWOMatKeys', WOLogId)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
WOMatQAKeys = WOMatKeys
|
||||||
|
WOStepKey = WOLogRec<WO_LOG_WO_STEP_KEY$>
|
||||||
|
WMInKeys = Wm_In_Services('GetWMInKeys', WOLogId)
|
||||||
|
if Error_Services('NoError') then
|
||||||
|
WMOutKeys = Wm_Out_Services('GetWMOutKeys', WOLogId)
|
||||||
|
if Error_Services('NoError') then
|
||||||
|
RDSKeys = RDS_Services('GetRDSKeys', WOLogId)
|
||||||
|
if Error_Services('NoError') then
|
||||||
|
ReactRunKeys = RDSKeys
|
||||||
|
RDSLayerKeys = ''
|
||||||
|
CleanInspKeys = ''
|
||||||
|
for each ReactRunKey in ReactRunKeys using @VM setting iPos
|
||||||
|
ReactRunRec = Database_Services('ReadDataRow', 'REACT_RUN', ReactRunKey, True$, 0, False$)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
CleanInspKeys<1, -1> = ReactRunRec<REACT_RUN_CI_NO$>
|
||||||
|
RDSLayerKeys<1, -1> = ReactRunRec<REACT_RUN_RDS_LAYER_KEYS$>
|
||||||
|
end else
|
||||||
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
Next ReactRunKey
|
||||||
|
RDSTestKeys = ''
|
||||||
|
If ErrorMsg EQ '' then
|
||||||
|
For each RDSLayerKey in RDSLayerKeys using @VM
|
||||||
|
RDSLayerRec = Database_Services('ReadDataRow', 'RDS_LAYER', RDSLayerKey, True$, 0, False$)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
RDSTestKeys<1, -1> = RDSLayerRec<RDS_LAYER_RDS_TEST_KEYS$>
|
||||||
|
end else
|
||||||
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
Next RDSLayerKey
|
||||||
|
TWUseKeys = ''
|
||||||
|
end
|
||||||
|
TWUseKeys = ''
|
||||||
|
If ErrorMsg EQ '' then
|
||||||
|
for each RDSTestKey in RDSTestKeys using @VM
|
||||||
|
RDSTestRec = Database_Services('ReadDataRow', 'RDS_TEST', RDSTestKey, True$, 0, False$)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
TWUseKeys<1,-1> = RDSTestRec<RDS_TEST_TW_USE_ID$>
|
||||||
|
end else
|
||||||
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
Next RDSTestKey
|
||||||
|
end
|
||||||
|
If ErrorMsg EQ '' then
|
||||||
|
//ArchiveRecord
|
||||||
|
//WOLogId
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = WOLogId
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'WO_LOG'
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
|
||||||
|
//WOStepKey
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = WOStepKey
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'WO_STEP'
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
|
||||||
|
//WOMatKeys
|
||||||
|
for each WOMatKey in WOMatKeys using @VM
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = WOMatKey
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'WO_MAT'
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
|
||||||
|
Next WOMatKey
|
||||||
|
//WOMatQAKeys
|
||||||
|
for each WOMatQAKey in WOMatQAKeys using @VM
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = WOMatQAKey
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'WO_MAT_QA'
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
|
||||||
|
Next WOMatQAKey
|
||||||
|
//WMInKeys (EpiPro Specific)
|
||||||
|
for each WMInKey in WMInKeys using @VM
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = WMInKey
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'WM_IN'
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
|
||||||
|
Next WMInKey
|
||||||
|
//WMOutKeys (EpiPro Specific)
|
||||||
|
for each WMOutKey in WMOutKeys using @VM
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = WMOutKey
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'WM_OUT'
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
|
||||||
|
Next WMOutKey
|
||||||
|
//RDSKeys
|
||||||
|
for each RDSKey in RDSKeys using @VM
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = RDSKey
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'RDS'
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
|
||||||
|
Next RDSKey
|
||||||
|
//ReactRunKeys
|
||||||
|
for each ReactRunKey in ReactRunKeys using @VM
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = ReactRunKey
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'REACT_RUN'
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
|
||||||
|
Next ReactRunKey
|
||||||
|
//RDSLayerKeys
|
||||||
|
for each RDSLayerKey in RDSLayerKeys using @VM
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = RDSLayerKey
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'RDS_LAYER'
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
|
||||||
|
Next RDSLayerKey
|
||||||
|
//CleanInspKeys
|
||||||
|
for each CleanInspKey in CleanInspKeys using @VM
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = CleanInspKey
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'CLEAN_INSP'
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
|
||||||
|
Next CleanInspKey
|
||||||
|
//RDSTestKeys
|
||||||
|
for each RDSTestKey in RDSTestKeys using @VM
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = RDSTestKey
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'RDS_TEST'
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
|
||||||
|
Next RDSTestKey
|
||||||
|
//TWUseKeys
|
||||||
|
for each TWUseKey in TWUseKeys using @VM
|
||||||
|
if TWUseKey NE '' then
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = TWUseKey
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'TW_USE'
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
|
||||||
|
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
|
||||||
|
end
|
||||||
|
Next TWUseKey
|
||||||
|
Database_Services('WriteDataRow', 'ARCHIVE', ArchiveRecordId, ArchiveRecord)
|
||||||
|
If Error_Services('HasError') then
|
||||||
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'WO_LOG record not found in WO_LOG table.'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'WO_LOG ID was null.'
|
||||||
|
end
|
||||||
|
|
||||||
|
If ErrorMsg NE '' then
|
||||||
|
Error_Services('Add', ErrorMsg)
|
||||||
|
end
|
||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|||||||
@ -233,13 +233,7 @@ Read:
|
|||||||
* * * * * * *
|
* * * * * * *
|
||||||
|
|
||||||
WMOKey = Get_Property(@WINDOW,'ID')
|
WMOKey = Get_Property(@WINDOW,'ID')
|
||||||
IF RowExists('WM_OUT',WMOKey) THEN
|
IF Not(RowExists('WM_OUT',WMOKey)) THEN
|
||||||
*IF NOT(Security_Check('Work Order',READ$)) THEN
|
|
||||||
* Send_Event(@WINDOW,'CLEAR')
|
|
||||||
* Security_Err_Msg('Work Order',READ$)
|
|
||||||
* RETURN
|
|
||||||
*END
|
|
||||||
END ELSE
|
|
||||||
ErrMsg('WM_OUT entries may only be created from the Work Order Release process.')
|
ErrMsg('WM_OUT entries may only be created from the Work Order Release process.')
|
||||||
Send_Event(@WINDOW,'CLEAR')
|
Send_Event(@WINDOW,'CLEAR')
|
||||||
RETURN
|
RETURN
|
||||||
@ -384,9 +378,9 @@ WONoLF:
|
|||||||
* * * * * * *
|
* * * * * * *
|
||||||
|
|
||||||
WONo = Get_Property(@WINDOW:'.WO_NO','DEFPROP')
|
WONo = Get_Property(@WINDOW:'.WO_NO','DEFPROP')
|
||||||
|
Convert @Lower_Case to @Upper_Case in WONo
|
||||||
|
Convert 'O' to '' in WONo
|
||||||
IF INDEX(WONo,'.',1) > 0 THEN
|
IF INDEX(WONo,'.',1) > 0 THEN
|
||||||
|
|
||||||
CONVERT '.' TO '*' IN WONo
|
CONVERT '.' TO '*' IN WONo
|
||||||
Set_Property(@WINDOW:'.WO_NO','DEFPROP','')
|
Set_Property(@WINDOW:'.WO_NO','DEFPROP','')
|
||||||
obj_AppWindow('LoadFormKeys',@WINDOW:@RM:WONo)
|
obj_AppWindow('LoadFormKeys',@WINDOW:@RM:WONo)
|
||||||
@ -1769,20 +1763,6 @@ AddMakeup:
|
|||||||
AvailMU_WMOKeys = ''
|
AvailMU_WMOKeys = ''
|
||||||
UserResp = Response
|
UserResp = Response
|
||||||
MakeupBox = ''
|
MakeupBox = ''
|
||||||
|
|
||||||
// User requested to convert the current cassette into a makeup box.
|
|
||||||
// Verify the quantity before proceeding.
|
|
||||||
If WMOutKey NE '' then
|
|
||||||
Parms = ''
|
|
||||||
Parms<1> = WMOutKey ; // Cassette to verify wafer count of.
|
|
||||||
Parms<2> = 0 ; // Wafer count adjustment - 0 because converting box.
|
|
||||||
Parms<3> = 'MU' ; // Wafer counter tool location
|
|
||||||
Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms)
|
|
||||||
If Proceed NE True$ then Return
|
|
||||||
end else
|
|
||||||
ErrMsg('Error starting wafer counter check. WM_OUT key is missing.')
|
|
||||||
end
|
|
||||||
|
|
||||||
CheckValue = 1
|
CheckValue = 1
|
||||||
|
|
||||||
FieldNo = WO_MAT_EPO_MAKEUP_BOX$
|
FieldNo = WO_MAT_EPO_MAKEUP_BOX$
|
||||||
@ -2000,12 +1980,6 @@ MakeupClick:
|
|||||||
End Case
|
End Case
|
||||||
|
|
||||||
If Not(InvalidRequest) then
|
If Not(InvalidRequest) then
|
||||||
Parms = ''
|
|
||||||
Parms<1> = WMOKey ; // Cassette to verify wafer count of.
|
|
||||||
Parms<2> = 0 ; // Wafer count adjustment - 0 because converting box.
|
|
||||||
Parms<3> = 'MU' ; // Wafer counter tool location
|
|
||||||
Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms)
|
|
||||||
If Proceed EQ True$ then
|
|
||||||
Send_Event(CtrlEnt,'GOTFOCUS')
|
Send_Event(CtrlEnt,'GOTFOCUS')
|
||||||
OrgMUPart = XLATE('WM_OUT',WMOKey,'MU_PART_NO','X')
|
OrgMUPart = XLATE('WM_OUT',WMOKey,'MU_PART_NO','X')
|
||||||
// Log the makeup flag change
|
// Log the makeup flag change
|
||||||
@ -2042,9 +2016,6 @@ MakeupClick:
|
|||||||
ErrMsg('Unable to Open !WM_OUT to add index transaction. ':WMOutKey)
|
ErrMsg('Unable to Open !WM_OUT to add index transaction. ':WMOutKey)
|
||||||
END
|
END
|
||||||
* End of 10/11/2010 update
|
* End of 10/11/2010 update
|
||||||
end else
|
|
||||||
InvalidRequest = True$
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
InvalidRequest = True$
|
InvalidRequest = True$
|
||||||
|
|||||||
@ -646,7 +646,7 @@ MakeUpClick:
|
|||||||
Set_Property(@WINDOW,'SAVEWARN', False$)
|
Set_Property(@WINDOW,'SAVEWARN', False$)
|
||||||
Send_Event(@WINDOW,'CLEAR')
|
Send_Event(@WINDOW,'CLEAR')
|
||||||
If (CheckValue EQ True$) then
|
If (CheckValue EQ True$) then
|
||||||
Wo_Mat_Services('MakeupFlagOn', RDSNo)
|
Wo_Mat_Services('MakeupFlagOn', WOMatKey)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
@ -815,3 +815,4 @@ BatchFixit:
|
|||||||
|
|
||||||
RETURN
|
RETURN
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -811,18 +811,6 @@ AddMakeup:
|
|||||||
MakeupBox = ''
|
MakeupBox = ''
|
||||||
|
|
||||||
// User requested to convert the current cassette into a makeup box.
|
// User requested to convert the current cassette into a makeup box.
|
||||||
// Verify the quantity before proceeding.
|
|
||||||
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
|
|
||||||
If RDSNo NE '' then
|
|
||||||
Parms = ''
|
|
||||||
Parms<1> = RDSNo ; // Cassette to verify wafer count of.
|
|
||||||
Parms<2> = 0 ; // Wafer count adjustment - 0 because converting box.
|
|
||||||
Parms<3> = 'MU' ; // Wafer counter tool location
|
|
||||||
Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms)
|
|
||||||
If Proceed NE True$ then return
|
|
||||||
end else
|
|
||||||
ErrMsg('Error starting wafer counter check. RDS No is missing.')
|
|
||||||
end
|
|
||||||
|
|
||||||
RDSNo = Get_Property(@Window : '.RDS_NO', 'TEXT') ; // Get the RDS No now before the WRITE in case it is needed to toggle the index.
|
RDSNo = Get_Property(@Window : '.RDS_NO', 'TEXT') ; // Get the RDS No now before the WRITE in case it is needed to toggle the index.
|
||||||
|
|
||||||
@ -839,7 +827,8 @@ AddMakeup:
|
|||||||
ErrMsg('Unable to set makeup flag until Unload stage is signed.')
|
ErrMsg('Unable to set makeup flag until Unload stage is signed.')
|
||||||
Return
|
Return
|
||||||
END else
|
END else
|
||||||
Wo_Mat_Services('MakeupFlagOn', RDSNo)
|
Wo_Mat_Services('MakeupFlagOn', WOMatKey)
|
||||||
|
If Error_Services('HasError') then ErrMsg(Error_Services('GetMessage'))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1066,15 +1055,7 @@ MakeUpLot:
|
|||||||
End Case
|
End Case
|
||||||
|
|
||||||
If Not(InvalidRequest) then
|
If Not(InvalidRequest) then
|
||||||
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
|
|
||||||
EpiCheck = Rds_Services('IsEpiPro', RDSNo)
|
EpiCheck = Rds_Services('IsEpiPro', RDSNo)
|
||||||
If RDSNo NE '' then
|
|
||||||
Parms = ''
|
|
||||||
Parms<1> = RDSNo ; // Cassette to verify wafer count of.
|
|
||||||
Parms<2> = 0 ; // Wafer count adjustment - 0 because converting box.
|
|
||||||
Parms<3> = 'MU' ; // Wafer counter tool location
|
|
||||||
Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms)
|
|
||||||
If Proceed EQ True$ then
|
|
||||||
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue)
|
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue)
|
||||||
If EpiCheck EQ False$ then
|
If EpiCheck EQ False$ then
|
||||||
IF Get_Status(errCode) THEN
|
IF Get_Status(errCode) THEN
|
||||||
@ -1084,20 +1065,14 @@ MakeUpLot:
|
|||||||
Set_Property(@WINDOW,'SAVEWARN', False$)
|
Set_Property(@WINDOW,'SAVEWARN', False$)
|
||||||
Send_Event(@WINDOW,'CLEAR')
|
Send_Event(@WINDOW,'CLEAR')
|
||||||
If (CheckValue EQ True$) then
|
If (CheckValue EQ True$) then
|
||||||
Wo_Mat_Services('MakeupFlagOn', RDSNo)
|
Wo_Mat_Services('MakeupFlagOn', WOMatKey)
|
||||||
|
If Error_Services('HasError') then ErrMsg(Error_Services('GetMessage'))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
Set_Property(@WINDOW,'SAVEWARN', False$)
|
Set_Property(@WINDOW,'SAVEWARN', False$)
|
||||||
Send_Event(@WINDOW,'CLEAR')
|
Send_Event(@WINDOW,'CLEAR')
|
||||||
end
|
end
|
||||||
end else
|
|
||||||
InvalidRequest = True$
|
|
||||||
end
|
|
||||||
end else
|
|
||||||
InvalidRequest = True$
|
|
||||||
ErrMsg('WARNING: Error starting wafer counter check. RDS No is missing.')
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
InvalidRequest = True$
|
InvalidRequest = True$
|
||||||
@ -1233,7 +1208,3 @@ LogRecord:
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
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)
|
Service WriteDataRow(TableName, KeyID, DataRow, IgnoreSelfLock, IgnoreMFSRoutines, IgnoreAllLocks)
|
||||||
|
|
||||||
|
ErrorMsg = ''
|
||||||
If TableName NE '' AND KeyID NE '' then
|
If TableName NE '' AND KeyID NE '' then
|
||||||
If IgnoreSelfLock NE True$ then IgnoreSelfLock = False$
|
If IgnoreSelfLock NE True$ then IgnoreSelfLock = False$
|
||||||
If IgnoreMFSRoutines NE True$ then IgnoreMFSRoutines = False$
|
If IgnoreMFSRoutines NE True$ then IgnoreMFSRoutines = False$
|
||||||
@ -943,7 +944,13 @@ Service WriteDataRow(TableName, KeyID, DataRow, IgnoreSelfLock, IgnoreMFSRoutine
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
If IgnoreAllLocks EQ False$ then
|
If IgnoreAllLocks EQ False$ then
|
||||||
|
If Error_Services('HasError') then
|
||||||
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
|
end
|
||||||
Database_Services('ReleaseKeyIDLock', TableName, KeyID)
|
Database_Services('ReleaseKeyIDLock', TableName, KeyID)
|
||||||
|
If ErrorMsg NE '' then
|
||||||
|
Error_Services('Add', ErrorMsg)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', 'Unable to lock ' : KeyID : ' for the ' : TableName : ' table in the ' : Service : ' service.')
|
Error_Services('Add', 'Unable to lock ' : KeyID : ' for the ' : TableName : ' table in the ' : Service : ' service.')
|
||||||
@ -1102,3 +1109,4 @@ end service
|
|||||||
// Internal GoSubs
|
// Internal GoSubs
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -220,10 +220,17 @@ Service GetWeekNum(InputDate)
|
|||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
Service ConvertDateTimeToISO8601(DatetimeToConv)
|
Service ConvertDateTimeToISO8601(DatetimeToConv)
|
||||||
|
|
||||||
Response = OConv(DatetimeToConv, "[SRP_DATETIME,()YYYY-MM-DD hh:mm:ss.000Z]")
|
Response = OConv(DatetimeToConv, "[SRP_DATETIME,()YYYY-MM-DD'T'hh:mm:ss.000Z]")
|
||||||
swap ' ' with 'T' in Response
|
|
||||||
|
end service
|
||||||
|
|
||||||
|
|
||||||
|
Service ConvertISO8601ToDateTime(ISO8601Dtm)
|
||||||
|
|
||||||
|
Response = IConv(ISO8601Dtm, "[SRP_DATETIME,()YYYY-MM-DD'T'hh:mm:ss.000Z]")
|
||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
@ -233,3 +240,4 @@ end service
|
|||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
30
LSL2/STPROC/DELETE_TEST_WAFER_PROD_RECORD_FROM_SQL.txt
Normal file
30
LSL2/STPROC/DELETE_TEST_WAFER_PROD_RECORD_FROM_SQL.txt
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
Compile function Delete_Test_Wafer_Prod_Record_From_SQL(Connection, Key, Record)
|
||||||
|
|
||||||
|
/*****************************************************************************\
|
||||||
|
Deletes the given TEST_WAFER_PROD (to be renamed PRODUCT) record from the MSSQL database.
|
||||||
|
|
||||||
|
History
|
||||||
|
-------
|
||||||
|
09/10/2025 DJS Original Programmer
|
||||||
|
\*****************************************************************************/
|
||||||
|
|
||||||
|
Declare function SQL_Delete, SQL_Format
|
||||||
|
Ans = ""
|
||||||
|
|
||||||
|
// List of key names and their values
|
||||||
|
Keys = "PRODUCT_ID":@VM:SQL_Format(Key, "STR")
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------
|
||||||
|
// Multi-valued Fields
|
||||||
|
|
||||||
|
!! Delete records from MV tables first !!
|
||||||
|
|
||||||
|
// Currently no multi-value (child) tables
|
||||||
|
|
||||||
|
// OPERATION
|
||||||
|
If Ans EQ "" then
|
||||||
|
Ans = SQL_Delete(Connection, "PRODUCT", Keys)
|
||||||
|
end
|
||||||
|
|
||||||
|
Return Ans
|
||||||
|
|
||||||
109
LSL2/STPROC/DIALOG_RESPONSE_LOG_SERVICES.txt
Normal file
109
LSL2/STPROC/DIALOG_RESPONSE_LOG_SERVICES.txt
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
Compile function Dialog_Response_Log_Services(@Service, @Params)
|
||||||
|
#pragma precomp SRP_PreCompiler
|
||||||
|
|
||||||
|
$Insert LOGICAL
|
||||||
|
$Insert SERVICE_SETUP
|
||||||
|
$Insert DIALOG_RESPONSE_LOG_EQUATES
|
||||||
|
|
||||||
|
Declare function RTI_CreateGUID, Error_Services, Datetime, Environment_Services, Logging_Services
|
||||||
|
|
||||||
|
Declare subroutine Database_Services, Error_Services, Logging_Services
|
||||||
|
|
||||||
|
Options ENTITY_TYPES = 'RDS', 'REACTOR', 'WM_OUT', 'WM_IN'
|
||||||
|
Options RESPONSE_TYPES = 'OVERRIDE', 'METROLOGY', 'TEST_WAFER', 'HTR_LAST_BOX_TW'
|
||||||
|
|
||||||
|
GoToService
|
||||||
|
|
||||||
|
Return Response or ""
|
||||||
|
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// SERVICES
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Service AddDialogResponseLog(EntityId, EntityType=ENTITY_TYPES, UserId, ResponseType=RESPONSE_TYPES, Data)
|
||||||
|
|
||||||
|
ErrorMsg = ''
|
||||||
|
NewDialogResponseLogId = ''
|
||||||
|
ResponseDtm = Datetime()
|
||||||
|
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\DialogResponseLog'
|
||||||
|
LogDate = Oconv(Date(), 'D4/')
|
||||||
|
LogTime = Oconv(Time(), 'MTS')
|
||||||
|
LoggingDTM = LogDate : ' ' : LogTime
|
||||||
|
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' DialogResponseLogCreation.csv'
|
||||||
|
Headers = 'Logging DTM' : @FM : 'Key Id' : @FM : 'Response Dtm' : @FM : 'Entity Id' : @FM : 'Entity Type' : @FM : 'User Id' : @FM : 'Response Type' : @FM : 'Data' : @FM : 'Creation Message'
|
||||||
|
objAddLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
|
||||||
|
|
||||||
|
If EntityId NE '' then
|
||||||
|
If EntityType NE '' then
|
||||||
|
If RowExists(EntityType, EntityId) then
|
||||||
|
If UserId NE '' then
|
||||||
|
If RowExists('LSL_USERS', UserId) then
|
||||||
|
If ResponseType NE '' then
|
||||||
|
If Data NE '' then
|
||||||
|
NewDialogResponseLogId = RTI_CreateGUID()
|
||||||
|
If NewDialogResponseLogId NE '' then
|
||||||
|
NewDialogResponseLogRec = ''
|
||||||
|
NewDialogResponseLogRec<DIALOG_RESPONSE_LOG_RESPONSE_DTM$> = ResponseDtm
|
||||||
|
NewDialogResponseLogRec<DIALOG_RESPONSE_LOG_ENTITY_ID$> = EntityId
|
||||||
|
NewDialogResponseLogRec<DIALOG_RESPONSE_LOG_ENTITY_TYPE$> = EntityType
|
||||||
|
NewDialogResponseLogRec<DIALOG_RESPONSE_LOG_USER_ID$> = UserId
|
||||||
|
NewDialogResponseLogRec<DIALOG_RESPONSE_LOG_DIALOG_TYPE$> = ResponseType
|
||||||
|
NewDialogResponseLogRec<DIALOG_RESPONSE_LOG_DATA$> = Data
|
||||||
|
Database_Services('WriteDataRow', 'DIALOG_RESPONSE_LOG', NewDialogResponseLogId, NewDialogResponseLogRec)
|
||||||
|
If Error_Services('HasError') then
|
||||||
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error generating a new key ID.'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Data was null.'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Response Type was null.'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Invalid user id.'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'User Id was null.'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Entity Id and Entity Type was not a valid data type.'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Entity Type was null.'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Entity Id was null.'
|
||||||
|
end
|
||||||
|
|
||||||
|
If ErrorMsg EQ '' then
|
||||||
|
LogData = ''
|
||||||
|
LogData<1> = LoggingDTM
|
||||||
|
LogData<2> = NewDialogResponseLogId
|
||||||
|
LogData<3> = OConv(ResponseDtm, 'DT')
|
||||||
|
LogData<4> = EntityId
|
||||||
|
LogData<5> = EntityType
|
||||||
|
LogData<6> = UserId
|
||||||
|
LogData<7> = ResponseType
|
||||||
|
LogData<8> = Data
|
||||||
|
LogData<9> = 'Success'
|
||||||
|
Logging_Services('AppendLog', objAddLog, LogData, @RM, @FM, False$)
|
||||||
|
end else
|
||||||
|
LogData = ''
|
||||||
|
LogData<1> = LoggingDTM
|
||||||
|
LogData<2> = NewDialogResponseLogId
|
||||||
|
LogData<3> = OConv(ResponseDtm, 'DT')
|
||||||
|
LogData<4> = EntityId
|
||||||
|
LogData<5> = EntityType
|
||||||
|
LogData<6> = UserId
|
||||||
|
LogData<7> = ResponseType
|
||||||
|
LogData<8> = Data
|
||||||
|
LogData<9> = ErrorMsg
|
||||||
|
Logging_Services('AppendLog', objAddLog, LogData, @RM, @FM, False$)
|
||||||
|
Error_Services('Set', ErrorMsg)
|
||||||
|
end
|
||||||
|
|
||||||
|
End Service
|
||||||
@ -80,6 +80,7 @@ Service GetServer()
|
|||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
Service IsProd()
|
Service IsProd()
|
||||||
|
|
||||||
Machine = Environment_Services('GetServer')
|
Machine = Environment_Services('GetServer')
|
||||||
@ -279,6 +280,27 @@ Service GetMetrologyProductionPath()
|
|||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
// GetOIWizardBaseUrl
|
||||||
|
//
|
||||||
|
// Returns the OIWizardBaseUrl.
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
Service GetOIWizardBaseUrl()
|
||||||
|
|
||||||
|
Machine = Environment_Services('GetServer')
|
||||||
|
Begin Case
|
||||||
|
Case ( (Machine _EQC 'MESTSA01EC') or (Machine _EQC 'MESTST1009') or (Machine _EQC 'MESTST1010') )
|
||||||
|
Response = 'https://mestsa008.infineon.com:50186/'
|
||||||
|
// Uncomment this case and add your hostname if testing locally.
|
||||||
|
//Case ( (Machine EQ 'ISCN5CG2430JV1') or (Machine _EQC 'MESTSA09EC') )
|
||||||
|
// Response = 'http://localhost:12009/'
|
||||||
|
Case Otherwise$
|
||||||
|
Response = 'https://messa014.infineon.com:50184/'
|
||||||
|
End Case
|
||||||
|
|
||||||
|
end service
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
// GetControlPlanProductionPath
|
// GetControlPlanProductionPath
|
||||||
//
|
//
|
||||||
|
|||||||
@ -111,7 +111,6 @@ API Lock.HEAD
|
|||||||
|
|
||||||
|
|
||||||
API Lock.POST
|
API Lock.POST
|
||||||
|
|
||||||
OIWizardID = ''
|
OIWizardID = ''
|
||||||
Cookies = HTTP_Services('GetHTTPCookie')
|
Cookies = HTTP_Services('GetHTTPCookie')
|
||||||
For each Cookie in Cookies using ';'
|
For each Cookie in Cookies using ';'
|
||||||
|
|||||||
@ -1618,3 +1618,4 @@ end service
|
|||||||
// Internal GoSubs
|
// Internal GoSubs
|
||||||
//----------------------------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -219,6 +219,28 @@ Service GetOnShiftUsers()
|
|||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
Service GetCurrentShiftStartDtm()
|
||||||
|
|
||||||
|
CurrDate = SRP_Datetime('Date', Datetime())
|
||||||
|
ShiftTime = SRP_DateTime('Time', CurrDtm)
|
||||||
|
ShiftStartDtm = ''
|
||||||
|
|
||||||
|
Begin Case
|
||||||
|
Case ShiftTime GE 21600 AND ShiftTime LT 64800
|
||||||
|
//Day Shift - Same day @ 6AM
|
||||||
|
ShiftStartDtm = SRP_Datetime('AddHours', CurrDate, 6)
|
||||||
|
Case ShiftTime LT 21600
|
||||||
|
//Morning part of night shift - Prior day at 6PM
|
||||||
|
ShiftStartDtm = SRP_Datetime('AddHours', CurrDate - 1, 18)
|
||||||
|
Case ShiftTime GT 64800
|
||||||
|
//Evening Part of Night shift - Same day at 6PM
|
||||||
|
ShiftStartDtm = SRP_Datetime('AddHours', CurrDate, 18)
|
||||||
|
End Case
|
||||||
|
|
||||||
|
Response = ShiftStartDtm
|
||||||
|
|
||||||
|
end service
|
||||||
|
|
||||||
|
|
||||||
Service GetShiftByDate(Date, GenerateFlag)
|
Service GetShiftByDate(Date, GenerateFlag)
|
||||||
OnShift = ''; *Return Value
|
OnShift = ''; *Return Value
|
||||||
@ -549,3 +571,4 @@ Service UpdateSecurityGroups()
|
|||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -254,6 +254,7 @@ Service GetStratus(Handle)
|
|||||||
Result<10> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Batch'); // BatchID
|
Result<10> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Batch'); // BatchID
|
||||||
Result<11> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Cassette'); // Cassette
|
Result<11> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Cassette'); // Cassette
|
||||||
Result<12> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].GradeMean'); // ThickAvg
|
Result<12> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].GradeMean'); // ThickAvg
|
||||||
|
Result<13> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].IndexOf');
|
||||||
END
|
END
|
||||||
ForOffset = (RecordIndex - 1) * FieldPositionIncrement;
|
ForOffset = (RecordIndex - 1) * FieldPositionIncrement;
|
||||||
Result<FieldPosition + ForOffset> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Slot'); // Position
|
Result<FieldPosition + ForOffset> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Slot'); // Position
|
||||||
@ -283,6 +284,7 @@ Service GetBioRad(Handle)
|
|||||||
Result<8> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Layer'); // RunDataLayer
|
Result<8> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Layer'); // RunDataLayer
|
||||||
Result<9> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Zone'); // RunDataZone
|
Result<9> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Zone'); // RunDataZone
|
||||||
Result<11> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Wafer'); // DataSlotId
|
Result<11> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Wafer'); // DataSlotId
|
||||||
|
Result<13> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].IndexOf');
|
||||||
END
|
END
|
||||||
ForOffset = (RecordIndex - 1) * FieldPositionIncrement;
|
ForOffset = (RecordIndex - 1) * FieldPositionIncrement;
|
||||||
Result<FieldPosition + ForOffset> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Position'); // Position
|
Result<FieldPosition + ForOffset> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Position'); // Position
|
||||||
@ -310,6 +312,7 @@ Service GetCDE(Handle)
|
|||||||
Result<8> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].PSN'); // PSN
|
Result<8> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].PSN'); // PSN
|
||||||
Result<9> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Layer'); // RunDataLayer
|
Result<9> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Layer'); // RunDataLayer
|
||||||
Result<10> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Zone'); // RunDataZo
|
Result<10> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Zone'); // RunDataZo
|
||||||
|
Result<13> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].IndexOf');
|
||||||
END
|
END
|
||||||
ForOffset = (RecordIndex - 1) * FieldPositionIncrement;
|
ForOffset = (RecordIndex - 1) * FieldPositionIncrement;
|
||||||
Result<FieldPosition + ForOffset> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].InferredPoint'); // Position
|
Result<FieldPosition + ForOffset> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].InferredPoint'); // Position
|
||||||
@ -338,6 +341,7 @@ Service GetHgCV(Handle)
|
|||||||
Result<5> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].PSN'); // PSN
|
Result<5> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].PSN'); // PSN
|
||||||
Result<8> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Wafer'); // LayerZonePair
|
Result<8> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Wafer'); // LayerZonePair
|
||||||
Result<11> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Date'); // Timestamp
|
Result<11> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Date'); // Timestamp
|
||||||
|
Result<13> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].IndexOf');
|
||||||
END
|
END
|
||||||
ForOffset = (RecordIndex - 1) * FieldPositionIncrement;
|
ForOffset = (RecordIndex - 1) * FieldPositionIncrement;
|
||||||
Result<FieldPosition + ForOffset> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Site'); // Position
|
Result<FieldPosition + ForOffset> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Site'); // Position
|
||||||
@ -359,6 +363,7 @@ Service GetTencor(Handle)
|
|||||||
IF RecordIndex EQ 1 THEN
|
IF RecordIndex EQ 1 THEN
|
||||||
Result<9> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Date'); // Timestamp
|
Result<9> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Date'); // Timestamp
|
||||||
Result<10> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].HazeAverageAvg'); // HazeAvg
|
Result<10> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].HazeAverageAvg'); // HazeAvg
|
||||||
|
Result<13> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].IndexOf');
|
||||||
Result<28> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].RDS'); // RDSKeyID
|
Result<28> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].RDS'); // RDSKeyID
|
||||||
Result<30> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].WaferRecipe'); // ScanRecipe
|
Result<30> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].WaferRecipe'); // ScanRecipe
|
||||||
Result<39> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].SumOfDefectsAvg'); // SoDAvg
|
Result<39> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].SumOfDefectsAvg'); // SoDAvg
|
||||||
@ -381,6 +386,7 @@ Service GetSP1(Handle)
|
|||||||
IF RecordIndex EQ 1 THEN
|
IF RecordIndex EQ 1 THEN
|
||||||
Result<9> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Date'); // Timestamp
|
Result<9> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Date'); // Timestamp
|
||||||
Result<10> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].DcnHazeAvgMean'); // HazeAvg
|
Result<10> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].DcnHazeAvgMean'); // HazeAvg
|
||||||
|
Result<13> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].IndexOf');
|
||||||
Result<28> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].RDS'); // RDSKeyID
|
Result<28> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].RDS'); // RDSKeyID
|
||||||
Result<30> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Session'); // ScanRecipe
|
Result<30> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Session'); // ScanRecipe
|
||||||
Result<3> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].DcnLpdMean'); // SoDAvg
|
Result<3> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].DcnLpdMean'); // SoDAvg
|
||||||
|
|||||||
@ -3,13 +3,15 @@ Compile function NDW_LOAD_UNLOAD_EXTRA_EVENTS(CtrlEntId, Event, @PARAMS)
|
|||||||
#window NDW_LOAD_UNLOAD_EXTRA
|
#window NDW_LOAD_UNLOAD_EXTRA
|
||||||
|
|
||||||
Declare subroutine End_Dialog, Post_Event, Database_Services, Error_Services, Msg
|
Declare subroutine End_Dialog, Post_Event, Database_Services, Error_Services, Msg
|
||||||
Declare subroutine Set_Property, Rds_Services
|
Declare subroutine Set_Property, Rds_Services, Set_Status, Rlist, Obj_Post_Log
|
||||||
Declare function Database_Services, Error_Services
|
Declare function Database_Services, Error_Services, Qa_Services, Reactor_Services
|
||||||
Declare function Get_Property
|
Declare function Get_Property, Dialog_Box
|
||||||
|
|
||||||
$Insert EVENT_SETUP
|
$Insert EVENT_SETUP
|
||||||
$Insert LOGICAL
|
$Insert LOGICAL
|
||||||
$Insert RDS_EQUATES
|
$Insert RDS_EQUATES
|
||||||
|
$Insert REACT_LL_EQUATES
|
||||||
|
$Insert REACTOR_EQUATES
|
||||||
|
$Insert MSG_EQUATES
|
||||||
|
|
||||||
GoToEvent Event for CtrlEntId else
|
GoToEvent Event for CtrlEntId else
|
||||||
// Event not implemented
|
// Event not implemented
|
||||||
@ -42,47 +44,102 @@ end event
|
|||||||
//Signature buttons
|
//Signature buttons
|
||||||
|
|
||||||
Event PUB_SIGN_UNLOAD_EX_1.CLICK()
|
Event PUB_SIGN_UNLOAD_EX_1.CLICK()
|
||||||
|
|
||||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||||
|
initParams = ''
|
||||||
|
initParams<4> = 'Sign Unload Extra 1'
|
||||||
|
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, initParams)
|
||||||
|
Valid = Response<1>
|
||||||
|
|
||||||
|
If Valid then
|
||||||
Rds_Services('SignUnloadExtra1', RDSNo, @USER4)
|
Rds_Services('SignUnloadExtra1', RDSNo, @USER4)
|
||||||
If Error_Services('NoError') then
|
If Error_Services('NoError') then
|
||||||
Msg(@Window, 'Unload Extra 1 Signed!')
|
Msg(@Window, 'Unload Extra 1 Signed!')
|
||||||
end else
|
end else
|
||||||
Msg(@Window, Error_Services('GetMessage'))
|
Msg(@Window, Error_Services('GetMessage'))
|
||||||
end
|
end
|
||||||
|
end
|
||||||
GoSub Refresh
|
GoSub Refresh
|
||||||
end event
|
end event
|
||||||
|
|
||||||
Event PUB_SIGN_LOAD_EX_1.CLICK()
|
Event PUB_SIGN_LOAD_EX_1.CLICK()
|
||||||
|
|
||||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||||
|
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||||
|
OldReactorNo = RDSRec<RDS_REACTOR$>
|
||||||
|
NewReactorNo = Get_Property(@Window : '.EDL_REACTOR1', 'TEXT')
|
||||||
|
initParams = ''
|
||||||
|
initParams<4> = 'Sign Load Extra 1'
|
||||||
|
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, initParams)
|
||||||
|
Valid = Response<1>
|
||||||
|
|
||||||
|
If Valid then
|
||||||
|
If Qa_Services('LoadExtra1stReady', RDSNo) AND (OldReactorNo NE NewReactorNo) then
|
||||||
|
Gosub ReactorChange
|
||||||
|
end
|
||||||
|
|
||||||
|
If Error_Services('NoError') then
|
||||||
Rds_Services('SignLoadExtra1', RDSNo, @USER4)
|
Rds_Services('SignLoadExtra1', RDSNo, @USER4)
|
||||||
If Error_Services('NoError') then
|
If Error_Services('NoError') then
|
||||||
Msg(@Window, 'Load Extra 1 Signed!')
|
Msg(@Window, 'Load Extra 1 Signed!')
|
||||||
end else
|
end else
|
||||||
Msg(@Window, Error_Services('GetMessage'))
|
Msg(@Window, Error_Services('GetMessage'))
|
||||||
end
|
end
|
||||||
|
End else
|
||||||
|
Msg(@Window, Error_Services('GetMessage'))
|
||||||
|
end
|
||||||
|
end
|
||||||
GoSub Refresh
|
GoSub Refresh
|
||||||
|
|
||||||
end event
|
end event
|
||||||
|
|
||||||
Event PUB_SIGN_UNLOAD_EX_2.CLICK()
|
Event PUB_SIGN_UNLOAD_EX_2.CLICK()
|
||||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||||
|
initParams = ''
|
||||||
|
initParams<4> = 'Sign Unload Extra 2'
|
||||||
|
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, initParams)
|
||||||
|
Valid = Response<1>
|
||||||
|
|
||||||
|
If Valid then
|
||||||
Rds_Services('SignUnloadExtra2', RDSNo, @USER4)
|
Rds_Services('SignUnloadExtra2', RDSNo, @USER4)
|
||||||
If Error_Services('NoError') then
|
If Error_Services('NoError') then
|
||||||
Msg(@Window, 'Unload Extra 2 Signed!')
|
Msg(@Window, 'Unload Extra 2 Signed!')
|
||||||
end else
|
end else
|
||||||
Msg(@Window, Error_Services('GetMessage'))
|
Msg(@Window, Error_Services('GetMessage'))
|
||||||
end
|
end
|
||||||
|
end
|
||||||
GoSub Refresh
|
GoSub Refresh
|
||||||
end event
|
end event
|
||||||
|
|
||||||
Event PUB_SIGN_LOAD_EX_2.CLICK()
|
Event PUB_SIGN_LOAD_EX_2.CLICK()
|
||||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||||
|
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||||
|
OldReactorNo = RDSRec<RDS_REACTOR$>
|
||||||
|
NewReactorNo = Get_Property(@Window : '.EDL_REACTOR2', 'TEXT')
|
||||||
|
initParams = ''
|
||||||
|
initParams<4> = 'Sign Load Extra 2'
|
||||||
|
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, initParams)
|
||||||
|
Valid = Response<1>
|
||||||
|
|
||||||
|
If Valid then
|
||||||
|
If Qa_Services('LoadExtra2ndReady', RDSNo) AND (OldReactorNo NE NewReactorNo) then
|
||||||
|
Gosub ReactorChange
|
||||||
|
end
|
||||||
|
|
||||||
|
If Error_Services('NoError') then
|
||||||
Rds_Services('SignLoadExtra2', RDSNo, @USER4)
|
Rds_Services('SignLoadExtra2', RDSNo, @USER4)
|
||||||
If Error_Services('NoError') then
|
If Error_Services('NoError') then
|
||||||
Msg(@Window, 'Load Extra 2 Signed!')
|
Msg(@Window, 'Load Extra 2 Signed!')
|
||||||
end else
|
end else
|
||||||
Msg(@Window, Error_Services('GetMessage'))
|
Msg(@Window, Error_Services('GetMessage'))
|
||||||
end
|
end
|
||||||
|
End else
|
||||||
|
Msg(@Window, Error_Services('GetMessage'))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
GoSub Refresh
|
GoSub Refresh
|
||||||
|
|
||||||
end event
|
end event
|
||||||
|
|
||||||
//Clear Signature Buttons
|
//Clear Signature Buttons
|
||||||
@ -143,6 +200,9 @@ Refresh:
|
|||||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||||
If RowExists('RDS', RDSNo) then
|
If RowExists('RDS', RDSNo) then
|
||||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||||
|
if Error_Services('NoError') then
|
||||||
|
UnloadSigned = RDSRec<RDS_OPERATOR_OUT$>
|
||||||
|
ReactorNo = RDSRec<RDS_REACTOR$>
|
||||||
//Unload Extra 1
|
//Unload Extra 1
|
||||||
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
|
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
|
||||||
UnloadExtra1UserFirstLast = xlate( 'LSL_USERS', UnloadExtra1Signature, 'FIRST_LAST', 'X' )
|
UnloadExtra1UserFirstLast = xlate( 'LSL_USERS', UnloadExtra1Signature, 'FIRST_LAST', 'X' )
|
||||||
@ -153,6 +213,7 @@ Refresh:
|
|||||||
LoadExtra1UserFirstLast = xlate( 'LSL_USERS', LoadExtra1Signature, 'FIRST_LAST', 'X' )
|
LoadExtra1UserFirstLast = xlate( 'LSL_USERS', LoadExtra1Signature, 'FIRST_LAST', 'X' )
|
||||||
LoadExtra1Date = Oconv(RDSRec<RDS_OP_IN_EX2_DATE$>, 'D')
|
LoadExtra1Date = Oconv(RDSRec<RDS_OP_IN_EX2_DATE$>, 'D')
|
||||||
LoadExtra1Time = Oconv(RDSRec<RDS_OP_IN_EX2_TIME$>, 'MT')
|
LoadExtra1Time = Oconv(RDSRec<RDS_OP_IN_EX2_TIME$>, 'MT')
|
||||||
|
LoadExtra1Reactor = RDSRec<RDS_LOAD_EXTRA_1_REACTOR$>
|
||||||
//Unload Extra 2
|
//Unload Extra 2
|
||||||
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
|
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
|
||||||
UnloadExtra2UserFirstLast = xlate( 'LSL_USERS', UnloadExtra2Signature, 'FIRST_LAST', 'X' )
|
UnloadExtra2UserFirstLast = xlate( 'LSL_USERS', UnloadExtra2Signature, 'FIRST_LAST', 'X' )
|
||||||
@ -163,6 +224,7 @@ Refresh:
|
|||||||
LoadExtra2UserFirstLast = xlate( 'LSL_USERS', LoadExtra2Signature, 'FIRST_LAST', 'X' )
|
LoadExtra2UserFirstLast = xlate( 'LSL_USERS', LoadExtra2Signature, 'FIRST_LAST', 'X' )
|
||||||
LoadExtra2Date = Oconv(RDSRec<RDS_OP_IN_EX3_DATE$>, 'D')
|
LoadExtra2Date = Oconv(RDSRec<RDS_OP_IN_EX3_DATE$>, 'D')
|
||||||
LoadExtra2Time = Oconv(RDSRec<RDS_OP_IN_EX3_TIME$>, 'MT')
|
LoadExtra2Time = Oconv(RDSRec<RDS_OP_IN_EX3_TIME$>, 'MT')
|
||||||
|
LoadExtra2Reactor = RDSRec<RDS_LOAD_EXTRA_2_REACTOR$>
|
||||||
|
|
||||||
//Populate text fields
|
//Populate text fields
|
||||||
Set_Property(@Window : '.EDL_UNLOAD_EX_1_USER', 'TEXT', UnloadExtra1UserFirstLast)
|
Set_Property(@Window : '.EDL_UNLOAD_EX_1_USER', 'TEXT', UnloadExtra1UserFirstLast)
|
||||||
@ -177,6 +239,55 @@ Refresh:
|
|||||||
Set_Property(@Window : '.EDL_LOAD_EX_2_USER', 'TEXT', LoadExtra2UserFirstLast)
|
Set_Property(@Window : '.EDL_LOAD_EX_2_USER', 'TEXT', LoadExtra2UserFirstLast)
|
||||||
Set_Property(@Window : '.EDL_LOAD_EX_2_DATE', 'TEXT', LoadExtra2Date)
|
Set_Property(@Window : '.EDL_LOAD_EX_2_DATE', 'TEXT', LoadExtra2Date)
|
||||||
Set_Property(@Window : '.EDL_LOAD_EX_2_TIME', 'TEXT', LoadExtra2Time)
|
Set_Property(@Window : '.EDL_LOAD_EX_2_TIME', 'TEXT', LoadExtra2Time)
|
||||||
|
If LoadExtra1Reactor NE '' then
|
||||||
|
Set_Property(@Window : '.EDL_REACTOR1', 'TEXT', LoadExtra1Reactor)
|
||||||
|
end else
|
||||||
|
Set_Property(@Window : '.EDL_REACTOR1', 'TEXT', ReactorNo)
|
||||||
|
end
|
||||||
|
If LoadExtra2Reactor NE '' then
|
||||||
|
Set_Property(@Window : '.EDL_REACTOR2', 'TEXT', LoadExtra2Reactor)
|
||||||
|
end else
|
||||||
|
Set_Property(@Window : '.EDL_REACTOR2', 'TEXT', ReactorNo)
|
||||||
|
end
|
||||||
|
If UnloadSigned EQ '' then
|
||||||
|
Set_Property(@Window : '.EDL_REACTOR1', 'ENABLED', True$)
|
||||||
|
Set_Property(@Window : '.EDL_REACTOR2', 'ENABLED', True$)
|
||||||
|
end else
|
||||||
|
Set_Property(@Window : '.EDL_REACTOR1', 'ENABLED', False$)
|
||||||
|
Set_Property(@Window : '.EDL_REACTOR2', 'ENABLED', False$)
|
||||||
|
end
|
||||||
|
If UnloadExtra1Signature NE '' then
|
||||||
|
Set_Property(@Window : '.PUB_SIGN_UNLOAD_EX_1', 'ENABLED', False$)
|
||||||
|
Set_Property(@Window : '.PUB_CLEAR_UNLOAD_EX_1', 'ENABLED', True$)
|
||||||
|
end else
|
||||||
|
Set_Property(@Window : '.PUB_SIGN_UNLOAD_EX_1', 'ENABLED', True$)
|
||||||
|
Set_Property(@Window : '.PUB_CLEAR_UNLOAD_EX_1', 'ENABLED', False$)
|
||||||
|
end
|
||||||
|
If UnloadExtra2Signature NE '' then
|
||||||
|
Set_Property(@Window : '.PUB_SIGN_UNLOAD_EX_2', 'ENABLED', False$)
|
||||||
|
Set_Property(@Window : '.PUB_CLEAR_UNLOAD_EX_2', 'ENABLED', True$)
|
||||||
|
end else
|
||||||
|
Set_Property(@Window : '.PUB_SIGN_UNLOAD_EX_2', 'ENABLED', True$)
|
||||||
|
Set_Property(@Window : '.PUB_CLEAR_UNLOAD_EX_2', 'ENABLED', False$)
|
||||||
|
end
|
||||||
|
If LoadExtra1Signature NE '' then
|
||||||
|
Set_Property(@Window : '.PUB_SIGN_LOAD_EX_1', 'ENABLED', False$)
|
||||||
|
Set_Property(@Window : '.PUB_CLEAR_LOAD_EX_1', 'ENABLED', True$)
|
||||||
|
end else
|
||||||
|
Set_Property(@Window : '.PUB_SIGN_LOAD_EX_1', 'ENABLED', True$)
|
||||||
|
Set_Property(@Window : '.PUB_CLEAR_LOAD_EX_1', 'ENABLED', False$)
|
||||||
|
end
|
||||||
|
If LoadExtra2Signature NE '' then
|
||||||
|
Set_Property(@Window : '.PUB_SIGN_LOAD_EX_2', 'ENABLED', False$)
|
||||||
|
Set_Property(@Window : '.PUB_CLEAR_LOAD_EX_2', 'ENABLED', True$)
|
||||||
|
end else
|
||||||
|
Set_Property(@Window : '.PUB_SIGN_LOAD_EX_2', 'ENABLED', True$)
|
||||||
|
Set_Property(@Window : '.PUB_CLEAR_LOAD_EX_2', 'ENABLED', False$)
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Msg(@Window, 'Error reading RDS record from database.')
|
||||||
|
end
|
||||||
|
|
||||||
end else
|
end else
|
||||||
ResponseValue = Set_Property(@Window, '@responsevalue', 0)
|
ResponseValue = Set_Property(@Window, '@responsevalue', 0)
|
||||||
Post_Event(@Window, 'CLOSE')
|
Post_Event(@Window, 'CLOSE')
|
||||||
@ -184,4 +295,116 @@ Refresh:
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
ReactorChange:
|
||||||
|
|
||||||
|
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||||
|
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||||
|
if Error_Services('NoError') then
|
||||||
|
WONo = RDSRec<RDS_WO$>
|
||||||
|
ReactorNo = ''
|
||||||
|
LLChosen = ''
|
||||||
|
ChangePermitted = False$
|
||||||
|
Begin Case
|
||||||
|
|
||||||
|
Case Control EQ 'PUB_SIGN_LOAD_EX_1'
|
||||||
|
ReactorNo = Get_Property(@Window : '.EDL_REACTOR1', 'TEXT')
|
||||||
|
ReactorField = RDS_LOAD_EXTRA_1_REACTOR$
|
||||||
|
Case Control EQ 'PUB_SIGN_LOAD_EX_2'
|
||||||
|
ReactorNo = Get_Property(@Window : '.EDL_REACTOR2', 'TEXT')
|
||||||
|
ReactorField = RDS_LOAD_EXTRA_2_REACTOR$
|
||||||
|
Case Otherwise$
|
||||||
|
|
||||||
|
End Case
|
||||||
|
|
||||||
|
If ReactorNo NE '' then
|
||||||
|
PickPlace = Xlate('REACTOR', ReactorNo, 'PICK_PLACE', 'X')
|
||||||
|
If (Reactor_Services('GetReactorAvailChamberCount', ReactorNo) NE 0) OR (PickPlace EQ False$) then
|
||||||
|
Query = 'SELECT REACT_STATE WITH SCHED_WO CONTAINING ':WONo
|
||||||
|
GoSub ClearCursors
|
||||||
|
Set_Status(0)
|
||||||
|
RList(Query, TARGET_ACTIVELIST$, '', '' '')
|
||||||
|
SchedReactors = ''
|
||||||
|
EOF = False$
|
||||||
|
Loop
|
||||||
|
ReadNext SchedReactor else EOF = True$
|
||||||
|
Until EOF
|
||||||
|
SchedReactors<0, -1> = SchedReactor
|
||||||
|
Repeat
|
||||||
|
|
||||||
|
Locate ReactorNo in SchedReactors using @VM setting vPos then
|
||||||
|
If PickPlace EQ True$ then
|
||||||
|
LLDisabled = XLATE('REACTOR', ReactorNo, 'ACTIVE_LL_DISABLED', 'X')
|
||||||
|
IF LLDisabled NE '' then
|
||||||
|
ReactLLRec = Database_Services('ReadDataRow', 'REACT_LL', LLDisabled)
|
||||||
|
SideDisabled = ReactLLRec<REACT_LL_DISABLED$>
|
||||||
|
QualMode = ReactLLRec<REACT_LL_QUAL_MODE$>
|
||||||
|
Begin Case
|
||||||
|
Case SideDisabled EQ 'L'
|
||||||
|
LLChosen = 'R'
|
||||||
|
Case SideDisabled EQ 'R'
|
||||||
|
LLChosen = 'L'
|
||||||
|
End Case
|
||||||
|
end else
|
||||||
|
Def = ''
|
||||||
|
Def<MCAPTION$> = 'Select Load Lock'
|
||||||
|
Def<MTYPE$> = 'BLeft,Right'
|
||||||
|
Def<MTEXT$> = 'Please select a load lock.'
|
||||||
|
Def<MMODAL$> = 'A'
|
||||||
|
LLResponse = Msg(@Window, Def)
|
||||||
|
Begin Case
|
||||||
|
Case LLResponse EQ 1
|
||||||
|
LLChosen = 'L'
|
||||||
|
Case LLResponse EQ 2
|
||||||
|
LLChosen = 'R'
|
||||||
|
End Case
|
||||||
|
end
|
||||||
|
If LLChosen NE '' then
|
||||||
|
ChangePermitted = True$
|
||||||
|
end else
|
||||||
|
Error_Services('Add', 'You must select a load lock for this lot.')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ChangePermitted = True$
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Swap @VM with ',' in SchedReactors
|
||||||
|
Error_Services('Add', 'Assigned reactor, ':ReactorNo:', does not equal any scheduled reactor(s), ':SchedReactors:'.')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Error_Services('Add', ReactorNo: 'does not have the capacity necessary for this lot.')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Error_Services('Add', 'Invalid Reactor number.')
|
||||||
|
end
|
||||||
|
If ChangePermitted then
|
||||||
|
RDSRec<RDS_REACTOR$> = ReactorNo
|
||||||
|
RDSRec<ReactorField> = ReactorNo
|
||||||
|
RDSRec<RDS_LOAD_LOCK_SIDE$> = LLChosen
|
||||||
|
Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, False$)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
Msg(@Window, 'Reactor successfully changed!')
|
||||||
|
end else
|
||||||
|
Msg(@Window, 'Error changing reactor!')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Msg(@Window, 'Error reading RDS from database!')
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Internal GoSubs
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
ClearCursors:
|
||||||
|
For counter = 0 to 8
|
||||||
|
ClearSelect counter
|
||||||
|
Next counter
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -50,7 +50,7 @@ Equ HEIGHT$ to 4
|
|||||||
|
|
||||||
Declare function GetCommandLine, MemberOf, obj_Install, obj_Notes_Sent, FindWindow, ShowWindow, Next_Key
|
Declare function GetCommandLine, MemberOf, obj_Install, obj_Notes_Sent, FindWindow, ShowWindow, Next_Key
|
||||||
Declare function Environment_Services, Reactor_Services, Database_Services, obj_Tool, Messaging_Services, SRP_JSON
|
Declare function Environment_Services, Reactor_Services, Database_Services, obj_Tool, Messaging_Services, SRP_JSON
|
||||||
Declare function Notes_Services, RTI_Xlate_Controller
|
Declare function Notes_Services, RTI_Xlate_Controller, Test_Run_Services, LSL_Users_Services, Datetime
|
||||||
Declare subroutine Set_Env, obj_Appwindow, Get_BMP_Info, obj_Login, obj_Calib_List, End_Window, Start_Window, Next_Key
|
Declare subroutine Set_Env, obj_Appwindow, Get_BMP_Info, obj_Login, obj_Calib_List, End_Window, Start_Window, Next_Key
|
||||||
Declare subroutine Database_Services, obj_React_Status, Obj_React_Mode, obj_Tool_Log, RList, Messaging_Services, RTP27
|
Declare subroutine Database_Services, obj_React_Status, Obj_React_Mode, obj_Tool_Log, RList, Messaging_Services, RTP27
|
||||||
Declare subroutine Notes_Services, Obj_Note_Ptrs, Comm_Note_Ptrs, SRP_Run_Command, PlaceDialog, GetEngineVersion
|
Declare subroutine Notes_Services, Obj_Note_Ptrs, Comm_Note_Ptrs, SRP_Run_Command, PlaceDialog, GetEngineVersion
|
||||||
@ -404,6 +404,16 @@ Event WINDOW.TIMER()
|
|||||||
|
|
||||||
Gosub SetSnoozeButtonState
|
Gosub SetSnoozeButtonState
|
||||||
|
|
||||||
|
CurrDtm = Datetime()
|
||||||
|
CurrShiftStartDtm = LSL_USERS_SERVICES('GetCurrentShiftStartDtm', CurrDtm)
|
||||||
|
|
||||||
|
TWStats = Test_Run_Services('GetTestWaferUsageStats', @USER4, CurrShiftStartDtm, Datetime())
|
||||||
|
LastUsed = TWStats<1>
|
||||||
|
LastUsed = Oconv(LastUsed, 'DT2/^H')
|
||||||
|
QtyUsed = TWStats<2>
|
||||||
|
Set_Property(@Window: '.LBL_LAST_TW_USED', 'TEXT', 'TW Last Used by User: ' :LastUsed)
|
||||||
|
Set_Property(@Window: '.LBL_TW_USED', 'TEXT', 'TW Used by User: ' :QtyUsed)
|
||||||
|
|
||||||
Set_Property(@WINDOW:'.CURRENT_TIME','TEXT','Current Time: ':OCONV( TIME(), 'MTHS' ))
|
Set_Property(@WINDOW:'.CURRENT_TIME','TEXT','Current Time: ':OCONV( TIME(), 'MTHS' ))
|
||||||
Set_Property(@WINDOW:'.CURRENT_DATE','TEXT','Date: ':OCONV( DATE(), 'D2/' ))
|
Set_Property(@WINDOW:'.CURRENT_DATE','TEXT','Date: ':OCONV( DATE(), 'D2/' ))
|
||||||
If Get_Property(@Window, '@CLOSE') then
|
If Get_Property(@Window, '@CLOSE') then
|
||||||
@ -853,3 +863,5 @@ return
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -50,6 +50,7 @@ Compile function NDW_MATERIAL_TRACK_PRO_REPORT_EVENTS(CtrlEntId, Event, @PARAMS)
|
|||||||
|
|
||||||
Declare function Form_Services, Database_Services, RTI_Task_Submit, RTI_Task_Status, MemberOf
|
Declare function Form_Services, Database_Services, RTI_Task_Submit, RTI_Task_Status, MemberOf
|
||||||
Declare subroutine SRP_Show_Window, Send_Message, Set_Property, Database_Services, Material_Track, Report_Services
|
Declare subroutine SRP_Show_Window, Send_Message, Set_Property, Database_Services, Material_Track, Report_Services
|
||||||
|
Declare subroutine PlaceDialog
|
||||||
|
|
||||||
$Insert EVENT_SETUP
|
$Insert EVENT_SETUP
|
||||||
$Insert LOGICAL
|
$Insert LOGICAL
|
||||||
@ -97,8 +98,7 @@ Event WINDOW.CREATE(CreateParam)
|
|||||||
GoSub Setup_OLE_Controls
|
GoSub Setup_OLE_Controls
|
||||||
GoSub EnableGenerateReportButton
|
GoSub EnableGenerateReportButton
|
||||||
|
|
||||||
FormSize = ''
|
PlaceDialog(-2, -2)
|
||||||
SRP_Show_Window(@Window, '', 'C', 'C', 1, '', False$, False$, FormSize)
|
|
||||||
|
|
||||||
End Event
|
End Event
|
||||||
|
|
||||||
|
|||||||
@ -39,8 +39,6 @@ $Insert POPUP_EQUATES
|
|||||||
$Insert NOTIFICATION_EQUATES
|
$Insert NOTIFICATION_EQUATES
|
||||||
$Insert LSL_USERS_EQUATES
|
$Insert LSL_USERS_EQUATES
|
||||||
|
|
||||||
EQU READONLY_GREEN$ TO 192 + (220*256) + (192*65536)
|
|
||||||
|
|
||||||
Declare function Admin_User, Database_Services, Error_Services, Active_Directory_Services, SRP_Array
|
Declare function Admin_User, Database_Services, Error_Services, Active_Directory_Services, SRP_Array
|
||||||
Declare subroutine PlaceDialog, Error_Services, Database_Services, Btree.Extract, ErrMsg
|
Declare subroutine PlaceDialog, Error_Services, Database_Services, Btree.Extract, ErrMsg
|
||||||
|
|
||||||
@ -643,3 +641,4 @@ return
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -45,8 +45,7 @@ EQU COL$PMID to 1
|
|||||||
EQU COL$DESC to 2
|
EQU COL$DESC to 2
|
||||||
EQU COL$DATECOMP to 3
|
EQU COL$DATECOMP to 3
|
||||||
EQU COL$DATEDUE to 4
|
EQU COL$DATEDUE to 4
|
||||||
EQU COL$LATE to 5
|
EQU COL$USER to 5
|
||||||
EQU COL$USER to 6
|
|
||||||
|
|
||||||
// Update the arguments so that the OpenInsight OLE event will treate the ActiveX event as a native event handler.
|
// Update the arguments so that the OpenInsight OLE event will treate the ActiveX event as a native event handler.
|
||||||
If Event EQ 'OLE' then
|
If Event EQ 'OLE' then
|
||||||
@ -102,7 +101,7 @@ Event PUB_EXPORT_TO_EXCEL.CLICK()
|
|||||||
|
|
||||||
if FilePath NE '' then
|
if FilePath NE '' then
|
||||||
PmHistoryOutput = ''
|
PmHistoryOutput = ''
|
||||||
PmHistoryOutput<1> = 'PM ID' : @VM : 'Description' : @VM : 'Complete Date' : @VM : 'Due Date' : @VM : 'Late' : @VM : 'User'
|
PmHistoryOutput<1> = 'PM ID' : @VM : 'Description' : @VM : 'Complete Date' : @VM : 'Due Date' : @VM : 'User'
|
||||||
PMHistoryArray = Get_Property(@Window : '.OLE_HIST_TABLE', "OLE.ARRAY")
|
PMHistoryArray = Get_Property(@Window : '.OLE_HIST_TABLE', "OLE.ARRAY")
|
||||||
PMHistoryArray = SRP_Array('Rotate',PMHistoryArray)
|
PMHistoryArray = SRP_Array('Rotate',PMHistoryArray)
|
||||||
for each DataRow in PmHistoryArray using @FM setting dPos
|
for each DataRow in PmHistoryArray using @FM setting dPos
|
||||||
@ -152,13 +151,10 @@ RunReport:
|
|||||||
PMRec = Database_Services('ReadDataRow', 'PM', PMId)
|
PMRec = Database_Services('ReadDataRow', 'PM', PMId)
|
||||||
SchedDtm = SRP_Datetime('Combine', PMRec<PM_SCHED_DT$>, PMRec<PM_SCHED_TM$>)
|
SchedDtm = SRP_Datetime('Combine', PMRec<PM_SCHED_DT$>, PMRec<PM_SCHED_TM$>)
|
||||||
DueByDTM = obj_PM_Spec('LateStart',PMId:@RM:PMSpecRecord)
|
DueByDTM = obj_PM_Spec('LateStart',PMId:@RM:PMSpecRecord)
|
||||||
Late = Xlate('PM', PMId, 'LATE', 'X')
|
|
||||||
If Late then Late = 'Yes' else Late = 'No'
|
|
||||||
PMHistoryArray<pPos, COL$PMID> = PMId
|
PMHistoryArray<pPos, COL$PMID> = PMId
|
||||||
PMHistoryArray<pPos, COL$DESC> = PMDescription
|
PMHistoryArray<pPos, COL$DESC> = PMDescription
|
||||||
PMHistoryArray<pPos, COL$DATECOMP> = OCONV(PMRec<PM_COMP_DTM$>, 'DT')
|
PMHistoryArray<pPos, COL$DATECOMP> = OCONV(PMRec<PM_COMP_DTM$>, 'DT')
|
||||||
PMHistoryArray<pPos, COL$DATEDUE> = OCONV(SchedDtm, 'DT')
|
PMHistoryArray<pPos, COL$DATEDUE> = OCONV(SchedDtm, 'DT')
|
||||||
PMHistoryArray<pPos, COL$LATE> = Late
|
|
||||||
PMHistoryArray<pPos, COL$USER> = OConv(PMRec<PM_COMP_BY$>, '[XLATE_CONV,LSL_USERS*FIRST_LAST]')
|
PMHistoryArray<pPos, COL$USER> = OConv(PMRec<PM_COMP_BY$>, '[XLATE_CONV,LSL_USERS*FIRST_LAST]')
|
||||||
While Msg(@window, MsgUp, pPos, MSGINSTUPDATE$) ; * update the gauge and check if cancel was pressed
|
While Msg(@window, MsgUp, pPos, MSGINSTUPDATE$) ; * update the gauge and check if cancel was pressed
|
||||||
Next PMId
|
Next PMId
|
||||||
@ -191,9 +187,9 @@ Setup_OLE_Controls:
|
|||||||
EdtTableCtrl = @Window : '.OLE_HIST_TABLE'
|
EdtTableCtrl = @Window : '.OLE_HIST_TABLE'
|
||||||
Set_Property(EdtTableCtrl, 'OLE.Redraw', False$)
|
Set_Property(EdtTableCtrl, 'OLE.Redraw', False$)
|
||||||
//Set up columns
|
//Set up columns
|
||||||
Set_Property(EdtTableCtrl, "OLE.Dimension", 6);*Define number of columns
|
Set_Property(EdtTableCtrl, "OLE.Dimension", 5);*Define number of columns
|
||||||
|
|
||||||
HeaderTitles = 'PM ID':@VM:'Desc':@VM:'Date Completed':@VM:'Sched Due':@VM:'Late':@VM:'User Completed'; *Define the column header titles
|
HeaderTitles = 'PM ID':@VM:'Desc':@VM:'Date Completed':@VM:'Sched Due':@VM:'User Completed'; *Define the column header titles
|
||||||
Set_Property(EdtTableCtrl, "OLE.TitleList", HeaderTitles); *Set the column titles
|
Set_Property(EdtTableCtrl, "OLE.TitleList", HeaderTitles); *Set the column titles
|
||||||
|
|
||||||
//Set the column Sizes
|
//Set the column Sizes
|
||||||
@ -203,7 +199,7 @@ Setup_OLE_Controls:
|
|||||||
ColSize<1> = 45
|
ColSize<1> = 45
|
||||||
Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$PMID:"]", ColSize)
|
Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$PMID:"]", ColSize)
|
||||||
//Column 2
|
//Column 2
|
||||||
ColSize<1> = 200
|
ColSize<1> = 250
|
||||||
ColSize<4> = True$
|
ColSize<4> = True$
|
||||||
Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$DESC:"]", ColSize)
|
Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$DESC:"]", ColSize)
|
||||||
ColSize<4> = False$
|
ColSize<4> = False$
|
||||||
@ -211,13 +207,10 @@ Setup_OLE_Controls:
|
|||||||
ColSize<1> = 120
|
ColSize<1> = 120
|
||||||
Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$DATECOMP:"]", ColSize)
|
Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$DATECOMP:"]", ColSize)
|
||||||
//Column 4
|
//Column 4
|
||||||
ColSize<1> = 110
|
ColSize<1> = 135
|
||||||
Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$DATEDUE:"]", ColSize)
|
Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$DATEDUE:"]", ColSize)
|
||||||
//Column 5
|
//Column 5
|
||||||
ColSize<1> = 50
|
ColSize<1> = 185
|
||||||
Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$LATE:"]", ColSize)
|
|
||||||
//Column 6
|
|
||||||
ColSize<1> = 160
|
|
||||||
Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$USER:"]", ColSize)
|
Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$USER:"]", ColSize)
|
||||||
|
|
||||||
Set_Property(EdtTableCtrl, 'OLE.Border', 'XP Flat')
|
Set_Property(EdtTableCtrl, 'OLE.Border', 'XP Flat')
|
||||||
@ -234,3 +227,4 @@ Setup_OLE_Controls:
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -59,11 +59,11 @@ If Event EQ 'OLE' then
|
|||||||
Transfer Param1 to Event
|
Transfer Param1 to Event
|
||||||
Transfer Param2 to Param1
|
Transfer Param2 to Param1
|
||||||
Transfer Param3 to Param2
|
Transfer Param3 to Param2
|
||||||
* Transfer Param4 to Param3
|
Transfer Param4 to Param3
|
||||||
* Transfer Param5 to Param4
|
Transfer Param5 to Param4
|
||||||
* Transfer Param6 to Param5
|
Transfer Param6 to Param5
|
||||||
* Transfer Param7 to Param6
|
Transfer Param7 to Param6
|
||||||
* Transfer Param8 to Param7
|
Transfer Param8 to Param7
|
||||||
end
|
end
|
||||||
|
|
||||||
GoToEvent Event for CtrlEntID
|
GoToEvent Event for CtrlEntID
|
||||||
@ -186,78 +186,83 @@ Event PUB_ENG_OPTIONS.CLICK()
|
|||||||
|
|
||||||
NumRows = DCount(WOMatKeys, @VM)
|
NumRows = DCount(WOMatKeys, @VM)
|
||||||
|
|
||||||
Begin Case
|
ServiceModules = ''
|
||||||
|
Services = ''
|
||||||
|
Caption = ''
|
||||||
|
|
||||||
Case SelOpt EQ 'CLEAN_INSP'
|
For each Sel in SelOpt using @VM
|
||||||
Caption = "Updating Clean & Insp specs for selected RDS cassettes..."
|
If Sel EQ 'CLEAN_INSP' then
|
||||||
ServiceModules = 'CLEAN_INSP_SERVICES'
|
Caption<0, -1> = "Updating Clean & Insp specs for selected RDS cassettes..."
|
||||||
Services = 'UpdateAllCleanInsp'
|
ServiceModules<0, -1> = 'CLEAN_INSP_SERVICES'
|
||||||
|
Services<0, -1> = 'UpdateAllCleanInsp'
|
||||||
|
end
|
||||||
|
|
||||||
Case SelOpt EQ 'QA_MET'
|
If SelOpt EQ 'QA_MET' then
|
||||||
Caption = "Updating QA Metrology specs for selected RDS cassettes..."
|
Caption<0, -1> = "Updating QA Metrology specs for selected RDS cassettes..."
|
||||||
ServiceModules = 'WO_MAT_QA_SERVICES'
|
ServiceModules<0, -1> = 'WO_MAT_QA_SERVICES'
|
||||||
Services = 'UpdateQAMet'
|
Services<0, -1> = 'UpdateQAMet'
|
||||||
|
end
|
||||||
|
|
||||||
Case SelOpt EQ 'UPDATE_RDS_LAYER'
|
If SelOpt EQ 'UPDATE_RDS_LAYER' then
|
||||||
Caption = "Updating RDS Layer specs for selected RDS cassettes..."
|
Caption<0, -1> = "Updating RDS Layer specs for selected RDS cassettes..."
|
||||||
ServiceModules = 'RDS_LAYER_SERVICES'
|
ServiceModules<0, -1> = 'RDS_LAYER_SERVICES'
|
||||||
Services = 'UpdateRDSLayerSpecs'
|
Services<0, -1> = 'UpdateRDSLayerSpecs'
|
||||||
|
end
|
||||||
|
|
||||||
Case SelOpt EQ 'CLEAN_INSP':@VM:'QA_MET'
|
If SelOpt EQ 'UPDATE_RDS_TEST' then
|
||||||
Caption = "Updating Clean & Insp and QA Metrology specs for selected RDS cassettes..."
|
Caption<0, -1> = "Updating RDS Test specs for selected RDS cassettes..."
|
||||||
ServiceModules = 'CLEAN_INSP_SERVICES':@VM:'WO_MAT_QA_SERVICES'
|
ServiceModules<0, -1> = 'RDS_TEST_SERVICES'
|
||||||
Services = 'UpdateAllCleanInsp':@VM:'UpdateQAMet'
|
Services<0, -1> = 'UpdateRDSTestSpecs'
|
||||||
|
end
|
||||||
|
Next Sel
|
||||||
|
|
||||||
Case SelOpt EQ 'QA_MET':@VM:'UPDATE_RDS_LAYER'
|
Swap @VM with CRLF$ in Caption
|
||||||
Caption = "Updating RDS Layer and QA Metrology specs for selected RDS cassettes..."
|
|
||||||
ServiceModules = 'WO_MAT_QA_SERVICES':@VM:'RDS_LAYER_SERVICES'
|
|
||||||
Services = 'UpdateQAMet':@VM:'UpdateRDSLayerSpecs'
|
|
||||||
|
|
||||||
Case SelOpt EQ 'CLEAN_INSP':@VM: 'UPDATE_RDS_LAYER'
|
|
||||||
Caption = "Updating RDS Layer and Clean & Insp specs for selected RDS cassettes..."
|
|
||||||
ServiceModules = 'CLEAN_INSP_SERVICES':@VM:'RDS_LAYER_SERVICES'
|
|
||||||
Services = 'UpdateAllCleanInsp':@VM:'UpdateRDSLayerSpecs'
|
|
||||||
|
|
||||||
Case SelOpt EQ 'CLEAN_INSP':@VM:'QA_MET':@VM: 'UPDATE_RDS_LAYER'
|
|
||||||
Caption = "Updating Clean & Insp, QA Metrology, and RDS Layer specs for selected RDS cassettes..."
|
|
||||||
ServiceModules = 'CLEAN_INSP_SERVICES':@VM:'WO_MAT_QA_SERVICES' :@VM: 'RDS_LAYER_SERVICES'
|
|
||||||
Services = 'UpdateAllCleanInsp':@VM:'UpdateQAMet' :@VM: 'UpdateRDSLayerSpecs'
|
|
||||||
|
|
||||||
End Case
|
|
||||||
|
|
||||||
If ServiceModules NE '' then
|
If ServiceModules NE '' then
|
||||||
Def = ""
|
ErrorMsg = ''
|
||||||
|
Def = ''
|
||||||
Def<MCAPTION$> = Caption
|
Def<MCAPTION$> = Caption
|
||||||
Def<MTYPE$> = "GC"
|
Def<MTYPE$> = "GC"
|
||||||
Def<MEXTENT$> = NumRows
|
Def<MEXTENT$> = NumRows
|
||||||
Def<MTEXTWIDTH$> = 600
|
Def<MTEXTWIDTH$> = 600
|
||||||
MsgUp = Msg(@WINDOW, Def) ;* Start gas guage message
|
Def<MCOL$> = -2
|
||||||
|
Def<MROW$> = -2
|
||||||
|
MsgUp = Msg(@Window, Def) ;* Start gas guage message
|
||||||
For each WOMatKey in WOMatKeys using @VM setting vPos
|
For each WOMatKey in WOMatKeys using @VM setting vPos
|
||||||
Running = Msg(@WINDOW, MsgUp, vPos, MSGINSTUPDATE$) ;* Update gas guage
|
Running = Msg(@Window, MsgUp, vPos, MSGINSTUPDATE$) ;* Update gas guage
|
||||||
For each ServiceModule in ServiceModules using @VM setting sPos
|
For each ServiceModule in ServiceModules using @VM setting sPos
|
||||||
Service = Services<0, sPos>
|
Service = Services<0, sPos>
|
||||||
If Service = 'UpdateRDSLayerSpecs' then
|
If ( (Service _EQC 'UpdateRDSLayerSpecs') or (Service _EQC 'UpdateRDSTestSpecs') ) then
|
||||||
RDSKey = SelRDSList<4, vPos>
|
RDSKey = SelRDSList<4, vPos>
|
||||||
Ans = Function(@ServiceModule(Service, RDSKey))
|
Ans = Function(@ServiceModule(Service, RDSKey))
|
||||||
end else
|
end else
|
||||||
Ans = Function(@ServiceModule(Service, WOMatKey))
|
Ans = Function(@ServiceModule(Service, WOMatKey))
|
||||||
end
|
end
|
||||||
If Error_Services('HasError') then
|
If Error_Services('HasError') then
|
||||||
Error_Services('DisplayError')
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
end
|
end
|
||||||
|
Until (ErrorMsg NE '')
|
||||||
Next ServiceModule
|
Next ServiceModule
|
||||||
|
Until (ErrorMsg NE '')
|
||||||
Next WOMatKey
|
Next WOMatKey
|
||||||
Msg(@WINDOW,MsgUp) ;* Take gas guage down
|
|
||||||
|
Msg(@Window,MsgUp) ;* Take gas guage down
|
||||||
end
|
end
|
||||||
|
|
||||||
If Error_Services('NoError') then
|
Def = ''
|
||||||
Def = ""
|
Def<MCOL$> = -2
|
||||||
|
Def<MROW$> = -2
|
||||||
|
If (ErrorMsg EQ '') then
|
||||||
Def<MICON$> = '*'
|
Def<MICON$> = '*'
|
||||||
Def<MCAPTION$> = 'Success'
|
Def<MCAPTION$> = 'Success'
|
||||||
Def<MTEXT$> = "Update complete!"
|
Def<MTEXT$> = 'Update complete!'
|
||||||
Def<MTYPE$> = "BO"
|
end else
|
||||||
MsgUp = Msg(@window, Def)
|
Def<MICON$> = 'H'
|
||||||
|
Def<MCAPTION$> = 'Update failed!'
|
||||||
|
Def<MTEXT$> = ErrorMsg
|
||||||
end
|
end
|
||||||
|
Def<MTYPE$> = "BO"
|
||||||
|
MsgUp = Msg(@Window, Def, 'OK')
|
||||||
end
|
end
|
||||||
|
|
||||||
end event
|
end event
|
||||||
@ -277,7 +282,7 @@ Event PUB_ON_HOLD.CLICK()
|
|||||||
HoldEntity = 'RDS'
|
HoldEntity = 'RDS'
|
||||||
HoldType = 'HOLD'
|
HoldType = 'HOLD'
|
||||||
HoldData = ''
|
HoldData = ''
|
||||||
HoldData = Dialog_Box('DIALOG_HOLD',@WINDOW,Transition:@FM:@FM:HoldType)
|
HoldData = Dialog_Box('DIALOG_HOLD',@Window,Transition:@FM:@FM:HoldType)
|
||||||
If HoldData NE 'Cancel' then
|
If HoldData NE 'Cancel' then
|
||||||
GoSub GetView
|
GoSub GetView
|
||||||
Hold_Services('EnableMultipleHolds', WOMatKeys, HoldEntity, RDSKeys, 'NDW_RDS_QUERY', '', HoldData)
|
Hold_Services('EnableMultipleHolds', WOMatKeys, HoldEntity, RDSKeys, 'NDW_RDS_QUERY', '', HoldData)
|
||||||
@ -289,7 +294,7 @@ Event PUB_ON_HOLD.CLICK()
|
|||||||
MsgInfo<MTYPE$> = 'BNY'
|
MsgInfo<MTYPE$> = 'BNY'
|
||||||
MsgInfo<MTEXT$> = 'Hold Successful. Would you like to print label(s)?'
|
MsgInfo<MTEXT$> = 'Hold Successful. Would you like to print label(s)?'
|
||||||
MsgInfo<MICON$> = '!'
|
MsgInfo<MICON$> = '!'
|
||||||
PrintLabel = Msg(@WINDOW,MsgInfo,'')
|
PrintLabel = Msg(@Window,MsgInfo,'')
|
||||||
HoldBy = HoldData<1>
|
HoldBy = HoldData<1>
|
||||||
Reason = HoldData<2>
|
Reason = HoldData<2>
|
||||||
Stage = HoldData<4>
|
Stage = HoldData<4>
|
||||||
@ -333,7 +338,7 @@ Event PUB_OFF_HOLD.CLICK()
|
|||||||
Transition = True$
|
Transition = True$
|
||||||
HoldType = 'HOLD'
|
HoldType = 'HOLD'
|
||||||
HoldData = ''
|
HoldData = ''
|
||||||
HoldData = Dialog_Box('DIALOG_HOLD',@WINDOW,Transition:@FM:@FM:HoldType)
|
HoldData = Dialog_Box('DIALOG_HOLD',@Window,Transition:@FM:@FM:HoldType)
|
||||||
If HoldData NE 'Cancel' then
|
If HoldData NE 'Cancel' then
|
||||||
GoSub GetView
|
GoSub GetView
|
||||||
Hold_Services('DisableMultipleHolds', WOMatKeys, 'RDS', RDSKeys, 'NDW_RDS_QUERY', '', HoldData)
|
Hold_Services('DisableMultipleHolds', WOMatKeys, 'RDS', RDSKeys, 'NDW_RDS_QUERY', '', HoldData)
|
||||||
@ -666,7 +671,7 @@ CheckSelectedForHolds:
|
|||||||
Until HoldOnFlag EQ True$ and HoldOffFlag EQ True$
|
Until HoldOnFlag EQ True$ and HoldOffFlag EQ True$
|
||||||
Next K
|
Next K
|
||||||
end
|
end
|
||||||
if MemberOf(@USER4, 'ENG_TECH') OR MemberOf(@USER4, 'LEAD') OR MemberOf(@USER4, 'SUPERVISOR') then
|
if MemberOf(@User4, 'ENG_TECH') OR MemberOf(@User4, 'LEAD') OR MemberOf(@User4, 'SUPERVISOR') then
|
||||||
// IF ANY SELECTED LOTS ARE ON HOLD, ENABLE PUB_OFF_HOLD
|
// IF ANY SELECTED LOTS ARE ON HOLD, ENABLE PUB_OFF_HOLD
|
||||||
Set_Property(@Window:'.PUB_OFF_HOLD', 'ENABLED', HoldOffFlag)
|
Set_Property(@Window:'.PUB_OFF_HOLD', 'ENABLED', HoldOffFlag)
|
||||||
end else
|
end else
|
||||||
|
|||||||
@ -723,6 +723,7 @@ Event OLE_SCHEDULE.OnContextMenuClick(Item, UserData)
|
|||||||
Description = AddEventDetails<5>
|
Description = AddEventDetails<5>
|
||||||
WaferQty = AddEventDetails<6>
|
WaferQty = AddEventDetails<6>
|
||||||
NewApptID = Schedule_Services('AddSchedEvent', ReactorNo, WorkOrder, StartDTM, StopDTM, Description, WaferQty)
|
NewApptID = Schedule_Services('AddSchedEvent', ReactorNo, WorkOrder, StartDTM, StopDTM, Description, WaferQty)
|
||||||
|
If Error_Services('NoError') then
|
||||||
NewAppt = Schedule_Services('GetScheduleEvent', NewApptID)
|
NewAppt = Schedule_Services('GetScheduleEvent', NewApptID)
|
||||||
If Error_Services('NoError') then
|
If Error_Services('NoError') then
|
||||||
GoSub RefreshReactor
|
GoSub RefreshReactor
|
||||||
@ -733,6 +734,9 @@ Event OLE_SCHEDULE.OnContextMenuClick(Item, UserData)
|
|||||||
end else
|
end else
|
||||||
Error_Services('DisplayError')
|
Error_Services('DisplayError')
|
||||||
end
|
end
|
||||||
|
end else
|
||||||
|
Error_Services('DisplayError')
|
||||||
|
end
|
||||||
GoSub HideWaitMessage
|
GoSub HideWaitMessage
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -39,8 +39,6 @@ $Insert POPUP_EQUATES
|
|||||||
$Insert SEC_GROUPS_EQUATES
|
$Insert SEC_GROUPS_EQUATES
|
||||||
$Insert LSL_USERS_EQUATES
|
$Insert LSL_USERS_EQUATES
|
||||||
|
|
||||||
EQU READONLY_GREEN$ TO 192 + (220*256) + (192*65536)
|
|
||||||
|
|
||||||
Declare function Admin_User, Database_Services, Error_Services, Active_Directory_Services, SRP_Array
|
Declare function Admin_User, Database_Services, Error_Services, Active_Directory_Services, SRP_Array
|
||||||
Declare subroutine PlaceDialog, Error_Services, Database_Services, Btree.Extract, ErrMsg
|
Declare subroutine PlaceDialog, Error_Services, Database_Services, Btree.Extract, ErrMsg
|
||||||
|
|
||||||
@ -726,3 +724,4 @@ UnlockRec:
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -97,16 +97,6 @@ Event WINDOW.CREATE(CreateParam)
|
|||||||
LogData<5> = ToolLoc
|
LogData<5> = ToolLoc
|
||||||
LogData<6> = @Window:'.CREATE'
|
LogData<6> = @Window:'.CREATE'
|
||||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||||
QAMetComplete = ''
|
|
||||||
|
|
||||||
If CassID NE '' then
|
|
||||||
If RowExists('WM_OUT', CassID) then
|
|
||||||
WOMatKey = Xlate('WM_OUT', CassID, 'WO_MAT_KEY', 'X')
|
|
||||||
end else
|
|
||||||
WOMatKey = Xlate('RDS', CassID, 'WO_MAT_KEY', 'X')
|
|
||||||
end
|
|
||||||
QAMetComplete = Wo_Mat_Qa_Services('GetQAMetComplete', WOMatKey)
|
|
||||||
end
|
|
||||||
|
|
||||||
Convert '.' to '*' in CassID
|
Convert '.' to '*' in CassID
|
||||||
ExpectedQty = ''
|
ExpectedQty = ''
|
||||||
@ -115,8 +105,6 @@ Event WINDOW.CREATE(CreateParam)
|
|||||||
Set_Property(@Window:'.EDL_CASS_ID', 'TEXT', CassID)
|
Set_Property(@Window:'.EDL_CASS_ID', 'TEXT', CassID)
|
||||||
|
|
||||||
Begin Case
|
Begin Case
|
||||||
Case (CassID NE '' AND QAMetComplete EQ False$)
|
|
||||||
ErrorMsg = 'Wafer Counter Operation Not Allowed. QA Metrology Incomplete.'
|
|
||||||
Case ( (CassID EQ '') and (ToolLoc EQ '') )
|
Case ( (CassID EQ '') and (ToolLoc EQ '') )
|
||||||
// Alternate workflow
|
// Alternate workflow
|
||||||
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass ID')
|
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass ID')
|
||||||
@ -333,8 +321,6 @@ Event EDL_CASS_BARCODE.LOSTFOCUS(Flag, FocusID)
|
|||||||
Begin Case
|
Begin Case
|
||||||
Case RowExists('RDS', CassetteID)
|
Case RowExists('RDS', CassetteID)
|
||||||
WOMatKey = Xlate('RDS', CassetteID, 'WO_MAT_KEY', 'X')
|
WOMatKey = Xlate('RDS', CassetteID, 'WO_MAT_KEY', 'X')
|
||||||
QAMetComplete = Wo_Mat_Qa_Services('GetQAMetComplete', WOMatKey)
|
|
||||||
If QAMetComplete EQ True$ then
|
|
||||||
ExpectedQty = Xlate('RDS', CassetteID, 'WFRS_OUT', 'X')
|
ExpectedQty = Xlate('RDS', CassetteID, 'WFRS_OUT', 'X')
|
||||||
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
|
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
|
||||||
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass RDS')
|
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass RDS')
|
||||||
@ -347,14 +333,9 @@ Event EDL_CASS_BARCODE.LOSTFOCUS(Flag, FocusID)
|
|||||||
end else
|
end else
|
||||||
ErrorMsg = Error_Services('GetMessage')
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
end
|
end
|
||||||
end else
|
|
||||||
ErrorMsg = 'Wafer Counter Operation Not Allowed. A Metrology stage is incomplete.'
|
|
||||||
end
|
|
||||||
|
|
||||||
Case RowExists('WM_OUT', CassetteID)
|
Case RowExists('WM_OUT', CassetteID)
|
||||||
WOMatKey = Xlate('WM_OUT', CassetteID, 'WO_MAT_KEY', 'X')
|
WOMatKey = Xlate('WM_OUT', CassetteID, 'WO_MAT_KEY', 'X')
|
||||||
QAMetComplete = Wo_Mat_Qa_Services('GetQAMetComplete', WOMatKey)
|
|
||||||
If QAMetComplete EQ True$ then
|
|
||||||
ExpectedQty = Xlate('WM_OUT', CassetteID, 'WAFER_CNT', 'X')
|
ExpectedQty = Xlate('WM_OUT', CassetteID, 'WAFER_CNT', 'X')
|
||||||
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
|
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
|
||||||
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass WMO')
|
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass WMO')
|
||||||
@ -366,9 +347,6 @@ Event EDL_CASS_BARCODE.LOSTFOCUS(Flag, FocusID)
|
|||||||
end else
|
end else
|
||||||
ErrorMsg = Error_Services('GetMessage')
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
end
|
end
|
||||||
end else
|
|
||||||
ErrorMsg = 'Wafer Counter Operation Not Allowed. QA Metrology Incomplete.'
|
|
||||||
end
|
|
||||||
End Case
|
End Case
|
||||||
|
|
||||||
If ErrorMsg EQ '' then
|
If ErrorMsg EQ '' then
|
||||||
@ -438,7 +416,53 @@ Event EDL_TOOL_BARCODE.LOSTFOCUS(Flag, FocusID)
|
|||||||
Cnt = DCount(ScanData, '|')
|
Cnt = DCount(ScanData, '|')
|
||||||
If Cnt EQ 2 then
|
If Cnt EQ 2 then
|
||||||
WaferSize = Field(ScanData, '|', 1)
|
WaferSize = Field(ScanData, '|', 1)
|
||||||
Area = Field(ScanData, '|', 2)
|
Area = Field(ScanData, '|', 2) ; // This is a proxy for the operation being performed
|
||||||
|
|
||||||
|
If Area EQ 'FQA' then
|
||||||
|
CassetteID = Get_Property(@Window:'.EDL_CASS_ID', 'TEXT')
|
||||||
|
Begin Case
|
||||||
|
Case RowExists('RDS', CassetteID)
|
||||||
|
WOMatKey = Xlate('RDS', CassetteID, 'WO_MAT_KEY', 'X')
|
||||||
|
QAMetComplete = Wo_Mat_Qa_Services('GetQAMetComplete', WOMatKey)
|
||||||
|
If QAMetComplete EQ True$ then
|
||||||
|
ExpectedQty = Xlate('RDS', CassetteID, 'WFRS_OUT', 'X')
|
||||||
|
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
|
||||||
|
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass RDS')
|
||||||
|
Set_Property(@Window:'.LBL_CASS_BARCODE', 'TEXT', 'Cass RDS 2D')
|
||||||
|
|
||||||
|
WOMatKey = Xlate('RDS', CassetteID, 'WO_MAT_KEY', 'X')
|
||||||
|
CurrWfrMap = WO_Mat_Services('GetWaferMap', WOMatKey)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
ExpectedWfrMap = CurrWfrMap
|
||||||
|
end else
|
||||||
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Wafer Counter Operation Not Allowed. A Metrology stage is incomplete.'
|
||||||
|
end
|
||||||
|
Case RowExists('WM_OUT', CassetteID)
|
||||||
|
WOMatKey = Xlate('WM_OUT', CassetteID, 'WO_MAT_KEY', 'X')
|
||||||
|
QAMetComplete = Wo_Mat_Qa_Services('GetQAMetComplete', WOMatKey)
|
||||||
|
If QAMetComplete EQ True$ then
|
||||||
|
ExpectedQty = Xlate('WM_OUT', CassetteID, 'WAFER_CNT', 'X')
|
||||||
|
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
|
||||||
|
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass WMO')
|
||||||
|
Set_Property(@Window:'.LBL_CASS_BARCODE', 'TEXT', 'Cass WMO 2D')
|
||||||
|
|
||||||
|
CurrWfrMap = WM_Out_Services('GetWaferMap', CassetteID)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
ExpectedWfrMap = CurrWfrMap
|
||||||
|
end else
|
||||||
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Wafer Counter Operation Not Allowed. QA Metrology Incomplete.'
|
||||||
|
end
|
||||||
|
End Case
|
||||||
|
end
|
||||||
|
|
||||||
|
If ErrorMsg EQ '' then
|
||||||
|
|
||||||
Def = ""
|
Def = ""
|
||||||
Def<MTEXT$> = "Retreiving Wafer Counter Data..."
|
Def<MTEXT$> = "Retreiving Wafer Counter Data..."
|
||||||
Def<MTYPE$> = "U"
|
Def<MTYPE$> = "U"
|
||||||
@ -531,17 +555,16 @@ Event EDL_TOOL_BARCODE.LOSTFOCUS(Flag, FocusID)
|
|||||||
end else
|
end else
|
||||||
ErrorMsg = Error_Services('GetMessage')
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
end
|
end
|
||||||
|
end
|
||||||
end else
|
end else
|
||||||
ErrorMsg = 'Invalid Tool Barcode Scan.'
|
ErrorMsg = 'Invalid Tool Barcode Scan.'
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
|
|
||||||
LogData = ''
|
LogData = ''
|
||||||
LogData<1> = OConv(Datetime(), 'DT2/^H')
|
LogData<1> = OConv(Datetime(), 'DT2/^H')
|
||||||
LogData<2> = @User4
|
LogData<2> = @User4
|
||||||
LogData<3> = 'Verification process canceled'
|
LogData<3> = 'Verification process canceled'
|
||||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||||
|
|
||||||
End_Dialog(@Window, False$)
|
End_Dialog(@Window, False$)
|
||||||
end
|
end
|
||||||
If ErrorMsg NE '' then
|
If ErrorMsg NE '' then
|
||||||
@ -624,9 +647,3 @@ ClearForm:
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1221,7 +1221,6 @@ Event PUB_REM_CASS.CLICK()
|
|||||||
WmInKeys = ''
|
WmInKeys = ''
|
||||||
for each CassetteToVoid in CassettesToVoid using @FM
|
for each CassetteToVoid in CassettesToVoid using @FM
|
||||||
WmInKeys<1, -1> = CassetteToVoid<1,4>
|
WmInKeys<1, -1> = CassetteToVoid<1,4>
|
||||||
//Work_Order_Services('SignVoidWMI', WMIToVoid, @USER4)
|
|
||||||
Next CassetteToVoid
|
Next CassetteToVoid
|
||||||
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'SignVoidWMI':SD$:WmInKeys:SD$:WoNo:SD$:@USER4)
|
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'SignVoidWMI':SD$:WmInKeys:SD$:WoNo:SD$:@USER4)
|
||||||
If Error_Services('HasError') then
|
If Error_Services('HasError') then
|
||||||
@ -1240,7 +1239,6 @@ Event PUB_REM_CASS.CLICK()
|
|||||||
CassNo = XLATE('RDS', RDSToVoid, RDS_CASS_NO$, 'X')
|
CassNo = XLATE('RDS', RDSToVoid, RDS_CASS_NO$, 'X')
|
||||||
WOMatKey = WONo : '*' : CassNo
|
WOMatKey = WONo : '*' : CassNo
|
||||||
WoMatKeyList<1, -1> = WoMatKey
|
WoMatKeyList<1, -1> = WoMatKey
|
||||||
//Work_Order_Services('SignVoidNonEPP', WOMatKey, @USER4)
|
|
||||||
If Error_Services('HasError') then
|
If Error_Services('HasError') then
|
||||||
ErrorMessage = Error_Services('GetMessage')
|
ErrorMessage = Error_Services('GetMessage')
|
||||||
end
|
end
|
||||||
@ -1332,7 +1330,7 @@ Event PUB_REM_WM_OUT.CLICK()
|
|||||||
WmOutKeys<1, -1> = CassetteToVoid<1,3>
|
WmOutKeys<1, -1> = CassetteToVoid<1,3>
|
||||||
Until ErrorMessage NE ''
|
Until ErrorMessage NE ''
|
||||||
Next CassetteToVoid
|
Next CassetteToVoid
|
||||||
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'SignVoidWMO':SD$:WmInKeys:SD$:WoNo:SD$:@USER4)
|
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'SignVoidWMO':SD$:WmOutKeys:SD$:WoNo:SD$:@USER4)
|
||||||
If Error_Services('HasError') then
|
If Error_Services('HasError') then
|
||||||
ErrorMessage = Error_Services('GetMessage')
|
ErrorMessage = Error_Services('GetMessage')
|
||||||
end
|
end
|
||||||
|
|||||||
@ -20,9 +20,9 @@ COMPILE FUNCTION obj_Post_Log(Method,Parms)
|
|||||||
|
|
||||||
|
|
||||||
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, Get_Property, obj_RDS, Database_Services, Environment_Services
|
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, Get_Property, obj_RDS, Database_Services, Environment_Services
|
||||||
DECLARE FUNCTION Logging_Services, Datetime, SRP_DateTime, GetTickCount
|
DECLARE FUNCTION Logging_Services, Datetime, SRP_DateTime, GetTickCount, SRP_Datetime
|
||||||
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, Send_Dyn, RList, obj_WO_Log, Send_Event, obj_RDS
|
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, Send_Dyn, RList, obj_WO_Log, Send_Event, obj_RDS
|
||||||
DECLARE SUBROUTINE obj_WO_Mat, Send_Info, obj_Notes, ErrMsg, Logging_Services, Mona_Services
|
DECLARE SUBROUTINE obj_WO_Mat, Send_Info, obj_Notes, ErrMsg, Logging_Services, Mona_Services, Database_Services
|
||||||
|
|
||||||
|
|
||||||
$INSERT POST_LOG_EQUATES
|
$INSERT POST_LOG_EQUATES
|
||||||
@ -222,12 +222,44 @@ Post:
|
|||||||
|
|
||||||
IF Get_Status(errCode) THEN
|
IF Get_Status(errCode) THEN
|
||||||
Set_Status(0)
|
Set_Status(0)
|
||||||
obj_Tables('UnlockRec',PlParms)
|
|
||||||
obj_Tables('UnlockRec',UFParms)
|
Tablename = Field(UFParms, @RM, 1, 1)
|
||||||
ClearSelect CursorVar
|
Key = Field(UFParms, @RM, 2, 1)
|
||||||
// 4/22/19 Added unlock statement to prevent POST_LOG service from locking up
|
Database_Services('ReleaseKeyIDLock', Tablename, Key)
|
||||||
Unlock hSysLists, ServiceKeyID else Null
|
|
||||||
RETURN
|
CurrDtm = Datetime()
|
||||||
|
FailureNotificationSent = PostLogRec<POST_LOG_FAILURE_NOTIFICATION_SENT$>
|
||||||
|
FailureNotificationDtm = PostLogRec<POST_LOG_FAILURE_NOTIFICATION_DTM$>
|
||||||
|
If FailureNotificationDtm NE '' then
|
||||||
|
SendReminder = ( SRP_Datetime('HourSpan', FailureNotificationDtm, CurrDtm) GE 1 )
|
||||||
|
end else
|
||||||
|
SendReminder = False$
|
||||||
|
end
|
||||||
|
If ( (FailureNotificationSent NE True$) or (SendReminder EQ True$) ) then
|
||||||
|
PostLogRec<POST_LOG_FAILED$> = True$
|
||||||
|
PostLogRec<POST_LOG_FAILURE_REASON$> = errCode
|
||||||
|
PostLogRec<POST_LOG_FAILURE_NOTIFICATION_SENT$> = True$
|
||||||
|
PostLogRec<POST_LOG_FAILURE_NOTIFICATION_DTM$> = CurrDtm
|
||||||
|
Database_Services('WriteDataRow', 'POST_LOG', PostLogKey, PostLogRec, True$, False$, False$)
|
||||||
|
|
||||||
|
// Notify OI_SYSADMIN group
|
||||||
|
Server = Environment_Services('GetServer')
|
||||||
|
Recipients = ''
|
||||||
|
SentFrom = 'SYSTEM'
|
||||||
|
Subject = 'Obj_Post_Log("Post") Error'
|
||||||
|
Message = OConv(CurrDtm, 'DT2/^H')
|
||||||
|
Message<2> = 'Error on server ':Server
|
||||||
|
Message<3> = 'Failed to write record ':Tablename:' ':Key:' . Error_Services error message: ':errCode
|
||||||
|
Swap @FM with \0D0A\ in Message
|
||||||
|
AttachWindow = ''
|
||||||
|
AttachKey = ''
|
||||||
|
SendToGroup = 'OI_SYSADMIN'
|
||||||
|
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
|
||||||
|
obj_Notes('Create',Parms)
|
||||||
|
end else
|
||||||
|
Database_Services('ReleaseKeyIDLock', 'POST_LOG', PostLogKey)
|
||||||
|
end
|
||||||
|
|
||||||
END ELSE
|
END ELSE
|
||||||
obj_Tables('DeleteRec',PlParms)
|
obj_Tables('DeleteRec',PlParms)
|
||||||
END
|
END
|
||||||
|
|||||||
@ -2108,5 +2108,3 @@ GetQAMet:
|
|||||||
|
|
||||||
RETURN
|
RETURN
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -18,6 +18,7 @@ COMPILE FUNCTION obj_RDS(Method,Parms)
|
|||||||
|
|
||||||
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, NextKey, obj_WO_Verify, obj_Prod_Spec, Send_Dyn, obj_RDS_Makeup
|
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, NextKey, obj_WO_Verify, obj_Prod_Spec, Send_Dyn, obj_RDS_Makeup
|
||||||
DECLARE FUNCTION obj_RDS2, obj_RDS_Test, obj_WO_Mat, obj_Clean_Insp, obj_PRS_Prop, Database_Services, RDS_Services
|
DECLARE FUNCTION obj_RDS2, obj_RDS_Test, obj_WO_Mat, obj_Clean_Insp, obj_PRS_Prop, Database_Services, RDS_Services
|
||||||
|
DECLARE FUNCTION Return_To_Fab_Services
|
||||||
DECLARE FUNCTION Logging_Services, Environment_Services, Error_Services, Signature_Services, Lot_Services, Supplement_Services
|
DECLARE FUNCTION Logging_Services, Environment_Services, Error_Services, Signature_Services, Lot_Services, Supplement_Services
|
||||||
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, obj_WO_Step, obj_RDS_Layer, obj_RDS_Test, obj_WM_In
|
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, obj_WO_Step, obj_RDS_Layer, obj_RDS_Test, obj_WM_In
|
||||||
DECLARE SUBROUTINE Btree.Extract, RDS_React_Run, Environment_Services, Logging_Services, Error_Services, Send_Info
|
DECLARE SUBROUTINE Btree.Extract, RDS_React_Run, Environment_Services, Logging_Services, Error_Services, Send_Info
|
||||||
@ -135,6 +136,13 @@ CurrStatus:
|
|||||||
RDSCnt = COUNT(RDSNos,@VM) + (RDSNos NE '')
|
RDSCnt = COUNT(RDSNos,@VM) + (RDSNos NE '')
|
||||||
FOR R = 1 TO RDSCnt
|
FOR R = 1 TO RDSCnt
|
||||||
|
|
||||||
|
OpenRTF = Return_To_Fab_Services('GetOpenReturnToFabRecordIdByCassId', RDSNos<R>)
|
||||||
|
|
||||||
|
IF OpenRTF NE '' THEN
|
||||||
|
ReturnVals<1,R> = 'RTF' ;* Open RTF on RDS *
|
||||||
|
GOTO StatusHere
|
||||||
|
END
|
||||||
|
|
||||||
NCRStatuses = XLATE('NCR',RDSRec<RDS_NCR_KEYS$>,7,'X')
|
NCRStatuses = XLATE('NCR',RDSRec<RDS_NCR_KEYS$>,7,'X')
|
||||||
|
|
||||||
IF INDEX(NCRStatuses,'O',1) THEN
|
IF INDEX(NCRStatuses,'O',1) THEN
|
||||||
@ -1242,3 +1250,4 @@ CalcThickTarget:
|
|||||||
|
|
||||||
RETURN
|
RETURN
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -18,7 +18,7 @@ COMPILE FUNCTION obj_Reactor_Log(Method,Parms)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, ErrMsg, Btree.Extract, obj_React_Item_Hist, Update_Index, obj_Post_Log
|
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, ErrMsg, Btree.Extract, obj_React_Item_Hist, Update_Index, obj_Post_Log
|
||||||
Declare subroutine Error_Services, Database_Services, React_Item_Services
|
Declare subroutine Error_Services, Database_Services, React_Item_Services, Reactor_Services
|
||||||
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, obj_React_Item, obj_Calendar, Database_Services
|
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, obj_React_Item, obj_Calendar, Database_Services
|
||||||
|
|
||||||
|
|
||||||
@ -117,7 +117,7 @@ PostReactItems:
|
|||||||
InstRINos = ReactorLogRec<REACTOR_LOG_INST_RI_NO$>
|
InstRINos = ReactorLogRec<REACTOR_LOG_INST_RI_NO$>
|
||||||
|
|
||||||
CurrRINos = XLATE('REACTOR_LOG', RLNo, 'CURR_RI_NO', 'X')
|
CurrRINos = XLATE('REACTOR_LOG', RLNo, 'CURR_RI_NO', 'X')
|
||||||
|
ReactorType = Xlate('REACTOR', ReactNo, REACTOR_REACT_TYPE$, 'X')
|
||||||
//Check to make sure that everything is valid before adding or removing anything
|
//Check to make sure that everything is valid before adding or removing anything
|
||||||
ValidationFailureReason = ''
|
ValidationFailureReason = ''
|
||||||
for each InstRINo in InstRINos using @VM
|
for each InstRINo in InstRINos using @VM
|
||||||
@ -125,6 +125,23 @@ PostReactItems:
|
|||||||
If InstRIRec<REACT_ITEM_RETIRE_DT$> NE '' then
|
If InstRIRec<REACT_ITEM_RETIRE_DT$> NE '' then
|
||||||
ValidationFailureReason = 'Unable to install Reactor Item No. ' : InstRINo : ' because its status is retired!'
|
ValidationFailureReason = 'Unable to install Reactor Item No. ' : InstRINo : ' because its status is retired!'
|
||||||
end
|
end
|
||||||
|
If InstRIRec<REACT_ITEM_RI_TYPE$> EQ 'S' then
|
||||||
|
If InstRIRec<REACT_ITEM_PKT_SIZE$> EQ '' then
|
||||||
|
ValidationFailureReason = 'Unable to install Reactor Item No. ' : InstRINo : '. Pocket/Ring Size cannot be empty for Susceptor Reactor Items.'
|
||||||
|
end
|
||||||
|
If InstRIRec<REACT_ITEM_PKT_QTY$> EQ '' then
|
||||||
|
ValidationFailureReason = 'Unable to install Reactor Item No. ' : InstRINo : '. Pocket Qty cannot be empty for Susceptor Reactor Items.'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
If (InstRIRec<REACT_ITEM_RI_TYPE$> NE 'RE') AND (InstRIRec<REACT_ITEM_RI_TYPE$> NE 'LE') then
|
||||||
|
If InstRIRec<REACT_ITEM_SERIAL_NO$> EQ '' then
|
||||||
|
ValidationFailureReason = 'Unable to install Reactor Item No. ' : InstRINo : '. Serial Number cannot be blank to non-elevator Reactor Items.'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
// Only check first three characters so that ASM parts can be installed in an ASM+ reactor
|
||||||
|
If (InstRIRec<REACT_ITEM_PART_TYPE$>[1, 3] NE ReactorType[1, 3]) then
|
||||||
|
ValidationFailureReason = 'Unable to install Reactor Item No. ' : InstRINo : '. Reactor Type must match Reactor Item Part Type.'
|
||||||
|
end
|
||||||
Until ValidationFailureReason NE ''
|
Until ValidationFailureReason NE ''
|
||||||
Next InstRINo
|
Next InstRINo
|
||||||
|
|
||||||
@ -147,8 +164,16 @@ PostReactItems:
|
|||||||
|
|
||||||
obj_React_Item_Hist('Install',oriParms)
|
obj_React_Item_Hist('Install',oriParms)
|
||||||
|
|
||||||
IF Get_Status(errCode) THEN
|
IF Not(Get_Status(errCode)) THEN
|
||||||
|
RIKey = InstRINos<1,I>
|
||||||
|
RIRec = Xlate('REACT_ITEM', RIKey, '', 'X')
|
||||||
|
RIType = RIRec<REACT_ITEM_RI_TYPE$>
|
||||||
|
If RIType EQ 'S' then
|
||||||
|
PktSize = Xlate('REACT_ITEM', RIKey, 'PKT_SIZE_DESC', 'X')
|
||||||
|
PktQty = RIRec<REACT_ITEM_PKT_QTY$>
|
||||||
|
Reactor_Services('SetWaferSize', ReactNo, PktSize)
|
||||||
|
Reactor_Services('SetPocketQty', ReactNo, PktQty)
|
||||||
|
end
|
||||||
END
|
END
|
||||||
END ;* End of LOCATE check for Install RI number already in the reactor
|
END ;* End of LOCATE check for Install RI number already in the reactor
|
||||||
|
|
||||||
|
|||||||
@ -20,13 +20,13 @@ DECLARE FUNCTION Printer_Select, Set_Printer, obj_Install, Direct_Print, Environ
|
|||||||
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, Direct_Print
|
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, Direct_Print
|
||||||
DECLARE SUBROUTINE ErrMsg, Btree.Extract
|
DECLARE SUBROUTINE ErrMsg, Btree.Extract
|
||||||
|
|
||||||
|
$INSERT LOGICAL
|
||||||
$INSERT MSG_EQUATES
|
$INSERT MSG_EQUATES
|
||||||
$INSERT REACT_ITEM_EQUATES
|
$INSERT REACT_ITEM_EQUATES
|
||||||
$INSERT REACT_ITEM_HIST_EQUATES
|
$INSERT REACT_ITEM_HIST_EQUATES
|
||||||
$INSERT REACTOR_EQUATES
|
$INSERT REACTOR_EQUATES
|
||||||
$INSERT REACT_READS_EQUATES
|
$INSERT REACT_READS_EQUATES
|
||||||
|
|
||||||
|
|
||||||
EQU PI$LEFT TO 1
|
EQU PI$LEFT TO 1
|
||||||
EQU PI$TOP TO 2
|
EQU PI$TOP TO 2
|
||||||
EQU PI$RIGHT TO 3
|
EQU PI$RIGHT TO 3
|
||||||
@ -35,12 +35,9 @@ EQU PI$WIDTH TO 5
|
|||||||
EQU PI$HEIGHT TO 6
|
EQU PI$HEIGHT TO 6
|
||||||
EQU PI$SIZE TO 7
|
EQU PI$SIZE TO 7
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
EQU CRLF$ TO \0D0A\
|
EQU CRLF$ TO \0D0A\
|
||||||
EQU TAB$ TO CHAR(9)
|
EQU TAB$ TO CHAR(9)
|
||||||
|
|
||||||
|
|
||||||
ErrTitle = 'Error in Stored Procedure "obj_ReactItem"'
|
ErrTitle = 'Error in Stored Procedure "obj_ReactItem"'
|
||||||
ErrorMsg = ''
|
ErrorMsg = ''
|
||||||
|
|
||||||
@ -81,35 +78,35 @@ RETURN Result
|
|||||||
CurrStatus:
|
CurrStatus:
|
||||||
* * * * * * *
|
* * * * * * *
|
||||||
|
|
||||||
IF NOT(ASSIGNED(RINo)) THEN RINo = Parms[1,@RM]
|
IF NOT(ASSIGNED(RINo)) THEN RINo = Parms[1,@RM]
|
||||||
IF NOT(ASSIGNED(ReactItemRec)) THEN ReactItemRec = Parms[COL2()+1,@RM]
|
IF NOT(ASSIGNED(ReactItemRec)) THEN ReactItemRec = Parms[COL2()+1,@RM]
|
||||||
|
|
||||||
IF RINo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
|
IF RINo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
|
||||||
|
|
||||||
IF ReactItemRec = '' THEN ReactItemRec = XLATE('REACT_ITEM',RINo,'','X')
|
IF ReactItemRec = '' THEN ReactItemRec = XLATE('REACT_ITEM',RINo,'','X')
|
||||||
|
|
||||||
Parms = '':@RM:RINo:@RM:''
|
Parms = '':@RM:RINo:@RM:''
|
||||||
HistKeys = obj_React_Item_Hist('GetHistory',Parms) ;* 3 parameters RINo is the middle one
|
HistKeys = obj_React_Item_Hist('GetHistory',Parms) ;* 3 parameters RINo is the middle one
|
||||||
HistKey = HistKeys<1,1> ;* This is the most recent
|
HistKey = HistKeys<1,1> ;* This is the most recent
|
||||||
|
|
||||||
LastInstallRec = XLATE('REACT_ITEM_HIST',HistKeys<1,1>,'','X')
|
LastInstallRec = XLATE('REACT_ITEM_HIST',HistKeys<1,1>,'','X')
|
||||||
|
|
||||||
InstDTM = FIELD(HistKey,'*',3)
|
InstDTM = FIELD(HistKey,'*',3)
|
||||||
RemDTM = LastInstallRec<REACT_ITEM_HIST_REM_DTM$>
|
RemDTM = LastInstallRec<REACT_ITEM_HIST_REM_DTM$>
|
||||||
|
|
||||||
RetireDt = ReactItemRec<REACT_ITEM_RETIRE_DT$>
|
RetireDt = ReactItemRec<REACT_ITEM_RETIRE_DT$>
|
||||||
Notes = ReactItemRec<REACT_ITEM_NOTES$>
|
Notes = ReactItemRec<REACT_ITEM_NOTES$>
|
||||||
|
|
||||||
CONVERT @LOWER_CASE TO @UPPER_CASE IN NOtes
|
CONVERT @LOWER_CASE TO @UPPER_CASE IN NOtes
|
||||||
|
|
||||||
|
|
||||||
BEGIN CASE
|
BEGIN CASE
|
||||||
CASE RetireDt NE '' ; Result = 'R'
|
CASE RetireDt NE '' ; Result = 'R'
|
||||||
CASE InstDTM NE '' AND RemDTM = '' ; Result = 'I'
|
CASE InstDTM NE '' AND RemDTM = '' ; Result = 'I'
|
||||||
CASE InstDTM NE '' AND RemDTM NE '' OR INDEX(Notes,'USED',1) ; Result = 'U'
|
CASE InstDTM NE '' AND RemDTM NE '' OR INDEX(Notes,'USED',1) ; Result = 'U'
|
||||||
CASE InstDTM = '' AND RemDTM = '' ; Result = 'N'
|
CASE InstDTM = '' AND RemDTM = '' ; Result = 'N'
|
||||||
CASE 1 ; Result = '?'
|
CASE Otherwise$ ; Result = '?'
|
||||||
END CASE
|
END CASE
|
||||||
|
|
||||||
RETURN
|
RETURN
|
||||||
|
|
||||||
@ -118,28 +115,28 @@ RETURN
|
|||||||
ServiceHrs:
|
ServiceHrs:
|
||||||
* * * * * * *
|
* * * * * * *
|
||||||
|
|
||||||
IF NOT(ASSIGNED(RINo)) THEN RINo = Parms[1,@RM]
|
IF NOT(ASSIGNED(RINo)) THEN RINo = Parms[1,@RM]
|
||||||
IF NOT(ASSIGNED(ReactItemRec)) THEN ReactItemRec = Parms[COL2()+1,@RM]
|
IF NOT(ASSIGNED(ReactItemRec)) THEN ReactItemRec = Parms[COL2()+1,@RM]
|
||||||
|
|
||||||
IF RINo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
|
IF RINo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
|
||||||
|
|
||||||
IF ReactItemRec = '' THEN ReactItemRec = XLATE('REACT_ITEM',RINo,'','X')
|
IF ReactItemRec = '' THEN ReactItemRec = XLATE('REACT_ITEM',RINo,'','X')
|
||||||
|
|
||||||
LastRemDtm = ReactItemRec<REACT_ITEM_REM_DTM$,1>
|
LastRemDtm = ReactItemRec<REACT_ITEM_REM_DTM$,1>
|
||||||
|
|
||||||
IF LastRemDTM = '' THEN
|
IF LastRemDTM = '' THEN
|
||||||
ReactNo = ReactItemRec<REACT_ITEM_REACT_NO$,1>
|
ReactNo = ReactItemRec<REACT_ITEM_REACT_NO$,1>
|
||||||
LastReadDTM = XLATE('REACTOR',ReactNo,REACTOR_LAST_READ_HRS_DTM$,'X')
|
LastReadDTM = XLATE('REACTOR',ReactNo,REACTOR_LAST_READ_HRS_DTM$,'X')
|
||||||
LastReadHrs = XLATE('REACT_READS',ReactNo:'*':LastReadDTM,REACT_READS_HOURS$,'X')
|
LastReadHrs = XLATE('REACT_READS',ReactNo:'*':LastReadDTM,REACT_READS_HOURS$,'X')
|
||||||
END ELSE
|
END ELSE
|
||||||
LastReadHrs = ''
|
LastReadHrs = ''
|
||||||
END
|
END
|
||||||
|
|
||||||
Ans = ''
|
Ans = ''
|
||||||
|
|
||||||
IRCnt = COUNT(ReactItemRec<REACT_ITEM_INST_REACT_HRS$>,@VM) + (ReactItemRec<REACT_ITEM_INST_REACT_HRS$> NE '')
|
IRCnt = COUNT(ReactItemRec<REACT_ITEM_INST_REACT_HRS$>,@VM) + (ReactItemRec<REACT_ITEM_INST_REACT_HRS$> NE '')
|
||||||
|
|
||||||
FOR I = 1 TO IRCnt
|
FOR I = 1 TO IRCnt
|
||||||
|
|
||||||
RemReactHrs = ReactItemRec<REACT_ITEM_REM_REACT_HRS$,I>
|
RemReactHrs = ReactItemRec<REACT_ITEM_REM_REACT_HRS$,I>
|
||||||
InstReactHrs = ReactItemRec<REACT_ITEM_INST_REACT_HRS$,I>
|
InstReactHrs = ReactItemRec<REACT_ITEM_INST_REACT_HRS$,I>
|
||||||
@ -158,9 +155,9 @@ FOR I = 1 TO IRCnt
|
|||||||
END ELSE
|
END ELSE
|
||||||
Ans<1,I> = ''
|
Ans<1,I> = ''
|
||||||
END
|
END
|
||||||
NEXT I
|
NEXT I
|
||||||
|
|
||||||
Result = Ans
|
Result = Ans
|
||||||
|
|
||||||
RETURN
|
RETURN
|
||||||
|
|
||||||
@ -169,31 +166,31 @@ RETURN
|
|||||||
ServiceWfrs:
|
ServiceWfrs:
|
||||||
* * * * * * *
|
* * * * * * *
|
||||||
|
|
||||||
IF NOT(ASSIGNED(RINo)) THEN RINo = Parms[1,@RM]
|
IF NOT(ASSIGNED(RINo)) THEN RINo = Parms[1,@RM]
|
||||||
IF NOT(ASSIGNED(ReactItemRec)) THEN ReactItemRec = Parms[COL2()+1,@RM]
|
IF NOT(ASSIGNED(ReactItemRec)) THEN ReactItemRec = Parms[COL2()+1,@RM]
|
||||||
|
|
||||||
IF RINo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
|
IF RINo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
|
||||||
|
|
||||||
IF ReactItemRec = '' THEN ReactItemRec = XLATE('REACT_ITEM',RINo,'','X')
|
IF ReactItemRec = '' THEN ReactItemRec = XLATE('REACT_ITEM',RINo,'','X')
|
||||||
|
|
||||||
LastRemDtm = ReactItemRec<REACT_ITEM_REM_DTM$,1>
|
LastRemDtm = ReactItemRec<REACT_ITEM_REM_DTM$,1>
|
||||||
|
|
||||||
IF LastRemDTM = '' THEN
|
IF LastRemDTM = '' THEN
|
||||||
ReactNo = ReactItemRec<REACT_ITEM_REACT_NO$,1>
|
ReactNo = ReactItemRec<REACT_ITEM_REACT_NO$,1>
|
||||||
LastReadDTM = XLATE('REACTOR',ReactNo,REACTOR_LAST_READ_WFRS_DTM$,'X')
|
LastReadDTM = XLATE('REACTOR',ReactNo,REACTOR_LAST_READ_WFRS_DTM$,'X')
|
||||||
LastReadWfrs = XLATE('REACT_READS',ReactNo:'*':LastReadDTM,REACT_READS_WAFER_CNT$,'X')
|
LastReadWfrs = XLATE('REACT_READS',ReactNo:'*':LastReadDTM,REACT_READS_WAFER_CNT$,'X')
|
||||||
END ELSE
|
END ELSE
|
||||||
LastReadWfrs = ''
|
LastReadWfrs = ''
|
||||||
END
|
END
|
||||||
|
|
||||||
Ans = ''
|
Ans = ''
|
||||||
|
|
||||||
IRCnt = COUNT(ReactItemRec<REACT_ITEM_INST_REACT_WFRS$>,@VM) + (ReactItemRec<REACT_ITEM_INST_REACT_WFRS$> NE '')
|
IRCnt = COUNT(ReactItemRec<REACT_ITEM_INST_REACT_WFRS$>,@VM) + (ReactItemRec<REACT_ITEM_INST_REACT_WFRS$> NE '')
|
||||||
|
|
||||||
|
|
||||||
IF IRCnt = 0 THEN
|
IF IRCnt = 0 THEN
|
||||||
Ans = LastReadWfrs
|
Ans = LastReadWfrs
|
||||||
END ELSE
|
END ELSE
|
||||||
|
|
||||||
FOR I = 1 TO IRCnt
|
FOR I = 1 TO IRCnt
|
||||||
|
|
||||||
@ -211,9 +208,9 @@ END ELSE
|
|||||||
END
|
END
|
||||||
|
|
||||||
NEXT I
|
NEXT I
|
||||||
END
|
END
|
||||||
|
|
||||||
Result = Ans
|
Result = Ans
|
||||||
|
|
||||||
RETURN Result
|
RETURN Result
|
||||||
|
|
||||||
@ -222,20 +219,20 @@ RETURN Result
|
|||||||
Serial_RINo:
|
Serial_RINo:
|
||||||
* * * * * * *
|
* * * * * * *
|
||||||
|
|
||||||
* Temporary for conversion
|
* Temporary for conversion
|
||||||
|
|
||||||
SerialNos = Parms[1,@RM]
|
SerialNos = Parms[1,@RM]
|
||||||
|
|
||||||
IF SerialNos = '' THEN RETURN
|
IF SerialNos = '' THEN RETURN
|
||||||
|
|
||||||
OPEN 'DICT.REACT_ITEM' TO DictReactItem ELSE
|
OPEN 'DICT.REACT_ITEM' TO DictReactItem ELSE
|
||||||
|
|
||||||
RETURN
|
RETURN
|
||||||
END
|
END
|
||||||
|
|
||||||
snCnt = COUNT(SerialNos,@VM) + (SerialNos NE '')
|
snCnt = COUNT(SerialNos,@VM) + (SerialNos NE '')
|
||||||
|
|
||||||
FOR I = 1 TO snCnt
|
FOR I = 1 TO snCnt
|
||||||
SerialNo = SerialNos<1,I>
|
SerialNo = SerialNos<1,I>
|
||||||
IF SerialNo NE '' THEN
|
IF SerialNo NE '' THEN
|
||||||
|
|
||||||
@ -254,7 +251,7 @@ FOR I = 1 TO snCnt
|
|||||||
|
|
||||||
Result<1,I> = RINo
|
Result<1,I> = RINo
|
||||||
END ;* End of check for null SerialNo
|
END ;* End of check for null SerialNo
|
||||||
NEXT I
|
NEXT I
|
||||||
|
|
||||||
RETURN
|
RETURN
|
||||||
|
|
||||||
@ -263,30 +260,30 @@ RETURN
|
|||||||
ServicePCRC:
|
ServicePCRC:
|
||||||
* * * * * * *
|
* * * * * * *
|
||||||
|
|
||||||
IF NOT(ASSIGNED(RINo)) THEN RINo = Parms[1,@RM]
|
IF NOT(ASSIGNED(RINo)) THEN RINo = Parms[1,@RM]
|
||||||
IF NOT(ASSIGNED(ReactItemRec)) THEN ReactItemRec = Parms[COL2()+1,@RM]
|
IF NOT(ASSIGNED(ReactItemRec)) THEN ReactItemRec = Parms[COL2()+1,@RM]
|
||||||
|
|
||||||
IF RINo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
|
IF RINo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
|
||||||
|
|
||||||
IF ReactItemRec = '' THEN ReactItemRec = XLATE('REACT_ITEM',RINo,'','X')
|
IF ReactItemRec = '' THEN ReactItemRec = XLATE('REACT_ITEM',RINo,'','X')
|
||||||
|
|
||||||
LastRemDtm = ReactItemRec<REACT_ITEM_REM_DTM$,1>
|
LastRemDtm = ReactItemRec<REACT_ITEM_REM_DTM$,1>
|
||||||
|
|
||||||
IF LastRemDTM = '' THEN
|
IF LastRemDTM = '' THEN
|
||||||
ReactNo = ReactItemRec<REACT_ITEM_REACT_NO$,1>
|
ReactNo = ReactItemRec<REACT_ITEM_REACT_NO$,1>
|
||||||
LastReadDTM = XLATE('REACTOR',ReactNo,REACTOR_LAST_READ_WFRS_DTM$,'X')
|
LastReadDTM = XLATE('REACTOR',ReactNo,REACTOR_LAST_READ_WFRS_DTM$,'X')
|
||||||
LastReadWfrs = XLATE('REACT_READS',ReactNo:'*':LastReadDTM,REACT_READS_WAFER_CNT$,'X')
|
LastReadWfrs = XLATE('REACT_READS',ReactNo:'*':LastReadDTM,REACT_READS_WAFER_CNT$,'X')
|
||||||
END ELSE
|
END ELSE
|
||||||
LastReadWfrs = ''
|
LastReadWfrs = ''
|
||||||
END
|
END
|
||||||
|
|
||||||
Ans = ''
|
Ans = ''
|
||||||
|
|
||||||
IRCnt = COUNT(ReactItemRec<REACT_ITEM_INST_REACT_WFRS$>,@VM) + (ReactItemRec<REACT_ITEM_INST_REACT_WFRS$> NE '')
|
IRCnt = COUNT(ReactItemRec<REACT_ITEM_INST_REACT_WFRS$>,@VM) + (ReactItemRec<REACT_ITEM_INST_REACT_WFRS$> NE '')
|
||||||
|
|
||||||
IF IRCnt = 0 THEN
|
IF IRCnt = 0 THEN
|
||||||
Ans = LastReadWfrs
|
Ans = LastReadWfrs
|
||||||
END ELSE
|
END ELSE
|
||||||
FOR I = 1 TO IRCnt
|
FOR I = 1 TO IRCnt
|
||||||
|
|
||||||
RemReactWfrs = ReactItemRec<REACT_ITEM_REM_REACT_WFRS$,I>
|
RemReactWfrs = ReactItemRec<REACT_ITEM_REM_REACT_WFRS$,I>
|
||||||
@ -303,9 +300,9 @@ END ELSE
|
|||||||
END
|
END
|
||||||
|
|
||||||
NEXT I
|
NEXT I
|
||||||
END
|
END
|
||||||
|
|
||||||
Result = Ans
|
Result = Ans
|
||||||
|
|
||||||
RETURN
|
RETURN
|
||||||
|
|
||||||
@ -314,21 +311,21 @@ RETURN
|
|||||||
ReactWfrCnt:
|
ReactWfrCnt:
|
||||||
* * * * * * *
|
* * * * * * *
|
||||||
|
|
||||||
IF NOT(ASSIGNED(RINo)) THEN RINo = Parms[1,@RM]
|
IF NOT(ASSIGNED(RINo)) THEN RINo = Parms[1,@RM]
|
||||||
IF NOT(ASSIGNED(ReactItemRec)) THEN ReactItemRec = Parms[COL2()+1,@RM]
|
IF NOT(ASSIGNED(ReactItemRec)) THEN ReactItemRec = Parms[COL2()+1,@RM]
|
||||||
|
|
||||||
IF RINo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
|
IF RINo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
|
||||||
|
|
||||||
IF ReactItemRec = '' THEN ReactItemRec = XLATE('REACT_ITEM',RINo,'','X')
|
IF ReactItemRec = '' THEN ReactItemRec = XLATE('REACT_ITEM',RINo,'','X')
|
||||||
|
|
||||||
|
|
||||||
ReactNos = ReactItemRec<REACT_ITEM_REACT_NO$>
|
ReactNos = ReactItemRec<REACT_ITEM_REACT_NO$>
|
||||||
|
|
||||||
ReactCnt = COUNT(ReactNos,@VM) + (ReactNos NE '')
|
ReactCnt = COUNT(ReactNos,@VM) + (ReactNos NE '')
|
||||||
|
|
||||||
Ans = ''
|
Ans = ''
|
||||||
|
|
||||||
FOR I = 1 TO ReactCnt
|
FOR I = 1 TO ReactCnt
|
||||||
ReactNo = ReactNos<1,I>
|
ReactNo = ReactNos<1,I>
|
||||||
InstWfrCnt = ReactItemRec<REACT_ITEM_INST_REACT_WFRS$,I>
|
InstWfrCnt = ReactItemRec<REACT_ITEM_INST_REACT_WFRS$,I>
|
||||||
RemWfrCnt = ReactItemRec<REACT_ITEM_REM_REACT_WFRS$,I>
|
RemWfrCnt = ReactItemRec<REACT_ITEM_REM_REACT_WFRS$,I>
|
||||||
@ -350,9 +347,9 @@ FOR I = 1 TO ReactCnt
|
|||||||
|
|
||||||
Ans<1,I> = Delta
|
Ans<1,I> = Delta
|
||||||
|
|
||||||
NEXT I
|
NEXT I
|
||||||
|
|
||||||
Result = Ans
|
Result = Ans
|
||||||
|
|
||||||
RETURN
|
RETURN
|
||||||
|
|
||||||
@ -361,20 +358,20 @@ RETURN
|
|||||||
ReactHrs:
|
ReactHrs:
|
||||||
* * * * * * *
|
* * * * * * *
|
||||||
|
|
||||||
IF NOT(ASSIGNED(RINo)) THEN RINo = Parms[1,@RM]
|
IF NOT(ASSIGNED(RINo)) THEN RINo = Parms[1,@RM]
|
||||||
IF NOT(ASSIGNED(ReactItemRec)) THEN ReactItemRec = Parms[COL2()+1,@RM]
|
IF NOT(ASSIGNED(ReactItemRec)) THEN ReactItemRec = Parms[COL2()+1,@RM]
|
||||||
|
|
||||||
IF RINo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
|
IF RINo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
|
||||||
|
|
||||||
IF ReactItemRec = '' THEN ReactItemRec = XLATE('REACT_ITEM',RINo,'','X')
|
IF ReactItemRec = '' THEN ReactItemRec = XLATE('REACT_ITEM',RINo,'','X')
|
||||||
|
|
||||||
ReactNos = ReactItemRec<REACT_ITEM_REACT_NO$>
|
ReactNos = ReactItemRec<REACT_ITEM_REACT_NO$>
|
||||||
|
|
||||||
ReactCnt = COUNT(ReactNos,@VM) + (ReactNos NE '')
|
ReactCnt = COUNT(ReactNos,@VM) + (ReactNos NE '')
|
||||||
|
|
||||||
Ans = ''
|
Ans = ''
|
||||||
|
|
||||||
FOR I = 1 TO ReactCnt
|
FOR I = 1 TO ReactCnt
|
||||||
ReactNo = ReactNos<1,I>
|
ReactNo = ReactNos<1,I>
|
||||||
InstHrs = ReactItemRec<REACT_ITEM_INST_REACT_HRS$,I>
|
InstHrs = ReactItemRec<REACT_ITEM_INST_REACT_HRS$,I>
|
||||||
RemHrs = ReactItemRec<REACT_ITEM_REM_REACT_HRS$,I>
|
RemHrs = ReactItemRec<REACT_ITEM_REM_REACT_HRS$,I>
|
||||||
@ -395,32 +392,31 @@ FOR I = 1 TO ReactCnt
|
|||||||
|
|
||||||
Ans<1,I> = Delta
|
Ans<1,I> = Delta
|
||||||
|
|
||||||
NEXT I
|
NEXT I
|
||||||
|
|
||||||
Result = Ans
|
Result = Ans
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
* * * * * * *
|
* * * * * * *
|
||||||
Serial_GRNo:
|
Serial_GRNo:
|
||||||
* * * * * * *
|
* * * * * * *
|
||||||
|
|
||||||
* Temporary for conversion
|
* Temporary for conversion
|
||||||
|
|
||||||
SerialNos = Parms[1,@RM]
|
SerialNos = Parms[1,@RM]
|
||||||
|
|
||||||
IF SerialNos = '' THEN RETURN
|
IF SerialNos = '' THEN RETURN
|
||||||
|
|
||||||
OPEN 'DICT.REACT_ITEM' TO DictReactItem ELSE
|
OPEN 'DICT.REACT_ITEM' TO DictReactItem ELSE
|
||||||
|
|
||||||
RETURN
|
RETURN
|
||||||
END
|
END
|
||||||
|
|
||||||
snCnt = COUNT(SerialNos,@VM) + (SerialNos NE '')
|
snCnt = COUNT(SerialNos,@VM) + (SerialNos NE '')
|
||||||
|
|
||||||
FOR I = 1 TO snCnt
|
FOR I = 1 TO snCnt
|
||||||
SerialNo = SerialNos<1,I>
|
SerialNo = SerialNos<1,I>
|
||||||
IF SerialNo NE '' THEN
|
IF SerialNo NE '' THEN
|
||||||
SearchString = 'SERIAL':@VM:SerialNo:@FM
|
SearchString = 'SERIAL':@VM:SerialNo:@FM
|
||||||
@ -434,9 +430,7 @@ FOR I = 1 TO snCnt
|
|||||||
|
|
||||||
Result<1,I> = RINo
|
Result<1,I> = RINo
|
||||||
END ;* End of check for null SerialNo
|
END ;* End of check for null SerialNo
|
||||||
NEXT I
|
NEXT I
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
RETURN
|
RETURN
|
||||||
|
|
||||||
@ -445,32 +439,32 @@ RETURN
|
|||||||
SplitSerial:
|
SplitSerial:
|
||||||
* * * * * * *
|
* * * * * * *
|
||||||
|
|
||||||
PartNo = Parms[1,@RM]
|
PartNo = Parms[1,@RM]
|
||||||
|
|
||||||
|
|
||||||
IF PartNo = '' THEN ErrorMsg = 'Null Parameter "PartNo" passed to routine. (':Method:')'
|
IF PartNo = '' THEN ErrorMsg = 'Null Parameter "PartNo" passed to routine. (':Method:')'
|
||||||
|
|
||||||
IF ErrorMsg NE '' THEN RETURN
|
IF ErrorMsg NE '' THEN RETURN
|
||||||
|
|
||||||
OPEN 'DICT.REACT_ITEM' TO DictReactItem ELSE
|
OPEN 'DICT.REACT_ITEM' TO DictReactItem ELSE
|
||||||
DEBUG
|
DEBUG
|
||||||
RETURN
|
RETURN
|
||||||
END
|
END
|
||||||
|
|
||||||
SelectSent = 'SERIAL':@VM:'[':PartNo:']':@FM
|
SelectSent = 'SERIAL':@VM:'[':PartNo:']':@FM
|
||||||
Option = ''
|
Option = ''
|
||||||
Flag = ''
|
Flag = ''
|
||||||
|
|
||||||
Btree.Extract(SelectSent,'REACT_ITEM',DictReactItem,RINos,Option,Flag)
|
Btree.Extract(SelectSent,'REACT_ITEM',DictReactItem,RINos,Option,Flag)
|
||||||
|
|
||||||
IF Get_Status(errCode) THEN
|
IF Get_Status(errCode) THEN
|
||||||
ErrMsg(errCode)
|
ErrMsg(errCode)
|
||||||
RETURN
|
RETURN
|
||||||
END
|
END
|
||||||
|
|
||||||
grCnt = COUNT(RINos,@VM) + (RINos NE '')
|
grCnt = COUNT(RINos,@VM) + (RINos NE '')
|
||||||
|
|
||||||
FOR I = 1 TO grCnt
|
FOR I = 1 TO grCnt
|
||||||
RINo = RINos<1,I>
|
RINo = RINos<1,I>
|
||||||
|
|
||||||
otParms = 'REACT_ITEM':@RM:RINo
|
otParms = 'REACT_ITEM':@RM:RINo
|
||||||
@ -492,9 +486,9 @@ FOR I = 1 TO grCnt
|
|||||||
|
|
||||||
obj_Tables('WriteRec',otParms)
|
obj_Tables('WriteRec',otParms)
|
||||||
|
|
||||||
NEXT I
|
NEXT I
|
||||||
|
|
||||||
Result = RINos
|
Result = RINos
|
||||||
|
|
||||||
RETURN
|
RETURN
|
||||||
|
|
||||||
@ -503,16 +497,16 @@ RETURN
|
|||||||
CalcDesc:
|
CalcDesc:
|
||||||
* * * * * * *
|
* * * * * * *
|
||||||
|
|
||||||
IF NOT(ASSIGNED(RINo)) THEN RINo = Parms[1,@RM]
|
IF NOT(ASSIGNED(RINo)) THEN RINo = Parms[1,@RM]
|
||||||
IF NOT(ASSIGNED(ReactItemRec)) THEN ReactItemRec = Parms[COL2()+1,@RM]
|
IF NOT(ASSIGNED(ReactItemRec)) THEN ReactItemRec = Parms[COL2()+1,@RM]
|
||||||
|
|
||||||
IF RINo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
|
IF RINo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
|
||||||
|
|
||||||
IF ReactItemRec = '' THEN ReactItemRec = XLATE('REACT_ITEM',RINo,'','X')
|
IF ReactItemRec = '' THEN ReactItemRec = XLATE('REACT_ITEM',RINo,'','X')
|
||||||
|
|
||||||
RIType = ReactItemRec<REACT_ITEM_RI_TYPE$>
|
RIType = ReactItemRec<REACT_ITEM_RI_TYPE$>
|
||||||
|
|
||||||
BEGIN CASE
|
BEGIN CASE
|
||||||
CASE RITYpe = 'W'
|
CASE RITYpe = 'W'
|
||||||
CalcDesc = ReactItemRec<REACT_ITEM_DESC$>
|
CalcDesc = ReactItemRec<REACT_ITEM_DESC$>
|
||||||
|
|
||||||
@ -542,8 +536,7 @@ BEGIN CASE
|
|||||||
END
|
END
|
||||||
|
|
||||||
|
|
||||||
CASE 1
|
CASE Otherwise$
|
||||||
|
|
||||||
|
|
||||||
* Graphite types
|
* Graphite types
|
||||||
|
|
||||||
@ -577,212 +570,191 @@ BEGIN CASE
|
|||||||
BEGIN CASE
|
BEGIN CASE
|
||||||
CASE RingDesc NE '' AND SuscSize EQ '' AND PktSize NE '' ; CalcDesc := RingDesc
|
CASE RingDesc NE '' AND SuscSize EQ '' AND PktSize NE '' ; CalcDesc := RingDesc
|
||||||
CASE RingDesc NE '' AND SuscSize NE '' ; CalcDesc := RingDesc:' for ':SuscSize:'in Susceptor with ':PktQty:' ':PktLabel
|
CASE RingDesc NE '' AND SuscSize NE '' ; CalcDesc := RingDesc:' for ':SuscSize:'in Susceptor with ':PktQty:' ':PktLabel
|
||||||
*CASE RingDesc EQ '' AND SuscSize NE '' ; CalcDesc := RITypeDesc:', ':SuscSize:'in with ':PktSize:'in':PktQty:' ':PktLabel ;* Replaced PktQty with PktSize -dkk 9/11/14
|
|
||||||
CASE RingDesc EQ '' AND SuscSize NE '' ; CalcDesc := RITypeDesc:' ':SuscSize:'in, with ':PktQty: ' ':PktLabel:' @ ':PktSize:'in' ;* Replaced PktQty with PktSize -dkk 9/11/14
|
CASE RingDesc EQ '' AND SuscSize NE '' ; CalcDesc := RITypeDesc:' ':SuscSize:'in, with ':PktQty: ' ':PktLabel:' @ ':PktSize:'in' ;* Replaced PktQty with PktSize -dkk 9/11/14
|
||||||
CASE 1
|
CASE RITypeDesc NE '' AND PktQty NE '' AND PktSize NE '' ; CalcDesc := RITypeDesc:' with ':PktQty: ' ':PktLabel:' @ ':PktSize:'in'
|
||||||
|
CASE Otherwise$
|
||||||
|
|
||||||
END CASE
|
END CASE
|
||||||
|
|
||||||
|
END CASE
|
||||||
|
|
||||||
|
Result = CalcDesc
|
||||||
|
|
||||||
END CASE
|
|
||||||
|
|
||||||
Result = CalcDesc
|
|
||||||
|
|
||||||
RETURN
|
RETURN
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
* * * * * * *
|
* * * * * * *
|
||||||
PrintLabel:
|
PrintLabel:
|
||||||
* * * * * * *
|
* * * * * * *
|
||||||
|
|
||||||
RINo = Parms[1,@RM]
|
RINo = Parms[1,@RM]
|
||||||
RIRec = Parms[COL2()+1,@RM]
|
RIRec = Parms[COL2()+1,@RM]
|
||||||
|
|
||||||
IF RINo = '' THEN
|
IF RINo = '' THEN
|
||||||
RETURN
|
RETURN
|
||||||
END
|
END
|
||||||
|
|
||||||
|
|
||||||
IF RIRec = '' THEN
|
IF RIRec = '' THEN
|
||||||
RIRec = XLATE('REACT_ITEM',RINo,'','X')
|
RIRec = XLATE('REACT_ITEM',RINo,'','X')
|
||||||
IF RIRec = '' THEN
|
IF RIRec = '' THEN
|
||||||
RETURN
|
RETURN
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
|
|
||||||
EnterDTM = OCONV(RIRec<REACT_ITEM_ENTER_DTM$>,'DT4/^HS')
|
EnterDTM = OCONV(RIRec<REACT_ITEM_ENTER_DTM$>,'DT4/^HS')
|
||||||
Desc = RIRec<REACT_ITEM_DESC$>
|
Desc = RIRec<REACT_ITEM_DESC$>
|
||||||
MfrCd = RIRec<REACT_ITEM_MFR_CD$>
|
MfrCd = RIRec<REACT_ITEM_MFR_CD$>
|
||||||
MfrName = XLATE('REACT_ITEM',RINo,'MFR_NAME','X')
|
MfrName = XLATE('REACT_ITEM',RINo,'MFR_NAME','X')
|
||||||
MfrPartNo = RIRec<REACT_ITEM_MFR_PART_NO$>
|
MfrPartNo = RIRec<REACT_ITEM_MFR_PART_NO$>
|
||||||
MfrPartNoRev = RIRec<REACT_ITEM_MFR_PART_NO_REV$>
|
MfrPartNoRev = RIRec<REACT_ITEM_MFR_PART_NO_REV$>
|
||||||
SerialNo = RIRec<REACT_ITEM_SERIAL_NO$>
|
SerialNo = RIRec<REACT_ITEM_SERIAL_NO$>
|
||||||
CurrStatus = OCONV(XLATE('REACT_ITEM',RINo,'CURR_STATUS','X'),'[CONV_ITEM_CURR_STATUS]')
|
CurrStatus = OCONV(XLATE('REACT_ITEM',RINo,'CURR_STATUS','X'),'[CONV_ITEM_CURR_STATUS]')
|
||||||
RITypeDesc = XLATE('REACT_ITEM',RINo,'RI_TYPE_DESC','X')
|
RITypeDesc = XLATE('REACT_ITEM',RINo,'RI_TYPE_DESC','X')
|
||||||
SuscSize = RIRec<REACT_ITEM_SUSC_SIZE$>
|
SuscSize = RIRec<REACT_ITEM_SUSC_SIZE$>
|
||||||
SuscSizeDesc = XLATE('REACT_ITEM',RINo,'SUSC_SIZE_DESC','X')
|
SuscSizeDesc = XLATE('REACT_ITEM',RINo,'SUSC_SIZE_DESC','X')
|
||||||
PktSize = RIRec<REACT_ITEM_PKT_SIZE$>
|
PktSize = RIRec<REACT_ITEM_PKT_SIZE$>
|
||||||
PktSizeDesc = XLATE('REACT_ITEM',RINo,'PKT_SIZE_DESC','X')
|
PktSizeDesc = XLATE('REACT_ITEM',RINo,'PKT_SIZE_DESC','X')
|
||||||
PktQty = RIRec<REACT_ITEM_PKT_QTY$>
|
PktQty = RIRec<REACT_ITEM_PKT_QTY$>
|
||||||
PPlusRDSNo = RIRec<REACT_ITEM_PPLUS_RDS_NO$>
|
PPlusRDSNo = RIRec<REACT_ITEM_PPLUS_RDS_NO$>
|
||||||
|
|
||||||
* Build calculated description from field data
|
* Build calculated description from field data
|
||||||
|
|
||||||
CalcDesc = obj_React_Item('CalcDesc',RINo:@RM:'')
|
CalcDesc = obj_React_Item('CalcDesc',RINo:@RM:'')
|
||||||
|
|
||||||
IF PPLusRDSNo NE '' THEN
|
IF PPLusRDSNo NE '' THEN
|
||||||
CalcDesc := ' ( P++ )'
|
CalcDesc := ' ( P++ )'
|
||||||
END
|
END
|
||||||
|
|
||||||
|
|
||||||
Parms = '':@RM:RINo:@RM:''
|
Parms = '':@RM:RINo:@RM:''
|
||||||
HistKeys = obj_React_Item_Hist('GetHistory',Parms) ;* 3 parameters RINo is the middle one
|
HistKeys = obj_React_Item_Hist('GetHistory',Parms) ;* 3 parameters RINo is the middle one
|
||||||
HistKey = HistKeys<1,1> ;* This is the most recent
|
HistKey = HistKeys<1,1> ;* This is the most recent
|
||||||
|
|
||||||
LastInstallRec = XLATE('REACT_ITEM_HIST',HistKeys<1,1>,'','X')
|
LastInstallRec = XLATE('REACT_ITEM_HIST',HistKeys<1,1>,'','X')
|
||||||
|
|
||||||
ReactNo = HistKey[1,'*']
|
ReactNo = HistKey[1,'*']
|
||||||
InstallDTM = OCONV(FIELD(HistKey,'*',3),'DT4/^S')
|
InstallDTM = OCONV(FIELD(HistKey,'*',3),'DT4/^S')
|
||||||
RemoveDTM = OCONV(LastInstallRec<REACT_ITEM_HIST_REM_DTM$>,'DT4/^S')
|
RemoveDTM = OCONV(LastInstallRec<REACT_ITEM_HIST_REM_DTM$>,'DT4/^S')
|
||||||
|
|
||||||
FileName = "Printing Label"
|
FileName = "Printing Label"
|
||||||
Title = "Printing Label"
|
Title = "Printing Label"
|
||||||
|
|
||||||
PageInfo = ''
|
PageInfo = ''
|
||||||
PageInfo<PI$LEFT> = 0.1
|
PageInfo<PI$LEFT> = 0.1
|
||||||
PageInfo<PI$TOP> = 0.1
|
PageInfo<PI$TOP> = 0.1
|
||||||
PageInfo<PI$RIGHT> = 0.1
|
PageInfo<PI$RIGHT> = 0.1
|
||||||
PageInfo<PI$BOTTOM> = 0.1
|
PageInfo<PI$BOTTOM> = 0.1
|
||||||
|
|
||||||
|
|
||||||
PageSetup = '1' ;* Landscape
|
PageSetup = '1' ;* Landscape
|
||||||
PrintSetup = '' ;* Preview
|
PrintSetup = '' ;* Preview
|
||||||
|
|
||||||
PrinterID = '\\mesirwfp001\MESZBRPRT002' ;* This is the Zebra 105se
|
PrinterID = '\\mesirwfp001\MESZBRPRT002' ;* This is the Zebra 105se
|
||||||
|
|
||||||
PrintPath = Printer_Select(PrinterID) ;* Popup is skipped IF Printer ID is passed
|
PrintPath = Printer_Select(PrinterID) ;* Popup is skipped IF Printer ID is passed
|
||||||
|
|
||||||
If Environment_Services('GetLabelPrintMethod') _EQC 'OIPI' then
|
If Environment_Services('GetLabelPrintMethod') _EQC 'OIPI' then
|
||||||
stat = Set_Printer("INIT",FileName,Title,PageInfo,PageSetup,PrintSetup,PrintPath)
|
stat = Set_Printer("INIT",FileName,Title,PageInfo,PageSetup,PrintSetup,PrintPath)
|
||||||
end else
|
end else
|
||||||
stat = Direct_Print('START', PrintPath<1>, '', '')
|
stat = Direct_Print('START', PrintPath<1>, '', '')
|
||||||
end
|
end
|
||||||
|
|
||||||
IF stat < 0 THEN GOTO OIPrint_Error
|
IF stat < 0 THEN GOTO OIPrint_Error
|
||||||
|
|
||||||
EQU DosPath$ TO 'C:\WINDOWS\OIZPL.TXT' ;* remove jch
|
EQU DosPath$ TO 'C:\WINDOWS\OIZPL.TXT' ;* remove jch
|
||||||
|
|
||||||
|
Str = '^XA'
|
||||||
|
Str := '^LH0,0'
|
||||||
|
Str := '^PR2' ;* Print speed 2 inches per second
|
||||||
|
Str := '^LL406' ;* Label length = 203.2dpi x 2in
|
||||||
|
Str := '^PW812' ;* Print width = 203.2dpi x 4in ;* This was 900 jch 12/30/2013
|
||||||
|
Str := '^MD15' ;* Media darkness
|
||||||
|
Str := '^MMT' ;* Media mode t=tear off mode
|
||||||
|
Str := '^FS' ;* end command
|
||||||
|
|
||||||
|
****** First Line
|
||||||
|
|
||||||
|
Str := '^FO30,25^A0,,36^FD':obj_Install('Get_Prop','Company'):'^FS'
|
||||||
|
|
||||||
|
Str := '^FO310,25^AC,18^FDRI No:^FS':CRLF$ ;* Label
|
||||||
|
Str := '^FO390,25^A045,36^FD':RINo:'^FS':CRLF$ ;* Data
|
||||||
|
|
||||||
|
Str := '^FO560,25^AC,18^FDStatus:^FS':CRLF$ ;* Label
|
||||||
|
Str := '^FO650,25^A045,36^FD':CurrStatus:'^FS':CRLF$ ;* Data
|
||||||
|
|
||||||
|
|
||||||
|
****** Second Line
|
||||||
|
|
||||||
Str = '^XA'
|
Str:= '^FO30,70^AC,18^FDDesc:^FS':CRLF$
|
||||||
Str := '^LH0,0'
|
Str:= '^FO95,70^A050,30^FD':CalcDesc:'^FS':CRLF$
|
||||||
Str := '^PR2' ;* Print speed 2 inches per second
|
|
||||||
Str := '^LL406' ;* Label length = 203.2dpi x 2in
|
|
||||||
Str := '^PW812' ;* Print width = 203.2dpi x 4in ;* This was 900 jch 12/30/2013
|
|
||||||
Str := '^MD15' ;* Media darkness
|
|
||||||
Str := '^MMT' ;* Media mode t=tear off mode
|
|
||||||
*Str := '^PQ2' ;* Print 2 labels for each pass through here
|
|
||||||
|
|
||||||
Str := '^FS' ;* end command
|
Str := '^BY2,2.0':CRLF$
|
||||||
|
Str := '^FO600,70^B3,,23,N^FD':RINo:'^FS':CRLF$
|
||||||
****** First Line
|
Str := '^BY2,3.0':CRLF$
|
||||||
|
|
||||||
Str := '^FO30,25^A0,,36^FD':obj_Install('Get_Prop','Company'):'^FS'
|
|
||||||
|
|
||||||
Str := '^FO310,25^AC,18^FDRI No:^FS':CRLF$ ;* Label
|
|
||||||
Str := '^FO390,25^A045,36^FD':RINo:'^FS':CRLF$ ;* Data
|
|
||||||
|
|
||||||
Str := '^FO560,25^AC,18^FDStatus:^FS':CRLF$ ;* Label
|
|
||||||
Str := '^FO650,25^A045,36^FD':CurrStatus:'^FS':CRLF$ ;* Data
|
|
||||||
|
|
||||||
|
|
||||||
****** Second Line
|
****** Third Line
|
||||||
|
|
||||||
Str:= '^FO30,70^AC,18^FDDesc:^FS':CRLF$
|
Str:= '^FO30,115^AC,18^FDMfr:^FS' ;* Label
|
||||||
Str:= '^FO95,70^A050,30^FD':CalcDesc:'^FS':CRLF$
|
MfrData = MfrCd:' - ':MfrName
|
||||||
|
Str:= '^FO90,115^A0,,25^FD':MfrData:'^FS':CRLF$ ;* Data
|
||||||
Str := '^BY2,2.0':CRLF$
|
|
||||||
Str := '^FO600,70^B3,,23,N^FD':RINo:'^FS':CRLF$
|
|
||||||
Str := '^BY2,3.0':CRLF$
|
|
||||||
|
|
||||||
|
|
||||||
****** Third Line
|
****** Fourth Line
|
||||||
|
|
||||||
Str:= '^FO30,115^AC,18^FDMfr:^FS' ;* Label
|
Str:= '^FO30,160^AC,18^FDPN:^FS':CRLF$ ;* Label
|
||||||
MfrData = MfrCd:' - ':MfrName
|
Str:= '^FO70,160^A045,25^FD':MfrPartNo:'^FS':CRLF$ ;* Data
|
||||||
Str:= '^FO90,115^A0,,25^FD':MfrData:'^FS':CRLF$ ;* Data
|
|
||||||
|
Str:= '^FO300,160^AC,18^FDRev:^FS':CRLF$ ;* Label
|
||||||
|
Str:= '^FO350,160^A045,25^FD':MfrPartNoRev:'^FS':CRLF$ ;* Data
|
||||||
|
|
||||||
|
Str:= '^FO500,160^AC,18^FDSN:^FS':CRLF$ ;* Label
|
||||||
|
Str:= '^FO540,160^A045,25^FD':SerialNo:'^FS':CRLF$ ;* Data
|
||||||
|
|
||||||
|
|
||||||
****** Fourth Line
|
****** Fifth Line
|
||||||
|
|
||||||
Str:= '^FO30,160^AC,18^FDPN:^FS':CRLF$ ;* Label
|
Str := '^FO30,205^AC,18^FDEntered:^FS':CRLF$
|
||||||
Str:= '^FO70,160^A045,25^FD':MfrPartNo:'^FS':CRLF$ ;* Data
|
Str := '^FO150,205^A0,20^FD':EnterDTM:'^FS':CRLF$
|
||||||
|
|
||||||
Str:= '^FO300,160^AC,18^FDRev:^FS':CRLF$ ;* Label
|
|
||||||
Str:= '^FO350,160^A045,25^FD':MfrPartNoRev:'^FS':CRLF$ ;* Data
|
|
||||||
|
|
||||||
Str:= '^FO500,160^AC,18^FDSN:^FS':CRLF$ ;* Label
|
|
||||||
Str:= '^FO540,160^A045,25^FD':SerialNo:'^FS':CRLF$ ;* Data
|
|
||||||
|
|
||||||
|
|
||||||
|
****** Sixth Line
|
||||||
|
|
||||||
****** Separator bar
|
Str := '^FO30,250^AC,18^FDInstalled:^FS':CRLF$
|
||||||
|
Str := '^FO150,250^A0,20^FD':InstallDTM:'^FS':CRLF$
|
||||||
*Str:= '^FO15,128^GB795,1^FS'
|
|
||||||
|
|
||||||
|
|
||||||
****** Fifth Line
|
Str := '^FO500,250^AC,18^FDReact No:^FS':CRLF$
|
||||||
|
Str := '^FO610,250^A0,20^FD':ReactNo:'^FS':CRLF$
|
||||||
|
|
||||||
Str := '^FO30,205^AC,18^FDEntered:^FS':CRLF$
|
****** Seventh Line
|
||||||
Str := '^FO150,205^A0,20^FD':EnterDTM:'^FS':CRLF$
|
|
||||||
|
|
||||||
|
|
||||||
****** Sixth Line
|
|
||||||
|
|
||||||
Str := '^FO30,250^AC,18^FDInstalled:^FS':CRLF$
|
|
||||||
Str := '^FO150,250^A0,20^FD':InstallDTM:'^FS':CRLF$
|
|
||||||
|
|
||||||
|
|
||||||
Str := '^FO500,250^AC,18^FDReact No:^FS':CRLF$
|
|
||||||
Str := '^FO610,250^A0,20^FD':ReactNo:'^FS':CRLF$
|
|
||||||
|
|
||||||
****** Seventh Line
|
|
||||||
|
|
||||||
Str := '^FO30,295^AC,18^FDRemoved:^FS':CRLF$
|
|
||||||
Str := '^FO150,295^A0,20^FD':RemoveDTM:'^FS':CRLF$
|
|
||||||
|
|
||||||
*Str := '^FO410,295^AC,18^FDReact Type:^FS':CRLF$
|
|
||||||
*Str := '^FO560,295^A0,20^FD':PrintReactType:'^FS':CRLF$
|
|
||||||
|
|
||||||
|
Str := '^FO30,295^AC,18^FDRemoved:^FS':CRLF$
|
||||||
|
Str := '^FO150,295^A0,20^FD':RemoveDTM:'^FS':CRLF$
|
||||||
|
|
||||||
|
|
||||||
* * * * * *
|
* * * * * *
|
||||||
Jump:
|
Jump:
|
||||||
* * * * * *
|
* * * * * *
|
||||||
|
|
||||||
Str:= '^XZ'
|
Str := '^XZ'
|
||||||
|
|
||||||
If Environment_Services('GetLabelPrintMethod') _EQC 'OIPI' then
|
If Environment_Services('GetLabelPrintMethod') _EQC 'OIPI' then
|
||||||
stat = Set_Printer('TEXT',Str)
|
stat = Set_Printer('TEXT',Str)
|
||||||
end else
|
end else
|
||||||
stat = Direct_Print('PRINT', Str)
|
stat = Direct_Print('PRINT', Str)
|
||||||
end
|
end
|
||||||
|
|
||||||
* * * * * *
|
* * * * * *
|
||||||
OIPrint_Error:
|
OIPrint_Error:
|
||||||
* * * * * *
|
* * * * * *
|
||||||
|
|
||||||
If Environment_Services('GetLabelPrintMethod') _EQC 'OIPI' then
|
If Environment_Services('GetLabelPrintMethod') _EQC 'OIPI' then
|
||||||
stat = Set_Printer("TERM")
|
stat = Set_Printer("TERM")
|
||||||
end else
|
end else
|
||||||
stat = Direct_Print('STOP')
|
stat = Direct_Print('STOP')
|
||||||
end
|
end
|
||||||
|
|
||||||
RETURN
|
RETURN
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -20,6 +20,7 @@ DECLARE SUBROUTINE obj_Clean_Insp, Btree.Extract, Send_Info, obj_WO_Wfr, ErrMsg,
|
|||||||
|
|
||||||
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, NextKey, obj_Prod_Spec, Send_Dyn, obj_Clean_Insp
|
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, NextKey, obj_Prod_Spec, Send_Dyn, obj_Clean_Insp
|
||||||
DECLARE FUNCTION obj_RDS_Test, obj_Test_Point_Map, obj_Popup, obj_WO_Wfr, Logging_Services, Environment_Services
|
DECLARE FUNCTION obj_RDS_Test, obj_Test_Point_Map, obj_Popup, obj_WO_Wfr, Logging_Services, Environment_Services
|
||||||
|
Declare function Return_To_Fab_Services
|
||||||
|
|
||||||
$INSERT APP_INSERTS
|
$INSERT APP_INSERTS
|
||||||
$INSERT REACT_RUN_EQUATES
|
$INSERT REACT_RUN_EQUATES
|
||||||
@ -262,6 +263,13 @@ END
|
|||||||
|
|
||||||
LSKeys = ReactRunRec<REACT_RUN_RDS_LAYER_KEYS$>
|
LSKeys = ReactRunRec<REACT_RUN_RDS_LAYER_KEYS$>
|
||||||
|
|
||||||
|
OpenRTF = Return_To_Fab_Services('GetOpenReturnToFabRecordIdByCassId', RDSNo)
|
||||||
|
|
||||||
|
IF OpenRTF NE '' THEN
|
||||||
|
Result = 'RTF' ;* Open RTF on WO_MAT *
|
||||||
|
RETURN
|
||||||
|
END
|
||||||
|
|
||||||
MetOutOfSpec = SUM(XLATE('RDS_LAYER',LSKeys,'TEST_OUT_OF_SPEC','X')) ;* Updated for Metrology update 4/16/2006 JCH
|
MetOutOfSpec = SUM(XLATE('RDS_LAYER',LSKeys,'TEST_OUT_OF_SPEC','X')) ;* Updated for Metrology update 4/16/2006 JCH
|
||||||
|
|
||||||
IF MetOutOfSpec > 0 THEN
|
IF MetOutOfSpec > 0 THEN
|
||||||
@ -2278,3 +2286,4 @@ END
|
|||||||
|
|
||||||
RETURN
|
RETURN
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -205,8 +205,6 @@ WriteRec:
|
|||||||
|
|
||||||
IF TestRec = '' THEN
|
IF TestRec = '' THEN
|
||||||
DELETE TableVar,TableKey ELSE Null
|
DELETE TableVar,TableKey ELSE Null
|
||||||
* ErrorMsg = 'Blank table rec with ':QUOTE(TableKey):' on ':QUOTE(TableName):' table.'; *added 4/9/21 for debugging
|
|
||||||
* Set_FSError()
|
|
||||||
END ELSE
|
END ELSE
|
||||||
Set_Status(0)
|
Set_Status(0)
|
||||||
rv = Get_Status(errCode)
|
rv = Get_Status(errCode)
|
||||||
@ -215,7 +213,6 @@ WriteRec:
|
|||||||
END ELSE
|
END ELSE
|
||||||
ErrorMsg = 'Unable to write ':QUOTE(TableKey):' on ':QUOTE(TableName):' table.'
|
ErrorMsg = 'Unable to write ':QUOTE(TableKey):' on ':QUOTE(TableName):' table.'
|
||||||
END
|
END
|
||||||
|
|
||||||
END
|
END
|
||||||
|
|
||||||
If ( (TableName NE '') and (TableKey NE '') ) then
|
If ( (TableName NE '') and (TableKey NE '') ) then
|
||||||
@ -235,20 +232,9 @@ WriteRec:
|
|||||||
LogData<7> = 'Record self locked: ':Database_Services('IsKeyIDSelfLocked', TableName, TableKey)
|
LogData<7> = 'Record self locked: ':Database_Services('IsKeyIDSelfLocked', TableName, TableKey)
|
||||||
LogData<9> = 'Call stack: ':RetStack()
|
LogData<9> = 'Call stack: ':RetStack()
|
||||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||||
|
|
||||||
Recipients = ''
|
|
||||||
SendFrom = 'System'
|
|
||||||
Subject = 'obj_Tables("WriteRec") failed to release lock'
|
|
||||||
AttachWindow = TableName
|
|
||||||
AttachKey = TableKey
|
|
||||||
SendToGroup = 'FI_SUPPORT'
|
|
||||||
MessageParms = Recipients:@RM:SendFrom:@RM:Subject:@RM:UnlockError:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
|
|
||||||
obj_Notes('Create',MessageParms)
|
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
END
|
END
|
||||||
|
|
||||||
RETURN
|
RETURN
|
||||||
|
|||||||
@ -19,7 +19,7 @@ Compile Function obj_WM_Out(Method,Parms)
|
|||||||
|
|
||||||
Declare Function Get_Status, Msg, Utility, obj_Tables, NextKey, obj_WO_Verify, obj_Prod_Spec, Send_Dyn, obj_RDS_Makeup
|
Declare Function Get_Status, Msg, Utility, obj_Tables, NextKey, obj_WO_Verify, obj_Prod_Spec, Send_Dyn, obj_RDS_Makeup
|
||||||
Declare Function obj_RDS2, obj_WM_Out, Delete, Signature_Services, Environment_Services, Logging_Services
|
Declare Function obj_RDS2, obj_WM_Out, Delete, Signature_Services, Environment_Services, Logging_Services
|
||||||
Declare Function Database_Services, SRP_Array
|
Declare Function Database_Services, SRP_Array, Return_To_Fab_Services
|
||||||
Declare Subroutine Set_Status, Msg, obj_Tables, Send_Dyn, obj_WO_Step, obj_RDS_Layer, obj_RDS_Test, Btree.Extract
|
Declare Subroutine Set_Status, Msg, obj_Tables, Send_Dyn, obj_WO_Step, obj_RDS_Layer, obj_RDS_Test, Btree.Extract
|
||||||
Declare Subroutine Extract_SI_Keys, obj_WM_Out, obj_WO_Mat, obj_Post_Log, obj_WO_Mat_Log, ErrMsg, obj_WO_Wfr
|
Declare Subroutine Extract_SI_Keys, obj_WM_Out, obj_WO_Mat, obj_Post_Log, obj_WO_Mat_Log, ErrMsg, obj_WO_Wfr
|
||||||
Declare Subroutine Logging_Services, Material_Services, Database_Services, Update_Index, Work_Order_Services
|
Declare Subroutine Logging_Services, Material_Services, Database_Services, Update_Index, Work_Order_Services
|
||||||
@ -382,12 +382,18 @@ CurrStatus:
|
|||||||
CurrLocation = XLATE('WO_MAT',WOMatKey,'CURR_LOCATION','X')
|
CurrLocation = XLATE('WO_MAT',WOMatKey,'CURR_LOCATION','X')
|
||||||
END
|
END
|
||||||
|
|
||||||
|
|
||||||
IF WOMatRec<WO_MAT_HOLD$> = 1 AND WOMatRec<WO_MAT_HOLD_ENTITY$,1> = 'WM_OUT' THEN
|
IF WOMatRec<WO_MAT_HOLD$> = 1 AND WOMatRec<WO_MAT_HOLD_ENTITY$,1> = 'WM_OUT' THEN
|
||||||
Result = 'HOLD' ;* Box is on Hold
|
Result = 'HOLD' ;* Box is on Hold
|
||||||
RETURN
|
RETURN
|
||||||
END
|
END
|
||||||
|
|
||||||
|
OpenRTF = Return_To_Fab_Services('GetOpenReturnToFabRecordIdByCassId', WMOutKey)
|
||||||
|
|
||||||
|
IF OpenRTF NE '' THEN
|
||||||
|
Result = 'RTF' ;* Open RTF on WM_OUT *
|
||||||
|
RETURN
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
IF WMOutRec<WM_OUT_SHIP_NO$> NE '' THEN
|
IF WMOutRec<WM_OUT_SHIP_NO$> NE '' THEN
|
||||||
Result = 'SHIP'
|
Result = 'SHIP'
|
||||||
@ -646,7 +652,12 @@ NextOpenSlots:
|
|||||||
IsMULot = WMOutRec EQ True$
|
IsMULot = WMOutRec EQ True$
|
||||||
IsFQASigned = WMOutRec<WM_OUT_SUP_VER_SIG$> NE ''
|
IsFQASigned = WMOutRec<WM_OUT_SUP_VER_SIG$> NE ''
|
||||||
IsVoided = WMOutRec<WM_OUT_VOID$>
|
IsVoided = WMOutRec<WM_OUT_VOID$>
|
||||||
If Not(IsMULot) AND Not(IsFQASigned) AND Not(IsVoided) then
|
WOMatKey = WONo : '*' : CassNo
|
||||||
|
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey, True$, 0, False$)
|
||||||
|
WOMatHold = WOMatRec<WO_MAT_HOLD$>
|
||||||
|
WOMatHoldEntity = WOMatRec<WO_MAT_HOLD_ENTITY$>
|
||||||
|
IsOnHold = WOMatHold EQ True$ and WOMatHoldEntity EQ 'WM_OUT'
|
||||||
|
If Not(IsMULot) AND Not(IsFQASigned) AND Not(IsVoided) AND Not(IsOnHold) then
|
||||||
FOR N = SlotCnt TO 1 STEP -1
|
FOR N = SlotCnt TO 1 STEP -1
|
||||||
IF WMOutRec<WM_OUT_SLOT_NO$,N> NE '' AND WMOutRec<WM_OUT_RDS$,N> = '' AND WMOutRec<WM_OUT_SLOT_NCR$,N> = '' AND WMOutRec<WM_OUT_UMW_CASS_ID$,N> = '' THEN
|
IF WMOutRec<WM_OUT_SLOT_NO$,N> NE '' AND WMOutRec<WM_OUT_RDS$,N> = '' AND WMOutRec<WM_OUT_SLOT_NCR$,N> = '' AND WMOutRec<WM_OUT_UMW_CASS_ID$,N> = '' THEN
|
||||||
|
|
||||||
@ -1988,3 +1999,6 @@ ConvertCleanInsp:
|
|||||||
|
|
||||||
RETURN
|
RETURN
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -28,7 +28,7 @@ Compile Function obj_WO_Mat(Method,Parms)
|
|||||||
Declare Function Get_Status, Msg, Utility, obj_Tables, Dialog_Box,NextKey, Popup, Get_Property, obj_RDS, RetStack
|
Declare Function Get_Status, Msg, Utility, obj_Tables, Dialog_Box,NextKey, Popup, Get_Property, obj_RDS, RetStack
|
||||||
Declare Function Database_Services, GaN_Services, Logging_Services, Environment_Services, Signature_Services
|
Declare Function Database_Services, GaN_Services, Logging_Services, Environment_Services, Signature_Services
|
||||||
Declare Function obj_WO_Mat, obj_WM_In, obj_WM_Out, obj_Prod_Spec, obj_Clean_Insp, obj_Calendar, obj_Popup
|
Declare Function obj_WO_Mat, obj_WM_In, obj_WM_Out, obj_Prod_Spec, obj_Clean_Insp, obj_Calendar, obj_Popup
|
||||||
Declare Function Error_Services, Memberof, Datetime, GetTickCount
|
Declare Function Error_Services, Memberof, Datetime, GetTickCount, Return_To_Fab_Services
|
||||||
Declare Subroutine Set_Status, Msg, obj_Tables, Send_Dyn, Btree.Extract, ErrMsg, Send_Dyn, RList, obj_WO_Log, Send_Event
|
Declare Subroutine Set_Status, Msg, obj_Tables, Send_Dyn, Btree.Extract, ErrMsg, Send_Dyn, RList, obj_WO_Log, Send_Event
|
||||||
Declare Subroutine obj_RDS, Extract_SI_Keys, obj_Pend_Ship_Labels, obj_WO_Mat_QA, Work_Order_Services, Service_Services
|
Declare Subroutine obj_RDS, Extract_SI_Keys, obj_Pend_Ship_Labels, obj_WO_Mat_QA, Work_Order_Services, Service_Services
|
||||||
Declare Subroutine obj_notes, obj_Clean_Insp, obj_Post_Log, Send_Info, obj_WO_Mat_Log, obj_SAP, obj_WO_Mat, obj_WO_Wfr
|
Declare Subroutine obj_notes, obj_Clean_Insp, obj_Post_Log, Send_Info, obj_WO_Mat_Log, obj_SAP, obj_WO_Mat, obj_WO_Wfr
|
||||||
@ -664,13 +664,22 @@ CurrStatus:
|
|||||||
RETURN
|
RETURN
|
||||||
END
|
END
|
||||||
|
|
||||||
|
WMIKey = WOMatRec<WO_MAT_WMI_KEY$>
|
||||||
|
WMOKey = WOMatRec<WO_MAT_WMO_KEY$>
|
||||||
|
|
||||||
|
OpenRTF = Return_To_Fab_Services('GetOpenReturnToFabRecordIdByCassId', WMOKey)
|
||||||
|
|
||||||
|
IF OpenRTF NE '' THEN
|
||||||
|
Result = 'RTF' ;* Open RTF on WO_MAT *
|
||||||
|
Result = Oconv(Result, '[WO_MAT_CURR_STATUS_CONV]')
|
||||||
|
RETURN
|
||||||
|
END
|
||||||
|
|
||||||
IF WOMatRec<WO_MAT_SHIP_NO$> NE '' THEN
|
IF WOMatRec<WO_MAT_SHIP_NO$> NE '' THEN
|
||||||
Result = 'SHIP'
|
Result = 'SHIP'
|
||||||
RETURN
|
RETURN
|
||||||
END
|
END
|
||||||
|
|
||||||
WMIKey = WOMatRec<WO_MAT_WMI_KEY$>
|
|
||||||
WMOKey = WOMatRec<WO_MAT_WMO_KEY$>
|
|
||||||
|
|
||||||
LocCnt = COUNT(WOMatRec<WO_MAT_INV_LOCATION$>,@VM) + (WOMatRec<WO_MAT_INV_LOCATION$> NE '')
|
LocCnt = COUNT(WOMatRec<WO_MAT_INV_LOCATION$>,@VM) + (WOMatRec<WO_MAT_INV_LOCATION$> NE '')
|
||||||
|
|
||||||
@ -3284,6 +3293,19 @@ ReportStatus:
|
|||||||
WMIStatus = WOMatRec<WO_MAT_WMI_CURR_STATUS$>
|
WMIStatus = WOMatRec<WO_MAT_WMI_CURR_STATUS$>
|
||||||
WMOStatus = WOMatRec<WO_MAT_WMO_CURR_STATUS$>
|
WMOStatus = WOMatRec<WO_MAT_WMO_CURR_STATUS$>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
OpenRTF = Return_To_Fab_Services('GetOpenReturnToFabRecordIdByCassId', RDSNo)
|
||||||
|
If OpenRTF EQ '' then
|
||||||
|
OpenRTF = Return_To_Fab_Services('GetOpenReturnToFabRecordIdByCassId', WMOKey)
|
||||||
|
end
|
||||||
|
|
||||||
|
IF OpenRTF NE '' THEN
|
||||||
|
Result = 'RTF' ;* Open RTF on WO_MAT *
|
||||||
|
Result = Oconv(Result, '[WO_MAT_CURR_STATUS_CONV]')
|
||||||
|
RETURN
|
||||||
|
END
|
||||||
|
|
||||||
IF WMOStatus = 'COMP' THEN
|
IF WMOStatus = 'COMP' THEN
|
||||||
WMOStatus = obj_WO_Mat('CurrStatus',WOMatKey:@RM:WOMatRec)
|
WMOStatus = obj_WO_Mat('CurrStatus',WOMatKey:@RM:WOMatRec)
|
||||||
END
|
END
|
||||||
@ -5714,3 +5736,5 @@ ExpCOA:
|
|||||||
RETURN
|
RETURN
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -14,7 +14,6 @@ COMPILE FUNCTION obj_WO_React(Method,Parms)
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, NextKey, obj_Prod_Spec, obj_WO_Mat_QA, GetTickCount
|
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, NextKey, obj_Prod_Spec, obj_WO_Mat_QA, GetTickCount
|
||||||
Declare function Environment_Services, Database_Services
|
Declare function Environment_Services, Database_Services
|
||||||
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, RList, ErrMsg, Btree.Extract, obj_WO_Mat_QA, Mona_Services
|
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, RList, ErrMsg, Btree.Extract, obj_WO_Mat_QA, Mona_Services
|
||||||
@ -70,126 +69,127 @@ RETURN Result
|
|||||||
AddRdsNo:
|
AddRdsNo:
|
||||||
* * * * * * *
|
* * * * * * *
|
||||||
|
|
||||||
StartTick = GetTickCount()
|
StartTick = GetTickCount()
|
||||||
MetricName = 'AddRdsNo'
|
MetricName = 'AddRdsNo'
|
||||||
|
|
||||||
WONo = Parms[1,@RM]
|
WONo = Parms[1,@RM]
|
||||||
StepNo = Parms[COL2()+1,@RM]
|
StepNo = Parms[COL2()+1,@RM]
|
||||||
ReactNo = Parms[COL2()+1,@RM]
|
ReactNo = Parms[COL2()+1,@RM]
|
||||||
RdsNo = Parms[COL2()+1,@RM]
|
RdsNo = Parms[COL2()+1,@RM]
|
||||||
CassNo = Parms[COL2()+1,@RM]
|
CassNo = Parms[COL2()+1,@RM]
|
||||||
|
|
||||||
IF WONo = '' THEN RETURN
|
IF WONo = '' THEN RETURN
|
||||||
IF StepNo = '' THEN RETURN
|
IF StepNo = '' THEN RETURN
|
||||||
IF ReactNo = '' THEN RETURN
|
IF ReactNo = '' THEN RETURN
|
||||||
IF RdsNo = '' THEN RETURN
|
IF RdsNo = '' THEN RETURN
|
||||||
IF CassNo = '' THEN RETURN
|
IF CassNo = '' THEN RETURN
|
||||||
|
|
||||||
WOReactKey = WONo:'*':StepNo:'*':ReactNo
|
WOReactKey = WONo:'*':StepNo:'*':ReactNo
|
||||||
|
|
||||||
otParms = 'WO_REACT':@RM:WOReactKey
|
otParms = 'WO_REACT':@RM:WOReactKey
|
||||||
|
|
||||||
WOReactRec = obj_Tables('ReadOnlyRec',otParms)
|
WOReactRec = obj_Tables('ReadOnlyRec',otParms)
|
||||||
RDSNos = WOReactRec<WO_REACT_RDS_NO$>
|
RDSNos = WOReactRec<WO_REACT_RDS_NO$>
|
||||||
CassNos = WOReactRec<WO_REACT_CASS_NO$>
|
CassNos = WOReactRec<WO_REACT_CASS_NO$>
|
||||||
|
|
||||||
PSNos = XLATE('WO_LOG',WoNo,'PROD_VER_STEP_PSN','X')
|
PSNos = XLATE('WO_LOG',WoNo,'PROD_VER_STEP_PSN','X')
|
||||||
PSNo = PSNos<1,StepNo>
|
PSNo = PSNos<1,StepNo>
|
||||||
|
|
||||||
QAMetData = obj_Prod_Spec('GetQAMet',PSNo:@RM:@RM:1) ;* * * Get Reactor Scheduled QA Metrology * * *
|
QAMetData = obj_Prod_Spec('GetQAMet',PSNo:@RM:@RM:1) ;* * * Get Reactor Scheduled QA Metrology * * *
|
||||||
|
|
||||||
IF QAMetData = '' THEN RETURN ;* No reactor scheduled QA_MET specified
|
IF QAMetData = '' THEN RETURN ;* No reactor scheduled QA_MET specified
|
||||||
|
|
||||||
Start = QAMetData<COL$QA_MET_START>
|
Start = QAMetData<COL$QA_MET_START>
|
||||||
Interval = QAMetData<COL$QA_MET_INTERVAL>
|
Interval = QAMetData<COL$QA_MET_INTERVAL>
|
||||||
Stage = QAMetData<COL$QA_MET_STAGE>
|
Stage = QAMetData<COL$QA_MET_STAGE>
|
||||||
MetPropCd = QAMetData<COL$QA_MET_PROP>
|
MetPropCd = QAMetData<COL$QA_MET_PROP>
|
||||||
GOSUB BuildAllTestPos ;* Set RDSNos, Start and Interval -> returns AllTestPos
|
GOSUB BuildAllTestPos ;* Set RDSNos, Start and Interval -> returns AllTestPos
|
||||||
|
|
||||||
* * * Find where the the RDS being added will be in the list. * * *
|
* * * 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
|
LOCATE RDSNo IN WOReactRec<WO_REACT_RDS_NO$> USING @VM SETTING InsPos THEN
|
||||||
|
|
||||||
otParms = 'WO_REACT':@RM:WOReactKey
|
otParms = 'WO_REACT':@RM:WOReactKey
|
||||||
WOReactRec = obj_Tables('UnlockRec',otParms)
|
WOReactRec = obj_Tables('UnlockRec',otParms)
|
||||||
|
|
||||||
RETURN ;* RDSNo already in this list -> nothing to do.
|
RETURN ;* RDSNo already in this list -> nothing to do.
|
||||||
|
|
||||||
END ELSE
|
END ELSE
|
||||||
|
|
||||||
LOCATE InsPos IN AllTestPos USING @VM SETTING TrimPos ELSE Null
|
LOCATE InsPos IN AllTestPos USING @VM SETTING TrimPos ELSE Null
|
||||||
|
|
||||||
ChangePosList = FIELD(AllTestPos,@VM,TrimPos,SeqCnt)
|
ChangePosList = FIELD(AllTestPos,@VM,TrimPos,SeqCnt)
|
||||||
GOSUB RemSchedQA ;* Removes unsigned QAMet from cassettes scheduled past the box being removed
|
GOSUB RemSchedQA ;* Removes unsigned QAMet from cassettes scheduled past the box being removed
|
||||||
|
|
||||||
END
|
END
|
||||||
|
|
||||||
WOReactRec = INSERT(WOReactRec,WO_REACT_RDS_NO$,InsPos,0,RDSNo)
|
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
|
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
|
RDSNos = WOReactRec<WO_REACT_RDS_NO$> ;* List after insert
|
||||||
CassNos = WOReactRec<WO_REACT_CASS_NO$> ;* List after insert
|
CassNos = WOReactRec<WO_REACT_CASS_NO$> ;* List after insert
|
||||||
|
|
||||||
* * * Now build list for cassette
|
* * * Now build list for cassette
|
||||||
|
|
||||||
GOSUB BuildAllTestPos
|
GOSUB BuildAllTestPos
|
||||||
ChangePosList = FIELD(AllTestPos,@VM,TrimPos,SeqCnt)
|
ChangePosList = FIELD(AllTestPos,@VM,TrimPos,SeqCnt)
|
||||||
|
// Add QAMet spec data to cassettes now associated with the test
|
||||||
|
// positions after removing the RDS & Cassno from the lists
|
||||||
|
GOSUB AddSchedQA
|
||||||
|
|
||||||
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)
|
||||||
|
// Done with updates to the WO_REACT record
|
||||||
|
obj_Tables('WriteOnlyRec',otParms)
|
||||||
|
|
||||||
otParms = FIELDSTORE(otParms,@RM,4,0,WOReactRec)
|
Result = Log
|
||||||
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
|
RETURN
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
* * * * * * *
|
* * * * * * *
|
||||||
RemRDSNo:
|
RemRDSNo:
|
||||||
* * * * * * *
|
* * * * * * *
|
||||||
|
|
||||||
StartTick = GetTickCount()
|
StartTick = GetTickCount()
|
||||||
MetricName = 'RemRDSNo'
|
MetricName = 'RemRDSNo'
|
||||||
|
|
||||||
WONo = Parms[1,@RM]
|
WONo = Parms[1,@RM]
|
||||||
StepNo = Parms[COL2()+1,@RM]
|
StepNo = Parms[COL2()+1,@RM]
|
||||||
ReactNo = Parms[COL2()+1,@RM]
|
ReactNo = Parms[COL2()+1,@RM]
|
||||||
RdsNo = Parms[COL2()+1,@RM]
|
RdsNo = Parms[COL2()+1,@RM]
|
||||||
CassNo = Parms[COL2()+1,@RM]
|
CassNo = Parms[COL2()+1,@RM]
|
||||||
|
|
||||||
IF WONo = '' THEN RETURN
|
IF WONo = '' THEN RETURN
|
||||||
IF StepNo = '' THEN RETURN
|
IF StepNo = '' THEN RETURN
|
||||||
IF ReactNo = '' THEN RETURN
|
IF ReactNo = '' THEN RETURN
|
||||||
IF RdsNo = '' THEN RETURN
|
IF RdsNo = '' THEN RETURN
|
||||||
IF CassNo = '' THEN RETURN
|
IF CassNo = '' THEN RETURN
|
||||||
|
|
||||||
WOReactKey = WONo:'*':StepNo:'*':ReactNo
|
WOReactKey = WONo:'*':StepNo:'*':ReactNo
|
||||||
|
|
||||||
otParms = 'WO_REACT':@RM:WOReactKey
|
otParms = 'WO_REACT':@RM:WOReactKey
|
||||||
// 10/12/18 Changed to ReadOnlyRec as per Francois' instructions. - djs
|
|
||||||
WOReactRec = obj_Tables('ReadOnlyRec',otParms)
|
|
||||||
|
|
||||||
RDSNos = WOReactRec<WO_REACT_RDS_NO$>
|
WOReactRec = obj_Tables('ReadOnlyRec',otParms)
|
||||||
CassNos = WOReactRec<WO_REACT_CASS_NO$>
|
|
||||||
|
|
||||||
PSNos = XLATE('WO_LOG',WoNo,'PROD_VER_STEP_PSN','X')
|
RDSNos = WOReactRec<WO_REACT_RDS_NO$>
|
||||||
PSNo = PSNos<1,StepNo>
|
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>
|
QAMetData = obj_Prod_Spec('GetQAMet',PSNo:@RM:@RM:1) ;* * * Get Reactor Scheduled QA Metrology * * *
|
||||||
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
|
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
|
||||||
|
|
||||||
|
IF AllTestPos NE '' THEN
|
||||||
|
|
||||||
* * * Find where the the RDS being removed is in the list. * * *
|
* * * Find where the the RDS being removed is in the list. * * *
|
||||||
|
|
||||||
@ -207,67 +207,63 @@ IF AllTestPos NE '' THEN
|
|||||||
|
|
||||||
RETURN ;* RDSNo is not in this list -> nothing to do.
|
RETURN ;* RDSNo is not in this list -> nothing to do.
|
||||||
END
|
END
|
||||||
END ;* End of check for AllTestPos null
|
END ;* End of check for AllTestPos null
|
||||||
|
|
||||||
WOReactRec = DELETE(WOReactRec,WO_REACT_RDS_NO$,RemPos,0)
|
WOReactRec = DELETE(WOReactRec,WO_REACT_RDS_NO$,RemPos,0)
|
||||||
WOReactRec = DELETE(WOReactRec,WO_REACT_CASS_NO$,RemPos,0) ;* Removes the passed in RDSNo & associated cassette number from the data fields
|
WOReactRec = DELETE(WOReactRec,WO_REACT_CASS_NO$,RemPos,0) ;* Removes the passed in RDSNo & associated cassette number from the data fields
|
||||||
|
|
||||||
RDSNos = WOReactRec<WO_REACT_RDS_NO$> ;* List after removal
|
RDSNos = WOReactRec<WO_REACT_RDS_NO$> ;* List after removal
|
||||||
CassNos = WOReactRec<WO_REACT_CASS_NO$> ;* List after removal
|
CassNos = WOReactRec<WO_REACT_CASS_NO$> ;* List after removal
|
||||||
|
|
||||||
* * * Now build list for cassette
|
* * * Now build list for cassette
|
||||||
|
|
||||||
GOSUB BuildAllTestPos
|
GOSUB BuildAllTestPos
|
||||||
ChangePosList = FIELD(AllTestPos,@VM,TrimPos,SeqCnt)
|
ChangePosList = FIELD(AllTestPos,@VM,TrimPos,SeqCnt)
|
||||||
|
|
||||||
GOSUB AddSchedQA ;* Add QAMet spec data to cassettes now associated with the test positions after removing the RDS & Cassno from the lists
|
GOSUB AddSchedQA ;* Add QAMet spec data to cassettes now associated with the test positions after removing the RDS & Cassno from the lists
|
||||||
otParms = FIELDSTORE(otParms,@RM,4,0,WOReactRec)
|
otParms = FIELDSTORE(otParms,@RM,4,0,WOReactRec)
|
||||||
// 10/12/18 Changed to WriteOnlyRec as per Francois' instructions. - djs
|
|
||||||
obj_Tables('WriteOnlyRec',otParms) ;* Done with updates to the WO_REACT record
|
|
||||||
|
|
||||||
Result = Log
|
obj_Tables('WriteOnlyRec',otParms) ;* Done with updates to the WO_REACT record
|
||||||
|
|
||||||
EndTick = GetTickCount()
|
Result = Log
|
||||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
|
||||||
|
EndTick = GetTickCount()
|
||||||
|
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||||
|
|
||||||
RETURN
|
RETURN
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
************** Internal Methods *************
|
************** Internal Methods *************
|
||||||
|
|
||||||
* * * * * * *
|
* * * * * * *
|
||||||
BuildAllTestPos:
|
BuildAllTestPos:
|
||||||
* * * * * * *
|
* * * * * * *
|
||||||
|
|
||||||
AllTestPos = ''
|
AllTestPos = ''
|
||||||
|
|
||||||
RDSCnt = COUNT(RDSNos,@VM) + (RDSNos NE '')
|
RDSCnt = COUNT(RDSNos,@VM) + (RDSNos NE '')
|
||||||
SeqCnt = 0
|
SeqCnt = 0
|
||||||
|
|
||||||
|
|
||||||
FOR TestSeq = 1 TO RDSCnt
|
FOR TestSeq = 1 TO RDSCnt
|
||||||
IF REM((TestSeq - Start),Interval) = 0 THEN
|
IF REM((TestSeq - Start),Interval) = 0 THEN
|
||||||
AllTestPos<1,-1> = TestSeq ;* Build list of list positions to have QAMet scheduled
|
AllTestPos<1,-1> = TestSeq ;* Build list of list positions to have QAMet scheduled
|
||||||
SeqCnt += 1
|
SeqCnt += 1
|
||||||
END
|
END
|
||||||
NEXT TestSeq
|
NEXT TestSeq
|
||||||
|
|
||||||
Log := 'AllTestPos: ':AllTestPos:@FM
|
Log := 'AllTestPos: ':AllTestPos:@FM
|
||||||
|
|
||||||
RETURN
|
RETURN
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
* * * * * * *
|
* * * * * * *
|
||||||
RemSchedQA:
|
RemSchedQA:
|
||||||
* * * * * * *
|
* * * * * * *
|
||||||
|
|
||||||
chgCnt = COUNT(ChangePosList,@VM) + (ChangePosList NE '')
|
chgCnt = COUNT(ChangePosList,@VM) + (ChangePosList NE '')
|
||||||
|
|
||||||
FOR I = 1 TO chgCnt
|
FOR I = 1 TO chgCnt
|
||||||
RemCassNo = CassNos<1,ChangePoslist<1,I>>
|
RemCassNo = CassNos<1,ChangePoslist<1,I>>
|
||||||
Log:= 'RemSched on CassNo: ':RemCassNo:@FM
|
Log:= 'RemSched on CassNo: ':RemCassNo:@FM
|
||||||
|
|
||||||
@ -279,13 +275,7 @@ FOR I = 1 TO chgCnt
|
|||||||
ErrMsg(errCode)
|
ErrMsg(errCode)
|
||||||
END
|
END
|
||||||
|
|
||||||
|
NEXT I
|
||||||
*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
|
|
||||||
|
|
||||||
RETURN
|
RETURN
|
||||||
|
|
||||||
@ -294,9 +284,9 @@ RETURN
|
|||||||
AddSchedQA:
|
AddSchedQA:
|
||||||
* * * * * * *
|
* * * * * * *
|
||||||
|
|
||||||
chgCnt = COUNT(ChangePosList,@VM) + (ChangePosList NE '')
|
chgCnt = COUNT(ChangePosList,@VM) + (ChangePosList NE '')
|
||||||
|
|
||||||
FOR I = 1 TO chgCnt
|
FOR I = 1 TO chgCnt
|
||||||
AddCassNo = CassNos<1,ChangePoslist<1,I>>
|
AddCassNo = CassNos<1,ChangePoslist<1,I>>
|
||||||
|
|
||||||
Log:= 'AddSched on CassNo: ':AddCassNo:@FM
|
Log:= 'AddSched on CassNo: ':AddCassNo:@FM
|
||||||
@ -326,15 +316,7 @@ FOR I = 1 TO chgCnt
|
|||||||
ErrMsg(errCode)
|
ErrMsg(errCode)
|
||||||
END
|
END
|
||||||
|
|
||||||
*obj_WO_Mat('AddQAMet',owmParms) ;* Dead 6/5/2015 JCH - remove after a few days
|
NEXT I
|
||||||
|
|
||||||
*IF Get_Status(errCode) THEN
|
|
||||||
* ErrMsg(errCode)
|
|
||||||
*END
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
NEXT I
|
|
||||||
|
|
||||||
RETURN
|
RETURN
|
||||||
|
|
||||||
|
|||||||
@ -119,9 +119,22 @@ API oiwizard.POST
|
|||||||
// Validate credentials and create a new session
|
// Validate credentials and create a new session
|
||||||
UserID = SRP_JSON(hWizardJSON, 'GetValue', 'userID')
|
UserID = SRP_JSON(hWizardJSON, 'GetValue', 'userID')
|
||||||
Password = SRP_JSON(hWizardJSON, 'GetValue', 'password')
|
Password = SRP_JSON(hWizardJSON, 'GetValue', 'password')
|
||||||
|
ADUsername = SRP_JSON(hWizardJSON, 'GetValue', 'adUsername')
|
||||||
SRP_JSON(hWizardJSON, 'Release')
|
SRP_JSON(hWizardJSON, 'Release')
|
||||||
Authenticated = Active_Directory_Services('AuthenticateUser', UserID, Password, 'Infineon')
|
Domain = 'Infineon'
|
||||||
If Authenticated then
|
Begin Case
|
||||||
|
Case ( (UserID NE '') and (Password NE '') )
|
||||||
|
Authenticated = Active_Directory_Services('AuthenticateUser', UserID, Password, Domain)
|
||||||
|
Authorized = Active_Directory_Services('AuthorizeUser', UserID, Domain)
|
||||||
|
Case (ADUsername NE '')
|
||||||
|
Authenticated = True$
|
||||||
|
Authorized = Active_Directory_Services('AuthorizeUser', ADUsername, Domain)
|
||||||
|
If Authorized then UserId = ADUsername
|
||||||
|
Case Otherwise$
|
||||||
|
Authenticated = False$
|
||||||
|
Authorized = False$
|
||||||
|
End Case
|
||||||
|
If Authenticated and Authorized then
|
||||||
LSLUserID = Security_Services('GetLSLUser', UserID)
|
LSLUserID = Security_Services('GetLSLUser', UserID)
|
||||||
If LSLUserID NE '' then
|
If LSLUserID NE '' then
|
||||||
OIWizardID = OI_Wizard_Services('CreateWizardID', LSLUserID)
|
OIWizardID = OI_Wizard_Services('CreateWizardID', LSLUserID)
|
||||||
@ -235,3 +248,4 @@ API oiwizard.checkidleoisessionvalid.GET
|
|||||||
end
|
end
|
||||||
|
|
||||||
end api
|
end api
|
||||||
|
|
||||||
|
|||||||
@ -450,11 +450,7 @@ Main:
|
|||||||
lsData<I,7> = PropRec<PRS_PROP_TOOL$>
|
lsData<I,7> = PropRec<PRS_PROP_TOOL$>
|
||||||
lsData<I,8> = PropRec<PRS_PROP_MET_WFR_TYPE$>
|
lsData<I,8> = PropRec<PRS_PROP_MET_WFR_TYPE$>
|
||||||
lsData<I,9> = PropRec<PRS_PROP_MET_RECIPE$>
|
lsData<I,9> = PropRec<PRS_PROP_MET_RECIPE$>
|
||||||
If (PropRec<PRS_PROP_TOOL$> _NEC 'HgCV') then
|
|
||||||
lsData<I,10> = PropRec<PRS_PROP_MET_RECIPE_PATTERN$>
|
lsData<I,10> = PropRec<PRS_PROP_MET_RECIPE_PATTERN$>
|
||||||
end else
|
|
||||||
lsData<I,10> = ''
|
|
||||||
end
|
|
||||||
lsData<I,11> = PropRec<PRS_PROP_MET_INTERVAL$>
|
lsData<I,11> = PropRec<PRS_PROP_MET_INTERVAL$>
|
||||||
lsData<I,12> = PropRec<PRS_PROP_PROVEIN_WFR_TYPE$>
|
lsData<I,12> = PropRec<PRS_PROP_PROVEIN_WFR_TYPE$>
|
||||||
|
|
||||||
@ -468,11 +464,7 @@ Main:
|
|||||||
lsData<I,7> = lsData<I,7>:CRLF$:PropRec<PRS_PROP_TOOL$>
|
lsData<I,7> = lsData<I,7>:CRLF$:PropRec<PRS_PROP_TOOL$>
|
||||||
lsData<I,8> = lsData<I,8>:CRLF$:PropRec<PRS_PROP_MET_WFR_TYPE$>
|
lsData<I,8> = lsData<I,8>:CRLF$:PropRec<PRS_PROP_MET_WFR_TYPE$>
|
||||||
lsData<I,9> = lsData<I,9>:CRLF$:PropRec<PRS_PROP_MET_RECIPE$>
|
lsData<I,9> = lsData<I,9>:CRLF$:PropRec<PRS_PROP_MET_RECIPE$>
|
||||||
If (PropRec<PRS_PROP_TOOL$> _NEC 'HgCV') then
|
|
||||||
lsData<I,10> = lsData<I,10>:CRLF$:PropRec<PRS_PROP_MET_RECIPE_PATTERN$>
|
lsData<I,10> = lsData<I,10>:CRLF$:PropRec<PRS_PROP_MET_RECIPE_PATTERN$>
|
||||||
end else
|
|
||||||
lsData<I,10> = lsData<I,10>:CRLF$
|
|
||||||
end
|
|
||||||
lsData<I,11> = lsData<I,11>:CRLF$:PropRec<PRS_PROP_MET_INTERVAL$>
|
lsData<I,11> = lsData<I,11>:CRLF$:PropRec<PRS_PROP_MET_INTERVAL$>
|
||||||
lsData<I,12> = lsData<I,12>:CRLF$:PropRec<PRS_PROP_PROVEIN_WFR_TYPE$>
|
lsData<I,12> = lsData<I,12>:CRLF$:PropRec<PRS_PROP_PROVEIN_WFR_TYPE$>
|
||||||
|
|
||||||
@ -840,11 +832,7 @@ Main:
|
|||||||
end else
|
end else
|
||||||
colData<StepNo,STEP_PRODUCT$> = CHAR(185):obj_Met_Prop('GetPropDesc',StageRec<PRS_STAGE_MET_PROP$,M>)
|
colData<StepNo,STEP_PRODUCT$> = CHAR(185):obj_Met_Prop('GetPropDesc',StageRec<PRS_STAGE_MET_PROP$,M>)
|
||||||
end
|
end
|
||||||
If (StageRec<PRS_STAGE_MET_TOOL_CLASS$,M> _NEC 'HgCV') then
|
|
||||||
colData<StepNo,STEP_RECIPE$> = StageRec<PRS_STAGE_MET_RECIPE$,M>:CRLF$:StageRec<PRS_STAGE_MET_RECIPE_PATTERN$,M>
|
colData<StepNo,STEP_RECIPE$> = StageRec<PRS_STAGE_MET_RECIPE$,M>:CRLF$:StageRec<PRS_STAGE_MET_RECIPE_PATTERN$,M>
|
||||||
end else
|
|
||||||
colData<StepNo,STEP_RECIPE$> = StageRec<PRS_STAGE_MET_RECIPE$,M>
|
|
||||||
end
|
|
||||||
colData<StepNo,STEP_SPEC_TOL$> = StageRec<PRS_STAGE_MET_MIN$,M>:' - ':StageRec<PRS_STAGE_MET_MAX$,M>:' ':obj_Met_Prop('GetUnitsDesc',StageRec<PRS_STAGE_MET_PROP$,M>)
|
colData<StepNo,STEP_SPEC_TOL$> = StageRec<PRS_STAGE_MET_MIN$,M>:' - ':StageRec<PRS_STAGE_MET_MAX$,M>:' ':obj_Met_Prop('GetUnitsDesc',StageRec<PRS_STAGE_MET_PROP$,M>)
|
||||||
colData<StepNo,STEP_SIZE$> = StageRec<PRS_STAGE_MET_WFR_QTY$,M>
|
colData<StepNo,STEP_SIZE$> = StageRec<PRS_STAGE_MET_WFR_QTY$,M>
|
||||||
colData<StepNo,STEP_FREQ$> = StageRec<PRS_STAGE_MET_INTERVAL$,M>
|
colData<StepNo,STEP_FREQ$> = StageRec<PRS_STAGE_MET_INTERVAL$,M>
|
||||||
|
|||||||
@ -28,7 +28,7 @@ OPEN 'REACTOR_LOG' TO ReactLogTable ELSE
|
|||||||
RETURN
|
RETURN
|
||||||
END
|
END
|
||||||
|
|
||||||
OPEN 'DICT.REACTOR_LOG' TO @DICT ELSE
|
OPEN 'DICT.REACTOR_LOG' TO hReactLogDict ELSE
|
||||||
ErrorMsg = 'Unable to open "DICT.Reactor_LOG" table.'
|
ErrorMsg = 'Unable to open "DICT.Reactor_LOG" table.'
|
||||||
ErrMsg(ErrorTitle:@SVM:ErrorMsg)
|
ErrMsg(ErrorTitle:@SVM:ErrorMsg)
|
||||||
RETURN
|
RETURN
|
||||||
@ -430,3 +430,4 @@ END
|
|||||||
|
|
||||||
RETURN
|
RETURN
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -11,6 +11,7 @@ $insert recipe_layer_info_equ
|
|||||||
$insert msg_equates
|
$insert msg_equates
|
||||||
$insert logical
|
$insert logical
|
||||||
$insert shipping_info_equ
|
$insert shipping_info_equ
|
||||||
|
$insert TOOL_CLASS_EQUATES
|
||||||
|
|
||||||
equ CrLf$ to char(13):char(10)
|
equ CrLf$ to char(13):char(10)
|
||||||
|
|
||||||
@ -19,10 +20,10 @@ declare function memberof, scroll_enable
|
|||||||
ReturnVar = 0
|
ReturnVar = 0
|
||||||
declare function set_property, fieldcount, get_property, msg, editcell, send_event, dialog_box
|
declare function set_property, fieldcount, get_property, msg, editcell, send_event, dialog_box
|
||||||
declare subroutine create_note
|
declare subroutine create_note
|
||||||
Branches = 'LOAD_SURFACE_DEF,SET_MEASURE,LOAD_TOOL_RECIPE,SURFSCAN_CLICK,VALIDATE_DOPANT,VALIDATE_MINMAX,SET_SCANNED_IMAGE,VALIDATE_RECIPE,AKRION_RECIPE_CHECK,TW_TYPE_CHECK'
|
Branches = 'LOAD_SURFACE_DEF,SET_MEASURE,LOAD_TOOL_RECIPE,LOAD_TOOL_PATTERN,SURFSCAN_CLICK,VALIDATE_DOPANT,VALIDATE_MINMAX,SET_SCANNED_IMAGE,VALIDATE_RECIPE,AKRION_RECIPE_CHECK,TW_TYPE_CHECK'
|
||||||
convert ',' to @fm in Branches
|
convert ',' to @fm in Branches
|
||||||
locate Branch in Branches using @fm setting Bpos then
|
locate Branch in Branches using @fm setting Bpos then
|
||||||
on Bpos gosub load_surface_def, set_measure, load_tool_recipe, surfscan_click, validate_dopant, validate_minmax, set_scanned_image, validate_recipe, akrion_recipe_check, tw_type_check
|
on Bpos gosub load_surface_def, set_measure, load_tool_recipe, load_tool_pattern, surfscan_click, validate_dopant, validate_minmax, set_scanned_image, validate_recipe, akrion_recipe_check, tw_type_check
|
||||||
end else
|
end else
|
||||||
Void = msg( '', 'Invalid Branch ':Bpos:' passed to prod_spec_comm' )
|
Void = msg( '', 'Invalid Branch ':Bpos:' passed to prod_spec_comm' )
|
||||||
end
|
end
|
||||||
@ -111,13 +112,24 @@ return
|
|||||||
LOAD_TOOL_RECIPE:
|
LOAD_TOOL_RECIPE:
|
||||||
Tool = get_property( @window:'.TOOL', 'TEXT' )
|
Tool = get_property( @window:'.TOOL', 'TEXT' )
|
||||||
convert @lower_case to @upper_case in Tool
|
convert @lower_case to @upper_case in Tool
|
||||||
RecipeList = xlate( 'LISTBOX_CONFIG', Tool:'_RECIPES', '', 'X' )
|
RecipeList = xlate( 'TOOL_CLASS', Tool, TOOL_CLASS_RECIPES$, 'X' )
|
||||||
convert @vm to @fm in RecipeList
|
convert @vm to @fm in RecipeList
|
||||||
if RecipeList <> '' then
|
if RecipeList <> '' then
|
||||||
Void = set_property( @window:'.RECIPE', 'LIST', RecipeList )
|
Void = set_property( @window:'.RECIPE', 'LIST', RecipeList )
|
||||||
end
|
end
|
||||||
return
|
return
|
||||||
*============================================================================*
|
*============================================================================*
|
||||||
|
*============================================================================*
|
||||||
|
LOAD_TOOL_PATTERN:
|
||||||
|
Tool = get_property( @window:'.TOOL', 'TEXT' )
|
||||||
|
convert @lower_case to @upper_case in Tool
|
||||||
|
PatternList = Xlate('TOOL_CLASS', Tool, TOOL_CLASS_PATTERN$, 'X')
|
||||||
|
CONVERT @VM To @FM IN PatternList
|
||||||
|
If PatternList Ne '' Then
|
||||||
|
Void = Set_Property(@Window:'.PATTERN', 'LIST', PatternList)
|
||||||
|
End
|
||||||
|
return
|
||||||
|
*============================================================================*
|
||||||
SURFSCAN_CLICK:
|
SURFSCAN_CLICK:
|
||||||
CtrlToUse = get_property( @window, '@SurfScanCtl' )
|
CtrlToUse = get_property( @window, '@SurfScanCtl' )
|
||||||
if get_property( @window:'.':CtrlToUse, 'CHECK' ) then
|
if get_property( @window:'.':CtrlToUse, 'CHECK' ) then
|
||||||
|
|||||||
@ -34,11 +34,12 @@ $Insert QA_MET_EQUATES
|
|||||||
$Insert RDS_TEST_EQUATES
|
$Insert RDS_TEST_EQUATES
|
||||||
$Insert RDS_TEST_PROP_EQUATES
|
$Insert RDS_TEST_PROP_EQUATES
|
||||||
$Insert PRS_LAYER_EQU
|
$Insert PRS_LAYER_EQU
|
||||||
|
$Insert PRS_PROP_EQUATES
|
||||||
|
|
||||||
Options SpecTypes = 'CLEAN', 'SURFSCAN', 'THICK', 'THICKA', 'RES', 'SRES', 'CRES', 'CONC'
|
Options SpecTypes = 'CLEAN', 'SURFSCAN', 'THICK', 'THICKA', 'RES', 'SRES', 'CRES', 'CONC'
|
||||||
|
|
||||||
Declare function Database_Services, Psn_Services, obj_Prod_Spec, Error_Services, SRP_JSON, Cust_Epi_Part_Services
|
Declare function Database_Services, Psn_Services, obj_Prod_Spec, Error_Services, SRP_JSON, Cust_Epi_Part_Services
|
||||||
Declare function Prod_Ver_Services, PRS_Stage_Services, SRP_Array
|
Declare function Prod_Ver_Services, PRS_Stage_Services, SRP_Array, Tool_Class_Services
|
||||||
Declare subroutine Database_Services, Psn_Services, Error_Services, SRP_JSON, Extract_Si_Keys
|
Declare subroutine Database_Services, Psn_Services, Error_Services, SRP_JSON, Extract_Si_Keys
|
||||||
|
|
||||||
GoToService else
|
GoToService else
|
||||||
@ -104,6 +105,77 @@ Service GetRecipes(PSNo)
|
|||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
Service GetMetrologyRecipesAndPatterns(PSNo)
|
||||||
|
|
||||||
|
ErrorMsg = ''
|
||||||
|
RecipesAndPatterns = ''
|
||||||
|
CurrIdx = 1
|
||||||
|
If PSNo NE '' then
|
||||||
|
If RowExists('PROD_SPEC', PSNo) then
|
||||||
|
PropKeys = ''
|
||||||
|
Extract_Si_Keys('PRS_PROP', 'PS_NO', PSNo, PropKeys)
|
||||||
|
for each PropKey in PropKeys using @VM setting pPos
|
||||||
|
Recipe = Xlate('PRS_PROP', PropKey, PRS_PROP_RECIPE$, 'X')
|
||||||
|
Pattern = Xlate('PRS_PROP', PropKey, PRS_PROP_PATTERN$, 'X')
|
||||||
|
Tool = Xlate('PRS_PROP', PropKey, PRS_PROP_TOOL$, 'X')
|
||||||
|
Convert @LOWER_CASE to @UPPER_CASE in Tool
|
||||||
|
|
||||||
|
If Recipe NE '' and Pattern NE '' and Tool NE '' then
|
||||||
|
PatternSize = Tool_Class_Services('GetNumberOfPointsForPattern', Tool, Pattern)
|
||||||
|
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
Entry = Recipe:@VM:Pattern:@VM:PatternSize:@VM:Tool
|
||||||
|
RecipesAndPatterns<CurrIdx> = Entry
|
||||||
|
CurrIdx = CurrIdx + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
Next PropKey
|
||||||
|
|
||||||
|
PRSStageKeys = ''
|
||||||
|
Extract_Si_Keys('PRS_STAGE', 'PS_NO', PSNo, PRSStageKeys)
|
||||||
|
for each PRSStageKey in PRSStageKeys using @VM setting sPos
|
||||||
|
Recipes = Xlate('PRS_STAGE', PRSStageKey, PRS_STAGE_MET_RECIPE$, 'X')
|
||||||
|
for each Recipe in Recipes using @VM setting rPos
|
||||||
|
Pattern = Xlate('PRS_STAGE', PRSStageKey, PRS_STAGE_MET_RECIPE_PATTERN$, 'X')<1, rPos>
|
||||||
|
Tool = Xlate('PRS_STAGE', PRSStageKey, PRS_STAGE_MET_TOOL_CLASS$, 'X')<1, rPos>
|
||||||
|
Convert @LOWER_CASE to @UPPER_CASE in Tool
|
||||||
|
|
||||||
|
If Recipe NE '' and Tool NE '' and Pattern NE '' then
|
||||||
|
PatternSize = Tool_Class_Services('GetNumberOfPointsForPattern', Tool, Pattern)
|
||||||
|
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
Entry = Recipe:@VM:Pattern:@VM:PatternSize:@VM:Tool
|
||||||
|
RecipesAndPatterns<CurrIdx> = Entry
|
||||||
|
CurrIdx = CurrIdx + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
Next Recipe
|
||||||
|
SurfScanRecipes = Xlate('PRS_STAGE', PRSStageKey, PRS_STAGE_SURFSCAN_RECIPE$, 'X')
|
||||||
|
If SurfScanRecipes NE '' then
|
||||||
|
for each SurfScanRecipe in SurfScanRecipes using @VM setting ssPos
|
||||||
|
Entry = SurfScanRecipe:@VM:'':@VM:'':@VM:'TENCOR'
|
||||||
|
RecipesAndPatterns<CurrIdx> = Entry
|
||||||
|
CurrIdx = CurrIdx + 1
|
||||||
|
Next SurfScanRecipe
|
||||||
|
end
|
||||||
|
Next PRSStageKey
|
||||||
|
|
||||||
|
RecipesAndPatterns = SRP_Array('Clean', RecipesAndPatterns, 'TrimAndMakeUnique')
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. PROD_SPEC record "':PSNo:'" does not exist.'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Null PSNo passed into service.'
|
||||||
|
end
|
||||||
|
|
||||||
|
If ErrorMsg EQ '' then
|
||||||
|
Response = RecipesAndPatterns
|
||||||
|
end else
|
||||||
|
Error_Services('Add', ErrorMsg)
|
||||||
|
end
|
||||||
|
|
||||||
|
end service
|
||||||
|
|
||||||
Service GetAllMetrologyRecipes(PSNo, GetSurfscan, GetClean, GetRes, GetThick)
|
Service GetAllMetrologyRecipes(PSNo, GetSurfscan, GetClean, GetRes, GetThick)
|
||||||
|
|
||||||
Recipes = ''
|
Recipes = ''
|
||||||
@ -1085,6 +1157,22 @@ Service ConvertRecordToJSON(KeyID, Record, ItemURL)
|
|||||||
SRP_JSON(objStageArray, 'Release')
|
SRP_JSON(objStageArray, 'Release')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
RecipesAndPatterns = PSN_Services('GetMetrologyRecipesAndPatterns', KeyID)
|
||||||
|
If SRP_JSON(objRecipesAndPatternsArray, 'New', 'Array') then
|
||||||
|
for each RecipeAndPattern in RecipesAndPatterns using @FM setting rpPos
|
||||||
|
If SRP_JSON(objRecipeAndPattern, 'New', 'Object') then
|
||||||
|
SRP_JSON(objRecipeAndPattern, 'SetValue', 'recipe', RecipeAndPattern<1, 1>, 'String')
|
||||||
|
SRP_JSON(objRecipeAndPattern, 'SetValue', 'pattern', RecipeAndPattern<1, 2>, 'String')
|
||||||
|
SRP_JSON(objRecipeAndPattern, 'SetValue', 'patternSize', RecipeAndPattern<1, 3>, 'Number')
|
||||||
|
SRP_JSON(objRecipeAndPattern, 'SetValue', 'tool', RecipeAndPattern<1, 4>, 'String')
|
||||||
|
SRP_JSON(objRecipesAndPatternsArray, 'Add', objRecipeAndPattern)
|
||||||
|
SRP_JSON(objRecipeAndPattern, 'Release')
|
||||||
|
end
|
||||||
|
Next RecipeAndPattern
|
||||||
|
SRP_JSON(objProdSpec, 'Set', 'recipesAndPatterns', objRecipesAndPatternsArray)
|
||||||
|
SRP_JSON(objRecipesAndPatternsArray, 'Release')
|
||||||
|
end
|
||||||
|
|
||||||
SRP_JSON(objJSON, 'Set', 'prodSpec', objProdSpec)
|
SRP_JSON(objJSON, 'Set', 'prodSpec', objProdSpec)
|
||||||
SRP_JSON(objProdSpec, 'Release')
|
SRP_JSON(objProdSpec, 'Release')
|
||||||
end
|
end
|
||||||
@ -1167,3 +1255,4 @@ return
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -145,7 +145,7 @@ Declare subroutine RTI_Set_Debugger, Database_Services, Btree.Extract, Extract_
|
|||||||
Declare subroutine Set_Status, Sleepery, Winyield, Yield, SRP_COM, QA_Services, Logging_Services, Obj_RDS
|
Declare subroutine Set_Status, Sleepery, Winyield, Yield, SRP_COM, QA_Services, Logging_Services, Obj_RDS
|
||||||
Declare subroutine Validate, obj_WO_Mat, obj_WO_Mat_Log, obj_React_Status, Record_Lock, obj_React_State, obj_Post_Log
|
Declare subroutine Validate, obj_WO_Mat, obj_WO_Mat_Log, obj_React_Status, Record_Lock, obj_React_State, obj_Post_Log
|
||||||
Declare subroutine RDS_Services, obj_WO_React, RDS_React_Run, Signature_Services, SQL_Services, SRP_Stopwatch
|
Declare subroutine RDS_Services, obj_WO_React, RDS_React_Run, Signature_Services, SQL_Services, SRP_Stopwatch
|
||||||
Declare subroutine Override_Services, Reactor_Services, Lot_Services, Obj_Notes, Mona_Services, Service_Services
|
Declare subroutine Override_Services, Reactor_Services, Lot_Services, Mona_Services, Service_Services, Obj_Notes
|
||||||
Declare subroutine Transaction_Services
|
Declare subroutine Transaction_Services
|
||||||
Declare function SRP_Sort_Array, Metrology_Services, obj_RDS_Test, obj_Test_Point_Map, Database_Services
|
Declare function SRP_Sort_Array, Metrology_Services, obj_RDS_Test, obj_Test_Point_Map, Database_Services
|
||||||
Declare function Work_Order_Services, SRP_JSON, Logging_Services, Environment_Services, SRP_Trim, Error_Services
|
Declare function Work_Order_Services, SRP_JSON, Logging_Services, Environment_Services, SRP_Trim, Error_Services
|
||||||
@ -1828,22 +1828,6 @@ Service SignPreEpiStage(RDSNo, Username, WaferQty, Reactor, ScanEntry)
|
|||||||
PSNo = RDSRec<RDS_PROD_SPEC_ID$>
|
PSNo = RDSRec<RDS_PROD_SPEC_ID$>
|
||||||
WOStep = Xlate('RDS', RDSNo, 'WO_STEP', 'X')
|
WOStep = Xlate('RDS', RDSNo, 'WO_STEP', 'X')
|
||||||
|
|
||||||
BEGIN CASE
|
|
||||||
CASE OrgReactNo = '' AND Reactor NE ''
|
|
||||||
obj_WO_React('AddRdsNo',WONo:@RM:WOStep:@RM:Reactor:@RM:RDSNo:@RM:CassNo:@RM:PSNo)
|
|
||||||
|
|
||||||
CASE OrgReactNo NE '' AND Reactor = ''
|
|
||||||
obj_WO_React('RemRdsNo',WONo:@RM:WOStep:@RM:OrgReactNo:@RM:RDSNo:@RM:CassNo:@RM:PSNo)
|
|
||||||
|
|
||||||
CASE OrgReactNo NE Reactor
|
|
||||||
obj_WO_React('RemRdsNo',WONo:@RM:WOStep:@RM:OrgReactNo:@RM:RDSNo:@RM:CassNo:@RM:PSNo)
|
|
||||||
obj_WO_React('AddRdsNo',WONo:@RM:WOStep:@RM:Reactor:@RM:RDSNo:@RM:CassNo:@RM:PSNo)
|
|
||||||
|
|
||||||
CASE Otherwise$
|
|
||||||
NULL
|
|
||||||
|
|
||||||
END CASE
|
|
||||||
|
|
||||||
// Need to update/save RDS record before calling RDS_React_Run
|
// Need to update/save RDS record before calling RDS_React_Run
|
||||||
RDSRec<RDS_REACTOR$> = Reactor
|
RDSRec<RDS_REACTOR$> = Reactor
|
||||||
RDSRec<RDS_VERIFY_QTY$> = WaferQty
|
RDSRec<RDS_VERIFY_QTY$> = WaferQty
|
||||||
@ -2013,11 +1997,11 @@ end service
|
|||||||
Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOpt)
|
Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOpt)
|
||||||
StartTick = GetTickCount()
|
StartTick = GetTickCount()
|
||||||
MetricName = 'LoadSignatureReady'
|
MetricName = 'LoadSignatureReady'
|
||||||
|
ErrorMsg = ''
|
||||||
Error_Services('Clear')
|
Error_Services('Clear')
|
||||||
If (RDSNo EQ '') or (Username EQ '') or (WaferQty EQ '') then
|
If (RDSNo EQ '') or (Username EQ '') or (WaferQty EQ '') then
|
||||||
ErrorMessage = 'Process Error: RDSNo, Username, or WaferQty not supplied in the ':Service:' service.'
|
ErrorMsg = 'Process Error: RDSNo, Username, or WaferQty not supplied in the ':Service:' service.'
|
||||||
Error_Services('Set', ErrorMessage)
|
Error_Services('Set', ErrorMsg)
|
||||||
Response = False$
|
Response = False$
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
@ -2055,15 +2039,15 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
|
|||||||
ReactorCapacity = Reactor_Services('GetReactorAvailChamberCount', Reactor)
|
ReactorCapacity = Reactor_Services('GetReactorAvailChamberCount', Reactor)
|
||||||
If ReactorCapacity LE 0 then
|
If ReactorCapacity LE 0 then
|
||||||
|
|
||||||
ErrorMessage = 'Process Error: Reactor ' : Reactor : ' does not have the capacity for this lot.'
|
ErrorMsg = 'Process Error: Reactor ' : Reactor : ' does not have the capacity for this lot.'
|
||||||
Error_Services('Set', ErrorMessage)
|
Error_Services('Set', ErrorMsg)
|
||||||
Response = False$
|
Response = False$
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
If WaferQty NE SchedQty then
|
If WaferQty NE SchedQty then
|
||||||
ErrorMessage = 'Process Error: Verified wafer quantity does not match the scheduled quantity.'
|
ErrorMsg = 'Process Error: Verified wafer quantity does not match the scheduled quantity.'
|
||||||
Error_Services('Set', ErrorMessage)
|
Error_Services('Set', ErrorMsg)
|
||||||
Response = False$
|
Response = False$
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
@ -2083,8 +2067,8 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
|
|||||||
// the parameters. If they do not confirm them, then we need to stop the load signature.
|
// the parameters. If they do not confirm them, then we need to stop the load signature.
|
||||||
RDSLayerAckReq = Xlate('RDS', RDSNo, 'RDS_LAYER_ACK_REQ', 'X')
|
RDSLayerAckReq = Xlate('RDS', RDSNo, 'RDS_LAYER_ACK_REQ', 'X')
|
||||||
If RDSLayerAckReq EQ True$ then
|
If RDSLayerAckReq EQ True$ then
|
||||||
ErrorMessage = 'RDS layer parameters must be reviewed for accuracy and acknowledged before the load operation can be signed.'
|
ErrorMsg = 'RDS layer parameters must be reviewed for accuracy and acknowledged before the load operation can be signed.'
|
||||||
Error_Services('Set', ErrorMessage)
|
Error_Services('Set', ErrorMsg)
|
||||||
Response = False$
|
Response = False$
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
@ -2167,9 +2151,9 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
|
|||||||
ROTRStatus = ReactorRec<REACTOR_ROTR_STATUS$>
|
ROTRStatus = ReactorRec<REACTOR_ROTR_STATUS$>
|
||||||
|
|
||||||
If ROTRStatus EQ 'F' then
|
If ROTRStatus EQ 'F' then
|
||||||
ErrorMessage = 'Process Error: Unable to load reactor due to ROTR load block. ' |
|
ErrorMsg = 'Process Error: Unable to load reactor due to ROTR load block. ' |
|
||||||
: 'A lead or supervisor must clear the ROTR load block.'
|
: 'A lead or supervisor must clear the ROTR load block.'
|
||||||
Error_Services('Set', ErrorMessage)
|
Error_Services('Set', ErrorMsg)
|
||||||
Response = False$
|
Response = False$
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
@ -2252,35 +2236,149 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
|
|||||||
// Add check for supplement signatures
|
// Add check for supplement signatures
|
||||||
UnacknowledgedSupp = Supplement_Services('UnacknowledgedSupplementCheck', 'RDS', RDSNo, 'LOAD')
|
UnacknowledgedSupp = Supplement_Services('UnacknowledgedSupplementCheck', 'RDS', RDSNo, 'LOAD')
|
||||||
If UnacknowledgedSupp NE FALSE$ then
|
If UnacknowledgedSupp NE FALSE$ then
|
||||||
ErrorMessage = 'The LOAD stage supplements must be acknowledged before the load operation can be signed.'
|
ErrorMsg = 'The LOAD stage supplements must be acknowledged before the load operation can be signed.'
|
||||||
Error_Services('Set', ErrorMessage)
|
Error_Services('Set', ErrorMsg)
|
||||||
Response = False$
|
Response = False$
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
If Error_Services('NoError') then
|
EndTick = GetTickCount()
|
||||||
|
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||||
|
|
||||||
|
If ErrorMsg EQ '' then
|
||||||
Response = True$
|
Response = True$
|
||||||
end else
|
end else
|
||||||
Response = False$
|
Response = False$
|
||||||
|
Error_Services('Add', ErrorMsg)
|
||||||
end
|
end
|
||||||
|
|
||||||
EndTick = GetTickCount()
|
end service
|
||||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
|
||||||
|
Service UnsignLoadSignatureReady(RDSNo)
|
||||||
|
|
||||||
|
ErrorMessage = ''
|
||||||
|
UnsignEligible = True$
|
||||||
|
|
||||||
|
If RowExists('RDS', RDSNo) then
|
||||||
|
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo, True$, 0, False$)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
WONo = RDSRec<RDS_WO$>
|
||||||
|
CassNo = RDSRec<RDS_CASS_NO$>
|
||||||
|
WoMatKey = WONo : '*' : CassNo
|
||||||
|
If RowExists('WO_MAT', WoMatKey) then
|
||||||
|
WOMatCurrStatus = obj_WO_Mat('CurrStatus',WOMatKey)
|
||||||
|
|
||||||
|
//Cases to check for various statuses that should block unsigning the unload.
|
||||||
|
Begin Case
|
||||||
|
Case WOMatCurrStatus EQ 'HOLD'
|
||||||
|
ErrorMessage = 'Cassette is on HOLD and may not have the signature removed.'
|
||||||
|
Case Otherwise$
|
||||||
|
|
||||||
|
End Case
|
||||||
|
|
||||||
|
If ErrorMessage EQ '' then
|
||||||
|
//Check if any subsequent signature are set. If so RDS is not eligible.
|
||||||
|
UnloadExtra1Sig = RDSRec<RDS_OP_OUT_EX1$>
|
||||||
|
LoadExtra1Sig = RDSRec<RDS_OP_IN_EX2$>
|
||||||
|
UnloadExtra2Sig = RDSRec<RDS_OP_OUT_EX2$>
|
||||||
|
LoadExtra2Sig = RDSRec<RDS_OP_IN_EX3$>
|
||||||
|
UnloadSig = RDSRec<RDS_OPERATOR_OUT$>Xlate('RDS', RDSNo, 'OPERATOR_OUT', 'X')
|
||||||
|
CISigs = Xlate('RDS', RDSNo, 'LWI_CI_SIG', 'X')
|
||||||
|
swap @VM with '' in CISigs
|
||||||
|
ReactorType = XLATE('RDS', RDSNo, 'REACTOR_TYPE', 'X')
|
||||||
|
If ReactorType NE 'EPP' Then
|
||||||
|
FQASig = Xlate('RDS', RDSNo, 'SUP_VER_SIG', 'X')
|
||||||
|
end else
|
||||||
|
WMOutKey = Xlate('RDS', RDSNo, 'WM_OUT_KEY', 'X')
|
||||||
|
FQASig = Xlate('WM_OUT', WMOutKey, 'SUP_VER_SIG', 'X')
|
||||||
|
end
|
||||||
|
|
||||||
|
Begin Case
|
||||||
|
Case FQASig NE ''
|
||||||
|
ErrorMessage = 'FQA Signature is set.'
|
||||||
|
Case CISigs NE ''
|
||||||
|
ErrorMessage = 'Clean and Inspect Signatures are set.'
|
||||||
|
Case UnloadSig NE ''
|
||||||
|
ErrorMessage = 'Unload signature is set.'
|
||||||
|
Case LoadExtra2Sig NE ''
|
||||||
|
ErrorMessage = 'Load extra 2 signature is set.'
|
||||||
|
Case UnloadExtra2Sig NE ''
|
||||||
|
ErrorMessage = 'Unload extra 2 signature is set.'
|
||||||
|
Case LoadExtra1Sig NE ''
|
||||||
|
ErrorMessage = 'Load extra 1 signature is set.'
|
||||||
|
Case UnloadExtra1Sig NE ''
|
||||||
|
ErrorMessage = 'Unload extra 1 signature is set.'
|
||||||
|
End Case
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMessage = 'Unable to locate the WO_MAT record for this RDS in the WO_MAT table.'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMessage = 'Error reading RDS Record. ' : Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
|
||||||
|
end else
|
||||||
|
ErrorMessage = 'Unable to locate RDS in the RDS Table.'
|
||||||
|
end
|
||||||
|
|
||||||
|
If ErrorMessage NE '' then
|
||||||
|
UnsignEligible = False$
|
||||||
|
ErrorMessage = 'Process Error: Unable to verify the load signature is Eligible to be unsigned: ' : ErrorMessage
|
||||||
|
Error_Services('Add', ErrorMessage)
|
||||||
|
end
|
||||||
|
|
||||||
|
Response = UnsignEligible
|
||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
Service LoadExtra1stReady(RDSNo)
|
Service LoadExtra1stReady(RDSNo)
|
||||||
|
|
||||||
|
ErrorMsg = ''
|
||||||
Response = False$
|
Response = False$
|
||||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||||
|
if Error_Services('NoError') then
|
||||||
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
||||||
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
|
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
|
||||||
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
|
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
|
||||||
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
|
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
|
||||||
LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$>
|
LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$>
|
||||||
StandardUnloadSignature = RDSRec<RDS_OPERATOR_OUT$>
|
StandardUnloadSignature = RDSRec<RDS_OPERATOR_OUT$>
|
||||||
|
Reactor = RDSRec<RDS_REACTOR$>
|
||||||
|
|
||||||
|
If Reactor NE '' then
|
||||||
|
WONo = RDSRec<RDS_WO$>
|
||||||
|
Query = 'SELECT REACT_STATE WITH SCHED_WO CONTAINING ':WONo
|
||||||
|
GoSub ClearCursors
|
||||||
|
Set_Status(0)
|
||||||
|
RList(Query, TARGET_ACTIVELIST$, '', '' '')
|
||||||
|
SchedReactors = ''
|
||||||
|
EOF = False$
|
||||||
|
Loop
|
||||||
|
ReadNext SchedReactor else EOF = True$
|
||||||
|
Until EOF
|
||||||
|
SchedReactors<0, -1> = SchedReactor
|
||||||
|
Repeat
|
||||||
|
|
||||||
|
Locate Reactor in SchedReactors using @VM setting vPos then
|
||||||
If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature EQ '' And LoadExtra2Signature EQ ''AND UnloadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
|
If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature EQ '' And LoadExtra2Signature EQ ''AND UnloadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
|
||||||
Response = True$
|
Response = True$
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'RDS is not eligible to have Load Extra 1 signed.'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Swap @VM with ',' in SchedReactors
|
||||||
|
ErrorMsg = 'Assigned reactor, ':Reactor:', does not equal any scheduled reactor(s), ':SchedReactors:'.'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
|
||||||
|
If ErrorMsg NE '' then
|
||||||
|
Error_Services('Add', ErrorMsg)
|
||||||
end
|
end
|
||||||
|
|
||||||
end service
|
end service
|
||||||
@ -2288,8 +2386,10 @@ end service
|
|||||||
|
|
||||||
Service UnsignLoadExtra1stReady(RDSNo)
|
Service UnsignLoadExtra1stReady(RDSNo)
|
||||||
|
|
||||||
|
ErrorMsg = ''
|
||||||
Response = False$
|
Response = False$
|
||||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||||
|
if Error_Services('NoError') then
|
||||||
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
||||||
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
|
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
|
||||||
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
|
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
|
||||||
@ -2301,22 +2401,63 @@ Service UnsignLoadExtra1stReady(RDSNo)
|
|||||||
Response = True$
|
Response = True$
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
|
||||||
|
If ErrorMsg NE '' then
|
||||||
|
Error_Services('Add', ErrorMsg)
|
||||||
|
end
|
||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
Service LoadExtra2ndReady(RDSNo)
|
Service LoadExtra2ndReady(RDSNo)
|
||||||
|
|
||||||
|
ErrorMsg = ''
|
||||||
Response = False$
|
Response = False$
|
||||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||||
|
If Error_Services('NoError') then
|
||||||
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
||||||
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
|
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
|
||||||
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
|
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
|
||||||
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
|
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
|
||||||
LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$>
|
LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$>
|
||||||
StandardUnloadSignature = RDSRec<RDS_OPERATOR_OUT$>
|
StandardUnloadSignature = RDSRec<RDS_OPERATOR_OUT$>
|
||||||
|
Reactor = RDSRec<RDS_REACTOR$>
|
||||||
|
|
||||||
|
If Reactor NE '' then
|
||||||
|
WONo = RDSRec<RDS_WO$>
|
||||||
|
Query = 'SELECT REACT_STATE WITH SCHED_WO CONTAINING ':WONo
|
||||||
|
ClearSelect
|
||||||
|
Set_Status(0)
|
||||||
|
RList(Query, TARGET_ACTIVELIST$, '', '' '')
|
||||||
|
SchedReactors = ''
|
||||||
|
EOF = False$
|
||||||
|
Loop
|
||||||
|
ReadNext SchedReactor else EOF = True$
|
||||||
|
Until EOF
|
||||||
|
SchedReactors<0, -1> = SchedReactor
|
||||||
|
Repeat
|
||||||
|
|
||||||
|
Locate Reactor in SchedReactors using @VM setting vPos then
|
||||||
If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature NE '' AND UnloadExtra2Signature NE '' And LoadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
|
If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature NE '' AND UnloadExtra2Signature NE '' And LoadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
|
||||||
Response = True$
|
Response = True$
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'RDS is not eligible to have the Load Extra 2 set.'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Swap @VM with ',' in SchedReactors
|
||||||
|
ErrorMsg = 'Assigned reactor, ':Reactor:', does not equal any scheduled reactor(s), ':SchedReactors:'.'
|
||||||
|
Response = False$
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
|
||||||
|
If ErrorMsg NE '' then
|
||||||
|
Error_Services('Add', ErrorMsg)
|
||||||
end
|
end
|
||||||
|
|
||||||
end service
|
end service
|
||||||
@ -2324,8 +2465,10 @@ end service
|
|||||||
|
|
||||||
Service UnsignLoadExtra2ndReady(RDSNo)
|
Service UnsignLoadExtra2ndReady(RDSNo)
|
||||||
|
|
||||||
|
ErrorMsg = ''
|
||||||
Response = False$
|
Response = False$
|
||||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||||
|
If Error_Services('NoError') then
|
||||||
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
||||||
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
|
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
|
||||||
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
|
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
|
||||||
@ -2337,6 +2480,13 @@ Service UnsignLoadExtra2ndReady(RDSNo)
|
|||||||
Response = True$
|
Response = True$
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
|
||||||
|
If ErrorMsg NE '' then
|
||||||
|
Error_Services('Add', ErrorMsg)
|
||||||
|
end
|
||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
@ -2401,62 +2551,6 @@ Service SignLoadStage(RDSNo, Username, WaferQty, LLSide, ScanEntry)
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
IF ReactorType NE 'EPP' THEN
|
|
||||||
|
|
||||||
WOMatRec = XLATE('WO_MAT',WONo:'*':CassNo,'','X')
|
|
||||||
WOMatSigProfile = WOMatRec<WO_MAT_SIG_PROFILE$>
|
|
||||||
SigAction = WOStep:'LOAD'
|
|
||||||
|
|
||||||
LOCATE SigAction IN WOMatSigProfile USING @VM SETTING Pos THEN
|
|
||||||
WOMatSig = WOMatRec<WO_MAT_SIGNATURE$,Pos>
|
|
||||||
CurrDTM = OCONV(WOMatRec<WO_MAT_SIG_DTM$,Pos>,'DT/4^HS')
|
|
||||||
END ELSE
|
|
||||||
WOMatSig = ''
|
|
||||||
END
|
|
||||||
RDSSig = Xlate('RDS', RDSNo, 'OPERATOR_IN', 'X')
|
|
||||||
|
|
||||||
BEGIN CASE
|
|
||||||
CASE WOMatSig = '' AND RDSSig NE ''
|
|
||||||
|
|
||||||
* Signature missing on WO_MAT
|
|
||||||
SigDate = RDSRec<RDS_DATE_IN$>
|
|
||||||
SigTime = RDSRec<RDS_TIME_IN$>
|
|
||||||
owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:'LOAD':@RM:RDSSig:@RM:SigDate:' ':SigTime
|
|
||||||
* Sets LOAD signature
|
|
||||||
IF Get_Status(errCode) THEN
|
|
||||||
ErrorMsg = 'Process Error: Error calling obj_WO_Mat("SetSignature"). Error code: ':errCode
|
|
||||||
Error_Services('Set', ErrorMsg)
|
|
||||||
Response = False$
|
|
||||||
END else
|
|
||||||
Response = True$
|
|
||||||
end
|
|
||||||
return
|
|
||||||
|
|
||||||
CASE RDSSig = '' AND WOMatSig NE ''
|
|
||||||
|
|
||||||
* Signature missing on RDS
|
|
||||||
CurrDate = CurrDTM[1,' ']
|
|
||||||
CurrTime = CurrDTM[COL2()+1,' ']
|
|
||||||
RDSRec<RDS_OPERATOR_IN$> = WOMatSig
|
|
||||||
RDSRec<RDS_DATE_IN$> = IConv(CurrDate, 'D')
|
|
||||||
RDSRec<RDS_TIME_IN$> = IConv(CurrTime, 'MT')
|
|
||||||
Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$)
|
|
||||||
Response = True$
|
|
||||||
return
|
|
||||||
|
|
||||||
CASE RDSSig NE '' AND WOMatSig NE ''
|
|
||||||
ErrorMsg = 'Process Error: Load stage has already been signed.'
|
|
||||||
Error_Services('Set', ErrorMsg)
|
|
||||||
Response = False$
|
|
||||||
RETURN
|
|
||||||
|
|
||||||
CASE Otherwise$
|
|
||||||
Null
|
|
||||||
// Continue
|
|
||||||
END CASE
|
|
||||||
|
|
||||||
END
|
|
||||||
|
|
||||||
SigDt = OCONV( Date(), 'D2/' )
|
SigDt = OCONV( Date(), 'D2/' )
|
||||||
SigTm = OCONV( Time(), 'MTS' )
|
SigTm = OCONV( Time(), 'MTS' )
|
||||||
LoadDTM = SigDt:' ':SigTm
|
LoadDTM = SigDt:' ':SigTm
|
||||||
@ -3682,6 +3776,52 @@ Service SignFQAStage(RDSNo, Username)
|
|||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
Service UnsignPreEpiReady(RDSNo)
|
||||||
|
|
||||||
|
ErrorMsg = ''
|
||||||
|
UnsignPreEpiReady = False$
|
||||||
|
|
||||||
|
If RDSNo NE '' then
|
||||||
|
If RowExists('RDS', RDSNo) then
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
//Call on the same logic to determine if the unsign LOAD signature is ready
|
||||||
|
UnsignLoadReady = QA_Services('UnsignLoadSignatureReady', RDSNo)
|
||||||
|
if Error_Services('NoError') then
|
||||||
|
If UnsignLoadReady then
|
||||||
|
//Check if LOAD signature is present
|
||||||
|
LoadSig = Database_Services('ReadDataColumn', 'RDS', RDSNo, RDS_OPERATOR_IN$, True$, 0, False$)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
If LoadSig EQ '' then
|
||||||
|
UnsignPreEpiReady = True$
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Load signature is set.'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'A signature beyond pre-epi exists. Please check later stages of this RDS.'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'RDS ' : RDSNo : ' was not found in database.'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'RDS No was null'
|
||||||
|
end
|
||||||
|
|
||||||
|
If ErrorMsg NE '' then
|
||||||
|
Error_Services('Add', ErrorMsg)
|
||||||
|
end
|
||||||
|
|
||||||
|
Response = UnsignPreEpiReady
|
||||||
|
|
||||||
|
end service
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Internal GoSubs
|
// Internal GoSubs
|
||||||
@ -3695,3 +3835,12 @@ ClearCursors:
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -67,7 +67,8 @@ Declare function Error_Services, Database_Services, obj_RDS_Test, Logging_Ser
|
|||||||
Declare function Tool_Parms_Services, Signature_Services, obj_WO_Mat_QA, Datetime, Override_Services
|
Declare function Tool_Parms_Services, Signature_Services, obj_WO_Mat_QA, Datetime, Override_Services
|
||||||
Declare function Rds_Services, SRP_DateTime, SRP_Math, obj_WO_Mat, Lot_Services, SRP_Array
|
Declare function Rds_Services, SRP_DateTime, SRP_Math, obj_WO_Mat, Lot_Services, SRP_Array
|
||||||
Declare function Lot_Event_Services, GetTickCount, Work_Order_Services
|
Declare function Lot_Event_Services, GetTickCount, Work_Order_Services
|
||||||
Declare subroutine Error_Services, Database_Services, Logging_Services, Service_Services, Mona_Services
|
Declare subroutine Error_Services, Database_Services, Logging_Services, Service_Services, obj_WO_React
|
||||||
|
Declare Subroutine Mona_Services
|
||||||
|
|
||||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\RDS'
|
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\RDS'
|
||||||
LogDate = Oconv(Date(), 'D4/')
|
LogDate = Oconv(Date(), 'D4/')
|
||||||
@ -623,6 +624,7 @@ return
|
|||||||
|
|
||||||
WRITE_RECORD_PRE:
|
WRITE_RECORD_PRE:
|
||||||
|
|
||||||
|
ErrorMsg = ''
|
||||||
StartTick = GetTickCount()
|
StartTick = GetTickCount()
|
||||||
MetricName = 'WriteRecordPre'
|
MetricName = 'WriteRecordPre'
|
||||||
|
|
||||||
@ -769,7 +771,7 @@ WRITE_RECORD_PRE:
|
|||||||
|
|
||||||
Begin Case
|
Begin Case
|
||||||
|
|
||||||
Case ( (OrigLoadSig NE '') and (OrigReactor NE NewReactor) )
|
Case ( (OrigTimeOutSig NE '') and (OrigReactor NE NewReactor) )
|
||||||
LogData = ''
|
LogData = ''
|
||||||
LogData<1> = LoggingDTM
|
LogData<1> = LoggingDTM
|
||||||
LogData<2> = @USER4
|
LogData<2> = @USER4
|
||||||
@ -778,25 +780,8 @@ WRITE_RECORD_PRE:
|
|||||||
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
|
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
|
||||||
|
|
||||||
// User is attempting to erase data that is prohibited from being erased Set the FS104 error and block the write.
|
// User is attempting to erase data that is prohibited from being erased Set the FS104 error and block the write.
|
||||||
Error_Services('Add', 'Reactor number cannot be changed or removed once the load signature is set!')
|
ErrorMsg = 'Reactor number cannot be changed or removed once the unload signature is set!'
|
||||||
OrigFileError = 104:': Reactor number cannot be changed or removed once the load signature is set!'
|
OrigFileError = 104:': Reactor number cannot be changed or removed once the unload signature is set!'
|
||||||
Status = 0
|
|
||||||
Record = ''
|
|
||||||
ActionFlow = ACTION_STOP$
|
|
||||||
|
|
||||||
Case ( (OrigVerSig NE '') and (NewVerSig EQ '') ) or ( (OrigVerDate NE '') and (NewVerDate EQ '') ) |
|
|
||||||
or ( (OrigVerTime NE '') and (NewVerTime EQ '') ) or ( (NewVerDate EQ '') and (NewVerTime NE '') ) |
|
|
||||||
or ( (NewVerDate NE '') and (NewVerTime EQ '') )
|
|
||||||
LogData = ''
|
|
||||||
LogData<1> = LoggingDTM
|
|
||||||
LogData<2> = @USER4
|
|
||||||
LogData<3> = RDSKeyID
|
|
||||||
LogData<4> = 'Signature data cannot be removed!'
|
|
||||||
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
|
|
||||||
|
|
||||||
// User is attempting to erase data that is prohibited from being erased Set the FS104 error and block the write.
|
|
||||||
Error_Services('Add', 'Signature data cannot be removed!')
|
|
||||||
OrigFileError = 104:': Signature data cannot be removed!'
|
|
||||||
Status = 0
|
Status = 0
|
||||||
Record = ''
|
Record = ''
|
||||||
ActionFlow = ACTION_STOP$
|
ActionFlow = ACTION_STOP$
|
||||||
@ -812,7 +797,7 @@ WRITE_RECORD_PRE:
|
|||||||
LogData<4> = 'Signature datetime is greater than current datetime!'
|
LogData<4> = 'Signature datetime is greater than current datetime!'
|
||||||
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
|
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
|
||||||
|
|
||||||
Error_Services('Add', 'Signature datetime is greater than current datetime!')
|
ErrorMsg = 'Signature datetime is greater than current datetime!'
|
||||||
OrigFileError = 104:': Signature datetime is greater than current datetime!'
|
OrigFileError = 104:': Signature datetime is greater than current datetime!'
|
||||||
Status = 0
|
Status = 0
|
||||||
Record = ''
|
Record = ''
|
||||||
@ -833,7 +818,7 @@ WRITE_RECORD_PRE:
|
|||||||
LogData<4> = 'Signature datetime is less than a previous signature datetime!'
|
LogData<4> = 'Signature datetime is less than a previous signature datetime!'
|
||||||
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
|
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
|
||||||
|
|
||||||
Error_Services('Add', 'Signature datetime is less than a previous signature datetime!')
|
ErrorMsg = 'Signature datetime is less than a previous signature datetime!'
|
||||||
OrigFileError = 104:': Signature datetime is less than a previous signature datetime!'
|
OrigFileError = 104:': Signature datetime is less than a previous signature datetime!'
|
||||||
Status = 0
|
Status = 0
|
||||||
Record = ''
|
Record = ''
|
||||||
@ -848,7 +833,7 @@ WRITE_RECORD_PRE:
|
|||||||
LogData<4> = 'Cassette runtime exceeds three days!'
|
LogData<4> = 'Cassette runtime exceeds three days!'
|
||||||
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
|
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
|
||||||
|
|
||||||
Error_Services('Add', 'Cassette runtime exceeds three days!')
|
ErrorMsg = 'Cassette runtime exceeds three days!'
|
||||||
OrigFileError = 104:': Cassette runtime exceeds three days!'
|
OrigFileError = 104:': Cassette runtime exceeds three days!'
|
||||||
Status = 0
|
Status = 0
|
||||||
Record = ''
|
Record = ''
|
||||||
@ -861,6 +846,11 @@ WRITE_RECORD_PRE:
|
|||||||
|
|
||||||
EndTick = GetTickCount()
|
EndTick = GetTickCount()
|
||||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||||
|
|
||||||
|
If ErrorMsg NE '' then
|
||||||
|
Error_Services('Add', ErrorMsg)
|
||||||
|
end
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
@ -880,6 +870,32 @@ WRITE_RECORD:
|
|||||||
OrigDateOut = OrigRecord<RDS_DATE_OUT$>
|
OrigDateOut = OrigRecord<RDS_DATE_OUT$>
|
||||||
NewDateOut = Record<RDS_DATE_OUT$>
|
NewDateOut = Record<RDS_DATE_OUT$>
|
||||||
|
|
||||||
|
RDSNo = {SEQ}
|
||||||
|
Reactor = Record<RDS_REACTOR$>
|
||||||
|
OrgReactNo = OrigRecord<RDS_REACTOR$>
|
||||||
|
CassNo = Record<RDS_CASS_NO$>
|
||||||
|
PSNo = Record<RDS_PROD_SPEC_ID$>
|
||||||
|
WOStep = Xlate('RDS', RDSNo, 'WO_STEP', 'X')
|
||||||
|
|
||||||
|
BEGIN CASE
|
||||||
|
CASE OrgReactNo = '' AND Reactor NE ''
|
||||||
|
//Assignment to a reactor where there was no prior assigned reactor
|
||||||
|
obj_WO_React('AddRdsNo',WONo:@RM:WOStep:@RM:Reactor:@RM:RDSNo:@RM:CassNo:@RM:PSNo)
|
||||||
|
|
||||||
|
CASE OrgReactNo NE '' AND Reactor = ''
|
||||||
|
//Reactor Assignment is being cleared.
|
||||||
|
obj_WO_React('RemRdsNo',WONo:@RM:WOStep:@RM:OrgReactNo:@RM:RDSNo:@RM:CassNo:@RM:PSNo)
|
||||||
|
|
||||||
|
CASE OrgReactNo NE Reactor
|
||||||
|
//Reactor Assignment is changing
|
||||||
|
obj_WO_React('RemRdsNo',WONo:@RM:WOStep:@RM:OrgReactNo:@RM:RDSNo:@RM:CassNo:@RM:PSNo)
|
||||||
|
obj_WO_React('AddRdsNo',WONo:@RM:WOStep:@RM:Reactor:@RM:RDSNo:@RM:CassNo:@RM:PSNo)
|
||||||
|
|
||||||
|
CASE Otherwise$
|
||||||
|
NULL
|
||||||
|
|
||||||
|
END CASE
|
||||||
|
|
||||||
If ( ( (OrigDateOut EQ '') and (NewDateOut NE '') ) ) then
|
If ( ( (OrigDateOut EQ '') and (NewDateOut NE '') ) ) then
|
||||||
// Mark this cassette as processed in the schedule event record
|
// Mark this cassette as processed in the schedule event record
|
||||||
DatetimeOut = {DATETIME_OUT}
|
DatetimeOut = {DATETIME_OUT}
|
||||||
@ -1002,4 +1018,3 @@ Restore_System_Variables:
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -99,6 +99,13 @@ API rds.ID.PUT
|
|||||||
end api
|
end api
|
||||||
|
|
||||||
|
|
||||||
|
API rds.ID.zpl.HEAD
|
||||||
|
API rds.ID.zpl.GET
|
||||||
|
|
||||||
|
GoSub CreateZPLItem
|
||||||
|
|
||||||
|
end api
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Internal GoSubs
|
// Internal GoSubs
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
@ -128,3 +135,29 @@ CreateHALItem:
|
|||||||
end
|
end
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
// CreateZPLItem
|
||||||
|
//
|
||||||
|
// Creates a HAL+JSON object with the ZPL for the given WM_IN row
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
CreateZPLItem:
|
||||||
|
|
||||||
|
RdsKey = ParentSegment
|
||||||
|
ZPL = Rds_Services('GetRdsZpl', RdsKey)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
StatusCode = 200
|
||||||
|
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||||
|
HTTP_Services('SetResponseBody', ZPL, False$, 'text/plain')
|
||||||
|
If Assigned(Message) then
|
||||||
|
HTTP_Services('SetResponseStatus', StatusCode, Message)
|
||||||
|
end else
|
||||||
|
HTTP_Services('SetResponseStatus', StatusCode)
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Message = Error_Services('GetMessage')
|
||||||
|
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
|
||||||
|
end
|
||||||
|
|
||||||
|
return
|
||||||
|
|||||||
@ -82,8 +82,6 @@ Equ COL$MET_SIG_DTM to 12
|
|||||||
|
|
||||||
Equ MSG_WIDTH$ to 600
|
Equ MSG_WIDTH$ to 600
|
||||||
|
|
||||||
EQU READONLY_GREEN$ TO 192 + (220*256) + (192*65536)
|
|
||||||
|
|
||||||
Declare subroutine ErrMsg, Set_Status, obj_WO_Mat, obj_WO_Mat_Log, obj_RDS, Set_Property, Send_Event, Database_Services
|
Declare subroutine ErrMsg, Set_Status, obj_WO_Mat, obj_WO_Mat_Log, obj_RDS, Set_Property, Send_Event, Database_Services
|
||||||
Declare subroutine Dialog_Box, Qa_Services, Obj_React_Ll, Start_Window, obj_React_Status, Reactor_Services, Rds_Services
|
Declare subroutine Dialog_Box, Qa_Services, Obj_React_Ll, Start_Window, obj_React_Status, Reactor_Services, Rds_Services
|
||||||
Declare subroutine Lot_Event_Services, Override_Log_Services, Logging_Services
|
Declare subroutine Lot_Event_Services, Override_Log_Services, Logging_Services
|
||||||
@ -183,17 +181,20 @@ Event PUB_SIGN.CLICK()
|
|||||||
LSIDArray = Get_Property(@WINDOW:'.RDS_LS_ID','ARRAY')
|
LSIDArray = Get_Property(@WINDOW:'.RDS_LS_ID','ARRAY')
|
||||||
Preauthenticated = FALSE$
|
Preauthenticated = FALSE$
|
||||||
SignEventType = Get_Property(CtrlEntID, 'TEXT')
|
SignEventType = Get_Property(CtrlEntID, 'TEXT')
|
||||||
|
WoMatKey = WONo : '*' : CassNo
|
||||||
|
|
||||||
Begin Case
|
Begin Case
|
||||||
|
|
||||||
Case SignEventType EQ 'Sign'
|
Case SignEventType EQ 'Sign'
|
||||||
|
|
||||||
RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP')
|
RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP')
|
||||||
WfrQty = Get_Property(@WINDOW:'.WAFERS_IN','TEXT')
|
WfrQty = Get_Property(@WINDOW:'.WAFERS_IN','TEXT')
|
||||||
LLSide = Get_Property(@Window:'.LOAD_LOCK_SIDE', 'DEFPROP')
|
LLSide = Get_Property(@Window:'.LOAD_LOCK_SIDE', 'DEFPROP')
|
||||||
|
|
||||||
Reactor = Get_Property(@Window:'.REACTOR', 'TEXT')
|
Reactor = Database_Services('ReadDataColumn', 'RDS', RDSNo, RDS_REACTOR$, True$, 0, False$)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
If Reactor NE '' then
|
||||||
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', Reactor)
|
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', Reactor)
|
||||||
|
if Error_Services('NoError') then
|
||||||
ReactorType = ReactorRec<REACTOR_REACT_TYPE$>
|
ReactorType = ReactorRec<REACTOR_REACT_TYPE$>
|
||||||
ROTREnabled = Xlate('REACTOR', Reactor, 'ENABLE_ROTR', 'X')
|
ROTREnabled = Xlate('REACTOR', Reactor, 'ENABLE_ROTR', 'X')
|
||||||
|
|
||||||
@ -418,45 +419,29 @@ Event PUB_SIGN.CLICK()
|
|||||||
ErrorMsg = Error_Services('GetMessage')
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
ErrMsg(ErrorMsg)
|
ErrMsg(ErrorMsg)
|
||||||
end
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
|
Msg(@Window, ErrorMsg)
|
||||||
|
end
|
||||||
end else
|
end else
|
||||||
Msg(@Window, "Reactor load signature not allowed on a down reactor.")
|
Msg(@Window, "Reactor load signature not allowed on a down reactor.")
|
||||||
end
|
end
|
||||||
|
end else
|
||||||
|
Msg(@Window, "RDS is not assigned to a reactor.")
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
|
Msg(@Window, ErrorMsg)
|
||||||
|
end
|
||||||
GoSub OLE_LL_Status
|
GoSub OLE_LL_Status
|
||||||
Set_Property(@Window, 'SAVEWARN', False$)
|
Set_Property(@Window, 'SAVEWARN', False$)
|
||||||
Send_Event(@Window, 'READ')
|
Send_Event(@Window, 'READ')
|
||||||
|
|
||||||
Case SignEventType EQ 'Unsign'
|
Case SignEventType EQ 'Unsign'
|
||||||
// 1. Check if on hold. If so, then block event and inform user
|
// 1. Check if RDS Load signature is eligible to be set.
|
||||||
WOMatKey = WONo:'*':CassNo
|
IsEligible = QA_Services('UnsignLoadSignatureReady', RDSNo)
|
||||||
WOMatCurrStatus = obj_WO_Mat('CurrStatus',WOMatKey)
|
|
||||||
IF WOMatCurrStatus = 'HOLD' THEN
|
|
||||||
ErrorMessage = 'Process Error':@SVM:'Cassette is on Hold and may not have the signature removed.':CRLF$:CRLF$
|
|
||||||
ErrMsg(ErrorMessage)
|
|
||||||
RETURN 0
|
|
||||||
END
|
|
||||||
// 2.
|
|
||||||
// a. For Non-EPP - Check if LWII, LWIS, or FQA has been signed. If so, then block event and inform user
|
|
||||||
// b. For EPP - Check Clean_Insp actions to see if an inspection or surfscan has been completed
|
|
||||||
// Also check the FQA signature (MO_QA)
|
|
||||||
UnloadSig = Xlate('RDS', RDSNo, 'OPERATOR_OUT', 'X')
|
|
||||||
ReactorType = Xlate('RDS', RDSNo, 'REACTOR_TYPE','X')
|
|
||||||
CISigs = Xlate('RDS', RDSNo, 'LWI_CI_SIG', 'X')
|
|
||||||
Convert @VM to '' in CISigs
|
|
||||||
IF ReactorType NE 'EPP' THEN
|
|
||||||
FQASig = Xlate('RDS', RDSNo, 'SUP_VER_SIG', 'X')
|
|
||||||
END ELSE
|
|
||||||
WMOutKey = Xlate('RDS', RDSNo, 'WM_OUT_KEY', 'X')
|
|
||||||
FQASig = Xlate('WM_OUT', WMOutKey, 'SUP_VER_SIG', 'X')
|
|
||||||
END
|
|
||||||
If ( (UnloadSig NE '') or (CISigs NE '') or (FQASig NE '') ) then
|
|
||||||
// UNLOAD, LWII, LWIS, or FQA already signed. Block unload unsign event.
|
|
||||||
ErrorMessage = 'Process Error':@SVM:'UNLOAD, LWII, LWIS, or FQA already signed. Cannot unsign unload event.' |
|
|
||||||
: CRLF$ : CRLF$
|
|
||||||
ErrMsg(ErrorMessage)
|
|
||||||
Return 0
|
|
||||||
end
|
|
||||||
|
|
||||||
|
If IsEligible then
|
||||||
// 3. Lead/Supervisor/Engineer/EngTech override
|
// 3. Lead/Supervisor/Engineer/EngTech override
|
||||||
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4 : @FM : 'LEAD' : @VM : 'SUPERVISOR':@VM:'ENGINEER':@VM:'ENG_TECH')
|
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4 : @FM : 'LEAD' : @VM : 'SUPERVISOR':@VM:'ENGINEER':@VM:'ENG_TECH')
|
||||||
Valid = Response<1>
|
Valid = Response<1>
|
||||||
@ -519,7 +504,6 @@ Event PUB_SIGN.CLICK()
|
|||||||
Set_Property(@Window, 'IOOPTIONS', IOOptions)
|
Set_Property(@Window, 'IOOPTIONS', IOOptions)
|
||||||
|
|
||||||
Reactor = Get_Property(@Window:'.REACTOR', 'TEXT')
|
Reactor = Get_Property(@Window:'.REACTOR', 'TEXT')
|
||||||
Rds_Services('AddComment', RDSNo, 'Load Stage Unsigned from Reactor ' : Reactor)
|
|
||||||
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', Reactor)
|
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', Reactor)
|
||||||
PreviousRotrOverrideRds = ReactorRec<REACTOR_PREVIOUS_ROTR_OVERRIDE_RDS$>
|
PreviousRotrOverrideRds = ReactorRec<REACTOR_PREVIOUS_ROTR_OVERRIDE_RDS$>
|
||||||
|
|
||||||
@ -541,7 +525,10 @@ Event PUB_SIGN.CLICK()
|
|||||||
end else
|
end else
|
||||||
Return 0
|
Return 0
|
||||||
end
|
end
|
||||||
|
end else
|
||||||
|
ErrorMessage = Error_Services('GetMessage')
|
||||||
|
Msg(@Window, ErrorMessage)
|
||||||
|
end
|
||||||
End Case
|
End Case
|
||||||
Post_Event(@Window, 'READ')
|
Post_Event(@Window, 'READ')
|
||||||
|
|
||||||
@ -582,7 +569,6 @@ Event LL_R_STATUS.OnClick()
|
|||||||
|
|
||||||
end event
|
end event
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Internal GoSubs
|
// Internal GoSubs
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
@ -740,3 +726,6 @@ OLE_LL_Status:
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -51,8 +51,6 @@ $insert REACT_STATUS_EQUATES
|
|||||||
$insert SUPPL_INFO_ARRAY_EQU
|
$insert SUPPL_INFO_ARRAY_EQU
|
||||||
$insert CLEAN_INSP_EQUATES
|
$insert CLEAN_INSP_EQUATES
|
||||||
|
|
||||||
EQU READONLY_GREEN$ TO 192 + (220*256) + (192*65536)
|
|
||||||
|
|
||||||
Equ COL$LOG_FILE to 1
|
Equ COL$LOG_FILE to 1
|
||||||
Equ COL$LOG_DTM to 2
|
Equ COL$LOG_DTM to 2
|
||||||
Equ COL$ACTION to 3
|
Equ COL$ACTION to 3
|
||||||
@ -67,7 +65,7 @@ Equ COL$TOOL_ID to 10
|
|||||||
Declare subroutine ErrMsg, Set_Status, obj_WO_Mat, obj_WO_Mat_Log, obj_RDS, Set_Property, Send_Event, Database_Services
|
Declare subroutine ErrMsg, Set_Status, obj_WO_Mat, obj_WO_Mat_Log, obj_RDS, Set_Property, Send_Event, Database_Services
|
||||||
Declare subroutine Qa_Services, RDS_Services, Dialog_Box
|
Declare subroutine Qa_Services, RDS_Services, Dialog_Box
|
||||||
Declare function Dialog_Box, Msg, MemberOf, obj_WO_Mat, Database_Services, Get_Property, obj_React_Status, Get_Status
|
Declare function Dialog_Box, Msg, MemberOf, obj_WO_Mat, Database_Services, Get_Property, obj_React_Status, Get_Status
|
||||||
Declare function QA_Services, Database_Services, Supplement_Services
|
Declare function QA_Services, Database_Services, Supplement_Services, RDS_Services
|
||||||
|
|
||||||
SubclassInfo = Form_Services('FindSubclassControl')
|
SubclassInfo = Form_Services('FindSubclassControl')
|
||||||
Subclass = SubclassInfo<1>
|
Subclass = SubclassInfo<1>
|
||||||
@ -96,19 +94,15 @@ Return EventFlow else EVENT_CONTINUE$
|
|||||||
|
|
||||||
Event WINDOW.CREATE(CreateParam)
|
Event WINDOW.CREATE(CreateParam)
|
||||||
|
|
||||||
|
GoSub SetupControls
|
||||||
|
|
||||||
end event
|
end event
|
||||||
|
|
||||||
|
|
||||||
Event WINDOW.READ()
|
Event WINDOW.READ()
|
||||||
// Disable reactor edit line control if the RDS has been loaded.
|
|
||||||
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
|
GoSub SetupControls
|
||||||
If RDSNo NE '' then
|
|
||||||
LoadSig = Xlate('RDS', RDSNo, 'OPERATOR_IN', 'X')
|
|
||||||
If LoadSig NE '' then
|
|
||||||
Set_Property(@Window:'.REACTOR', 'ENABLED', False$)
|
|
||||||
Set_Property(@Window:'.REACTOR', 'BACKCOLOR', READONLY_GREEN$)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end event
|
end event
|
||||||
|
|
||||||
|
|
||||||
@ -132,6 +126,76 @@ end event
|
|||||||
|
|
||||||
Event PUB_SIGN.CLICK()
|
Event PUB_SIGN.CLICK()
|
||||||
|
|
||||||
|
ButtonText = Get_Property(@Window:'.PUB_SIGN', 'TEXT')
|
||||||
|
|
||||||
|
Begin Case
|
||||||
|
Case ButtonText EQ 'Sign'
|
||||||
|
GoSub SignPreEpi
|
||||||
|
Case ButtonText EQ 'Unsign'
|
||||||
|
GoSub UnsignPreEpi
|
||||||
|
End Case
|
||||||
|
|
||||||
|
If Error_Services('HasError') then
|
||||||
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
|
ErrMsg(ErrorMsg)
|
||||||
|
end
|
||||||
|
Set_Property(@Window, 'SAVEWARN', False$)
|
||||||
|
Set_Status(0)
|
||||||
|
Send_Event(@Window, 'READ')
|
||||||
|
|
||||||
|
end event
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Internal GoSubs
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
SetupControls:
|
||||||
|
|
||||||
|
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
|
||||||
|
|
||||||
|
GoSub ReactorEdlCtrlSetup
|
||||||
|
GoSub PubSignCtrlSetup
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
ReactorEdlCtrlSetup:
|
||||||
|
|
||||||
|
// Disable reactor edit line control if the RDS has been assigned.
|
||||||
|
If RDSNo NE '' then
|
||||||
|
PreEpiSig = Database_Services('ReadDataColumn', 'RDS', RDSNo, RDS_PRE_EPI_SIG$, True$, 0, False$)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
If PreEpiSig NE '' then
|
||||||
|
Set_Property(@Window:'.REACTOR', 'ENABLED', False$)
|
||||||
|
Set_Property(@Window:'.REACTOR', 'BACKCOLOR', READONLY_GREEN$)
|
||||||
|
end else
|
||||||
|
Set_Property(@Window:'.REACTOR', 'ENABLED', True$)
|
||||||
|
Set_Property(@Window:'.REACTOR', 'BACKCOLOR', EDIT_ACTIVE_WHITE$)
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Set_Property(@Window:'.REACTOR', 'ENABLED', False$)
|
||||||
|
Set_Property(@Window:'.REACTOR', 'BACKCOLOR', READONLY_GREEN$)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
PubSignCtrlSetup:
|
||||||
|
|
||||||
|
If RDSNo NE '' then
|
||||||
|
PreEpiSig = Database_Services('ReadDataColumn', 'RDS', RDSNo, RDS_PRE_EPI_SIG$, True$, 0, False$)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
If PreEpiSig NE '' then
|
||||||
|
Set_Property(@Window:'.PUB_SIGN', 'TEXT', 'Unsign')
|
||||||
|
end else
|
||||||
|
Set_Property(@Window:'.PUB_SIGN', 'TEXT', 'Sign')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
SignPreEpi:
|
||||||
|
|
||||||
RDSNo = Get_Property(@Window:'.RDS_NO' ,'DEFPROP')
|
RDSNo = Get_Property(@Window:'.RDS_NO' ,'DEFPROP')
|
||||||
WfrQty = Get_Property(@Window:'.VERIFY_QTY','TEXT')
|
WfrQty = Get_Property(@Window:'.VERIFY_QTY','TEXT')
|
||||||
Reactor = Get_Property(@Window:'.REACTOR' ,'TEXT')
|
Reactor = Get_Property(@Window:'.REACTOR' ,'TEXT')
|
||||||
@ -161,18 +225,24 @@ Event PUB_SIGN.CLICK()
|
|||||||
QA_Services('SignPreEpiStage', RDSNo, @USER4, WfrQty, Reactor)
|
QA_Services('SignPreEpiStage', RDSNo, @USER4, WfrQty, Reactor)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
If Error_Services('HasError') then
|
|
||||||
ErrorMsg = Error_Services('GetMessage')
|
return
|
||||||
ErrMsg(ErrorMsg)
|
|
||||||
|
UnsignPreEpi:
|
||||||
|
|
||||||
|
RDSNo = Get_Property(@Window:'.RDS_NO','DEFPROP')
|
||||||
|
VerCheckParams = ''
|
||||||
|
VerCheckParams<4> = 'Permission needed for Pre-Epi Unsign on RDS# ' : RDSNo
|
||||||
|
UserVerCheck = Dialog_Box('NDW_VERIFY_USER', @Window, '':@FM:'':@FM:'':@FM:VerCheckParams)
|
||||||
|
ValidUserCheck = UserVerCheck<1>
|
||||||
|
If ValidUserCheck then
|
||||||
|
ValidUserId = UserVerCheck<2>
|
||||||
|
If ValidUserId NE '' then
|
||||||
|
RDS_Services('UnsignPreEpiSignature', RDSNo, ValidUserId)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
Set_Property(@Window, 'SAVEWARN', False$)
|
|
||||||
Set_Status(0)
|
|
||||||
Send_Event(@Window, 'READ')
|
|
||||||
|
|
||||||
end event
|
return
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// Internal GoSubs
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
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 ErrMsg, Set_Status, obj_WO_Mat, obj_WO_Mat_Log, obj_RDS, Set_Property, Send_Event, Database_Services
|
||||||
Declare subroutine Dialog_Box, Msg, MemberOf, obj_WO_Mat, Get_Property, obj_React_Status, Get_Status, Override_Services
|
Declare subroutine Dialog_Box, Msg, MemberOf, obj_WO_Mat, Get_Property, obj_React_Status, Get_Status, Override_Services
|
||||||
Declare subroutine record_lock, obj_React_Status, Post_Event, obj_React_State, obj_Post_Log, Qa_Services, Reactor_Services
|
Declare subroutine record_lock, obj_React_Status, Post_Event, obj_React_State, obj_Post_Log, Qa_Services, Reactor_Services
|
||||||
Declare Subroutine Rds_Services, WO_MAT_Services, Message_Box, Reactor_Log_Services, Schedule_Services
|
Declare Subroutine Rds_Services, WO_MAT_Services, Message_Box, Reactor_Log_Services, Schedule_Services, Dialog_Response_Log_Services
|
||||||
|
|
||||||
Declare function dialog_box, msg, Get_Status, obj_WO_Mat, Get_Status, obj_Clean_Insp, obj_Reactor, Get_Property
|
Declare function dialog_box, msg, Get_Status, obj_WO_Mat, Get_Status, obj_Clean_Insp, obj_Reactor, Get_Property
|
||||||
Declare function QA_Services, Database_Services, Set_Property, Rds_Services, Qa_Services, Memberof, Reactor_Services
|
Declare function QA_Services, Database_Services, Set_Property, Rds_Services, Qa_Services, Memberof, Reactor_Services
|
||||||
@ -315,6 +315,9 @@ Event PUB_SIGN.CLICK()
|
|||||||
WoMatRecord<WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$> = TWLogResult
|
WoMatRecord<WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$> = TWLogResult
|
||||||
If TWLogResult NE True$ then
|
If TWLogResult NE True$ then
|
||||||
ErrMsg = 'Unload blocked! You must run a test wafer before signing the unload'
|
ErrMsg = 'Unload blocked! You must run a test wafer before signing the unload'
|
||||||
|
Dialog_Response_Log_Services('AddDialogResponseLog', RDSNo, 'RDS', @User4, 'HTR_LAST_BOX_TW', 'Test wafer not logged when one was required. Unload signature was blocked. User was prompted.')
|
||||||
|
end else
|
||||||
|
Dialog_Response_Log_Services('AddDialogResponseLog', RDSNo, 'RDS', @User4, 'HTR_LAST_BOX_TW', 'Test wafer was logged when one was required. Unload signature was allowed. User was prompted.')
|
||||||
end
|
end
|
||||||
If ErrMsg NE '' then
|
If ErrMsg NE '' then
|
||||||
Database_Services('WriteDataRow', 'WO_MAT', WoMatKey, WoMatRecord, True$, False$, False$)
|
Database_Services('WriteDataRow', 'WO_MAT', WoMatKey, WoMatRecord, True$, False$, False$)
|
||||||
@ -322,6 +325,8 @@ Event PUB_SIGN.CLICK()
|
|||||||
ErrMsg = Error_Services('GetMessage')
|
ErrMsg = Error_Services('GetMessage')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end else
|
||||||
|
Dialog_Response_Log_Services('AddDialogResponseLog', RDSNo, 'RDS', @User4, 'HTR_LAST_BOX_TW', 'Test wafer was logged prior when one was required. Unload signature was allowed. User was not prompted.')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
@ -474,3 +479,4 @@ Setup_OLE_Controls:
|
|||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -41,8 +41,9 @@ Function Reactitems_API(@API)
|
|||||||
$insert APP_INSERTS
|
$insert APP_INSERTS
|
||||||
$insert API_SETUP
|
$insert API_SETUP
|
||||||
$insert HTTP_INSERTS
|
$insert HTTP_INSERTS
|
||||||
|
$Insert REACT_ITEM_EQUATES
|
||||||
|
|
||||||
Declare subroutine OI_Wizard_Services, SRP_JSON, Database_Services
|
Declare subroutine OI_Wizard_Services, SRP_JSON, Database_Services, React_Item_Services
|
||||||
Declare function React_Item_Services, SRP_JSON, OI_Wizard_Services
|
Declare function React_Item_Services, SRP_JSON, OI_Wizard_Services
|
||||||
|
|
||||||
GoToAPI else
|
GoToAPI else
|
||||||
@ -220,8 +221,9 @@ API ReactItems.ID.PUT
|
|||||||
SRP_JSON(hJSON, 'Release')
|
SRP_JSON(hJSON, 'Release')
|
||||||
KeyID = EndpointSegment
|
KeyID = EndpointSegment
|
||||||
Record = React_Item_Services('ConvertJSONToRecord', JSON)
|
Record = React_Item_Services('ConvertJSONToRecord', JSON)
|
||||||
|
If Error_Services('NoError') then
|
||||||
If KeyID NE '' and Record NE '' then
|
If KeyID NE '' and Record NE '' then
|
||||||
Database_Services('WriteDataRow', 'REACT_ITEM', KeyID, Record)
|
React_Item_Services('UpdateReactItem', KeyID, Record)
|
||||||
end
|
end
|
||||||
If Error_Services('NoError') then
|
If Error_Services('NoError') then
|
||||||
StatusCode = 200
|
StatusCode = 200
|
||||||
@ -230,6 +232,9 @@ API ReactItems.ID.PUT
|
|||||||
end else
|
end else
|
||||||
HTTP_Services('SetResponseStatus', 400, Error_Services('GetMessage'))
|
HTTP_Services('SetResponseStatus', 400, Error_Services('GetMessage'))
|
||||||
end
|
end
|
||||||
|
end else
|
||||||
|
HTTP_Services('SetResponseStatus', 400, Error_Services('GetMessage'))
|
||||||
|
end
|
||||||
end else
|
end else
|
||||||
// Error parsing JSON
|
// Error parsing JSON
|
||||||
HTTP_Services('SetResponseStatus', 400, 'Unable to parse the JSON data from the request.')
|
HTTP_Services('SetResponseStatus', 400, 'Unable to parse the JSON data from the request.')
|
||||||
@ -356,4 +361,3 @@ CreateHALCollection:
|
|||||||
end
|
end
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
@ -149,8 +149,7 @@ WRITE_RECORD:
|
|||||||
ModeUser = @User4
|
ModeUser = @User4
|
||||||
end
|
end
|
||||||
CurrActiveHgCVOrders = Nica_Orders_Services('GetActiveOrders', 'REACTOR', Name, 'IQS_HGCV_ALARM')
|
CurrActiveHgCVOrders = Nica_Orders_Services('GetActiveOrders', 'REACTOR', Name, 'IQS_HGCV_ALARM')
|
||||||
CurrActiveProveInOrders = Nica_Orders_Services('GetActiveOrders', 'REACTOR', Name, 'CHANGEOVER')
|
OrderTypeAlreadyActive = (CurrActiveHgCVOrders NE '')
|
||||||
OrderTypeAlreadyActive = ( (CurrActiveHgCVOrders NE '') or (CurrActiveProveInOrders NE '') )
|
|
||||||
If Not(OrderTypeAlreadyActive) then
|
If Not(OrderTypeAlreadyActive) then
|
||||||
// Only create an order and change the mode if there is not already an active IQS_HGCV_ALARM order
|
// Only create an order and change the mode if there is not already an active IQS_HGCV_ALARM order
|
||||||
OrderResponse = Nica_Orders_Services('CreateNewOrder', 'REACTOR', Name, 'IQS_HGCV_ALARM')
|
OrderResponse = Nica_Orders_Services('CreateNewOrder', 'REACTOR', Name, 'IQS_HGCV_ALARM')
|
||||||
@ -228,5 +227,3 @@ Restore_System_Variables:
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -165,11 +165,15 @@ Service SignReactorLog(ReactorLogID, UserID)
|
|||||||
RIPostBy = ReactorLogRec<REACTOR_LOG_RI_POST_BY$>
|
RIPostBy = ReactorLogRec<REACTOR_LOG_RI_POST_BY$>
|
||||||
If RIPostBy EQ '' then
|
If RIPostBy EQ '' then
|
||||||
obj_Reactor_Log('PostReactItems',ReactorLogID:@RM:UserID)
|
obj_Reactor_Log('PostReactItems',ReactorLogID:@RM:UserID)
|
||||||
|
If Error_Services('NoError') then
|
||||||
// Pull in a fresh copy of the record with the POST_BY signature set
|
// Pull in a fresh copy of the record with the POST_BY signature set
|
||||||
ReactorLogRec = Database_Services('ReadDataRow', 'REACTOR_LOG', ReactorLogID)
|
ReactorLogRec = Database_Services('ReadDataRow', 'REACTOR_LOG', ReactorLogID)
|
||||||
If Get_Status(ErrCode) then
|
If Get_Status(ErrCode) then
|
||||||
ErrorMsg = 'Error in ':Service:' service. Error calling obj_Reactor_Log("PostReactItems"). Error code: ':ErrCode:'.'
|
ErrorMsg = 'Error in ':Service:' service. Error calling obj_Reactor_Log("PostReactItems"). Error code: ':ErrCode:'.'
|
||||||
end
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
If ErrorMsg EQ '' then
|
If ErrorMsg EQ '' then
|
||||||
@ -961,3 +965,4 @@ ClearCursors:
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -677,12 +677,93 @@ Service ResetWfrMetric(ReactorNo, MetricType = REACTORMETRIC)
|
|||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
// SetWaferSize
|
||||||
|
//
|
||||||
|
// Sets the Reactor's Wafer Size.
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
Service SetWaferSize(ReactNo, WaferSize)
|
||||||
|
|
||||||
|
ErrMsg = ''
|
||||||
|
If ReactNo EQ '' then
|
||||||
|
ErrMsg := 'ReactNo value is missing.'
|
||||||
|
end
|
||||||
|
If WaferSize EQ '' then
|
||||||
|
ErrMsg := 'WaferSize value is missing.'
|
||||||
|
end
|
||||||
|
If ErrMsg EQ '' then
|
||||||
|
If RowExists('REACTOR', ReactNo) then
|
||||||
|
WaferSizeOptions = Xlate('SYSREPOSPOPUPS', 'LSL2**WAFER_SIZES', 8, 'X')
|
||||||
|
Swap @VM with @FM in WaferSizeOptions
|
||||||
|
Swap @SVM with @VM in WaferSizeOptions
|
||||||
|
WaferSizeOptions = SRP_Array('Rotate', WaferSizeOptions)
|
||||||
|
WaferSizeOptions = WaferSizeOptions<2>
|
||||||
|
If Count(WaferSizeOptions, WaferSize) NE 0 then
|
||||||
|
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactNo)
|
||||||
|
ReactorRec<REACTOR_SUSC_POCKET_SIZE$> = WaferSize
|
||||||
|
Database_Services('WriteDataRow', 'REACTOR', ReactNo, ReactorRec, True$, False$, False$)
|
||||||
|
If Error_Services('HasError') then
|
||||||
|
ErrMsg := Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrMsg := 'Invalid Wafer Size.'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrMsg := 'The chosen Reactor No. ': ReactNo: ' does not exist.'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
If ErrMsg NE '' then
|
||||||
|
Error_Services('Add', ErrMsg)
|
||||||
|
end
|
||||||
|
|
||||||
|
end service
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
// SetPocketQty
|
||||||
|
//
|
||||||
|
// Sets the Reactor's Wafer Size.
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
Service SetPocketQty(ReactNo, PocketQty)
|
||||||
|
|
||||||
|
ErrMsg = ''
|
||||||
|
If ReactNo EQ '' then
|
||||||
|
ErrMsg := 'ReactNo value is missing.'
|
||||||
|
end
|
||||||
|
If PocketQty EQ '' then
|
||||||
|
ErrMsg := 'PocketQty value is missing.'
|
||||||
|
end
|
||||||
|
If ErrMsg EQ '' then
|
||||||
|
If RowExists('REACTOR', ReactNo) then
|
||||||
|
PocketQtyOptions = Xlate('SYSREPOSPOPUPS', 'LSL2**SUSCEPTOR_POCKETS', 8, 'X')
|
||||||
|
Swap @VM with @FM in PocketQtyOptions
|
||||||
|
Swap @SVM with @VM in PocketQtyOptions
|
||||||
|
PocketQtyOptions = SRP_Array('Rotate', PocketQtyOptions)
|
||||||
|
PocketQtyOptions = PocketQtyOptions<1>
|
||||||
|
If Count(PocketQtyOptions, PocketQty) NE 0 then
|
||||||
|
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactNo)
|
||||||
|
ReactorRec<REACTOR_SUSC_POCKET_QTY$> = PocketQty
|
||||||
|
Database_Services('WriteDataRow', 'REACTOR', ReactNo, ReactorRec, True$, False$, False$)
|
||||||
|
If Error_Services('HasError') then
|
||||||
|
ErrMsg := Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrMsg := 'Invalid Pocket Qty..'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrMsg := 'The chosen Reactor No. ': ReactNo: ' does not exist.'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
If ErrMsg NE '' then
|
||||||
|
Error_Services('Add', ErrMsg)
|
||||||
|
end
|
||||||
|
|
||||||
|
end service
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
// GetReactors
|
// GetReactors
|
||||||
//
|
//
|
||||||
// Returns a JSON formatted array of reactor objects. Reactor number 0 will be ommitted. If the MatchType or MatchSize
|
// Returns a JSON formatted array of reactor objects. Reactor number 0 will be ommitted. If the MatchType or MatchSize
|
||||||
// arguments are populated, the array will be filterd accordingly.
|
// arguments are populated, the array will be filtered accordingly.
|
||||||
//----------------------------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
Service GetReactors(MatchType, MatchSize)
|
Service GetReactors(MatchType, MatchSize)
|
||||||
|
|
||||||
@ -2775,12 +2856,21 @@ Service ConvertRecordToJSON(ReactorNo, ItemURL, CurrUser, FullObject=BOOLEAN)
|
|||||||
SRP_JSON(objReactor, 'SetValue', 'ArmsCnt', Xlate('REACTOR', ReactorNo, REACTOR_ARMS_WFR_CNT$, 'X'))
|
SRP_JSON(objReactor, 'SetValue', 'ArmsCnt', Xlate('REACTOR', ReactorNo, REACTOR_ARMS_WFR_CNT$, 'X'))
|
||||||
|
|
||||||
// Add Current Run Status (Current Loaded Cassettes)
|
// Add Current Run Status (Current Loaded Cassettes)
|
||||||
|
LoadLockLeftRDS = ''
|
||||||
|
LoadLockRightRDS = ''
|
||||||
LoadedRDS = Xlate('REACT_STATUS', ReactorNo, 'LOAD_RDS', 'X')
|
LoadedRDS = Xlate('REACT_STATUS', ReactorNo, 'LOAD_RDS', 'X')
|
||||||
If LoadedRDS NE '' then
|
If LoadedRDS NE '' then
|
||||||
objLoadedRDS = ''
|
objLoadedRDS = ''
|
||||||
If SRP_JSON(objLoadedRDS, 'New', 'Array') then
|
If SRP_JSON(objLoadedRDS, 'New', 'Array') then
|
||||||
For each RDS in LoadedRDS using @VM setting vPos
|
For each RDS in LoadedRDS using @VM setting vPos
|
||||||
SRP_JSON(objLoadedRDS, 'AddValue', RDS)
|
SRP_JSON(objLoadedRDS, 'AddValue', RDS)
|
||||||
|
LoadLockSide = Xlate('RDS', RDS, 'LOAD_LOCK_SIDE', 'X')
|
||||||
|
Begin Case
|
||||||
|
Case LoadLockSide EQ 'L'
|
||||||
|
LoadLockLeftRDS = RDS
|
||||||
|
Case LoadLockSide EQ 'R'
|
||||||
|
LoadLockRightRDS = RDS
|
||||||
|
End Case
|
||||||
Next RDS
|
Next RDS
|
||||||
SRP_JSON(objReactor, 'Set', 'loadedRDS', objLoadedRDS)
|
SRP_JSON(objReactor, 'Set', 'loadedRDS', objLoadedRDS)
|
||||||
SRP_JSON(objLoadedRDS, 'Release')
|
SRP_JSON(objLoadedRDS, 'Release')
|
||||||
@ -2788,6 +2878,8 @@ Service ConvertRecordToJSON(ReactorNo, ItemURL, CurrUser, FullObject=BOOLEAN)
|
|||||||
end else
|
end else
|
||||||
SRP_JSON(objReactor, 'SetValue', 'loadedRDS', '')
|
SRP_JSON(objReactor, 'SetValue', 'loadedRDS', '')
|
||||||
end
|
end
|
||||||
|
SRP_JSON(objReactor, 'SetValue', 'loadLockLeftRDS', LoadLockLeftRDS)
|
||||||
|
SRP_JSON(objReactor, 'SetValue', 'loadLockRightRDS', LoadLockRightRDS)
|
||||||
|
|
||||||
// Add new reactor items here
|
// Add new reactor items here
|
||||||
InstItems = Xlate('REACTOR', ReactorNo, REACTOR_CURR_INST_ITEMS$, 'X')
|
InstItems = Xlate('REACTOR', ReactorNo, REACTOR_CURR_INST_ITEMS$, 'X')
|
||||||
@ -3676,7 +3768,7 @@ Service GetReactorAvailChamberCount(ReactNo)
|
|||||||
StartTick = GetTickCount()
|
StartTick = GetTickCount()
|
||||||
MetricName = 'GetReactorAvailChamberCount'
|
MetricName = 'GetReactorAvailChamberCount'
|
||||||
|
|
||||||
ErrMsg = 'Error in ReactorServices -> GetReactorAvailChamberCount: '
|
ErrMsg = ''
|
||||||
AvailableChamberCount = 0
|
AvailableChamberCount = 0
|
||||||
If ReactNo NE '' then
|
If ReactNo NE '' then
|
||||||
If RowExists('REACTOR', ReactNo) then
|
If RowExists('REACTOR', ReactNo) then
|
||||||
@ -3686,16 +3778,19 @@ Service GetReactorAvailChamberCount(ReactNo)
|
|||||||
AvailableChamberCount = ReactorCurrCapacity - ReactorCurrLoadCnt
|
AvailableChamberCount = ReactorCurrCapacity - ReactorCurrLoadCnt
|
||||||
end else
|
end else
|
||||||
ErrMsg := 'Reactor ' : ReactNo : ' does not exist.'
|
ErrMsg := 'Reactor ' : ReactNo : ' does not exist.'
|
||||||
Error_Services('Add', ErrMsg)
|
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
ErrMsg := 'Reactor Number was null.'
|
ErrMsg := 'Reactor Number was null.'
|
||||||
Error_Services('Add', ErrMsg)
|
|
||||||
end
|
end
|
||||||
Response = AvailableChamberCount
|
Response = AvailableChamberCount
|
||||||
|
|
||||||
EndTick = GetTickCount()
|
EndTick = GetTickCount()
|
||||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||||
|
|
||||||
|
If ErrMsg NE '' then
|
||||||
|
ErrMsg = 'Error in ReactorServices -> GetReactorAvailChamberCount: ':ErrMsg
|
||||||
|
Error_Services('Add', ErrMsg)
|
||||||
|
end
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@ COMPILE FUNCTION React_Item(EntID,Event,Parm1,Parm2,Parm3,Parm4,Parm5)
|
|||||||
01/13/2014 - John C. Henry, J.C. Henry & Co., Inc. cloned from Graphite
|
01/13/2014 - John C. Henry, J.C. Henry & Co., Inc. cloned from Graphite
|
||||||
*/
|
*/
|
||||||
|
|
||||||
DECLARE SUBROUTINE Set_Property, ErrMsg, obj_Appwindow, Btree.Extract, Send_Event, Post_Event, obj_React_Item
|
DECLARE SUBROUTINE Set_Property, ErrMsg, obj_Appwindow, Btree.Extract, Send_Event, Post_Event, obj_React_Item, Forward_Event
|
||||||
DECLARE FUNCTION Get_Property, Send_Message, NextKey, Popup, obj_Calendar, Printer_Select
|
DECLARE FUNCTION Get_Property, Send_Message, NextKey, Popup, obj_Calendar, Printer_Select
|
||||||
DECLARE FUNCTION Set_Printer, obj_Install, Start_Window, obj_React_Item_Hist, obj_React_Item, Dialog_Box
|
DECLARE FUNCTION Set_Printer, obj_Install, Start_Window, obj_React_Item_Hist, obj_React_Item, Dialog_Box
|
||||||
|
|
||||||
@ -15,6 +15,7 @@ $INSERT REACT_ITEM_EQUATES
|
|||||||
$INSERT REACT_ITEM_HIST_EQUATES
|
$INSERT REACT_ITEM_HIST_EQUATES
|
||||||
$INSERT APPCOLORS
|
$INSERT APPCOLORS
|
||||||
$INSERT POPUP_EQUATES
|
$INSERT POPUP_EQUATES
|
||||||
|
$INSERT LOGICAL
|
||||||
|
|
||||||
EQU COL$REACT_NO TO 1
|
EQU COL$REACT_NO TO 1
|
||||||
EQU COL$SVC_HRS TO 2
|
EQU COL$SVC_HRS TO 2
|
||||||
@ -77,6 +78,9 @@ BEGIN CASE
|
|||||||
CASE EntID = @WINDOW:'.LU_PKT_QTY' AND Event = 'CLICK' ; GOSUB LUPktQty
|
CASE EntID = @WINDOW:'.LU_PKT_QTY' AND Event = 'CLICK' ; GOSUB LUPktQty
|
||||||
CASE EntID = @WINDOW:'.RETIRE_BUTTON' AND Event = 'CLICK' ; GOSUB RetireItem
|
CASE EntID = @WINDOW:'.RETIRE_BUTTON' AND Event = 'CLICK' ; GOSUB RetireItem
|
||||||
CASE EntID = @WINDOW:'.PRINT_LABEL' AND Event = 'CLICK' ; GOSUB PrintLabel
|
CASE EntID = @WINDOW:'.PRINT_LABEL' AND Event = 'CLICK' ; GOSUB PrintLabel
|
||||||
|
CASE EntID = @WINDOW:'.RI_TYPE' AND Event = 'CHANGED' ; GOSUB RITypeChange
|
||||||
|
CASE EntID = @WINDOW:'.PKT_SIZE' AND Event = 'CHANGED' ; GOSUB PktSizeChange
|
||||||
|
CASE EntID = @WINDOW:'.PART_TYPE' AND Event = 'LOSTFOCUS' ; GOSUB PktSizeChange
|
||||||
|
|
||||||
CASE 1
|
CASE 1
|
||||||
|
|
||||||
@ -142,14 +146,11 @@ RETURN
|
|||||||
Read:
|
Read:
|
||||||
* * * * * * *
|
* * * * * * *
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
GOSUB Refresh
|
GOSUB Refresh
|
||||||
|
|
||||||
RETURN
|
RETURN
|
||||||
|
|
||||||
|
|
||||||
* * * * * * *
|
* * * * * * *
|
||||||
Write:
|
Write:
|
||||||
* * * * * * *
|
* * * * * * *
|
||||||
@ -261,9 +262,68 @@ FOR Line = 1 TO ListCnt
|
|||||||
NEXT N
|
NEXT N
|
||||||
END
|
END
|
||||||
NEXT Line
|
NEXT Line
|
||||||
|
RIType = Get_Property(@Window:'.RI_TYPE', 'TEXT')
|
||||||
|
If RIType EQ 'S' then
|
||||||
|
Set_Property(@Window:'.SUSC_GROUP', 'ENABLED', True$)
|
||||||
|
Set_Property(@Window:'.PKT_SIZE_LABEL', 'ENABLED', True$)
|
||||||
|
Set_Property(@Window:'.PKT_SIZE', 'ENABLED', True$)
|
||||||
|
Set_Property(@Window:'.LU_PKT_SIZE', 'ENABLED', True$)
|
||||||
|
Set_Property(@Window:'.PKT_SIZE_DESC', 'ENABLED', True$)
|
||||||
|
Set_Property(@Window:'.PKT_QTY_LABEL', 'ENABLED', True$)
|
||||||
|
Set_Property(@Window:'.LU_PKT_QTY', 'ENABLED', True$)
|
||||||
|
Set_Property(@Window:'.PPLUS_RDS_NO_LABEL', 'ENABLED', True$)
|
||||||
|
Set_Property(@Window:'.PPLUS_RDS_NO', 'ENABLED', True$)
|
||||||
|
end else
|
||||||
|
Set_Property(@Window:'.SUSC_GROUP', 'ENABLED', False$)
|
||||||
|
Set_Property(@Window:'.PKT_SIZE_LABEL', 'ENABLED', False$)
|
||||||
|
Set_Property(@Window:'.PKT_SIZE', 'ENABLED', False$)
|
||||||
|
Set_Property(@Window:'.PKT_SIZE', 'TEXT', '')
|
||||||
|
Set_Property(@Window:'.LU_PKT_SIZE', 'ENABLED', False$)
|
||||||
|
Set_Property(@Window:'.PKT_SIZE_DESC', 'ENABLED', False$)
|
||||||
|
Set_Property(@Window:'.PKT_SIZE_DESC', 'TEXT', '')
|
||||||
|
Set_Property(@Window:'PKT_QTY_LABEL', 'ENABLED', False$)
|
||||||
|
Set_Property(@Window:'.PKT_QTY', 'TEXT', '')
|
||||||
|
Set_Property(@Window:'.LU_PKT_QTY', 'ENABLED', False$)
|
||||||
|
Set_Property(@Window:'.PPLUS_RDS_NO_LABEL', 'ENABLED', False$)
|
||||||
|
Set_Property(@Window:'.PPLUS_RDS_NO', 'ENABLED', False$)
|
||||||
|
Set_Property(@Window:'.PPLUS_RDS_NO', 'TEXT', '')
|
||||||
|
end
|
||||||
|
|
||||||
RETURN
|
RETURN
|
||||||
|
|
||||||
|
* * * * * * *
|
||||||
|
RITypeChange:
|
||||||
|
* * * * * * *
|
||||||
|
|
||||||
|
RIType = Get_Property(@Window:'.RI_TYPE', 'TEXT')
|
||||||
|
If RIType EQ 'S' then
|
||||||
|
Set_Property(@Window:'.SUSC_GROUP', 'ENABLED', True$)
|
||||||
|
Set_Property(@Window:'.PKT_SIZE_LABEL', 'ENABLED', True$)
|
||||||
|
Set_Property(@Window:'.PKT_SIZE', 'ENABLED', True$)
|
||||||
|
Set_Property(@Window:'.LU_PKT_SIZE', 'ENABLED', True$)
|
||||||
|
Set_Property(@Window:'.PKT_SIZE_DESC', 'ENABLED', True$)
|
||||||
|
Set_Property(@Window:'.PKT_QTY_LABEL', 'ENABLED', True$)
|
||||||
|
Set_Property(@Window:'.LU_PKT_QTY', 'ENABLED', True$)
|
||||||
|
Set_Property(@Window:'.PPLUS_RDS_NO_LABEL', 'ENABLED', True$)
|
||||||
|
Set_Property(@Window:'.PPLUS_RDS_NO', 'ENABLED', True$)
|
||||||
|
end else
|
||||||
|
Set_Property(@Window:'.SUSC_GROUP', 'ENABLED', False$)
|
||||||
|
Set_Property(@Window:'.PKT_SIZE_LABEL', 'ENABLED', False$)
|
||||||
|
Set_Property(@Window:'.PKT_SIZE', 'ENABLED', False$)
|
||||||
|
Set_Property(@Window:'.PKT_SIZE', 'TEXT', '')
|
||||||
|
Set_Property(@Window:'.LU_PKT_SIZE', 'ENABLED', False$)
|
||||||
|
Set_Property(@Window:'.PKT_SIZE_DESC', 'ENABLED', False$)
|
||||||
|
Set_Property(@Window:'.PKT_SIZE_DESC', 'TEXT', '')
|
||||||
|
Set_Property(@Window:'PKT_QTY_LABEL', 'ENABLED', False$)
|
||||||
|
Set_Property(@Window:'.PKT_QTY', 'TEXT', '')
|
||||||
|
Set_Property(@Window:'.LU_PKT_QTY', 'ENABLED', False$)
|
||||||
|
Set_Property(@Window:'.PPLUS_RDS_NO_LABEL', 'ENABLED', False$)
|
||||||
|
Set_Property(@Window:'.PPLUS_RDS_NO', 'ENABLED', False$)
|
||||||
|
Set_Property(@Window:'.PPLUS_RDS_NO', 'TEXT', '')
|
||||||
|
end
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
* * * * * * *
|
* * * * * * *
|
||||||
RetireItem:
|
RetireItem:
|
||||||
@ -443,19 +503,47 @@ RETURN
|
|||||||
LUPktSize:
|
LUPktSize:
|
||||||
* * * * * * *
|
* * * * * * *
|
||||||
|
|
||||||
RetVal = Popup(@WINDOW,'','WAFER_SIZES')
|
Retired = Get_Property(@Window: '.RETIRE_DT', 'TEXT')
|
||||||
|
RIType = Get_Property(@Window:'.RI_TYPE', 'TEXT')
|
||||||
IF RetVal NE '' THEN
|
If RIType EQ 'S' then
|
||||||
|
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'
|
oaParms = RetVal:@RM:@WINDOW:'.PKT_SIZE'
|
||||||
obj_Appwindow('LUValReturn',oaParms)
|
obj_Appwindow('LUValReturn',oaParms)
|
||||||
END
|
Begin Case
|
||||||
|
Case PartType EQ 'HTR'
|
||||||
|
If RetVal EQ 8 then
|
||||||
|
PocketQty = 3
|
||||||
|
end else
|
||||||
|
If RetVal EQ 6 then PocketQty = 5
|
||||||
|
end
|
||||||
|
Case PartType EQ 'EPP'
|
||||||
|
If RetVal EQ 8 then
|
||||||
|
PocketQty = 8
|
||||||
|
end else
|
||||||
|
If RetVal EQ 6 then PocketQty = 18
|
||||||
|
end
|
||||||
|
Case PartType EQ 'ASM'
|
||||||
|
If RetVal EQ 8 OR RetVal EQ 6 then PocketQty = 1
|
||||||
|
|
||||||
|
End Case
|
||||||
|
Set_Property(@Window:'.PKT_QTY', 'TEXT', PocketQty)
|
||||||
|
END
|
||||||
|
end else
|
||||||
|
If Retired EQ '' then ErrMsg('A valid Part Type (EPP, ASM, HTR) must be selected before selecting Pocket Size.')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
RETURN
|
RETURN
|
||||||
|
|
||||||
|
|
||||||
* * * * * * *
|
* * * * * *
|
||||||
LUPktQty:
|
LUPktQty:
|
||||||
* * * * * * *
|
* * * * * *
|
||||||
|
|
||||||
ReactType = Get_Property(@WINDOW:'.REACT_TYPE','INVALUE')
|
ReactType = Get_Property(@WINDOW:'.REACT_TYPE','INVALUE')
|
||||||
|
|
||||||
@ -508,3 +596,43 @@ obj_React_Item('PrintLabel',RINo:@RM:CurrRec)
|
|||||||
RETURN
|
RETURN
|
||||||
|
|
||||||
|
|
||||||
|
PktSizeChange:
|
||||||
|
|
||||||
|
Retired = Get_Property(@Window: '.RETIRE_DT', 'TEXT')
|
||||||
|
RIType = Get_Property(@Window:'.RI_TYPE', 'TEXT')
|
||||||
|
If RIType EQ 'S' then
|
||||||
|
PocketQty = ''
|
||||||
|
Set_Property(@Window:'.PKT_QTY', 'TEXT', '')
|
||||||
|
PktSize = Get_Property(@Window: '.PKT_SIZE', 'TEXT')
|
||||||
|
PartType = Get_Property(@Window: '.PART_TYPE', 'TEXT')
|
||||||
|
If (PartType EQ 'HTR') OR (PartType EQ 'EPP') OR (PartType EQ 'ASM') then
|
||||||
|
If PktSize EQ 6 OR PktSize EQ 8 then
|
||||||
|
Begin Case
|
||||||
|
Case PartType EQ 'HTR'
|
||||||
|
If PktSize EQ 8 then
|
||||||
|
PocketQty = 3
|
||||||
|
end else
|
||||||
|
If PktSize EQ 6 then PocketQty = 5
|
||||||
|
end
|
||||||
|
Case PartType EQ 'EPP'
|
||||||
|
If PktSize EQ 8 then
|
||||||
|
PocketQty = 8
|
||||||
|
end else
|
||||||
|
If PktSize EQ 6 then PocketQty = 18
|
||||||
|
end
|
||||||
|
Case PartType EQ 'ASM'
|
||||||
|
If PktSize EQ 8 OR PktSize EQ 6 then PocketQty = 1
|
||||||
|
|
||||||
|
End Case
|
||||||
|
Set_Property(@Window:'.PKT_QTY', 'TEXT', PocketQty)
|
||||||
|
end else
|
||||||
|
If Retired EQ '' then ErrMsg('A valid Pocket Size (6 or 8 in.) is required.')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
If Retired EQ '' then ErrMsg('A valid Part Type (EPP, ASM, HTR) must be selected before selecting Pocket Size.')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
|||||||
@ -136,12 +136,70 @@ return
|
|||||||
WRITE_RECORD_PRE:
|
WRITE_RECORD_PRE:
|
||||||
|
|
||||||
ErrMsg = ''
|
ErrMsg = ''
|
||||||
|
OrigRetireDt = OrigRecord<REACT_ITEM_RETIRE_DT$>
|
||||||
|
NewRetireDt = Record<REACT_ITEM_RETIRE_DT$>
|
||||||
|
|
||||||
|
If OrigRetireDt EQ '' AND NewRetireDt NE '' then
|
||||||
|
RetireBypass = True$
|
||||||
|
end else
|
||||||
|
RetireBypass = False$
|
||||||
|
end
|
||||||
|
|
||||||
|
If RetireBypass EQ False$ then
|
||||||
// Req'd parameter checks
|
// Req'd parameter checks
|
||||||
ItemType = {RI_TYPE}
|
ItemType = {RI_TYPE}
|
||||||
|
|
||||||
If ItemType EQ '' then ErrMsg := 'Item Type was not specified. '
|
If ItemType EQ '' then ErrMsg := 'Item Type was not specified. '
|
||||||
|
|
||||||
|
If (ItemType NE 'LE') AND (ItemType NE 'RE') then
|
||||||
|
SerialNo = Record<REACT_ITEM_SERIAL_NO$>
|
||||||
|
If SerialNo EQ '' then
|
||||||
|
ErrMsg := 'Serial No. is required for this Reactor Item type. '
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
If ItemType EQ 'S' then
|
||||||
|
PocketQty = Record<REACT_ITEM_PKT_QTY$>
|
||||||
|
PocketSize = Record<REACT_ITEM_PKT_SIZE$>
|
||||||
|
If PocketSize EQ '' then
|
||||||
|
ErrMsg := 'Pocket size is required for Susceptor Item Type. '
|
||||||
|
end
|
||||||
|
If PocketQty EQ '' then
|
||||||
|
ErrMsg := 'Pocket quantity is required for Susceptor Item Type. '
|
||||||
|
end
|
||||||
|
If ErrMsg = '' then
|
||||||
|
ExpectedQty = ''
|
||||||
|
Begin Case
|
||||||
|
Case Record<REACT_ITEM_PART_TYPE$> EQ 'ASM'
|
||||||
|
If PocketSize EQ 6 OR PocketSize EQ 8 then
|
||||||
|
ExpectedQty = 1
|
||||||
|
end
|
||||||
|
Case Record<REACT_ITEM_PART_TYPE$> EQ 'HTR'
|
||||||
|
If PocketSize EQ 8 then
|
||||||
|
ExpectedQty = 3
|
||||||
|
end else
|
||||||
|
If PocketSize EQ 6 then ExpectedQty = 5
|
||||||
|
end
|
||||||
|
Case Record<REACT_ITEM_PART_TYPE$> EQ 'EPP'
|
||||||
|
If PocketSize EQ 8 then
|
||||||
|
ExpectedQty = 8
|
||||||
|
end else
|
||||||
|
If PocketSize EQ 6 then ExpectedQty = 18
|
||||||
|
end
|
||||||
|
Case Record<REACT_ITEM_PART_TYPE$> EQ ''
|
||||||
|
ErrMsg := 'Part Type. is required for Susceptor Reactor Item type. '
|
||||||
|
Case Otherwise$
|
||||||
|
ErrMsg := 'Invalid Part Type for Susceptor Reactor Item Type. '
|
||||||
|
End Case
|
||||||
|
If ExpectedQty NE '' then
|
||||||
|
If PocketQty NE ExpectedQty then
|
||||||
|
ErrMsg := 'Invalid Pocket Quantity for Part Type/Pocket Size combination. '
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
If ErrMsg NE '' then
|
If ErrMsg NE '' then
|
||||||
Error_Services('Add', 'Error Saving Reactor Item: ' : ErrMsg)
|
Error_Services('Add', 'Error Saving Reactor Item: ' : ErrMsg)
|
||||||
OrigFileError = 104:': Error Saving Reactor Item: ' : ErrMsg
|
OrigFileError = 104:': Error Saving Reactor Item: ' : ErrMsg
|
||||||
@ -149,8 +207,6 @@ WRITE_RECORD_PRE:
|
|||||||
Record = ''
|
Record = ''
|
||||||
ActionFlow = ACTION_STOP$
|
ActionFlow = ACTION_STOP$
|
||||||
end else
|
end else
|
||||||
OrigRetireDt = OrigRecord<REACT_ITEM_RETIRE_DT$>
|
|
||||||
NewRetireDt = Record<REACT_ITEM_RETIRE_DT$>
|
|
||||||
OrigNotes = OrigRecord<REACT_ITEM_NOTES$>
|
OrigNotes = OrigRecord<REACT_ITEM_NOTES$>
|
||||||
NewNotes = Record<REACT_ITEM_NOTES$>
|
NewNotes = Record<REACT_ITEM_NOTES$>
|
||||||
If ( (OrigRetireDt NE NewRetireDt) or (OrigNotes NE NewNotes) ) then
|
If ( (OrigRetireDt NE NewRetireDt) or (OrigNotes NE NewNotes) ) then
|
||||||
@ -233,3 +289,6 @@ Restore_System_Variables:
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -46,7 +46,7 @@ Options BOOLEAN = True$, False$
|
|||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
Service GetReactItems(RIType, CurrStatus, EntryDtStart, EntryDtEnd, RetireDtStart, RetireDtEnd, IncludeNullRetireDt=BOOLEAN)
|
Service GetReactItems(RIType, CurrStatus, EntryDtStart, EntryDtEnd, RetireDtStart, RetireDtEnd, IncludeNullRetireDt=BOOLEAN, PartType)
|
||||||
|
|
||||||
ErrorMsg = ''
|
ErrorMsg = ''
|
||||||
Response = ''
|
Response = ''
|
||||||
@ -99,6 +99,9 @@ Service GetReactItems(RIType, CurrStatus, EntryDtStart, EntryDtEnd, RetireDtStar
|
|||||||
Swap ',' with @VM in CurrStatus
|
Swap ',' with @VM in CurrStatus
|
||||||
SearchString := 'CURR_STATUS_STATIC':@VM:CurrStatus:@FM
|
SearchString := 'CURR_STATUS_STATIC':@VM:CurrStatus:@FM
|
||||||
end
|
end
|
||||||
|
If PartType NE '' then
|
||||||
|
SearchString := 'PART_TYPE':@VM:PartType:@FM
|
||||||
|
end
|
||||||
Flag = ''
|
Flag = ''
|
||||||
RIKeys = ''
|
RIKeys = ''
|
||||||
Btree.Extract(SearchString, 'REACT_ITEM', DictReactItem, RIKeys, 'E', Flag)
|
Btree.Extract(SearchString, 'REACT_ITEM', DictReactItem, RIKeys, 'E', Flag)
|
||||||
@ -381,17 +384,15 @@ Service CreateReactItem(Record)
|
|||||||
ErrMsg = ''
|
ErrMsg = ''
|
||||||
KeyID = ''
|
KeyID = ''
|
||||||
If Record NE '' then
|
If Record NE '' then
|
||||||
//Need to do some parameter checks here
|
|
||||||
ReactItemType = Record<REACT_ITEM_RI_TYPE$>
|
|
||||||
If ReactItemType EQ '' then
|
|
||||||
ErrMsg := 'React Item Type was blank!' : CRLF$
|
|
||||||
end
|
|
||||||
If ErrMsg EQ '' then
|
If ErrMsg EQ '' then
|
||||||
KeyID = NextKey('REACT_ITEM')
|
KeyID = NextKey('REACT_ITEM')
|
||||||
If Error_Services('NoError') and KeyID NE '' then
|
If Error_Services('NoError') and KeyID NE '' then
|
||||||
Database_Services('WriteDataRow', 'REACT_ITEM', KeyID, Record)
|
Database_Services('WriteDataRow', 'REACT_ITEM', KeyID, Record, True$, False$, False$)
|
||||||
|
If Error_Services('HasError') then
|
||||||
|
ErrMsg := Error_Services('GetMessage')
|
||||||
|
end
|
||||||
end else
|
end else
|
||||||
ErrMsg := 'Failed to generate a key for a new react item. ' : CRLF$
|
ErrMsg := 'Failed to generate a key for a new react item. '
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -457,6 +458,31 @@ Service ConvertRecordToJSONQuick(KeyID, Record, ItemURL)
|
|||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
|
Service UpdateReactItem(RINo, Record)
|
||||||
|
|
||||||
|
ErrorMsg = ''
|
||||||
|
If RINo EQ '' then
|
||||||
|
ErrorMsg := 'React Item ID argument was missing in the ' : Service : ' service. '
|
||||||
|
end
|
||||||
|
If Record EQ '' then
|
||||||
|
ErrorMsg := 'React Item Record argument was missing in the ' : Service : ' service. '
|
||||||
|
end
|
||||||
|
If ErrorMsg EQ '' then
|
||||||
|
If RowExists('REACT_ITEM', RINo) then
|
||||||
|
Database_Services('WriteDataRow', 'REACT_ITEM', RINo, Record, True$, False$, False$)
|
||||||
|
If Error_Services('HasError') then
|
||||||
|
ErrorMsg := Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg := 'React Item not found. '
|
||||||
|
end
|
||||||
|
end
|
||||||
|
If ErrorMsg NE '' then
|
||||||
|
Error_Services('Add', ErrorMsg)
|
||||||
|
end
|
||||||
|
|
||||||
|
end service
|
||||||
|
|
||||||
Service UpdateReactItemStatus(RINo)
|
Service UpdateReactItemStatus(RINo)
|
||||||
|
|
||||||
If RINo NE '' then
|
If RINo NE '' then
|
||||||
@ -493,3 +519,7 @@ ClearCursors:
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
174
LSL2/STPROC/RECEIVECASSETTE_API.txt
Normal file
174
LSL2/STPROC/RECEIVECASSETTE_API.txt
Normal file
@ -0,0 +1,174 @@
|
|||||||
|
Function Receivecassette_API(@API)
|
||||||
|
/***********************************************************************************************************************
|
||||||
|
|
||||||
|
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
|
||||||
|
permission from SRP Computer Solutions, Inc.
|
||||||
|
|
||||||
|
Name : Receivecassette_API
|
||||||
|
|
||||||
|
Description : API logic for the Receivecassette resource.
|
||||||
|
|
||||||
|
Notes : All web APIs should include the API_SETUP insert. This will provide several useful variables:
|
||||||
|
|
||||||
|
HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.)
|
||||||
|
APIURL - The URL for the API entry point (e.g., api.mysite.com/v1).
|
||||||
|
FullEndpointURL - The URL submitted by the client, including query params.
|
||||||
|
FullEndpointURLNoQuery - The URL submitted by the client, excluding query params.
|
||||||
|
EndpointSegment - The URL endpoint segment.
|
||||||
|
ParentURL - The URL path preceeding the current endpoint.
|
||||||
|
CurrentAPI - The name of this stored procedure.
|
||||||
|
|
||||||
|
Parameters :
|
||||||
|
API [in] -- Web API to process. Format is [APIPattern].[HTTPMethod]:
|
||||||
|
- APIPattern must follow this structure Receivecassette[.ID.[<Property>]]
|
||||||
|
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||||
|
Examples:
|
||||||
|
- Receivecassette.POST
|
||||||
|
- Receivecassette.ID.PUT
|
||||||
|
- Receivecassette.ID.firstName.GET
|
||||||
|
Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API
|
||||||
|
services do not rely upon anything being returned in the response. This is what the
|
||||||
|
various services like SetResponseBody and SetResponseStatus services are for. A response
|
||||||
|
value is only helpful if the developers want to use it for debug purposes.
|
||||||
|
|
||||||
|
History : (Date, Initials, Notes)
|
||||||
|
08/28/25 xxx Original programmer.
|
||||||
|
|
||||||
|
***********************************************************************************************************************/
|
||||||
|
|
||||||
|
#pragma precomp SRP_PreCompiler
|
||||||
|
|
||||||
|
$insert APP_INSERTS
|
||||||
|
$insert API_SETUP
|
||||||
|
$insert HTTP_INSERTS
|
||||||
|
|
||||||
|
Declare function Work_Order_Services, Wo_Mat_Services, OI_Wizard_Services, Date_Services
|
||||||
|
|
||||||
|
GoToAPI else
|
||||||
|
// The specific resource endpoint doesn't have a API handler yet.
|
||||||
|
HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.')
|
||||||
|
end
|
||||||
|
|
||||||
|
Return Response OR ''
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Endpoint Handlers
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
API receivecassette.POST
|
||||||
|
|
||||||
|
OIWizardID = ''
|
||||||
|
Cookies = HTTP_Services('GetHTTPCookie')
|
||||||
|
For each Cookie in Cookies using ';'
|
||||||
|
Key = Field(Cookie, '=', 1)
|
||||||
|
If Key EQ 'sessionID' then
|
||||||
|
OIWizardID = Field(Cookie, '=', 2)
|
||||||
|
end
|
||||||
|
Next Cookie
|
||||||
|
|
||||||
|
ValidSession = OI_Wizard_Services('ValidateSession', OIWizardID)
|
||||||
|
|
||||||
|
If ValidSession then
|
||||||
|
ErrorMsg = ''
|
||||||
|
// Check if payload has the required information to create a react mode change record
|
||||||
|
Body = HTTP_Services('GetHTTPPostString')
|
||||||
|
If Body NE '' then
|
||||||
|
// The POST string will have been encoded so use percent (URL) decoding.
|
||||||
|
SubstrateScanJSON = HTTP_Services('DecodePercentString', Body)
|
||||||
|
ParseResponse = SRP_JSON(hJSON, 'PARSE', SubstrateScanJSON)
|
||||||
|
If (ParseResponse EQ '') then
|
||||||
|
WONo = SRP_JSON(hJSON, 'GetValue', 'WoNo', '')
|
||||||
|
LotNo = SRP_JSON(hJSON, 'GetValue', 'LotNo', '')
|
||||||
|
Qty = SRP_JSON(hJSON, 'GetValue', 'Qty', 0)
|
||||||
|
SubPartNo = SRP_JSON(hJSON, 'GetValue', 'SubPartNo', '')
|
||||||
|
SubVendCd = SRP_JSON(hJSON, 'GetValue', 'VendorCd', '')
|
||||||
|
ReceiveDtm = SRP_JSON(hJSON, 'GetValue', 'ReceiveDtm', '01/01/0001 00:00:00')
|
||||||
|
ReceiveUser = SRP_JSON(hJSON, 'GetValue', 'ReceiveUser', '')
|
||||||
|
Begin Case
|
||||||
|
Case (WONo EQ '')
|
||||||
|
ErrorMsg = 'WoNo cannot be null'
|
||||||
|
Case (ReceiveUser EQ '')
|
||||||
|
ErrorMsg = 'ReceiveUser cannot be null'
|
||||||
|
Case (LotNo EQ '')
|
||||||
|
ErrorMsg = 'Scanned LotNo cannot be null'
|
||||||
|
Case (Qty EQ 0)
|
||||||
|
ErrorMsg = 'Scanned Qty cannot be 0'
|
||||||
|
Case (SubPartNo EQ '')
|
||||||
|
ErrorMsg = 'Scanned SubPartNo cannot be null'
|
||||||
|
Case (SubVendCd EQ '')
|
||||||
|
ErrorMsg = 'Scanned VendorCd cannot be null'
|
||||||
|
Case (ReceiveDtm EQ '01/01/0001 00:00:00')
|
||||||
|
ErrorMsg = 'Invalid ReceiveDtm'
|
||||||
|
Case Otherwise$
|
||||||
|
Null
|
||||||
|
End Case
|
||||||
|
If (ErrorMsg EQ '') then
|
||||||
|
ReceiveDtm = Date_Services('ConvertISO8601ToDateTime', ReceiveDtm)
|
||||||
|
WOMatKey = Work_Order_Services('ReceiveReleaseCassette', WONo, ReceiveUser, LotNo, Qty, SubPartNo, SubVendCd, IConv(ReceiveDtm, 'DT'))
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
ResponseCode = 201
|
||||||
|
Message = 'Cassette ':WOMatKey:' received'
|
||||||
|
GoSub CreateHalItem
|
||||||
|
end else
|
||||||
|
HTTP_Services('SetResponseStatus', 400, Error_Services('GetMessage'))
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
HTTP_Services('SetResponseStatus', 400, 'Error receiving cassette. ':ErrorMsg)
|
||||||
|
end
|
||||||
|
SRP_JSON(hJSON, 'Release')
|
||||||
|
end else
|
||||||
|
// Error parsing JSON
|
||||||
|
HTTP_Services('SetResponseStatus', 400, 'Unable to parse the JSON data from the request.')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
// No JSON payload sent with request
|
||||||
|
HTTP_Services('SetResponseStatus', 400, 'JSON object is missing in the body of the request.')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
HTTP_Services('SetResponseStatus', 401, 'Invalid session. Reauthentication required.')
|
||||||
|
end
|
||||||
|
|
||||||
|
end api
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Internal GoSubs
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
CreateHalItem:
|
||||||
|
|
||||||
|
JSON = ''
|
||||||
|
|
||||||
|
IF RowExists('WO_MAT', WOMatKey) then
|
||||||
|
// Update Scan object in root JSON object to contain the returned WO_MAT object
|
||||||
|
WOMatJson = Wo_Mat_Services('ConvertRecordToJsonOIWizard', WOMatKey)
|
||||||
|
If (SRP_JSON(objWOMat, 'Parse', WOMatJson) EQ '') then
|
||||||
|
objTemp = SRP_JSON(objWOMat, 'Get', 'WO_Mat')
|
||||||
|
SRP_JSON(hJSON, 'Remove', 'ReceivedCass')
|
||||||
|
SRP_JSON(hJSON, 'Set', 'ReceivedCass', objTemp)
|
||||||
|
SRP_JSON(objTemp, 'Release')
|
||||||
|
SRP_JSON(objWOMat, 'Release')
|
||||||
|
JSON = SRP_JSON(hJSON, 'Stringify', 'Fast')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ResponseCode = 406
|
||||||
|
ResponseMessage = 'Error receiving and releasing cassette. WO_MAT record ':WOMatKey:' does not exist after calling ReceiveReleaseCassette.'
|
||||||
|
HTTP_Services('SetResponseStatus', ResponseCode, ResponseMessage)
|
||||||
|
end
|
||||||
|
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||||
|
HTTP_Services('SetResponseBody', JSON, False$, 'application/hal+json')
|
||||||
|
If Assigned(Message) then
|
||||||
|
HTTP_Services('SetResponseStatus', ResponseCode, Message)
|
||||||
|
end else
|
||||||
|
HTTP_Services('SetResponseStatus', ResponseCode)
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Message = Error_Services('GetMessage')
|
||||||
|
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
|
||||||
|
end
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
@ -243,4 +243,3 @@ API reports.GET
|
|||||||
HTTP_Resource_Services('LoremIpsum')
|
HTTP_Resource_Services('LoremIpsum')
|
||||||
|
|
||||||
end api
|
end api
|
||||||
|
|
||||||
|
|||||||
@ -150,7 +150,7 @@ Service GetMakeupInventoryReportJSON()
|
|||||||
end else
|
end else
|
||||||
LotID = Row<0, 2>:'*1*':Row<0, 3>
|
LotID = Row<0, 2>:'*1*':Row<0, 3>
|
||||||
end
|
end
|
||||||
WcRec = Wafer_Counter_Services('GetLastScan', LotID, 'MU')
|
WcRec = Wafer_Counter_Services('GetLastScan', LotID)
|
||||||
WcQty = WcRec<WAFER_COUNTER.SCAN_QTY$>
|
WcQty = WcRec<WAFER_COUNTER.SCAN_QTY$>
|
||||||
WcDtm = WcRec<WAFER_COUNTER.SCAN_DTM$>
|
WcDtm = WcRec<WAFER_COUNTER.SCAN_DTM$>
|
||||||
|
|
||||||
@ -1446,8 +1446,11 @@ Service GenerateMaterialTrackRows()
|
|||||||
ErrCode = ''
|
ErrCode = ''
|
||||||
ErrorMsg = ''
|
ErrorMsg = ''
|
||||||
|
|
||||||
|
SchedDetTable = ''
|
||||||
|
SchedDetDict = ''
|
||||||
|
|
||||||
OPEN 'SCHED_DET_NG' TO SchedDetTable then
|
OPEN 'SCHED_DET_NG' TO SchedDetTable then
|
||||||
OPEN 'DICT.SCHED_DET_NG' TO @DICT then
|
OPEN 'DICT.SCHED_DET_NG' TO SchedDetDict then
|
||||||
Today = Datetime()
|
Today = Datetime()
|
||||||
|
|
||||||
ReactList = ''
|
ReactList = ''
|
||||||
@ -1466,12 +1469,12 @@ Service GenerateMaterialTrackRows()
|
|||||||
END
|
END
|
||||||
|
|
||||||
Done = 0
|
Done = 0
|
||||||
@ID = ''
|
CurrSchedDetKey = ''
|
||||||
LOOP
|
LOOP
|
||||||
PrevSchedDetKey = @ID
|
PrevSchedDetKey = CurrSchedDetKey
|
||||||
READNEXT @ID ELSE Done = 1
|
READNEXT CurrSchedDetKey ELSE Done = 1
|
||||||
UNTIL Done
|
UNTIL Done
|
||||||
READ SchedDetRec FROM SchedDetTable,@ID THEN
|
READ SchedDetRec FROM SchedDetTable,CurrSchedDetKey THEN
|
||||||
ReactNo = SchedDetRec<SCHED_DET_NG.REACT_NO$>
|
ReactNo = SchedDetRec<SCHED_DET_NG.REACT_NO$>
|
||||||
WONo = SchedDetRec<SCHED_DET_NG.WO_NO$>
|
WONo = SchedDetRec<SCHED_DET_NG.WO_NO$>
|
||||||
If ReactNo NE '' then
|
If ReactNo NE '' then
|
||||||
@ -1482,20 +1485,20 @@ Service GenerateMaterialTrackRows()
|
|||||||
If WONo NE '' then
|
If WONo NE '' then
|
||||||
LOCATE WONo IN WOList<Pos> USING @VM SETTING WPos ELSE
|
LOCATE WONo IN WOList<Pos> USING @VM SETTING WPos ELSE
|
||||||
WOList = INSERT(WOList,Pos,-1,0,WONo)
|
WOList = INSERT(WOList,Pos,-1,0,WONo)
|
||||||
SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,@ID)
|
SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,CurrSchedDetKey)
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
|
|
||||||
REPEAT
|
REPEAT
|
||||||
|
|
||||||
CALL Make.List(0,SchedDetKeys,SchedDetTable,@DICT)
|
CALL Make.List(0, SchedDetKeys, SchedDetTable, SchedDetDict)
|
||||||
|
|
||||||
DateRange = 'Effective ':OCONV(Date(),'D4')
|
DateRange = 'Effective ':OCONV(Date(),'D4')
|
||||||
|
|
||||||
RowIndex = 0
|
RowIndex = 0
|
||||||
AllReportData = ''
|
AllReportData = ''
|
||||||
@RECCOUNT = 0
|
RecCount = 0
|
||||||
FirstPass = 1
|
FirstPass = 1
|
||||||
LastRecord = 0
|
LastRecord = 0
|
||||||
FirstLine = 1
|
FirstLine = 1
|
||||||
@ -1506,48 +1509,50 @@ Service GenerateMaterialTrackRows()
|
|||||||
Prev.ReactNo = ''
|
Prev.ReactNo = ''
|
||||||
Last.ReactNo.Break = 1
|
Last.ReactNo.Break = 1
|
||||||
|
|
||||||
|
CurrSchedDetRec = ''
|
||||||
|
|
||||||
Loop
|
Loop
|
||||||
|
|
||||||
ReactNo.Break = 0
|
ReactNo.Break = 0
|
||||||
|
|
||||||
READNEXT @ID, Which.Value ELSE
|
READNEXT CurrSchedDetKey, Which.Value ELSE
|
||||||
LastRecord = 1
|
LastRecord = 1
|
||||||
ReactNo.Break = 1
|
ReactNo.Break = 1
|
||||||
ReactNo = Prev.ReactNo
|
ReactNo = Prev.ReactNo
|
||||||
END
|
END
|
||||||
|
|
||||||
S.ATID = @ID
|
S.ATID = CurrSchedDetKey
|
||||||
Abort = (FirstPass and LastRecord)
|
Abort = (FirstPass and LastRecord)
|
||||||
If Not(Abort) then
|
If Not(Abort) then
|
||||||
|
|
||||||
If Not(LastRecord) then
|
If Not(LastRecord) then
|
||||||
|
|
||||||
READO @RECORD FROM SchedDetTable,@ID then
|
READO CurrSchedDetRec FROM SchedDetTable,CurrSchedDetKey then
|
||||||
|
|
||||||
// GOTO ReadRecord
|
// GOTO ReadRecord
|
||||||
@RECCOUNT += 1
|
RecCount += 1
|
||||||
|
|
||||||
* Calculate Value(s) For Column(s)
|
* Calculate Value(s) For Column(s)
|
||||||
|
|
||||||
S.StartDtm = {START_DTM}
|
S.StartDtm = CurrSchedDetRec<SCHED_DET_NG.START_DTM$>
|
||||||
S.ATID = {@ID}
|
S.ATID = CurrSchedDetKey
|
||||||
I.ATID = S.ATID
|
I.ATID = S.ATID
|
||||||
S.ReactNo = {REACT_NO}
|
S.ReactNo = CurrSchedDetRec<SCHED_DET_NG.REACT_NO$>
|
||||||
I.ReactNo = S.ReactNo
|
I.ReactNo = S.ReactNo
|
||||||
S.WoNo = {WO_NO}
|
S.WoNo = CurrSchedDetRec<SCHED_DET_NG.WO_NO$>
|
||||||
I.WoNo = S.WoNo
|
I.WoNo = S.WoNo
|
||||||
S.SubPartNo = XLATE('WO_LOG', S.WoNo, 'ORD_SUB_PART_NO', 'X')
|
S.SubPartNo = XLATE('WO_LOG', S.WoNo, 'ORD_SUB_PART_NO', 'X')
|
||||||
I.SubPartNo = S.SubPartNo
|
I.SubPartNo = S.SubPartNo
|
||||||
S.EpiPartNo = XLATE('WO_LOG', S.WoNo, WO_LOG_EPI_PART_NO$, 'X')
|
S.EpiPartNo = XLATE('WO_LOG', S.WoNo, WO_LOG_EPI_PART_NO$, 'X')
|
||||||
I.EpiPartNo = S.EpiPartNo
|
I.EpiPartNo = S.EpiPartNo
|
||||||
S.WO_Qty = Xlate('WO_LOG', {WO_NO}, WO_LOG_WO_QTY$, 'X')
|
S.WO_Qty = Xlate('WO_LOG', S.WoNo, WO_LOG_WO_QTY$, 'X')
|
||||||
I.WO_Qty = S.WO_Qty
|
I.WO_Qty = S.WO_Qty
|
||||||
S.WO_RX_Qty = Xlate('WO_LOG', {WO_NO}, 'RX_QTY', 'X')
|
S.WO_RX_Qty = Xlate('WO_LOG', S.WoNo, 'RX_QTY', 'X')
|
||||||
I.WO_RX_Qty = S.WO_RX_Qty
|
I.WO_RX_Qty = S.WO_RX_Qty
|
||||||
S.WO_UnRel_QTY = Xlate('WO_LOG', {WO_NO}, 'UNREL_QTY', 'X')
|
S.WO_UnRel_QTY = Xlate('WO_LOG', S.WoNo, 'UNREL_QTY', 'X')
|
||||||
I.WO_UnRel_QTY = S.WO_UnRel_QTY
|
I.WO_UnRel_QTY = S.WO_UnRel_QTY
|
||||||
S.REACT_TYPE = Xlate('WO_LOG', {WO_NO}, 'REACT_TYPE', 'X')
|
S.REACT_TYPE = Xlate('WO_LOG', S.WoNo, 'REACT_TYPE', 'X')
|
||||||
S.ProdOrdNo = Xlate('WO_LOG', {WO_NO}, 'PROD_ORD_NO', 'X')
|
S.ProdOrdNo = Xlate('WO_LOG', S.WoNo, 'PROD_ORD_NO', 'X')
|
||||||
|
|
||||||
Locate 'SR*KTR]' in LocationFilter using @VM setting vPos then
|
Locate 'SR*KTR]' in LocationFilter using @VM setting vPos then
|
||||||
KitData = Location_Services('GetLocationCassInfo', S.WONo, 'SR*KTR]')
|
KitData = Location_Services('GetLocationCassInfo', S.WONo, 'SR*KTR]')
|
||||||
@ -1899,8 +1904,11 @@ Service PrintMaterialTrackReport(RptColumns, LocationFilter, NoMatFlag, OldRepor
|
|||||||
ErrCode = ''
|
ErrCode = ''
|
||||||
ErrorMsg = ''
|
ErrorMsg = ''
|
||||||
|
|
||||||
|
SchedDetTable = ''
|
||||||
|
SchedDetDict = ''
|
||||||
|
|
||||||
OPEN 'SCHED_DET_NG' TO SchedDetTable then
|
OPEN 'SCHED_DET_NG' TO SchedDetTable then
|
||||||
OPEN 'DICT.SCHED_DET_NG' TO @DICT then
|
OPEN 'DICT.SCHED_DET_NG' TO SchedDetDict then
|
||||||
Today = Datetime()
|
Today = Datetime()
|
||||||
|
|
||||||
ReactList = ''
|
ReactList = ''
|
||||||
@ -1922,12 +1930,12 @@ Service PrintMaterialTrackReport(RptColumns, LocationFilter, NoMatFlag, OldRepor
|
|||||||
END
|
END
|
||||||
|
|
||||||
Done = 0
|
Done = 0
|
||||||
@ID = ''
|
CurrSchedDetKey = ''
|
||||||
LOOP
|
LOOP
|
||||||
PrevSchedDetKey = @ID
|
PrevSchedDetKey = CurrSchedDetKey
|
||||||
READNEXT @ID ELSE Done = 1
|
READNEXT CurrSchedDetKey ELSE Done = 1
|
||||||
UNTIL Done
|
UNTIL Done
|
||||||
READ SchedDetRec FROM SchedDetTable,@ID THEN
|
READ SchedDetRec FROM SchedDetTable,CurrSchedDetKey THEN
|
||||||
ReactNo = SchedDetRec<SCHED_DET_NG.REACT_NO$>
|
ReactNo = SchedDetRec<SCHED_DET_NG.REACT_NO$>
|
||||||
WONo = SchedDetRec<SCHED_DET_NG.WO_NO$>
|
WONo = SchedDetRec<SCHED_DET_NG.WO_NO$>
|
||||||
If ReactNo NE '' then
|
If ReactNo NE '' then
|
||||||
@ -1938,14 +1946,14 @@ Service PrintMaterialTrackReport(RptColumns, LocationFilter, NoMatFlag, OldRepor
|
|||||||
If WONo NE '' then
|
If WONo NE '' then
|
||||||
LOCATE WONo IN WOList<Pos> USING @VM SETTING WPos ELSE
|
LOCATE WONo IN WOList<Pos> USING @VM SETTING WPos ELSE
|
||||||
WOList = INSERT(WOList,Pos,-1,0,WONo)
|
WOList = INSERT(WOList,Pos,-1,0,WONo)
|
||||||
SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,@ID)
|
SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,CurrSchedDetKey)
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
|
|
||||||
REPEAT
|
REPEAT
|
||||||
|
|
||||||
CALL Make.List(0,SchedDetKeys,SchedDetTable,@DICT)
|
CALL Make.List(0,SchedDetKeys,SchedDetTable,SchedDetDict)
|
||||||
|
|
||||||
Header = "'D'":@VM:obj_Install('Get_Prop','CompTitle'):' Material Tracking by Reactor':@VM:"Page 'P'"
|
Header = "'D'":@VM:obj_Install('Get_Prop','CompTitle'):' Material Tracking by Reactor':@VM:"Page 'P'"
|
||||||
MinDemand = 0
|
MinDemand = 0
|
||||||
@ -1988,7 +1996,7 @@ Service PrintMaterialTrackReport(RptColumns, LocationFilter, NoMatFlag, OldRepor
|
|||||||
Footer = " 'D' 'T'":@VM:@VM:"Page: 'P'"
|
Footer = " 'D' 'T'":@VM:@VM:"Page: 'P'"
|
||||||
stat = Set_Printer('FOOTER',Footer)
|
stat = Set_Printer('FOOTER',Footer)
|
||||||
If Stat GE 0 then
|
If Stat GE 0 then
|
||||||
@RECCOUNT = 0
|
RecCount = 0
|
||||||
FirstPass = 1
|
FirstPass = 1
|
||||||
LastRecord = 0
|
LastRecord = 0
|
||||||
FirstLine = 1
|
FirstLine = 1
|
||||||
@ -2010,48 +2018,48 @@ Service PrintMaterialTrackReport(RptColumns, LocationFilter, NoMatFlag, OldRepor
|
|||||||
Prev.ReactNo = ''
|
Prev.ReactNo = ''
|
||||||
Last.ReactNo.Break = 1
|
Last.ReactNo.Break = 1
|
||||||
|
|
||||||
|
CurrSchedDetRec = ''
|
||||||
|
|
||||||
Loop
|
Loop
|
||||||
|
|
||||||
* Zero Break Flags To False
|
* Zero Break Flags To False
|
||||||
|
|
||||||
ReactNo.Break = 0
|
ReactNo.Break = 0
|
||||||
|
|
||||||
READNEXT @ID, Which.Value ELSE
|
READNEXT CurrSchedDetKey, Which.Value ELSE
|
||||||
LastRecord = 1
|
LastRecord = 1
|
||||||
ReactNo.Break = 1
|
ReactNo.Break = 1
|
||||||
ReactNo = Prev.ReactNo
|
ReactNo = Prev.ReactNo
|
||||||
END
|
END
|
||||||
|
|
||||||
S.ATID = @ID
|
S.ATID = CurrSchedDetKey
|
||||||
Abort = (FirstPass AND LastRecord)
|
Abort = (FirstPass AND LastRecord)
|
||||||
IF Not(Abort) THEN
|
IF Not(Abort) THEN
|
||||||
|
|
||||||
IF Not(LastRecord) then
|
IF Not(LastRecord) then
|
||||||
READO @RECORD FROM SchedDetTable,@ID then
|
READO CurrSchedDetRec FROM SchedDetTable,CurrSchedDetKey then
|
||||||
|
|
||||||
@RECCOUNT += 1
|
RecCount += 1
|
||||||
|
|
||||||
* Calculate Value(s) For Column(s)
|
* Calculate Value(s) For Column(s)
|
||||||
|
S.ATID = CurrSchedDetKey
|
||||||
S.ATID = {@ID}
|
|
||||||
I.ATID = S.ATID
|
I.ATID = S.ATID
|
||||||
S.ReactNo = {REACT_NO}
|
S.ReactNo = CurrSchedDetRec<SCHED_DET_NG.REACT_NO$>
|
||||||
I.ReactNo = S.ReactNo
|
I.ReactNo = S.ReactNo
|
||||||
S.WoNo = {WO_NO}
|
S.WoNo = CurrSchedDetRec<SCHED_DET_NG.WO_NO$>
|
||||||
I.WoNo = S.WoNo
|
I.WoNo = S.WoNo
|
||||||
S.SubPartNo = XLATE('WO_LOG', S.WoNo, 'ORD_SUB_PART_NO', 'X')
|
S.SubPartNo = XLATE('WO_LOG', S.WoNo, 'ORD_SUB_PART_NO', 'X')
|
||||||
I.SubPartNo = S.SubPartNo
|
I.SubPartNo = S.SubPartNo
|
||||||
S.EpiPartNo = XLATE('WO_LOG', S.WoNo, WO_LOG_EPI_PART_NO$, 'X')
|
S.EpiPartNo = XLATE('WO_LOG', S.WoNo, WO_LOG_EPI_PART_NO$, 'X')
|
||||||
I.EpiPartNo = S.EpiPartNo
|
I.EpiPartNo = S.EpiPartNo
|
||||||
S.WO_Qty = Xlate('WO_LOG', {WO_NO}, WO_LOG_WO_QTY$, 'X')
|
S.WO_Qty = Xlate('WO_LOG', S.WoNo, WO_LOG_WO_QTY$, 'X')
|
||||||
I.WO_Qty = S.WO_Qty
|
I.WO_Qty = S.WO_Qty
|
||||||
S.WO_RX_Qty = Xlate('WO_LOG', {WO_NO}, 'RX_QTY', 'X')
|
S.WO_RX_Qty = Xlate('WO_LOG', S.WoNo, 'RX_QTY', 'X')
|
||||||
I.WO_RX_Qty = S.WO_RX_Qty
|
I.WO_RX_Qty = S.WO_RX_Qty
|
||||||
S.WO_UnRel_QTY = Xlate('WO_LOG', {WO_NO}, 'UNREL_QTY', 'X')
|
S.WO_UnRel_QTY = Xlate('WO_LOG', S.WoNo, 'UNREL_QTY', 'X')
|
||||||
I.WO_UnRel_QTY = S.WO_UnRel_QTY
|
I.WO_UnRel_QTY = S.WO_UnRel_QTY
|
||||||
S.REACT_TYPE = Xlate('WO_LOG', {WO_NO}, 'REACT_TYPE', 'X')
|
S.REACT_TYPE = Xlate('WO_LOG', S.WoNo, 'REACT_TYPE', 'X')
|
||||||
S.ProdOrdNo = Xlate('WO_LOG', {WO_NO}, 'PROD_ORD_NO', 'X')
|
S.ProdOrdNo = Xlate('WO_LOG', S.WoNo, 'PROD_ORD_NO', 'X')
|
||||||
|
|
||||||
|
|
||||||
If OldReport then
|
If OldReport then
|
||||||
|
|
||||||
@ -2332,7 +2340,9 @@ Service PrintMaterialTrackReport(RptColumns, LocationFilter, NoMatFlag, OldRepor
|
|||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
Service GetOpenNCRReportJson()
|
Service GetOpenNCRReportJson()
|
||||||
|
|
||||||
ErrorMessage = ''
|
ErrorMessage = ''
|
||||||
OpenNCRReportJson = ''
|
OpenNCRReportJson = ''
|
||||||
OpenNCRKeyList = NCR_Services('GetOpenNCRKeys')
|
OpenNCRKeyList = NCR_Services('GetOpenNCRKeys')
|
||||||
@ -2435,4 +2445,3 @@ OipiPrintError:
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1320,3 +1320,4 @@ Service MigrateLegacyRTFRecord(RTFRecordId)
|
|||||||
end
|
end
|
||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|||||||
@ -263,6 +263,7 @@ API scan.ID.PATCH
|
|||||||
SRP_Stopwatch('Start', 'IDPatchResponseTime')
|
SRP_Stopwatch('Start', 'IDPatchResponseTime')
|
||||||
// First confirm that this is a valid Scan ID.
|
// First confirm that this is a valid Scan ID.
|
||||||
jsonScan = Scan_Services('GetScansRow', ScanID, True$)
|
jsonScan = Scan_Services('GetScansRow', ScanID, True$)
|
||||||
|
ErrMsg = ''
|
||||||
If Error_Services('NoError') then
|
If Error_Services('NoError') then
|
||||||
// Confirm that all required data has been scanned before allowing the "accept" field to be updated.
|
// Confirm that all required data has been scanned before allowing the "accept" field to be updated.
|
||||||
ParseResponse = SRP_JSON(objResource, 'Parse', jsonScan)
|
ParseResponse = SRP_JSON(objResource, 'Parse', jsonScan)
|
||||||
@ -293,7 +294,7 @@ API scan.ID.PATCH
|
|||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
ScanNotAcceptableReason = SRP_JSON(objResource, 'GetValue', 'scan.notAcceptableReason')
|
ScanNotAcceptableReason = SRP_JSON(objResource, 'GetValue', 'scan.notAcceptableReason')
|
||||||
Error_Services('Add', ScanNotAcceptableReason)
|
ErrMsg = ScanNotAcceptableReason
|
||||||
end
|
end
|
||||||
SRP_JSON(objResource, 'Release')
|
SRP_JSON(objResource, 'Release')
|
||||||
end else
|
end else
|
||||||
@ -324,6 +325,8 @@ API scan.ID.PATCH
|
|||||||
end
|
end
|
||||||
LogData<6> = ResponseStatusCode
|
LogData<6> = ResponseStatusCode
|
||||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
|
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
|
||||||
|
|
||||||
|
If ErrMsg NE '' then Error_Services('Add', ErrMsg)
|
||||||
end api
|
end api
|
||||||
|
|
||||||
|
|
||||||
@ -435,6 +438,3 @@ CreateHALItem:
|
|||||||
end
|
end
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -51,6 +51,7 @@ Declare function GetTickCount
|
|||||||
Declare Subroutine Scan_Services, Memory_Services, Database_Services, SRP_JSON, QA_Services, Error_Services
|
Declare Subroutine Scan_Services, Memory_Services, Database_Services, SRP_JSON, QA_Services, Error_Services
|
||||||
Declare Subroutine obj_WO_Mat_Log, Tool_Parms_Services, RDS_Services, Logging_Services, Supplement_Services
|
Declare Subroutine obj_WO_Mat_Log, Tool_Parms_Services, RDS_Services, Logging_Services, Supplement_Services
|
||||||
Declare Subroutine Test_Run_Services, WO_MAT_Services, Reactor_Log_Services, Schedule_Services, Mona_Services
|
Declare Subroutine Test_Run_Services, WO_MAT_Services, Reactor_Log_Services, Schedule_Services, Mona_Services
|
||||||
|
Declare Subroutine Dialog_Response_Log_Services
|
||||||
|
|
||||||
Equ CRLF$ to \0D0A\
|
Equ CRLF$ to \0D0A\
|
||||||
|
|
||||||
@ -213,19 +214,22 @@ Service GetScansRow(ScanID, ReturnJSON)
|
|||||||
|
|
||||||
ScansRow = ''
|
ScansRow = ''
|
||||||
|
|
||||||
|
ErrMsg = ''
|
||||||
If ScanID NE '' then
|
If ScanID NE '' then
|
||||||
ScansRow = Database_Services('ReadDataRow', 'SCANS', ScanID)
|
ScansRow = Database_Services('ReadDataRow', 'SCANS', ScanID)
|
||||||
If ReturnJSON EQ True$ then
|
If ReturnJSON EQ True$ then
|
||||||
ScansRow = Scan_Services('ConvertMVScanToJSON', ScanID, ScansRow)
|
ScansRow = Scan_Services('ConvertMVScanToJSON', ScanID, ScansRow)
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', 'ScanID argument was missing in the ' : Service : ' service.')
|
ErrMsg = 'ScanID argument was missing in the ' : Service : ' service.'
|
||||||
end
|
end
|
||||||
|
|
||||||
Response = ScansRow
|
Response = ScansRow
|
||||||
|
|
||||||
EndTick = GetTickCount()
|
EndTick = GetTickCount()
|
||||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||||
|
|
||||||
|
If ErrMsg NE '' then Error_Services('Add', ErrMsg)
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
@ -238,14 +242,17 @@ Service SetScansRow(ScanID, ScansRow)
|
|||||||
StartTick = GetTickCount()
|
StartTick = GetTickCount()
|
||||||
MetricName = 'SetScansRow'
|
MetricName = 'SetScansRow'
|
||||||
|
|
||||||
|
ErrMsg = ''
|
||||||
If (ScanID NE '') AND (ScansRow NE '') then
|
If (ScanID NE '') AND (ScansRow NE '') then
|
||||||
Database_Services('WriteDataRow', 'SCANS', ScanID, ScansRow)
|
Database_Services('WriteDataRow', 'SCANS', ScanID, ScansRow)
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', 'ScanID or ScansRow argument was missing in the ' : Service : ' service.')
|
ErrMsg = 'ScanID or ScansRow argument was missing in the ' : Service : ' service.'
|
||||||
end
|
end
|
||||||
|
|
||||||
EndTick = GetTickCount()
|
EndTick = GetTickCount()
|
||||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||||
|
|
||||||
|
If ErrMsg NE '' then Error_Services('Add', ErrMsg)
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
@ -261,6 +268,7 @@ Service ProcessScanData(ScanID, ScanJSON)
|
|||||||
StartTick = GetTickCount()
|
StartTick = GetTickCount()
|
||||||
MetricName = 'ProcessScanData'
|
MetricName = 'ProcessScanData'
|
||||||
|
|
||||||
|
ErrMsg = ''
|
||||||
If ( (ScanID NE '') AND (ScanJSON NE '') ) then
|
If ( (ScanID NE '') AND (ScanJSON NE '') ) then
|
||||||
hScanJSON = ''
|
hScanJSON = ''
|
||||||
ParseResponse = SRP_JSON(hScanJSON, 'PARSE', ScanJSON)
|
ParseResponse = SRP_JSON(hScanJSON, 'PARSE', ScanJSON)
|
||||||
@ -299,7 +307,7 @@ Service ProcessScanData(ScanID, ScanJSON)
|
|||||||
If RowExists('LOT', LotId) then
|
If RowExists('LOT', LotId) then
|
||||||
TWLots = ScansRow<SCANS.TW_LOT_ID$>
|
TWLots = ScansRow<SCANS.TW_LOT_ID$>
|
||||||
Locate LotId in TWLots using @VM setting twPos then
|
Locate LotId in TWLots using @VM setting twPos then
|
||||||
Error_Services('Add', LotID : ' has already been added as a test wafer lot being used.')
|
ErrMsg = LotID : ' has already been added as a test wafer lot being used.'
|
||||||
end else
|
end else
|
||||||
ScansRow<SCANS.TW_LOT_CHANGED$> = True$
|
ScansRow<SCANS.TW_LOT_CHANGED$> = True$
|
||||||
LotCurrentOperation = Lot_Services('GetLotCurrOperationName', LotId)
|
LotCurrentOperation = Lot_Services('GetLotCurrOperationName', LotId)
|
||||||
@ -315,14 +323,14 @@ Service ProcessScanData(ScanID, ScanJSON)
|
|||||||
ScansRow<SCANS.TW_LOT_QTY$, twPos> = 1
|
ScansRow<SCANS.TW_LOT_QTY$, twPos> = 1
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', LotID : ' does not have enough wafers to be used.')
|
ErrMsg = LotID : ' does not have enough wafers to be used.'
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', LotID : ' is not at a valid operation for use.')
|
ErrMsg = LotID : ' is not at a valid operation for use.'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', LotID : ' is not a valid test wafer lot ID.')
|
ErrMsg = LotID : ' is not a valid test wafer lot ID.'
|
||||||
end
|
end
|
||||||
|
|
||||||
Case Otherwise$
|
Case Otherwise$
|
||||||
@ -349,9 +357,9 @@ Service ProcessScanData(ScanID, ScanJSON)
|
|||||||
Case EmployeeAuthorized NE True$
|
Case EmployeeAuthorized NE True$
|
||||||
// Regardless of the not authorized reason, the scan data will be considered invalid.
|
// Regardless of the not authorized reason, the scan data will be considered invalid.
|
||||||
EmployeeNotAuthorizedReason = {EMPLOYEE_NOT_AUTHORIZED_REASON}
|
EmployeeNotAuthorizedReason = {EMPLOYEE_NOT_AUTHORIZED_REASON}
|
||||||
Error_Services('Add', EmployeeNotAuthorizedReason)
|
ErrMsg = EmployeeNotAuthorizedReason
|
||||||
Case EmployeeActive NE True$
|
Case EmployeeActive NE True$
|
||||||
Error_Services('Add', 'Inactive employee.')
|
ErrMsg = 'Inactive employee.'
|
||||||
Case Otherwise$
|
Case Otherwise$
|
||||||
ScansRow<SCANS.EMPLOYEE_ID$> = {EMPLOYEE_ID}
|
ScansRow<SCANS.EMPLOYEE_ID$> = {EMPLOYEE_ID}
|
||||||
|
|
||||||
@ -394,7 +402,7 @@ Service ProcessScanData(ScanID, ScanJSON)
|
|||||||
If (EmployeeAuthorized NE True$) AND ({EMPLOYEE_ID} NE '') then
|
If (EmployeeAuthorized NE True$) AND ({EMPLOYEE_ID} NE '') then
|
||||||
// Regardless of the not authorized reason, the scan data will be considered invalid.
|
// Regardless of the not authorized reason, the scan data will be considered invalid.
|
||||||
EmployeeNotAuthorizedReason = {EMPLOYEE_NOT_AUTHORIZED_REASON}
|
EmployeeNotAuthorizedReason = {EMPLOYEE_NOT_AUTHORIZED_REASON}
|
||||||
Error_Services('Add', EmployeeNotAuthorizedReason)
|
ErrMsg = EmployeeNotAuthorizedReason
|
||||||
end else
|
end else
|
||||||
* If LoadLock EQ '' then LoadLock = 'NA' ; // NA means Not Applicable.
|
* If LoadLock EQ '' then LoadLock = 'NA' ; // NA means Not Applicable.
|
||||||
ReactorID = ToolID[2, 999]
|
ReactorID = ToolID[2, 999]
|
||||||
@ -414,10 +422,10 @@ Service ProcessScanData(ScanID, ScanJSON)
|
|||||||
ScansRow<SCANS.TOOL_ID$> = ToolID
|
ScansRow<SCANS.TOOL_ID$> = ToolID
|
||||||
ScansRow<SCANS.LOAD_LOCK$> = LoadLock
|
ScansRow<SCANS.LOAD_LOCK$> = LoadLock
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', 'Invalid load lock value "':LoadLock:'".')
|
ErrMsg = 'Invalid load lock value "':LoadLock:'".'
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', 'A load lock side "L" or "R" is required for reactor ':ReactorID:'.')
|
ErrMsg = 'A load lock side "L" or "R" is required for reactor ':ReactorID:'.'
|
||||||
end
|
end
|
||||||
Case (LoadLockReq EQ False$)
|
Case (LoadLockReq EQ False$)
|
||||||
If ScansRow<SCANS.LOCATION_ID$> NE '' then
|
If ScansRow<SCANS.LOCATION_ID$> NE '' then
|
||||||
@ -432,17 +440,17 @@ Service ProcessScanData(ScanID, ScanJSON)
|
|||||||
|
|
||||||
end
|
end
|
||||||
Case ToolType _EQC 'Transfer'
|
Case ToolType _EQC 'Transfer'
|
||||||
Error_Services('Add', 'Tool type ':ToolType:' is not currently supported by the barcode application.')
|
ErrMsg = 'Tool type ':ToolType:' is not currently supported by the barcode application.'
|
||||||
// Code below may be implemented down the road.
|
// Code below may be implemented down the road.
|
||||||
// This is a transfer tool. Just update the scan resource.
|
// This is a transfer tool. Just update the scan resource.
|
||||||
* ScansRow<SCANS.LOCATION_ID$> = '' ; // Make sure the Location ID is cleared.
|
* ScansRow<SCANS.LOCATION_ID$> = '' ; // Make sure the Location ID is cleared.
|
||||||
* ScansRow<SCANS.CASSETTE_IDS$> = ScansRow<SCANS.CASSETTE_IDS$, 1> ; // Make sure only the first Cassette ID is tracked.
|
* ScansRow<SCANS.CASSETTE_IDS$> = ScansRow<SCANS.CASSETTE_IDS$, 1> ; // Make sure only the first Cassette ID is tracked.
|
||||||
* ScansRow<SCANS.TRANSFER_TOOL_ID$> = ToolID
|
* ScansRow<SCANS.TRANSFER_TOOL_ID$> = ToolID
|
||||||
Case Otherwise$
|
Case Otherwise$
|
||||||
Error_Services('Add', 'Tool type ':ToolType:' is not currently supported by the barcode application.')
|
ErrMsg = 'Tool type ':ToolType:' is not currently supported by the barcode application.'
|
||||||
End Case
|
End Case
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', ToolID : ' is not a valid tool ID.')
|
ErrMsg = ToolID : ' is not a valid tool ID.'
|
||||||
end
|
end
|
||||||
|
|
||||||
Case ScanData[1, 2] EQ '1L'
|
Case ScanData[1, 2] EQ '1L'
|
||||||
@ -460,7 +468,7 @@ Service ProcessScanData(ScanID, ScanJSON)
|
|||||||
ScansRow<SCANS.TRANSFER_TOOL_ID$> = '' ; // Make sure the Transfer Tool ID is cleared.
|
ScansRow<SCANS.TRANSFER_TOOL_ID$> = '' ; // Make sure the Transfer Tool ID is cleared.
|
||||||
ScansRow<SCANS.LOCATION_ID$> = LocationID
|
ScansRow<SCANS.LOCATION_ID$> = LocationID
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', LocationID : ' is not a valid location ID.')
|
ErrMsg = LocationID : ' is not a valid location ID.'
|
||||||
end
|
end
|
||||||
|
|
||||||
Case ScanData[1, 2] EQ '1B'
|
Case ScanData[1, 2] EQ '1B'
|
||||||
@ -475,7 +483,7 @@ Service ProcessScanData(ScanID, ScanJSON)
|
|||||||
ScansRow<SCANS.BOAT_ID$> = BoatID
|
ScansRow<SCANS.BOAT_ID$> = BoatID
|
||||||
ScansRow<SCANS.PL_NUMBER$> = PLNo
|
ScansRow<SCANS.PL_NUMBER$> = PLNo
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', ScanData : ' is not a valid boat ID.')
|
ErrMsg = ScanData : ' is not a valid boat ID.'
|
||||||
end
|
end
|
||||||
Case ScanData[1, 3] EQ 'PWD'
|
Case ScanData[1, 3] EQ 'PWD'
|
||||||
// Password/Signature scan. If the scan is not ready to be accepted or the password does
|
// Password/Signature scan. If the scan is not ready to be accepted or the password does
|
||||||
@ -490,14 +498,14 @@ Service ProcessScanData(ScanID, ScanJSON)
|
|||||||
ScansRow<SCANS.AUTHENTICATED$> = 1
|
ScansRow<SCANS.AUTHENTICATED$> = 1
|
||||||
end else
|
end else
|
||||||
ScansRow<SCANS.AUTHENTICATED$> = 0
|
ScansRow<SCANS.AUTHENTICATED$> = 0
|
||||||
Error_Services('Add', 'Invalid password for user ':EmployeeID:'.')
|
ErrMsg = 'Invalid password for user ':EmployeeID:'.'
|
||||||
end
|
end
|
||||||
ScansRow<SCANS.EMPLOYEE_CHANGED$> = True$
|
ScansRow<SCANS.EMPLOYEE_CHANGED$> = True$
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', 'An employee ID must be scanned before scanning a password.')
|
ErrMsg = 'An employee ID must be scanned before scanning a password.'
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', 'Invalid password scanned.')
|
ErrMsg = 'Invalid password scanned.'
|
||||||
end
|
end
|
||||||
Case ScanData[1, 8] EQ 'OVERRIDE'
|
Case ScanData[1, 8] EQ 'OVERRIDE'
|
||||||
|
|
||||||
@ -564,7 +572,7 @@ Service ProcessScanData(ScanID, ScanJSON)
|
|||||||
end
|
end
|
||||||
|
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', 'Selected Employee is not authorized to perform an override')
|
ErrMsg = 'Selected Employee is not authorized to perform an override'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
Case ScanData[1, 2] EQ '5T'
|
Case ScanData[1, 2] EQ '5T'
|
||||||
@ -650,11 +658,11 @@ Service ProcessScanData(ScanID, ScanJSON)
|
|||||||
ScansRow<SCANS.CASSETTE_IDS$> = CassetteID
|
ScansRow<SCANS.CASSETTE_IDS$> = CassetteID
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', CassetteID : ' is not a valid Cassette ID.')
|
ErrMsg = CassetteID : ' is not a valid Cassette ID.'
|
||||||
end
|
end
|
||||||
End Case
|
End Case
|
||||||
|
|
||||||
If Error_Services('NoError') then
|
If ErrMsg EQ '' then
|
||||||
// Process Scan row data here to determine the type of scan (i.e. Location, Pre-Epi + Load, or Unload).
|
// Process Scan row data here to determine the type of scan (i.e. Location, Pre-Epi + Load, or Unload).
|
||||||
ScanType = ScansRow<SCANS.SCAN_TYPE$>
|
ScanType = ScansRow<SCANS.SCAN_TYPE$>
|
||||||
CassetteIDs = ScansRow<SCANS.CASSETTE_IDS$>
|
CassetteIDs = ScansRow<SCANS.CASSETTE_IDS$>
|
||||||
@ -681,7 +689,7 @@ Service ProcessScanData(ScanID, ScanJSON)
|
|||||||
LastCassScanned = CassetteIDs<0, NumCass>
|
LastCassScanned = CassetteIDs<0, NumCass>
|
||||||
CurrStage = Xlate('RDS', LastCassScanned, 'CURR_STAGE', 'X')
|
CurrStage = Xlate('RDS', LastCassScanned, 'CURR_STAGE', 'X')
|
||||||
If CurrStage EQ 'UNLOAD' then
|
If CurrStage EQ 'UNLOAD' then
|
||||||
Error_Services('Add', '(':LastCassScanned:') Cassette is currently loaded on a tool and is ineligble for a location scan.')
|
ErrMsg = '(':LastCassScanned:') Cassette is currently loaded on a tool and is ineligble for a location scan.'
|
||||||
end
|
end
|
||||||
|
|
||||||
Case ScanType EQ 'TOOL'
|
Case ScanType EQ 'TOOL'
|
||||||
@ -755,7 +763,9 @@ Service ProcessScanData(ScanID, ScanJSON)
|
|||||||
CassNo = Xlate('RDS', CassetteID, 'CASS_NO', 'X')
|
CassNo = Xlate('RDS', CassetteID, 'CASS_NO', 'X')
|
||||||
WOMatKey = WONo:'*':CassNo
|
WOMatKey = WONo:'*':CassNo
|
||||||
WOMatLocs = Xlate('WO_MAT', WOMatKey, WO_MAT_INV_LOCATION$, 'X')
|
WOMatLocs = Xlate('WO_MAT', WOMatKey, WO_MAT_INV_LOCATION$, 'X')
|
||||||
If Index(WOMatLocs,'PTI',1) else Error_Services('Add', 'Cassette ':CassetteID:' failed due to missing PTI.')
|
If Index(WOMatLocs,'PTI',1) else
|
||||||
|
ErrMsg = 'Cassette ':CassetteID:' failed due to missing PTI.'
|
||||||
|
end
|
||||||
end else
|
end else
|
||||||
// EpiPro RDS
|
// EpiPro RDS
|
||||||
OutCassNos = Xlate('RDS', CassetteID, 'OUT_CASS_NO', 'X')
|
OutCassNos = Xlate('RDS', CassetteID, 'OUT_CASS_NO', 'X')
|
||||||
@ -765,11 +775,13 @@ Service ProcessScanData(ScanID, ScanJSON)
|
|||||||
CassNo = OutCassNo
|
CassNo = OutCassNo
|
||||||
WOMatKey = WONo:'*':CassNo
|
WOMatKey = WONo:'*':CassNo
|
||||||
WOMatLocs = Xlate('WO_MAT', WOMatKey, WO_MAT_INV_LOCATION$, 'X')
|
WOMatLocs = Xlate('WO_MAT', WOMatKey, WO_MAT_INV_LOCATION$, 'X')
|
||||||
If Index(WOMatLocs,'PTI',1) else Error_Services('Add', 'Cassette ':CassetteID:' failed due to missing PTI.')
|
If Index(WOMatLocs,'PTI',1) else
|
||||||
|
ErrMsg = 'Cassette ':CassetteID:' failed due to missing PTI.'
|
||||||
|
end
|
||||||
Next OutCassNo
|
Next OutCassNo
|
||||||
end
|
end
|
||||||
|
|
||||||
If Error_Services('NoError') then
|
If ErrMsg EQ '' then
|
||||||
If CurrStatus NE 'HOLD' then
|
If CurrStatus NE 'HOLD' then
|
||||||
If (EmployeeID NE '') then
|
If (EmployeeID NE '') then
|
||||||
* SupplInstAckReq = Xlate('RDS', RDSNo, 'SUPPL_ACK_REQ' , 'X')
|
* SupplInstAckReq = Xlate('RDS', RDSNo, 'SUPPL_ACK_REQ' , 'X')
|
||||||
@ -973,8 +985,7 @@ Service ProcessScanData(ScanID, ScanJSON)
|
|||||||
FirstParmsComp = LSParmsComp<1,1>
|
FirstParmsComp = LSParmsComp<1,1>
|
||||||
If (FirstParmsComp EQ False$) then RDS_Services('CopyRDSLayerParameters', RDSNo)
|
If (FirstParmsComp EQ False$) then RDS_Services('CopyRDSLayerParameters', RDSNo)
|
||||||
//Test Wafer logging verification
|
//Test Wafer logging verification
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
|
||||||
// Supplier lot verification
|
// Supplier lot verification
|
||||||
ScannedSuppLot = ScansRow<SCANS.SUPPLIER_LOT$>
|
ScannedSuppLot = ScansRow<SCANS.SUPPLIER_LOT$>
|
||||||
RDSSuppLot = RDSRec<RDS_LOT_NUM$>
|
RDSSuppLot = RDSRec<RDS_LOT_NUM$>
|
||||||
@ -991,13 +1002,13 @@ Service ProcessScanData(ScanID, ScanJSON)
|
|||||||
LoadStageReady = QA_Services('LoadSignatureReady', RDSNo, Username, WaferQty, LLSide, True$, Reactor)
|
LoadStageReady = QA_Services('LoadSignatureReady', RDSNo, Username, WaferQty, LLSide, True$, Reactor)
|
||||||
If (LoadStageReady NE True$) then
|
If (LoadStageReady NE True$) then
|
||||||
// Why is it not ready?
|
// Why is it not ready?
|
||||||
ErrorMsg = Error_Services('GetMessage')
|
ErrMsg = Error_Services('GetMessage')
|
||||||
Begin Case
|
Begin Case
|
||||||
Case IndexC(ErrorMsg, 'supplement', 1)
|
Case IndexC(ErrMsg, 'supplement', 1)
|
||||||
// Clear the error to return a JSON payload and handle the acknowledgements.
|
// Clear the error to return a JSON payload and handle the acknowledgements.
|
||||||
Error_Services('Clear')
|
Error_Services('Clear')
|
||||||
Scan_Services('AddNotAcceptableReason', ErrorMsg)
|
Scan_Services('AddNotAcceptableReason', ErrMsg)
|
||||||
Case IndexC(ErrorMsg, 'ROTR', 1)
|
Case IndexC(ErrMsg, 'ROTR', 1)
|
||||||
ROTRBlock = Database_Services('ReadDataColumn', 'REACTOR', Reactor, REACTOR_ROTR_STATUS$, True$, 0, False$)
|
ROTRBlock = Database_Services('ReadDataColumn', 'REACTOR', Reactor, REACTOR_ROTR_STATUS$, True$, 0, False$)
|
||||||
ROTRBlockReason = Database_Services('ReadDataColumn', 'REACTOR', Reactor, REACTOR_ROTR_STATUS_REASON$, True$, 0, False$)
|
ROTRBlockReason = Database_Services('ReadDataColumn', 'REACTOR', Reactor, REACTOR_ROTR_STATUS_REASON$, True$, 0, False$)
|
||||||
ROTREnabled = Database_Services('ReadDataColumn', 'REACTOR', Reactor, REACTOR_ENABLE_ROTR$, True$, 0, False$)
|
ROTREnabled = Database_Services('ReadDataColumn', 'REACTOR', Reactor, REACTOR_ENABLE_ROTR$, True$, 0, False$)
|
||||||
@ -1017,11 +1028,11 @@ Service ProcessScanData(ScanID, ScanJSON)
|
|||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
// Why is it not ready?
|
// Why is it not ready?
|
||||||
ErrorMsg = Error_Services('GetMessage')
|
ErrMsg = Error_Services('GetMessage')
|
||||||
Begin Case
|
Begin Case
|
||||||
Case IndexC(ErrorMsg, 'supplement', 1)
|
Case IndexC(ErrMsg, 'supplement', 1)
|
||||||
Error_Services('Clear')
|
Error_Services('Clear')
|
||||||
Scan_Services('AddNotAcceptableReason', ErrorMsg)
|
Scan_Services('AddNotAcceptableReason', ErrMsg)
|
||||||
End Case
|
End Case
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
@ -1032,17 +1043,19 @@ Service ProcessScanData(ScanID, ScanJSON)
|
|||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
ScansRow<SCANS.SUPPLIER_LOT$> = ''
|
ScansRow<SCANS.SUPPLIER_LOT$> = ''
|
||||||
Error_Services('Add', '(':CassetteID:') Supplier lot mismatch.')
|
ErrMsg = '(':CassetteID:') Supplier lot mismatch.'
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
Scan_Services('AddNotAcceptableReason', 'Supplier lot scan required in order to complete a tool scan.')
|
Scan_Services('AddNotAcceptableReason', 'Supplier lot scan required in order to complete a tool scan.')
|
||||||
end
|
end
|
||||||
|
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', '(':CassetteID:') The first run must be completed using the OpenInsight user interface.')
|
ErrMsg = Error_Services('GetMessage')
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', '(':CassetteID:') A pre-clean is required for this RDS. The OpenInsight user interface must be used to proceed.')
|
ErrMsg = '(':CassetteID:') The first run must be completed using the OpenInsight user interface.'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrMsg = '(':CassetteID:') A pre-clean is required for this RDS. The OpenInsight user interface must be used to proceed.'
|
||||||
end
|
end
|
||||||
Case CurrStage _EQC 'LOAD'
|
Case CurrStage _EQC 'LOAD'
|
||||||
Action = 'LOAD'
|
Action = 'LOAD'
|
||||||
@ -1067,13 +1080,13 @@ Service ProcessScanData(ScanID, ScanJSON)
|
|||||||
LoadStageReady = QA_Services('LoadSignatureReady', RDSNo, Username, WaferQty, LLSide)
|
LoadStageReady = QA_Services('LoadSignatureReady', RDSNo, Username, WaferQty, LLSide)
|
||||||
If (LoadStageReady NE True$) then
|
If (LoadStageReady NE True$) then
|
||||||
// Why is it not ready?
|
// Why is it not ready?
|
||||||
ErrorMsg = Error_Services('GetMessage')
|
ErrMsg = Error_Services('GetMessage')
|
||||||
Begin Case
|
Begin Case
|
||||||
Case IndexC(ErrorMsg, 'supplement', 1)
|
Case IndexC(ErrMsg, 'supplement', 1)
|
||||||
// Clear the error to return a JSON payload and handle the acknowledgements.
|
// Clear the error to return a JSON payload and handle the acknowledgements.
|
||||||
Error_Services('Clear')
|
Error_Services('Clear')
|
||||||
Scan_Services('AddNotAcceptableReason', ErrorMsg)
|
Scan_Services('AddNotAcceptableReason', ErrMsg)
|
||||||
Case IndexC(ErrorMsg, 'ROTR', 1)
|
Case IndexC(ErrMsg, 'ROTR', 1)
|
||||||
ROTRBlock = Database_Services('ReadDataColumn', 'REACTOR', Reactor, REACTOR_ROTR_STATUS$, True$, 0, False$)
|
ROTRBlock = Database_Services('ReadDataColumn', 'REACTOR', Reactor, REACTOR_ROTR_STATUS$, True$, 0, False$)
|
||||||
ROTRBlockReason = Database_Services('ReadDataColumn', 'REACTOR', Reactor, REACTOR_ROTR_STATUS_REASON$, True$, 0, False$)
|
ROTRBlockReason = Database_Services('ReadDataColumn', 'REACTOR', Reactor, REACTOR_ROTR_STATUS_REASON$, True$, 0, False$)
|
||||||
ROTREnabled = Database_Services('ReadDataColumn', 'REACTOR', Reactor, REACTOR_ENABLE_ROTR$, True$, 0, False$)
|
ROTREnabled = Database_Services('ReadDataColumn', 'REACTOR', Reactor, REACTOR_ENABLE_ROTR$, True$, 0, False$)
|
||||||
@ -1098,11 +1111,11 @@ Service ProcessScanData(ScanID, ScanJSON)
|
|||||||
Scan_Services('AddNotAcceptableReason', 'The LWI stage engineering instructions must be acknowledged before the load operation can be signed.')
|
Scan_Services('AddNotAcceptableReason', 'The LWI stage engineering instructions must be acknowledged before the load operation can be signed.')
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
ErrorMessage = 'RDS layer parameters must be reviewed for accuracy and acknowledged before the load operation can be signed.'
|
ErrMsg = 'RDS layer parameters must be reviewed for accuracy and acknowledged before the load operation can be signed.'
|
||||||
Scan_Services('AddNotAcceptableReason', ErrorMessage)
|
Scan_Services('AddNotAcceptableReason', ErrMsg)
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', 'Scanned tool ':ScanTool:' does not match the scheduled tool ':SchedTool:'. (':RDSNo:')')
|
ErrMsg = 'Scanned tool ':ScanTool:' does not match the scheduled tool ':SchedTool:'. (':RDSNo:')'
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
Scan_Services('AddNotAcceptableReason', 'Test wafers are required to be logged with this run.')
|
Scan_Services('AddNotAcceptableReason', 'Test wafers are required to be logged with this run.')
|
||||||
@ -1110,7 +1123,7 @@ Service ProcessScanData(ScanID, ScanJSON)
|
|||||||
end else
|
end else
|
||||||
|
|
||||||
ScansRow<SCANS.SUPPLIER_LOT$> = ''
|
ScansRow<SCANS.SUPPLIER_LOT$> = ''
|
||||||
Error_Services('Add', '(':CassetteID:') Supplier lot mismatch.')
|
ErrMsg = '(':CassetteID:') Supplier lot mismatch.'
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
Scan_Services('AddNotAcceptableReason', 'Supplier lot scan required in order to complete a tool scan.')
|
Scan_Services('AddNotAcceptableReason', 'Supplier lot scan required in order to complete a tool scan.')
|
||||||
@ -1126,11 +1139,11 @@ Service ProcessScanData(ScanID, ScanJSON)
|
|||||||
UnloadStageReady = QA_Services('UnloadSignatureReady', RDSNo, Username, Reactor)
|
UnloadStageReady = QA_Services('UnloadSignatureReady', RDSNo, Username, Reactor)
|
||||||
If Not(UnloadStageReady) then
|
If Not(UnloadStageReady) then
|
||||||
// Why is it not ready?
|
// Why is it not ready?
|
||||||
ErrorMsg = Error_Services('GetMessage')
|
ErrMsg = Error_Services('GetMessage')
|
||||||
Begin Case
|
Begin Case
|
||||||
Case IndexC(ErrorMsg, 'supplement', 1)
|
Case IndexC(ErrMsg, 'supplement', 1)
|
||||||
Error_Services('Clear')
|
Error_Services('Clear')
|
||||||
Scan_Services('AddNotAcceptableReason', ErrorMsg)
|
Scan_Services('AddNotAcceptableReason', ErrMsg)
|
||||||
Case Otherwise$
|
Case Otherwise$
|
||||||
// Keep error on Error_Services stack and return 400 level error.
|
// Keep error on Error_Services stack and return 400 level error.
|
||||||
End Case
|
End Case
|
||||||
@ -1175,12 +1188,16 @@ Service ProcessScanData(ScanID, ScanJSON)
|
|||||||
LastCassInWoTestWaferReqMsg = ''
|
LastCassInWoTestWaferReqMsg = ''
|
||||||
If NextEventScheduled EQ False$ or NextEventIsBlock EQ True$ then
|
If NextEventScheduled EQ False$ or NextEventIsBlock EQ True$ then
|
||||||
LastCassInWoTestWaferReqMsg = 'No material scheduled. Test wafer required.'
|
LastCassInWoTestWaferReqMsg = 'No material scheduled. Test wafer required.'
|
||||||
|
Dialog_Response_Log_Services('AddDialogResponseLog', RDSNo, 'RDS', @User4, 'HTR_LAST_BOX_TW', 'No test wafer ran with box when one was required. Unload signature was blocked. User was notified.')
|
||||||
end else If NextEventHasSamePsn EQ False$ then
|
end else If NextEventHasSamePsn EQ False$ then
|
||||||
LastCassInWoTestWaferReqMsg = 'Next work order is a NEW PSN number. Test wafer required.'
|
LastCassInWoTestWaferReqMsg = 'Next work order is a NEW PSN number. Test wafer required.'
|
||||||
|
Dialog_Response_Log_Services('AddDialogResponseLog', RDSNo, 'RDS', @User4, 'HTR_LAST_BOX_TW', 'No test wafer ran with box when one was required. Unload signature was blocked. User was notified.')
|
||||||
end
|
end
|
||||||
|
|
||||||
Scan_Services('AddNotAcceptableReason', LastCassInWoTestWaferReqMsg)
|
Scan_Services('AddNotAcceptableReason', LastCassInWoTestWaferReqMsg)
|
||||||
end
|
end
|
||||||
|
end else
|
||||||
|
Dialog_Response_Log_Services('AddDialogResponseLog', RDSNo, 'RDS', @User4, 'HTR_LAST_BOX_TW', 'Test wafer was already logged with box. Unload signature was allowed. User was not prompted.')
|
||||||
end
|
end
|
||||||
|
|
||||||
WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$> = TestWaferRanSinceLoad
|
WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$> = TestWaferRanSinceLoad
|
||||||
@ -1190,12 +1207,10 @@ Service ProcessScanData(ScanID, ScanJSON)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
ErrorMessage = 'WO_MAT record was null.'
|
ErrMsg = 'WO_MAT record was null.'
|
||||||
Error_Services('Add', ErrorMessage)
|
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
ErrorMessage = 'Failure to read cassette record. ' : Error_Services('GetMessage')
|
ErrMsg = 'Failure to read cassette record. ' : Error_Services('GetMessage')
|
||||||
Error_Services('Add', ErrorMessage)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -1213,24 +1228,23 @@ Service ProcessScanData(ScanID, ScanJSON)
|
|||||||
end
|
end
|
||||||
Case CurrStage _EQC 'COMP'
|
Case CurrStage _EQC 'COMP'
|
||||||
Action = 'COMP'
|
Action = 'COMP'
|
||||||
Error_Services('Add', '(':CassetteID:") Cassette has already been FQA'd.")
|
ErrMsg = '(':CassetteID:") Cassette has already been FQA'd."
|
||||||
Case Otherwise$
|
Case Otherwise$
|
||||||
Action = CurrStage
|
Action = CurrStage
|
||||||
Error_Services('Set', '(':CassetteID:') The ':CurrStage:' is not currently supported by the barcode application.')
|
ErrMsg = '(':CassetteID:') The ':CurrStage:' is not currently supported by the barcode application.'
|
||||||
End Case
|
End Case
|
||||||
end else
|
end else
|
||||||
Scan_Services('AddNotAcceptableReason', 'EmployeeID required to complete a tool scan.')
|
Scan_Services('AddNotAcceptableReason', 'EmployeeID required to complete a tool scan.')
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', '(':CassetteID:') Process Error: cassette is on Hold and may not be signed off.')
|
ErrMsg = '(':CassetteID:') Process Error: cassette is on Hold and may not be signed off.'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', '(':CassetteID:') WMI/WMO cassette are not currently supported for tool scans. The OpenInsight user interface must be used in order to proceed.')
|
ErrMsg = '(':CassetteID:') WMI/WMO cassette are not currently supported for tool scans. The OpenInsight user interface must be used in order to proceed.'
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
// Currently we are only supporting loading one cassette onto a tool at a time.
|
ErrMsg = '(':CassetteID:') Only one cassette can be loaded onto a tool at a time.'
|
||||||
Error_Services('Add', '(':CassetteID:') Only one cassette can be loaded onto a tool at a time.')
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1291,7 +1305,7 @@ Service ProcessScanData(ScanID, ScanJSON)
|
|||||||
End Case
|
End Case
|
||||||
end
|
end
|
||||||
// If the the scan data is valid, update the scan log before returning to the calling process.
|
// If the the scan data is valid, update the scan log before returning to the calling process.
|
||||||
If Error_Services('NoError') then
|
If ErrMsg EQ '' then
|
||||||
If Scan_Services('NoNotAcceptableReason') then
|
If Scan_Services('NoNotAcceptableReason') then
|
||||||
ScansRow<SCANS.ACCEPTABLE$> = True$
|
ScansRow<SCANS.ACCEPTABLE$> = True$
|
||||||
ScansRow<SCANS.NOT_ACCEPTABLE_REASON$> = ''
|
ScansRow<SCANS.NOT_ACCEPTABLE_REASON$> = ''
|
||||||
@ -1301,7 +1315,7 @@ Service ProcessScanData(ScanID, ScanJSON)
|
|||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
ScansRow<SCANS.ACCEPTABLE$> = False$
|
ScansRow<SCANS.ACCEPTABLE$> = False$
|
||||||
ScansRow<SCANS.NOT_ACCEPTABLE_REASON$> = Error_Services('GetMessage')
|
ScansRow<SCANS.NOT_ACCEPTABLE_REASON$> = ErrMsg
|
||||||
end
|
end
|
||||||
If ScanData NE '' then
|
If ScanData NE '' then
|
||||||
ScansRow<SCANS.SCANNED_DATES$, -1> = Date()
|
ScansRow<SCANS.SCANNED_DATES$, -1> = Date()
|
||||||
@ -1309,25 +1323,21 @@ Service ProcessScanData(ScanID, ScanJSON)
|
|||||||
ScansRow<SCANS.SCANNED_DATA$, -1> = ScanData
|
ScansRow<SCANS.SCANNED_DATA$, -1> = ScanData
|
||||||
end
|
end
|
||||||
ScansRow<SCANS.ACTION$> = Action
|
ScansRow<SCANS.ACTION$> = Action
|
||||||
// Save error message if present as Database_Services will clear any errors.
|
|
||||||
ErrorMessage = ''
|
|
||||||
If Error_Services('HasError') then
|
|
||||||
ErrorMessage = Error_Services('GetMessage')
|
|
||||||
end
|
|
||||||
Database_Services('WriteDataRow', 'SCANS', ScanID, ScansRow, True$, False$, True$)
|
Database_Services('WriteDataRow', 'SCANS', ScanID, ScansRow, True$, False$, True$)
|
||||||
// Restore pre-existing error message if present.
|
|
||||||
If ErrorMessage NE '' then Error_Services('Add', ErrorMessage)
|
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', 'Unable to parse the JSON scan data in the ':Service:' service.')
|
ErrMsg = 'Unable to parse the JSON scan data in the ':Service:' service.'
|
||||||
end
|
end
|
||||||
SRP_JSON(hScanJSON, 'Release')
|
SRP_JSON(hScanJSON, 'Release')
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', 'ScanID or ScanJSON argument was missing in the ' : Service : ' service.')
|
ErrMsg = 'ScanID or ScanJSON argument was missing in the ' : Service : ' service.'
|
||||||
end
|
end
|
||||||
|
|
||||||
EndTick = GetTickCount()
|
EndTick = GetTickCount()
|
||||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||||
|
|
||||||
|
If ErrMsg NE '' then Error_Services('Add', ErrMsg)
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
@ -1339,6 +1349,7 @@ Service AcceptScan(ScanID, ScanJSON)
|
|||||||
StartTick = GetTickCount()
|
StartTick = GetTickCount()
|
||||||
MetricName = 'AcceptScan'
|
MetricName = 'AcceptScan'
|
||||||
|
|
||||||
|
ErrMsg = ''
|
||||||
If ( (ScanID NE '') and (ScanJSON NE '') ) then
|
If ( (ScanID NE '') and (ScanJSON NE '') ) then
|
||||||
hBody = ''
|
hBody = ''
|
||||||
ParseResponse = SRP_JSON(hBody, 'PARSE', ScanJSON)
|
ParseResponse = SRP_JSON(hBody, 'PARSE', ScanJSON)
|
||||||
@ -1371,7 +1382,7 @@ Service AcceptScan(ScanID, ScanJSON)
|
|||||||
If Error_Services('NoError') AND SendStatus EQ 'Success' then
|
If Error_Services('NoError') AND SendStatus EQ 'Success' then
|
||||||
Result = 'Tencor Data Sent Successfully'
|
Result = 'Tencor Data Sent Successfully'
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', SendStatus)
|
ErrMsg = SendStatus
|
||||||
end
|
end
|
||||||
|
|
||||||
Case ScanType _EQC 'LOCATION'
|
Case ScanType _EQC 'LOCATION'
|
||||||
@ -1476,8 +1487,7 @@ Service AcceptScan(ScanID, ScanJSON)
|
|||||||
end
|
end
|
||||||
|
|
||||||
IF Get_Status(errCode) THEN
|
IF Get_Status(errCode) THEN
|
||||||
ErrorMsg = 'Error calling obj_WO_Mat_Log("Create"). Error code: ':errCode
|
ErrMsg = 'Error calling obj_WO_Mat_Log("Create"). Error code: ':errCode
|
||||||
Error_Services('Add', ErrorMsg)
|
|
||||||
END else
|
END else
|
||||||
NumCass = DCount(CassetteIDs, @VM)
|
NumCass = DCount(CassetteIDs, @VM)
|
||||||
If NumCass EQ 1 then
|
If NumCass EQ 1 then
|
||||||
@ -1540,8 +1550,7 @@ Service AcceptScan(ScanID, ScanJSON)
|
|||||||
If Error_Services('NoError') then
|
If Error_Services('NoError') then
|
||||||
Continue = True$
|
Continue = True$
|
||||||
end else
|
end else
|
||||||
ErrorMessage = Error_Services('GetMessage')
|
ErrMsg = Error_Services('GetMessage')
|
||||||
Error_Services('Set', ErrorMessage)
|
|
||||||
Continue = False$
|
Continue = False$
|
||||||
end
|
end
|
||||||
If Continue then
|
If Continue then
|
||||||
@ -1585,8 +1594,7 @@ Service AcceptScan(ScanID, ScanJSON)
|
|||||||
If Error_Services('NoError') then
|
If Error_Services('NoError') then
|
||||||
Continue = True$
|
Continue = True$
|
||||||
end else
|
end else
|
||||||
ErrorMessage = Error_Services('GetMessage')
|
ErrMsg = Error_Services('GetMessage')
|
||||||
Error_Services('Set', ErrorMessage)
|
|
||||||
Continue = False$
|
Continue = False$
|
||||||
end
|
end
|
||||||
If Continue then
|
If Continue then
|
||||||
@ -1622,8 +1630,7 @@ Service AcceptScan(ScanID, ScanJSON)
|
|||||||
PSNo = Xlate('RDS', RDSNo, RDS_PROD_SPEC_ID$, True$, 'X')
|
PSNo = Xlate('RDS', RDSNo, RDS_PROD_SPEC_ID$, True$, 'X')
|
||||||
NewTestRunId = Test_Run_Services('CreateTestRunRecord', TestRunType, 'R', Reactor, PSNo, RDSNo,Username , TestWaferLots, TestWaferLotQtys)
|
NewTestRunId = Test_Run_Services('CreateTestRunRecord', TestRunType, 'R', Reactor, PSNo, RDSNo,Username , TestWaferLots, TestWaferLotQtys)
|
||||||
If Error_Services('HasError') then
|
If Error_Services('HasError') then
|
||||||
ErrorMessage = Error_Services('GetMessage')
|
ErrMsg = Error_Services('GetMessage')
|
||||||
Error_Services('Set', ErrorMessage)
|
|
||||||
Continue = False$
|
Continue = False$
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -1640,10 +1647,10 @@ Service AcceptScan(ScanID, ScanJSON)
|
|||||||
end
|
end
|
||||||
Case CurrStage _EQC 'COMP'
|
Case CurrStage _EQC 'COMP'
|
||||||
Action = 'COMP'
|
Action = 'COMP'
|
||||||
Error_Services('Set', '(':CassetteID:") Cassette has already been FQA'd.")
|
ErrMsg = '(':CassetteID:") Cassette has already been FQA'd."
|
||||||
Case Otherwise$
|
Case Otherwise$
|
||||||
Action = CurrStage
|
Action = CurrStage
|
||||||
Error_Services('Set', '(':CassetteID:') The ':CurrStage:' is not currently supported by the barcode application.')
|
ErrMsg = '(':CassetteID:') The ':CurrStage:' is not currently supported by the barcode application.'
|
||||||
End Case
|
End Case
|
||||||
Case CassetteID EQ '' AND TestWaferLots NE ''
|
Case CassetteID EQ '' AND TestWaferLots NE ''
|
||||||
//Tool scan with ONLY test wafers being logged.
|
//Tool scan with ONLY test wafers being logged.
|
||||||
@ -1656,12 +1663,10 @@ Service AcceptScan(ScanID, ScanJSON)
|
|||||||
If NewTestRunId NE '' then
|
If NewTestRunId NE '' then
|
||||||
Result = 'Test run logged successfully'
|
Result = 'Test run logged successfully'
|
||||||
end else
|
end else
|
||||||
ErrorMessage = 'Error while logging creating test run.'
|
ErrMsg = 'Error while logging creating test run.'
|
||||||
Error_Services('Set', ErrorMessage)
|
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
ErrorMessage = Error_Services('GetMessage')
|
ErrMsg = Error_Services('GetMessage')
|
||||||
Error_Services('Set', ErrorMessage)
|
|
||||||
end
|
end
|
||||||
Case Otherwise$
|
Case Otherwise$
|
||||||
//null
|
//null
|
||||||
@ -1669,34 +1674,30 @@ Service AcceptScan(ScanID, ScanJSON)
|
|||||||
End Case
|
End Case
|
||||||
end
|
end
|
||||||
|
|
||||||
If Error_Services('NoError') then
|
If ErrMsg EQ '' then
|
||||||
ScansRow<SCANS.NOT_ACCEPTABLE_REASON$> = 'This scan has already been accepted.'
|
ScansRow<SCANS.NOT_ACCEPTABLE_REASON$> = 'This scan has already been accepted.'
|
||||||
end else
|
end else
|
||||||
ScansRow<SCANS.NOT_ACCEPTABLE_REASON$> = Error_Services('GetMessage')
|
ScansRow<SCANS.NOT_ACCEPTABLE_REASON$> = ErrMsg
|
||||||
end
|
end
|
||||||
ScansRow<SCANS.ACCEPTABLE$> = False$
|
ScansRow<SCANS.ACCEPTABLE$> = False$
|
||||||
If Assigned(Result) then ScansRow<SCANS.RESULT$> = Result
|
If Assigned(Result) then ScansRow<SCANS.RESULT$> = Result
|
||||||
// Save error message if present as Database_Services will clear any errors.
|
|
||||||
ErrorMessage = ''
|
|
||||||
If Error_Services('HasError') then
|
|
||||||
ErrorMessage = Error_Services('GetMessage')
|
|
||||||
end
|
|
||||||
Scan_Services('SetScansRow', ScanID, ScansRow)
|
Scan_Services('SetScansRow', ScanID, ScansRow)
|
||||||
// Restore pre-existing error message if present.
|
|
||||||
If ErrorMessage NE '' then Error_Services('Add', ErrorMessage)
|
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', 'The accepted.status field is missing from the JSON object in the ':Service:' service.')
|
ErrMsg = 'The accepted.status field is missing from the JSON object in the ':Service:' service.'
|
||||||
end
|
end
|
||||||
SRP_JSON(hBody, 'Release')
|
SRP_JSON(hBody, 'Release')
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', 'Unable to parse the JSON scan resource in the ':Service:' service.')
|
ErrMsg = 'Unable to parse the JSON scan resource in the ':Service:' service.'
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', 'ScanID or ScanJSON argument was missing in the ' : Service : ' service.')
|
ErrMsg = 'ScanID or ScanJSON argument was missing in the ' : Service : ' service.'
|
||||||
end
|
end
|
||||||
|
|
||||||
EndTick = GetTickCount()
|
EndTick = GetTickCount()
|
||||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||||
|
|
||||||
|
If ErrMsg NE '' then Error_Services('Add', ErrMsg)
|
||||||
end service
|
end service
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
@ -1714,6 +1715,7 @@ Service ConvertMVScanToJSON(ScanID, mvScan, itemURL)
|
|||||||
|
|
||||||
mvScanChanged = False$
|
mvScanChanged = False$
|
||||||
|
|
||||||
|
ErrMsg = ''
|
||||||
If ScanID NE '' then
|
If ScanID NE '' then
|
||||||
|
|
||||||
If mvScan EQ '' then mvScan = Database_Services('ReadDataRow', 'SCANS', ScanID)
|
If mvScan EQ '' then mvScan = Database_Services('ReadDataRow', 'SCANS', ScanID)
|
||||||
@ -2167,17 +2169,19 @@ Service ConvertMVScanToJSON(ScanID, mvScan, itemURL)
|
|||||||
Database_Services('WriteDataRow', 'SCANS', {SCAN_ID}, mvScan, True$, False$, False$)
|
Database_Services('WriteDataRow', 'SCANS', {SCAN_ID}, mvScan, True$, False$, False$)
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', 'Unable to create JSON representation in the ' : Service : ' service.')
|
ErrMsg = 'Unable to create JSON representation in the ' : Service : ' service.'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', 'ScanID argument was missing in the ' : Service : ' service.')
|
ErrMsg = 'ScanID argument was missing in the ' : Service : ' service.'
|
||||||
end
|
end
|
||||||
|
|
||||||
Response = jsonScan
|
Response = jsonScan
|
||||||
|
|
||||||
EndTick = GetTickCount()
|
EndTick = GetTickCount()
|
||||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||||
|
|
||||||
|
If ErrMsg NE '' then Error_Services('Add', ErrMsg)
|
||||||
end service
|
end service
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
@ -2415,3 +2419,7 @@ ClearCursors:
|
|||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -30,22 +30,23 @@ Function Schedule_Services(@Service, @Params)
|
|||||||
|
|
||||||
#pragma precomp SRP_PreCompiler
|
#pragma precomp SRP_PreCompiler
|
||||||
|
|
||||||
$insert APP_INSERTS
|
$Insert APP_INSERTS
|
||||||
$insert SERVICE_SETUP
|
$Insert SERVICE_SETUP
|
||||||
$insert RLIST_EQUATES
|
$Insert RLIST_EQUATES
|
||||||
$insert REACTOR_EQUATES
|
$Insert REACTOR_EQUATES
|
||||||
$insert SCHED_DET_NG_EQUATES
|
$Insert SCHED_DET_NG_EQUATES
|
||||||
$insert WO_LOG_EQUATES
|
$Insert WO_LOG_EQUATES
|
||||||
$Insert WO_MAT_EQUATES
|
$Insert WO_MAT_EQUATES
|
||||||
$insert WO_SCHEDULE_NG_EQUATES
|
$Insert WO_SCHEDULE_NG_EQUATES
|
||||||
$insert COMPANY_EQUATES
|
$Insert COMPANY_EQUATES
|
||||||
$insert PROD_VER_EQUATES
|
$Insert PROD_VER_EQUATES
|
||||||
$insert PRS_LAYER_EQU
|
$Insert PRS_LAYER_EQU
|
||||||
$insert SCHEDULE_EVENT_SUMMMARY_EQUATES
|
$Insert SCHEDULE_EVENT_SUMMMARY_EQUATES
|
||||||
$insert EPI_PART_EQUATES
|
$Insert EPI_PART_EQUATES
|
||||||
$insert PROD_SPEC_EQUATES
|
$Insert PROD_SPEC_EQUATES
|
||||||
$insert SCHED_HIST_EQUATES
|
$Insert SCHED_HIST_EQUATES
|
||||||
$Insert RDS_EQUATES
|
$Insert RDS_EQUATES
|
||||||
|
$Insert WM_IN_EQUATES
|
||||||
|
|
||||||
Equ new_exist$ To 0 ; * Reduce Mode 0
|
Equ new_exist$ To 0 ; * Reduce Mode 0
|
||||||
Equ next_cur$ To 1
|
Equ next_cur$ To 1
|
||||||
@ -59,7 +60,7 @@ Declare subroutine Mona_Services
|
|||||||
Declare function SRP_Array, Schedule_Services, Memory_Services, Database_Services, SRP_Sort_Array, Datetime
|
Declare function SRP_Array, Schedule_Services, Memory_Services, Database_Services, SRP_Sort_Array, Datetime
|
||||||
Declare function Epi_Part_Services, SRP_Math, SRP_Hash, obj_Prod_Spec, Logging_Services, Environment_Services
|
Declare function Epi_Part_Services, SRP_Math, SRP_Hash, obj_Prod_Spec, Logging_Services, Environment_Services
|
||||||
Declare function Work_Order_Services, RTI_CreateGUID, Reactor_Services, Schedule_Services, NextKey, SRP_Datetime
|
Declare function Work_Order_Services, RTI_CreateGUID, Reactor_Services, Schedule_Services, NextKey, SRP_Datetime
|
||||||
Declare function SRP_Time, Lsl_Users_Services, GetTickCount
|
Declare function SRP_Time, Lsl_Users_Services, GetTickCount, obj_WO_Mat
|
||||||
|
|
||||||
Date = Oconv(Date(), 'D4/')
|
Date = Oconv(Date(), 'D4/')
|
||||||
LogFileName = Date[7, 4] : '-' : Date[1, 2] : '-' : Date[4, 2] : ' Scheduler Log.csv'
|
LogFileName = Date[7, 4] : '-' : Date[1, 2] : '-' : Date[4, 2] : ' Scheduler Log.csv'
|
||||||
@ -385,7 +386,6 @@ end service
|
|||||||
Service GetScheduleEventSummary(SchedDetKeyID, IncludeWaferDetails)
|
Service GetScheduleEventSummary(SchedDetKeyID, IncludeWaferDetails)
|
||||||
|
|
||||||
If IncludeWaferDetails NE True$ then IncludeWaferDetails = False$
|
If IncludeWaferDetails NE True$ then IncludeWaferDetails = False$
|
||||||
|
|
||||||
ScheduleEventSummary = ''
|
ScheduleEventSummary = ''
|
||||||
If SchedDetKeyID NE '' then
|
If SchedDetKeyID NE '' then
|
||||||
SchedDetRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', SchedDetKeyID)
|
SchedDetRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', SchedDetKeyID)
|
||||||
@ -442,10 +442,10 @@ Service GetScheduleEventSummary(SchedDetKeyID, IncludeWaferDetails)
|
|||||||
Begin Case
|
Begin Case
|
||||||
Case BackColor NE ''
|
Case BackColor NE ''
|
||||||
// Set in the schedule detail record. Use current color.
|
// Set in the schedule detail record. Use current color.
|
||||||
Case HotLotFlag
|
|
||||||
BackColor = 'LightCoral'
|
|
||||||
Case WOClosedFlag
|
Case WOClosedFlag
|
||||||
BackColor = 'LightGray'
|
BackColor = 'LightGray'
|
||||||
|
Case HotLotFlag
|
||||||
|
BackColor = 'LightCoral'
|
||||||
Case HardBlock
|
Case HardBlock
|
||||||
BackColor = 'LightGoldenRodYellow'
|
BackColor = 'LightGoldenRodYellow'
|
||||||
Case BlockOut
|
Case BlockOut
|
||||||
@ -807,6 +807,7 @@ Service GetCurrentEvent(ReactNo)
|
|||||||
MetricName = 'GetCurrentEvent'
|
MetricName = 'GetCurrentEvent'
|
||||||
|
|
||||||
SchedDetKey = ''
|
SchedDetKey = ''
|
||||||
|
ErrorMsg = ''
|
||||||
If ReactNo NE '' then
|
If ReactNo NE '' then
|
||||||
CurrDTM = Datetime()
|
CurrDTM = Datetime()
|
||||||
Query = 'SELECT SCHED_DET_NG WITH REACT_NO EQ "':ReactNo:'" AND WITH EVENT_COMP NE 1 BY START_DTM'
|
Query = 'SELECT SCHED_DET_NG WITH REACT_NO EQ "':ReactNo:'" AND WITH EVENT_COMP NE 1 BY START_DTM'
|
||||||
@ -819,19 +820,21 @@ Service GetCurrentEvent(ReactNo)
|
|||||||
Response = SchedDetKey
|
Response = SchedDetKey
|
||||||
end else
|
end else
|
||||||
ErrorMsg = 'Error in service ':Service:' module. Error code ':errCode
|
ErrorMsg = 'Error in service ':Service:' module. Error code ':errCode
|
||||||
Error_Services('Add', ErrorMsg)
|
|
||||||
end
|
end
|
||||||
GoSub ClearCursors
|
GoSub ClearCursors
|
||||||
end
|
end
|
||||||
|
|
||||||
EndTick = GetTickCount()
|
EndTick = GetTickCount()
|
||||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||||
|
|
||||||
|
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||||
end service
|
end service
|
||||||
|
|
||||||
Service CurrentEventIsBlock(ReactNo)
|
Service CurrentEventIsBlock(ReactNo)
|
||||||
StartTick = GetTickCount()
|
StartTick = GetTickCount()
|
||||||
MetricName = 'CurrentEventIsBlock'
|
MetricName = 'CurrentEventIsBlock'
|
||||||
|
|
||||||
|
ErrorMsg = ''
|
||||||
If ReactNo NE '' then
|
If ReactNo NE '' then
|
||||||
CurrentSchedDetKey = Schedule_Services('GetCurrentEvent', ReactNo)
|
CurrentSchedDetKey = Schedule_Services('GetCurrentEvent', ReactNo)
|
||||||
|
|
||||||
@ -847,15 +850,15 @@ Service CurrentEventIsBlock(ReactNo)
|
|||||||
end else
|
end else
|
||||||
Error = Error_Services('GetMessage')
|
Error = Error_Services('GetMessage')
|
||||||
ErrorMsg = 'Error in service ':Service:' module. ':Error
|
ErrorMsg = 'Error in service ':Service:' module. ':Error
|
||||||
Error_Services('Add', ErrorMsg)
|
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.'
|
ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.'
|
||||||
Error_Services('Add', ErrorMsg)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
EndTick = GetTickCount()
|
EndTick = GetTickCount()
|
||||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||||
|
|
||||||
|
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||||
end service
|
end service
|
||||||
|
|
||||||
Service GetNextEvent(ReactNo)
|
Service GetNextEvent(ReactNo)
|
||||||
@ -863,6 +866,7 @@ Service GetNextEvent(ReactNo)
|
|||||||
MetricName = 'GetNextEvent'
|
MetricName = 'GetNextEvent'
|
||||||
|
|
||||||
SchedDetKey = ''
|
SchedDetKey = ''
|
||||||
|
ErrorMsg = ''
|
||||||
If ReactNo NE '' then
|
If ReactNo NE '' then
|
||||||
CurrDTM = Datetime()
|
CurrDTM = Datetime()
|
||||||
Query = 'SELECT SCHED_DET_NG WITH REACT_NO EQ "':ReactNo:'" AND WITH EVENT_COMP NE 1 BY START_DTM'
|
Query = 'SELECT SCHED_DET_NG WITH REACT_NO EQ "':ReactNo:'" AND WITH EVENT_COMP NE 1 BY START_DTM'
|
||||||
@ -875,25 +879,24 @@ Service GetNextEvent(ReactNo)
|
|||||||
ReadNext SchedDetKey else EOF = True$
|
ReadNext SchedDetKey else EOF = True$
|
||||||
If EOF EQ True$ then
|
If EOF EQ True$ then
|
||||||
ErrorMsg = 'Error in service ':Service:' module. No incomplete events in schedule'
|
ErrorMsg = 'Error in service ':Service:' module. No incomplete events in schedule'
|
||||||
Error_Services('Add', ErrorMsg)
|
|
||||||
end else
|
end else
|
||||||
ReadNext SchedDetKey else EOF = True$
|
ReadNext SchedDetKey else EOF = True$
|
||||||
If EOF EQ True$ then
|
If EOF EQ True$ then
|
||||||
ErrorMsg = 'Error in service ':Service:' module. No incomplete events in schedule after current event'
|
ErrorMsg = 'Error in service ':Service:' module. No incomplete events in schedule after current event'
|
||||||
Error_Services('Add', ErrorMsg)
|
|
||||||
end else
|
end else
|
||||||
Response = SchedDetKey
|
Response = SchedDetKey
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
ErrorMsg = 'Error in service ':Service:' module. Error code ':errCode
|
ErrorMsg = 'Error in service ':Service:' module. Error code ':errCode
|
||||||
Error_Services('Add', ErrorMsg)
|
|
||||||
end
|
end
|
||||||
GoSub ClearCursors
|
GoSub ClearCursors
|
||||||
end
|
end
|
||||||
|
|
||||||
EndTick = GetTickCount()
|
EndTick = GetTickCount()
|
||||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||||
|
|
||||||
|
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||||
end service
|
end service
|
||||||
|
|
||||||
Service GetEngagedEvent(ReactNo)
|
Service GetEngagedEvent(ReactNo)
|
||||||
@ -947,6 +950,7 @@ Service NextEventIsSamePsn(ReactNo)
|
|||||||
MetricName = 'NextEventIsSamePsn'
|
MetricName = 'NextEventIsSamePsn'
|
||||||
|
|
||||||
Response = False$
|
Response = False$
|
||||||
|
ErrorMsg = ''
|
||||||
If ReactNo NE '' then
|
If ReactNo NE '' then
|
||||||
CurrentSchedDetKey = Schedule_Services('GetCurrentEvent', ReactNo)
|
CurrentSchedDetKey = Schedule_Services('GetCurrentEvent', ReactNo)
|
||||||
|
|
||||||
@ -987,17 +991,19 @@ Service NextEventIsSamePsn(ReactNo)
|
|||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.'
|
ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.'
|
||||||
Error_Services('Add', ErrorMsg)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
EndTick = GetTickCount()
|
EndTick = GetTickCount()
|
||||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||||
|
|
||||||
|
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||||
end service
|
end service
|
||||||
|
|
||||||
Service NextEventIsBlock(ReactNo)
|
Service NextEventIsBlock(ReactNo)
|
||||||
StartTick = GetTickCount()
|
StartTick = GetTickCount()
|
||||||
MetricName = 'NextEventIsBlock'
|
MetricName = 'NextEventIsBlock'
|
||||||
|
|
||||||
|
ErrorMsg = ''
|
||||||
If ReactNo NE '' then
|
If ReactNo NE '' then
|
||||||
NextSchedDetKey = Schedule_Services('GetNextEvent', ReactNo)
|
NextSchedDetKey = Schedule_Services('GetNextEvent', ReactNo)
|
||||||
|
|
||||||
@ -1013,15 +1019,15 @@ Service NextEventIsBlock(ReactNo)
|
|||||||
end else
|
end else
|
||||||
Error = Error_Services('GetMessage')
|
Error = Error_Services('GetMessage')
|
||||||
ErrorMsg = 'Error in service ':Service:' module. ':Error
|
ErrorMsg = 'Error in service ':Service:' module. ':Error
|
||||||
Error_Services('Add', ErrorMsg)
|
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.'
|
ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.'
|
||||||
Error_Services('Add', ErrorMsg)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
EndTick = GetTickCount()
|
EndTick = GetTickCount()
|
||||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||||
|
|
||||||
|
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||||
end service
|
end service
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
@ -1241,12 +1247,57 @@ Service AdjustScheduleEvents(ReactNo)
|
|||||||
Schedule_Services('LogActivity', ReactNo, LogData)
|
Schedule_Services('LogActivity', ReactNo, LogData)
|
||||||
LogData<3> = 'Event complete: ':OConv(EventRec<SCHED_DET_NG.EVENT_COMP$>, "Btrue,false")
|
LogData<3> = 'Event complete: ':OConv(EventRec<SCHED_DET_NG.EVENT_COMP$>, "Btrue,false")
|
||||||
Schedule_Services('LogActivity', ReactNo, LogData)
|
Schedule_Services('LogActivity', ReactNo, LogData)
|
||||||
|
LogData<3> = 'Event unprocessed cassettes: ':EventRec<SCHED_DET_NG.UNPROCESSED_CASS$>
|
||||||
|
Schedule_Services('LogActivity', ReactNo, LogData)
|
||||||
|
LogData<3> = 'Event processed cassettes: ':EventRec<SCHED_DET_NG.PROCESSED_CASS$>
|
||||||
|
Schedule_Services('LogActivity', ReactNo, LogData)
|
||||||
|
|
||||||
EventAdjustment = Schedule_Services('GetEventAdjustment', EventKey)
|
|
||||||
UnprocessedCass = EventRec<SCHED_DET_NG.UNPROCESSED_CASS$>
|
UnprocessedCass = EventRec<SCHED_DET_NG.UNPROCESSED_CASS$>
|
||||||
ProcessedCass = EventRec<SCHED_DET_NG.PROCESSED_CASS$>
|
ProcessedCass = EventRec<SCHED_DET_NG.PROCESSED_CASS$>
|
||||||
AllCassList = SRP_Array('Join', UnprocessedCass, ProcessedCass, 'OR', @VM)
|
AllCassList = SRP_Array('Join', UnprocessedCass, ProcessedCass, 'OR', @VM)
|
||||||
AllCassList = SRP_Array('SortSimpleList', AllCassList, 'AscendingNumbers', @VM)
|
AllCassList = SRP_Array('SortSimpleList', AllCassList, 'AscendingNumbers', @VM)
|
||||||
|
|
||||||
|
// Check each cassette to see if it was voided
|
||||||
|
VoidedQty = 0
|
||||||
|
WONo = EventRec<SCHED_DET_NG.WO_NO$>
|
||||||
|
EventWfrs = EventRec<SCHED_DET_NG.EVENT_TOTAL_WFRS$>
|
||||||
|
VoidedCassList = ''
|
||||||
|
VoidedWfrQty = 0
|
||||||
|
For each CassNo in AllCassList using @VM
|
||||||
|
If Epipro then
|
||||||
|
WmInKey = WoNo:'*1*':CassNo
|
||||||
|
Voided = Xlate('WM_IN', WmInKey, 'VOID', 'X')
|
||||||
|
CassQty = Xlate('WM_IN', WmInKey, 'WFR_CNT', 'X')
|
||||||
|
end else
|
||||||
|
WOMatKey = WoNo:'*':CassNo
|
||||||
|
Voided = Xlate('WO_MAT', WOMatKey, 'VOID', 'X')
|
||||||
|
CassQty = Xlate('WO_MAT', WOMatKey, 'WAFER_QTY', 'X')
|
||||||
|
end
|
||||||
|
If Voided then
|
||||||
|
VoidedCassList<0, -1> = CassNo
|
||||||
|
VoidedWfrQty += CassQty
|
||||||
|
end
|
||||||
|
Next CassNo
|
||||||
|
UnprocessedCass = SRP_Array('Join', UnprocessedCass, VoidedCassList, 'NOT', @VM)
|
||||||
|
ProcessedCass = SRP_Array('Join', ProcessedCass, VoidedCassList, 'NOT', @VM)
|
||||||
|
AllCassList = SRP_Array('Join', AllCassList, VoidedCassList, 'NOT', @VM)
|
||||||
|
EventWfrs -= VoidedWfrQty
|
||||||
|
EventRec<SCHED_DET_NG.UNPROCESSED_CASS$> = UnprocessedCass
|
||||||
|
EventRec<SCHED_DET_NG.PROCESSED_CASS$> = ProcessedCass
|
||||||
|
EventRec<SCHED_DET_NG.EVENT_TOTAL_WFRS$> = EventWfrs
|
||||||
|
Database_Services('WriteDataRow', 'SCHED_DET_NG', EventKey, EventRec, True$, False$, True$)
|
||||||
|
|
||||||
|
// Check each unprocessed cassette to ensure it does not need to be moved to the processed column
|
||||||
|
For each CassNo in UnprocessedCass using @VM
|
||||||
|
Schedule_Services('MarkCassProcessed', WONo, CassNo, Datetime())
|
||||||
|
Next CassNo
|
||||||
|
|
||||||
|
EventRec = Schedule_Services('GetScheduleDetail', EventKey)
|
||||||
|
UnprocessedCass = EventRec<SCHED_DET_NG.UNPROCESSED_CASS$>
|
||||||
|
ProcessedCass = EventRec<SCHED_DET_NG.PROCESSED_CASS$>
|
||||||
|
AllCassList = SRP_Array('Join', UnprocessedCass, ProcessedCass, 'OR', @VM)
|
||||||
|
AllCassList = SRP_Array('SortSimpleList', AllCassList, 'AscendingNumbers', @VM)
|
||||||
|
EventAdjustment = Schedule_Services('GetEventAdjustment', EventKey)
|
||||||
EventComp = (UnprocessedCass EQ '')
|
EventComp = (UnprocessedCass EQ '')
|
||||||
|
|
||||||
If Not(EventRec<SCHED_DET_NG.EVENT_COMP$>) and EventComp then
|
If Not(EventRec<SCHED_DET_NG.EVENT_COMP$>) and EventComp then
|
||||||
@ -1258,9 +1309,7 @@ Service AdjustScheduleEvents(ReactNo)
|
|||||||
end
|
end
|
||||||
|
|
||||||
EventRec<SCHED_DET_NG.EVENT_COMP$> = EventComp
|
EventRec<SCHED_DET_NG.EVENT_COMP$> = EventComp
|
||||||
WONo = EventRec<SCHED_DET_NG.WO_NO$>
|
|
||||||
ReactNo = EventRec<SCHED_DET_NG.REACT_NO$>
|
ReactNo = EventRec<SCHED_DET_NG.REACT_NO$>
|
||||||
EventWfrs = EventRec<SCHED_DET_NG.EVENT_TOTAL_WFRS$>
|
|
||||||
WOQty = Xlate('WO_LOG', WONo, 'QTY', 'X')
|
WOQty = Xlate('WO_LOG', WONo, 'QTY', 'X')
|
||||||
// If work order event is engaged then set start DTM to first cassette DTM in.
|
// If work order event is engaged then set start DTM to first cassette DTM in.
|
||||||
// If previous event end time overlaps (e.g. soft block finished sooner than scheduled)
|
// If previous event end time overlaps (e.g. soft block finished sooner than scheduled)
|
||||||
@ -2253,6 +2302,7 @@ end service
|
|||||||
Service AddSchedEvent(ReactorNo, WorkOrderNo, StartDTM, StopDTM, Description, WaferQty)
|
Service AddSchedEvent(ReactorNo, WorkOrderNo, StartDTM, StopDTM, Description, WaferQty)
|
||||||
|
|
||||||
// Create a unique key ID for the new event
|
// Create a unique key ID for the new event
|
||||||
|
ErrorMsg = ''
|
||||||
NewEventKeyID = RTI_CreateGUID()
|
NewEventKeyID = RTI_CreateGUID()
|
||||||
NewEventRec = ''
|
NewEventRec = ''
|
||||||
NewEventRec<SCHED_DET_NG.REACT_NO$> = ReactorNo
|
NewEventRec<SCHED_DET_NG.REACT_NO$> = ReactorNo
|
||||||
@ -2268,10 +2318,11 @@ Service AddSchedEvent(ReactorNo, WorkOrderNo, StartDTM, StopDTM, Description, Wa
|
|||||||
LastUnloadedRDS = ''
|
LastUnloadedRDS = ''
|
||||||
// Determine start cassette and slot number
|
// Determine start cassette and slot number
|
||||||
PrevSchedQty = Schedule_Services('GetScheduledWfrQty', WorkOrderNo)
|
PrevSchedQty = Schedule_Services('GetScheduledWfrQty', WorkOrderNo)
|
||||||
StartCass = SRP_Math('CEILING', ( (PrevSchedQty + 1) / 25))
|
VoidedQty = Work_Order_Services('GetVoidedWaferCount', WorkOrderNo)
|
||||||
|
StartCass = SRP_Math('CEILING', ( (PrevSchedQty + VoidedQty + 1) / 25))
|
||||||
If StartCass EQ 0 then StartCass = 1
|
If StartCass EQ 0 then StartCass = 1
|
||||||
StartSlot = Mod(PrevSchedQty, 25) + 1
|
StartSlot = Mod(PrevSchedQty, 25) + 1
|
||||||
TotalSchedQty = PrevSchedQty + WaferQty
|
TotalSchedQty = PrevSchedQty + WaferQty + VoidedQty
|
||||||
StopCass = SRP_Math('CEILING', ( TotalSchedQty / 25 ) )
|
StopCass = SRP_Math('CEILING', ( TotalSchedQty / 25 ) )
|
||||||
StopSlot = Mod(TotalSchedQty, 25)
|
StopSlot = Mod(TotalSchedQty, 25)
|
||||||
If StopSlot EQ 0 then StopSlot = 25
|
If StopSlot EQ 0 then StopSlot = 25
|
||||||
@ -2280,7 +2331,16 @@ Service AddSchedEvent(ReactorNo, WorkOrderNo, StartDTM, StopDTM, Description, Wa
|
|||||||
If EpiPro then
|
If EpiPro then
|
||||||
For CassNo = StartCass to StopCass
|
For CassNo = StartCass to StopCass
|
||||||
WMIKey = WorkOrderNo:'*1*':CassNo
|
WMIKey = WorkOrderNo:'*1*':CassNo
|
||||||
WMIRdsList = Xlate('WM_IN', WMIKey, 'RDS_NO', 'X')
|
If RowExists('WM_IN', WMIKey) then
|
||||||
|
WMIRec = Database_Services('ReadDataRow', 'WM_IN', WMIKey)
|
||||||
|
end else
|
||||||
|
// Material not received yet
|
||||||
|
WMIRec = ''
|
||||||
|
end
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
Voided = WMIRec<WM_IN_VOID$>
|
||||||
|
If Not(Voided) then
|
||||||
|
WMIRdsList = WMIRec<WM_IN_RDS_NO$>
|
||||||
If WMIRdsList NE '' then
|
If WMIRdsList NE '' then
|
||||||
Begin Case
|
Begin Case
|
||||||
Case ( (CassNo EQ StartCass) and (CassNo EQ StopCass) )
|
Case ( (CassNo EQ StartCass) and (CassNo EQ StopCass) )
|
||||||
@ -2303,12 +2363,29 @@ Service AddSchedEvent(ReactorNo, WorkOrderNo, StartDTM, StopDTM, Description, Wa
|
|||||||
// No RDS keys exist for this cassette yet, so it's unprocessed
|
// No RDS keys exist for this cassette yet, so it's unprocessed
|
||||||
EventUnprocCassList<0, -1> = CassNo
|
EventUnprocCassList<0, -1> = CassNo
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
Until (ErrorMsg NE '')
|
||||||
Next CassNo
|
Next CassNo
|
||||||
|
|
||||||
|
If (ErrorMsg EQ '') then
|
||||||
If RDSKeys NE '' then
|
If RDSKeys NE '' then
|
||||||
RDSKeys = SRP_Array('Clean', RDSKeys, 'TrimAndMakeUnique', @VM)
|
RDSKeys = SRP_Array('Clean', RDSKeys, 'TrimAndMakeUnique', @VM)
|
||||||
For each RDSKey in RDSKeys using @VM setting vPos
|
For each RDSKey in RDSKeys using @VM setting vPos
|
||||||
DtmOut = Xlate('RDS', RDSKey, 'DATETIME_OUT', 'X')
|
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKey)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
DateOut = RDSRec<RDS_DATE_OUT$>
|
||||||
|
TimeOut = RDSRec<RDS_TIME_OUT$>
|
||||||
|
TimeOut = TimeOut/86400
|
||||||
|
TimeOut = SRP_Math('ROUND', TimeOut, 5)
|
||||||
|
TimeOut = TimeOut[2, 6]
|
||||||
|
DtmOut = DateOut:TimeOut
|
||||||
|
end else
|
||||||
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
If (ErrorMsg EQ '' ) then
|
||||||
WMIKeys = Xlate('RDS', RDSKey, 'WM_IN_KEY', 'X')
|
WMIKeys = Xlate('RDS', RDSKey, 'WM_IN_KEY', 'X')
|
||||||
For each WMIKey in WMIKeys using @VM
|
For each WMIKey in WMIKeys using @VM
|
||||||
CassNo = Field(WMIKey, '*', 3)
|
CassNo = Field(WMIKey, '*', 3)
|
||||||
@ -2323,20 +2400,51 @@ Service AddSchedEvent(ReactorNo, WorkOrderNo, StartDTM, StopDTM, Description, Wa
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
Next WMIKey
|
Next WMIKey
|
||||||
|
end
|
||||||
|
Until (ErrorMsg NE '')
|
||||||
Next RDSKey
|
Next RDSKey
|
||||||
end
|
end
|
||||||
|
|
||||||
EventUnprocCassList = SRP_Array('SortSimpleList', EventUnprocCassList, 'AscendingNumbers', @VM)
|
EventUnprocCassList = SRP_Array('SortSimpleList', EventUnprocCassList, 'AscendingNumbers', @VM)
|
||||||
// This line ensures EpiPro cassettes are not recorded as both processed and unprocessed.
|
// This line ensures EpiPro cassettes are not recorded as both processed and unprocessed.
|
||||||
EventProcCassList = SRP_Array('Join', EventProcCassList, EventUnprocCassList, 'NOT', @VM)
|
EventProcCassList = SRP_Array('Join', EventProcCassList, EventUnprocCassList, 'NOT', @VM)
|
||||||
|
end
|
||||||
|
|
||||||
end else
|
end else
|
||||||
|
|
||||||
For CassNo = StartCass to StopCass
|
For CassNo = StartCass to StopCass
|
||||||
|
DtmOut = ''
|
||||||
WOMatKey = WorkOrderNo:'*':CassNo
|
WOMatKey = WorkOrderNo:'*':CassNo
|
||||||
RDSKey = Xlate('WO_MAT', WOMatKey, 'RDS_NO', 'X')
|
If RowExists('WO_MAT', WOMatKey) then
|
||||||
DtmOut = Xlate('RDS', RDSKey, 'DATETIME_OUT', 'X')
|
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
|
||||||
If DtmOut NE '' then
|
end else
|
||||||
|
// Material not received yet
|
||||||
|
WOMatRec = ''
|
||||||
|
end
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
Voided = WOMatRec<WO_MAT_VOID$>
|
||||||
|
If Not(Voided) then
|
||||||
|
RDSKey = WOMatRec<WO_MAT_RDS_NO$>
|
||||||
|
If (RDSKey NE '') then
|
||||||
|
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKey)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
DateOut = RDSRec<RDS_DATE_OUT$>
|
||||||
|
TimeOut = RDSRec<RDS_TIME_OUT$>
|
||||||
|
TimeOut = TimeOut/86400
|
||||||
|
TimeOut = SRP_Math('ROUND', TimeOut, 5)
|
||||||
|
TimeOut = TimeOut[2, 6]
|
||||||
|
DtmOut = DateOut:TimeOut
|
||||||
|
end else
|
||||||
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
|
||||||
|
If (ErrorMsg EQ '') then
|
||||||
|
If (DtmOut NE '') then
|
||||||
LastUnloadedRDS = RDSKey
|
LastUnloadedRDS = RDSKey
|
||||||
Locate CassNo in EventProcCassList using @VM setting Dummy else
|
Locate CassNo in EventProcCassList using @VM setting Dummy else
|
||||||
EventProcCassList<0, -1> = CassNo
|
EventProcCassList<0, -1> = CassNo
|
||||||
@ -2346,9 +2454,13 @@ Service AddSchedEvent(ReactorNo, WorkOrderNo, StartDTM, StopDTM, Description, Wa
|
|||||||
EventUnprocCassList<0, -1> = CassNo
|
EventUnprocCassList<0, -1> = CassNo
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
Until (ErrorMsg NE '')
|
||||||
Next CassNo
|
Next CassNo
|
||||||
end
|
end
|
||||||
|
|
||||||
|
If (ErrorMsg EQ '') then
|
||||||
|
|
||||||
EventComp = (EventUnprocCassList EQ '')
|
EventComp = (EventUnprocCassList EQ '')
|
||||||
If EventComp then StopDtm = Xlate('RDS', LastUnloadedRDS, 'DATETIME_OUT', 'X')
|
If EventComp then StopDtm = Xlate('RDS', LastUnloadedRDS, 'DATETIME_OUT', 'X')
|
||||||
|
|
||||||
@ -2400,6 +2512,9 @@ Service AddSchedEvent(ReactorNo, WorkOrderNo, StartDTM, StopDTM, Description, Wa
|
|||||||
Schedule_Services('AddSchedHist', NewEventKeyID, ReactorNo, 'ADD', @User4)
|
Schedule_Services('AddSchedHist', NewEventKeyID, ReactorNo, 'ADD', @User4)
|
||||||
Response = NewEventKeyID
|
Response = NewEventKeyID
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
@ -3195,19 +3310,33 @@ Service MarkCassProcessed(WONo, CassNo, ProcessedDTM)
|
|||||||
CassComp = True$
|
CassComp = True$
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
CassComp = True$
|
WOMatKey = WoNo:'*':CassNo
|
||||||
|
CurrWaferCount = obj_WO_Mat('CurrWaferCnt', WOMatKey)
|
||||||
|
RDSNo = Xlate('WO_MAT', WOMatKey, 'RDS_NO', 'X')
|
||||||
|
DateOut = Xlate('RDS', RDSNo, 'DATE_OUT', 'X')
|
||||||
|
CassComp = ( (CurrWaferCount EQ 0) or (DateOut NE '') )
|
||||||
end
|
end
|
||||||
UnprocessedCassettes = SchedDetNGRec<SCHED_DET_NG.UNPROCESSED_CASS$>
|
|
||||||
If CassComp then
|
If CassComp then
|
||||||
|
RecChanged = False$
|
||||||
|
UnprocessedCassettes = SchedDetNGRec<SCHED_DET_NG.UNPROCESSED_CASS$>
|
||||||
Locate CassNo in UnprocessedCassettes using @VM setting vPos then
|
Locate CassNo in UnprocessedCassettes using @VM setting vPos then
|
||||||
UnprocessedCassettes = Delete(UnprocessedCassettes, 0, vPos, 0)
|
UnprocessedCassettes = Delete(UnprocessedCassettes, 0, vPos, 0)
|
||||||
|
RecChanged = True$
|
||||||
|
end
|
||||||
ProcessedCassettes = SchedDetNGRec<SCHED_DET_NG.PROCESSED_CASS$>
|
ProcessedCassettes = SchedDetNGRec<SCHED_DET_NG.PROCESSED_CASS$>
|
||||||
|
Locate CassNo in ProcessedCassettes using @VM setting vPos else
|
||||||
ProcessedCassettes<0, -1> = CassNo
|
ProcessedCassettes<0, -1> = CassNo
|
||||||
|
ProcessedCassettes = SRP_Array('Clean', ProcessedCassettes, 'TrimAndMakeUnique', @VM)
|
||||||
|
ProcessedCassettes = SRP_Array('SortSimpleList', ProcessedCassettes, 'AscendingNumbers', @VM)
|
||||||
|
RecChanged = True$
|
||||||
|
end
|
||||||
|
If RecChanged then
|
||||||
SchedDetNGRec<SCHED_DET_NG.UNPROCESSED_CASS$> = UnprocessedCassettes
|
SchedDetNGRec<SCHED_DET_NG.UNPROCESSED_CASS$> = UnprocessedCassettes
|
||||||
SchedDetNGRec<SCHED_DET_NG.PROCESSED_CASS$> = ProcessedCassettes
|
SchedDetNGRec<SCHED_DET_NG.PROCESSED_CASS$> = ProcessedCassettes
|
||||||
Database_Services('WriteDataRow', 'SCHED_DET_NG', SchedDetNGKey, SchedDetNGRec, True$, False$, True$)
|
Database_Services('WriteDataRow', 'SCHED_DET_NG', SchedDetNGKey, SchedDetNGRec, True$, False$, True$)
|
||||||
Done = True$
|
|
||||||
end
|
end
|
||||||
|
Done = True$
|
||||||
end
|
end
|
||||||
Until Done EQ True$
|
Until Done EQ True$
|
||||||
Repeat
|
Repeat
|
||||||
@ -3596,5 +3725,3 @@ CreateScheduleChangeNotification:
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
159
LSL2/STPROC/SEMI_VEND_CODE_API.txt
Normal file
159
LSL2/STPROC/SEMI_VEND_CODE_API.txt
Normal file
@ -0,0 +1,159 @@
|
|||||||
|
Function Semi_vend_code_API(@API)
|
||||||
|
/***********************************************************************************************************************
|
||||||
|
|
||||||
|
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
|
||||||
|
permission from SRP Computer Solutions, Inc.
|
||||||
|
|
||||||
|
Name : Semi_vend_code_API
|
||||||
|
|
||||||
|
Description : API logic for the Semi_vend_code resource.
|
||||||
|
|
||||||
|
Notes : All web APIs should include the API_SETUP insert. This will provide several useful variables:
|
||||||
|
|
||||||
|
HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.)
|
||||||
|
APIURL - The URL for the API entry point (e.g., api.mysite.com/v1).
|
||||||
|
FullEndpointURL - The URL submitted by the client, including query params.
|
||||||
|
FullEndpointURLNoQuery - The URL submitted by the client, excluding query params.
|
||||||
|
EndpointSegment - The URL endpoint segment.
|
||||||
|
ParentURL - The URL path preceeding the current endpoint.
|
||||||
|
CurrentAPI - The name of this stored procedure.
|
||||||
|
|
||||||
|
Parameters :
|
||||||
|
API [in] -- Web API to process. Format is [APIPattern].[HTTPMethod]:
|
||||||
|
- APIPattern must follow this structure Semi_vend_code[.ID.[<Property>]]
|
||||||
|
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||||
|
Examples:
|
||||||
|
- Semi_vend_code.POST
|
||||||
|
- Semi_vend_code.ID.PUT
|
||||||
|
- Semi_vend_code.ID.firstName.GET
|
||||||
|
Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API
|
||||||
|
services do not rely upon anything being returned in the response. This is what the
|
||||||
|
various services like SetResponseBody and SetResponseStatus services are for. A response
|
||||||
|
value is only helpful if the developers want to use it for debug purposes.
|
||||||
|
|
||||||
|
History : (Date, Initials, Notes)
|
||||||
|
09/12/25 djs Original programmer.
|
||||||
|
|
||||||
|
***********************************************************************************************************************/
|
||||||
|
|
||||||
|
#pragma precomp SRP_PreCompiler
|
||||||
|
|
||||||
|
$Insert APP_INSERTS
|
||||||
|
$Insert API_SETUP
|
||||||
|
$Insert HTTP_INSERTS
|
||||||
|
$Insert SEMI_VEND_CODE_EQUATES
|
||||||
|
|
||||||
|
Declare function Semi_Vend_Code_Services
|
||||||
|
|
||||||
|
GoToAPI else
|
||||||
|
// The specific resource endpoint doesn't have a API handler yet.
|
||||||
|
HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.')
|
||||||
|
end
|
||||||
|
|
||||||
|
Return Response OR ''
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Endpoint Handlers
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
API semi_vend_code.HEAD
|
||||||
|
API semi_vend_code.GET
|
||||||
|
|
||||||
|
GoSub CreateHALCollection
|
||||||
|
|
||||||
|
end api
|
||||||
|
|
||||||
|
|
||||||
|
API semi_vend_code.ID.HEAD
|
||||||
|
API semi_vend_code.ID.GET
|
||||||
|
|
||||||
|
GoSub CreateHALItem
|
||||||
|
|
||||||
|
end api
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Internal GoSubs
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
CreateHALItem:
|
||||||
|
|
||||||
|
ResponseCode = 200
|
||||||
|
SemiVendCd = EndpointSegment
|
||||||
|
IF RowExists('SEMI_VEND_CODE', SemiVendCd) then
|
||||||
|
JSON = Semi_Vend_Code_Services('ConvertRecordToJSON', SemiVendCd)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||||
|
HTTP_Services('SetResponseBody', JSON, False$, 'application/hal+json')
|
||||||
|
If Assigned(Message) then
|
||||||
|
HTTP_Services('SetResponseStatus', ResponseCode, Message)
|
||||||
|
end else
|
||||||
|
HTTP_Services('SetResponseStatus', ResponseCode)
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Message = Error_Services('GetMessage')
|
||||||
|
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ResponseCode = 406
|
||||||
|
ResponseMessage = 'No WO found based on the search criteria provided.'
|
||||||
|
HTTP_Services('SetResponseStatus', ResponseCode, ResponseMessage)
|
||||||
|
end
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
// CreateHALCollection
|
||||||
|
//
|
||||||
|
// Creates a HAL+JSON collection based on OpenInsight data row representations.
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
CreateHALCollection:
|
||||||
|
|
||||||
|
StatusCode = 200
|
||||||
|
JSONCollection = ''
|
||||||
|
Abort = False$
|
||||||
|
SemiVendCodes = Semi_Vend_Code_Services('GetSemiVendCodes')
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
If SemiVendCodes NE '' then
|
||||||
|
If SRP_JSON(hJSONCollection, 'New', 'Object') then
|
||||||
|
If SRP_Json(hSemiArray, 'New', 'Array') then
|
||||||
|
For each SemiVendCode in SemiVendCodes using @FM
|
||||||
|
SemiJson = Semi_Vend_Code_Services('ConvertRecordToJSON', SemiVendCode)
|
||||||
|
If (SRP_Json(hSemi, 'Parse', SemiJson) EQ '') then
|
||||||
|
hTemp = SRP_Json(hSemi, 'Get', 'SemiVendCode')
|
||||||
|
SRP_Json(hSemiArray, 'Add', hTemp)
|
||||||
|
SRP_Json(hTemp, 'Release')
|
||||||
|
SRP_Json(hSemi, 'Release')
|
||||||
|
end
|
||||||
|
Next SemiVendCode
|
||||||
|
end
|
||||||
|
SRP_Json(hJSONCollection, 'Set', 'SemiVendCodes', hSemiArray)
|
||||||
|
SRP_Json(hSemiArray, 'Release')
|
||||||
|
JSONCollection = SRP_JSON(hJSONCollection, 'Stringify', 'Fast')
|
||||||
|
SRP_JSON(hJSONCollection, 'Release')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Message = 'No Semi Vend Codes found!'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Message = Error_Services('GetMessage')
|
||||||
|
StatusCode = 500
|
||||||
|
end
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||||
|
HTTP_Services('SetResponseBody', JSONCollection, False$, 'application/hal+json')
|
||||||
|
If Assigned(Message) then
|
||||||
|
HTTP_Services('SetResponseStatus', StatusCode, Message)
|
||||||
|
end else
|
||||||
|
HTTP_Services('SetResponseStatus', StatusCode)
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Message = Error_Services('GetMessage')
|
||||||
|
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
|
||||||
|
end
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
124
LSL2/STPROC/SEMI_VEND_CODE_SERVICES.txt
Normal file
124
LSL2/STPROC/SEMI_VEND_CODE_SERVICES.txt
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
Function Semi_Vend_Code_Services(@Service, @Params)
|
||||||
|
/***********************************************************************************************************************
|
||||||
|
|
||||||
|
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
|
||||||
|
permission from Infineon Technologies.
|
||||||
|
|
||||||
|
Name : Semi_Vend_Code_Services
|
||||||
|
|
||||||
|
Description : Handler program for all module related services.
|
||||||
|
|
||||||
|
Notes : The generic parameters should contain all the necessary information to process the services. Often
|
||||||
|
this will be information like the data Record and Key ID.
|
||||||
|
|
||||||
|
Parameters :
|
||||||
|
Service [in] -- Name of the service being requested
|
||||||
|
Param1-10 [in/out] -- Additional request parameter holders
|
||||||
|
Response [out] -- Response to be sent back to the Controller (MCP) or requesting procedure
|
||||||
|
|
||||||
|
Metadata :
|
||||||
|
|
||||||
|
History : (Date, Initials, Notes)
|
||||||
|
09/12/2025 djs Created service module for OI Wizard Receive and Release operations.
|
||||||
|
|
||||||
|
***********************************************************************************************************************/
|
||||||
|
#pragma precomp SRP_PreCompiler
|
||||||
|
|
||||||
|
$Insert APP_INSERTS
|
||||||
|
$Insert SERVICE_SETUP
|
||||||
|
$Insert SEMI_VEND_CODE_EQUATES
|
||||||
|
|
||||||
|
Declare function Database_Services, SRP_Json
|
||||||
|
Declare subroutine Error_Services, SRP_Json
|
||||||
|
|
||||||
|
GoToService else
|
||||||
|
Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
|
||||||
|
end
|
||||||
|
|
||||||
|
Return Response else ''
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Service Parameter Options
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
Options BOOLEAN = True$, False$
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Services
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
// GetSemiVendCodes
|
||||||
|
//
|
||||||
|
// Returns an @FM delimited array of all SEMI_VEND_CD keys in the table.
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
Service GetSemiVendCodes()
|
||||||
|
|
||||||
|
ErrorMsg = ''
|
||||||
|
SemiVendCodes = ''
|
||||||
|
Open 'SEMI_VEND_CODE' to hTable then
|
||||||
|
Select hTable
|
||||||
|
EOF = False$
|
||||||
|
SemiVendCodes = ''
|
||||||
|
Loop
|
||||||
|
Readnext KeyId else EOF = True$
|
||||||
|
Until EOF
|
||||||
|
SemiVendCodes<-1> = KeyId
|
||||||
|
Repeat
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Error opening SEMI_VEND_CODE table.'
|
||||||
|
end
|
||||||
|
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||||
|
Response = SemiVendCodes
|
||||||
|
|
||||||
|
end service
|
||||||
|
|
||||||
|
|
||||||
|
Service ConvertRecordToJSON(KeyId, Record)
|
||||||
|
|
||||||
|
ErrorMsg = ''
|
||||||
|
JsonRecord = ''
|
||||||
|
If KeyId NE '' then
|
||||||
|
If Record EQ '' then Record = Database_Services('ReadDataRow', 'SEMI_VEND_CODE', KeyId)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
// Create the JSON response object
|
||||||
|
objJSON = ''
|
||||||
|
If SRP_JSON(objJSON, 'New', 'Object') then
|
||||||
|
objSemiVendCode = ''
|
||||||
|
If SRP_JSON(objSemiVendCode, 'New', 'Object') then
|
||||||
|
SRP_JSON(objSemiVendCode, 'SetValue', 'VendCd', KeyId)
|
||||||
|
SRP_JSON(objSemiVendCode, 'SetValue', 'VendorName', Record<SEMI_VEND_CODE_VENDOR_NAME$>)
|
||||||
|
SRP_JSON(objSemiVendCode, 'SetValue', 'Location', Record<SEMI_VEND_CODE_LOCATION$>)
|
||||||
|
SRP_JSON(objSemiVendCode, 'SetValue', 'EpiVendCd', Record<SEMI_VEND_CODE_EPI_VEND_CD$>)
|
||||||
|
SRP_JSON(objJSON, 'Set', 'SemiVendCode', objSemiVendCode)
|
||||||
|
SRP_JSON(objSemiVendCode, 'Release')
|
||||||
|
end
|
||||||
|
jsonRecord = SRP_JSON(objJSON, 'Stringify', 'Styled')
|
||||||
|
SRP_JSON(objJSON, 'Release')
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Unable to create JSON object'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Null KeyId passed into service.'
|
||||||
|
end
|
||||||
|
|
||||||
|
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||||
|
Response = JsonRecord
|
||||||
|
|
||||||
|
end service
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Internal GoSubs
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
ClearCursors:
|
||||||
|
|
||||||
|
For counter = 0 to 8
|
||||||
|
ClearSelect counter
|
||||||
|
Next counter
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
@ -456,6 +456,7 @@ Service AcknowledgeSupplement(SupplID, EntryUser)
|
|||||||
StartTick = GetTickCount()
|
StartTick = GetTickCount()
|
||||||
MetricName = 'AcknowledgeSupplement'
|
MetricName = 'AcknowledgeSupplement'
|
||||||
|
|
||||||
|
ErrMsg = ''
|
||||||
If ( (SupplID NE '') and (EntryUser NE '') ) then
|
If ( (SupplID NE '') and (EntryUser NE '') ) then
|
||||||
OldRec = Xlate('SUPPLEMENTS', SupplID, '', 'X', '')
|
OldRec = Xlate('SUPPLEMENTS', SupplID, '', 'X', '')
|
||||||
If OldRec NE '' then
|
If OldRec NE '' then
|
||||||
@ -469,19 +470,21 @@ Service AcknowledgeSupplement(SupplID, EntryUser)
|
|||||||
Supplement_Services('LogSupplementChange', NewRec, 'Acknowledged', EntryUser)
|
Supplement_Services('LogSupplementChange', NewRec, 'Acknowledged', EntryUser)
|
||||||
end else
|
end else
|
||||||
Response = FALSE$
|
Response = FALSE$
|
||||||
Error_Services('Add', 'Error editing Supplement record.')
|
ErrMsg = 'Error editing Supplement record.'
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
Response = FALSE$
|
Response = FALSE$
|
||||||
Error_Services('Add', 'Record does not exist.')
|
ErrMsg = 'Record does not exist.'
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
Response = FALSE$
|
Response = FALSE$
|
||||||
Error_Services('Add', 'SupplID or EntryUser was missing in the ' : Service : ' service.')
|
ErrMsg = 'SupplID or EntryUser was missing in the ' : Service : ' service.'
|
||||||
end
|
end
|
||||||
|
|
||||||
EndTick = GetTickCount()
|
EndTick = GetTickCount()
|
||||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||||
|
|
||||||
|
If ErrMsg NE '' then Error_Services('Add', ErrMsg)
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
@ -501,6 +504,7 @@ Service UnacknowledgedSupplementCheck(LotType=LOTTYPES, LotID, Stage=STAGES)
|
|||||||
|
|
||||||
UnackList = ''
|
UnackList = ''
|
||||||
Response = False$
|
Response = False$
|
||||||
|
ErrMsg = ''
|
||||||
If ( (LotType NE '') and (LotID NE '') and (Stage NE '') ) then
|
If ( (LotType NE '') and (LotID NE '') and (Stage NE '') ) then
|
||||||
KeyList = ''
|
KeyList = ''
|
||||||
Query = ''
|
Query = ''
|
||||||
@ -518,23 +522,25 @@ Service UnacknowledgedSupplementCheck(LotType=LOTTYPES, LotID, Stage=STAGES)
|
|||||||
If AckField NE True$ then UnackList<-1> = Key
|
If AckField NE True$ then UnackList<-1> = Key
|
||||||
Next Key
|
Next Key
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', 'Error in ':Service:' service. Error opening SUPPLEMENTS table.')
|
ErrMsg = 'Error in ':Service:' service. Error opening SUPPLEMENTS table.'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', 'Error in ':Service:' service. Error calling Btree.Extract')
|
ErrMsg = 'Error in ':Service:' service. Error calling Btree.Extract'
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', 'Error in ':Service:' service. Error opening SUPPLEMENTS dictionary.')
|
ErrMsg = 'Error in ':Service:' service. Error opening SUPPLEMENTS dictionary.'
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', 'LotType, LotID, or Stage was missing in the ' : Service : ' service.')
|
ErrMsg = 'LotType, LotID, or Stage was missing in the ' : Service : ' service.'
|
||||||
end
|
end
|
||||||
|
|
||||||
If UnackList NE '' then Response = UnackList
|
If UnackList NE '' then Response = UnackList
|
||||||
|
|
||||||
EndTick = GetTickCount()
|
EndTick = GetTickCount()
|
||||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||||
|
|
||||||
|
If ErrMsg NE '' then Error_Services('Add', ErrMsg)
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
@ -552,6 +558,7 @@ Service LogSupplementChange(SupplementRec, EditEvent, EntryUser)
|
|||||||
StartTick = GetTickCount()
|
StartTick = GetTickCount()
|
||||||
MetricName = 'LogSupplementChange'
|
MetricName = 'LogSupplementChange'
|
||||||
|
|
||||||
|
ErrMsg = ''
|
||||||
If ( (SupplementRec NE '') and (EditEvent NE '') and (EntryUser NE '') ) then
|
If ( (SupplementRec NE '') and (EditEvent NE '') and (EntryUser NE '') ) then
|
||||||
SupplementText = SupplementRec<SUPPLEMENTS_SUPPL_TEXT$>
|
SupplementText = SupplementRec<SUPPLEMENTS_SUPPL_TEXT$>
|
||||||
LotType = SupplementRec<SUPPLEMENTS_LOT_TYPE$>
|
LotType = SupplementRec<SUPPLEMENTS_LOT_TYPE$>
|
||||||
@ -565,11 +572,13 @@ Service LogSupplementChange(SupplementRec, EditEvent, EntryUser)
|
|||||||
End Case
|
End Case
|
||||||
|
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', 'LotType, LotID, or Stage was missing in the ' : Service : ' service.')
|
ErrMsg = 'LotType, LotID, or Stage was missing in the ' : Service : ' service.'
|
||||||
end
|
end
|
||||||
|
|
||||||
EndTick = GetTickCount()
|
EndTick = GetTickCount()
|
||||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||||
|
|
||||||
|
If ErrMsg NE '' then Error_Services('Add', ErrMsg)
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
@ -670,3 +679,4 @@ Service SendNotifications(RDSList, EditEvent, Instructions, EntryUser)
|
|||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
40
LSL2/STPROC/TEST_PSN_SERVICES.txt
Normal file
40
LSL2/STPROC/TEST_PSN_SERVICES.txt
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
Compile function Test_PSN_Services(@Test)
|
||||||
|
#pragma precomp SRP_PreCompiler
|
||||||
|
|
||||||
|
$Insert LOGICAL
|
||||||
|
|
||||||
|
Declare function PSN_Services, Error_Services
|
||||||
|
Declare subroutine PSN_Services, Error_Services
|
||||||
|
|
||||||
|
Error_Services('Clear')
|
||||||
|
|
||||||
|
GotoTest
|
||||||
|
|
||||||
|
// TODO: Code to run after each test goes here
|
||||||
|
|
||||||
|
Return TestResult or 1
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// TESTS
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Test GetMetrologyRecipesAndPatternsWithNullPsnNoShouldThrowError
|
||||||
|
PSN_Services('GetMetrologyRecipesAndPatterns', '')
|
||||||
|
Assert Error_Services('HasError') equals True$
|
||||||
|
end test
|
||||||
|
|
||||||
|
Test GetMetrologyRecipesAndPatternsWithInvalidPsnNoShouldThrowError
|
||||||
|
PSN_Services('GetMetrologyRecipesAndPatterns', 'potato')
|
||||||
|
Assert Error_Services('HasError') equals True$
|
||||||
|
end test
|
||||||
|
|
||||||
|
Test GetMetrologyRecipesAndPatternsWithValidPsnNoShouldReturnPrescribedValues
|
||||||
|
Values = PSN_Services('GetMetrologyRecipesAndPatterns', 4609)
|
||||||
|
Assert DCount(Values, @FM) equals 9
|
||||||
|
|
||||||
|
Values = PSN_Services('GetMetrologyRecipesAndPatterns', 5159)
|
||||||
|
Assert DCount(Values, @FM) equals 7
|
||||||
|
|
||||||
|
Values = PSN_Services('GetMetrologyRecipesAndPatterns', 4830)
|
||||||
|
Assert DCount(Values, @FM) equals 9
|
||||||
|
end test
|
||||||
@ -2,6 +2,7 @@ Compile function TEST_RUN_Services(@Service, @Params)
|
|||||||
#pragma precomp SRP_PreCompiler
|
#pragma precomp SRP_PreCompiler
|
||||||
$insert LOGICAL
|
$insert LOGICAL
|
||||||
$Insert APP_INSERTS
|
$Insert APP_INSERTS
|
||||||
|
$Insert SERVICE_SETUP
|
||||||
$Insert TEST_WAFER_PROD_EQUATES
|
$Insert TEST_WAFER_PROD_EQUATES
|
||||||
$Insert TEST_WAFER_TYPES_DISPO_OPTIONS_EQUATES
|
$Insert TEST_WAFER_TYPES_DISPO_OPTIONS_EQUATES
|
||||||
$Insert TEST_RUN_EQUATES
|
$Insert TEST_RUN_EQUATES
|
||||||
@ -10,7 +11,7 @@ $Insert TEST_RUN_OBJ_EQUATES
|
|||||||
$Insert LOT_EQUATES
|
$Insert LOT_EQUATES
|
||||||
$Insert LOT_OPERATION_EQUATES
|
$Insert LOT_OPERATION_EQUATES
|
||||||
|
|
||||||
Declare function Nextkey, Error_Services, Environment_Services, OConv, Logging_Services, SRP_Hashtable, Lot_Services, GetTickCount
|
Declare function Nextkey, Error_Services, Environment_Services, OConv, Logging_Services, SRP_Hashtable, Lot_Services, GetTickCount, Xlate
|
||||||
Declare function SRP_Datetime, Database_Services, Test_Run_Services, File_Services, Status, delete, Insert, Datetime, SRP_Json, MemberOf
|
Declare function SRP_Datetime, Database_Services, Test_Run_Services, File_Services, Status, delete, Insert, Datetime, SRP_Json, MemberOf
|
||||||
Declare subroutine Database_Services, Btree.Extract, Error_Services, Logging_Services, Rlist, Test_Run_Services, Lot_Services, SRP_Json
|
Declare subroutine Database_Services, Btree.Extract, Error_Services, Logging_Services, Rlist, Test_Run_Services, Lot_Services, SRP_Json
|
||||||
Declare subroutine Mona_Services
|
Declare subroutine Mona_Services
|
||||||
@ -331,6 +332,71 @@ Service GetTestWaferLots(ShowOnlyOpenLots)
|
|||||||
Response = TestWaferLotKeys
|
Response = TestWaferLotKeys
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
Service GetTestRunsByUsername(Username, StartDTM, StopDTM)
|
||||||
|
|
||||||
|
If Username NE '' then
|
||||||
|
Begin Case
|
||||||
|
Case StartDTM EQ '' AND StopDTM EQ ''
|
||||||
|
//Set search date for last 12 hour period
|
||||||
|
StopDTM = SRP_Datetime('Now')
|
||||||
|
StartDTM = SRP_Datetime('AddHours', StopDTM, -12)
|
||||||
|
Case StartDTM EQ '' AND StopDTM NE ''
|
||||||
|
//Set search start date 12 hours prior to stopDTM
|
||||||
|
StartDTM = SRP_Datetime('AddHours', StopDTM, -12)
|
||||||
|
Case StartDTM NE '' AND StopDTM EQ ''
|
||||||
|
//Set search start date to current dtm
|
||||||
|
StopDTM = SRP_Datetime('Now')
|
||||||
|
End Case
|
||||||
|
|
||||||
|
table = "TEST_RUN"
|
||||||
|
Open "DICT ":table To hTestRunDict Else
|
||||||
|
Error_Services('Add', 'Error opening TEST_RUN dictionary')
|
||||||
|
End
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
srch_strng = "RUN_DTM":@VM:StartDTM:'~':StopDTM:@FM: "LSL_USER_ID":@VM:UserName:@FM
|
||||||
|
keylist = ""
|
||||||
|
option = ""
|
||||||
|
flag = ""
|
||||||
|
Btree.Extract(srch_strng, table, hTestRunDict, keylist, option, flag)
|
||||||
|
Swap @VM with @FM in keylist
|
||||||
|
Response = keylist
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Error_Services('Add', 'Username missing.')
|
||||||
|
end
|
||||||
|
|
||||||
|
end service
|
||||||
|
|
||||||
|
Service GetTestWaferUsageStats(Username, StartDTM, StopDTM)
|
||||||
|
|
||||||
|
MostRecentDTM = ''
|
||||||
|
WafersUsed = 0
|
||||||
|
If Username NE '' then
|
||||||
|
KeyList = Test_Run_Services('GetTestRunsByUsername', Username, StartDTM, StopDTM)
|
||||||
|
If KeyList NE '' then
|
||||||
|
For Each Key in KeyList
|
||||||
|
TestRunRec = Xlate('TEST_RUN', Key, '', 'X')
|
||||||
|
If MostRecentDTM EQ '' then
|
||||||
|
MostRecentDTM = TestRunRec<TEST_RUN_RUN_DTM$>
|
||||||
|
end else
|
||||||
|
If MostRecentDTM LT TestRunRec<TEST_RUN_RUN_DTM$> then
|
||||||
|
MostRecentDTM = TestRunRec<TEST_RUN_RUN_DTM$>
|
||||||
|
end
|
||||||
|
end
|
||||||
|
WaferQty = Dcount(TestRunRec<TEST_RUN_TEST_RUN_WAFER_IDS$>, @VM)
|
||||||
|
WafersUsed += WaferQty
|
||||||
|
Next Key
|
||||||
|
end
|
||||||
|
Response = ''
|
||||||
|
Response<1> = MostRecentDTM
|
||||||
|
Response<2> = WafersUsed
|
||||||
|
end else
|
||||||
|
Error_Services('Add', 'Username missing.')
|
||||||
|
end
|
||||||
|
|
||||||
|
end service
|
||||||
|
|
||||||
|
|
||||||
Service CreateTestRunRecord(RunTypeID, EqpType, EqpID, PSNo, RDSNo, UserID, TWLotIds, TWLotQtys, ManualQtyAdjust)
|
Service CreateTestRunRecord(RunTypeID, EqpType, EqpID, PSNo, RDSNo, UserID, TWLotIds, TWLotQtys, ManualQtyAdjust)
|
||||||
|
|
||||||
StartTick = GetTickCount()
|
StartTick = GetTickCount()
|
||||||
@ -688,6 +754,7 @@ Service GetTestWaferUsageByDateSpan(StartDtm, StopDtm)
|
|||||||
end service
|
end service
|
||||||
|
|
||||||
Service GetTestRunKeysByDateSpan(StartDtm, StopDtm)
|
Service GetTestRunKeysByDateSpan(StartDtm, StopDtm)
|
||||||
|
|
||||||
Begin Case
|
Begin Case
|
||||||
Case StartDTM EQ '' AND StopDTM EQ ''
|
Case StartDTM EQ '' AND StopDTM EQ ''
|
||||||
//Set search date for last 24 hour period
|
//Set search date for last 24 hour period
|
||||||
@ -714,8 +781,6 @@ Service GetTestRunKeysByDateSpan(StartDtm, StopDtm)
|
|||||||
Response = keylist
|
Response = keylist
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
Service GetTestRunKeysByEqp(EquipType, EquipID)
|
Service GetTestRunKeysByEqp(EquipType, EquipID)
|
||||||
@ -820,13 +885,3 @@ Service IsNewTWSystemActive(UserId)
|
|||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -27,6 +27,8 @@ Service GetNumberOfPointsForPattern(ToolClass, PatternName)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Convert @LOWER_CASE to @UPPER_CASE in ToolClass
|
||||||
|
|
||||||
If Error_Services('NoError') then
|
If Error_Services('NoError') then
|
||||||
ToolClassRecord = Database_Services('ReadDataRow', 'TOOL_CLASS', ToolClass)
|
ToolClassRecord = Database_Services('ReadDataRow', 'TOOL_CLASS', ToolClass)
|
||||||
If Error_Services('HasError') then
|
If Error_Services('HasError') then
|
||||||
@ -48,3 +50,4 @@ Service GetNumberOfPointsForPattern(ToolClass, PatternName)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
End Service
|
End Service
|
||||||
|
|
||||||
|
|||||||
@ -381,5 +381,3 @@ API wafercounter.ID.GET
|
|||||||
HTTP_Services('SetResponseStatus', ResponseCode, ErrorMessage)
|
HTTP_Services('SetResponseStatus', ResponseCode, ErrorMessage)
|
||||||
|
|
||||||
end api
|
end api
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
116
LSL2/STPROC/WEB_OI_WIZARD_EVENTS.txt
Normal file
116
LSL2/STPROC/WEB_OI_WIZARD_EVENTS.txt
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
Compile function WEB_OI_WIZARD_EVENTS(CtrlEntId, Event, @PARAMS)
|
||||||
|
#pragma precomp SRP_PreCompiler
|
||||||
|
#window WEB_OI_WIZARD
|
||||||
|
|
||||||
|
$Insert EVENT_SETUP
|
||||||
|
$Insert APP_INSERTS
|
||||||
|
$Insert PS_WebView_Equates
|
||||||
|
|
||||||
|
EQU ONE_DAY_SECS$ to 84600
|
||||||
|
|
||||||
|
Declare function OI_Wizard_Services, Exec_Method, Environment_Services
|
||||||
|
Declare subroutine PlaceDialog
|
||||||
|
|
||||||
|
GoToEvent Event for CtrlEntId else
|
||||||
|
// Event not implemented
|
||||||
|
end
|
||||||
|
|
||||||
|
Return EventFlow or 1
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// EVENT HANDLERS
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Event WINDOW.CREATE(CreateParam)
|
||||||
|
|
||||||
|
OIWizardBaseUrl = Environment_Services('GetOIWizardBaseUrl')
|
||||||
|
Set_Property(@Window, '@BASE_URL', OIWizardBaseUrl)
|
||||||
|
InitNavPage = CreateParam
|
||||||
|
Set_Property(@Window, '@INIT_NAV_PAGE', InitNavPage)
|
||||||
|
Set_Property(@Window, '@FIRST_RENDER', True$)
|
||||||
|
Set_Property(@Window:'.WEBVIEW_MAIN', 'AUTOSIZEHEIGHT', True$)
|
||||||
|
Set_Property(@Window:'.WEBVIEW_MAIN', 'AUTOSIZEWIDTH', True$)
|
||||||
|
ScreenSize = Get_Property('SYSTEM', 'SIZE')
|
||||||
|
ClientWidth = ScreenSize<3>
|
||||||
|
ClientHeight = ScreenSize<4>
|
||||||
|
FormSize = Get_Property(@Window, 'SIZE')
|
||||||
|
FormWidth = Int(ClientWidth * (3/4))
|
||||||
|
FormHeight = Int(ClientHeight * (3/4))
|
||||||
|
FormSize<1> = Int( (ClientWidth - FormWidth ) / 2 )
|
||||||
|
FormSize<2> = Int( (ClientHeight - FormHeight ) / 2 )
|
||||||
|
FormSize<3> = FormWidth
|
||||||
|
FormSize<4> = FormHeight
|
||||||
|
FormSize<5> = True$
|
||||||
|
Set_Property(@Window, 'SIZE', FormSize)
|
||||||
|
|
||||||
|
End Event
|
||||||
|
|
||||||
|
|
||||||
|
Event WEBVIEW_MAIN.WEBVIEWCREATED()
|
||||||
|
|
||||||
|
OIWizardURL = Get_Property(@Window, '@BASE_URL')
|
||||||
|
NavPage = Get_Property(@Window, '@INIT_NAV_PAGE')
|
||||||
|
NavTo = OIWizardURL:NavPage
|
||||||
|
SuccessFlag = Exec_Method( CtrlEntID, "NAVIGATE", NavTo)
|
||||||
|
If Not(SuccessFlag) then
|
||||||
|
Msg(@Window, '', 'OK', '', 'Application Error':@FM:'Error navigating to ':NavTo)
|
||||||
|
end
|
||||||
|
|
||||||
|
end event
|
||||||
|
|
||||||
|
|
||||||
|
Event WEBVIEW_MAIN.WEBNAVIGATED(NavID, URI, Redirected, UserInitiated, StatusInfo, FrameID)
|
||||||
|
|
||||||
|
FirstRender = Get_Property(@Window, '@FIRST_RENDER')
|
||||||
|
If FirstRender then
|
||||||
|
SuccessFlag = Exec_Method(CtrlEntID, "DELETECOOKIES", '*')
|
||||||
|
If SuccessFlag then
|
||||||
|
LSLUserId = @User4
|
||||||
|
OIWizardID = OI_Wizard_Services('CreateWizardID', LSLUserID)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
Expiry = Xlate('OI_WIZARD', OIWizardID, 'EXPIRY', 'X')
|
||||||
|
Domain = Get_Property(@Window, '@BASE_URL')
|
||||||
|
Swap 'http://' with '' in Domain
|
||||||
|
Swap 'https://' with '' in Domain
|
||||||
|
PortIndex = Index(Domain, ':', 1)
|
||||||
|
If PortIndex then Domain = Domain[1, PortIndex - 1]
|
||||||
|
Cookie = ""
|
||||||
|
Cookie<0, WBV_COOKIE_POS_NAME$> = "sessionID"
|
||||||
|
Cookie<0, WBV_COOKIE_POS_VALUE$> = OIWizardID
|
||||||
|
Cookie<0, WBV_COOKIE_POS_DOMAIN$> = Domain
|
||||||
|
Cookie<0, WBV_COOKIE_POS_EXPIRES$> = Expiry
|
||||||
|
SuccessFlag = Exec_Method( CtrlEntID, "SETCOOKIE", Cookie )
|
||||||
|
If SuccessFlag then
|
||||||
|
Cookies = Exec_Method( CtrlEntID, "GETCOOKIES")
|
||||||
|
Cookie<0, WBV_COOKIE_POS_NAME$> = "userID"
|
||||||
|
Cookie<0, WBV_COOKIE_POS_VALUE$> = LSLUserID
|
||||||
|
Cookie<0, WBV_COOKIE_POS_DOMAIN$> = Domain
|
||||||
|
Cookie<0, WBV_COOKIE_POS_EXPIRES$> = Expiry
|
||||||
|
SuccessFlag = Exec_Method( CtrlEntID, "SETCOOKIE", Cookie )
|
||||||
|
If SuccessFlag then
|
||||||
|
// Set a timer to execute our session service javascript hook once the page is ready
|
||||||
|
Set_Property(@Window, "TIMER", 0:@FM:1000)
|
||||||
|
Set_Property(@Window, '@FIRST_RENDER', False$)
|
||||||
|
end else
|
||||||
|
Msg(@Window, '', 'OK', '', 'Application Error':@FM:'Error setting userID cookie')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Msg(@Window, '', 'OK', '', 'Application Error':@FM:'Error setting sessionID cookie')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Msg(@Window, '', 'OK', '', 'Application Error':@FM:'Error creating OI Wizard session')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Msg(@Window, '', 'OK', '', 'Application Error':@FM:'Error deleting cookies')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end event
|
||||||
|
|
||||||
|
|
||||||
|
Event WINDOW.TIMER()
|
||||||
|
|
||||||
|
Response = Exec_Method(@Window:'.WEBVIEW_MAIN', 'EXECUTESCRIPT', 'SessionServiceHelper.SetSessionFromCookies()')
|
||||||
|
|
||||||
|
end event
|
||||||
|
|
||||||
132
LSL2/STPROC/WM_IN_API.txt
Normal file
132
LSL2/STPROC/WM_IN_API.txt
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
Function WM_IN_API(@API)
|
||||||
|
/***********************************************************************************************************************
|
||||||
|
|
||||||
|
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
|
||||||
|
permission from SRP Computer Solutions, Inc.
|
||||||
|
|
||||||
|
Name : WM_IN_Api
|
||||||
|
|
||||||
|
Description : API logic for the WM_IN resource.
|
||||||
|
|
||||||
|
Notes : All web APIs should include the API_SETUP insert. This will provide several useful variables:
|
||||||
|
|
||||||
|
HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.)
|
||||||
|
APIURL - The URL for the API entry point (e.g., api.mysite.com/v1).
|
||||||
|
FullEndpointURL - The URL submitted by the client, including query params.
|
||||||
|
FullEndpointURLNoQuery - The URL submitted by the client, excluding query params.
|
||||||
|
EndpointSegment - The URL endpoint segment.
|
||||||
|
ParentURL - The URL path preceeding the current endpoint.
|
||||||
|
CurrentAPI - The name of this stored procedure.
|
||||||
|
|
||||||
|
Parameters :
|
||||||
|
API [in] -- Web API to process. Format is [APIPattern].[HTTPMethod]:
|
||||||
|
- APIPattern must follow this structure Rds[.ID.[<Property>]]
|
||||||
|
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||||
|
Examples:
|
||||||
|
- Rds.POST
|
||||||
|
- Rds.ID.PUT
|
||||||
|
- Rds.ID.firstName.GET
|
||||||
|
Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API
|
||||||
|
services do not rely upon anything being returned in the response. This is what the
|
||||||
|
various services like SetResponseBody and SetResponseStatus services are for. A response
|
||||||
|
value is only helpful if the developers want to use it for debug purposes.
|
||||||
|
|
||||||
|
History : (Date, Initials, Notes)
|
||||||
|
09/27/22 xxx Original programmer.
|
||||||
|
|
||||||
|
***********************************************************************************************************************/
|
||||||
|
#pragma precomp SRP_PreCompiler
|
||||||
|
|
||||||
|
$insert APP_INSERTS
|
||||||
|
$insert API_SETUP
|
||||||
|
$insert HTTP_INSERTS
|
||||||
|
|
||||||
|
Declare function WM_In_Services
|
||||||
|
|
||||||
|
GoToAPI else
|
||||||
|
// The specific resource endpoint doesn't have a API handler yet.
|
||||||
|
HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.')
|
||||||
|
end
|
||||||
|
|
||||||
|
Return Response OR ''
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Endpoint Handlers
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
API wm_in.ID.HEAD
|
||||||
|
API wm_in.ID.GET
|
||||||
|
|
||||||
|
GoSub CreateHALItem
|
||||||
|
|
||||||
|
end api
|
||||||
|
|
||||||
|
|
||||||
|
API wm_in.ID.zpl.HEAD
|
||||||
|
API wm_in.ID.zpl.GET
|
||||||
|
|
||||||
|
GoSub CreateZPLItem
|
||||||
|
|
||||||
|
end api
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Internal GoSubs
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
// CreateHALItem
|
||||||
|
//
|
||||||
|
// Creates a HAL+JSON object based on the OpenInsight data row representation of the scan.
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
CreateHALItem:
|
||||||
|
|
||||||
|
WMInKey = EndpointSegment
|
||||||
|
Convert '-' to '*' in WMInKey
|
||||||
|
WmInJson = WM_In_Services('ConvertRecordToJSON', WMInKey, '', FullEndpointURL)
|
||||||
|
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
StatusCode = 200
|
||||||
|
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||||
|
HTTP_Services('SetResponseBody', WmInJson, False$, 'application/hal+json')
|
||||||
|
If Assigned(Message) then
|
||||||
|
HTTP_Services('SetResponseStatus', StatusCode, Message)
|
||||||
|
end else
|
||||||
|
HTTP_Services('SetResponseStatus', StatusCode)
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Message = Error_Services('GetMessage')
|
||||||
|
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
|
||||||
|
end
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
// CreateZPLItem
|
||||||
|
//
|
||||||
|
// Creates a HAL+JSON object with the ZPL for the given WM_IN row
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
CreateZPLItem:
|
||||||
|
|
||||||
|
WmInKey = ParentSegment
|
||||||
|
ZplJson = ''
|
||||||
|
ZPL = Wm_In_Services('GetWmInZpl', WmInKey)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
StatusCode = 200
|
||||||
|
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||||
|
HTTP_Services('SetResponseBody', ZPL, False$, 'text/plain')
|
||||||
|
If Assigned(Message) then
|
||||||
|
HTTP_Services('SetResponseStatus', StatusCode, Message)
|
||||||
|
end else
|
||||||
|
HTTP_Services('SetResponseStatus', StatusCode)
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Message = Error_Services('GetMessage')
|
||||||
|
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
|
||||||
|
end
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
@ -46,23 +46,48 @@ Compile function WM_IN_Services(@Service, @Params)
|
|||||||
|
|
||||||
***********************************************************************************************************************/
|
***********************************************************************************************************************/
|
||||||
#pragma precomp SRP_PreCompiler
|
#pragma precomp SRP_PreCompiler
|
||||||
$insert LOGICAL
|
|
||||||
$Insert SERVICE_SETUP
|
|
||||||
|
|
||||||
|
$Insert SERVICE_SETUP
|
||||||
|
$insert APP_INSERTS
|
||||||
|
$Insert UNIT_EQUATES
|
||||||
$Insert MSG_EQUATES
|
$Insert MSG_EQUATES
|
||||||
$Insert DICT_EQUATES
|
$Insert DICT_EQUATES
|
||||||
$Insert WM_IN_EQUATES
|
$Insert WM_IN_EQUATES
|
||||||
|
$Insert WO_LOG_EQUATES
|
||||||
|
$Insert PROD_SPEC_EQUATES
|
||||||
|
$Insert WO_MAT_EQUATES
|
||||||
|
$Insert CUST_EPI_PART_EQUATES
|
||||||
|
$Insert QUOTE_SPEC_EQU
|
||||||
|
$Insert WO_STEP_EQUATES
|
||||||
|
|
||||||
|
EQU PI$LEFT TO 1
|
||||||
|
EQU PI$TOP TO 2
|
||||||
|
EQU PI$RIGHT TO 3
|
||||||
|
EQU PI$BOTTOM TO 4
|
||||||
|
EQU PI$WIDTH TO 5
|
||||||
|
EQU PI$HEIGHT TO 6
|
||||||
|
EQU PI$SIZE TO 7
|
||||||
|
|
||||||
|
EQU PS$TOOL TO 1
|
||||||
|
EQU PS$TYPE TO 2
|
||||||
|
EQU PS$RECIPE TO 3
|
||||||
|
EQU PS$FREQ TO 4
|
||||||
|
EQU PS$PATTERN TO 11
|
||||||
|
|
||||||
Declare function PSN_Services, SRP_Rotate_Array, Datetime, Database_Services, Environment_Services, Logging_Services
|
Declare function PSN_Services, SRP_Rotate_Array, Datetime, Database_Services, Environment_Services, Logging_Services
|
||||||
Declare subroutine Database_Services, Set_Status, obj_Wo_Mat_Log, Logging_Services, Extract_Si_Keys
|
Declare function obj_Install, SRP_Json
|
||||||
|
Declare subroutine Database_Services, Set_Status, obj_Wo_Mat_Log, Logging_Services, Extract_Si_Keys, Btree.Extract
|
||||||
|
Declare subroutine SRP_Json
|
||||||
|
|
||||||
GoToService
|
GoToService else
|
||||||
|
Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
|
||||||
|
end
|
||||||
|
|
||||||
Return Response or ""
|
Return Response else ''
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// SERVICES
|
// Services
|
||||||
//-----------------------------------------------------------------------------
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
@ -77,11 +102,9 @@ Service GetComments(WMINNo)
|
|||||||
|
|
||||||
CommentArray = ''
|
CommentArray = ''
|
||||||
WMInRow = Database_Services('ReadDataRow', 'WM_IN', WMInNo)
|
WMInRow = Database_Services('ReadDataRow', 'WM_IN', WMInNo)
|
||||||
|
|
||||||
CommentDates = Oconv(WMInRow<WM_IN_EPP_COMMENT_DATE$>, 'DT')
|
CommentDates = Oconv(WMInRow<WM_IN_EPP_COMMENT_DATE$>, 'DT')
|
||||||
CommentUsers = WMInRow<WM_IN_EPP_COMMENT_USER$>
|
CommentUsers = WMInRow<WM_IN_EPP_COMMENT_USER$>
|
||||||
Comments = WMInRow<WM_IN_EPP_COMMENT_NOTE$>
|
Comments = WMInRow<WM_IN_EPP_COMMENT_NOTE$>
|
||||||
|
|
||||||
CommentList = CommentDates :@FM: CommentUsers :@FM: Comments
|
CommentList = CommentDates :@FM: CommentUsers :@FM: Comments
|
||||||
CommentArray = SRP_Rotate_Array(CommentList)
|
CommentArray = SRP_Rotate_Array(CommentList)
|
||||||
Response = CommentArray
|
Response = CommentArray
|
||||||
@ -368,3 +391,557 @@ Service VerifyWOMatWMIKeyIndex(WMIKey)
|
|||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
|
Service GetWMInKeys(WOLogId)
|
||||||
|
|
||||||
|
ErrorMsg = ''
|
||||||
|
WMInKeys = ''
|
||||||
|
|
||||||
|
If WOLogId NE '' then
|
||||||
|
Open 'DICT.WM_IN' to hWmInDict then
|
||||||
|
SearchString = ''
|
||||||
|
SearchString := 'WO_NO':@VM:WOLogId:@FM
|
||||||
|
Btree.Extract(SearchString, 'WM_IN', hWmInDict, WMInKeys, 0, 0)
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error opening WM_IN dictionary.'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'WOLogId was null'
|
||||||
|
end
|
||||||
|
|
||||||
|
If ErrorMsg NE '' then
|
||||||
|
Error_Services('Add', ErrorMsg)
|
||||||
|
end
|
||||||
|
|
||||||
|
Response = WMInKeys
|
||||||
|
|
||||||
|
end service
|
||||||
|
|
||||||
|
|
||||||
|
Service GetWmInZpl(WmInKey)
|
||||||
|
|
||||||
|
ZPL = ''
|
||||||
|
ErrorMsg = ''
|
||||||
|
If WmInKey NE '' then
|
||||||
|
Swap '-' with '*' in WmInKey
|
||||||
|
Swap '.' with '*' in WmInKey
|
||||||
|
If RowExists('WM_IN', WmInKey) then
|
||||||
|
WONo = Field(WmInKey, '*', 1, 1)
|
||||||
|
WOStep = Field(WmInKey, '*', 2, 1)
|
||||||
|
WOStepKeys = XLATE('WO_LOG',WONo,WO_LOG_WO_STEP_KEY$,'X')
|
||||||
|
IF INDEX(WOStepKeys,@VM,1) THEN
|
||||||
|
PrintWONo = WONo:'.':WOStep
|
||||||
|
END ELSE
|
||||||
|
PrintWONo = WONo
|
||||||
|
END
|
||||||
|
WORec = XLATE('WO_LOG',WONo,'','X')
|
||||||
|
ReqShipDate = OCONV(WORec<WO_LOG_PROMISE_SHIP_DT$>,'D2/')
|
||||||
|
CustNo = WORec<WO_LOG_CUST_NO$>
|
||||||
|
CustName = XLATE('COMPANY',CustNo,'ABBREV_OR_CO_NAME','X')
|
||||||
|
Captive = XLATE('COMPANY',CustNo,'CAPTIVE','X')
|
||||||
|
PONo = WORec<WO_LOG_CUST_PO_NO$>
|
||||||
|
PSNo = XLATE('WO_STEP',WONo:'*':WOStep,WO_STEP_PROD_SPEC_ID$,'X')
|
||||||
|
PSRec = XLATE('PROD_SPEC',PSNo,'','X')
|
||||||
|
CustSpecNo = ''
|
||||||
|
IF Captive THEN
|
||||||
|
CustSpecNos = PSRec<PROD_SPEC_SPEC_NUM$>
|
||||||
|
CustSpecDescs = PSRec<PROD_SPEC_SPEC_DESC$>
|
||||||
|
CustSpecRevNos = PSRec<PROD_SPEC_REV_NUM$>
|
||||||
|
CustSpecRevDts = PSRec<PROD_SPEC_REV_DATE$>
|
||||||
|
SpecCnt = COUNT(CustSpecNos,@VM) + (CustSpecNos NE '')
|
||||||
|
FOR I = 1 TO SpecCnt
|
||||||
|
IF CustSpecDescs<1,I> _EQC 'GENERAL' THEN
|
||||||
|
CustSpecNo = CustSpecNos<1,I>
|
||||||
|
CustSpecDesc = CustSpecDescS<1,I>
|
||||||
|
CustSpecRevNo = CustSpecRevNos<1,I>
|
||||||
|
CustSpecRevDt = OCONV(CustSpecRevDts<1,I>,'D4/')
|
||||||
|
END
|
||||||
|
UNTIL CustSpecNo NE ''
|
||||||
|
NEXT I
|
||||||
|
END
|
||||||
|
EpiPartNo = WORec<WO_LOG_EPI_PART_NO$>
|
||||||
|
CustEpiPartRec = XLATE('CUST_EPI_PART',CustNo:'*':EpiPartNo,'','X')
|
||||||
|
ShipBagReq = CustEpiPartRec<CUST_EPI_PART_SHIP_BAG_REQ$>
|
||||||
|
PreSurfscan = PSRec<PROD_SPEC_PRE_SURFSCAN$>
|
||||||
|
FirstSurfscan = PSRec<PROD_SPEC_FIRST_SURFSCAN$>
|
||||||
|
PostCleanSurfScan = PSRec<PROD_SPEC_POST_CLEAN_SURFSCAN$>
|
||||||
|
SubPreClean = XLATE( 'PROD_SPEC', PSNo, 'SUB_PRE_CLEAN', 'X' )
|
||||||
|
SubPostClean = XLATE( 'PROD_SPEC', PSNo, 'SUB_POST_CLEAN', 'X' )
|
||||||
|
PreCleanTool = SubPreClean ;* Temporary for 2x4 -> 4x4 conversion
|
||||||
|
PostCleanTool = SubPostClean
|
||||||
|
PreAkrionRecipe = XLATE( 'PROD_SPEC', PSNo, 'PRE_AKRION_RECIPE', 'X' )
|
||||||
|
PostAkrionRecipe = XLATE( 'PROD_SPEC', PSNo, 'POST_AKRION_RECIPE', 'X' )
|
||||||
|
RecipeNo = XLATE( 'PROD_SPEC', PSNo, 'RECIPE_NO_L1', 'X' )
|
||||||
|
RecipeName = XLATE( 'PROD_SPEC', PSNo, 'RECIPE_NAME_L1', 'X' )
|
||||||
|
SpecType = OCONV( XLATE( 'PROD_SPEC', PSNo, 'SPEC_TYPE', 'X' ), '[SPEC_TYPE_CONV]' )
|
||||||
|
SubOxide = OCONV( XLATE( 'PROD_SPEC', PSNo, 'SUB_OXIDE_STRIP', 'X' ), 'B' )
|
||||||
|
ThickTarget = OCONV( XLATE( 'PROD_SPEC', PSNo, 'THICK_TARGET_ALL', 'X' ), 'MD3' )
|
||||||
|
ResTarget = OCONV( XLATE( 'PROD_SPEC', PSNo, 'RES_TARGET_ALL', 'X' ), 'MD3' )
|
||||||
|
ThickUnit = XLATE( 'PROD_SPEC', PSNo, 'THICK_UNITS_ALL', 'X' )
|
||||||
|
ResUnit = XLATE( 'PROD_SPEC', PSNo , 'RES_UNITS_ALL', 'X' )
|
||||||
|
Dopant = XLATE( 'PROD_SPEC', PSNo, 'DOPANT_L1', 'X' )
|
||||||
|
RecipeNo = XLATE( 'PROD_SPEC', PSNo, 'RECIPE_NO', 'X' )
|
||||||
|
RecipeInfo = XLATE( 'RECIPE', RecipeNo, 'RECIPE_NAME_NO', 'X' )
|
||||||
|
CleaningReqs = ''
|
||||||
|
ThickCnt = FIELDCOUNT( ThickTarget<1>, @VM )
|
||||||
|
PrintThickTargets = ''
|
||||||
|
FOR J = 1 TO ThickCnt
|
||||||
|
PrintThickTargets<1,J> = ThickTarget<1,J>:ThickUnit<1,J>
|
||||||
|
NEXT J
|
||||||
|
ResCnt = FIELDCOUNT( ResTarget<1>, @VM )
|
||||||
|
PrintResTargets = ''
|
||||||
|
FOR J = 1 TO ResCnt
|
||||||
|
IF ResTarget<1,J>[1,1] = '.' THEN
|
||||||
|
TargetVal = '0':ResTarget<1,J>
|
||||||
|
END ELSE
|
||||||
|
TargetVal = ResTarget<1,J>
|
||||||
|
END
|
||||||
|
PrintResTargets<1,J> = TargetVal:ResUnit<1,J>
|
||||||
|
NEXT J
|
||||||
|
APreRec = ''
|
||||||
|
APostRec = ''
|
||||||
|
IF ( PreAkrionRecipe<1> <> '' ) THEN
|
||||||
|
APreRec = ' ':PreAkrionRecipe:' '
|
||||||
|
SubOxide = 'No' ;* If Akrion then no oxide strip
|
||||||
|
END
|
||||||
|
IF ( PostAkrionRecipe<1> <> '' ) THEN
|
||||||
|
APostRec = ' ':PostAkrionRecipe
|
||||||
|
END
|
||||||
|
PrintCleaningReqs = TRIM( 'Strip:':SubOxide:' Pre:':SubPreClean:APreRec:' Post:':SubPostClean:APostRec )
|
||||||
|
swap UNIT_MICROMETER$ with 'um' in PrintThickTargets
|
||||||
|
swap UNIT_OHM_CM$ with 'ohm.cm' in PrintThickTargets
|
||||||
|
swap UNIT_OHM_PER_SQ$ with 'ohm/sq' in PrintThickTargets
|
||||||
|
swap UNIT_A$ with 'A' in PrintThickTargets
|
||||||
|
swap UNIT_MICROMETER$ with 'um' in PrintResTargets
|
||||||
|
swap UNIT_OHM_CM$ with 'ohm.cm' in PrintResTargets
|
||||||
|
swap UNIT_OHM_PER_SQ$ with 'ohm/sq' in PrintResTargets
|
||||||
|
swap UNIT_A$ with 'A' in PrintResTargets
|
||||||
|
|
||||||
|
PrintWMInKey = WMInKey
|
||||||
|
CONVERT '*' TO '.' IN PrintWMInKey
|
||||||
|
CassNo = FIELD(WMInKey,'*',3)
|
||||||
|
WOMatKey = WONo:'*':CassNo
|
||||||
|
WOMatRec = XLATE('WO_MAT',WOMatKey,'','X')
|
||||||
|
LotNo = WOMatRec<WO_MAT_LOT_NO$>
|
||||||
|
WfrQty = WOMatRec<WO_MAT_WAFER_QTY$>
|
||||||
|
CustPartNo = WOMatRec<WO_MAT_CUST_PART_NO$>
|
||||||
|
SubPartNo = WOMatRec<WO_MAT_SUB_PART_NO$>
|
||||||
|
OrderItem = WOMatRec<WO_MAT_ORDER_ITEM$>
|
||||||
|
Vendor = WOMatRec<WO_MAT_SUB_VEND_CD$>
|
||||||
|
OrderDetKey = WORec<WO_LOG_ORDER_NO$>:'*':OrderItem
|
||||||
|
LOCATE CustPartNo IN CustEpiPartRec<CUST_EPI_PART_CUST_PART_NO$> USING @VM SETTING Pos THEN
|
||||||
|
CustPartDesc = CustEpiPartRec<CUST_EPI_PART_CUST_PART_DESC$,Pos>
|
||||||
|
END ELSE
|
||||||
|
CustPartDesc = ''
|
||||||
|
END
|
||||||
|
PartNo = CustPartNo
|
||||||
|
PartDesc = CustPartDesc
|
||||||
|
SuppCd = TRIM(SubPartNo[-1,'B-'])
|
||||||
|
IF LEN(SuppCd) NE '2' THEN SuppCd =''
|
||||||
|
If CassNo EQ 1 then
|
||||||
|
SpecEpi = PSRec<prod_spec_spec_epi$>
|
||||||
|
SpecSub = PSRec<PROD_SPEC_SPEC_SUBSTRATE$>
|
||||||
|
ThkSmile = PSRec<PROD_SPEC_THICK_SMILE_REQ$>
|
||||||
|
ThkShift = Field(PSRec, @FM, PROD_SPEC_THICK_LIMIT_SHIFT$)
|
||||||
|
ResShift = Field(PSRec, @FM, PROD_SPEC_RES_LIMIT_SHIFT$)
|
||||||
|
SSRecipe = XLATE('PRS_STAGE', PSNo:'*LWI', 5, 'X')
|
||||||
|
PCRecipe = XLATE('PRS_STAGE', PSNo, 'POST_CLEAN_SURFSCAN_RECIPE', 'X')
|
||||||
|
WaferSize = Field(SpecSub, @VM, QSSubWafersize$)
|
||||||
|
convert char(248) to @fm in SpecEpi ;* char(248) is used to separate layers
|
||||||
|
layerCount = fieldcount( SpecEpi, @fm )
|
||||||
|
layerInfo = SpecEpi<layerCount>
|
||||||
|
// If this is just 1 layer, we're returning that info, if 3 layers, we're returning layer 3 (combo)
|
||||||
|
ThkData = Field(layerInfo, @VM, QSEpiThickMeasure$)
|
||||||
|
ResData = Field(layerInfo, @VM, QSEpiResMeasure$)
|
||||||
|
ConData = Field(layerInfo, @VM, QSEpiConcMeasure$)
|
||||||
|
CResData = Field(layerInfo, @VM, QSEpiCresMeasure$)
|
||||||
|
ThkMin = OCONV(Field(layerInfo, @VM, QSEpiMinThick$), 'MD3')
|
||||||
|
ThkMax = OCONV(Field(layerInfo, @VM, QSEpiMaxThick$), 'MD3')
|
||||||
|
ThkTarg = ''
|
||||||
|
If ThkMin NE '' Then ThkTarg = oConv(iconv((ThkMin+ThkMax)/2, 'MD3'), 'MD3')
|
||||||
|
ResMin = OCONV(Field(layerInfo, @VM, QSEpiResMinThick$), 'MD3')
|
||||||
|
ResMax = OCONV(Field(layerInfo, @VM, QSEpiResMaxThick$), 'MD3')
|
||||||
|
ResTarg = ''
|
||||||
|
If ResMin NE '' Then ResTarg = oConv(iconv((ResMin+ResMax)/2, 'MD3'), 'MD3')
|
||||||
|
ConMin = OCONV(Field(layerInfo, @VM, QSEpiConcMinThick$), 'MD3')
|
||||||
|
ConMax = OCONV(Field(layerInfo, @VM, QSEpiConcMaxThick$), 'MD3')
|
||||||
|
ConTarg = ''
|
||||||
|
If ConMin NE '' Then ConTarg = oConv(iconv((ConMin+ConMax)/2, 'MD3'), 'MD3')
|
||||||
|
CResMin = OCONV(Field(layerInfo, @VM, QSEpiCresMin$), 'MD3')
|
||||||
|
CResMax = OCONV(Field(layerInfo, @VM, QSEpiCresMax$), 'MD3')
|
||||||
|
CResTarg = ''
|
||||||
|
If CResMin NE '' Then CResTarg = oConv(iconv((CResMin+CResMax)/2, 'MD3'), 'MD3')
|
||||||
|
ThkTool = Field(ThkData, '~', PS$TOOL)
|
||||||
|
ThkType = Field(ThkData, '~', PS$TYPE)
|
||||||
|
ThkRecipe = Field(ThkData, '~', PS$RECIPE)
|
||||||
|
ThkFreq = Field(ThkData, '~', PS$FREQ)
|
||||||
|
ThkPattern = Field(ThkData, '~', PS$PATTERN)
|
||||||
|
ResTool = Field(ResData, '~', PS$TOOL)
|
||||||
|
ResType = Field(ResData, '~', PS$TYPE)
|
||||||
|
ResRecipe = Field(ResData, '~', PS$RECIPE)
|
||||||
|
ResFreq = Field(ResData, '~', PS$FREQ)
|
||||||
|
ResPattern = Field(ResData, '~', PS$PATTERN)
|
||||||
|
ConTool = Field(ConData, '~', PS$TOOL)
|
||||||
|
ConType = Field(ConData, '~', PS$TYPE)
|
||||||
|
ConRecipe = Field(ConData, '~', PS$RECIPE)
|
||||||
|
ConFreq = Field(ConData, '~', PS$FREQ)
|
||||||
|
ConPattern = Field(ConData, '~', PS$PATTERN)
|
||||||
|
CResTool = Field(CResData, '~', PS$TOOL)
|
||||||
|
CResType = Field(CResData, '~', PS$TYPE)
|
||||||
|
CResRecipe = Field(CResData, '~', PS$RECIPE)
|
||||||
|
CResFreq = Field(CResData, '~', PS$FREQ)
|
||||||
|
CResPattern = Field(CResData, '~', PS$PATTERN)
|
||||||
|
IF ThkMin EQ '' THEN ThkMin = '--'
|
||||||
|
IF ThkMax EQ '' THEN ThkMax = '--'
|
||||||
|
IF ThkTarg EQ '' THEN ThkTarg = '--'
|
||||||
|
IF ThkTool EQ '' THEN ThkTool = '--'
|
||||||
|
IF ThkType EQ '' THEN ThkType = '--'
|
||||||
|
IF ThkRecipe EQ '' THEN ThkRecipe = '--'
|
||||||
|
IF ThkPattern EQ '' THEN ThkPattern = '--'
|
||||||
|
IF ThkFreq EQ '' THEN ThkFreq = '--'
|
||||||
|
IF ResMin EQ '' THEN ResMin = '--'
|
||||||
|
IF ResMax EQ '' THEN ResMax = '--'
|
||||||
|
IF ResTarg EQ '' THEN ResTarg = '--'
|
||||||
|
IF ResTool EQ '' THEN ResTool = '--'
|
||||||
|
IF ResType EQ '' THEN ResType = '--'
|
||||||
|
IF ResRecipe EQ '' THEN ResRecipe = '--'
|
||||||
|
IF ResPattern EQ '' THEN ResPattern = '--'
|
||||||
|
IF ResFreq EQ '' THEN ResFreq = '--'
|
||||||
|
IF ConMin EQ '' THEN ConMin = '--'
|
||||||
|
IF ConMax EQ '' THEN ConMax = '--'
|
||||||
|
IF ConTarg EQ '' THEN ConTarg = '--'
|
||||||
|
IF ConTool EQ '' THEN ConTool = '--'
|
||||||
|
IF ConType EQ '' THEN ConType = '--'
|
||||||
|
IF ConRecipe EQ '' THEN ConRecipe = '--'
|
||||||
|
IF ConPattern EQ '' THEN ConPattern = '--'
|
||||||
|
IF ConFreq EQ '' THEN ConFreq = '--'
|
||||||
|
IF CResMin EQ '' THEN CResMin = '--'
|
||||||
|
IF CResMax EQ '' THEN CResMax = '--'
|
||||||
|
IF CResTarg EQ '' THEN CResTarg = '--'
|
||||||
|
IF CResTool EQ '' THEN CResTool = '--'
|
||||||
|
IF CResType EQ '' THEN CResType = '--'
|
||||||
|
IF CResRecipe EQ '' THEN CResRecipe = '--'
|
||||||
|
IF CResPattern EQ '' THEN CResPattern = '--'
|
||||||
|
IF CResFreq EQ '' THEN CResFreq = '--'
|
||||||
|
Swap @VM with ' / ' in SSRecipe
|
||||||
|
IF PCRecipe EQ '' Then PCRecipe = '--'
|
||||||
|
If ThkSmile EQ '' OR ThkSmile EQ '0' then
|
||||||
|
ThkSmile = 'N'
|
||||||
|
end else
|
||||||
|
ThkSmile = 'Y'
|
||||||
|
end
|
||||||
|
If ThkShift EQ '' OR ThkShift EQ '0' then
|
||||||
|
ThkShift = 'N'
|
||||||
|
end else
|
||||||
|
ThkShift = 'Y'
|
||||||
|
end
|
||||||
|
If ResShift EQ '' OR ResShift EQ '0' then
|
||||||
|
ResShift = 'N'
|
||||||
|
end else
|
||||||
|
ResShift = 'Y'
|
||||||
|
end
|
||||||
|
if Len(ThkMin) > 6 then
|
||||||
|
ThkMin = ThkMin[1,6]
|
||||||
|
end
|
||||||
|
if Len(ThkMax) > 6 then
|
||||||
|
ThkMax = ThkMax[1,6]
|
||||||
|
end
|
||||||
|
if Len(ThkTarg) > 6 then
|
||||||
|
ThkTarg = ThkTarg[1,6]
|
||||||
|
end
|
||||||
|
if Len(ResMin) > 6 then
|
||||||
|
ResMin = ResMin[1,6]
|
||||||
|
end
|
||||||
|
if Len(ResMax) > 6 then
|
||||||
|
ResMax = ResMax[1,6]
|
||||||
|
end
|
||||||
|
if Len(ResTarg) > 6 then
|
||||||
|
ResTarg = ResTarg[1,6]
|
||||||
|
end
|
||||||
|
if Len(ConMin) > 6 then
|
||||||
|
ConMin = ConMin[1,6]
|
||||||
|
end
|
||||||
|
if Len(ConMax) > 6 then
|
||||||
|
ConMax = ConMax[1,6]
|
||||||
|
end
|
||||||
|
if Len(ConTarg) > 6 then
|
||||||
|
ConTarg = ConTarg[1,6]
|
||||||
|
end
|
||||||
|
if Len(CResMin) > 6 then
|
||||||
|
CResMin = CResMin[1,6]
|
||||||
|
end
|
||||||
|
if Len(CResMax) > 6 then
|
||||||
|
CResMax = CResMax[1,6]
|
||||||
|
end
|
||||||
|
if Len(CResTarg) > 6 then
|
||||||
|
CResTarg = CResTarg[1,6]
|
||||||
|
end
|
||||||
|
****** Begin ZPL
|
||||||
|
ZPL := '^XA'
|
||||||
|
ZPL := '^LH10,0'
|
||||||
|
ZPL := '^PR2' ;* Print speed 2 inches per second
|
||||||
|
ZPL := '^LL406' ;* Label length @203 dpi
|
||||||
|
ZPL := '^PW900'
|
||||||
|
ZPL := '^MD0' ;* Media darkness
|
||||||
|
ZPL := '^MMT' ;* Media mode t=tear off mode
|
||||||
|
****** 1st/2nd Line
|
||||||
|
ZPL := '^FO30,20^A0,,40^FDWO ':WONo:'^FS'
|
||||||
|
ZPL := '^FO590,10^A050,30^FDPSN ':PSNo:'^FS'
|
||||||
|
ZPL := '^FO555,40^A050,30^FDDopant ':Dopant:'^FS'
|
||||||
|
****** 3rd Line - headers
|
||||||
|
ZPL := '^FO85,100^A050,23^FDMin^FS'
|
||||||
|
ZPL := '^FO145,100^A050,23^FDTarg^FS'
|
||||||
|
ZPL := '^FO210,100^A050,23^FDMax^FS'
|
||||||
|
ZPL := '^FO280,100^A050,23^FDTool^FS'
|
||||||
|
ZPL := '^FO330,100^A050,23^FDType^FS'
|
||||||
|
ZPL := '^FO470,100^A050,23^FDRecipe^FS'
|
||||||
|
ZPL := '^FO600,100^A050,23^FDPattern^FS'
|
||||||
|
ZPL := '^FO740,100^A050,23^FDFreq^FS'
|
||||||
|
****** 4th Line - Thickness (Thk)
|
||||||
|
ZPL := '^FO70,130^GB720,0,3^FS'
|
||||||
|
ZPL := '^FO70,130^GB0,160,3^FS'
|
||||||
|
ZPL := '^FO10,140^A050,23^FDThk:^FS'
|
||||||
|
ZPL := '^FO80,140^A050,23^FD':ThkMin:'^FS'
|
||||||
|
ZPL := '^FO145,140^A050,23^FD':ThkTarg:'^FS'
|
||||||
|
ZPL := '^FO210,140^A050,23^FD':ThkMax:'^FS'
|
||||||
|
ZPL := '^FO280,140^A050,23^FD':ThkTool[1,5]:'^FS'
|
||||||
|
ZPL := '^FO330,140^A050,23^FD':ThkType[1,11]:'^FS'
|
||||||
|
ZPL := '^FO470,140^A050,23^FD':ThkRecipe[1,11]:'^FS'
|
||||||
|
ZPL := '^FO600,140^A050,23^FD':ThkPattern[1,11]:'^FS'
|
||||||
|
ZPL := '^FO750,140^A050,23^FD':ThkFreq:'^FS'
|
||||||
|
****** 5th Line - Resistivity (Res)
|
||||||
|
ZPL := '^FO10,170^GB780,0,3^FS'
|
||||||
|
ZPL := '^FO10,180^A050,23^FDRes:^FS'
|
||||||
|
ZPL := '^FO80,180^A050,23^FD':ResMin:'^FS'
|
||||||
|
ZPL := '^FO145,180^A050,23^FD':ResTarg:'^FS'
|
||||||
|
ZPL := '^FO210,180^A050,23^FD':ResMax:'^FS'
|
||||||
|
ZPL := '^FO280,180^A050,23^FD':ResTool[1,5]:'^FS'
|
||||||
|
ZPL := '^FO330,180^A050,23^FD':ResType[1,11]:'^FS'
|
||||||
|
ZPL := '^FO470,180^A050,23^FD':ResRecipe[1,11]:'^FS'
|
||||||
|
ZPL := '^FO600,180^A050,23^FD':ResPattern[1,11]:'^FS'
|
||||||
|
ZPL := '^FO750,180^A050,23^FD':ResFreq:'^FS'
|
||||||
|
****** 6th Line - Contact (Con)
|
||||||
|
ZPL := '^FX***LINE 4'
|
||||||
|
ZPL := '^FO10,210^GB780,0,3^FS'
|
||||||
|
ZPL := '^FO10,220^A050,23^FDCon:^FS'
|
||||||
|
ZPL := '^FO80,220^A050,23^FD':ConMin:'^FS'
|
||||||
|
ZPL := '^FO145,220^A050,23^FD':ConTarg:'^FS'
|
||||||
|
ZPL := '^FO210,220^A050,23^FD':ConMax:'^FS'
|
||||||
|
ZPL := '^FO280,220^A050,23^FD':ConTool[1,5]:'^FS'
|
||||||
|
ZPL := '^FO330,220^A050,23^FD':ConType[1,11]:'^FS'
|
||||||
|
ZPL := '^FO470,220^A050,23^FD':ConRecipe[1,11]:'^FS'
|
||||||
|
ZPL := '^FO600,220^A050,23^FD':ConPattern[1,11]:'^FS'
|
||||||
|
ZPL := '^FO750,220^A050,23^FD':ConFreq:'^FS'
|
||||||
|
****** 7th Line - Contact Resistance (CRes)
|
||||||
|
ZPL := '^FO10,250^GB780,0,3^FS'
|
||||||
|
ZPL := '^FO10,260^A050,23^FDCRes:^FS'
|
||||||
|
ZPL := '^FO80,260^A050,23^FD':CResMin:'^FS'
|
||||||
|
ZPL := '^FO145,260^A050,23^FD':CResTarg:'^FS'
|
||||||
|
ZPL := '^FO210,260^A050,23^FD':CResMax:'^FS'
|
||||||
|
ZPL := '^FO280,260^A050,23^FD':CResTool[1,5]:'^FS'
|
||||||
|
ZPL := '^FO330,260^A050,23^FD':CResType[1,11]:'^FS'
|
||||||
|
ZPL := '^FO470,260^A050,23^FD':CResRecipe[1,11]:'^FS'
|
||||||
|
ZPL := '^FO600,260^A050,23^FD':CResPattern[1,11]:'^FS'
|
||||||
|
ZPL := '^FO750,260^A050,23^FD':CResFreq:'^FS'
|
||||||
|
ZPL := '^FO10,290^GB780,0,3^FS'
|
||||||
|
****** 8th Line - Special Instructions
|
||||||
|
ZPL := '^FO10,310^A050,23^FDSurfScan: ':SSRecipe:'^FS'
|
||||||
|
ZPL := '^FO10,340^A050,23^FDPostClean: ':PCRecipe:'^FS'
|
||||||
|
ZPL := '^FO10,370^A050,23^FDWafer Size: ':WaferSize:'^FS'
|
||||||
|
ZPL := '^FO500,310^A050,23^FDSmile Required: ':ThkSmile:'^FS'
|
||||||
|
ZPL := '^FO500,340^A050,23^FDSPC Thk Shift: ':ThkShift:'^FS'
|
||||||
|
ZPL := '^FO500,370^A050,23^FDSPC Res Shift: ':ResShift:'^FS'
|
||||||
|
ZPL := '^XZ':CRLF$
|
||||||
|
****** End Cheet Sheet ZPL
|
||||||
|
end
|
||||||
|
For cnt = 1 to 2
|
||||||
|
ZPL := '^XA'
|
||||||
|
ZPL := '^LH0,0'
|
||||||
|
ZPL := '^PR2' ;* Print speed 2 inches per second
|
||||||
|
ZPL := '^LL406' ;* Label length @203 dpi
|
||||||
|
ZPL := '^PW900'
|
||||||
|
ZPL := '^MD8' ;* Media darkness
|
||||||
|
ZPL := '^MMT' ;* Media mode t=tear off mode
|
||||||
|
ZPL := '^FO15,15^GB795,398,3,B^FS' ;* Border
|
||||||
|
ZPL:= '^FO680,25^A0,36^FDWM In^FS'
|
||||||
|
****** First Line
|
||||||
|
Company = 'IFX Epi Services'
|
||||||
|
ZPL := '^FO30,25^A0,,36^FD':Company:'^FS'
|
||||||
|
ZPL := '^FO290,25^AC,18^FDWO No:^FS':CRLF$
|
||||||
|
ZPL := '^FO370,25^A045,36^FD':PrintWONo:'^FS':CRLF$
|
||||||
|
IF CassNo = 1 THEN
|
||||||
|
ZPL := '^FO535,20^GB120,40,40,,3^FS':CRLF$
|
||||||
|
ZPL := '^FO540,25^AC,18^FR^FDCass:^FS':CRLF$
|
||||||
|
ZPL := '^FO600,25^A045,36^FR^FD':CassNo:'^FS':CRLF$
|
||||||
|
END ELSE
|
||||||
|
ZPL := '^FO540,25^AC,18^FDCass:^FS':CRLF$
|
||||||
|
ZPL := '^FO600,25^A045,36^FD':CassNo:'^FS':CRLF$
|
||||||
|
END
|
||||||
|
****** Second Line
|
||||||
|
ZPL := '^FO30,70^AC,18^FDWM In:^FS':CRLF$
|
||||||
|
ZPL := '^FO120,70^A050,30^FD':PrintWMInKey:'^FS':CRLF$
|
||||||
|
ZPL := '^BY2,2.0':CRLF$
|
||||||
|
ZPL := '^FO300,60^B3,,37,N^FD':'I':PrintWMInKey:'^FS':CRLF$
|
||||||
|
ZPL := '^BY2,3.0':CRLF$
|
||||||
|
ZPL := '^FO700,70^AC,18^FDQty:^FS':CRLF$
|
||||||
|
ZPL := '^FO760,70^A045,25^FD':WfrQty:'^FS':CRLF$
|
||||||
|
****** Third Line
|
||||||
|
ZPL := '^FO30,105^AC,18^FDShip Dt:^FS'
|
||||||
|
ZPL := '^FO140,105^A0,,25^FD':ReqShipDate:'^FS':CRLF$
|
||||||
|
ZPL := '^FO250,105^AC,18^FDCust:^FS':CRLF$
|
||||||
|
ZPL := '^FO320,105^A045,25^FD':CustName:'^FS':CRLF$
|
||||||
|
ZPL := '^FO560,105^AC,18^FDPO:^FS':CRLF$
|
||||||
|
ZPL := '^FO600,105^A045,25^FD':PONo:'^FS':CRLF$
|
||||||
|
****** Separator bar
|
||||||
|
ZPL := '^FO15,128^GB795,1^FS'
|
||||||
|
****** Fourth Line
|
||||||
|
ZPL := '^FO30,135^AC,18^FDLot No:^FS':CRLF$
|
||||||
|
ZPL := '^FO120,135^A0,20^FD':LotNo:'^FS':CRLF$
|
||||||
|
ZPL := '^FO410,135^AC,18^FDPart No:^FS':CRLF$
|
||||||
|
ZPL := '^FO510,135^A0,20^FD':PartNo:'^FS':CRLF$
|
||||||
|
****** Fifth Line
|
||||||
|
ZPL := '^FO30,160^AC,18^FDSub PN:^FS':CRLF$
|
||||||
|
ZPL := '^FO120,160^A0,20^FD':SubPartNo:'^FS':CRLF$
|
||||||
|
IF SuppCd NE '' THEN
|
||||||
|
ZPL := '^FO410,160^AC,18^FDSupp Cd:^FS':CRLF$
|
||||||
|
ZPL := '^FO510,160^A0,20^FD':SuppCd:'^FS':CRLF$
|
||||||
|
ZPL := '^BY2,2.0':CRLF$
|
||||||
|
ZPL := '^FO610,160^A040,20^B3,,23,N^FD':SuppCd:'^FS':CRLF$
|
||||||
|
ZPL := '^BY2,3.0':CRLF$
|
||||||
|
END
|
||||||
|
****** Separator bar
|
||||||
|
ZPL := '^FO15,183^GB795,1^FS'
|
||||||
|
****** Seventh Line
|
||||||
|
ZPL := '^FO30,210^AC,18^FDPre:^FS':CRLF$
|
||||||
|
ZPL := '^FO90,210^A0,20^FD':SubPreClean:'^FS':CRLF$
|
||||||
|
IF PreAkrionRecipe NE '' THEN
|
||||||
|
ZPL := '^FO210,210^AC,18^FDAkrion:^FS':CRLF$
|
||||||
|
ZPL := '^FO300,210^A0,20^FD':PreAkrionRecipe:'^FS':CRLF$
|
||||||
|
ZPL := '^BY2,2.0':CRLF$
|
||||||
|
ZPL := '^FO450,210^A040,20^B3,,23,N^FD':PreAkrionRecipe:'^FS':CRLF$
|
||||||
|
ZPL := '^BY2,3.0':CRLF$
|
||||||
|
END
|
||||||
|
****** Eighth Line
|
||||||
|
ZPL := '^FO30,235^AC,18^FDRecipe:^FS':CRLF$
|
||||||
|
ZPL := '^FO120,235^A0,20^FD':RecipeInfo:'^FS':CRLF$
|
||||||
|
ZPL := '^FO410,235^AC,18^FDEpi Dopant:^FS':CRLF$
|
||||||
|
ZPL := '^FO560,235^A040,20^FD':Dopant:'^FS':CRLF$
|
||||||
|
****** Tenth, Eleventh and Twelfth Lines
|
||||||
|
ZPL := '^FO30,285^AC,18^FDThk Spec:^FS':CRLF$
|
||||||
|
FOR M = 1 TO COUNT(PrintThickTargets,@VM) + (PrintThickTargets NE '')
|
||||||
|
BaseLine = 285 + (M-1)*20
|
||||||
|
ZPL := '^FO140,':BaseLine:'^A040,20^FD':PrintThickTargets<1,M>:'^FS':CRLF$
|
||||||
|
NEXT M
|
||||||
|
ZPL := '^FO410,285^AC,18^FDRes Spec:^FS':CRLF$
|
||||||
|
FOR M = 1 TO COUNT(PrintResTargets,@VM) + (PrintResTargets NE '')
|
||||||
|
BaseLine = 285 + (M-1)*20
|
||||||
|
ZPL := '^FO520,':BaseLine:'^A040,20^FD':PrintResTargets<1,M>:'^FS':CRLF$
|
||||||
|
NEXT M
|
||||||
|
****** Separator bar
|
||||||
|
ZPL := '^FO15,373^GB795,1^FS'
|
||||||
|
****** Fourteenth Line
|
||||||
|
ZPL := '^FO30,385^AC,18^FDProd Spec No:^FS':CRLF$
|
||||||
|
ZPL := '^FO190,385^A0,25^FD':PSNo:'^FS':CRLF$
|
||||||
|
IF SpecType = 'Production' THEN
|
||||||
|
SpecType = 'Prod'
|
||||||
|
end else IF SpecType = 'Pre-Production' THEN
|
||||||
|
SpecType = 'Pre'
|
||||||
|
end
|
||||||
|
ZPL := '^FO275,385^AC,18^FDSpec Type:^FS':CRLF$
|
||||||
|
ZPL := '^FO400,385^A0,25^FD':SpecType:'^FS':CRLF$
|
||||||
|
****** Data Matrix barcode
|
||||||
|
ZPL := '^FO720,280^CI28':CRLF$
|
||||||
|
ZPL := '^BXN,2,200^FDP':PartNo:'|S':SubPartNo:'|1T':PrintWMInKey:'|2T':LotNo:'|':PSNo:'|Q':WfrQty:'|1V':Vendor:'|SEQ':Cnt:'^FS':CRLF$
|
||||||
|
ZPL:= '^XZ'
|
||||||
|
Next
|
||||||
|
* Check to see if they get the monitor wafers based on the PSN
|
||||||
|
MonitorWafer = CustEpiPartRec<CUST_EPI_PART_MONITOR_WAFER_LABEL$>
|
||||||
|
IF MonitorWafer THEN
|
||||||
|
RDSIds = ''
|
||||||
|
ZPL := '^XA^CFD'
|
||||||
|
ZPL := '^LH0,0'
|
||||||
|
ZPL := '^PR2' ;* Print speed 2 inches per second
|
||||||
|
ZPL := '^LL325' ;* Label length in dots
|
||||||
|
ZPL := '^MD15' ;* Media darkness
|
||||||
|
ZPL := '^MMT':CRLF$ ;* Media mode t=tear off mode
|
||||||
|
ZPL := '^FO30,30^A060,40^FDMonitor Wafer^FS':CRLF$
|
||||||
|
ZPL := '^FO550,30^A060,40^FDReactor#_____^FS':CRLF$
|
||||||
|
ZPL := '^FO30,70^A060,40^FDDate_____________^FS':CRLF$
|
||||||
|
ZPL := '^FO30,130^A060,40^FDCustomer Name: ':CustName<I>:'^FS':CRLF$
|
||||||
|
ZPL := '^FO30,190^A060,40^FDRDS#: ':RDSIds<I>:'^FS':CRLF$
|
||||||
|
ZPL := '^FO400,190^A060,40^FDLot#: ':LotNo<I>:'^FS':CRLF$
|
||||||
|
ZPL := '^FO30,250^A060,40^FDThick Avg__________^FS':CRLF$
|
||||||
|
ZPL := '^FO400,250^A060,40^FDWafer Type__________^FS':CRLF$
|
||||||
|
ZPL := '^FO30,280^A060,40^FDRes Avg____________^FS':CRLF$
|
||||||
|
ZPL := '^FO400,280^A060,40^FDWafer Type__________^FS':CRLF$
|
||||||
|
ZPL := '^XZ'
|
||||||
|
END
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. WM_IN ':WmInKey:' does not exist.'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Null WmInKey passed in.'
|
||||||
|
end
|
||||||
|
|
||||||
|
If ErrorMsg EQ '' then
|
||||||
|
Response = ZPL
|
||||||
|
end else
|
||||||
|
Error_Services('Add', ErrorMsg)
|
||||||
|
end
|
||||||
|
|
||||||
|
end service
|
||||||
|
|
||||||
|
|
||||||
|
Service ConvertRecordToJSON(KeyID, Record, ItemURL)
|
||||||
|
|
||||||
|
jsonRecord = ''
|
||||||
|
|
||||||
|
If KeyID NE '' then
|
||||||
|
|
||||||
|
If Record EQ '' then Record = Database_Services('ReadDataRow', 'WM_IN', KeyID)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
@DICT = Database_Services('GetTableHandle', 'DICT.WM_IN')
|
||||||
|
@ID = KeyID
|
||||||
|
@RECORD = Record
|
||||||
|
objJSON = ''
|
||||||
|
If SRP_JSON(objJSON, 'New', 'Object') then
|
||||||
|
objWmIn = ''
|
||||||
|
If SRP_JSON(objWmIn, 'New', 'Object') then
|
||||||
|
SRP_JSON(objWmIn, 'SetValue', 'keyId', @ID)
|
||||||
|
SRP_JSON(objJSON, 'Set', 'wmIn', objWmIn)
|
||||||
|
SRP_JSON(objWmIn, 'Release')
|
||||||
|
end
|
||||||
|
|
||||||
|
If itemURL NE '' then
|
||||||
|
// The itemURL was passed in so add HAL+JSON properties.
|
||||||
|
// Create the _links property and then all link objects needed for this resource.
|
||||||
|
objLinks = ''
|
||||||
|
If SRP_JSON(objLinks, 'New', 'Object') then
|
||||||
|
// Create a self link.
|
||||||
|
objLink = ''
|
||||||
|
If SRP_JSON(objLink, 'New', 'Object') then
|
||||||
|
SRP_JSON(objLink, 'SetValue', 'href', ItemURL, 'String')
|
||||||
|
SRP_JSON(objLink, 'SetValue', 'title', 'Self', 'String')
|
||||||
|
SRP_JSON(objLinks, 'Set', 'self', objLink)
|
||||||
|
SRP_JSON(objLink, 'Release')
|
||||||
|
end
|
||||||
|
SRP_JSON(objJSON, 'Set', '_links', objLinks)
|
||||||
|
SRP_JSON(objLinks, 'Release')
|
||||||
|
end
|
||||||
|
// Create the _class property for this resource.
|
||||||
|
SRP_JSON(objJSON, 'SetValue', '_class', 'resource')
|
||||||
|
end
|
||||||
|
jsonRecord = SRP_JSON(objJSON, 'Stringify', 'Styled')
|
||||||
|
SRP_JSON(objJSON, 'Release')
|
||||||
|
end else
|
||||||
|
Error_Services('Add', 'Unable to create JSON representation in the ' : Service : ' service.')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Error_Services('Add', 'KeyID argument was missing in the ' : Service : ' service.')
|
||||||
|
end
|
||||||
|
|
||||||
|
Response = jsonRecord
|
||||||
|
|
||||||
|
End Service
|
||||||
|
|
||||||
|
|||||||
130
LSL2/STPROC/WM_OUT_API.txt
Normal file
130
LSL2/STPROC/WM_OUT_API.txt
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
Function WM_OUT_API(@API)
|
||||||
|
/***********************************************************************************************************************
|
||||||
|
|
||||||
|
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
|
||||||
|
permission from SRP Computer Solutions, Inc.
|
||||||
|
|
||||||
|
Name : WM_OUT_Api
|
||||||
|
|
||||||
|
Description : API logic for the WM_OUT resource.
|
||||||
|
|
||||||
|
Notes : All web APIs should include the API_SETUP insert. This will provide several useful variables:
|
||||||
|
|
||||||
|
HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.)
|
||||||
|
APIURL - The URL for the API entry point (e.g., api.mysite.com/v1).
|
||||||
|
FullEndpointURL - The URL submitted by the client, including query params.
|
||||||
|
FullEndpointURLNoQuery - The URL submitted by the client, excluding query params.
|
||||||
|
EndpointSegment - The URL endpoint segment.
|
||||||
|
ParentURL - The URL path preceeding the current endpoint.
|
||||||
|
CurrentAPI - The name of this stored procedure.
|
||||||
|
|
||||||
|
Parameters :
|
||||||
|
API [in] -- Web API to process. Format is [APIPattern].[HTTPMethod]:
|
||||||
|
- APIPattern must follow this structure Rds[.ID.[<Property>]]
|
||||||
|
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||||
|
Examples:
|
||||||
|
- Rds.POST
|
||||||
|
- Rds.ID.PUT
|
||||||
|
- Rds.ID.firstName.GET
|
||||||
|
Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API
|
||||||
|
services do not rely upon anything being returned in the response. This is what the
|
||||||
|
various services like SetResponseBody and SetResponseStatus services are for. A response
|
||||||
|
value is only helpful if the developers want to use it for debug purposes.
|
||||||
|
|
||||||
|
History : (Date, Initials, Notes)
|
||||||
|
08/28/25 djs Original programmer.
|
||||||
|
|
||||||
|
***********************************************************************************************************************/
|
||||||
|
|
||||||
|
#pragma precomp SRP_PreCompiler
|
||||||
|
|
||||||
|
$insert APP_INSERTS
|
||||||
|
$insert API_SETUP
|
||||||
|
$insert HTTP_INSERTS
|
||||||
|
|
||||||
|
Declare function WM_Out_Services
|
||||||
|
|
||||||
|
GoToAPI else
|
||||||
|
// The specific resource endpoint doesn't have a API handler yet.
|
||||||
|
HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.')
|
||||||
|
end
|
||||||
|
|
||||||
|
Return Response OR ''
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Endpoint Handlers
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
API wm_out.ID.HEAD
|
||||||
|
API wm_out.ID.GET
|
||||||
|
|
||||||
|
GoSub CreateHALItem
|
||||||
|
|
||||||
|
end api
|
||||||
|
|
||||||
|
API wm_out.ID.zpl.HEAD
|
||||||
|
API wm_out.ID.zpl.GET
|
||||||
|
|
||||||
|
GoSub CreateZPLItem
|
||||||
|
|
||||||
|
end api
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Internal GoSubs
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
// CreateHALItem
|
||||||
|
//
|
||||||
|
// Creates a HAL+JSON object based on the OpenInsight data row representation of the scan.
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
CreateHALItem:
|
||||||
|
|
||||||
|
WMOutKey = EndpointSegment
|
||||||
|
Convert '-' to '*' in WMOutKey
|
||||||
|
WmOutJson = WM_Out_Services('ConvertRecordToJSON', WMOutKey, '', FullEndpointURL)
|
||||||
|
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
StatusCode = 200
|
||||||
|
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||||
|
HTTP_Services('SetResponseBody', WmOutJson, False$, 'application/hal+json')
|
||||||
|
If Assigned(Message) then
|
||||||
|
HTTP_Services('SetResponseStatus', StatusCode, Message)
|
||||||
|
end else
|
||||||
|
HTTP_Services('SetResponseStatus', StatusCode)
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Message = Error_Services('GetMessage')
|
||||||
|
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
|
||||||
|
end
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
// CreateZPLItem
|
||||||
|
//
|
||||||
|
// Creates a HAL+JSON object with the ZPL for the given WM_IN row
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
CreateZPLItem:
|
||||||
|
|
||||||
|
WmOutKey = ParentSegment
|
||||||
|
ZPL = Wm_Out_Services('GetWmOutZpl', WmOutKey)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
StatusCode = 200
|
||||||
|
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||||
|
HTTP_Services('SetResponseBody', ZPL, False$, 'text/plain')
|
||||||
|
If Assigned(Message) then
|
||||||
|
HTTP_Services('SetResponseStatus', StatusCode, Message)
|
||||||
|
end else
|
||||||
|
HTTP_Services('SetResponseStatus', StatusCode)
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Message = Error_Services('GetMessage')
|
||||||
|
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
|
||||||
|
end
|
||||||
|
|
||||||
|
return
|
||||||
@ -49,7 +49,7 @@ Compile function WM_Out_Services(@Service, @Params)
|
|||||||
#pragma precomp SRP_PreCompiler
|
#pragma precomp SRP_PreCompiler
|
||||||
|
|
||||||
$Insert SERVICE_SETUP
|
$Insert SERVICE_SETUP
|
||||||
$Insert LOGICAL
|
$Insert APP_INSERTS
|
||||||
$Insert MSG_EQUATES
|
$Insert MSG_EQUATES
|
||||||
$Insert DICT_EQUATES
|
$Insert DICT_EQUATES
|
||||||
$Insert WM_OUT_EQUATES
|
$Insert WM_OUT_EQUATES
|
||||||
@ -57,20 +57,28 @@ $Insert WO_MAT_EQUATES
|
|||||||
$Insert WO_LOG_EQUATES
|
$Insert WO_LOG_EQUATES
|
||||||
$Insert COMPANY_EQUATES
|
$Insert COMPANY_EQUATES
|
||||||
$Insert RETURN_TO_FAB_LOTS_EQUATES
|
$Insert RETURN_TO_FAB_LOTS_EQUATES
|
||||||
|
$INSERT PROD_SPEC_EQUATES
|
||||||
|
$INSERT WO_STEP_EQUATES
|
||||||
|
$INSERT EPI_PART_EQUATES
|
||||||
|
$INSERT CUST_EPI_PART_EQUATES
|
||||||
|
$INSERT PRS_STAGE_EQUATES
|
||||||
|
$insert UNIT_EQUATES
|
||||||
|
|
||||||
Declare function Database_Services, SRP_JSON, Error_Services, Clean_Insp_Services, WO_Mat_QA_Services
|
Declare function Database_Services, SRP_JSON, Error_Services, Clean_Insp_Services, WO_Mat_QA_Services
|
||||||
Declare function PSN_Services, SRP_Rotate_Array, Datetime, Return_To_Fab_Services, Environment_Services
|
Declare function PSN_Services, SRP_Rotate_Array, Datetime, Return_To_Fab_Services, Environment_Services
|
||||||
Declare function Logging_Services
|
Declare function Logging_Services
|
||||||
Declare subroutine Database_Services, SRP_JSON, Error_Services, Extract_Si_Keys, Set_Status, obj_wo_mat_log
|
Declare subroutine Database_Services, SRP_JSON, Error_Services, Extract_Si_Keys, Set_Status, obj_wo_mat_log
|
||||||
Declare subroutine Logging_Services
|
Declare subroutine Logging_Services, Btree.Extract
|
||||||
|
|
||||||
GoToService
|
GoToService else
|
||||||
|
Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
|
||||||
|
end
|
||||||
|
|
||||||
Return Response or ""
|
Return Response else ''
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// SERVICES
|
// Services
|
||||||
//-----------------------------------------------------------------------------
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
@ -645,3 +653,299 @@ Service VerifyWOMatWMOKeyIndex(WMOKey)
|
|||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
Service GetWMOutKeys(WOLogId)
|
||||||
|
|
||||||
|
ErrorMsg = ''
|
||||||
|
WMOutKeys = ''
|
||||||
|
|
||||||
|
If WOLogId NE '' then
|
||||||
|
Open 'DICT.WM_OUT' to hWmOutDict then
|
||||||
|
SearchString = ''
|
||||||
|
SearchString := 'WO_NO':@VM:WOLogId:@FM
|
||||||
|
Btree.Extract(SearchString, 'WM_OUT', hWmOutDict, WMOutKeys, 0, 0)
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error opening WM_OUT dictionary.'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'WOLogId was null'
|
||||||
|
end
|
||||||
|
|
||||||
|
If ErrorMsg NE '' then
|
||||||
|
Error_Services('Add', ErrorMsg)
|
||||||
|
end
|
||||||
|
|
||||||
|
Response = WMOutKeys
|
||||||
|
|
||||||
|
end service
|
||||||
|
|
||||||
|
|
||||||
|
Service GetWmOutZpl(WmOutKey)
|
||||||
|
|
||||||
|
ZPL = ''
|
||||||
|
ErrorMsg = ''
|
||||||
|
If WmOutKey NE '' then
|
||||||
|
Swap '-' with '*' in WmOutKey
|
||||||
|
Swap '.' with '*' in WmOutKey
|
||||||
|
If RowExists('WM_OUT', WmOutKey) then
|
||||||
|
WONo = Field(WmOutKey, '*', 1, 1)
|
||||||
|
WOStep = Field(WmOutKey, '*', 2, 1)
|
||||||
|
WOStepKeys = XLATE('WO_LOG', WONo, WO_LOG_WO_STEP_KEY$, 'X')
|
||||||
|
IF INDEX(WOStepKeys,@VM,1) THEN
|
||||||
|
PrintWONo = WONo:'.':WOStep
|
||||||
|
END ELSE
|
||||||
|
PrintWONo = WONo
|
||||||
|
END
|
||||||
|
WORec = XLATE('WO_LOG',WONo,'','X')
|
||||||
|
ReqShipDate = OCONV(WORec<WO_LOG_PROMISE_SHIP_DT$>,'D2/')
|
||||||
|
CustNo = WORec<WO_LOG_CUST_NO$>
|
||||||
|
CustName = XLATE('COMPANY',CustNo,'ABBREV_OR_CO_NAME','X')
|
||||||
|
Captive = XLATE('COMPANY',CustNo,'CAPTIVE','X')
|
||||||
|
PONo = WORec<WO_LOG_CUST_PO_NO$>
|
||||||
|
PSNo = XLATE('WO_STEP',WONo:'*':WOStep,WO_STEP_PROD_SPEC_ID$,'X')
|
||||||
|
PSRec = XLATE('PROD_SPEC',PSNo,'','X')
|
||||||
|
|
||||||
|
CustSpecNo = ''
|
||||||
|
IF Captive THEN
|
||||||
|
CustSpecNos = PSRec<PROD_SPEC_SPEC_NUM$>
|
||||||
|
CustSpecDescs = PSRec<PROD_SPEC_SPEC_DESC$>
|
||||||
|
CustSpecRevNos = PSRec<PROD_SPEC_REV_NUM$>
|
||||||
|
CustSpecRevDts = PSRec<PROD_SPEC_REV_DATE$>
|
||||||
|
SpecCnt = COUNT(CustSpecNos,@VM) + (CustSpecNos NE '')
|
||||||
|
FOR I = 1 TO SpecCnt
|
||||||
|
IF CustSpecDescs<1,I> _EQC 'GENERAL' THEN
|
||||||
|
CustSpecNo = CustSpecNos<1,I>
|
||||||
|
CustSpecDesc = CustSpecDescS<1,I>
|
||||||
|
CustSpecRevNo = CustSpecRevNos<1,I>
|
||||||
|
CustSpecRevDt = OCONV(CustSpecRevDts<1,I>,'D4/')
|
||||||
|
END
|
||||||
|
UNTIL CustSpecNo NE ''
|
||||||
|
NEXT I
|
||||||
|
END
|
||||||
|
|
||||||
|
EpiPartNo = WORec<WO_LOG_EPI_PART_NO$>
|
||||||
|
CustEpiPartRec = XLATE('CUST_EPI_PART',CustNo:'*':EpiPartNo,'','X')
|
||||||
|
ShipBagReq = CustEpiPartRec<CUST_EPI_PART_SHIP_BAG_REQ$>
|
||||||
|
PreSurfscan = XLATE('PRS_STAGE',PSNo:'*PRE',PRS_STAGE_SURFSCAN_SIG_REQ$,'X')
|
||||||
|
FirstSurfscan = XLATE('PRS_STAGE',PSNo:'*WFR',PRS_STAGE_SURFSCAN_SIG_REQ$,'X')
|
||||||
|
PostCleanSurfScan = XLATE('PRS_STAGE',PSNo:'*POST',PRS_STAGE_SURFSCAN_SIG_REQ$,'X')
|
||||||
|
PostCleanSSSampleQty = XLATE('PRS_STAGE',PSNo:'*POST',PRS_STAGE_SS_SAMP_QTY$, 'X' )
|
||||||
|
PostCleanSurfscanRecipe = XLATE('PRS_STAGE',PSNo:'*POST',PRS_STAGE_SURFSCAN_RECIPE$,'X')
|
||||||
|
PostCleanSurfDefects = XLATE('PRS_STAGE',PSNo:'*POST',PRS_STAGE_SURF_DEFECTS$,'X')
|
||||||
|
PostCleanSurfHaze = OCONV(XLATE('PRS_STAGE',PSNo:'*POST',PRS_STAGE_SURF_HAZE$,'X'),'MD2')
|
||||||
|
SubPreClean = XLATE('PRS_STAGE',PSNo:'*PRE','TOOL_DISPLAY','X')
|
||||||
|
SubPostClean = XLATE('PRS_STAGE',PSNo:'*POST','TOOL_DISPLAY','X')
|
||||||
|
PreCleanTool = XLATE('PRS_STAGE',PSNo:'*PRE','TOOL_DISPLAY','X')
|
||||||
|
PostCleanTool = XLATE('PRS_STAGE',PSNo:'*POST','TOOL_DISPLAY','X')
|
||||||
|
PreAkrionRecipe = XLATE('PRS_STAGE',PSNo:'*PRE',PRS_STAGE_CLEAN_RECIPE$,'X')
|
||||||
|
PostAkrionRecipe = XLATE('PRS_STAGE',PSNo:'*POST',PRS_STAGE_CLEAN_RECIPE$,'X')
|
||||||
|
* * * * * * * * Following needs update to point to the PRS_LAYER & PRS_STAGE tables as required.
|
||||||
|
* * * * * * * * It's the required part that needs sorted out JCH 1/28/2014
|
||||||
|
RecipeNo = XLATE( 'PROD_SPEC', PSNo, 'RECIPE_NO_L1', 'X' )
|
||||||
|
RecipeName = XLATE( 'PROD_SPEC', PSNo, 'RECIPE_NAME_L1', 'X' )
|
||||||
|
SpecType = OCONV( XLATE( 'PROD_SPEC', PSNo, 'SPEC_TYPE', 'X' ), '[SPEC_TYPE_CONV]' )
|
||||||
|
SubOxide = OCONV( XLATE( 'PROD_SPEC', PSNo, 'SUB_OXIDE_STRIP', 'X' ), 'B' )
|
||||||
|
ThickTarget = OCONV( XLATE( 'PROD_SPEC', PSNo, 'THICK_TARGET_ALL', 'X' ), 'MD3' )
|
||||||
|
ResTarget = OCONV( XLATE( 'PROD_SPEC', PSNo, 'RES_TARGET_ALL', 'X' ), 'MD3' )
|
||||||
|
ThickUnit = XLATE( 'PROD_SPEC', PSNo, 'THICK_UNITS_ALL', 'X' )
|
||||||
|
ResUnit = XLATE( 'PROD_SPEC', PSNo , 'RES_UNITS_ALL', 'X' )
|
||||||
|
Dopant = XLATE( 'PROD_SPEC', PSNo, 'DOPANT_L1', 'X' )
|
||||||
|
RecipeNo = XLATE( 'PROD_SPEC', PSNo, 'RECIPE_NO', 'X' )
|
||||||
|
RecipeInfo = XLATE( 'RECIPE', RecipeNo, 'RECIPE_NAME_NO', 'X' )
|
||||||
|
CleaningReqs = ''
|
||||||
|
|
||||||
|
ThickCnt = FIELDCOUNT( ThickTarget<1>, @VM )
|
||||||
|
PrintThickTargets = ''
|
||||||
|
FOR J = 1 TO ThickCnt
|
||||||
|
PrintThickTargets<1,J> = ThickTarget<1,J>:ThickUnit<1,J>
|
||||||
|
NEXT J
|
||||||
|
|
||||||
|
ResCnt = FIELDCOUNT( ResTarget<1>, @VM )
|
||||||
|
PrintResTargets = ''
|
||||||
|
FOR J = 1 TO ResCnt
|
||||||
|
IF ResTarget<1,J>[1,1] = '.' THEN
|
||||||
|
TargetVal = '0':ResTarget<1,J>
|
||||||
|
END ELSE
|
||||||
|
TargetVal = ResTarget<1,J>
|
||||||
|
END
|
||||||
|
PrintResTargets<1,J> = TargetVal:ResUnit<1,J>
|
||||||
|
NEXT J
|
||||||
|
|
||||||
|
APreRec = ''
|
||||||
|
APostRec = ''
|
||||||
|
IF ( PreAkrionRecipe<1> <> '' ) THEN
|
||||||
|
APreRec = ' ':PreAkrionRecipe:' '
|
||||||
|
SubOxide = 'No' ;* If Akrion then no oxide strip
|
||||||
|
END
|
||||||
|
|
||||||
|
IF ( PostAkrionRecipe<1> <> '' ) THEN
|
||||||
|
APostRec = ' ':PostAkrionRecipe
|
||||||
|
END
|
||||||
|
|
||||||
|
PrintCleaningReqs = TRIM( 'Strip:':SubOxide:' Pre:':SubPreClean:APreRec:' Post:':SubPostClean:APostRec )
|
||||||
|
|
||||||
|
swap UNIT_MICROMETER$ with 'um' in PrintThickTargets
|
||||||
|
swap UNIT_OHM_CM$ with 'ohm.cm' in PrintThickTargets
|
||||||
|
swap UNIT_OHM_PER_SQ$ with 'ohm/sq' in PrintThickTargets
|
||||||
|
swap UNIT_A$ with 'A' in PrintThickTargets
|
||||||
|
|
||||||
|
swap UNIT_MICROMETER$ with 'um' in PrintResTargets
|
||||||
|
swap UNIT_OHM_CM$ with 'ohm.cm' in PrintResTargets
|
||||||
|
swap UNIT_OHM_PER_SQ$ with 'ohm/sq' in PrintResTargets
|
||||||
|
swap UNIT_A$ with 'A' in PrintResTargets
|
||||||
|
|
||||||
|
MakeupBox = XLATE('WM_OUT',WMOutKey,WM_OUT_MAKEUP_BOX$ ,'X')
|
||||||
|
|
||||||
|
PrintWMOutKey = WMOutKey
|
||||||
|
CONVERT '*' TO '.' IN PrintWMOutKey
|
||||||
|
|
||||||
|
CassNo = FIELD(WMOutKey,'*',3)
|
||||||
|
LotNo = 'Multiple'
|
||||||
|
WfrQty = XLATE('WM_OUT',WMOutKey,'WFRS_SCHED','X')
|
||||||
|
SubPartNo = WORec<WO_LOG_ORD_SUB_PART_NO$>
|
||||||
|
CustPartNo = WORec<WO_LOG_CUST_PART_NO$>
|
||||||
|
EpiPartNo = WORec<WO_LOG_EPI_PART_NO$>
|
||||||
|
CustPartDesc = XLATE('EPI_PART',EpiPartNo,EPI_PART_EPI_PART_DESC$,'X')
|
||||||
|
PartNo = CustPartNo ;* Temporary for 4x2 to 4x4 conversion
|
||||||
|
PartDesc = CustPartDesc ;* Temporary for 4x2 to 4x4 conversion
|
||||||
|
SubVendCode = WORec<WO_LOG_EXP_VEND_CD$>
|
||||||
|
Vendor = XLATE('SEMI_VEND_CODE', SubVendCode, 'EPI_VEND_CD', 'X')
|
||||||
|
|
||||||
|
SuppCd = TRIM(SubPartNo[-1,'B-'])
|
||||||
|
IF LEN(SuppCd) NE '2' THEN SuppCd =''
|
||||||
|
|
||||||
|
For cnt = 1 to 2
|
||||||
|
***** Start of label ZPL
|
||||||
|
ZPL := '^XA'
|
||||||
|
***** Label setup
|
||||||
|
ZPL := '^LH0,0'
|
||||||
|
ZPL := '^PR2' ;* Print speed 2 inches per second
|
||||||
|
ZPL := '^LL406' ;* Label length 203 dpi
|
||||||
|
ZPL := '^PW900' ;* Print width 900 dpi
|
||||||
|
ZPL := '^MD2' ;* Media darkness
|
||||||
|
ZPL := '^MMT':CRLF$ ;* Media mode t=tear off mode
|
||||||
|
***** Border
|
||||||
|
ZPL := '^FO10,5^GB795,398,3,B^FS':CRLF$
|
||||||
|
****** First Line
|
||||||
|
Company = 'IFX Epi Services'
|
||||||
|
ZPL := '^FO30,20^A0,45,36^FD':Company:'^FS':CRLF$
|
||||||
|
ZPL := '^FO290,25^AC,18^FDWO No:^FS':CRLF$
|
||||||
|
ZPL := '^FO370,20^A045,36^FD':PrintWONo:'^FS':CRLF$
|
||||||
|
IF CassNo = 1 THEN
|
||||||
|
ZPL := '^FO535,15^GB120,40,40,,3^FS':CRLF$
|
||||||
|
ZPL := '^FO540,25^AC,18^FR^FDCass:^FS':CRLF$
|
||||||
|
ZPL := '^FO600,20^A045,36^FR^FD':CassNo:'^FS':CRLF$
|
||||||
|
END ELSE
|
||||||
|
ZPL := '^FO540,25^AC,18^FDCass:^FS':CRLF$
|
||||||
|
ZPL := '^FO600,20^A045,36^FD':CassNo:'^FS':CRLF$
|
||||||
|
END
|
||||||
|
ZPL:= '^FO665,20^A045,36^FDWM Out^FS':CRLF$
|
||||||
|
****** Second Line
|
||||||
|
ZPL:= '^FO30,70^AC,18^FDWM Out:^FS':CRLF$
|
||||||
|
ZPL:= '^FO120,65^A050,30^FD':PrintWMOutKey:'^FS':CRLF$
|
||||||
|
ZPL := '^BY2,2.0':CRLF$
|
||||||
|
ZPL := '^FO300,58^B3,,37,N^FD':'O':PrintWMOutKey:'^FS':CRLF$
|
||||||
|
ZPL := '^BY2,3.0':CRLF$
|
||||||
|
ZPL:= '^FO700,60^AC,18^FDQty:^FS':CRLF$
|
||||||
|
ZPL:= '^FO760,60^A045,25^FD':WfrQty:'^FS':CRLF$
|
||||||
|
****** Third Line
|
||||||
|
ZPL:= '^FO30,100^AC,18^FDShip Dt:^FS':CRLF$
|
||||||
|
ZPL:= '^FO140,100^A0,,25^FD':ReqShipDate:'^FS':CRLF$
|
||||||
|
ZPL:= '^FO250,100^AC,18^FDCust:^FS':CRLF$
|
||||||
|
ZPL:= '^FO320,100^A045,25^FD':CustName:'^FS':CRLF$
|
||||||
|
ZPL:= '^FO560,100^AC,18^FDPO:^FS':CRLF$
|
||||||
|
ZPL:= '^FO600,100^A045,25^FD':PONo:'^FS':CRLF$
|
||||||
|
****** Separator bar
|
||||||
|
ZPL:= '^FO15,125^GB790,1^FS':CRLF$
|
||||||
|
****** Fourth Line
|
||||||
|
ZPL := '^FO30,130^AC,18^FDLot No:^FS':CRLF$
|
||||||
|
ZPL := '^FO120,130^A0,20^FD':LotNo:'^FS':CRLF$
|
||||||
|
ZPL := '^FO410,130^AC,18^FDPart No:^FS':CRLF$
|
||||||
|
ZPL := '^FO510,130^A0,20^FD':PartNo:'^FS':CRLF$
|
||||||
|
****** Fifth Line
|
||||||
|
ZPL := '^FO30,155^AC,18^FDSub PN:^FS':CRLF$
|
||||||
|
ZPL := '^FO120,155^A0,20^FD':SubPartNo:'^FS':CRLF$
|
||||||
|
IF SuppCd NE '' THEN
|
||||||
|
ZPL := '^FO410,155^AC,18^FDSupp Cd:^FS':CRLF$
|
||||||
|
ZPL := '^FO510,155^A0,20^FD':SuppCd:'^FS':CRLF$
|
||||||
|
ZPL := '^BY2,2.0':CRLF$
|
||||||
|
ZPL := '^FO610,155^A040,20^B3,,23,N^FD':SuppCd:'^FS':CRLF$
|
||||||
|
ZPL := '^BY2,3.0':CRLF$
|
||||||
|
END
|
||||||
|
****** Separator bar
|
||||||
|
ZPL := '^FO15,180^GB790,1^FS':CRLF$
|
||||||
|
IF MakeupBox THEN
|
||||||
|
ZPL := '^FO410,190^A050,30^FD* * * M a k e u p B o x * * *^FS':CRLF$
|
||||||
|
END ELSE
|
||||||
|
ZPL := '^FO410,190^AC,18^FDReact Type:^FS':CRLF$
|
||||||
|
ZPL := '^FO560,190^A0,20^FDEpiPro^FS':CRLF$
|
||||||
|
END
|
||||||
|
****** Seventh Line
|
||||||
|
ZPL := '^FO30,190^AC,18^FDPre:^FS':CRLF$
|
||||||
|
ZPL := '^FO90,190^A0,20^FD':SubPreClean:'^FS':CRLF$
|
||||||
|
IF PreAkrionRecipe NE '' THEN
|
||||||
|
ZPL := '^FO210,190^AC,18^FDAkrion:^FS':CRLF$
|
||||||
|
ZPL := '^FO300,190^A0,20^FD':PreAkrionRecipe:'^FS':CRLF$
|
||||||
|
ZPL := '^BY2,2.0':CRLF$
|
||||||
|
ZPL := '^FO450,190^A040,20^B3,,23,N^FD':PreAkrionRecipe:'^FS':CRLF$
|
||||||
|
ZPL := '^BY2,3.0':CRLF$
|
||||||
|
END
|
||||||
|
****** Eighth Line
|
||||||
|
ZPL := '^FO30,225^AC,18^FDRecipe:^FS':CRLF$
|
||||||
|
ZPL := '^FO120,225^A0,20^FD':RecipeInfo:'^FS':CRLF$
|
||||||
|
ZPL := '^FO410,225^AC,18^FDEpi Dopant:^FS':CRLF$
|
||||||
|
ZPL := '^FO560,225^A040,20^FD':Dopant:'^FS':CRLF$
|
||||||
|
****** Ninth, Tenth and Eleventh Lines
|
||||||
|
ZPL := '^FO30,260^AC,18^FDThk Spec:^FS':CRLF$
|
||||||
|
FOR M = 1 TO COUNT(PrintThickTargets,@VM) + (PrintThickTargets NE '')
|
||||||
|
BaseLine = 260 + (M-1)*20
|
||||||
|
ZPL := '^FO140,':BaseLine:'^A040,20^FD':PrintThickTargets<1,M>:'^FS':CRLF$
|
||||||
|
NEXT M
|
||||||
|
ZPL := '^FO410,260^AC,18^FDRes Spec:^FS':CRLF$
|
||||||
|
FOR M = 1 TO COUNT(PrintResTargets,@VM) + (PrintResTargets NE '')
|
||||||
|
BaseLine = 260 + (M-1)*20
|
||||||
|
ZPL := '^FO520,':BaseLine:'^A040,20^FD':PrintResTargets<1,M>:'^FS':CRLF$
|
||||||
|
NEXT M
|
||||||
|
IF PostAkrionRecipe NE '' THEN
|
||||||
|
ZPL := '^FO30,335^AC,18^FDPost:^FS':CRLF$
|
||||||
|
ZPL := '^FO90,335^A0,20^FD':SubPostClean:'^FS':CRLF$
|
||||||
|
ZPL := '^FO210,335^AC,18^FDAkrion:^FS':CRLF$
|
||||||
|
ZPL := '^FO300,335^A0,20^FD':PostAkrionRecipe:'^FS':CRLF$
|
||||||
|
ZPL := '^BY2,2.0':CRLF$
|
||||||
|
ZPL := '^FO450,335^A040,20^B3,,23,N^FD':PostAkrionRecipe:'^FS':CRLF$
|
||||||
|
ZPL := '^BY2,3.0':CRLF$
|
||||||
|
END ELSE
|
||||||
|
ZPL := '^FO30,335^AC,18^FDPost:^FS':CRLF$
|
||||||
|
ZPL := '^FO120,335^A0,20^FD':SubPostClean:'^FS':CRLF$
|
||||||
|
END
|
||||||
|
****** Separator bar
|
||||||
|
ZPL := '^FO15,365^GB790,1^FS':CRLF$
|
||||||
|
****** Data Matrix barcode
|
||||||
|
ZPL := '^FO720,280^CI28':CRLF$
|
||||||
|
ZPL := '^BXN,2,200^FDP':PartNo:'|S':SubPartNo:'|1T':PrintWMOutKey:'|2T':LotNo:'|':PSNo:'|Q':WfrQty:'|1V':Vendor:'|SEQ':Cnt:'^FS':CRLF$
|
||||||
|
****** Fourteenth Line
|
||||||
|
ZPL := '^FO30,375^AC,18^FDProd Spec No:^FS':CRLF$
|
||||||
|
ZPL := '^FO190,375^A0,25^FD':PSNo:'^FS':CRLF$
|
||||||
|
IF SpecType = 'Production' THEN SpecType = 'Prod'
|
||||||
|
IF SpecType = 'Pre-Production' THEN SpecType = 'Pre'
|
||||||
|
ZPL := '^FO275,375^AC,18^FDSpec Type:^FS':CRLF$
|
||||||
|
ZPL := '^FO400,375^A0,25^FD':SpecType:'^FS':CRLF$
|
||||||
|
ZPL := '^FO480,375^AC,18^FDBag:^FS':CRLF$
|
||||||
|
ZPL := '^FO530,375^A0,20^FD':ShipBagReq:'^FS':CRLF$
|
||||||
|
***** End of Label
|
||||||
|
ZPL := '^XZ'
|
||||||
|
Next
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. WM_OUT ':WmOutKey:' does not exist.'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Null WmOutKey passed in.'
|
||||||
|
end
|
||||||
|
|
||||||
|
If ErrorMsg EQ '' then
|
||||||
|
Response = ZPL
|
||||||
|
end else
|
||||||
|
Error_Services('Add', ErrorMsg)
|
||||||
|
end
|
||||||
|
|
||||||
|
end service
|
||||||
|
|
||||||
|
|||||||
@ -51,17 +51,18 @@ $Insert IFX_EQUATES
|
|||||||
$Insert CUST_EPI_PART_EQUATES
|
$Insert CUST_EPI_PART_EQUATES
|
||||||
|
|
||||||
Equ MAX_NUM_CASS$ to 150
|
Equ MAX_NUM_CASS$ to 150
|
||||||
|
Equ NUM_ATTEMPTS$ to 10
|
||||||
|
|
||||||
Declare subroutine Error_Services, Work_Order_Services, Memory_Services, RList, Database_Services, SRP_JSON
|
Declare subroutine Error_Services, Work_Order_Services, Memory_Services, RList, Database_Services, SRP_JSON
|
||||||
Declare subroutine Btree.Extract, Set_Status, obj_WO_Log, obj_Notes, Print_Wo_Mat_In_Labels, Print_Wo_Mat_Out_Labels
|
Declare subroutine Btree.Extract, Set_Status, obj_WO_Log, obj_Notes, Print_Wo_Mat_In_Labels, Print_Wo_Mat_Out_Labels
|
||||||
Declare subroutine Print_Wmi_Labels, Print_Wmo_Labels, ErrMsg, Print_Cass_Labels, Logging_Services, Service_Services
|
Declare subroutine Print_Wmi_Labels, Print_Wmo_Labels, ErrMsg, Print_Cass_Labels, Logging_Services, Service_Services
|
||||||
Declare subroutine obj_WO_Mat_Log, WO_Mat_Services, Work_Order_Services, Transaction_Services, Extract_Si_Keys
|
Declare subroutine obj_WO_Mat_Log, WO_Mat_Services, Work_Order_Services, Transaction_Services, Extract_Si_Keys
|
||||||
Declare subroutine Mona_Services, Lot_Event_Services, RDS_Services, Lot_Services, WM_In_Services, WM_Out_Services
|
Declare subroutine Mona_Services, Lot_Event_Services, RDS_Services, Lot_Services, WM_In_Services, WM_Out_Services
|
||||||
Declare subroutine obj_WO_Mat, obj_Post_Log
|
Declare subroutine obj_WO_Mat, obj_Post_Log, Delay
|
||||||
Declare function SRP_Array, Work_Order_Services, Memory_Services, Database_Services, SRP_Sort_Array, SRP_JSON
|
Declare function SRP_Array, Work_Order_Services, Memory_Services, Database_Services, SRP_Sort_Array, SRP_JSON
|
||||||
Declare function Company_Services, obj_Prod_Spec, Schedule_Services, obj_WO_Log, obj_WO_Step, Memberof, Datetime
|
Declare function Company_Services, obj_Prod_Spec, Schedule_Services, obj_WO_Log, obj_WO_Step, Memberof, Datetime
|
||||||
Declare function Environment_Services, Logging_Services, Hold_Services, Signature_Services, Lot_Services
|
Declare function Environment_Services, Logging_Services, Hold_Services, Signature_Services, Lot_Services
|
||||||
Declare function SRP_Datetime, RTI_CreateGUID, RDS_Services, UCase
|
Declare function SRP_Datetime, RTI_CreateGUID, RDS_Services, UCase, Date_Services
|
||||||
|
|
||||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
|
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
|
||||||
LogDate = Oconv(Date(), 'D4/')
|
LogDate = Oconv(Date(), 'D4/')
|
||||||
@ -1140,6 +1141,86 @@ Service UpdateReleasedQty(WONo)
|
|||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
|
Service AdjustReleasedQty(WONo, AdjustQty)
|
||||||
|
|
||||||
|
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
|
||||||
|
LogDate = Oconv(Date(), 'D4/')
|
||||||
|
LogTime = Oconv(Time(), 'MTS')
|
||||||
|
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Adjust Released Qty Log.csv'
|
||||||
|
Headers = 'Logging DTM' : @FM : 'WONo' : @FM : 'Notes'
|
||||||
|
objAdjRelLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$,',', Headers, '', False$, False$)
|
||||||
|
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
||||||
|
OrigRelQty = ''
|
||||||
|
RelQty = ''
|
||||||
|
UnrelQty = ''
|
||||||
|
ErrorMsg = ''
|
||||||
|
Begin Case
|
||||||
|
Case (WONo EQ '')
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Null WONo passed into service'
|
||||||
|
Case (AdjustQty EQ '')
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Null AdjustQty passed into service'
|
||||||
|
Case Not(Num(AdjustQty))
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. AdjustQty is not a number'
|
||||||
|
Case Index(AdjustQty, '.', 1)
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. AdjustQty cannot be a decimal value'
|
||||||
|
Case Otherwise$
|
||||||
|
Null
|
||||||
|
End Case
|
||||||
|
If (ErrorMsg EQ '' ) then
|
||||||
|
If RowExists('WO_LOG', WONo) then
|
||||||
|
For Attempt = 1 to NUM_ATTEMPTS$
|
||||||
|
If Attempt GT 0 then Delay(Attempt)
|
||||||
|
HaveLock = Database_Services('GetKeyIDLock', 'WO_LOG', WONo, True$)
|
||||||
|
If HaveLock then
|
||||||
|
WORec = Database_Services('ReadDataRow', 'WO_LOG', WONo)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
WOQty = WORec<WO_LOG_WO_QTY$>
|
||||||
|
OrigRelQty = WORec<WO_LOG_REL_QTY_STATIC$>
|
||||||
|
RelQty = OrigRelQty + AdjustQty
|
||||||
|
UnrelQty = WOQty - RelQty
|
||||||
|
If UnrelQty LT 0 then UnrelQty = 0
|
||||||
|
WORec<WO_LOG_REL_QTY_STATIC$> = RelQty
|
||||||
|
WORec<WO_LOG_UNREL_QTY_STATIC$> = UnRelQty
|
||||||
|
Database_Services('WriteDataRow', 'WO_LOG', WONo, WORec, True$, False$, False$)
|
||||||
|
If Error_Services('HasError') then
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Failed to write ':RelQty:' on REL_QTY_STATIC '
|
||||||
|
ErrorMsg := 'field and ':UnrelQty:' on UNREL_QTY_STATIC field of WO_LOG record ':WONo:'.'
|
||||||
|
ErrorMsg := 'Error message: ':Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Failed to read record ':WONo:' from the WO_LOG table. '
|
||||||
|
ErrorMsg := 'Error message: ':Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
If ( Not(HaveLock) and (Attempt GE NUM_ATTEMPTS$) ) then
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Failed to lock WO_LOG ':WoNo:' for update after ':Attempt:' attempts.'
|
||||||
|
end
|
||||||
|
Until HaveLock or (ErrorMsg NE '')
|
||||||
|
Next Attempt
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. ':WONo:' does not exist in the WO_LOG table.'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
LogData = ''
|
||||||
|
LogData<1> = LoggingDtm
|
||||||
|
LogData<2> = WONo
|
||||||
|
If ErrorMsg EQ '' then
|
||||||
|
LogResult = 'Successfully adjusted WO_LOG ':WONo:' released and unreleased quantities by ':AdjustQty
|
||||||
|
LogResult := '. Updated WO_LOG record ':WONo:' field REL_QTY_STATIC with released quantity ':RelQty
|
||||||
|
LogResult := ' and field UNREL_QTY_STATIC with unreleased quantity ':UnRelQty:'.'
|
||||||
|
LogData<3> = LogResult
|
||||||
|
Logging_Services('AppendLog', objAdjRelLog, LogData, @RM, @FM)
|
||||||
|
end else
|
||||||
|
LogResult = 'Failed to adjust WO_LOG ':WONo:' released and unreleased quantities by ':AdjustQty:'.'
|
||||||
|
LogData<3> = LogResult
|
||||||
|
Logging_Services('AppendLog', objAdjRelLog, LogData, @RM, @FM)
|
||||||
|
Error_Services('Add', ErrorMsg)
|
||||||
|
end
|
||||||
|
|
||||||
|
end service
|
||||||
|
|
||||||
|
|
||||||
Service UpdateReceivedQty(WONo)
|
Service UpdateReceivedQty(WONo)
|
||||||
|
|
||||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
|
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
|
||||||
@ -1156,7 +1237,9 @@ Service UpdateReceivedQty(WONo)
|
|||||||
If RowExists('WO_LOG', WONo) then
|
If RowExists('WO_LOG', WONo) then
|
||||||
WORec = Database_Services('ReadDataRow', 'WO_LOG', WONo)
|
WORec = Database_Services('ReadDataRow', 'WO_LOG', WONo)
|
||||||
If Error_Services('NoError') then
|
If Error_Services('NoError') then
|
||||||
|
WOQty = WORec<WO_LOG_WO_QTY$>
|
||||||
RXQty = obj_WO_Log('RxQty', WONo:@RM:WORec)
|
RXQty = obj_WO_Log('RxQty', WONo:@RM:WORec)
|
||||||
|
OpenQty = WOQty - RXQty
|
||||||
Open 'WO_LOG' to hTable then
|
Open 'WO_LOG' to hTable then
|
||||||
ReadV OrigRXQty from hTable, WONo, WO_LOG_RX_QTY_STATIC$ then
|
ReadV OrigRXQty from hTable, WONo, WO_LOG_RX_QTY_STATIC$ then
|
||||||
If OrigRXQty NE RXQty then
|
If OrigRXQty NE RXQty then
|
||||||
@ -1169,6 +1252,19 @@ Service UpdateReceivedQty(WONo)
|
|||||||
end else
|
end else
|
||||||
ErrorMsg = 'Error in ':Service:' service. Error reading RX_QTY_STATIC column from WO_LOG ':WONo:'.'
|
ErrorMsg = 'Error in ':Service:' service. Error reading RX_QTY_STATIC column from WO_LOG ':WONo:'.'
|
||||||
end
|
end
|
||||||
|
If ErrorMsg EQ '' then
|
||||||
|
ReadV OrigOpenQty from hTable, WONo, WO_LOG_OPEN_QTY_STATIC$ then
|
||||||
|
If OrigOpenQty NE OpenQty then
|
||||||
|
WriteV OpenQty on hTable, WONo, WO_LOG_OPEN_QTY_STATIC$ else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Failed to write received quantity ':RXQty
|
||||||
|
ErrorMsg := ' to the OPEN_QTY_STATIC field of WO_LOG record ':WONo:'.'
|
||||||
|
ErrorMsg := '@FILE_ERROR: ':@FILE_ERROR
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Error reading OPEN_QTY_STATIC column from WO_LOG ':WONo:'.'
|
||||||
|
end
|
||||||
|
end
|
||||||
end else
|
end else
|
||||||
ErrorMsg = 'Error in ':Service:' service. Failed to open the WO_LOG table.'
|
ErrorMsg = 'Error in ':Service:' service. Failed to open the WO_LOG table.'
|
||||||
end
|
end
|
||||||
@ -1200,6 +1296,84 @@ Service UpdateReceivedQty(WONo)
|
|||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
|
Service AdjustReceivedQty(WONo, AdjustQty)
|
||||||
|
|
||||||
|
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
|
||||||
|
LogDate = Oconv(Date(), 'D4/')
|
||||||
|
LogTime = Oconv(Time(), 'MTS')
|
||||||
|
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Adjust Received Qty Log.csv'
|
||||||
|
Headers = 'Logging DTM' : @FM : 'WONo' : @FM : 'Notes'
|
||||||
|
objAdjRecLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$,',', Headers, '', False$, False$)
|
||||||
|
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
||||||
|
RXQty = ''
|
||||||
|
OrigRXQty = ''
|
||||||
|
ErrorMsg = ''
|
||||||
|
Begin Case
|
||||||
|
Case (WONo EQ '')
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Null WONo passed into service'
|
||||||
|
Case (AdjustQty EQ '')
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Null AdjustQty passed into service'
|
||||||
|
Case Not(Num(AdjustQty))
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. AdjustQty is not a number'
|
||||||
|
Case Index(AdjustQty, '.', 1)
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. AdjustQty cannot be a decimal value'
|
||||||
|
Case Otherwise$
|
||||||
|
Null
|
||||||
|
End Case
|
||||||
|
If (ErrorMsg EQ '' ) then
|
||||||
|
If RowExists('WO_LOG', WONo) then
|
||||||
|
For Attempt = 1 to NUM_ATTEMPTS$
|
||||||
|
If Attempt GT 0 then Delay(Attempt)
|
||||||
|
HaveLock = Database_Services('GetKeyIDLock', 'WO_LOG', WONo, True$)
|
||||||
|
If HaveLock then
|
||||||
|
WORec = Database_Services('ReadDataRow', 'WO_LOG', WONo)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
WOQty = WORec<WO_LOG_WO_QTY$>
|
||||||
|
OrigRxQty = WORec<WO_LOG_RX_QTY_STATIC$>
|
||||||
|
RxQty = OrigRxQty + AdjustQty
|
||||||
|
OpenQty = WOQty - RXQty
|
||||||
|
WORec<WO_LOG_RX_QTY_STATIC$> = RxQty
|
||||||
|
WORec<WO_LOG_OPEN_QTY_STATIC$> = OpenQty
|
||||||
|
Database_Services('WriteDataRow', 'WO_LOG', WONo, WORec, True$, False$, False$)
|
||||||
|
If Error_Services('HasError') then
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Failed to write ':RxQty:' on RX_QTY_STATIC field '
|
||||||
|
ErrorMsg := 'and ':OpenQty:' on OPEN_QTY_STATIC to WO_LOG ':WONo:'. Error message: '
|
||||||
|
ErrorMsg := Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Failed to read record ':WONo:' from the WO_LOG table. '
|
||||||
|
ErrorMsg := 'Error message: ':Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
If ( Not(HaveLock) and (Attempt GE NUM_ATTEMPTS$) ) then
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Failed to lock WO_LOG ':WoNo:' for update after ':Attempt:' attempts.'
|
||||||
|
end
|
||||||
|
Until HaveLock or (ErrorMsg NE '')
|
||||||
|
Next Attempt
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. ':WONo:' does not exist in the WO_LOG table.'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
LogData = ''
|
||||||
|
LogData<1> = LoggingDtm
|
||||||
|
LogData<2> = WONo
|
||||||
|
If ErrorMsg EQ '' then
|
||||||
|
LogResult = 'Successfully adjusted WO_LOG ':WONo:' received and open quantities by ':AdjustQty
|
||||||
|
LogResult := '. Updated WO_LOG record ':WONo:' field RX_QTY_STATIC with received quantity ':RXQty
|
||||||
|
LogResult := ' and field OPEN_QTY_STATIC with open quantity ':OpenQty:'.'
|
||||||
|
LogData<3> = LogResult
|
||||||
|
Logging_Services('AppendLog', objAdjRecLog, LogData, @RM, @FM)
|
||||||
|
end else
|
||||||
|
LogResult = 'Failed to adjust WO_LOG ':WONo:' received and open quantities by ':AdjustQty
|
||||||
|
LogData<3> = LogResult
|
||||||
|
Logging_Services('AppendLog', objAdjRecLog, LogData, @RM, @FM)
|
||||||
|
Error_Services('Add', ErrorMsg)
|
||||||
|
end
|
||||||
|
|
||||||
|
end service
|
||||||
|
|
||||||
|
|
||||||
Service UpdateShippedQty(WONo)
|
Service UpdateShippedQty(WONo)
|
||||||
|
|
||||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
|
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
|
||||||
@ -1331,44 +1505,76 @@ end service
|
|||||||
|
|
||||||
Service ConvertRecordToJSON(WONo, Record, ItemURL)
|
Service ConvertRecordToJSON(WONo, Record, ItemURL)
|
||||||
|
|
||||||
|
ErrorMsg = ''
|
||||||
jsonRecord = ''
|
jsonRecord = ''
|
||||||
IF WONo NE '' then
|
IF WONo NE '' then
|
||||||
If Record EQ '' then Record = Database_Services('ReadDataRow', 'WO_LOG', WONo)
|
If Record EQ '' then Record = Database_Services('ReadDataRow', 'WO_LOG', WONo)
|
||||||
If Error_Services('NoError') then
|
If Error_Services('NoError') then
|
||||||
@DICT = Database_Services('GetTableHandle', 'DICT.WO_LOG')
|
EpiPartNo = Record<WO_LOG_EPI_PART_NO$>
|
||||||
@ID = WONo
|
EpiPartRec = Database_Services('ReadDataRow', 'EPI_PART', EpiPartNo)
|
||||||
@RECORD = Record
|
If Error_Services('NoError') then
|
||||||
|
SubSuppBy = EpiPartRec<EPI_PART_SUB_SUPP_BY$> ;* L - EpiSvcs supplied, C - Customer Supplied
|
||||||
|
ProdVerNo = Record<WO_LOG_PROD_VER_NO$>
|
||||||
|
ProdVerRec = Database_Services('ReadDataRow', 'PROD_VER', ProdVerNo)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
SubPartNo = ProdVerRec<PROD_VER_SUB_PART_NO$>
|
||||||
|
// Create the JSON response object
|
||||||
objJSON = ''
|
objJSON = ''
|
||||||
If SRP_JSON(objJSON, 'New', 'Object') then
|
If SRP_JSON(objJSON, 'New', 'Object') then
|
||||||
objWOLog = ''
|
objWOLog = ''
|
||||||
If SRP_JSON(objWOLog, 'New', 'Object') then
|
If SRP_JSON(objWOLog, 'New', 'Object') then
|
||||||
SRP_JSON(objWOLog, 'SetValue', 'KeyId', @ID)
|
SRP_JSON(objWOLog, 'SetValue', 'KeyId', WONo)
|
||||||
SRP_JSON(objWOLog, 'SetValue', 'ProdOrdNo', {PROD_ORD_NO})
|
SRP_JSON(objWOLog, 'SetValue', 'ProdOrdNo', Record<WO_LOG_PROD_ORD_NO$>)
|
||||||
SRP_JSON(objWOLog, 'SetValue', 'PSN', {PROD_SPEC_ID})
|
SRP_JSON(objWOLog, 'SetValue', 'PSN', Xlate('WO_LOG', WONo, 'PS_NO', 'X'))
|
||||||
SRP_JSON(objWOLog, 'SetValue', 'EpiPartNo', {EPI_PART_NO})
|
SRP_JSON(objWOLog, 'SetValue', 'EpiPartNo', EpiPartNo)
|
||||||
SRP_JSON(objWOLog, 'SetValue', 'HOT_FLAG', {HOT_FLAG})
|
SRP_JSON(objWOLog, 'SetValue', 'HotFlag', Record<WO_LOG_HOT_FLAG$>)
|
||||||
//Create a list of cassettes
|
SRP_JSON(objWOLog, 'SetValue', 'WoQty', Record<WO_LOG_WO_QTY$>)
|
||||||
CassIDs = {WO_MAT_KEY}
|
SRP_JSON(objWOLog, 'SetValue', 'RxQty', Record<WO_LOG_RX_QTY_STATIC$>)
|
||||||
|
SRP_JSON(objWOLog, 'SetValue', 'RelQty', Record<WO_LOG_REL_QTY_STATIC$>)
|
||||||
|
SRP_JSON(objWOLog, 'SetValue', 'UnRelQty', Record<WO_LOG_UNREL_QTY_STATIC$>)
|
||||||
|
SRP_JSON(objWOLog, 'SetValue', 'ShipQty', Record<WO_LOG_SHIP_QTY_STATIC$>)
|
||||||
|
SRP_JSON(objWOLog, 'SetValue', 'ScrapQty', Record<WO_LOG_SCRAP_QTY_STATIC$>)
|
||||||
|
SRP_JSON(objWOLog, 'SetValue', 'OpenQty', Record<WO_LOG_OPEN_QTY_STATIC$>)
|
||||||
|
SRP_JSON(objWOLog, 'SetValue', 'CustNo', Record<WO_LOG_CUST_NO$>)
|
||||||
|
SRP_JSON(objWOLog, 'SetValue', 'Customer', Xlate('WO_LOG', WONo, 'CUST_NAME', 'X'))
|
||||||
|
|
||||||
|
ExpectedVendorCd = Record<WO_LOG_EXP_VEND_CD$>
|
||||||
|
If ( (Len(ExpectedVendorCd) NE 2) or (SubSuppBy NE 'L') ) then ExpectedVendorCd = ''
|
||||||
|
SRP_JSON(objWOLog, 'SetValue', 'ExpectedVendorCd', ExpectedVendorCd)
|
||||||
|
SRP_JSON(objWOLog, 'SetValue', 'SubPartNo', SubPartNo)
|
||||||
|
|
||||||
|
// Create a list of cassettes
|
||||||
|
CassIDs = Record<WO_LOG_WO_MAT_KEY$>
|
||||||
objChildCassettes = ''
|
objChildCassettes = ''
|
||||||
If SRP_JSON(objChildCassettes, 'New', 'Array') then
|
If SRP_JSON(objChildCassettes, 'New', 'Array') then
|
||||||
If CassIDs NE '' then
|
If CassIDs NE '' then
|
||||||
for each Cass in CassIDs using @VM setting vPos
|
for each Cass in CassIDs using @VM setting vPos
|
||||||
SAPBatchNo = XLATE('WO_MAT', Cass, WO_MAT_SAP_BATCH_NO$, 'X')
|
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', Cass)
|
||||||
SAPTXDtm = XLATE('WO_MAT', Cass, WO_MAT_SAP_TX_DTM$, 'X')
|
If Error_Services('NoError') then
|
||||||
RDSNo = XLATE('WO_MAT', Cass, WO_MAT_RDS_NO$, 'X')
|
// Add in each indv. cassette object
|
||||||
ShipNo = XLATE('WO_MAT', Cass, WO_MAT_SHIP_NO$, 'X')
|
|
||||||
//Add in each indv. cassette object
|
|
||||||
objChildCassette = ''
|
objChildCassette = ''
|
||||||
If SRP_JSON(objChildCassette, 'New', 'Object') then
|
If SRP_JSON(objChildCassette, 'New', 'Object') then
|
||||||
SRP_JSON(objChildCassette, 'SetValue', 'KeyId', Cass)
|
SRP_JSON(objChildCassette, 'SetValue', 'KeyId', Cass)
|
||||||
SRP_JSON(objChildCassette, 'SetValue', 'SAPBatchNo', SAPBatchNo)
|
SRP_JSON(objChildCassette, 'SetValue', 'CassNo', Field(Cass, '*', 2, 1))
|
||||||
SRP_JSON(objChildCassette, 'SetValue', 'SAPTXDtm', OCONV(SAPTXDtm, 'DT'))
|
SRP_JSON(objChildCassette, 'SetValue', 'SAPBatchNo', WOMatRec<WO_MAT_SAP_BATCH_NO$>)
|
||||||
SRP_JSON(objChildCassette, 'SetValue', 'RDSNo', RDSNo)
|
SRP_JSON(objChildCassette, 'SetValue', 'SAPTXDtm', Date_Services('ConvertDateTimeToISO8601', WOMatRec<WO_MAT_SAP_TX_DTM$>))
|
||||||
SRP_JSON(objChildCassette, 'SetValue', 'ShipNo', ShipNo)
|
SRP_JSON(objChildCassette, 'SetValue', 'RDSNo', WOMatRec<WO_MAT_RDS_NO$>)
|
||||||
|
SRP_JSON(objChildCassette, 'SetValue', 'ShipNo', WOMatRec<WO_MAT_SHIP_NO$>)
|
||||||
|
SRP_JSON(objChildCassette, 'SetValue', 'LotNo', WOMatRec<WO_MAT_LOT_NO$>)
|
||||||
|
SRP_JSON(objChildCassette, 'SetValue', 'Qty', WOMatRec<WO_MAT_WAFER_QTY$>)
|
||||||
|
SRP_JSON(objChildCassette, 'SetValue', 'CustPartNo', WOMatRec<WO_MAT_CUST_PART_NO$>)
|
||||||
|
SRP_JSON(objChildCassette, 'SetValue', 'SubPartNo', WOMatRec<WO_MAT_SUB_PART_NO$>)
|
||||||
|
SRP_JSON(objChildCassette, 'SetValue', 'VendorCd', WOMatRec<WO_MAT_SUB_VEND_CD$>)
|
||||||
|
SRP_JSON(objChildCassette, 'SetValue', 'RecDtm', Date_Services('ConvertDateTimeToISO8601', WOMatRec<WO_MAT_RX_DTM$>))
|
||||||
|
SRP_JSON(objChildCassette, 'SetValue', 'RelDtm', Date_Services('ConvertDateTimeToISO8601', WOMatRec<WO_MAT_REL_DTM$>))
|
||||||
|
SRP_JSON(objChildCassette, 'SetValue', 'RecUser', OConv(WOMatRec<WO_MAT_RX_BY$>, '[XLATE_CONV,LSL_USERS*FIRST_LAST]'))
|
||||||
|
SRP_JSON(objChildCassette, 'SetValue', 'RelUser', OConv(WOMatRec<WO_MAT_REL_BY$>, '[XLATE_CONV,LSL_USERS*FIRST_LAST]' ))
|
||||||
SRP_JSON(objChildCassettes, 'Add', objChildCassette)
|
SRP_JSON(objChildCassettes, 'Add', objChildCassette)
|
||||||
SRP_JSON(objChildCassette, 'Release')
|
SRP_JSON(objChildCassette, 'Release')
|
||||||
end
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||||
|
end
|
||||||
Next Cass
|
Next Cass
|
||||||
end else
|
end else
|
||||||
SRP_JSON(objWOLog, 'SetValue', 'ChildCassettes', '')
|
SRP_JSON(objWOLog, 'SetValue', 'ChildCassettes', '')
|
||||||
@ -1395,19 +1601,28 @@ Service ConvertRecordToJSON(WONo, Record, ItemURL)
|
|||||||
SRP_JSON(objJSON, 'Set', '_links', objLinks)
|
SRP_JSON(objJSON, 'Set', '_links', objLinks)
|
||||||
SRP_JSON(objLinks, 'Release')
|
SRP_JSON(objLinks, 'Release')
|
||||||
end
|
end
|
||||||
|
|
||||||
// Create the _class property for this resource.
|
// Create the _class property for this resource.
|
||||||
SRP_JSON(objJSON, 'SetValue', '_class', 'resource')
|
SRP_JSON(objJSON, 'SetValue', '_class', 'resource')
|
||||||
end
|
end
|
||||||
jsonRecord = SRP_JSON(objJSON, 'Stringify', 'Styled')
|
jsonRecord = SRP_JSON(objJSON, 'Stringify', 'Styled')
|
||||||
SRP_JSON(objJSON, 'Release')
|
SRP_JSON(objJSON, 'Release')
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', 'Unable to create JSON representation in the ' : Service : ' service.')
|
ErrorMsg = 'Error in ':Service:' service. Unable to create JSON object'
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', 'KeyID argument was missing in the ' : Service : ' service.')
|
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||||
end
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Null WONo passed into service.'
|
||||||
|
end
|
||||||
|
|
||||||
|
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||||
Response = jsonRecord
|
Response = jsonRecord
|
||||||
|
|
||||||
end service
|
end service
|
||||||
@ -2129,6 +2344,38 @@ Service UpdateOpenWorkOrderData()
|
|||||||
Logging_Services('AppendLog', objVerifyWOMatKeysLog, LogData, @RM, @FM)
|
Logging_Services('AppendLog', objVerifyWOMatKeysLog, LogData, @RM, @FM)
|
||||||
MonaStatus = 'critical'
|
MonaStatus = 'critical'
|
||||||
end
|
end
|
||||||
|
Work_Order_Services('UpdateReceivedQty', NextOpenWoLogKey)
|
||||||
|
If Error_Services('HasError') then
|
||||||
|
LogData<1> = OConv(Datetime(), 'DT/^S')
|
||||||
|
ErrorMsg = 'Error calling UpdateReceivedQty for WO_LOG ':NextOpenWoLogKey:'. ':Error_Services('GetMessage')
|
||||||
|
LogData<4> = ErrorMsg
|
||||||
|
Logging_Services('AppendLog', objVerifyWOMatKeysLog, LogData, @RM, @FM)
|
||||||
|
MonaStatus = 'critical'
|
||||||
|
end
|
||||||
|
Work_Order_Services('UpdateReleasedQty', NextOpenWoLogKey)
|
||||||
|
If Error_Services('HasError') then
|
||||||
|
LogData<1> = OConv(Datetime(), 'DT/^S')
|
||||||
|
ErrorMsg = 'Error calling UpdateReleasedQty for WO_LOG ':NextOpenWoLogKey:'. ':Error_Services('GetMessage')
|
||||||
|
LogData<4> = ErrorMsg
|
||||||
|
Logging_Services('AppendLog', objVerifyWOMatKeysLog, LogData, @RM, @FM)
|
||||||
|
MonaStatus = 'critical'
|
||||||
|
end
|
||||||
|
Work_Order_Services('UpdateScrappedQty', NextOpenWoLogKey)
|
||||||
|
If Error_Services('HasError') then
|
||||||
|
LogData<1> = OConv(Datetime(), 'DT/^S')
|
||||||
|
ErrorMsg = 'Error calling UpdateScrappedQty for WO_LOG ':NextOpenWoLogKey:'. ':Error_Services('GetMessage')
|
||||||
|
LogData<4> = ErrorMsg
|
||||||
|
Logging_Services('AppendLog', objVerifyWOMatKeysLog, LogData, @RM, @FM)
|
||||||
|
MonaStatus = 'critical'
|
||||||
|
end
|
||||||
|
Work_Order_Services('UpdateShippedQty', NextOpenWoLogKey)
|
||||||
|
If Error_Services('HasError') then
|
||||||
|
LogData<1> = OConv(Datetime(), 'DT/^S')
|
||||||
|
ErrorMsg = 'Error calling UpdateShippedQty for WO_LOG ':NextOpenWoLogKey:'. ':Error_Services('GetMessage')
|
||||||
|
LogData<4> = ErrorMsg
|
||||||
|
Logging_Services('AppendLog', objVerifyWOMatKeysLog, LogData, @RM, @FM)
|
||||||
|
MonaStatus = 'critical'
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
LogData<1> = OConv(Datetime(), 'DT/^S')
|
LogData<1> = OConv(Datetime(), 'DT/^S')
|
||||||
@ -2313,6 +2560,107 @@ Service UpdateWorkOrderData(WONo)
|
|||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
|
Service GetWoLogZpl(WoNo)
|
||||||
|
|
||||||
|
ZPL = ''
|
||||||
|
ErrorMsg = ''
|
||||||
|
If WoNo NE '' then
|
||||||
|
If RowExists('WO_LOG', WoNo) then
|
||||||
|
WOStepKeys = XLATE('WO_LOG',WONo,WO_LOG_WO_STEP_KEY$,'X')
|
||||||
|
IF INDEX(WOStepKeys,@VM,1) THEN
|
||||||
|
PrintWONo = WONo:'.':WOStep
|
||||||
|
END ELSE
|
||||||
|
PrintWONo = WONo
|
||||||
|
END
|
||||||
|
WORec = XLATE('WO_LOG',WONo,'','X')
|
||||||
|
ReqShipDate = OCONV(WORec<WO_LOG_PROMISE_SHIP_DT$>,'D2/')
|
||||||
|
CustNo = WORec<WO_LOG_CUST_NO$>
|
||||||
|
CustName = XLATE('COMPANY',CustNo,'ABBREV_OR_CO_NAME','X')
|
||||||
|
ZPL := '^XA^CFD'
|
||||||
|
ZPL := '^LH0,0'
|
||||||
|
ZPL := '^PR2' ;* Print speed 2 inches per second
|
||||||
|
ZPL := '^LL325' ;* Label length in dots
|
||||||
|
ZPL := '^MD15' ;* Media darkness
|
||||||
|
ZPL := '^PQ2' ;* Print 2 labels for each pass through here
|
||||||
|
ZPL := '^MMT':CRLF$ ;* Media mode t=tear off mode
|
||||||
|
IF INDEX(PrintWONo,'.',1) THEN
|
||||||
|
ZPL := '^FO10,30^A0,220,210^FD':PrintWONo:'^FS':CRLF$
|
||||||
|
END ELSE
|
||||||
|
ZPL := '^FO70,30^A0,220,210^FD':PrintWONo:'^FS':CRLF$
|
||||||
|
END
|
||||||
|
CharCnt = Len(CustName)
|
||||||
|
NameLength = CharCnt*72
|
||||||
|
WhiteSpace = INT(((2103 - NameLength)/2103) * 806)
|
||||||
|
StartingXPos = INT(WhiteSpace/2)
|
||||||
|
ZPL:= '^FO':StartingXPos:',230^A0,75,72^FD':CustName:'^FS':CRLF$
|
||||||
|
ZPL:= '^FO160,320^A080,50^FD':'Commit Date: ':OCONV( XLATE( 'WO_LOG', WONo, WO_LOG_COMMIT_DATE$, 'X' ), 'D2/' ):'^FS':CRLF$
|
||||||
|
ZPL:= '^XZ'
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. WO_LOG ':WoNo:' does not exist.'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Null WoNo passed in.'
|
||||||
|
end
|
||||||
|
|
||||||
|
If ErrorMsg EQ '' then
|
||||||
|
Response = ZPL
|
||||||
|
end else
|
||||||
|
Error_Services('Add', ErrorMsg)
|
||||||
|
end
|
||||||
|
|
||||||
|
end service
|
||||||
|
|
||||||
|
|
||||||
|
Service GetVoidedWaferCount(WorkOrderNo)
|
||||||
|
|
||||||
|
ErrorMsg = ''
|
||||||
|
VoidedWaferCount = 0
|
||||||
|
If WorkOrderNo NE '' then
|
||||||
|
If RowExists('WO_LOG', WorkOrderNo) then
|
||||||
|
ReactorType = Xlate('WO_LOG', WorkOrderNo, 'PS_REACTOR_TYPE', 'X')
|
||||||
|
If ReactorType EQ 'EPP' then
|
||||||
|
Query = 'SELECT WM_IN WITH WO_NO EQ ':WorkOrderNo:' AND WITH VOID EQ ':True$
|
||||||
|
Rlist(Query, TARGET_ACTIVELIST$, '', '', '')
|
||||||
|
ErrCode = ''
|
||||||
|
If Not(Get_Status(ErrCode)) then
|
||||||
|
EOF = False$
|
||||||
|
Loop
|
||||||
|
Readnext WmInKey else EOF = True$
|
||||||
|
Until EOF
|
||||||
|
VoidedWaferCount += Xlate('WM_IN', WmInKey, 'WFR_CNT', 'X')
|
||||||
|
Repeat
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service: 'service. Error calling RList. Error code: ':ErrCode
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Query = 'SELECT WO_MAT WITH WO_NO EQ ':WorkOrderNo:' AND WITH VOID EQ ':True$
|
||||||
|
Rlist(Query, TARGET_ACTIVELIST$, '', '', '')
|
||||||
|
ErrCode = ''
|
||||||
|
If Not(Get_Status(ErrCode)) then
|
||||||
|
EOF = False$
|
||||||
|
Loop
|
||||||
|
Readnext WoMatKey else EOF = True$
|
||||||
|
Until EOF
|
||||||
|
VoidedWaferCount += Xlate('WO_MAT', WoMatKey, 'WAFER_QTY', 'X')
|
||||||
|
Repeat
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service: 'service. Error calling RList. Error code: ':ErrCode
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service: 'service. WO_LOG ':WorkOrderNo:' does not exist.'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service: 'service. Null WorkOrderNo passed into service.'
|
||||||
|
end
|
||||||
|
|
||||||
|
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||||
|
Response = VoidedWaferCount
|
||||||
|
|
||||||
|
end service
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Internal GoSubs
|
// Internal GoSubs
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|||||||
@ -35,16 +35,15 @@ Function Wo_API(@API)
|
|||||||
10/20/23 xxx Original programmer.
|
10/20/23 xxx Original programmer.
|
||||||
|
|
||||||
***********************************************************************************************************************/
|
***********************************************************************************************************************/
|
||||||
|
|
||||||
#pragma precomp SRP_PreCompiler
|
#pragma precomp SRP_PreCompiler
|
||||||
|
|
||||||
Declare function Environment_Services, SRP_Datetime, Logging_Services, Work_Order_Services
|
|
||||||
Declare Subroutine Btree.Extract, Logging_Services, Http_Services
|
|
||||||
|
|
||||||
$insert APP_INSERTS
|
$insert APP_INSERTS
|
||||||
$insert API_SETUP
|
$insert API_SETUP
|
||||||
$insert HTTP_INSERTS
|
$insert HTTP_INSERTS
|
||||||
|
|
||||||
|
Declare function Environment_Services, SRP_Datetime, Logging_Services, Work_Order_Services
|
||||||
|
Declare Subroutine Btree.Extract, Logging_Services, Http_Services
|
||||||
|
|
||||||
LogDate = Oconv(Date(), 'D4/')
|
LogDate = Oconv(Date(), 'D4/')
|
||||||
LogTime = Oconv(Time(), 'MTS')
|
LogTime = Oconv(Time(), 'MTS')
|
||||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\API\Materials\WO'
|
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\API\Materials\WO'
|
||||||
@ -55,6 +54,8 @@ LoggingDTM = LogDate : ' ' : LogTime
|
|||||||
ResponseCode = ''
|
ResponseCode = ''
|
||||||
ResponseMessage = ''
|
ResponseMessage = ''
|
||||||
LogData = ''
|
LogData = ''
|
||||||
|
Response = ''
|
||||||
|
|
||||||
GoToAPI else
|
GoToAPI else
|
||||||
// The specific resource endpoint doesn't have a API handler yet.
|
// The specific resource endpoint doesn't have a API handler yet.
|
||||||
ResponseCode = 204
|
ResponseCode = 204
|
||||||
@ -76,14 +77,6 @@ Return Response OR ''
|
|||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
API wo.HEAD
|
|
||||||
API wo.GET
|
|
||||||
|
|
||||||
HTTP_Resource_Services('LoremIpsum')
|
|
||||||
|
|
||||||
end api
|
|
||||||
|
|
||||||
|
|
||||||
API wo.ID.HEAD
|
API wo.ID.HEAD
|
||||||
API wo.ID.GET
|
API wo.ID.GET
|
||||||
|
|
||||||
@ -91,7 +84,20 @@ API wo.ID.GET
|
|||||||
|
|
||||||
end api
|
end api
|
||||||
|
|
||||||
|
|
||||||
|
API wo.ID.zpl.HEAD
|
||||||
|
API wo.ID.zpl.GET
|
||||||
|
|
||||||
|
GoSub CreateZPLItem
|
||||||
|
|
||||||
|
end api
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Internal GoSubs
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
CreateHALItem:
|
CreateHALItem:
|
||||||
|
|
||||||
ResponseCode = 200
|
ResponseCode = 200
|
||||||
MaterialKey = EndpointSegment
|
MaterialKey = EndpointSegment
|
||||||
WOLogKey = ''
|
WOLogKey = ''
|
||||||
@ -148,4 +154,32 @@ CreateHALItem:
|
|||||||
Message = Error_Services('GetMessage')
|
Message = Error_Services('GetMessage')
|
||||||
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
|
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
// CreateZPLItem
|
||||||
|
//
|
||||||
|
// Creates a HAL+JSON object with the ZPL for the given WM_IN row
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
CreateZPLItem:
|
||||||
|
|
||||||
|
WoLogKey = ParentSegment
|
||||||
|
ZPL = Work_Order_Services('GetWoLogZpl', WoLogKey)
|
||||||
|
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
StatusCode = 200
|
||||||
|
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||||
|
HTTP_Services('SetResponseBody', ZPL, False$, 'text/plain')
|
||||||
|
If Assigned(Message) then
|
||||||
|
HTTP_Services('SetResponseStatus', StatusCode, Message)
|
||||||
|
end else
|
||||||
|
HTTP_Services('SetResponseStatus', StatusCode)
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Message = Error_Services('GetMessage')
|
||||||
|
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
|
||||||
|
end
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|||||||
@ -616,12 +616,24 @@ WRITE_RECORD:
|
|||||||
NewRelDtm = Record<WO_MAT_REL_DTM$>
|
NewRelDtm = Record<WO_MAT_REL_DTM$>
|
||||||
OrigRecDtm = OrigRecord<WO_MAT_RX_DTM$>
|
OrigRecDtm = OrigRecord<WO_MAT_RX_DTM$>
|
||||||
NewRecDtm = Record<WO_MAT_RX_DTM$>
|
NewRecDtm = Record<WO_MAT_RX_DTM$>
|
||||||
|
AdjustQty = NewWfrQty - OrigWfrQty
|
||||||
|
|
||||||
If ( ( (OrigWfrQty NE '' ) and (OrigWfrQty NE NewWfrQty) ) or ( (OrigRecDtm EQ '') and (NewRecDtm NE '') ) ) then
|
If ( (OrigWfrQty NE '' ) and (OrigWfrQty NE NewWfrQty) and (OrigRecDtm NE '' and NewRecDtm NE '') ) then
|
||||||
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'UpdateReceivedQty':SD$:WONo)
|
// Cassette already received, but casssette quantity has changed.
|
||||||
|
If AdjustQty NE 0 then Work_Order_Services('AdjustReceivedQty', WONo, AdjustQty)
|
||||||
end
|
end
|
||||||
If ( ( (OrigWfrQty NE '') and (OrigWfrQty NE NewWfrQty) ) or ( (OrigRelDtm EQ '') and (NewRelDtm NE '') ) ) then
|
If ( (OrigRecDtm EQ '') and (NewRecDtm NE '') ) then
|
||||||
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'UpdateReleasedQty':SD$:WONo)
|
// Cassette was just received. Increment received quantity of work order by the entire cassette wafer count.
|
||||||
|
Work_Order_Services('AdjustReceivedQty', WONo, NewWfrQty)
|
||||||
|
end
|
||||||
|
|
||||||
|
If ( (OrigWfrQty NE '') and (OrigWfrQty NE NewWfrQty) and ( (OrigRelDtm NE '') and (NewRelDtm NE '') ) ) then
|
||||||
|
// Cassette already released, but casssette quantity has changed.
|
||||||
|
If AdjustQty NE 0 then Work_Order_Services('AdjustReleasedQty', WONo, AdjustQty)
|
||||||
|
end
|
||||||
|
If ( (OrigRelDtm EQ '') and (NewRelDtm NE '') ) then
|
||||||
|
// Cassette was just released. Increment released quantity of work order by the entire cassette wafer count.
|
||||||
|
Work_Order_Services('AdjustReleasedQty', WONo, NewWfrQty)
|
||||||
end
|
end
|
||||||
|
|
||||||
If {REACTOR_TYPE} NE 'EPP' then
|
If {REACTOR_TYPE} NE 'EPP' then
|
||||||
|
|||||||
@ -44,6 +44,7 @@ Declare Subroutine Logging_Services
|
|||||||
$insert APP_INSERTS
|
$insert APP_INSERTS
|
||||||
$insert API_SETUP
|
$insert API_SETUP
|
||||||
$insert HTTP_INSERTS
|
$insert HTTP_INSERTS
|
||||||
|
|
||||||
LogDate = Oconv(Date(), 'D4/')
|
LogDate = Oconv(Date(), 'D4/')
|
||||||
LogTime = Oconv(Time(), 'MTS')
|
LogTime = Oconv(Time(), 'MTS')
|
||||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\API\Materials\WO_MAT'
|
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\API\Materials\WO_MAT'
|
||||||
@ -54,6 +55,8 @@ LoggingDTM = LogDate : ' ' : LogTime
|
|||||||
ResponseCode = ''
|
ResponseCode = ''
|
||||||
ResponseMessage = ''
|
ResponseMessage = ''
|
||||||
LogData = ''
|
LogData = ''
|
||||||
|
Response = ''
|
||||||
|
|
||||||
GoToAPI else
|
GoToAPI else
|
||||||
// The specific resource endpoint doesn't have a API handler yet.
|
// The specific resource endpoint doesn't have a API handler yet.
|
||||||
HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.')
|
HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.')
|
||||||
@ -67,14 +70,6 @@ Return Response OR ''
|
|||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
API wo_mat.HEAD
|
|
||||||
API wo_mat.GET
|
|
||||||
|
|
||||||
HTTP_Resource_Services('LoremIpsum')
|
|
||||||
|
|
||||||
end api
|
|
||||||
|
|
||||||
|
|
||||||
API wo_mat.ID.HEAD
|
API wo_mat.ID.HEAD
|
||||||
API wo_mat.ID.GET
|
API wo_mat.ID.GET
|
||||||
|
|
||||||
@ -82,6 +77,12 @@ API wo_mat.ID.GET
|
|||||||
|
|
||||||
end api
|
end api
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Internal GoSubs
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
CreateHalItem:
|
CreateHalItem:
|
||||||
|
|
||||||
ResponseCode = 200
|
ResponseCode = 200
|
||||||
@ -119,4 +120,6 @@ CreateHalItem:
|
|||||||
LogData<4> = ResponseCode
|
LogData<4> = ResponseCode
|
||||||
LogData<5> = ResponseMessage
|
LogData<5> = ResponseMessage
|
||||||
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM)
|
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
@ -182,6 +182,7 @@ WRITE_RECORD_PRE:
|
|||||||
Case Record EQ ''
|
Case Record EQ ''
|
||||||
|
|
||||||
// Unscheduled record write attempt. Block the write and log the event.
|
// Unscheduled record write attempt. Block the write and log the event.
|
||||||
|
// Empty WO_MAT_QA records can cause undesireable issues processing lots.
|
||||||
ErrorMessage = 'Empty WO_MAT_QA profile. Unscheduled record write attempt!'
|
ErrorMessage = 'Empty WO_MAT_QA profile. Unscheduled record write attempt!'
|
||||||
Error_Services('Add', 'FS104: ':ErrorMessage)
|
Error_Services('Add', 'FS104: ':ErrorMessage)
|
||||||
OrigFileError = 104 : @FM : ErrorMessage
|
OrigFileError = 104 : @FM : ErrorMessage
|
||||||
@ -200,21 +201,8 @@ WRITE_RECORD_PRE:
|
|||||||
LogData<4> = Stack
|
LogData<4> = Stack
|
||||||
LogData<5> = CRLF$:RecordSnapshot:CRLF$
|
LogData<5> = CRLF$:RecordSnapshot:CRLF$
|
||||||
LogData<6> = 'FS104: ':ErrorMessage
|
LogData<6> = 'FS104: ':ErrorMessage
|
||||||
|
|
||||||
// Sending a null message will send the LogData instead
|
|
||||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, '', '', '')
|
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, '', '', '')
|
||||||
|
|
||||||
// Send an internal OI message to OI admins
|
|
||||||
Recipients = Xlate('SEC_GROUPS', 'OI_ADMIN', 'USER', 'X')
|
|
||||||
SentFrom = 'SYSTEM'
|
|
||||||
Subject = 'Unscheduled WO_MAT_QA record write attempt.'
|
|
||||||
Message = ErrorMessage
|
|
||||||
AttachWindow = ''
|
|
||||||
AttachKey = ''
|
|
||||||
SendToGroup = ''
|
|
||||||
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
|
|
||||||
obj_Notes('Create',Parms)
|
|
||||||
|
|
||||||
Status = 0
|
Status = 0
|
||||||
Record = ''
|
Record = ''
|
||||||
ActionFlow = ACTION_STOP$
|
ActionFlow = ACTION_STOP$
|
||||||
|
|||||||
@ -57,6 +57,8 @@ $Insert PRS_LAYER_EQUATES
|
|||||||
$Insert PRS_STAGE_EQUATES
|
$Insert PRS_STAGE_EQUATES
|
||||||
$Insert PROD_VER_EQUATES
|
$Insert PROD_VER_EQUATES
|
||||||
$Insert QA_MET_EQUATES ;* Used in GetQAMet data structure return variable
|
$Insert QA_MET_EQUATES ;* Used in GetQAMet data structure return variable
|
||||||
|
$Insert RDS_EQUATES
|
||||||
|
$Insert WO_REACT_EQUATES
|
||||||
|
|
||||||
Declare function Database_Services, SRP_JSON, Error_Services, obj_Prod_Spec, Wo_Mat_Qa_Services
|
Declare function Database_Services, SRP_JSON, Error_Services, obj_Prod_Spec, Wo_Mat_Qa_Services
|
||||||
Declare subroutine Database_Services, SRP_JSON, Error_Services
|
Declare subroutine Database_Services, SRP_JSON, Error_Services
|
||||||
@ -196,20 +198,26 @@ Service UpdateQAMet(WOMatKey)
|
|||||||
WOMatQARec = ''
|
WOMatQARec = ''
|
||||||
ErrorMsg = ''
|
ErrorMsg = ''
|
||||||
If (WOMatKey NE '') then
|
If (WOMatKey NE '') then
|
||||||
|
|
||||||
WONo = Field(WOMatKey, '*', 1)
|
WONo = Field(WOMatKey, '*', 1)
|
||||||
CassNo = Field(WOMatKey, '*', 2)
|
CassNo = Field(WOMatKey, '*', 2)
|
||||||
|
RDSNo = Database_Services('ReadDataColumn', 'WO_MAT', WOMatKey, WO_MAT_RDS_NO$)
|
||||||
* * * * * * * * Build QA_MET profile - Work Order scheduled only * * * * * * * *
|
If Error_Services('NoError') then
|
||||||
WOStepKeys = XLATE('WO_LOG', WONo, WO_LOG_WO_STEP_KEY$, 'X')
|
If (RDSNo NE '') then
|
||||||
|
// Check if it has been assigned to a reactor
|
||||||
|
ReactNo = Database_Services('ReadDataColumn', 'RDS', RDSNo, RDS_REACTOR$)
|
||||||
|
If Error_Services('HasError') then
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
// Either not signed into a reactor yet or this WO_MAT is EpiPro and therefore there is no
|
||||||
|
// 1-to-1 RDS record. Because of this, reactor scheduled QA met is not possible with EpiPro.
|
||||||
|
ReactNo = ''
|
||||||
|
end
|
||||||
|
If (ErrorMsg EQ '') then
|
||||||
|
WOStepKeys = Database_Services('ReadDataColumn', 'WO_LOG', WONo, WO_LOG_WO_STEP_KEY$)
|
||||||
|
If Error_Services('NoError') then
|
||||||
StepCnt = DCount(WOStepKeys,@VM)
|
StepCnt = DCount(WOStepKeys,@VM)
|
||||||
|
|
||||||
EpiProPSNo = ''
|
|
||||||
EpiProPSRec = ''
|
|
||||||
|
|
||||||
MetLine = 1
|
MetLine = 1
|
||||||
|
|
||||||
// Get original WO_MAT_QA record to copy any test results
|
// Get original WO_MAT_QA record to copy any test results
|
||||||
OrigWOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatKey)
|
OrigWOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatKey)
|
||||||
OrigQAStages = OrigWOMatQARec<WO_MAT_QA_STAGE$>
|
OrigQAStages = OrigWOMatQARec<WO_MAT_QA_STAGE$>
|
||||||
@ -229,51 +237,69 @@ Service UpdateQAMet(WOMatKey)
|
|||||||
OrigQAOutOfSpecs = OrigWOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
|
OrigQAOutOfSpecs = OrigWOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
|
||||||
OrigQAFailReasons = OrigWOMatQARec<WO_MAT_QA_FAIL_REASON$>
|
OrigQAFailReasons = OrigWOMatQARec<WO_MAT_QA_FAIL_REASON$>
|
||||||
|
|
||||||
* WO_MAT record is used to check for pre-existing signatures jch 6/7/2015
|
|
||||||
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
|
|
||||||
|
|
||||||
FOR WOStepNo = 1 TO StepCnt
|
FOR WOStepNo = 1 TO StepCnt
|
||||||
PSNo = XLATE('WO_STEP', WOStepKeys<1,WOStepNo>, WO_STEP_PROD_SPEC_ID$, 'X')
|
PSNo = Database_Services('ReadDataColumn', 'WO_STEP', WOStepKeys<1,WOStepNo>, WO_STEP_PROD_SPEC_ID$)
|
||||||
|
If Error_Services('NoError') then
|
||||||
PSRec = Database_Services('ReadDataRow', 'PROD_SPEC', PSNo)
|
PSRec = Database_Services('ReadDataRow', 'PROD_SPEC', PSNo)
|
||||||
|
If Error_Services('NoError') then
|
||||||
QAMetData = obj_Prod_Spec('GetQAMet',PSNo:@RM:PSRec)
|
QAMetData = obj_Prod_Spec('GetQAMet',PSNo:@RM:PSRec)
|
||||||
QAStages = QAMetData<COL$QA_MET_STAGE>
|
QAStages = QAMetData<COL$QA_MET_STAGE>
|
||||||
StageCnt = COUNT(QAStages,@VM) + (QAStages NE '')
|
StageCnt = DCount(QAStages,@VM)
|
||||||
|
|
||||||
FOR StageNo = 1 TO StageCnt
|
If (ReactNo NE '') then
|
||||||
|
WOReactKey = WONo:'*':WOStepNo:'*':ReactNo
|
||||||
|
end else
|
||||||
|
WOReactKey = ''
|
||||||
|
end
|
||||||
|
|
||||||
|
If (WOReactKey NE '') then
|
||||||
|
WOReactRDSNos = Database_Services('ReadDataColumn', 'WO_REACT', WOReactKey, WO_REACT_RDS_NO$)
|
||||||
|
If Error_Services('HasError') then
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
If (ErrorMsg EQ '') then
|
||||||
|
For StageNo = 1 to StageCnt
|
||||||
Stage = QAMetData<COL$QA_MET_STAGE,StageNo>
|
Stage = QAMetData<COL$QA_MET_STAGE,StageNo>
|
||||||
|
|
||||||
MetTest = QAMetData<COL$QA_MET_TEST,StageNo> ;* StageRec<PRS_STAGE_MET_TEST$>
|
MetTest = QAMetData<COL$QA_MET_TEST,StageNo> ;* StageRec<PRS_STAGE_MET_TEST$>
|
||||||
|
|
||||||
Interval = QAMetData<COL$QA_MET_INTERVAL,StageNo> ;* StageRec<PRS_STAGE_MET_INTERVAL$,StageNo>
|
Interval = QAMetData<COL$QA_MET_INTERVAL,StageNo> ;* StageRec<PRS_STAGE_MET_INTERVAL$,StageNo>
|
||||||
Start = QAMetData<COL$QA_MET_START,StageNo> ;* StageRec<PRS_STAGE_MET_START$,StageNo>
|
Start = QAMetData<COL$QA_MET_START,StageNo> ;* StageRec<PRS_STAGE_MET_START$,StageNo>
|
||||||
ReactSched = QAMetData<COL$QA_MET_REACT_SCHED,StageNo> ;* StageRec<PRS_STAGE_MET_REACT_SCHED$,StageNo>
|
ReactSched = QAMetData<COL$QA_MET_REACT_SCHED,StageNo> ;* StageRec<PRS_STAGE_MET_REACT_SCHED$,StageNo>
|
||||||
TestFlag = 0
|
TestFlag = False$
|
||||||
|
|
||||||
IF Interval NE '' AND Start NE '' THEN
|
If ( (Interval NE '') and (Start NE '') ) then
|
||||||
IF Interval = Start THEN
|
// Add Work Order scheduled tests (i.e., not reactor scheduled tests)
|
||||||
IF REM(CassNo,Interval) = 0 THEN TestFlag = 1
|
If Not(ReactSched) then
|
||||||
END ELSE
|
If Interval = Start then
|
||||||
IF ABS((Start + INT(CassNo/Interval)*Interval) - CassNo) = 0 THEN TestFlag = 1
|
If ( Rem(CassNo, Interval) EQ 0 ) then TestFlag = True$
|
||||||
END
|
end else
|
||||||
IF TestFlag AND NOT(ReactSched) THEN
|
If ( Abs( (Start + Int(CassNo / Interval)*Interval) - CassNo ) EQ 0) then TestFlag = True$
|
||||||
WOMatQARec<WO_MAT_QA_PROFILE$,MetLine> = WOStepNo:QAMetData<COL$QA_MET_TEST,StageNo> ;* StageRec<PRS_STAGE_MET_TEST$,N>
|
end
|
||||||
WOMatQARec<WO_MAT_QA_PROP$,MetLine> = QAMetData<COL$QA_MET_PROP,StageNo> ;* StageRec<PRS_STAGE_MET_PROP$,N>
|
end else
|
||||||
WOMatQARec<WO_MAT_QA_TOOL_CLASS$,MetLine> = QAMetData<COL$QA_MET_TOOL_CLASS,StageNo> ;* StageRec<PRS_STAGE_MET_TOOL_CLASS$,N>
|
Locate RDSNo in WOReactRDSNos using @VM setting TestSeq then
|
||||||
WOMatQARec<WO_MAT_QA_STAGE$,MetLine> = QAMetData<COL$QA_MET_STAGE,StageNo>
|
If ( Rem( (TestSeq - Start), Interval) EQ 0 ) then TestFlag = True$
|
||||||
WOMatQARec<WO_MAT_QA_MIN$,MetLine> = QAMetData<COL$QA_MET_MIN,StageNo> ;* StageRec<PRS_STAGE_MET_MIN$,N>
|
end
|
||||||
WOMatQARec<WO_MAT_QA_MAX$,MetLine> = QAMetData<COL$QA_MET_MAX,StageNo> ;* StageRec<PRS_STAGE_MET_MAX$,N>
|
end
|
||||||
WOMatQARec<WO_MAT_QA_SLOT$,MetLine> = QAMetData<COL$QA_MET_SLOT,StageNo> ;* StageRec<PRS_STAGE_MET_SLOT$,N>
|
If TestFlag then
|
||||||
WOMatQARec<WO_MAT_QA_RECIPE$,MetLine> = QAMetData<COL$QA_MET_RECIPE,StageNo> ;* StageRec<PRS_STAGE_MET_RECIPE$,N>
|
WOMatQARec<WO_MAT_QA_PROFILE$,MetLine> = WOStepNo:MetTest
|
||||||
WOMatQARec<WO_MAT_QA_RECIPE_PATTERN$,MetLine> = QAMetData<COL$QA_MET_RECIPE_PATTERN,StageNo> ;* StageRec<PRS_STAGE_MET_RECIPE_PATTERN$,StageNo>
|
WOMatQARec<WO_MAT_QA_PROP$,MetLine> = QAMetData<COL$QA_MET_PROP,StageNo>
|
||||||
WOMatQARec<WO_MAT_QA_WFR_QTY$,MetLine> = QAMetData<COL$QA_MET_WFR_QTY,StageNo> ;* StageRec<PRS_STAGE_MET_WFR_QTY$,StageNo>
|
WOMatQARec<WO_MAT_QA_TOOL_CLASS$,MetLine> = QAMetData<COL$QA_MET_TOOL_CLASS,StageNo>
|
||||||
WOMatQARec<WO_MAT_QA_WFR_TYPE$,MetLine> = QAMetData<COL$QA_MET_WFR_TYPE,StageNo> ;* StageRec<PRS_STAGE_MET_WFR_TYPE$,StageNo>
|
WOMatQARec<WO_MAT_QA_STAGE$,MetLine> = Stage
|
||||||
WOMatQARec<WO_MAT_QA_REACT_SCHED$,MetLine> = ReactSched ;* StageRec<PRS_STAGE_MET_REACT_SCHED$,StageNo>
|
WOMatQARec<WO_MAT_QA_MIN$,MetLine> = QAMetData<COL$QA_MET_MIN,StageNo>
|
||||||
WOMatQARec<WO_MAT_QA_SHIP_DOC$,MetLine> = QAMetData<COL$QA_MET_SHIP_DOC,StageNo> ;* StageRec<PRS_STAGE_MET_SHIP_DOC$,StageNo>
|
WOMatQARec<WO_MAT_QA_MAX$,MetLine> = QAMetData<COL$QA_MET_MAX,StageNo>
|
||||||
|
WOMatQARec<WO_MAT_QA_SLOT$,MetLine> = QAMetData<COL$QA_MET_SLOT,StageNo>
|
||||||
|
WOMatQARec<WO_MAT_QA_RECIPE$,MetLine> = QAMetData<COL$QA_MET_RECIPE,StageNo>
|
||||||
|
WOMatQARec<WO_MAT_QA_RECIPE_PATTERN$,MetLine> = QAMetData<COL$QA_MET_RECIPE_PATTERN,StageNo>
|
||||||
|
WOMatQARec<WO_MAT_QA_WFR_QTY$,MetLine> = QAMetData<COL$QA_MET_WFR_QTY,StageNo>
|
||||||
|
WOMatQARec<WO_MAT_QA_WFR_TYPE$,MetLine> = QAMetData<COL$QA_MET_WFR_TYPE,StageNo>
|
||||||
|
WOMatQARec<WO_MAT_QA_REACT_SCHED$,MetLine> = ReactSched
|
||||||
|
WOMatQARec<WO_MAT_QA_SHIP_DOC$,MetLine> = QAMetData<COL$QA_MET_SHIP_DOC,StageNo>
|
||||||
WOMatQARec<WO_MAT_QA_PHASE_MIN$,MetLine> = QAMetData<COL$QA_MET_PHASE_MIN,StageNo>
|
WOMatQARec<WO_MAT_QA_PHASE_MIN$,MetLine> = QAMetData<COL$QA_MET_PHASE_MIN,StageNo>
|
||||||
|
|
||||||
If OrigWOMatQARec NE '' then
|
If OrigWOMatQARec NE '' then
|
||||||
CurrStage = QAMetData<COL$QA_MET_STAGE,StageNo>
|
CurrStage = QAMetData<COL$QA_MET_STAGE,StageNo>
|
||||||
CurrProfile = WOStepNo:QAMetData<COL$QA_MET_TEST,StageNo>
|
CurrProfile = WOStepNo:MetTest
|
||||||
CurrSlot = QAMetData<COL$QA_MET_SLOT,StageNo>
|
CurrSlot = QAMetData<COL$QA_MET_SLOT,StageNo>
|
||||||
// Copy any existing results from the original WO_MAT_QA record.
|
// Copy any existing results from the original WO_MAT_QA record.
|
||||||
If OrigQAStages NE '' then
|
If OrigQAStages NE '' then
|
||||||
@ -302,20 +328,34 @@ Service UpdateQAMet(WOMatKey)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
MetLine += 1
|
MetLine += 1
|
||||||
END
|
end
|
||||||
END
|
end
|
||||||
|
Next StageNo
|
||||||
NEXT StageNo
|
end
|
||||||
|
end else
|
||||||
NEXT WOStepNo
|
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
Until (ErrorMsg NE '')
|
||||||
|
Next WOStepNo
|
||||||
|
If (ErrorMsg EQ '') then
|
||||||
Database_Services('WriteDataRow', 'WO_MAT_QA', WONo:'*':CassNo, WOMatQARec)
|
Database_Services('WriteDataRow', 'WO_MAT_QA', WONo:'*':CassNo, WOMatQARec)
|
||||||
|
If Error_Services('HasError') then ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||||
|
end
|
||||||
end else
|
end else
|
||||||
ErrorMsg = 'Error in ':Service:' service. Null WOMatKey passed in.'
|
ErrorMsg = 'Error in ':Service:' service. Null WOMatKey passed in.'
|
||||||
end
|
end
|
||||||
|
|
||||||
If ErrorMsg NE '' then
|
If (ErrorMsg NE '') then
|
||||||
Error_Services('Add', ErrorMsg)
|
Error_Services('Add', ErrorMsg)
|
||||||
end else
|
end else
|
||||||
Response = WOMatQARec
|
Response = WOMatQARec
|
||||||
@ -421,35 +461,57 @@ end service
|
|||||||
|
|
||||||
Service GetQAMetComplete(WOMatKey)
|
Service GetQAMetComplete(WOMatKey)
|
||||||
|
|
||||||
|
ErrorMsg = ''
|
||||||
|
QAMetComplete = True$
|
||||||
|
|
||||||
If WOMatKey NE '' then
|
If WOMatKey NE '' then
|
||||||
|
// Lack of WO_MAT_QA record may not be an error here. Gen5 Products do not have WO_MAT_QA Records
|
||||||
If Rowexists('WO_MAT_QA', WOMatKey) then
|
If Rowexists('WO_MAT_QA', WOMatKey) then
|
||||||
Response = ''
|
|
||||||
QAMetRec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatKey, '', True$, 0, False$)
|
QAMetRec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatKey, '', True$, 0, False$)
|
||||||
|
If Error_Services('NoError') then
|
||||||
Stages = QAMetRec<WO_MAT_QA_STAGE$>
|
Stages = QAMetRec<WO_MAT_QA_STAGE$>
|
||||||
Results = QAMetRec<WO_MAT_QA_RESULT$>
|
Results = QAMetRec<WO_MAT_QA_RESULT$>
|
||||||
StageCount = Count(Stages, @VM)
|
StageCount = DCount(Stages, @VM)
|
||||||
|
QAStagePresent = False$
|
||||||
For I = 1 to StageCount
|
For I = 1 to StageCount
|
||||||
|
If Stages<1, I> EQ 'QA' then QAStagePresent = True$
|
||||||
If Results<1,I> EQ '' then
|
If Results<1,I> EQ '' then
|
||||||
Response = False$
|
QAMetComplete = False$
|
||||||
end
|
end
|
||||||
Until Response EQ False$
|
Until QAMetComplete EQ False$
|
||||||
Next I
|
Next I
|
||||||
If Response = '' then
|
If QAMetComplete EQ True$ AND QAStagePresent = True$ then
|
||||||
Response = Wo_Mat_Qa_Services('GetMUWaferQAComplete', WOMatKey)
|
QAMUMetComplete = WO_Mat_QA_Services('GetMUWaferQAComplete', WOMatKey)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
If Not(QAMUMetComplete) then
|
||||||
|
QAMetComplete = False$
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
Response = True$
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', 'Missing WOMatKey parameter.')
|
ErrorMsg = Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Missing WOMatKey parameter.'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
If ErrorMsg EQ '' then
|
||||||
|
Response = QAMetComplete
|
||||||
|
end else
|
||||||
|
Response = False$
|
||||||
|
Error_Services('Add', ErrorMsg)
|
||||||
|
end
|
||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
Service GetMUWaferQAComplete(WOMatKey)
|
Service GetMUWaferQAComplete(WOMatKey)
|
||||||
|
|
||||||
|
ErrorMsg = ''
|
||||||
|
|
||||||
If WOMatKey NE '' then
|
If WOMatKey NE '' then
|
||||||
Response = True$
|
Response = True$
|
||||||
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WoMatKey, True$, 0, False$)
|
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WoMatKey, True$, 0, False$)
|
||||||
@ -487,12 +549,15 @@ Service GetMUWaferQAComplete(WOMatKey)
|
|||||||
Next Box
|
Next Box
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', 'Failed to open WO_MAT record.')
|
ErrorMsg = 'Failed to open WO_MAT record.'
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', 'Missing WOMatKey parameter.')
|
ErrorMsg = 'Missing WOMatKey parameter.'
|
||||||
|
end
|
||||||
|
|
||||||
|
If ErrorMsg NE '' then
|
||||||
|
Error_Services('Add', ErrorMsg)
|
||||||
end
|
end
|
||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -55,7 +55,7 @@ $Insert SERVICE_SETUP
|
|||||||
$Insert DICT_EQUATES
|
$Insert DICT_EQUATES
|
||||||
|
|
||||||
Declare function Database_Services, Error_Services, SRP_Json, SRP_Com, Environment_Services, Logging_Services
|
Declare function Database_Services, Error_Services, SRP_Json, SRP_Com, Environment_Services, Logging_Services
|
||||||
Declare function Datetime, Rds_Services, GetTickCount, SRP_Array
|
Declare function Datetime, Rds_Services, GetTickCount, SRP_Array, Date_Services
|
||||||
Declare subroutine Error_Services, SRP_Json, SRP_Com, Wo_Mat_Services, Database_Services, Logging_Services
|
Declare subroutine Error_Services, SRP_Json, SRP_Com, Wo_Mat_Services, Database_Services, Logging_Services
|
||||||
Declare subroutine obj_wo_mat_log, Set_Status, Rds_Services, Signature_Services, Mona_Services, Btree.Extract
|
Declare subroutine obj_wo_mat_log, Set_Status, Rds_Services, Signature_Services, Mona_Services, Btree.Extract
|
||||||
Declare subroutine Transaction_Services
|
Declare subroutine Transaction_Services
|
||||||
@ -86,6 +86,7 @@ Return Response or ""
|
|||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
Service ConvertRecordToJSON(WOMatKey, Record, ItemURL)
|
Service ConvertRecordToJSON(WOMatKey, Record, ItemURL)
|
||||||
|
|
||||||
jsonRecord = ''
|
jsonRecord = ''
|
||||||
IF WOMatKey NE '' then
|
IF WOMatKey NE '' then
|
||||||
If Record EQ '' then Record = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
|
If Record EQ '' then Record = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
|
||||||
@ -290,6 +291,50 @@ Service ConvertRecordToJSON(WOMatKey, Record, ItemURL)
|
|||||||
End Service
|
End Service
|
||||||
|
|
||||||
|
|
||||||
|
Service ConvertRecordToJsonOIWizard(WOMatKey, WOMatRec)
|
||||||
|
|
||||||
|
Json = ''
|
||||||
|
If WOMatKey NE '' then
|
||||||
|
If WOMatRec EQ '' then WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
objJSON = ''
|
||||||
|
If SRP_JSON(objJSON, 'New', 'Object') then
|
||||||
|
objWOMat = ''
|
||||||
|
If SRP_JSON(objWOMat, 'New', 'Object') then
|
||||||
|
SRP_JSON(objWOMat, 'SetValue', 'KeyId', WOMatKey)
|
||||||
|
SRP_JSON(objWOMat, 'SetValue', 'CassNo', Field(WOMatKey, '*', 2, 1))
|
||||||
|
SRP_JSON(objWOMat, 'SetValue', 'SAPBatchNo', WOMatRec<WO_MAT_SAP_BATCH_NO$>)
|
||||||
|
SRP_JSON(objWOMat, 'SetValue', 'SAPTXDtm', Date_Services('ConvertDateTimeToISO8601', WOMatRec<WO_MAT_SAP_TX_DTM$>))
|
||||||
|
SRP_JSON(objWOMat, 'SetValue', 'RDSNo', WOMatRec<WO_MAT_RDS_NO$>)
|
||||||
|
SRP_JSON(objWOMat, 'SetValue', 'ShipNo', WOMatRec<WO_MAT_SHIP_NO$>)
|
||||||
|
SRP_JSON(objWOMat, 'SetValue', 'LotNo', WOMatRec<WO_MAT_LOT_NO$>)
|
||||||
|
SRP_JSON(objWOMat, 'SetValue', 'Qty', WOMatRec<WO_MAT_WAFER_QTY$>)
|
||||||
|
SRP_JSON(objWOMat, 'SetValue', 'CustPartNo', WOMatRec<WO_MAT_CUST_PART_NO$>)
|
||||||
|
SRP_JSON(objWOMat, 'SetValue', 'SubPartNo', WOMatRec<WO_MAT_SUB_PART_NO$>)
|
||||||
|
SRP_JSON(objWOMat, 'SetValue', 'VendorCd', WOMatRec<WO_MAT_SUB_VEND_CD$>)
|
||||||
|
SRP_JSON(objWOMat, 'SetValue', 'RecDtm', Date_Services('ConvertDateTimeToISO8601', WOMatRec<WO_MAT_RX_DTM$>))
|
||||||
|
SRP_JSON(objWOMat, 'SetValue', 'RelDtm', Date_Services('ConvertDateTimeToISO8601', WOMatRec<WO_MAT_REL_DTM$>))
|
||||||
|
SRP_JSON(objWOMat, 'SetValue', 'RecUser', OConv(WOMatRec<WO_MAT_RX_BY$>, '[XLATE_CONV,LSL_USERS*FIRST_LAST]'))
|
||||||
|
SRP_JSON(objWOMat, 'SetValue', 'RelUser', OConv(WOMatRec<WO_MAT_REL_BY$>, '[XLATE_CONV,LSL_USERS*FIRST_LAST]' ))
|
||||||
|
SRP_JSON(objJSON, 'Set', 'WO_Mat', objWOMat)
|
||||||
|
SRP_JSON(objWOMat, 'Release')
|
||||||
|
Json = SRP_JSON(objJSON, 'Stringify', 'Fast')
|
||||||
|
end else
|
||||||
|
Error_Services('Add', 'Unable to create JSON representation in the ' : Service : ' service.')
|
||||||
|
end
|
||||||
|
SRP_JSON(objJSON, 'Release')
|
||||||
|
end else
|
||||||
|
Error_Services('Add', 'Unable to create JSON representation in the ' : Service : ' service.')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Error_Services('Add', 'KeyID argument was missing in the ' : Service : ' service.')
|
||||||
|
end
|
||||||
|
Response = Json
|
||||||
|
|
||||||
|
end service
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
// GetWaferMap
|
// GetWaferMap
|
||||||
//
|
//
|
||||||
@ -447,37 +492,43 @@ Service CassetteIsLastInWo(WoMatKey)
|
|||||||
|
|
||||||
IsLastInWo = False$
|
IsLastInWo = False$
|
||||||
|
|
||||||
|
ErrMsg = ''
|
||||||
If Unassigned(WoMatKey) or WoMatKey EQ '' or RowExists('WO_MAT', WoMatKey) NE True$ then
|
If Unassigned(WoMatKey) or WoMatKey EQ '' or RowExists('WO_MAT', WoMatKey) NE True$ then
|
||||||
Error_Services('Add', 'invalid WO_MAT key')
|
ErrMsg = 'invalid WO_MAT key'
|
||||||
end
|
end
|
||||||
|
|
||||||
WO = Field(WoMatKey, '*', 1)
|
WO = Field(WoMatKey, '*', 1)
|
||||||
If WO EQ '' then
|
If WO EQ '' then
|
||||||
Error_Services('Add', 'WO# not found in WO_MAT record')
|
ErrMsg = 'WO# not found in WO_MAT record'
|
||||||
end
|
end
|
||||||
If Error_Services('NoError') and Num(WO) EQ False$ then
|
If ErrMsg EQ '' and Num(WO) EQ False$ then
|
||||||
Error_Services('Add', 'WO# is not numeric')
|
ErrMsg = 'WO# is not numeric'
|
||||||
end
|
end
|
||||||
|
|
||||||
CassNo = Field(WoMatKey, '*', 2)
|
CassNo = Field(WoMatKey, '*', 2)
|
||||||
If Error_Services('NoError') and CassNo EQ '' then
|
If ErrMsg EQ '' and CassNo EQ '' then
|
||||||
Error_Services('Add', 'Cassette# not found in WO_MAT record')
|
ErrMsg = 'Cassette# not found in WO_MAT record'
|
||||||
end
|
end
|
||||||
If Error_Services('NoError') and Num(CassNo) EQ False$ then
|
If ErrMsg EQ '' and Num(CassNo) EQ False$ then
|
||||||
Error_Services('Add', 'Cassette# is not numeric')
|
ErrMsg = 'Cassette# is not numeric'
|
||||||
end
|
end
|
||||||
|
|
||||||
If Error_Services('NoError') then
|
If ErrMsg EQ '' then
|
||||||
WoMatKeys = Xlate('WO_LOG', WO, WO_LOG_WO_MAT_KEY$, 'X')
|
WoMatKeys = Xlate('WO_LOG', WO, WO_LOG_WO_MAT_KEY$, 'X')
|
||||||
If Error_Services('NoError') and WoMatKeys NE '' then
|
If WoMatKeys NE '' then
|
||||||
TotalCassettes = DCount(WoMatKeys, @VM)
|
TotalCassettes = DCount(WoMatKeys, @VM)
|
||||||
IsLastInWo = TotalCassettes EQ CassNo
|
IsLastInWo = TotalCassettes EQ CassNo
|
||||||
|
end else
|
||||||
|
ErrMsg = 'WO_MAT keys not found in WO_LOG for WO ':WO
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
If Error_Services('HasError') then
|
Response = IsLastInWo
|
||||||
ErrMsg = Error_Services('GetMessage')
|
|
||||||
|
|
||||||
|
EndTick = GetTickCount()
|
||||||
|
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||||
|
|
||||||
|
If ErrMsg NE '' then
|
||||||
LogData = ''
|
LogData = ''
|
||||||
LogData<1> = LoggingDtm
|
LogData<1> = LoggingDtm
|
||||||
LogData<2> = WOMatKey
|
LogData<2> = WOMatKey
|
||||||
@ -489,11 +540,6 @@ Service CassetteIsLastInWo(WoMatKey)
|
|||||||
Error_Services('Add', ErrMsg)
|
Error_Services('Add', ErrMsg)
|
||||||
end
|
end
|
||||||
|
|
||||||
Response = IsLastInWo
|
|
||||||
|
|
||||||
EndTick = GetTickCount()
|
|
||||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
|
||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
@ -546,8 +592,13 @@ Service SetWoMatVoidFlag(WoMatKey, Username)
|
|||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
Service MakeupFlagOn(RDSNo)
|
Service MakeupFlagOn(WOMatKey)
|
||||||
|
|
||||||
|
ErrorMsg = ''
|
||||||
|
If (WOMatKey NE '') then
|
||||||
|
If RowExists('WO_MAT', WOMatKey) then
|
||||||
|
RDSNo = Database_Services('ReadDataColumn', 'WO_MAT', WOMatKey, WO_MAT_RDS_NO$)
|
||||||
|
If Error_Services('NoError') then
|
||||||
EpiCheck = Rds_Services('IsEpiPro', RDSNo)
|
EpiCheck = Rds_Services('IsEpiPro', RDSNo)
|
||||||
BioRadDown = False$
|
BioRadDown = False$
|
||||||
Bio4Down = False$
|
Bio4Down = False$
|
||||||
@ -574,6 +625,16 @@ Service MakeupFlagOn(RDSNo)
|
|||||||
Rds_Services('ApplyQA100PercentADE', RDSNo)
|
Rds_Services('ApplyQA100PercentADE', RDSNo)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Error reading RDS_NO from WO_MAT record ':WOMatKey:'. '
|
||||||
|
ErrorMsg := 'Error message: ':Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. WO_MAT record ':WOMatKey:' does not exist.'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Null WOMatKey passed into service.'
|
||||||
|
end
|
||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
@ -696,4 +757,3 @@ Service VerifyWOLogWOMatKeyColumn(WOMatKey)
|
|||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -242,6 +242,10 @@ Equ API_COLOR_BTNTEXT$ To 18
|
|||||||
Equ API_COLOR_INACTIVECAPTIONTEXT$ To 19
|
Equ API_COLOR_INACTIVECAPTIONTEXT$ To 19
|
||||||
Equ API_COLOR_BTNHIGHLIGHT$ To 20
|
Equ API_COLOR_BTNHIGHLIGHT$ To 20
|
||||||
|
|
||||||
|
// Edit Line Color Equates
|
||||||
|
Equ READONLY_GREEN$ TO 192 + (220*256) + (192*65536)
|
||||||
|
Equ EDIT_ACTIVE_WHITE$ TO 16777215
|
||||||
|
|
||||||
// Preference Manager
|
// Preference Manager
|
||||||
Equ ImagePath$ to Memory_Services('GetValue', 'PM_CURRENT_IMAGE_PATH') : '\'
|
Equ ImagePath$ to Memory_Services('GetValue', 'PM_CURRENT_IMAGE_PATH') : '\'
|
||||||
PMSystemFont = Memory_Services('GetValue', 'PM_SYSTEM_FONT')
|
PMSystemFont = Memory_Services('GetValue', 'PM_SYSTEM_FONT')
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user