diff --git a/LSL2/OIWIN/NDW_MATERIAL_TRACK_PRO_REPORT.json b/LSL2/OIWIN/NDW_MATERIAL_TRACK_PRO_REPORT.json index 96ebae6..cae37a5 100644 --- a/LSL2/OIWIN/NDW_MATERIAL_TRACK_PRO_REPORT.json +++ b/LSL2/OIWIN/NDW_MATERIAL_TRACK_PRO_REPORT.json @@ -22,15 +22,19 @@ "<1,9>": "Material Track Pro Report", "<1,10>": { "<1,10,1>": "0x84C80000", - "<1,10,2>": "0x0" + "<1,10,2>": "0x100" }, "<1,11>": { - "<1,11,1>": "0x0", + "<1,11,1>": "0x8000", "<1,11,2>": "0x80000000" }, - "<1,12>": "0", - "<1,13>": "-2", - "<1,14>": "0", + "<1,12>": "", + "<1,13>": { + "<1,13,1>": "-2", + "<1,13,2>": "-2", + "<1,13,3>": "" + }, + "<1,14>": "", "<1,15>": "", "<1,16>": "", "<1,17>": "", @@ -50,51 +54,61 @@ "<1,18,1,4,8>": "@PARAM6" }, "<1,18,1,5>": "", - "<1,18,1,6>": "" - }, - "<1,18,2>": "" - }, - "<1,19>": { - "<1,19,1>": "CREATE", - "<1,19,2>": "" + "<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>": "STPROC" + } }, + "<1,19>": "CREATE", "<1,20>": "", "<1,21>": "", "<1,22>": "", "<1,23>": "", "<1,24>": { - "<1,24,1>": "0", + "<1,24,1>": "", "<1,24,2>": "0", "<1,24,3>": "0", "<1,24,4>": "0", - "<1,24,5>": "0", - "<1,24,6>": "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>": "0", - "<1,26>": "0", + "<1,25>": "", + "<1,26>": "", "<1,27>": "", "<1,28>": "", "<1,29>": "", "<1,30>": "", "<1,31>": "", - "<1,32>": { - "<1,32,1>": "0x7FFFE", - "<1,32,2>": "0xF001E808" - }, + "<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,38,1>": "1", - "<1,38,2>": "1" + "<1,37,1>": "0X10001", + "<1,37,2>": "0X10001" }, + "<1,38>": "", "<1,39>": "", - "<1,40>": "0", + "<1,40>": "", "<1,41>": "", "<1,42>": "", "<1,43>": "", @@ -106,7 +120,74 @@ "<1,49>": "", "<1,50>": "", "<1,51>": "", - "<1,52>": "" + "<1,52>": "", + "<1,53>": "", + "<1,54>": "", + "<1,55>": "", + "<1,56>": "", + "<1,57>": "", + "<1,58>": "", + "<1,59>": "", + "<1,60>": "", + "<1,61>": "", + "<1,62>": { + "<1,62,1>": "0", + "<1,62,2>": "", + "<1,62,3>": "", + "<1,62,4>": "0", + "<1,62,5>": "0", + "<1,62,6>": "0", + "<1,62,7>": "", + "<1,62,8>": "0.50", + "<1,62,9>": "5.00", + "<1,62,10>": "0.00" + }, + "<1,63>": "", + "<1,64>": "", + "<1,65>": "", + "<1,66>": "", + "<1,67>": "", + "<1,68>": "", + "<1,69>": "", + "<1,70>": "", + "<1,71>": "", + "<1,72>": "", + "<1,73>": "", + "<1,74>": "", + "<1,75>": "", + "<1,76>": "", + "<1,77>": "", + "<1,78>": "", + "<1,79>": "", + "<1,80>": "", + "<1,81>": "", + "<1,82>": "", + "<1,83>": "", + "<1,84>": "", + "<1,85>": "", + "<1,86>": "", + "<1,87>": "", + "<1,88>": "", + "<1,89>": "", + "<1,90>": "", + "<1,91>": "", + "<1,92>": "", + "<1,93>": "", + "<1,94>": "", + "<1,95>": "", + "<1,96>": "", + "<1,97>": "", + "<1,98>": "", + "<1,99>": "", + "<1,100>": "", + "<1,101>": "", + "<1,102>": "", + "<1,103>": "", + "<1,104>": "", + "<1,105>": "", + "<1,106>": "0", + "<1,107>": "", + "<1,108>": "" } }, "record3": { @@ -129,7 +210,11 @@ "<1,11,2>": "0x80000000" }, "<1,12>": "1", - "<1,13>": "-2", + "<1,13>": { + "<1,13,1>": "-2", + "<1,13,2>": "-2", + "<1,13,3>": "" + }, "<1,14>": "0", "<1,15>": { "<1,15,1>": { @@ -167,35 +252,134 @@ "<1,18,1,4,8>": "@PARAM6" }, "<1,18,1,5>": "", - "<1,18,1,6>": "" - }, - "<1,18,2>": "" - }, - "<1,19>": { - "<1,19,1>": "OLE", - "<1,19,2>": "" + "<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>": "STPROC" + } }, + "<1,19>": "OLE", "<1,20>": "", "<1,21>": "", "<1,22>": "", "<1,23>": "", "<1,24>": "", - "<1,25>": "0", - "<1,26>": "0", + "<1,25>": "", + "<1,26>": "", "<1,27>": "", - "<1,28>": "<>", - "<1,29>": "<>", - "<1,30>": "<>", - "<1,31>": "0", - "<1,32>": { - "<1,32,1>": "0x7fffe", - "<1,32,2>": "0xf0016400" - }, + "<1,28>": "", + "<1,29>": "", + "<1,30>": "", + "<1,31>": "", + "<1,32>": "", "<1,33>": "", "<1,34>": "", "<1,35>": "", "<1,36>": "0000000000000000", - "<1,37>": "" + "<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,55,1>": "OLE.AllowXPTheme", + "<1,55,2>": "OLE.ComboDropDown", + "<1,55,3>": "OLE.DblClickToEdit", + "<1,55,4>": "OLE.EditContextMenu", + "<1,55,5>": "OLE.EditText", + "<1,55,6>": "OLE.Focus", + "<1,55,7>": "OLE.HeaderRowCount", + "<1,55,8>": "OLE.Modified", + "<1,55,9>": "OLE.PassEnterKey", + "<1,55,10>": "OLE.ScrollBarsVisible", + "<1,55,11>": "OLE.SingleEscape", + "<1,55,12>": "OLE.TextRenderStyle" + }, + "<1,56>": { + "<1,56,1>": "0", + "<1,56,2>": "0", + "<1,56,3>": "1", + "<1,56,4>": "1", + "<1,56,5>": "", + "<1,56,6>": "0", + "<1,56,7>": "1", + "<1,56,8>": "0", + "<1,56,9>": "0", + "<1,56,10>": "Auto|Auto", + "<1,56,11>": "0", + "<1,56,12>": "EditField|Ellipses" + }, + "<1,57>": "", + "<1,58>": "", + "<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,95>": "", + "<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>": "" }, "<2>": { "<2,1>": "OLE_EDT_LOC_FILTER", @@ -216,7 +400,11 @@ "<2,11,2>": "0x80000000" }, "<2,12>": "2", - "<2,13>": "-2", + "<2,13>": { + "<2,13,1>": "-2", + "<2,13,2>": "-2", + "<2,13,3>": "" + }, "<2,14>": "0", "<2,15>": { "<2,15,1>": { @@ -254,35 +442,134 @@ "<2,18,1,4,8>": "@PARAM6" }, "<2,18,1,5>": "", - "<2,18,1,6>": "" - }, - "<2,18,2>": "" - }, - "<2,19>": { - "<2,19,1>": "OLE", - "<2,19,2>": "" + "<2,18,1,6>": "", + "<2,18,1,7>": "", + "<2,18,1,8>": "", + "<2,18,1,9>": "", + "<2,18,1,10>": "", + "<2,18,1,11>": "", + "<2,18,1,12>": "", + "<2,18,1,13>": "", + "<2,18,1,14>": "", + "<2,18,1,15>": "STPROC" + } }, + "<2,19>": "OLE", "<2,20>": "", "<2,21>": "", "<2,22>": "", "<2,23>": "", "<2,24>": "", - "<2,25>": "0", - "<2,26>": "0", + "<2,25>": "", + "<2,26>": "", "<2,27>": "", - "<2,28>": "<>", - "<2,29>": "<>", - "<2,30>": "<>", - "<2,31>": "0", - "<2,32>": { - "<2,32,1>": "0x7fffe", - "<2,32,2>": "0xf0016c00" - }, + "<2,28>": "", + "<2,29>": "", + "<2,30>": "", + "<2,31>": "", + "<2,32>": "", "<2,33>": "", "<2,34>": "", "<2,35>": "", "<2,36>": "0000000000000000", - "<2,37>": "" + "<2,37>": "", + "<2,38>": "", + "<2,39>": "", + "<2,40>": "", + "<2,41>": "", + "<2,42>": "", + "<2,43>": "", + "<2,44>": "", + "<2,45>": "", + "<2,46>": "", + "<2,47>": "", + "<2,48>": "", + "<2,49>": "", + "<2,50>": "", + "<2,51>": "", + "<2,52>": "", + "<2,53>": "", + "<2,54>": "", + "<2,55>": { + "<2,55,1>": "OLE.AllowXPTheme", + "<2,55,2>": "OLE.ComboDropDown", + "<2,55,3>": "OLE.DblClickToEdit", + "<2,55,4>": "OLE.EditContextMenu", + "<2,55,5>": "OLE.EditText", + "<2,55,6>": "OLE.Focus", + "<2,55,7>": "OLE.HeaderRowCount", + "<2,55,8>": "OLE.Modified", + "<2,55,9>": "OLE.PassEnterKey", + "<2,55,10>": "OLE.ScrollBarsVisible", + "<2,55,11>": "OLE.SingleEscape", + "<2,55,12>": "OLE.TextRenderStyle" + }, + "<2,56>": { + "<2,56,1>": "0", + "<2,56,2>": "0", + "<2,56,3>": "1", + "<2,56,4>": "1", + "<2,56,5>": "", + "<2,56,6>": "0", + "<2,56,7>": "1", + "<2,56,8>": "0", + "<2,56,9>": "0", + "<2,56,10>": "Auto|Auto", + "<2,56,11>": "0", + "<2,56,12>": "EditField|Ellipses" + }, + "<2,57>": "", + "<2,58>": "", + "<2,59>": "", + "<2,60>": "", + "<2,61>": "", + "<2,62>": "", + "<2,63>": "", + "<2,64>": "", + "<2,65>": "", + "<2,66>": "", + "<2,67>": "", + "<2,68>": "", + "<2,69>": "", + "<2,70>": "", + "<2,71>": "", + "<2,72>": "", + "<2,73>": "", + "<2,74>": "", + "<2,75>": "", + "<2,76>": "", + "<2,77>": "", + "<2,78>": "", + "<2,79>": "", + "<2,80>": "", + "<2,81>": "", + "<2,82>": "", + "<2,83>": "", + "<2,84>": "", + "<2,85>": "", + "<2,86>": "", + "<2,87>": "", + "<2,88>": "", + "<2,89>": "", + "<2,90>": "", + "<2,91>": "", + "<2,92>": "", + "<2,93>": "", + "<2,94>": "", + "<2,95>": "", + "<2,96>": "", + "<2,97>": "", + "<2,98>": "", + "<2,99>": "", + "<2,100>": "", + "<2,101>": "", + "<2,102>": "", + "<2,103>": "", + "<2,104>": "", + "<2,105>": "", + "<2,106>": "", + "<2,107>": "", + "<2,108>": "" }, "<3>": { "<3,1>": "PUB_GEN_REPORT", @@ -293,17 +580,21 @@ "<3,6>": "279", "<3,7>": "106", "<3,8>": "27", - "<3,9>": "&Generate Report\r\n", + "<3,9>": "&Generate Report", "<3,10>": { - "<3,10,1>": "0x56002000", + "<3,10,1>": "0x56002300", "<3,10,2>": "0x0" }, "<3,11>": { - "<3,11,1>": "0x100", + "<3,11,1>": "0x0", "<3,11,2>": "0x80000000" }, "<3,12>": "3", - "<3,13>": "-2", + "<3,13>": { + "<3,13,1>": "-2", + "<3,13,2>": "-2", + "<3,13,3>": "0" + }, "<3,14>": "0", "<3,15>": { "<3,15,1>": { @@ -341,30 +632,32 @@ "<3,18,1,4,8>": "@PARAM6" }, "<3,18,1,5>": "", - "<3,18,1,6>": "" - }, - "<3,18,2>": "" - }, - "<3,19>": { - "<3,19,1>": "CLICK", - "<3,19,2>": "" + "<3,18,1,6>": "", + "<3,18,1,7>": "", + "<3,18,1,8>": "", + "<3,18,1,9>": "", + "<3,18,1,10>": "", + "<3,18,1,11>": "", + "<3,18,1,12>": "", + "<3,18,1,13>": "", + "<3,18,1,14>": "", + "<3,18,1,15>": "STPROC" + } }, + "<3,19>": "CLICK", "<3,20>": "", "<3,21>": "", "<3,22>": "", "<3,23>": "", "<3,24>": "", - "<3,25>": "0", - "<3,26>": "0", + "<3,25>": "", + "<3,26>": "", "<3,27>": "", - "<3,28>": "<>", - "<3,29>": "<>", - "<3,30>": "<>", - "<3,31>": "0", - "<3,32>": { - "<3,32,1>": "0x7fffe", - "<3,32,2>": "0xf0016008" - }, + "<3,28>": "", + "<3,29>": "", + "<3,30>": "", + "<3,31>": "", + "<3,32>": "", "<3,33>": "", "<3,34>": "", "<3,35>": "", @@ -373,7 +666,10 @@ "<3,38>": "", "<3,39>": "", "<3,40>": "1", - "<3,41>": "", + "<3,41>": { + "<3,41,1>": "", + "<3,41,2>": "-1" + }, "<3,42>": "", "<3,43>": "", "<3,44>": "", @@ -383,7 +679,68 @@ "<3,48>": "", "<3,49>": "", "<3,50>": "", - "<3,51>": "" + "<3,51>": "", + "<3,52>": "", + "<3,53>": "", + "<3,54>": "", + "<3,55>": "", + "<3,56>": "", + "<3,57>": "", + "<3,58>": "", + "<3,59>": "", + "<3,60>": "", + "<3,61>": "", + "<3,62>": "0", + "<3,63>": "", + "<3,64>": { + "<3,64,1>": "-2", + "<3,64,2>": "-2", + "<3,64,3>": "0" + }, + "<3,65>": "-2", + "<3,66>": "", + "<3,67>": "", + "<3,68>": "", + "<3,69>": "", + "<3,70>": "", + "<3,71>": "", + "<3,72>": "", + "<3,73>": "", + "<3,74>": "", + "<3,75>": "", + "<3,76>": "", + "<3,77>": "", + "<3,78>": "", + "<3,79>": "", + "<3,80>": "", + "<3,81>": "", + "<3,82>": "", + "<3,83>": "", + "<3,84>": "", + "<3,85>": "", + "<3,86>": "", + "<3,87>": "", + "<3,88>": "", + "<3,89>": "", + "<3,90>": "0", + "<3,91>": "0", + "<3,92>": "", + "<3,93>": "", + "<3,94>": "", + "<3,95>": "", + "<3,96>": "", + "<3,97>": "", + "<3,98>": "", + "<3,99>": "", + "<3,100>": "", + "<3,101>": "", + "<3,102>": "", + "<3,103>": "", + "<3,104>": "", + "<3,105>": "", + "<3,106>": "", + "<3,107>": "", + "<3,108>": "" }, "<4>": { "<4,1>": "PUB_SAVE_SETTINGS", @@ -396,15 +753,19 @@ "<4,8>": "27", "<4,9>": "&Save Settings", "<4,10>": { - "<4,10,1>": "0x56002000", + "<4,10,1>": "0x56002300", "<4,10,2>": "0x0" }, "<4,11>": { - "<4,11,1>": "0x100", + "<4,11,1>": "0x0", "<4,11,2>": "0x80000000" }, "<4,12>": "4", - "<4,13>": "-2", + "<4,13>": { + "<4,13,1>": "-2", + "<4,13,2>": "-2", + "<4,13,3>": "0" + }, "<4,14>": "0", "<4,15>": { "<4,15,1>": { @@ -442,30 +803,32 @@ "<4,18,1,4,8>": "@PARAM6" }, "<4,18,1,5>": "", - "<4,18,1,6>": "" - }, - "<4,18,2>": "" - }, - "<4,19>": { - "<4,19,1>": "CLICK", - "<4,19,2>": "" + "<4,18,1,6>": "", + "<4,18,1,7>": "", + "<4,18,1,8>": "", + "<4,18,1,9>": "", + "<4,18,1,10>": "", + "<4,18,1,11>": "", + "<4,18,1,12>": "", + "<4,18,1,13>": "", + "<4,18,1,14>": "", + "<4,18,1,15>": "STPROC" + } }, + "<4,19>": "CLICK", "<4,20>": "", "<4,21>": "", "<4,22>": "", "<4,23>": "", "<4,24>": "", - "<4,25>": "0", - "<4,26>": "0", + "<4,25>": "", + "<4,26>": "", "<4,27>": "", - "<4,28>": "<>", - "<4,29>": "<>", - "<4,30>": "<>", - "<4,31>": "0", - "<4,32>": { - "<4,32,1>": "0x7fffe", - "<4,32,2>": "0xf0016008" - }, + "<4,28>": "", + "<4,29>": "", + "<4,30>": "", + "<4,31>": "", + "<4,32>": "", "<4,33>": "", "<4,34>": "", "<4,35>": "", @@ -474,7 +837,10 @@ "<4,38>": "", "<4,39>": "", "<4,40>": "1", - "<4,41>": "", + "<4,41>": { + "<4,41,1>": "", + "<4,41,2>": "-1" + }, "<4,42>": "", "<4,43>": "", "<4,44>": "", @@ -484,7 +850,68 @@ "<4,48>": "", "<4,49>": "", "<4,50>": "", - "<4,51>": "" + "<4,51>": "", + "<4,52>": "", + "<4,53>": "", + "<4,54>": "", + "<4,55>": "", + "<4,56>": "", + "<4,57>": "", + "<4,58>": "", + "<4,59>": "", + "<4,60>": "", + "<4,61>": "", + "<4,62>": "0", + "<4,63>": "", + "<4,64>": { + "<4,64,1>": "-2", + "<4,64,2>": "-2", + "<4,64,3>": "0" + }, + "<4,65>": "-2", + "<4,66>": "", + "<4,67>": "", + "<4,68>": "", + "<4,69>": "", + "<4,70>": "", + "<4,71>": "", + "<4,72>": "", + "<4,73>": "", + "<4,74>": "", + "<4,75>": "", + "<4,76>": "", + "<4,77>": "", + "<4,78>": "", + "<4,79>": "", + "<4,80>": "", + "<4,81>": "", + "<4,82>": "", + "<4,83>": "", + "<4,84>": "", + "<4,85>": "", + "<4,86>": "", + "<4,87>": "", + "<4,88>": "", + "<4,89>": "", + "<4,90>": "0", + "<4,91>": "0", + "<4,92>": "", + "<4,93>": "", + "<4,94>": "", + "<4,95>": "", + "<4,96>": "", + "<4,97>": "", + "<4,98>": "", + "<4,99>": "", + "<4,100>": "", + "<4,101>": "", + "<4,102>": "", + "<4,103>": "", + "<4,104>": "", + "<4,105>": "", + "<4,106>": "", + "<4,107>": "", + "<4,108>": "" }, "<5>": { "<5,1>": "OLE_SUBCLASS", @@ -505,7 +932,11 @@ "<5,11,2>": "0x80000000" }, "<5,12>": "5", - "<5,13>": "-2", + "<5,13>": { + "<5,13,1>": "-2", + "<5,13,2>": "-2", + "<5,13,3>": "" + }, "<5,14>": "0", "<5,15>": { "<5,15,1>": { @@ -534,22 +965,90 @@ "<5,22>": "", "<5,23>": "", "<5,24>": "", - "<5,25>": "0", - "<5,26>": "0", + "<5,25>": "", + "<5,26>": "", "<5,27>": "", - "<5,28>": "<>", - "<5,29>": "<>", - "<5,30>": "<>", - "<5,31>": "0", - "<5,32>": { - "<5,32,1>": "0x7fffe", - "<5,32,2>": "0xf0016800" - }, + "<5,28>": "", + "<5,29>": "", + "<5,30>": "", + "<5,31>": "", + "<5,32>": "", "<5,33>": "", "<5,34>": "", "<5,35>": "", "<5,36>": "", - "<5,37>": "" + "<5,37>": "", + "<5,38>": "", + "<5,39>": "", + "<5,40>": "", + "<5,41>": "", + "<5,42>": "", + "<5,43>": "", + "<5,44>": "", + "<5,45>": "", + "<5,46>": "", + "<5,47>": "", + "<5,48>": "", + "<5,49>": "", + "<5,50>": "", + "<5,51>": "", + "<5,52>": "", + "<5,53>": "", + "<5,54>": "", + "<5,55>": "OLE.Border", + "<5,56>": "None", + "<5,57>": "", + "<5,58>": "", + "<5,59>": "", + "<5,60>": "", + "<5,61>": "", + "<5,62>": "", + "<5,63>": "", + "<5,64>": "", + "<5,65>": "", + "<5,66>": "", + "<5,67>": "", + "<5,68>": "", + "<5,69>": "", + "<5,70>": "", + "<5,71>": "", + "<5,72>": "", + "<5,73>": "", + "<5,74>": "", + "<5,75>": "", + "<5,76>": "", + "<5,77>": "", + "<5,78>": "", + "<5,79>": "", + "<5,80>": "", + "<5,81>": "", + "<5,82>": "", + "<5,83>": "", + "<5,84>": "", + "<5,85>": "", + "<5,86>": "", + "<5,87>": "", + "<5,88>": "", + "<5,89>": "", + "<5,90>": "", + "<5,91>": "", + "<5,92>": "", + "<5,93>": "", + "<5,94>": "", + "<5,95>": "", + "<5,96>": "", + "<5,97>": "", + "<5,98>": "", + "<5,99>": "", + "<5,100>": "", + "<5,101>": "", + "<5,102>": "", + "<5,103>": "", + "<5,104>": "", + "<5,105>": "", + "<5,106>": "", + "<5,107>": "", + "<5,108>": "" }, "<6>": { "<6,1>": "OLE_POPUP", @@ -570,7 +1069,11 @@ "<6,11,2>": "0x80000000" }, "<6,12>": "6", - "<6,13>": "-2", + "<6,13>": { + "<6,13,1>": "-2", + "<6,13,2>": "-2", + "<6,13,3>": "" + }, "<6,14>": "0", "<6,15>": { "<6,15,1>": { @@ -599,22 +1102,90 @@ "<6,22>": "", "<6,23>": "", "<6,24>": "", - "<6,25>": "0", - "<6,26>": "0", + "<6,25>": "", + "<6,26>": "", "<6,27>": "", - "<6,28>": "<>", - "<6,29>": "<>", - "<6,30>": "<>", - "<6,31>": "0", - "<6,32>": { - "<6,32,1>": "0x7fffe", - "<6,32,2>": "0xf0016800" - }, + "<6,28>": "", + "<6,29>": "", + "<6,30>": "", + "<6,31>": "", + "<6,32>": "", "<6,33>": "", "<6,34>": "", "<6,35>": "", "<6,36>": "", - "<6,37>": "" + "<6,37>": "", + "<6,38>": "", + "<6,39>": "", + "<6,40>": "", + "<6,41>": "", + "<6,42>": "", + "<6,43>": "", + "<6,44>": "", + "<6,45>": "", + "<6,46>": "", + "<6,47>": "", + "<6,48>": "", + "<6,49>": "", + "<6,50>": "", + "<6,51>": "", + "<6,52>": "", + "<6,53>": "", + "<6,54>": "", + "<6,55>": "OLE.Border", + "<6,56>": "None", + "<6,57>": "", + "<6,58>": "", + "<6,59>": "", + "<6,60>": "", + "<6,61>": "", + "<6,62>": "", + "<6,63>": "", + "<6,64>": "", + "<6,65>": "", + "<6,66>": "", + "<6,67>": "", + "<6,68>": "", + "<6,69>": "", + "<6,70>": "", + "<6,71>": "", + "<6,72>": "", + "<6,73>": "", + "<6,74>": "", + "<6,75>": "", + "<6,76>": "", + "<6,77>": "", + "<6,78>": "", + "<6,79>": "", + "<6,80>": "", + "<6,81>": "", + "<6,82>": "", + "<6,83>": "", + "<6,84>": "", + "<6,85>": "", + "<6,86>": "", + "<6,87>": "", + "<6,88>": "", + "<6,89>": "", + "<6,90>": "", + "<6,91>": "", + "<6,92>": "", + "<6,93>": "", + "<6,94>": "", + "<6,95>": "", + "<6,96>": "", + "<6,97>": "", + "<6,98>": "", + "<6,99>": "", + "<6,100>": "", + "<6,101>": "", + "<6,102>": "", + "<6,103>": "", + "<6,104>": "", + "<6,105>": "", + "<6,106>": "", + "<6,107>": "", + "<6,108>": "" }, "<7>": { "<7,1>": "OLE_REPORT_LINE", @@ -635,7 +1206,11 @@ "<7,11,2>": "0x80000000" }, "<7,12>": "7", - "<7,13>": "-2", + "<7,13>": { + "<7,13,1>": "-2", + "<7,13,2>": "-2", + "<7,13,3>": "" + }, "<7,14>": "0", "<7,15>": { "<7,15,1>": { @@ -664,22 +1239,150 @@ "<7,22>": "", "<7,23>": "", "<7,24>": "", - "<7,25>": "0", - "<7,26>": "0", + "<7,25>": "", + "<7,26>": "", "<7,27>": "", - "<7,28>": "<>", - "<7,29>": "<>", - "<7,30>": "<>", - "<7,31>": "0", - "<7,32>": { - "<7,32,1>": "0x7fffe", - "<7,32,2>": "0xf0016c00" - }, + "<7,28>": "", + "<7,29>": "", + "<7,30>": "", + "<7,31>": "", + "<7,32>": "", "<7,33>": "", "<7,34>": "", "<7,35>": "", "<7,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF0744006900760069006400650072000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF00FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF0E5200650070006F0072007400200043006F006C0075006D006E007300FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0B430065006E00740065007200FEF04C00650066007400C7FFFFFF00000000000000000000000001000000", - "<7,37>": "" + "<7,37>": "", + "<7,38>": "", + "<7,39>": "", + "<7,40>": "", + "<7,41>": "", + "<7,42>": "", + "<7,43>": "", + "<7,44>": "", + "<7,45>": "", + "<7,46>": "", + "<7,47>": "", + "<7,48>": "", + "<7,49>": "", + "<7,50>": "", + "<7,51>": "", + "<7,52>": "", + "<7,53>": "", + "<7,54>": "", + "<7,55>": { + "<7,55,1>": "OLE.Animated", + "<7,55,2>": "OLE.AnimationDelay", + "<7,55,3>": "OLE.AutoLoadDropFile", + "<7,55,4>": "OLE.BackgroundColor", + "<7,55,5>": "OLE.BorderAlignment", + "<7,55,6>": "OLE.BorderType", + "<7,55,7>": "OLE.Caption", + "<7,55,8>": "OLE.CaptionColor", + "<7,55,9>": "OLE.CaptionHorzAlign", + "<7,55,10>": "OLE.CaptionHorzOffset", + "<7,55,11>": "OLE.CaptionVertAlign", + "<7,55,12>": "OLE.CaptionVertOffset", + "<7,55,13>": "OLE.ControlPart", + "<7,55,14>": "OLE.FontBold", + "<7,55,15>": "OLE.FontItalic", + "<7,55,16>": "OLE.FontName", + "<7,55,17>": "OLE.FontSize", + "<7,55,18>": "OLE.FontUnderlined", + "<7,55,19>": "OLE.Frame", + "<7,55,20>": "OLE.FrameCount", + "<7,55,21>": "OLE.HorzAlign", + "<7,55,22>": "OLE.Image", + "<7,55,23>": "OLE.ImageHorzOffset", + "<7,55,24>": "OLE.ImageVertOffset", + "<7,55,25>": "OLE.Layout", + "<7,55,26>": "OLE.ResizeUsingGDIPlus", + "<7,55,27>": "OLE.TransparentColor", + "<7,55,28>": "OLE.VertAlign", + "<7,55,29>": "OLE.Zoom" + }, + "<7,56>": { + "<7,56,1>": "0", + "<7,56,2>": "50", + "<7,56,3>": "0", + "<7,56,4>": "None", + "<7,56,5>": "All", + "<7,56,6>": "None", + "<7,56,7>": "Report Columns", + "<7,56,8>": "None", + "<7,56,9>": "Left", + "<7,56,10>": "-57", + "<7,56,11>": "Center", + "<7,56,12>": "0", + "<7,56,13>": "Divider", + "<7,56,14>": "0", + "<7,56,15>": "0", + "<7,56,16>": "Segoe UI", + "<7,56,17>": "8", + "<7,56,18>": "0", + "<7,56,19>": "1", + "<7,56,20>": "1", + "<7,56,21>": "Center", + "<7,56,22>": "", + "<7,56,23>": "0", + "<7,56,24>": "0", + "<7,56,25>": "Clip", + "<7,56,26>": "1", + "<7,56,27>": "Auto", + "<7,56,28>": "Center", + "<7,56,29>": "1" + }, + "<7,57>": "", + "<7,58>": "", + "<7,59>": "", + "<7,60>": "", + "<7,61>": "", + "<7,62>": "", + "<7,63>": "", + "<7,64>": "", + "<7,65>": "", + "<7,66>": "", + "<7,67>": "", + "<7,68>": "", + "<7,69>": "", + "<7,70>": "", + "<7,71>": "", + "<7,72>": "", + "<7,73>": "", + "<7,74>": "", + "<7,75>": "", + "<7,76>": "", + "<7,77>": "", + "<7,78>": "", + "<7,79>": "", + "<7,80>": "", + "<7,81>": "", + "<7,82>": "", + "<7,83>": "", + "<7,84>": "", + "<7,85>": "", + "<7,86>": "", + "<7,87>": "", + "<7,88>": "", + "<7,89>": "", + "<7,90>": "", + "<7,91>": "", + "<7,92>": "", + "<7,93>": "", + "<7,94>": "", + "<7,95>": "", + "<7,96>": "", + "<7,97>": "", + "<7,98>": "", + "<7,99>": "", + "<7,100>": "", + "<7,101>": "", + "<7,102>": "", + "<7,103>": "", + "<7,104>": "", + "<7,105>": "", + "<7,106>": "", + "<7,107>": "", + "<7,108>": "" }, "<8>": { "<8,1>": "OLE_PIC_LOC_FILTER", @@ -700,7 +1403,11 @@ "<8,11,2>": "0x80000000" }, "<8,12>": "8", - "<8,13>": "-2", + "<8,13>": { + "<8,13,1>": "-2", + "<8,13,2>": "-2", + "<8,13,3>": "" + }, "<8,14>": "0", "<8,15>": { "<8,15,1>": { @@ -729,22 +1436,150 @@ "<8,22>": "", "<8,23>": "", "<8,24>": "", - "<8,25>": "0", - "<8,26>": "0", + "<8,25>": "", + "<8,26>": "", "<8,27>": "", - "<8,28>": "<>", - "<8,29>": "<>", - "<8,30>": "<>", - "<8,31>": "0", - "<8,32>": { - "<8,32,1>": "0x7fffe", - "<8,32,2>": "0xf0016c00" - }, + "<8,28>": "", + "<8,29>": "", + "<8,30>": "", + "<8,31>": "", + "<8,32>": "", "<8,33>": "", "<8,34>": "", "<8,35>": "", "<8,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF0744006900760069006400650072000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF00FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF0F4C006F0063006100740069006F006E002000460069006C00740065007200FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0B430065006E00740065007200FEF04C0065006600740080FFFFFF00000000000000000000000001000000", - "<8,37>": "" + "<8,37>": "", + "<8,38>": "", + "<8,39>": "", + "<8,40>": "", + "<8,41>": "", + "<8,42>": "", + "<8,43>": "", + "<8,44>": "", + "<8,45>": "", + "<8,46>": "", + "<8,47>": "", + "<8,48>": "", + "<8,49>": "", + "<8,50>": "", + "<8,51>": "", + "<8,52>": "", + "<8,53>": "", + "<8,54>": "", + "<8,55>": { + "<8,55,1>": "OLE.Animated", + "<8,55,2>": "OLE.AnimationDelay", + "<8,55,3>": "OLE.AutoLoadDropFile", + "<8,55,4>": "OLE.BackgroundColor", + "<8,55,5>": "OLE.BorderAlignment", + "<8,55,6>": "OLE.BorderType", + "<8,55,7>": "OLE.Caption", + "<8,55,8>": "OLE.CaptionColor", + "<8,55,9>": "OLE.CaptionHorzAlign", + "<8,55,10>": "OLE.CaptionHorzOffset", + "<8,55,11>": "OLE.CaptionVertAlign", + "<8,55,12>": "OLE.CaptionVertOffset", + "<8,55,13>": "OLE.ControlPart", + "<8,55,14>": "OLE.FontBold", + "<8,55,15>": "OLE.FontItalic", + "<8,55,16>": "OLE.FontName", + "<8,55,17>": "OLE.FontSize", + "<8,55,18>": "OLE.FontUnderlined", + "<8,55,19>": "OLE.Frame", + "<8,55,20>": "OLE.FrameCount", + "<8,55,21>": "OLE.HorzAlign", + "<8,55,22>": "OLE.Image", + "<8,55,23>": "OLE.ImageHorzOffset", + "<8,55,24>": "OLE.ImageVertOffset", + "<8,55,25>": "OLE.Layout", + "<8,55,26>": "OLE.ResizeUsingGDIPlus", + "<8,55,27>": "OLE.TransparentColor", + "<8,55,28>": "OLE.VertAlign", + "<8,55,29>": "OLE.Zoom" + }, + "<8,56>": { + "<8,56,1>": "0", + "<8,56,2>": "50", + "<8,56,3>": "0", + "<8,56,4>": "None", + "<8,56,5>": "All", + "<8,56,6>": "None", + "<8,56,7>": "Location Filter", + "<8,56,8>": "None", + "<8,56,9>": "Left", + "<8,56,10>": "-128", + "<8,56,11>": "Center", + "<8,56,12>": "0", + "<8,56,13>": "Divider", + "<8,56,14>": "0", + "<8,56,15>": "0", + "<8,56,16>": "Segoe UI", + "<8,56,17>": "8", + "<8,56,18>": "0", + "<8,56,19>": "1", + "<8,56,20>": "1", + "<8,56,21>": "Center", + "<8,56,22>": "", + "<8,56,23>": "0", + "<8,56,24>": "0", + "<8,56,25>": "Clip", + "<8,56,26>": "1", + "<8,56,27>": "Auto", + "<8,56,28>": "Center", + "<8,56,29>": "1" + }, + "<8,57>": "", + "<8,58>": "", + "<8,59>": "", + "<8,60>": "", + "<8,61>": "", + "<8,62>": "", + "<8,63>": "", + "<8,64>": "", + "<8,65>": "", + "<8,66>": "", + "<8,67>": "", + "<8,68>": "", + "<8,69>": "", + "<8,70>": "", + "<8,71>": "", + "<8,72>": "", + "<8,73>": "", + "<8,74>": "", + "<8,75>": "", + "<8,76>": "", + "<8,77>": "", + "<8,78>": "", + "<8,79>": "", + "<8,80>": "", + "<8,81>": "", + "<8,82>": "", + "<8,83>": "", + "<8,84>": "", + "<8,85>": "", + "<8,86>": "", + "<8,87>": "", + "<8,88>": "", + "<8,89>": "", + "<8,90>": "", + "<8,91>": "", + "<8,92>": "", + "<8,93>": "", + "<8,94>": "", + "<8,95>": "", + "<8,96>": "", + "<8,97>": "", + "<8,98>": "", + "<8,99>": "", + "<8,100>": "", + "<8,101>": "", + "<8,102>": "", + "<8,103>": "", + "<8,104>": "", + "<8,105>": "", + "<8,106>": "", + "<8,107>": "", + "<8,108>": "" }, "<9>": { "<9,1>": "CHK_NO_MAT_FOUND", @@ -757,15 +1592,19 @@ "<9,8>": "21", "<9,9>": "Include No Material Found", "<9,10>": { - "<9,10,1>": "0x56000003", + "<9,10,1>": "0x56000103", "<9,10,2>": "0x0" }, "<9,11>": { - "<9,11,1>": "0x100", + "<9,11,1>": "0x0", "<9,11,2>": "0x80000000" }, "<9,12>": "9", - "<9,13>": "-1", + "<9,13>": { + "<9,13,1>": "-1", + "<9,13,2>": "-1", + "<9,13,3>": "" + }, "<9,14>": "0", "<9,15>": { "<9,15,1>": { @@ -803,30 +1642,32 @@ "<9,18,1,4,8>": "@PARAM6" }, "<9,18,1,5>": "", - "<9,18,1,6>": "" - }, - "<9,18,2>": "" - }, - "<9,19>": { - "<9,19,1>": "CLICK", - "<9,19,2>": "" + "<9,18,1,6>": "", + "<9,18,1,7>": "", + "<9,18,1,8>": "", + "<9,18,1,9>": "", + "<9,18,1,10>": "", + "<9,18,1,11>": "", + "<9,18,1,12>": "", + "<9,18,1,13>": "", + "<9,18,1,14>": "", + "<9,18,1,15>": "STPROC" + } }, + "<9,19>": "CLICK", "<9,20>": "", "<9,21>": "", "<9,22>": "", "<9,23>": "", "<9,24>": "", - "<9,25>": "0", - "<9,26>": "0", + "<9,25>": "", + "<9,26>": "", "<9,27>": "", - "<9,28>": "<>", - "<9,29>": "<>", - "<9,30>": "<>", - "<9,31>": "0", - "<9,32>": { - "<9,32,1>": "0x7fffe", - "<9,32,2>": "0xf0016408" - }, + "<9,28>": "", + "<9,29>": "", + "<9,30>": "", + "<9,31>": "", + "<9,32>": "", "<9,33>": "", "<9,34>": "", "<9,35>": "", @@ -834,7 +1675,7 @@ "<9,37>": "", "<9,38>": "", "<9,39>": "", - "<9,40>": "1", + "<9,40>": "", "<9,41>": "", "<9,42>": "", "<9,43>": "", @@ -845,7 +1686,77 @@ "<9,48>": "", "<9,49>": "", "<9,50>": "", - "<9,51>": "" + "<9,51>": "", + "<9,52>": "", + "<9,53>": "", + "<9,54>": "", + "<9,55>": "", + "<9,56>": "", + "<9,57>": "", + "<9,58>": "", + "<9,59>": "", + "<9,60>": "", + "<9,61>": "", + "<9,62>": "0", + "<9,63>": { + "<9,63,1>": "", + "<9,63,2>": "", + "<9,63,3>": "", + "<9,63,4>": "", + "<9,63,5>": "", + "<9,63,6>": "", + "<9,63,7>": "", + "<9,63,8>": "" + }, + "<9,64>": { + "<9,64,1>": "", + "<9,64,2>": "", + "<9,64,3>": "" + }, + "<9,65>": "-2", + "<9,66>": "", + "<9,67>": "", + "<9,68>": "", + "<9,69>": "", + "<9,70>": "", + "<9,71>": "", + "<9,72>": "", + "<9,73>": "", + "<9,74>": "", + "<9,75>": "", + "<9,76>": "", + "<9,77>": "", + "<9,78>": "", + "<9,79>": "", + "<9,80>": "", + "<9,81>": "", + "<9,82>": "", + "<9,83>": "", + "<9,84>": "", + "<9,85>": "", + "<9,86>": "", + "<9,87>": "", + "<9,88>": "", + "<9,89>": "", + "<9,90>": "0", + "<9,91>": "0", + "<9,92>": "", + "<9,93>": "", + "<9,94>": "", + "<9,95>": "", + "<9,96>": "", + "<9,97>": "", + "<9,98>": "", + "<9,99>": "", + "<9,100>": "", + "<9,101>": "", + "<9,102>": "", + "<9,103>": "", + "<9,104>": "", + "<9,105>": "", + "<9,106>": "", + "<9,107>": "", + "<9,108>": "" }, "<10>": { "<10,1>": "CHK_OLD_REPORT", @@ -858,15 +1769,19 @@ "<10,8>": "21", "<10,9>": "Old Report", "<10,10>": { - "<10,10,1>": "0x46000003", + "<10,10,1>": "0x46000103", "<10,10,2>": "0x0" }, "<10,11>": { - "<10,11,1>": "0x100", + "<10,11,1>": "0x0", "<10,11,2>": "0x80000000" }, "<10,12>": "10", - "<10,13>": "-1", + "<10,13>": { + "<10,13,1>": "-1", + "<10,13,2>": "-1", + "<10,13,3>": "" + }, "<10,14>": "0", "<10,15>": { "<10,15,1>": { @@ -904,30 +1819,32 @@ "<10,18,1,4,8>": "@PARAM6" }, "<10,18,1,5>": "", - "<10,18,1,6>": "" - }, - "<10,18,2>": "" - }, - "<10,19>": { - "<10,19,1>": "CLICK", - "<10,19,2>": "" + "<10,18,1,6>": "", + "<10,18,1,7>": "", + "<10,18,1,8>": "", + "<10,18,1,9>": "", + "<10,18,1,10>": "", + "<10,18,1,11>": "", + "<10,18,1,12>": "", + "<10,18,1,13>": "", + "<10,18,1,14>": "", + "<10,18,1,15>": "STPROC" + } }, + "<10,19>": "CLICK", "<10,20>": "", "<10,21>": "", "<10,22>": "", "<10,23>": "", "<10,24>": "", - "<10,25>": "0", - "<10,26>": "0", + "<10,25>": "", + "<10,26>": "", "<10,27>": "", - "<10,28>": "<>", - "<10,29>": "<>", - "<10,30>": "<>", - "<10,31>": "0", - "<10,32>": { - "<10,32,1>": "0x7fffe", - "<10,32,2>": "0xf0016008" - }, + "<10,28>": "", + "<10,29>": "", + "<10,30>": "", + "<10,31>": "", + "<10,32>": "", "<10,33>": "", "<10,34>": "", "<10,35>": "", @@ -935,7 +1852,7 @@ "<10,37>": "", "<10,38>": "", "<10,39>": "", - "<10,40>": "0", + "<10,40>": "", "<10,41>": "", "<10,42>": "", "<10,43>": "", @@ -946,18 +1863,81 @@ "<10,48>": "", "<10,49>": "", "<10,50>": "", - "<10,51>": "" - }, - "<11>": "" + "<10,51>": "", + "<10,52>": "", + "<10,53>": "", + "<10,54>": "", + "<10,55>": "", + "<10,56>": "", + "<10,57>": "", + "<10,58>": "", + "<10,59>": "", + "<10,60>": "", + "<10,61>": "", + "<10,62>": "0", + "<10,63>": { + "<10,63,1>": "", + "<10,63,2>": "", + "<10,63,3>": "", + "<10,63,4>": "", + "<10,63,5>": "", + "<10,63,6>": "", + "<10,63,7>": "", + "<10,63,8>": "" + }, + "<10,64>": { + "<10,64,1>": "", + "<10,64,2>": "", + "<10,64,3>": "" + }, + "<10,65>": "-2", + "<10,66>": "", + "<10,67>": "", + "<10,68>": "", + "<10,69>": "", + "<10,70>": "", + "<10,71>": "", + "<10,72>": "", + "<10,73>": "", + "<10,74>": "", + "<10,75>": "", + "<10,76>": "", + "<10,77>": "", + "<10,78>": "", + "<10,79>": "", + "<10,80>": "", + "<10,81>": "", + "<10,82>": "", + "<10,83>": "", + "<10,84>": "", + "<10,85>": "", + "<10,86>": "", + "<10,87>": "", + "<10,88>": "", + "<10,89>": "", + "<10,90>": "0", + "<10,91>": "0", + "<10,92>": "", + "<10,93>": "", + "<10,94>": "", + "<10,95>": "", + "<10,96>": "", + "<10,97>": "", + "<10,98>": "", + "<10,99>": "", + "<10,100>": "", + "<10,101>": "", + "<10,102>": "", + "<10,103>": "", + "<10,104>": "", + "<10,105>": "", + "<10,106>": "", + "<10,107>": "", + "<10,108>": "" + } }, "record4": { - "<1>": "", - "<2>": { - "<2,1>": "", - "<2,2>": "", - "<2,3>": "", - "<2,4>": "0" - } + "<1>": "" } } } \ No newline at end of file diff --git a/LSL2/OIWIN/NDW_MATERIAL_TRACK_REPORT.json b/LSL2/OIWIN/NDW_MATERIAL_TRACK_REPORT.json deleted file mode 100644 index e06f082..0000000 --- a/LSL2/OIWIN/NDW_MATERIAL_TRACK_REPORT.json +++ /dev/null @@ -1,761 +0,0 @@ -{ - "header": { - "version": 1, - "type": "record" - }, - "body": { - "record1": { - "<1>": "1010", - "<2>": "8", - "<3>": "" - }, - "record2": { - "<1>": { - "<1,1>": "NDW_MATERIAL_TRACK_REPORT", - "<1,2>": "", - "<1,3>": "WINDOW", - "<1,4>": "", - "<1,5>": "395", - "<1,6>": "241", - "<1,7>": "-578", - "<1,8>": "-318", - "<1,9>": "Material Track Report", - "<1,10>": { - "<1,10,1>": "0x84C80000", - "<1,10,2>": "0x0" - }, - "<1,11>": { - "<1,11,1>": "0x0", - "<1,11,2>": "0x80000000" - }, - "<1,12>": "0", - "<1,13>": "-2", - "<1,14>": "0", - "<1,15>": "", - "<1,16>": "", - "<1,17>": "", - "<1,18>": { - "<1,18,1>": { - "<1,18,1,1>": "R", - "<1,18,1,2>": "EXECUTE", - "<1,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", - "<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,2>": "" - }, - "<1,19>": { - "<1,19,1>": "CREATE", - "<1,19,2>": "" - }, - "<1,20>": "", - "<1,21>": "", - "<1,22>": "", - "<1,23>": "", - "<1,24>": { - "<1,24,1>": "0", - "<1,24,2>": "0", - "<1,24,3>": "0", - "<1,24,4>": "0", - "<1,24,5>": "0", - "<1,24,6>": "0" - }, - "<1,25>": "0", - "<1,26>": "0", - "<1,27>": "", - "<1,28>": "", - "<1,29>": "", - "<1,30>": "", - "<1,31>": "", - "<1,32>": { - "<1,32,1>": "0x7FFFE", - "<1,32,2>": "0xF001E808" - }, - "<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,38,1>": "1", - "<1,38,2>": "1" - }, - "<1,39>": "", - "<1,40>": "0", - "<1,41>": "", - "<1,42>": "", - "<1,43>": "", - "<1,44>": "", - "<1,45>": "", - "<1,46>": "", - "<1,47>": "", - "<1,48>": "", - "<1,49>": "", - "<1,50>": "", - "<1,51>": "", - "<1,52>": "" - } - }, - "record3": { - "<1>": { - "<1,1>": "OLE_EDT_COL_FILTER", - "<1,2>": "", - "<1,3>": "OLECONTROL.SRP.Edittable.1", - "<1,4>": "NDW_MATERIAL_TRACK_REPORT", - "<1,5>": "13", - "<1,6>": "30", - "<1,7>": "200", - "<1,8>": "276", - "<1,9>": "SRP.Edittable.1", - "<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>": "-2", - "<1,14>": "0", - "<1,15>": { - "<1,15,1>": { - "<1,15,1,1>": "Segoe UI", - "<1,15,1,2>": "-12", - "<1,15,1,3>": "400", - "<1,15,1,4>": "0", - "<1,15,1,5>": "0", - "<1,15,1,6>": "0", - "<1,15,1,7>": "0", - "<1,15,1,8>": "34", - "<1,15,1,9>": "0", - "<1,15,1,10>": "3", - "<1,15,1,11>": "2", - "<1,15,1,12>": "1", - "<1,15,1,13>": "0", - "<1,15,1,14>": "0" - } - }, - "<1,16>": "", - "<1,17>": "", - "<1,18>": { - "<1,18,1>": { - "<1,18,1,1>": "R", - "<1,18,1,2>": "EXECUTE", - "<1,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", - "<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,2>": "" - }, - "<1,19>": { - "<1,19,1>": "OLE", - "<1,19,2>": "" - }, - "<1,20>": "", - "<1,21>": "", - "<1,22>": "", - "<1,23>": "", - "<1,24>": "", - "<1,25>": "0", - "<1,26>": "0", - "<1,27>": "", - "<1,28>": "<>", - "<1,29>": "<>", - "<1,30>": "<>", - "<1,31>": "0", - "<1,32>": { - "<1,32,1>": "0x7fffe", - "<1,32,2>": "0xf0016400" - }, - "<1,33>": "", - "<1,34>": "", - "<1,35>": "", - "<1,36>": "0000000000000000", - "<1,37>": "" - }, - "<2>": { - "<2,1>": "OLE_EDT_LOC_FILTER", - "<2,2>": "", - "<2,3>": "OLECONTROL.SRP.Edittable.1", - "<2,4>": "NDW_MATERIAL_TRACK_REPORT", - "<2,5>": "231", - "<2,6>": "31", - "<2,7>": "335", - "<2,8>": "180", - "<2,9>": "SRP.Edittable.1", - "<2,10>": { - "<2,10,1>": "0x56000000", - "<2,10,2>": "0x0" - }, - "<2,11>": { - "<2,11,1>": "0x0", - "<2,11,2>": "0x80000000" - }, - "<2,12>": "2", - "<2,13>": "-2", - "<2,14>": "0", - "<2,15>": { - "<2,15,1>": { - "<2,15,1,1>": "Segoe UI", - "<2,15,1,2>": "-12", - "<2,15,1,3>": "400", - "<2,15,1,4>": "0", - "<2,15,1,5>": "0", - "<2,15,1,6>": "0", - "<2,15,1,7>": "0", - "<2,15,1,8>": "34", - "<2,15,1,9>": "0", - "<2,15,1,10>": "3", - "<2,15,1,11>": "2", - "<2,15,1,12>": "1", - "<2,15,1,13>": "0", - "<2,15,1,14>": "0" - } - }, - "<2,16>": "", - "<2,17>": "", - "<2,18>": { - "<2,18,1>": { - "<2,18,1,1>": "R", - "<2,18,1,2>": "EXECUTE", - "<2,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", - "<2,18,1,4>": { - "<2,18,1,4,1>": "@SELF", - "<2,18,1,4,2>": "@EVENT", - "<2,18,1,4,3>": "@PARAM1", - "<2,18,1,4,4>": "@PARAM2", - "<2,18,1,4,5>": "@PARAM3", - "<2,18,1,4,6>": "@PARAM4", - "<2,18,1,4,7>": "@PARAM5", - "<2,18,1,4,8>": "@PARAM6" - }, - "<2,18,1,5>": "", - "<2,18,1,6>": "" - }, - "<2,18,2>": "" - }, - "<2,19>": { - "<2,19,1>": "OLE", - "<2,19,2>": "" - }, - "<2,20>": "", - "<2,21>": "", - "<2,22>": "", - "<2,23>": "", - "<2,24>": "", - "<2,25>": "0", - "<2,26>": "0", - "<2,27>": "", - "<2,28>": "<>", - "<2,29>": "<>", - "<2,30>": "<>", - "<2,31>": "0", - "<2,32>": { - "<2,32,1>": "0x7fffe", - "<2,32,2>": "0xf0016c00" - }, - "<2,33>": "", - "<2,34>": "", - "<2,35>": "", - "<2,36>": "0000000000000000", - "<2,37>": "" - }, - "<3>": { - "<3,1>": "PUB_GEN_REPORT", - "<3,2>": "", - "<3,3>": "PUSHBUTTON", - "<3,4>": "NDW_MATERIAL_TRACK_REPORT", - "<3,5>": "464", - "<3,6>": "279", - "<3,7>": "106", - "<3,8>": "27", - "<3,9>": "&Generate Report\r\n", - "<3,10>": { - "<3,10,1>": "0x56002000", - "<3,10,2>": "0x0" - }, - "<3,11>": { - "<3,11,1>": "0x100", - "<3,11,2>": "0x80000000" - }, - "<3,12>": "3", - "<3,13>": "-2", - "<3,14>": "0", - "<3,15>": { - "<3,15,1>": { - "<3,15,1,1>": "Segoe UI", - "<3,15,1,2>": "-12", - "<3,15,1,3>": "400", - "<3,15,1,4>": "0", - "<3,15,1,5>": "0", - "<3,15,1,6>": "0", - "<3,15,1,7>": "0", - "<3,15,1,8>": "34", - "<3,15,1,9>": "0", - "<3,15,1,10>": "3", - "<3,15,1,11>": "2", - "<3,15,1,12>": "1", - "<3,15,1,13>": "0", - "<3,15,1,14>": "0" - } - }, - "<3,16>": "", - "<3,17>": "", - "<3,18>": { - "<3,18,1>": { - "<3,18,1,1>": "R", - "<3,18,1,2>": "EXECUTE", - "<3,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", - "<3,18,1,4>": { - "<3,18,1,4,1>": "@SELF", - "<3,18,1,4,2>": "@EVENT", - "<3,18,1,4,3>": "@PARAM1", - "<3,18,1,4,4>": "@PARAM2", - "<3,18,1,4,5>": "@PARAM3", - "<3,18,1,4,6>": "@PARAM4", - "<3,18,1,4,7>": "@PARAM5", - "<3,18,1,4,8>": "@PARAM6" - }, - "<3,18,1,5>": "", - "<3,18,1,6>": "" - }, - "<3,18,2>": "" - }, - "<3,19>": { - "<3,19,1>": "CLICK", - "<3,19,2>": "" - }, - "<3,20>": "", - "<3,21>": "", - "<3,22>": "", - "<3,23>": "", - "<3,24>": "", - "<3,25>": "0", - "<3,26>": "0", - "<3,27>": "", - "<3,28>": "<>", - "<3,29>": "<>", - "<3,30>": "<>", - "<3,31>": "0", - "<3,32>": { - "<3,32,1>": "0x7fffe", - "<3,32,2>": "0xf0016008" - }, - "<3,33>": "", - "<3,34>": "", - "<3,35>": "", - "<3,36>": "", - "<3,37>": "", - "<3,38>": "", - "<3,39>": "", - "<3,40>": "1", - "<3,41>": "", - "<3,42>": "", - "<3,43>": "", - "<3,44>": "", - "<3,45>": "", - "<3,46>": "", - "<3,47>": "", - "<3,48>": "", - "<3,49>": "", - "<3,50>": "", - "<3,51>": "" - }, - "<4>": { - "<4,1>": "PUB_SAVE_SETTINGS", - "<4,2>": "", - "<4,3>": "PUSHBUTTON", - "<4,4>": "NDW_MATERIAL_TRACK_REPORT", - "<4,5>": "350", - "<4,6>": "279", - "<4,7>": "106", - "<4,8>": "27", - "<4,9>": "&Save Settings", - "<4,10>": { - "<4,10,1>": "0x56002000", - "<4,10,2>": "0x0" - }, - "<4,11>": { - "<4,11,1>": "0x100", - "<4,11,2>": "0x80000000" - }, - "<4,12>": "4", - "<4,13>": "-2", - "<4,14>": "0", - "<4,15>": { - "<4,15,1>": { - "<4,15,1,1>": "Segoe UI", - "<4,15,1,2>": "-12", - "<4,15,1,3>": "400", - "<4,15,1,4>": "0", - "<4,15,1,5>": "0", - "<4,15,1,6>": "0", - "<4,15,1,7>": "0", - "<4,15,1,8>": "34", - "<4,15,1,9>": "0", - "<4,15,1,10>": "3", - "<4,15,1,11>": "2", - "<4,15,1,12>": "1", - "<4,15,1,13>": "0", - "<4,15,1,14>": "0" - } - }, - "<4,16>": "", - "<4,17>": "", - "<4,18>": { - "<4,18,1>": { - "<4,18,1,1>": "R", - "<4,18,1,2>": "EXECUTE", - "<4,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", - "<4,18,1,4>": { - "<4,18,1,4,1>": "@SELF", - "<4,18,1,4,2>": "@EVENT", - "<4,18,1,4,3>": "@PARAM1", - "<4,18,1,4,4>": "@PARAM2", - "<4,18,1,4,5>": "@PARAM3", - "<4,18,1,4,6>": "@PARAM4", - "<4,18,1,4,7>": "@PARAM5", - "<4,18,1,4,8>": "@PARAM6" - }, - "<4,18,1,5>": "", - "<4,18,1,6>": "" - }, - "<4,18,2>": "" - }, - "<4,19>": { - "<4,19,1>": "CLICK", - "<4,19,2>": "" - }, - "<4,20>": "", - "<4,21>": "", - "<4,22>": "", - "<4,23>": "", - "<4,24>": "", - "<4,25>": "0", - "<4,26>": "0", - "<4,27>": "", - "<4,28>": "<>", - "<4,29>": "<>", - "<4,30>": "<>", - "<4,31>": "0", - "<4,32>": { - "<4,32,1>": "0x7fffe", - "<4,32,2>": "0xf0016008" - }, - "<4,33>": "", - "<4,34>": "", - "<4,35>": "", - "<4,36>": "", - "<4,37>": "", - "<4,38>": "", - "<4,39>": "", - "<4,40>": "1", - "<4,41>": "", - "<4,42>": "", - "<4,43>": "", - "<4,44>": "", - "<4,45>": "", - "<4,46>": "", - "<4,47>": "", - "<4,48>": "", - "<4,49>": "", - "<4,50>": "", - "<4,51>": "" - }, - "<5>": { - "<5,1>": "OLE_SUBCLASS", - "<5,2>": "", - "<5,3>": "OLECONTROL.SRP.Subclass.1", - "<5,4>": "NDW_MATERIAL_TRACK_REPORT", - "<5,5>": "38", - "<5,6>": "0", - "<5,7>": "116", - "<5,8>": "28", - "<5,9>": "SRP.Subclass.1", - "<5,10>": { - "<5,10,1>": "0x46000000", - "<5,10,2>": "0x0" - }, - "<5,11>": { - "<5,11,1>": "0x0", - "<5,11,2>": "0x80000000" - }, - "<5,12>": "5", - "<5,13>": "-2", - "<5,14>": "0", - "<5,15>": { - "<5,15,1>": { - "<5,15,1,1>": "Segoe UI", - "<5,15,1,2>": "-12", - "<5,15,1,3>": "400", - "<5,15,1,4>": "0", - "<5,15,1,5>": "0", - "<5,15,1,6>": "0", - "<5,15,1,7>": "0", - "<5,15,1,8>": "34", - "<5,15,1,9>": "0", - "<5,15,1,10>": "3", - "<5,15,1,11>": "2", - "<5,15,1,12>": "1", - "<5,15,1,13>": "0", - "<5,15,1,14>": "0" - } - }, - "<5,16>": "", - "<5,17>": "", - "<5,18>": "", - "<5,19>": "", - "<5,20>": "", - "<5,21>": "", - "<5,22>": "", - "<5,23>": "", - "<5,24>": "", - "<5,25>": "0", - "<5,26>": "0", - "<5,27>": "", - "<5,28>": "<>", - "<5,29>": "<>", - "<5,30>": "<>", - "<5,31>": "0", - "<5,32>": { - "<5,32,1>": "0x7fffe", - "<5,32,2>": "0xf0016800" - }, - "<5,33>": "", - "<5,34>": "", - "<5,35>": "", - "<5,36>": "", - "<5,37>": "" - }, - "<6>": { - "<6,1>": "OLE_POPUP", - "<6,2>": "", - "<6,3>": "OLECONTROL.SRP.Popup.1", - "<6,4>": "NDW_MATERIAL_TRACK_REPORT", - "<6,5>": "158", - "<6,6>": "0", - "<6,7>": "116", - "<6,8>": "28", - "<6,9>": "SRP.Popup.1", - "<6,10>": { - "<6,10,1>": "0x46000000", - "<6,10,2>": "0x0" - }, - "<6,11>": { - "<6,11,1>": "0x0", - "<6,11,2>": "0x80000000" - }, - "<6,12>": "6", - "<6,13>": "-2", - "<6,14>": "0", - "<6,15>": { - "<6,15,1>": { - "<6,15,1,1>": "Segoe UI", - "<6,15,1,2>": "-12", - "<6,15,1,3>": "400", - "<6,15,1,4>": "0", - "<6,15,1,5>": "0", - "<6,15,1,6>": "0", - "<6,15,1,7>": "0", - "<6,15,1,8>": "34", - "<6,15,1,9>": "0", - "<6,15,1,10>": "3", - "<6,15,1,11>": "2", - "<6,15,1,12>": "1", - "<6,15,1,13>": "0", - "<6,15,1,14>": "0" - } - }, - "<6,16>": "", - "<6,17>": "", - "<6,18>": "", - "<6,19>": "", - "<6,20>": "", - "<6,21>": "", - "<6,22>": "", - "<6,23>": "", - "<6,24>": "", - "<6,25>": "0", - "<6,26>": "0", - "<6,27>": "", - "<6,28>": "<>", - "<6,29>": "<>", - "<6,30>": "<>", - "<6,31>": "0", - "<6,32>": { - "<6,32,1>": "0x7fffe", - "<6,32,2>": "0xf0016800" - }, - "<6,33>": "", - "<6,34>": "", - "<6,35>": "", - "<6,36>": "", - "<6,37>": "" - }, - "<7>": { - "<7,1>": "OLE_REPORT_LINE", - "<7,2>": "", - "<7,3>": "OLECONTROL.SRP.Picture.1", - "<7,4>": "NDW_MATERIAL_TRACK_REPORT", - "<7,5>": "12", - "<7,6>": "9", - "<7,7>": "202", - "<7,8>": "13", - "<7,9>": "SRP.Picture.1", - "<7,10>": { - "<7,10,1>": "0x56000000", - "<7,10,2>": "0x0" - }, - "<7,11>": { - "<7,11,1>": "0x0", - "<7,11,2>": "0x80000000" - }, - "<7,12>": "7", - "<7,13>": "-2", - "<7,14>": "0", - "<7,15>": { - "<7,15,1>": { - "<7,15,1,1>": "Segoe UI", - "<7,15,1,2>": "-12", - "<7,15,1,3>": "400", - "<7,15,1,4>": "0", - "<7,15,1,5>": "0", - "<7,15,1,6>": "0", - "<7,15,1,7>": "0", - "<7,15,1,8>": "34", - "<7,15,1,9>": "0", - "<7,15,1,10>": "3", - "<7,15,1,11>": "2", - "<7,15,1,12>": "1", - "<7,15,1,13>": "0", - "<7,15,1,14>": "0" - } - }, - "<7,16>": "", - "<7,17>": "", - "<7,18>": "", - "<7,19>": "", - "<7,20>": "", - "<7,21>": "", - "<7,22>": "", - "<7,23>": "", - "<7,24>": "", - "<7,25>": "0", - "<7,26>": "0", - "<7,27>": "", - "<7,28>": "<>", - "<7,29>": "<>", - "<7,30>": "<>", - "<7,31>": "0", - "<7,32>": { - "<7,32,1>": "0x7fffe", - "<7,32,2>": "0xf0016c00" - }, - "<7,33>": "", - "<7,34>": "", - "<7,35>": "", - "<7,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF0744006900760069006400650072000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF00FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF0E5200650070006F0072007400200043006F006C0075006D006E007300FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0B430065006E00740065007200FEF04C00650066007400C7FFFFFF00000000000000000000000001000000", - "<7,37>": "" - }, - "<8>": { - "<8,1>": "OLE_PIC_LOC_FILTER", - "<8,2>": "", - "<8,3>": "OLECONTROL.SRP.Picture.1", - "<8,4>": "NDW_MATERIAL_TRACK_REPORT", - "<8,5>": "228", - "<8,6>": "9", - "<8,7>": "338", - "<8,8>": "13", - "<8,9>": "SRP.Picture.1", - "<8,10>": { - "<8,10,1>": "0x56000000", - "<8,10,2>": "0x0" - }, - "<8,11>": { - "<8,11,1>": "0x0", - "<8,11,2>": "0x80000000" - }, - "<8,12>": "8", - "<8,13>": "-2", - "<8,14>": "0", - "<8,15>": { - "<8,15,1>": { - "<8,15,1,1>": "Segoe UI", - "<8,15,1,2>": "-12", - "<8,15,1,3>": "400", - "<8,15,1,4>": "0", - "<8,15,1,5>": "0", - "<8,15,1,6>": "0", - "<8,15,1,7>": "0", - "<8,15,1,8>": "34", - "<8,15,1,9>": "0", - "<8,15,1,10>": "3", - "<8,15,1,11>": "2", - "<8,15,1,12>": "1", - "<8,15,1,13>": "0", - "<8,15,1,14>": "0" - } - }, - "<8,16>": "", - "<8,17>": "", - "<8,18>": "", - "<8,19>": "", - "<8,20>": "", - "<8,21>": "", - "<8,22>": "", - "<8,23>": "", - "<8,24>": "", - "<8,25>": "0", - "<8,26>": "0", - "<8,27>": "", - "<8,28>": "<>", - "<8,29>": "<>", - "<8,30>": "<>", - "<8,31>": "0", - "<8,32>": { - "<8,32,1>": "0x7fffe", - "<8,32,2>": "0xf0016c00" - }, - "<8,33>": "", - "<8,34>": "", - "<8,35>": "", - "<8,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF0744006900760069006400650072000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF00FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF0F4C006F0063006100740069006F006E002000460069006C00740065007200FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0B430065006E00740065007200FEF04C006500660074007EFFFFFF00000000000000000000000001000000", - "<8,37>": "" - }, - "<9>": "" - }, - "record4": { - "<1>": "", - "<2>": { - "<2,1>": "", - "<2,2>": "", - "<2,3>": "", - "<2,4>": "0" - } - } - } -} \ No newline at end of file diff --git a/LSL2/STPROC/CONFIG_API.txt b/LSL2/STPROC/CONFIG_API.txt index eed142f..aabcd67 100644 --- a/LSL2/STPROC/CONFIG_API.txt +++ b/LSL2/STPROC/CONFIG_API.txt @@ -78,6 +78,8 @@ API config.ID.PUT end If Key EQ 'userID' then CurrUser = Field(Cookie, '=', 2) + end else + If OIWizardID NE '' then CurrUser = Xlate('OI_WIZARD', OIWizardID, 'EMPLOYEE_ID', 'X') end Next Cookie @@ -109,7 +111,23 @@ CreateHALItem: Begin Case Case ConfigID _EQC 'OEE' - JSONResponse = Config_Services('GetOEE', FullEndpointURL) + JSONResponse = Config_Services('GetOEE', FullEndpointURL) + Case ConfigID _EQC 'MaterialTrack' + OIWizardID = '' + CurrUser = '' + Cookies = HTTP_Services('GetHTTPCookie') + For each Cookie in Cookies using ';' + Key = Trim(Field(Cookie, '=', 1)) + If Key EQ 'sessionID' then + OIWizardID = Field(Cookie, '=', 2) + end + If Key EQ 'userID' then + CurrUser = Field(Cookie, '=', 2) + end else + If OIWizardID NE '' then CurrUser = Xlate('OI_WIZARD', OIWizardID, 'EMPLOYEE_ID', 'X') + end + Next Cookie + JSONResponse = Config_Services('GetMaterialTrackSettings', CurrUser) Case Otherwise$ Error_Services('Add', 'Unsupported configID') End Case @@ -166,6 +184,17 @@ UpdateHALItem: end else Error_Services('Add', 'User is not authorized to update OEE setpoints.') end + Case ConfigID _EQC 'MaterialTrack' + // The resource will have been put into the POST string. + Body = HTTP_Services('GetHTTPPostString') + If Body NE '' then + // The POST string will have been encoded so use percent (URL) decoding. + MtSettingsJson = HTTP_Services('DecodePercentString', Body) + Config_Services('UpdateMaterialTrackSettings', MtSettingsJson, CurrUser) + end else + Error_Services('Add', 'No body was sent with the request.') + end + Case Otherwise$ Error_Services('Add', 'Unsupported configID') End Case @@ -184,3 +213,4 @@ UpdateHALItem: end return + diff --git a/LSL2/STPROC/CONFIG_SERVICES.txt b/LSL2/STPROC/CONFIG_SERVICES.txt index 03eea6b..515d78f 100644 --- a/LSL2/STPROC/CONFIG_SERVICES.txt +++ b/LSL2/STPROC/CONFIG_SERVICES.txt @@ -130,3 +130,29 @@ Service UpdateOEE(OEEjson) end service +Service GetMaterialTrackSettings(UserId) + + Response = '' + If (UserId NE '') then + RepUserId = UserId + Convert @Lower.Case to @Upper.Case in RepUserId + Response = Database_Services('ReadDataRow', 'REPORT_CONFIG', 'MATERIAL_TRACK_WEB*':RepUserId) + end else + Error_Services('Add', 'Error in ':Service:' service. Null UserId passed into service.') + end + +end service + + +Service UpdateMaterialTrackSettings(MtSettingsJson, UserId) + + If ( (MtSettingsJson NE '') and (UserId NE '') ) then + RepUserId = UserId + Convert @Lower.Case to @Upper.Case in RepUserId + Database_Services('WriteDataRow', 'REPORT_CONFIG', 'MATERIAL_TRACK_WEB*':RepUserId, MtSettingsJson) + end else + Error_Services('Add', 'Error in ':Service:' service. Null MtSettingsJson or UserId passed into service.') + end + +end service + diff --git a/LSL2/STPROC/NDW_MATERIAL_TRACK_PRO_REPORT_EVENTS.txt b/LSL2/STPROC/NDW_MATERIAL_TRACK_PRO_REPORT_EVENTS.txt index 0801d12..effd5f2 100644 --- a/LSL2/STPROC/NDW_MATERIAL_TRACK_PRO_REPORT_EVENTS.txt +++ b/LSL2/STPROC/NDW_MATERIAL_TRACK_PRO_REPORT_EVENTS.txt @@ -49,8 +49,7 @@ Compile function NDW_MATERIAL_TRACK_PRO_REPORT_EVENTS(CtrlEntId, Event, @PARAMS) #window NDW_MATERIAL_TRACK_PRO_REPORT Declare function Form_Services, Database_Services, RTI_Task_Submit, RTI_Task_Status, MemberOf -Declare subroutine SRP_Show_Window, Send_Message, Set_Property, Report_Services_Dev, Database_Services, Material_Track -Declare subroutine Report_Services_Dev2, Report_Services_Dev5 +Declare subroutine SRP_Show_Window, Send_Message, Set_Property, Database_Services, Material_Track, Report_Services $Insert EVENT_SETUP $Insert LOGICAL @@ -129,25 +128,8 @@ Event PUB_GEN_REPORT.CLICK() If LocationEnabled then RptLocations<0, -1> = Location Next Location -* Report_Services_Dev5('GetMaterialTrackReport', RptColumns, RptLocations, NoMatFlag) - - - Begin Case - Case OldReport - Report_Services_Dev('GetMaterialTrackReport', RptColumns, RptLocations, NoMatFlag) - Case Otherwise$ - Report_Services_Dev5('GetMaterialTrackReport', RptColumns, RptLocations, NoMatFlag) - End Case + Report_Services('PrintMaterialTrackReport', RptColumns, RptLocations, NoMatFlag, OldReport) -* Begin Case -* Case DevReport -* Report_Services_Dev5('GetMaterialTrackReport', RptColumns, RptLocations, NoMatFlag) -* Case @User4 EQ 'JUSTIN_H' or @User4 EQ 'DANIEL_ST' -* Report_Services_Dev2('GetMaterialTrackReport', RptColumns, RptLocations, NoMatFlag) -* Case Otherwise$ -* Report_Services_Dev('GetMaterialTrackReport', RptColumns, RptLocations, NoMatFlag) -* End Case - end event @@ -438,4 +420,3 @@ EnableReportColumns: return - diff --git a/LSL2/STPROC/NDW_MATERIAL_TRACK_REPORT_EVENTS.txt b/LSL2/STPROC/NDW_MATERIAL_TRACK_REPORT_EVENTS.txt deleted file mode 100644 index cf3b330..0000000 --- a/LSL2/STPROC/NDW_MATERIAL_TRACK_REPORT_EVENTS.txt +++ /dev/null @@ -1,422 +0,0 @@ -Compile function NDW_MATERIAL_TRACK_REPORT_EVENTS(CtrlEntId, Event, @PARAMS) -/*********************************************************************************************************************** - - Name : NDW_MATERIAL_TRACK_EVENTS - - Description : Commuter module for the NDW_MATERIAL_TRACK_EVENTS form. - - Notes : Application errors should be logged using the Error Services module. There are a few methodological - assumptions built into way errors are managed which are important to understand in order to properly - work with Error Services: - - - The term 'top' refers to the originating procedure of a call stack and the term 'bottom' refers to - the last routine (or the current routine) within a call stack. Within the OpenInsight Debugger - this will appear backwards since the originating procedure always appears at the bottom of the - list and the current routine appears at the top of the list. We are using this orientation because - it is common to refer to the process of calling other procedures as 'drilling down'. - - - The reason for defining the orientation of the call stack is because Error_Services allows for - multiple error conditions to be appended to an original error. In most cases this will happen when - a procedure at the bottom of the stack generates an error condition and then returns to its - calling procedure. This higher level procedure can optionally add more information relevant to - itself. This continues as the call stack 'bubbles' its way back to the top to where the - originating procedure is waiting. - - - Native OpenInsight commands that handle errors (e.g., Set_Status, Set_FSError, Set_EventStatus) - preserve their error state until explicitly cleared. This can hinder the normal execution of code - since subsequent procedures (usually SSPs) will fail if a pre-existing error condition exists. - Our philosophy is that error conditions should automatically be cleared before a new procedure - is executed to avoid this problem. However, the nature of Basic+ does not make this easy to - automate for any given stored procedure. Therefore, if a stored procedure wants to conform to our - philosophy then it should include a call into the 'Clear' service request at the top of the - program. Alternatively this can be done through a common insert (see SERVICE_SETUP for example.) - - - Service modules will use the SERVICE_SETUP insert and therefore automatically clear out any - error conditions that were set before. - - Parameters : - Service [in] -- Name of the service being requested - Param1-10 [in/out] -- Additional request parameter holders - Response [out] -- Response to be sent back to the Controller (MCP) or requesting procedure - - Metadata : - - History : (Date, Initials, Notes) - 10/29/20 djs Original programmer. - -***********************************************************************************************************************/ -#pragma precomp SRP_PreCompiler -#window NDW_MATERIAL_TRACK_REPORT - -Declare function Form_Services, Database_Services, RTI_Task_Submit, RTI_Task_Status -Declare subroutine SRP_Show_Window, Send_Message, Set_Property, Report_Services, Database_Services, Material_Track - -$Insert EVENT_SETUP -$Insert LOGICAL -$Insert REPORT_CONFIG_EQUATES - -SubclassInfo = Form_Services('FindSubclassControl') -Subclass = SubclassInfo<1> - -// Update the arguments so that the OpenInsight OLE event will treate the ActiveX event as a native event handler. -If Event EQ 'OLE' then - Transfer Event to OIEvent - Transfer Param1 to Event - Transfer Param2 to Param1 - Transfer Param3 to Param2 - Transfer Param4 to Param3 - Transfer Param5 to Param4 - Transfer Param6 to Param5 - Transfer Param7 to Param6 - Transfer Param8 to Param7 -end - -GoToEvent Event for CtrlEntId else - // Event not implemented -end - -Return EventFlow or 1 - -//----------------------------------------------------------------------------- -// EVENT HANDLERS -//----------------------------------------------------------------------------- - -Event WINDOW.CREATE(CreateParam) - - RptConfigKey = 'MATERIAL_TRACK*':@User4 - If RowExists('REPORT_CONFIG', RptConfigKey) then - UserSettings = Database_Services('ReadDataRow', 'REPORT_CONFIG', RptConfigKey) - Set_Property(@Window:'.PUB_SAVE_SETTINGS', 'ENABLED', False$) - end else - UserSettings = '' - Set_Property(@Window:'.PUB_SAVE_SETTINGS', 'ENABLED', True$) - end - GoSub Setup_OLE_Controls - GoSub EnableGenerateReportButton - FormSize = '' - SRP_Show_Window(@Window, '', 'C', 'C', 1, '', False$, False$, FormSize) - -End Event - - -Event PUB_GEN_REPORT.CLICK() - - // Gather settings from form - ColFltrArray = Get_Property(@Window:'.OLE_EDT_COL_FILTER', 'OLE.ARRAY') - LocFltrArray = Get_Property(@Window:'.OLE_EDT_LOC_FILTER', 'OLE.ARRAY') - - RptColumns = '' - RptLocations = '' - - Columns = ColFltrArray<1> - Flags = ColFltrArray<2> - For each Column in Columns using @VM setting vPos - ColumnEnabled = Flags<0, vPos> - If ColumnEnabled then RptColumns<0, -1> = Column - Next Column - - Locations = LocFltrArray<1> - Flags = LocFltrArray<3> - For each Location in Locations using @VM setting vPos - LocationEnabled = Flags<0, vPos> - If LocationEnabled then RptLocations<0, -1> = Location - Next Location - -* If @User4 EQ 'DANIEL_ST' then -* debug -* Material_Track(RptColumns, RptLocations) -* TaskID = RTI_TASK_SUBMIT('', 'MATERIAL_TRACK', RptColumns, RptLocations) -* If TaskID NE 0 then -* Done = False$ -* TaskResponse = '' -* Loop -* Status = RTI_Task_Status(TaskID, TaskResponse) -* If (Status EQ 'COMPLETED') OR (Status EQ 'ERROR') then Done = True$ -* Until Done -* Repeat -* end else -* // Track if task id wasn't created at all. -* end -* StatusError = Get_Status(errCode) -* If (Index(errCode, 'SHELLEXECUTE', 1)) NE 0 then StatusError = 0 -* end else - Report_Services('GetMaterialTrackReport', RptColumns, RptLocations) -* end - - -end event - - -Event PUB_SAVE_SETTINGS.CLICK() - - RptConfigKey = 'MATERIAL_TRACK*':@User4 - If RowExists('REPORT_CONFIG', RptConfigKey) then - UserSettings = Database_Services('ReadDataRow', 'REPORT_CONFIG', RptConfigKey) - end else - UserSettings = '' - end - - // Gather settings from form - ColFltrArray = Get_Property(@Window:'.OLE_EDT_COL_FILTER', 'OLE.ARRAY') - LocFltrArray = Get_Property(@Window:'.OLE_EDT_LOC_FILTER', 'OLE.ARRAY') - - RptColumns = '' - RptLocations = '' - - Columns = ColFltrArray<1> - Flags = ColFltrArray<2> - For each Column in Columns using @VM setting vPos - ColumnEnabled = Flags<0, vPos> - If ColumnEnabled then RptColumns<0, -1> = Column - Next Column - UserSettings = Flags - - Locations = LocFltrArray<1> - Flags = LocFltrArray<3> - For each Location in Locations using @VM setting vPos - LocationEnabled = Flags<0, vPos> - If LocationEnabled then RptLocations<0, -1> = Location - Next Location - UserSettings = Flags - - Database_Services('WriteDataRow', 'REPORT_CONFIG', RptConfigKey, UserSettings, True$, False$, True$) - Set_Property(CtrlEntID, 'ENABLED', False$) - -end event - - -Event OLE_EDT_COL_FILTER.OnCheckChanged(Cell, OldValue, NewValue) - - GoSub EnableSaveButton - GoSub EnableGenerateReportButton - -end event - - -Event OLE_EDT_LOC_FILTER.OnCheckChanged(Cell, OldValue, NewValue) - - GoSub EnableReportColumns - GoSub EnableSaveButton - GoSub EnableGenerateReportButton - -end event - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Internal GoSubs -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -Setup_OLE_Controls: - - // Report Columns - RptCols = '' - RptCols<1, 1> = 'React No' - RptCols<1, 2> = 'React Type' - RptCols<1, 3> = 'WO No' - RptCols<1, 4> = 'SAP Prod No' - RptCols<1, 5> = 'Sub Part No' - RptCols<1, 6> = 'Epi Part No' - RptCols<1, 7> = 'WO Qty' - RptCols<1, 8> = 'RX Qty' - RptCols<1, 9> = 'UnRel Qty' - RptCols<1, 10> = 'Kit Location' - RptCols<1, 11> = 'Kit Qty' - RptCols<1, 12> = '+/-' - RptCols<1, 13> = 'Kit RO' - RptCols<1, 14> = 'PTI RO' - RptCols<1, 15> = 'Load' - RptCols<1, 16> = 'Comments' - - RptColsEnabled = '' - If UserSettings NE '' then - RptColsEnabled = UserSettings - end else - For each Col in RptCols using @VM setting vPos - RptColsEnabled<0, -1> = True$ - Next Col - end - - RptColsArray = RptCols:@FM:RptColsEnabled - - // Location Filters - LocFilters = '' - LocFilters<1, 1> = 'SR*KTR]' - LocFilters<1, 2> = '1K*PTI' - LocFilters<1, 3> = 'CR*BE' - LocFilters<1, 4> = 'CR*BO' - LocFilters<1, 5> = 'CR*TUN' - LocFilters<1, 6> = 'CR*EPR' - LocFilters<1, 7> = 'CR*FE' - LocFilters<1, 8> = 'CR*FEH' - LocFilters<1, 9> = 'CR*FO' - LocFilters<1, 10> = 'CR*FOH' - - LocDescriptions = '' - LocsEnabled = '' - If UserSettings NE '' then - LocsEnabled = UserSettings - For each Loc in LocFilters using @VM setting vPos - If vPos GT 1 then - LocDescriptions<0, -1> = Xlate('LOCATION', Loc, 'DESC', 'X') - end else - LocDescriptions<0, -1> = 'All Kit Racks' - end - Next Loc - end else - For each Loc in LocFilters using @VM setting vPos - LocsEnabled<0, -1> = True$ - If vPos GT 1 then - LocDescriptions<0, -1> = Xlate('LOCATION', Loc, 'DESC', 'X') - end else - LocDescriptions<0, -1> = 'All Kit Racks' - end - Next Loc - end - - LocFltrArray = LocFilters:@FM:LocDescriptions:@FM:LocsEnabled - - ColFltrCtrl = @Window:'.OLE_EDT_COL_FILTER' - LocFltrCtrl = @Window:'.OLE_EDT_LOC_FILTER' - - // Qualify OLE events that we want to intercept - Qualifier = '' - Qualifier<1> = 1 - Qualifier<4> = 0 ; * process synchronously (i.e. immediately) - Send_Message(ColFltrCtrl, 'QUALIFY_EVENT', 'OLE.OnCheckChanged', Qualifier) - Send_Message(LocFltrCtrl, 'QUALIFY_EVENT', 'OLE.OnCheckChanged', Qualifier) - - NumColFltrCols = 2 - NumColFltrRows = DCount(RptCols, @VM) - NumLocFltrCols = 3 - NumLocFltrRows = DCount(LocFilters, @VM) - - HeaderFontArray = 'Segoe UI':@SVM:8:@SVM:700 - ColFltrDimArray = NumColFltrCols : @FM : NumColFltrRows - LocFltrDimArray = NumLocFltrCols : @FM : NumLocFltrRows - DataColArray = '' - DataColArray<4> = True$ ; // Autosize column - - HeaderTitles = 'Column':@VM:'Enabled' - Set_Property(ColFltrCtrl, "OLE.TitleList", HeaderTitles) - Set_Property(ColFltrCtrl, "OLE.CellFont[All; All]", 'Segoe UI':@SVM:8) - Set_Property(ColFltrCtrl, "OLE.Dimension", ColFltrDimArray) - Set_Property(ColFltrCtrl, "OLE.HeaderFont[All; 1]", HeaderFontArray) - Set_Property(ColFltrCtrl, "OLE.HeaderColumn[1]", '':@FM:False$:@FM) - Set_Property(ColFltrCtrl, "OLE.HeaderAlignment[All; 1]", "Top":@FM:"Center":@FM:"Center") - Set_Property(ColFltrCtrl, "OLE.HeaderColors[All; 1]", @FM:"{200, 200, 200}") - Set_Property(ColFltrCtrl, "OLE.CellType[2; All]", "Check Box") - Set_Property(ColFltrCtrl, "OLE.CellAlignment[2; All]", "Top":@FM:"Center":@FM:"Center") - Set_Property(ColFltrCtrl, "OLE.DataColumn[1]", DataColArray) - Set_Property(ColFltrCtrl, "OLE.ARRAY", RptColsArray) - Set_Property(ColFltrCtrl, "OLE.CellCheckEnabled[2; 1-3]", False) - CellColorArray = 'None':@FM:"{240, 240, 240}" - Set_Property(ColFltrCtrl, "OLE.CellColors[All; 1-3]", CellColorArray) - Set_Property(ColFltrCtrl, "OLE.CellProtection[All; 1-3]", 'FUL') - - - HeaderTitles = 'Location':@VM:'Description':@VM:'Enabled' - Set_Property(LocFltrCtrl, "OLE.TitleList", HeaderTitles) - Set_Property(LocFltrCtrl, "OLE.CellFont[All; All]", 'Segoe UI':@SVM:8) - Set_Property(LocFltrCtrl, "OLE.Dimension", LocFltrDimArray) - Set_Property(LocFltrCtrl, "OLE.LIST", '') - Set_Property(LocFltrCtrl, "OLE.HeaderFont[All; 1]", HeaderFontArray) - Set_Property(LocFltrCtrl, "OLE.HeaderColumn[1]", '':@FM:False$:@FM) - Set_Property(LocFltrCtrl, "OLE.HeaderAlignment[All; 1]", "Top":@FM:"Center":@FM:"Center") - Set_Property(LocFltrCtrl, "OLE.HeaderColors[All; 1]", @FM:"{200, 200, 200}") - Set_Property(LocFltrCtrl, "OLE.CellType[3; All]", "Check Box") - Set_Property(LocFltrCtrl, "OLE.DataColumn[2]", DataColArray) - Set_Property(LocFltrCtrl, "OLE.CellAlignment[3; All]", "Top":@FM:"Center":@FM:"Center") - Set_Property(LocFltrCtrl, "OLE.ARRAY", LocFltrArray) - -return - - -EnableSaveButton: - - // Enable save settings button if necessary - RptConfigKey = 'MATERIAL_TRACK*':@User4 - If RowExists('REPORT_CONFIG', RptConfigKey) then - UserSettings = Database_Services('ReadDataRow', 'REPORT_CONFIG', RptConfigKey) - end else - UserSettings = '' - end - - // Gather settings from form - ColFltrArray = Get_Property(@Window:'.OLE_EDT_COL_FILTER', 'OLE.ARRAY') - LocFltrArray = Get_Property(@Window:'.OLE_EDT_LOC_FILTER', 'OLE.ARRAY') - - NewColFlags = ColFltrArray<2> - CurrColFlags = UserSettings - - NewLocFlags = LocFltrArray<3> - CurrLocFlags = UserSettings - - ChangeDetected = ( (NewColFlags NE CurrColFlags) or (NewLocFlags NE CurrLocFlags) ) - Set_Property(@Window:'.PUB_SAVE_SETTINGS', 'ENABLED', ChangeDetected) - -return - - -EnableGenerateReportButton: - - // Gather settings from form - LocFltrArray = Get_Property(@Window:'.OLE_EDT_LOC_FILTER', 'OLE.ARRAY') - LocFlags = LocFltrArray<3> - ButtonEnabled = (Sum(LocFlags) GT 0) - Set_Property(@Window:'.PUB_GEN_REPORT', 'ENABLED', ButtonEnabled) - -return - - -EnableReportColumns: - - ColFltrCtrl = @Window:'.OLE_EDT_COL_FILTER' - LocFltrCtrl = @Window:'.OLE_EDT_LOC_FILTER' - - // Gather settings from form - LocFltrArray = Get_Property(LocFltrCtrl, 'OLE.ARRAY') - - LocFlags = LocFltrArray<3> - KitRackFlag = LocFlags<0, 1> - PTIRackFlag = LocFlags<0, 2> - LoadedFlags = Field(LocFlags, @VM , 3, 8) - LoadedColEnabled = (Sum(LoadedFlags) GT 0) - EnabledCellColorArray = 'None':@FM:'None' - DisabledCellColorArray = 'None':@FM:"{240, 240, 240}" - If KitRackFlag EQ True$ then - Set_Property(ColFltrCtrl, "OLE.CellCheck[2; 10-12]", True$) - Set_Property(ColFltrCtrl, "OLE.CellColors[All; 10-12]", EnabledCellColorArray) - Set_Property(ColFltrCtrl, "OLE.CellProtection[All; 10-12]", 'SEL') - Set_Property(ColFltrCtrl, "OLE.CellCheckEnabled[2; 10-12]", True$) - end else - Set_Property(ColFltrCtrl, "OLE.CellCheck[2; 10-12]", False$) - Set_Property(ColFltrCtrl, "OLE.CellColors[All; 10-12]", DisabledCellColorArray) - Set_Property(ColFltrCtrl, "OLE.CellProtection[All; 10-12]", 'FUL') - Set_Property(ColFltrCtrl, "OLE.CellCheckEnabled[2; 10-12]", False$) - end - If PTIRackFlag EQ True$ then - Set_Property(ColFltrCtrl, "OLE.CellCheck[2; 13]", True$) - Set_Property(ColFltrCtrl, "OLE.CellColors[All; 13]", EnabledCellColorArray) - Set_Property(ColFltrCtrl, "OLE.CellProtection[All; 13]", 'SEL') - Set_Property(ColFltrCtrl, "OLE.CellCheckEnabled[2; 13]", True$) - end else - Set_Property(ColFltrCtrl, "OLE.CellCheck[2; 13]", False$) - Set_Property(ColFltrCtrl, "OLE.CellColors[All; 13]", DisabledCellColorArray) - Set_Property(ColFltrCtrl, "OLE.CellProtection[All; 13]", 'FUL') - Set_Property(ColFltrCtrl, "OLE.CellCheckEnabled[2; 13]", False$) - end - If LoadedColEnabled EQ True$ then - Set_Property(ColFltrCtrl, "OLE.CellCheck[2; 14]", True$) - Set_Property(ColFltrCtrl, "OLE.CellColors[All; 14]", EnabledCellColorArray) - Set_Property(ColFltrCtrl, "OLE.CellProtection[All; 14]", 'SEL') - Set_Property(ColFltrCtrl, "OLE.CellCheckEnabled[2; 14]", True$) - end else - Set_Property(ColFltrCtrl, "OLE.CellCheck[2; 14]", False$) - Set_Property(ColFltrCtrl, "OLE.CellColors[All; 14]", DisabledCellColorArray) - Set_Property(ColFltrCtrl, "OLE.CellProtection[All; 14]", 'FUL') - Set_Property(ColFltrCtrl, "OLE.CellCheckEnabled[2; 14]", False$) - end - -return - - diff --git a/LSL2/STPROC/REPORTS_API.txt b/LSL2/STPROC/REPORTS_API.txt index abdf44c..dfc8ff7 100644 --- a/LSL2/STPROC/REPORTS_API.txt +++ b/LSL2/STPROC/REPORTS_API.txt @@ -189,7 +189,13 @@ UpdateHALItem: Begin Case Case ReportID = 'materialtrack' - Error_Services('Add', 'Unsupported report') + Body = HTTP_Services('GetHTTPPostString') + If (Body NE '') then + // The POST string will have been encoded so use percent (URL) decoding. + RepJSON = HTTP_Services('DecodePercentString', Body) + Report_Services('UpdateMaterialTrackData', RepJSON) + end + Case ReportID = 'dailyperformance' ReportDate = Http_Services('GetQueryField', 'reportDate') // The resource will have been put into the POST string. @@ -225,3 +231,4 @@ API reports.GET HTTP_Resource_Services('LoremIpsum') end api + diff --git a/LSL2/STPROC/REPORT_SERVICES.txt b/LSL2/STPROC/REPORT_SERVICES.txt index fc8d283..c93bd80 100644 --- a/LSL2/STPROC/REPORT_SERVICES.txt +++ b/LSL2/STPROC/REPORT_SERVICES.txt @@ -68,6 +68,7 @@ $Insert MAKEUP_WAFERS_EQUATES $Insert REACTOR_EQUATES $Insert WAFER_COUNTER_EQUATES $Insert REACTOR_DAILY_UPTIME_EQUATES +$Insert MATERIAL_REPORT_EQUATES // Reduce modes (for Select statement) Equ NEW_EXIST$ To 0 @@ -76,7 +77,7 @@ Equ ADD_EXIST$ To 2 Declare subroutine Utility, ErrMsg, Set_Status, Set_Printer, RList, SRP_Stopwatch, Btree.Extract, Error_Services, V119 Declare subroutine Push.Select, Pop.Select, Database_Services, SRP_JSON, Logging_Services, Reduce, FSMsg -Declare subroutine Report_Services, Make.List +Declare subroutine Report_Services, Make.List, Update_Index Declare function Set_Printer, Get_Printer, Msg, Get_Status, Printer_Select, obj_Install, Dialog_Box, obj_Location Declare function Schedule_Services, Error_Services, Location_Services, SRP_Array, Signature_Services, obj_RDS_Test Declare function Epi_Part_Services, SRP_Math, Database_Services, SRP_JSON, Reactor_Services, SRP_Datetime @@ -103,24 +104,29 @@ GoToService Return Response or "" -//----------------------------------------------------------------------------- -// SERVICES -//----------------------------------------------------------------------------- +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Service Parameter Options +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Options BOOLEAN = True$, False$ + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Services +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Service GetMakeupInventoryReportJSON() clearselect - Statement1 = 'LIST MAKEUP_WAFERS WO_NO CASS_NO CUST_NO CUST_PART_NO EPI_PART_NO PROD_ORD_NO PROD_VER_NO PS_NO RDS_NO REACT_TYPE SAP_BATCH_NO UNLOAD_DTM WAFER_SIZE WM_OUT_NO WFR_QTY EXPIRED BY WAFER_SIZE BY PS_NO' - MUInv = Select_Into(Statement1, 'EDT') - - If Error_Services('NoError') then - MUInvJSON = '' - objJSON = '' - If SRP_JSON(objJSON, 'New', 'Object') then - objReactArray = '' - If SRP_JSON(objReactArray, 'New', 'Array') then - For each Row in MUInv using @FM setting fPos - objRow = '' + Statement1 = 'LIST MAKEUP_WAFERS WO_NO CASS_NO CUST_NO CUST_PART_NO EPI_PART_NO PROD_ORD_NO PROD_VER_NO PS_NO RDS_NO REACT_TYPE SAP_BATCH_NO UNLOAD_DTM WAFER_SIZE WM_OUT_NO WFR_QTY EXPIRED BY WAFER_SIZE BY PS_NO' + MUInv = Select_Into(Statement1, 'EDT') + + If Error_Services('NoError') then + MUInvJSON = '' + objJSON = '' + If SRP_JSON(objJSON, 'New', 'Object') then + objReactArray = '' + If SRP_JSON(objReactArray, 'New', 'Array') then + For each Row in MUInv using @FM setting fPos + objRow = '' If SRP_JSON(objRow, 'New', 'Object') then SRP_JSON(objRow, 'SetValue', 'workOrderNo', Row<0, 2>, 'number') SRP_JSON(objRow, 'SetValue', 'cassNo', Row<0, 3>, 'number') @@ -156,1117 +162,922 @@ Service GetMakeupInventoryReportJSON() SRP_JSON(objReactArray, 'Add', objRow) SRP_JSON(objRow, 'Release') end - Next Row - SRP_JSON(objJSON, 'Set', 'MUInvReport', objReactArray) - SRP_JSON(objReactArray, 'Release') - end - Response = SRP_JSON(objJSON, 'Stringify', 'Styled') - SRP_JSON(objJSON, 'Release') - end - - end - + Next Row + SRP_JSON(objJSON, 'Set', 'MUInvReport', objReactArray) + SRP_JSON(objReactArray, 'Release') + end + Response = SRP_JSON(objJSON, 'Stringify', 'Styled') + SRP_JSON(objJSON, 'Release') + end + + end + end service Service GenerateEPPMetReport(DateFrom, DateTo, EpiPartNo, ExportDir) - - ReportData = '' - ErrorMsg = '' - If ( (DateFrom NE '') and (EpiPartNo NE '') and (ExportDir NE '') ) then - If DateTo EQ '' then - DateTo = Date() - end else - If Not(Num(DateTo)) then DateTo = IConv(DateTo, 'D') - end - If Not(Num(DateFrom)) then DateFrom = IConv(DateFrom, 'D') - // Select WM_OUT keys - WMOList = '' - Query = 'SELECT WM_OUT WITH PART_NO EQ ':Quote(EpiPartNo) - GoSub ClearCursors - Set_Status(0) - RList(Query, TARGET_ACTIVELIST$, '', '', '') - If Get_Status(ErrCode) then - ErrorMsg = 'Error in ':Service:' service. RList failed! Error code: ':ErrCode:'.' - end - If ErrorMsg EQ '' then - Def = "" - Def = "Selecting WM_OUT records..." - Def = "GC" - Def = @RecCount - Def = 600 - MsgUp = Msg(@WINDOW, Def) ;* Start gas guage message - Counter = 0 - EOF = False$ - Loop - Counter += 1 - Running = Msg(@WINDOW, MsgUp, Counter, MSGINSTUPDATE$) ;* Update message - ReadNext WMOKey else EOF = True$ - Until EOF - WMOList<-1> = WMOKey - Repeat - Msg(@WINDOW,MsgUp) - - // Filter on RDS {DATE_OUT} - RDSList = '' - FilterWMOList = '' - NumWMO = DCount(WMOList, @FM) - - Def = "" - Def = "Filtering on dates..." - Def = "GC" - Def = NumWMO - Def = 600 - MsgUp = Msg(@WINDOW, Def) ;* Start gas guage message - Counter = 0 - - For WMOIndex = 1 to NumWMO - Running = Msg(@WINDOW, MsgUp, WMOIndex, MSGINSTUPDATE$) ;* Update message - Done = False$ - WMOKey = WMOList - ThisRDSList = Xlate('WM_OUT', WMOKey, 'RDS', 'X') - ThisRDSList = SRP_Array('Clean', ThisRDSList, 'TrimAndMakeUnique', @VM) - For each RDSNo in ThisRDSList using @VM - DateOut = Xlate('RDS', RDSNo, 'DATE_OUT', 'X') - If ( (DateOut GE DateFrom) and (DateOut LE DateTo) ) then - FilterWMOList<-1> = WMOKey - Done = True$ - end - Until Done - Next RDSNo - Next WMOIndex - Msg(@WINDOW,MsgUp) - - // Build the report - ReportData = '' - Headers = Database_Services('ReadDataRow', 'SYSLISTS', 'EPP_METROLOGY_HEADERS') - Columns = Xlate('EXPORTS', 'EPIPRO_METOROLGY', 'COLUMNS', 'X') - Swap @FM with @VM in Headers - ReportData<1> = Headers - - RDSFields = Database_Services('ReadDataRow', 'DICT.RDS', '%FIELDS%') - RDSColumns = RDSFields - RDSConvs = RDSFields - NumWMO = DCount(FilterWMOList, @FM) - - Def = "" - Def = "Building report..." - Def = "GC" - Def = NumWMO - Def = 600 - MsgUp = Msg(@WINDOW, Def) ;* Start gas guage message - - If NumWMO GT 0 then - For each WMOKey in FilterWMOList using @FM setting fPos - Running = Msg(@WINDOW, MsgUp, fPos, MSGINSTUPDATE$) ;* Update message - RowIndex = fPos + 1 - ThisRDSList = Xlate('WM_OUT', WMOKey, 'RDS', 'X') - Zones = Xlate('WM_OUT', WMOKey, 'ZONE', 'X') - Pockets = Xlate('WM_OUT', WMOKey, 'POCKET', 'X') - SAPBatchNo = Xlate('WM_OUT', WMOKey, 'SAP_BATCH_NO', 'X') - InCassNos = Xlate('WM_OUT', WMOKey, 'IN_CASS_NO', 'X') - WONo = Field(WMOKey, '*', 1) - PrevRDSNo = '' - For each RDSNo in ThisRDSList using @VM setting SlotNo - If RDSNo NE '' then - If RDSNo NE PrevRDSNo then Database_Services('ActivateRecord', 'RDS', RDSNo) - ReportRow = '' - For each Column in Columns using @VM setting cPos - Locate Column in RDSColumns using @VM setting ConvPos then - Conv = RDSConvs<0, ConvPos> - Begin Case - Case Column EQ 'WO' - ReportRow<0, cPos> = Field(WMOKey, '*', 1) - Case Column EQ 'SEQ' - ReportRow<0, cPos> = RDSNo - Case Column EQ 'ZONE' - ReportRow<0, cPos> = Zones<0, SlotNo> - Case Column EQ 'POCKET' - ReportRow<0, cPos> = Pockets<0, SlotNo> - Case Column EQ 'WM_OUT_KEY' - ReportRow<0, cPos> = WMOKey - Case Column EQ 'OUT_CASS_NO' - ReportRow<0, cPos> = Field(WMOKey, '*', 3) - Case Column EQ 'OUT_SLOT_NO' - ReportRow<0, cPos> = SlotNo - Case Column EQ 'SAP_BATCH_NO' - ReportRow<0, cPos> = SAPBatchNo - Case Column EQ 'LOT_NUM' - ReportRow<0, cPos> = Xlate('WO_MAT', WONo:'*':InCassNos<0, SlotNo>, 'LOT_NO', 'X') - Case Otherwise$ - If Conv EQ '' then - ReportRow<0, cPos> = Calculate(Column) - end else - ReportRow<0, cPos> = OConv(Calculate(Column), Conv) - end - End Case - end - Next Column - PrevRDSNo = RDSNo - ReportData<-1> = ReportRow - end - Next RDSNo - - Next WMOKey - end - Msg(@WINDOW,MsgUp) - Swap @VM with ',' in ReportData - Swap @FM with CRLF$ in ReportData - Set_Status(0) - OSWrite ReportData on ExportDir - ErrCode = '' - If Get_Status(ErrCode) then - ErrorMsg = 'Error in ':Service:' service. OSWrite failed! Error code: ':ErrCode:'.' - end - end - end else - ErrorMsg = 'Error in ':Service:' service. Null DateFrom or EpiPartNo passed in!' - end - If ErrorMsg EQ '' then - Response = ReportData - end else - Error_Services('Add', ErrorMsg) - end - + + ReportData = '' + ErrorMsg = '' + If ( (DateFrom NE '') and (EpiPartNo NE '') and (ExportDir NE '') ) then + If DateTo EQ '' then + DateTo = Date() + end else + If Not(Num(DateTo)) then DateTo = IConv(DateTo, 'D') + end + If Not(Num(DateFrom)) then DateFrom = IConv(DateFrom, 'D') + // Select WM_OUT keys + WMOList = '' + Query = 'SELECT WM_OUT WITH PART_NO EQ ':Quote(EpiPartNo) + GoSub ClearCursors + Set_Status(0) + RList(Query, TARGET_ACTIVELIST$, '', '', '') + If Get_Status(ErrCode) then + ErrorMsg = 'Error in ':Service:' service. RList failed! Error code: ':ErrCode:'.' + end + If ErrorMsg EQ '' then + Def = "" + Def = "Selecting WM_OUT records..." + Def = "GC" + Def = @RecCount + Def = 600 + MsgUp = Msg(@WINDOW, Def) ;* Start gas guage message + Counter = 0 + EOF = False$ + Loop + Counter += 1 + Running = Msg(@WINDOW, MsgUp, Counter, MSGINSTUPDATE$) ;* Update message + ReadNext WMOKey else EOF = True$ + Until EOF + WMOList<-1> = WMOKey + Repeat + Msg(@WINDOW,MsgUp) + + // Filter on RDS {DATE_OUT} + RDSList = '' + FilterWMOList = '' + NumWMO = DCount(WMOList, @FM) + + Def = "" + Def = "Filtering on dates..." + Def = "GC" + Def = NumWMO + Def = 600 + MsgUp = Msg(@WINDOW, Def) ;* Start gas guage message + Counter = 0 + + For WMOIndex = 1 to NumWMO + Running = Msg(@WINDOW, MsgUp, WMOIndex, MSGINSTUPDATE$) ;* Update message + Done = False$ + WMOKey = WMOList + ThisRDSList = Xlate('WM_OUT', WMOKey, 'RDS', 'X') + ThisRDSList = SRP_Array('Clean', ThisRDSList, 'TrimAndMakeUnique', @VM) + For each RDSNo in ThisRDSList using @VM + DateOut = Xlate('RDS', RDSNo, 'DATE_OUT', 'X') + If ( (DateOut GE DateFrom) and (DateOut LE DateTo) ) then + FilterWMOList<-1> = WMOKey + Done = True$ + end + Until Done + Next RDSNo + Next WMOIndex + Msg(@WINDOW,MsgUp) + + // Build the report + ReportData = '' + Headers = Database_Services('ReadDataRow', 'SYSLISTS', 'EPP_METROLOGY_HEADERS') + Columns = Xlate('EXPORTS', 'EPIPRO_METOROLGY', 'COLUMNS', 'X') + Swap @FM with @VM in Headers + ReportData<1> = Headers + + RDSFields = Database_Services('ReadDataRow', 'DICT.RDS', '%FIELDS%') + RDSColumns = RDSFields + RDSConvs = RDSFields + NumWMO = DCount(FilterWMOList, @FM) + + Def = "" + Def = "Building report..." + Def = "GC" + Def = NumWMO + Def = 600 + MsgUp = Msg(@WINDOW, Def) ;* Start gas guage message + + If NumWMO GT 0 then + For each WMOKey in FilterWMOList using @FM setting fPos + Running = Msg(@WINDOW, MsgUp, fPos, MSGINSTUPDATE$) ;* Update message + RowIndex = fPos + 1 + ThisRDSList = Xlate('WM_OUT', WMOKey, 'RDS', 'X') + Zones = Xlate('WM_OUT', WMOKey, 'ZONE', 'X') + Pockets = Xlate('WM_OUT', WMOKey, 'POCKET', 'X') + SAPBatchNo = Xlate('WM_OUT', WMOKey, 'SAP_BATCH_NO', 'X') + InCassNos = Xlate('WM_OUT', WMOKey, 'IN_CASS_NO', 'X') + WONo = Field(WMOKey, '*', 1) + PrevRDSNo = '' + For each RDSNo in ThisRDSList using @VM setting SlotNo + If RDSNo NE '' then + If RDSNo NE PrevRDSNo then Database_Services('ActivateRecord', 'RDS', RDSNo) + ReportRow = '' + For each Column in Columns using @VM setting cPos + Locate Column in RDSColumns using @VM setting ConvPos then + Conv = RDSConvs<0, ConvPos> + Begin Case + Case Column EQ 'WO' + ReportRow<0, cPos> = Field(WMOKey, '*', 1) + Case Column EQ 'SEQ' + ReportRow<0, cPos> = RDSNo + Case Column EQ 'ZONE' + ReportRow<0, cPos> = Zones<0, SlotNo> + Case Column EQ 'POCKET' + ReportRow<0, cPos> = Pockets<0, SlotNo> + Case Column EQ 'WM_OUT_KEY' + ReportRow<0, cPos> = WMOKey + Case Column EQ 'OUT_CASS_NO' + ReportRow<0, cPos> = Field(WMOKey, '*', 3) + Case Column EQ 'OUT_SLOT_NO' + ReportRow<0, cPos> = SlotNo + Case Column EQ 'SAP_BATCH_NO' + ReportRow<0, cPos> = SAPBatchNo + Case Column EQ 'LOT_NUM' + ReportRow<0, cPos> = Xlate('WO_MAT', WONo:'*':InCassNos<0, SlotNo>, 'LOT_NO', 'X') + Case Otherwise$ + If Conv EQ '' then + ReportRow<0, cPos> = Calculate(Column) + end else + ReportRow<0, cPos> = OConv(Calculate(Column), Conv) + end + End Case + end + Next Column + PrevRDSNo = RDSNo + ReportData<-1> = ReportRow + end + Next RDSNo + + Next WMOKey + end + Msg(@WINDOW,MsgUp) + Swap @VM with ',' in ReportData + Swap @FM with CRLF$ in ReportData + Set_Status(0) + OSWrite ReportData on ExportDir + ErrCode = '' + If Get_Status(ErrCode) then + ErrorMsg = 'Error in ':Service:' service. OSWrite failed! Error code: ':ErrCode:'.' + end + end + end else + ErrorMsg = 'Error in ':Service:' service. Null DateFrom or EpiPartNo passed in!' + end + If ErrorMsg EQ '' then + Response = ReportData + end else + Error_Services('Add', ErrorMsg) + end + end service -Service GetMaterialTrackReport(RptColumns, LocationFilter) - - // All Possible Report Columns - AllRptColumns = '' - AllRptColumns<1, 1> = 'React No' - AllRptColumns<1, 2> = 'React Type' - AllRptColumns<1, 3> = 'WO No' - AllRptColumns<1, 4> = 'SAP Prod No' - AllRptColumns<1, 5> = 'Sub Part No' - AllRptColumns<1, 6> = 'Epi Part No' - AllRptColumns<1, 7> = 'WO Qty' - AllRptColumns<1, 8> = 'RX Qty' - AllRptColumns<1, 9> = 'UnRel Qty' - AllRptColumns<1, 10> = 'Kit Location' - AllRptColumns<1, 11> = 'Kit Qty' - AllRptColumns<1, 12> = '+/-' - AllRptColumns<1, 13> = 'Kit RO' - AllRptColumns<1, 14> = 'PTI RO' - AllRptColumns<1, 15> = 'Load' - AllRptColumns<1, 16> = 'Comments' - - If Index(RptColumns, 'Comments', 1) then - AllColFmt = '' - AllColFmt<1, 1> = '+^720' - AllColFmt<1, 2> = '+<720' - AllColFmt<1, 3> = '+^1000' - AllColFmt<1, 4> = '+^1100' - AllColFmt<1, 5> = '+^1300' - AllColFmt<1, 6> = '+^1200' - AllColFmt<1, 7> = '+>720' - AllColFmt<1, 8> = '+>720' - AllColFmt<1, 9> = '+>720' - AllColFmt<1, 10> = '+^1260' - AllColFmt<1, 11> = '+^720' - AllColFmt<1, 12> = '+^500' - AllColFmt<1, 13> = '+^1300' - AllColFmt<1, 14> = '+^1300' - AllColFmt<1, 15> = '+^700' - AllColFmt<1, 16> = '+^1300' - end else - AllColFmt = '' - AllColFmt<1, 1> = '+^720' - AllColFmt<1, 2> = '+<720' - AllColFmt<1, 3> = '+^1000' - AllColFmt<1, 4> = '+^1100' - AllColFmt<1, 5> = '+^1300' - AllColFmt<1, 6> = '+^1200' - AllColFmt<1, 7> = '+>720' - AllColFmt<1, 8> = '+>720' - AllColFmt<1, 9> = '+>720' - AllColFmt<1, 10> = '+^1260' - AllColFmt<1, 11> = '+^720' - AllColFmt<1, 12> = '+^500' - AllColFmt<1, 13> = '+^1800' - AllColFmt<1, 14> = '+^1800' - AllColFmt<1, 15> = '+^1100' - AllColFmt<1, 16> = '' - end - - ErrorTitle = 'Error in service ':Service - ErrCode = '' - ErrorMsg = '' - - OPEN 'SCHED_DET' TO SchedDetTable then - OPEN 'DICT.SCHED_DET' TO @DICT then - Today = OCONV(Date(),'D4/') - EndDate = OCONV(Date()+13,'D4/') - - ReactList = '' - WOList = '' - SchedDetKeys = '' - PrevReactNo = '' - PrevWO = '' - - SelectSent = 'SELECT SCHED_DET WITH SCHED_DT GE ':QUOTE(Today):' BY REACT_NO' - - * Push.Select(f1, f2, f3, f4) - RList(SelectSent,TARGET_ACTIVELIST$,'','','') - * Pop.Select(f1, f2, f3, f4) - IF Get_Status(errCode) THEN - ErrMsg(errCode) - RETURN - END - - Done = 0 - @ID = '' - LOOP - PrevSchedDetKey = @ID - READNEXT @ID ELSE Done = 1 - UNTIL Done - ReactNo = @ID[1,'*'] - SchedDt = @ID[COL2()+1,'*'] - SeqNo = @ID[COL2()+1,'*'] - - READ SchedDetRec FROM SchedDetTable,@ID THEN - - WONo = SchedDetRec - - LOCATE ReactNo IN ReactList BY 'AR' USING @FM SETTING Pos ELSE - ReactList = INSERT(ReactList,Pos,0,0,ReactNo) - END - - PrevReactNo = Field(PrevSchedDetKey, '*', 1) - PrevSchedDt = Field(PrevSchedDetKey, '*', 2) - - LOCATE WONo IN WOList USING @VM SETTING WPos ELSE - WOList = INSERT(WOList,Pos,-1,0,WONo) - // Patch added on 10/24/18 to resolve scheduling conflicts on the same day for - // the material track report. - djs - If (PrevReactNo EQ ReactNo) and (PrevSchedDt EQ SchedDt) then - PrevSeqNo = Field(PrevSchedDetKey, '*', 3) - NumWO = DCount(WOList, @VM) - PrevWONo = WOList - SchedEvents = Schedule_Services('GetScheduleEventSummary', ReactNo, WONo, SchedDt, SeqNo, True$) - StartDt = IConv(SchedEvents, 'D') - PrevSchedEvents = Schedule_Services('GetScheduleEventSummary', ReactNo, PrevWONo, PrevSchedDt, PrevSeqNo, True$) - PrevStartDt = IConv(PrevSchedEvents, 'D') - If StartDt GT PrevStartDt then - // This is the common case - SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,@ID) - end else - // Scheduling irregularity - Insert this key in the second to last position. - NumKeys = DCount(SchedDetKeys, @FM) - InsertPos = NumKeys - SchedDetKeys = INSERT(SchedDetKeys,InsertPos,0,0,@ID) - end - end else - SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,@ID) - end - END - END - - REPEAT - - CALL Make.List(0,SchedDetKeys,SchedDetTable,@DICT) - - Header = "'D'":@VM:obj_Install('Get_Prop','CompTitle'):' Material Tracking by Reactor':@VM:"Page 'P'" - MinDemand = 0 - Set_Status(0) - - * Start of printing process - FileName = 'Print Material Demand' - Title = 'Printing Material Demand' - - TopMargin = 1.0 - BottomMargin = 0.75 - LeftMargin = 0.25 - RightMargin = 0.25 - - Margins = LeftMargin:@FM:TopMargin:@FM:RightMargin:@FM:BottomMargin - - PageSetup = '1' ;* LandScape - PrintSetup = '2' ;* Preview Normal - PrintSetup<1,2> = '0' ;* All buttons - PrintSetup<1,5> = '1' ;* Page Range - PrintSetup<1,6> = 7 ;* full mouse and keyboard support - - PrintPath = '' - stat = Set_Printer('INIT',FileName,Title,Margins,PageSetup,PrintSetup,PrintPath) - - IF stat < 0 THEN - ErrorMsg = 'Stat = ' : Stat : ', PrintPath = ' : PrintPath - GOTO OIPrintErr - end - DateRange = 'Effective ':OCONV(Date(),'D4') - - Header<-1> = "'T'" - Header<-1> = '' ;* Blank line following heading - - font = 'Arial' - font<2> = '10' - font<4> = '0' ;* Bold - - stat = Set_Printer('FONTHEADFOOT',font) ; IF stat < 0 THEN GOTO OIPrintErr - stat = Set_Printer('HEADER',Header) ; IF stat < 0 THEN GOTO OIPrintErr - - Footer = " 'D' 'T'":@VM:@VM:"Page: 'P'" - stat = Set_Printer('FOOTER',Footer) ; IF stat < 0 THEN GOTO OIPrintErr - - @RECCOUNT = 0 - FirstPass = 1 - LastRecord = 0 - FirstLine = 1 - fontSpacing = 100 - - * Make Column Heading - ColHead = '' - ColFmt = '' - - For each Column in RptColumns using @VM setting rcPos - Locate Column in AllRptColumns using @VM setting dataPos then - ColHead<0, -1> = Column - ColFmt<0, -1> = AllColFmt<0, dataPos> - end - Next Column - - * Zero Accumulators For Each Break - - Prev.ReactNo = '' - Last.ReactNo.Break = 1 - - GoTo ReadRecord - - end else - ErrorMsg = 'Unable to open "SCHED_DET" table.' - ErrMsg(ErrorTitle:@SVM:ErrorMsg) - end - end else - ErrorMsg = 'Unable to open "SCHED_DET" table.' - ErrMsg(ErrorTitle:@SVM:ErrorMsg) - end - -End Service - - Service UpdateDailyMetrics(ReportDate) - - If ReportDate NE '' then - If Not(Num(ReportDate)) then ReportDate = IConv(ReportDate, 'D') - // Get daily target - CurrDate = Date() - DailyTarget = 0 - Query = 'SELECT FISCAL_QTR WITH FISCAL_YR EQ 2022 AND WITH START_DT LT ':Quote(OConv(ReportDate + 1, 'D4/')) - Query := ' AND WITH END_DT GT ':Quote(OConv(ReportDate - 1, 'D4/')) - RList(Query, TARGET_ACTIVELIST$, '', '', '') - If Not(Get_Status(ErrCode)) then - ReadNext FiscalQtrKey then - WorkingDays = Xlate('FISCAL_QTR', FiscalQtrKey, 'PLAN_WORKING_DAYS', 'X') - Targets = Xlate('FISCAL_QTR', FiscalQtrKey, 'THRU_TARGET', 'X') - Qtys = Xlate('FISCAL_QTR', FiscalQtrKey, 'THRU_QTY', 'X') - Locate 'Yield_Outs' in Targets using @VM setting vPos then - QtrTarget = Qtys<0, vPos> - DailyTarget = QtrTarget / WorkingDays - DailyTarget = OConv(IConv(DailyTarget, 'MD0'), 'MD0') - end - end - end - - GoSub ClearCursors - - // Calculate the metrics for the ReportDate - OPEN 'DICT.RDS' TO @DICT then - OPEN 'RDS' TO RDSTable then - - TotalThickness24 = 0 - TotalYield24 = 0 - - - Dates = '' - CurrTime = Time() - If CurrTime LT 3600 then - // 3600 is 1:00 am -> update yesterday's metrics as well - Dates<-1> = ReportDate - 1 - end - Dates<-1> = ReportDate - For each Date in Dates using @FM - - TotalThickness = 0 - WafersOutTotal = 0 - YieldTotal = 0 - ScrapTotal = 0 - ProdTestTotal = 0 - ProjectedYield = 0 - YieldPercent = '0.00' - ThickWaferRatio = 0 - - SearchString = 'DATE_OUT':@VM:OConv(Date, 'D4/') - RDSKeys = '' - Option = '' - Flag = '' - Set_Status(0) - Btree.Extract(SearchString, 'RDS', @DICT, RDSKeys, Option, Flag) - IF Not(Get_Status(errCode)) then - IF RDSKeys NE '' THEN - RDSCnt = COUNT(RDSKeys,@VM) + (RDSKeys NE '') - LOOP - @ID = RDSKeys[1,@VM] - RDSKeys[1,COL2()] = '' - READ @RECORD FROM RDSTable, @ID THEN - ReactorsOut = {WAFERS_IN} - If Not(Num(ReactorsOut)) then - // Log the WafersIn value - LogData = '' - LogData<1> = LoggingDTM - LogData<2> = @ID - LogData<3> = ReactorsOut - Logging_Services('AppendLog', objWafersLog, LogData, @RM, @FM) - ReactorsOut = ReactorsOut<1, 1, 1> - end - - CustScrap = {CUST_TOT_REJ} - IFXEpiScrap = {LSL_TOT_REJ} - TestKeys = XLATE('RDS_LAYER', @RECORD, 3, 'X') - TWProd = obj_RDS_Test('ProdTestCount',TestKeys) - Reactor = @RECORD - ReactorType = XLATE('REACTOR', Reactor, REACTOR_REACT_TYPE$, 'X') - Scrap = CustScrap + IFXEpiScrap - Yield = ReactorsOut - Scrap - TWProd - WafersOutTotal += ReactorsOut - YieldTotal += Yield - ScrapTotal += Scrap - ProdTestTotal += TWProd - ThickTarget = OConv({THICK_TARGET_TOT}, 'MD3') - TotalThickness += (ReactorsOut * ThickTarget) - end - UNTIL RDSKeys = '' - REPEAT - TotalThickness = TotalThickness[1, 'F.'] - end - end - - If Date EQ CurrDate then - // Calculate projected yield and projected thickness - Date = Date() - CurrTime = Time() - SearchString = 'DATE_OUT':@VM:OConv((Date - 1), 'D4/'):@FM:'TIME_OUT':@VM:'>':CurrTime - YesterdayRDSKeys = '' - Option = '' - Flag = '' - Set_Status(0) - Btree.Extract(SearchString, 'RDS', @DICT, YesterdayRDSKeys, Option, Flag) - If Not(Get_Status(errCode)) then - SearchString = 'DATE_OUT':@VM:Date - TodayRDSKeys = '' - Option = '' - Flag = '' - Set_Status(0) - Btree.Extract(SearchString, 'RDS', @DICT, TodayRDSKeys, Option, Flag) - If Not(Get_Status(errCode)) then - TotalRDSKeys = SRP_Array('Join', YesterdayRDSKeys, TodayRDSKeys, 'OR', @VM) - For each RDS in TotalRDSKeys using @VM - Database_Services('ActivateRecord', 'RDS', RDS) - ReactorsOut = {WAFERS_IN} - If Not(Num(ReactorsOut)) then - // Log the WafersIn value - LogData = '' - LogData<1> = LoggingDTM - LogData<2> = RDS - LogData<3> = ReactorsOut - Logging_Services('AppendLog', objWafersLog, LogData, @RM, @FM) - ReactorsOut = ReactorsOut<1, 1, 1> - end - CustScrap = {CUST_TOT_REJ} - IFXEpiScrap = {LSL_TOT_REJ} - TestKeys = XLATE('RDS_LAYER', @RECORD, 3, 'X') - TWProd = obj_RDS_Test('ProdTestCount',TestKeys) - Reactor = @RECORD - ReactorType = XLATE('REACTOR', Reactor, REACTOR_REACT_TYPE$, 'X') - Scrap = CustScrap + IFXEpiScrap - Yield = ReactorsOut - Scrap - TWProd - TotalYield24 += Yield - TargetThick = OConv({THICK_TARGET_TOT}, 'MD3') - TotalThickness24 += TargetThick * ReactorsOut - Next RDS - TotalThickness24 = TotalThickness24[1, 'F.'] - end - end - end - - If WafersOutTotal GT 0 then - ThickWaferRatio = TotalThickness / WafersOutTotal - // Round to one decimal - ThickWaferRatio = OConv(IConv(ThickWaferRatio, 'MD1'), 'MD1') - // Round to two decimals - YieldPercent = (YieldTotal / WafersOutTotal) * 100 - YieldPercent = OConv(IConv(YieldPercent, 'MD2'), 'MD2') - end - - If WafersOutTotal EQ 0 then WafersOutTotal = '' - If YieldTotal EQ 0 then YieldTotal = '' - If TotalYield24 EQ 0 then TotalYield24 = '' - If TotalThickness EQ 0 then TotalThickness = '' - If TotalThickness24 EQ 0 then TotalThickness24 = '' - - MetricsRec = '' - MetricsRec = WafersOutTotal - MetricsRec = YieldTotal - MetricsRec = TotalYield24 - MetricsRec = ScrapTotal - MetricsRec = ProdTestTotal - MetricsRec = DailyTarget - MetricsRec = TotalThickness - MetricsRec = TotalThickness24 - MetricsRec = ThickWaferRatio - MetricsRec = YieldPercent - Database_Services('WriteDataRow', 'DAILY_METRICS', Date, MetricsRec) - - Next Date - end - end - end - + + If ReportDate NE '' then + If Not(Num(ReportDate)) then ReportDate = IConv(ReportDate, 'D') + // Get daily target + CurrDate = Date() + DailyTarget = 0 + Query = 'SELECT FISCAL_QTR WITH FISCAL_YR EQ 2022 AND WITH START_DT LT ':Quote(OConv(ReportDate + 1, 'D4/')) + Query := ' AND WITH END_DT GT ':Quote(OConv(ReportDate - 1, 'D4/')) + RList(Query, TARGET_ACTIVELIST$, '', '', '') + If Not(Get_Status(ErrCode)) then + ReadNext FiscalQtrKey then + WorkingDays = Xlate('FISCAL_QTR', FiscalQtrKey, 'PLAN_WORKING_DAYS', 'X') + Targets = Xlate('FISCAL_QTR', FiscalQtrKey, 'THRU_TARGET', 'X') + Qtys = Xlate('FISCAL_QTR', FiscalQtrKey, 'THRU_QTY', 'X') + Locate 'Yield_Outs' in Targets using @VM setting vPos then + QtrTarget = Qtys<0, vPos> + DailyTarget = QtrTarget / WorkingDays + DailyTarget = OConv(IConv(DailyTarget, 'MD0'), 'MD0') + end + end + end + + GoSub ClearCursors + + // Calculate the metrics for the ReportDate + OPEN 'DICT.RDS' TO @DICT then + OPEN 'RDS' TO RDSTable then + + TotalThickness24 = 0 + TotalYield24 = 0 + + + Dates = '' + CurrTime = Time() + If CurrTime LT 3600 then + // 3600 is 1:00 am -> update yesterday's metrics as well + Dates<-1> = ReportDate - 1 + end + Dates<-1> = ReportDate + For each Date in Dates using @FM + + TotalThickness = 0 + WafersOutTotal = 0 + YieldTotal = 0 + ScrapTotal = 0 + ProdTestTotal = 0 + ProjectedYield = 0 + YieldPercent = '0.00' + ThickWaferRatio = 0 + + SearchString = 'DATE_OUT':@VM:OConv(Date, 'D4/') + RDSKeys = '' + Option = '' + Flag = '' + Set_Status(0) + Btree.Extract(SearchString, 'RDS', @DICT, RDSKeys, Option, Flag) + IF Not(Get_Status(errCode)) then + IF RDSKeys NE '' THEN + RDSCnt = COUNT(RDSKeys,@VM) + (RDSKeys NE '') + LOOP + @ID = RDSKeys[1,@VM] + RDSKeys[1,COL2()] = '' + READ @RECORD FROM RDSTable, @ID THEN + ReactorsOut = {WAFERS_IN} + If Not(Num(ReactorsOut)) then + // Log the WafersIn value + LogData = '' + LogData<1> = LoggingDTM + LogData<2> = @ID + LogData<3> = ReactorsOut + Logging_Services('AppendLog', objWafersLog, LogData, @RM, @FM) + ReactorsOut = ReactorsOut<1, 1, 1> + end + + CustScrap = {CUST_TOT_REJ} + IFXEpiScrap = {LSL_TOT_REJ} + TestKeys = XLATE('RDS_LAYER', @RECORD, 3, 'X') + TWProd = obj_RDS_Test('ProdTestCount',TestKeys) + Reactor = @RECORD + ReactorType = XLATE('REACTOR', Reactor, REACTOR_REACT_TYPE$, 'X') + Scrap = CustScrap + IFXEpiScrap + Yield = ReactorsOut - Scrap - TWProd + WafersOutTotal += ReactorsOut + YieldTotal += Yield + ScrapTotal += Scrap + ProdTestTotal += TWProd + ThickTarget = OConv({THICK_TARGET_TOT}, 'MD3') + TotalThickness += (ReactorsOut * ThickTarget) + end + UNTIL RDSKeys = '' + REPEAT + TotalThickness = TotalThickness[1, 'F.'] + end + end + + If Date EQ CurrDate then + // Calculate projected yield and projected thickness + Date = Date() + CurrTime = Time() + SearchString = 'DATE_OUT':@VM:OConv((Date - 1), 'D4/'):@FM:'TIME_OUT':@VM:'>':CurrTime + YesterdayRDSKeys = '' + Option = '' + Flag = '' + Set_Status(0) + Btree.Extract(SearchString, 'RDS', @DICT, YesterdayRDSKeys, Option, Flag) + If Not(Get_Status(errCode)) then + SearchString = 'DATE_OUT':@VM:Date + TodayRDSKeys = '' + Option = '' + Flag = '' + Set_Status(0) + Btree.Extract(SearchString, 'RDS', @DICT, TodayRDSKeys, Option, Flag) + If Not(Get_Status(errCode)) then + TotalRDSKeys = SRP_Array('Join', YesterdayRDSKeys, TodayRDSKeys, 'OR', @VM) + For each RDS in TotalRDSKeys using @VM + Database_Services('ActivateRecord', 'RDS', RDS) + ReactorsOut = {WAFERS_IN} + If Not(Num(ReactorsOut)) then + // Log the WafersIn value + LogData = '' + LogData<1> = LoggingDTM + LogData<2> = RDS + LogData<3> = ReactorsOut + Logging_Services('AppendLog', objWafersLog, LogData, @RM, @FM) + ReactorsOut = ReactorsOut<1, 1, 1> + end + CustScrap = {CUST_TOT_REJ} + IFXEpiScrap = {LSL_TOT_REJ} + TestKeys = XLATE('RDS_LAYER', @RECORD, 3, 'X') + TWProd = obj_RDS_Test('ProdTestCount',TestKeys) + Reactor = @RECORD + ReactorType = XLATE('REACTOR', Reactor, REACTOR_REACT_TYPE$, 'X') + Scrap = CustScrap + IFXEpiScrap + Yield = ReactorsOut - Scrap - TWProd + TotalYield24 += Yield + TargetThick = OConv({THICK_TARGET_TOT}, 'MD3') + TotalThickness24 += TargetThick * ReactorsOut + Next RDS + TotalThickness24 = TotalThickness24[1, 'F.'] + end + end + end + + If WafersOutTotal GT 0 then + ThickWaferRatio = TotalThickness / WafersOutTotal + // Round to one decimal + ThickWaferRatio = OConv(IConv(ThickWaferRatio, 'MD1'), 'MD1') + // Round to two decimals + YieldPercent = (YieldTotal / WafersOutTotal) * 100 + YieldPercent = OConv(IConv(YieldPercent, 'MD2'), 'MD2') + end + + If WafersOutTotal EQ 0 then WafersOutTotal = '' + If YieldTotal EQ 0 then YieldTotal = '' + If TotalYield24 EQ 0 then TotalYield24 = '' + If TotalThickness EQ 0 then TotalThickness = '' + If TotalThickness24 EQ 0 then TotalThickness24 = '' + + MetricsRec = '' + MetricsRec = WafersOutTotal + MetricsRec = YieldTotal + MetricsRec = TotalYield24 + MetricsRec = ScrapTotal + MetricsRec = ProdTestTotal + MetricsRec = DailyTarget + MetricsRec = TotalThickness + MetricsRec = TotalThickness24 + MetricsRec = ThickWaferRatio + MetricsRec = YieldPercent + Database_Services('WriteDataRow', 'DAILY_METRICS', Date, MetricsRec) + + Next Date + end + end + end + end service Service GetMetricsJSON(Date) - - // Get a week's worth of metrics and return them as JSON - StartDate = Date() - 6 - EndDate = Date() - - JSON = '' - hMetricsObj = '' - hMetricsArray = '' - hDayMetricsObj = '' - hStatusObj = '' - If SRP_JSON(hMetricsObj, 'NEW', 'OBJECT') then - If SRP_JSON(hMetricsArray, 'NEW', 'ARRAY') then - DateIndex = 1 - For Date = StartDate to EndDate - MetricsRec = Database_Services('ReadDataRow', 'DAILY_METRICS', Date) - // Create new date object - SRP_JSON(hDayMetricsObj, 'NEW', 'OBJECT') - // Add values - SRP_JSON(hDayMetricsObj, 'SETVALUE', 'date', OConv(Date, 'D4/')) - SRP_JSON(hDayMetricsObj, 'SETVALUE', 'target', MetricsRec) - SRP_JSON(hDayMetricsObj, 'SETVALUE', 'reactorOut', MetricsRec) - SRP_JSON(hDayMetricsObj, 'SETVALUE', 'yieldOut', MetricsRec) - SRP_JSON(hDayMetricsObj, 'SETVALUE', 'projected', MetricsRec) - SRP_JSON(hDayMetricsObj, 'SETVALUE', 'yieldPercent', MetricsRec, 'String') - // Add object to metrics array - SRP_JSON(hMetricsArray, 'ADD', hDayMetricsObj) - SRP_JSON(hDayMetricsObj, 'RELEASE') - Next Date - end - SRP_JSON(hMetricsObj, 'SET', 'dailyMetrics', hMetricsArray) - JSON = SRP_JSON(hMetricsObj, 'STRINGIFY', 'FAST') - SRP_JSON(hMetricsArray, 'RELEASE') - SRP_JSON(hStatusObj, 'RELEASE') - end else - Error_Services('Add', 'Error creating the metrics JSON object.') - end - - Response = JSON - + + // Get a week's worth of metrics and return them as JSON + StartDate = Date() - 6 + EndDate = Date() + + JSON = '' + hMetricsObj = '' + hMetricsArray = '' + hDayMetricsObj = '' + hStatusObj = '' + If SRP_JSON(hMetricsObj, 'NEW', 'OBJECT') then + If SRP_JSON(hMetricsArray, 'NEW', 'ARRAY') then + DateIndex = 1 + For Date = StartDate to EndDate + MetricsRec = Database_Services('ReadDataRow', 'DAILY_METRICS', Date) + // Create new date object + SRP_JSON(hDayMetricsObj, 'NEW', 'OBJECT') + // Add values + SRP_JSON(hDayMetricsObj, 'SETVALUE', 'date', OConv(Date, 'D4/')) + SRP_JSON(hDayMetricsObj, 'SETVALUE', 'target', MetricsRec) + SRP_JSON(hDayMetricsObj, 'SETVALUE', 'reactorOut', MetricsRec) + SRP_JSON(hDayMetricsObj, 'SETVALUE', 'yieldOut', MetricsRec) + SRP_JSON(hDayMetricsObj, 'SETVALUE', 'projected', MetricsRec) + SRP_JSON(hDayMetricsObj, 'SETVALUE', 'yieldPercent', MetricsRec, 'String') + // Add object to metrics array + SRP_JSON(hMetricsArray, 'ADD', hDayMetricsObj) + SRP_JSON(hDayMetricsObj, 'RELEASE') + Next Date + end + SRP_JSON(hMetricsObj, 'SET', 'dailyMetrics', hMetricsArray) + JSON = SRP_JSON(hMetricsObj, 'STRINGIFY', 'FAST') + SRP_JSON(hMetricsArray, 'RELEASE') + SRP_JSON(hStatusObj, 'RELEASE') + end else + Error_Services('Add', 'Error creating the metrics JSON object.') + end + + Response = JSON + end service Service GetThickMetricsJSON(Date) - - // Get a week's worth of metrics and return them as JSON - StartDate = Date() - 6 - EndDate = Date() - - JSON = '' - hMetricsObj = '' - hMetricsArray = '' - hDayMetricsObj = '' - If SRP_JSON(hMetricsObj, 'NEW', 'OBJECT') then - If SRP_JSON(hMetricsArray, 'NEW', 'ARRAY') then - DateIndex = 1 - For Date = StartDate to EndDate - MetricsRec = Database_Services('ReadDataRow', 'DAILY_METRICS', Date) - // Create new date object - SRP_JSON(hDayMetricsObj, 'NEW', 'OBJECT') - // Add values - SRP_JSON(hDayMetricsObj, 'SETVALUE', 'date', OConv(Date, 'D4/')) - SRP_JSON(hDayMetricsObj, 'SETVALUE', 'thickness', MetricsRec) - SRP_JSON(hDayMetricsObj, 'SETVALUE', 'projectedThickness', MetricsRec) - SRP_JSON(hDayMetricsObj, 'SETVALUE', 'thicknessWaferRatio', MetricsRec) - // Add object to metrics array - SRP_JSON(hMetricsArray, 'ADD', hDayMetricsObj) - SRP_JSON(hDayMetricsObj, 'RELEASE') - Next Date - end - SRP_JSON(hMetricsObj, 'SET', 'dailyMetrics', hMetricsArray) - JSON = SRP_JSON(hMetricsObj, 'STRINGIFY', 'FAST') - SRP_JSON(hMetricsArray, 'RELEASE') - SRP_JSON(hStatusObj, 'RELEASE') - end else - Error_Services('Add', 'Error creating the metrics JSON object.') - end - - Response = JSON - + + // Get a week's worth of metrics and return them as JSON + StartDate = Date() - 6 + EndDate = Date() + + JSON = '' + hMetricsObj = '' + hMetricsArray = '' + hDayMetricsObj = '' + If SRP_JSON(hMetricsObj, 'NEW', 'OBJECT') then + If SRP_JSON(hMetricsArray, 'NEW', 'ARRAY') then + DateIndex = 1 + For Date = StartDate to EndDate + MetricsRec = Database_Services('ReadDataRow', 'DAILY_METRICS', Date) + // Create new date object + SRP_JSON(hDayMetricsObj, 'NEW', 'OBJECT') + // Add values + SRP_JSON(hDayMetricsObj, 'SETVALUE', 'date', OConv(Date, 'D4/')) + SRP_JSON(hDayMetricsObj, 'SETVALUE', 'thickness', MetricsRec) + SRP_JSON(hDayMetricsObj, 'SETVALUE', 'projectedThickness', MetricsRec) + SRP_JSON(hDayMetricsObj, 'SETVALUE', 'thicknessWaferRatio', MetricsRec) + // Add object to metrics array + SRP_JSON(hMetricsArray, 'ADD', hDayMetricsObj) + SRP_JSON(hDayMetricsObj, 'RELEASE') + Next Date + end + SRP_JSON(hMetricsObj, 'SET', 'dailyMetrics', hMetricsArray) + JSON = SRP_JSON(hMetricsObj, 'STRINGIFY', 'FAST') + SRP_JSON(hMetricsArray, 'RELEASE') + SRP_JSON(hStatusObj, 'RELEASE') + end else + Error_Services('Add', 'Error creating the metrics JSON object.') + end + + Response = JSON + end service Service GetMaterialTrackJSON() - - MatRep = Database_Services('ReadDataRow', 'SYSLISTS', 'MAT_REPORT') - If Error_Services('NoError') then - MatRepJSON = '' - If SRP_JSON(objJSON, 'New', 'Object') then - If SRP_JSON(objReactArray, 'New', 'Array') then - For each Row in MatRep using @FM setting fPos - KitRunOrder = Row<0, 13> - PTIRunOrder = Row<0, 14> - LoadRunOrder = Row<0, 15> - If KitRunOrder NE '' or PTIRunOrder NE '' or LoadRunOrder NE '' then - If SRP_JSON(objRow, 'New', 'Object') then - SRP_JSON(objRow, 'SetValue', 'reactorNo', Row<0, 1>) - SRP_JSON(objRow, 'SetValue', 'reactorType', Row<0, 2>) - SRP_JSON(objRow, 'SetValue', 'workOrderNo', Row<0, 3>) - SRP_JSON(objRow, 'SetValue', 'sapProdNo', Row<0, 4>) - SRP_JSON(objRow, 'SetValue', 'subPartNo', Row<0, 5>) - SRP_JSON(objRow, 'SetValue', 'epiPartNo', Row<0, 6>) - WOQty = Row<0, 7> - Swap ',' with '' in WOQty - SRP_JSON(objRow, 'SetValue', 'woQty', WOQty) - RxQty = Row<0, 8> - Swap ',' with '' in RxQty - SRP_JSON(objRow, 'SetValue', 'rxQty', RxQty) - UnRelQty = Row<0, 9> - Swap ',' with '' in UnRelQty - SRP_JSON(objRow, 'SetValue', 'unRelQty', UnRelQty) - SRP_JSON(objRow, 'SetValue', 'kitLoc', Row<0, 10>) - KitQty = Row<0, 11> - Swap ',' with '' in KitQty - SRP_JSON(objRow, 'SetValue', 'kitQty', KitQty) - SRP_JSON(objRow, 'SetValue', 'cassDelta', Row<0, 12>) - Swap ',' with ', ' in KitRunOrder - SRP_JSON(objRow, 'SetValue', 'kitRunOrder', KitRunOrder) - Swap ',' with ', ' in PTIRunOrder - SRP_JSON(objRow, 'SetValue', 'ptiRunOrder', PTIRunOrder) - Swap ',' with ', ' in LoadRunOrder - SRP_JSON(objRow, 'SetValue', 'loadRunOrder', LoadRunOrder) - SRP_JSON(objRow, 'SetValue', 'comments', Row<0, 16>) - SRP_JSON(objReactArray, 'Add', objRow) - SRP_JSON(objRow, 'Release') - end - end - Next Row - SRP_JSON(objJSON, 'Set', 'matReport', objReactArray) - SRP_JSON(objReactArray, 'Release') - end - Response = SRP_JSON(objJSON, 'Stringify', 'Styled') - SRP_JSON(objJSON, 'Release') - end - end - + + ErrCode = '' + KeyList = '' + Query = 'SELECT MATERIAL_REPORT BY REACT_NO BY WO_NO' + RList(Query, TARGET_ACTIVELIST$, '', '', '') + If Not(Get_Status(ErrCode)) then + EOF = False$ + Loop + ReadNext KeyId else EOF = True$ + Until EOF + KeyList<-1> = KeyId + Repeat + If KeyList NE '' then + MatRepJSON = '' + If SRP_JSON(objJSON, 'New', 'Object') then + If SRP_JSON(objReactArray, 'New', 'Array') then + For each KeyId in KeyList using @FM setting fPos + Row = Database_Services('ReadDataRow', 'MATERIAL_REPORT', KeyId) + If Error_Services('NoError') then + KitRunOrder = Row + PTIRunOrder = Row + LoadRunOrder = Row + If KitRunOrder NE '' or PTIRunOrder NE '' or LoadRunOrder NE '' then + If SRP_JSON(objRow, 'New', 'Object') then + SRP_JSON(objRow, 'SetValue', 'KeyId', KeyId) + SRP_JSON(objRow, 'SetValue', 'ReactorNo', Row) + SRP_JSON(objRow, 'SetValue', 'ReactorType', Row) + SRP_JSON(objRow, 'SetValue', 'WorkOrderNo', Row) + SRP_JSON(objRow, 'SetValue', 'SapProdNo', Row) + SRP_JSON(objRow, 'SetValue', 'SubPartNo', Row) + SRP_JSON(objRow, 'SetValue', 'EpiPartNo', Row) + WOQty = Row + Swap ',' with '' in WOQty + SRP_JSON(objRow, 'SetValue', 'WoQty', WOQty) + RxQty = Row + Swap ',' with '' in RxQty + SRP_JSON(objRow, 'SetValue', 'RxQty', RxQty) + UnRelQty = Row + Swap ',' with '' in UnRelQty + SRP_JSON(objRow, 'SetValue', 'UnRelQty', UnRelQty) + SRP_JSON(objRow, 'SetValue', 'KitLoc', Row) + KitQty = Row + Swap ',' with '' in KitQty + SRP_JSON(objRow, 'SetValue', 'KitQty', KitQty) + SRP_JSON(objRow, 'SetValue', 'CassDelta', Row) + Swap ',' with ', ' in KitRunOrder + SRP_JSON(objRow, 'SetValue', 'KitRunOrder', KitRunOrder) + SRP_JSON(objRow, 'SetValue', 'KitDemand', Row) + Swap ',' with ', ' in PTIRunOrder + SRP_JSON(objRow, 'SetValue', 'PtiRunOrder', PTIRunOrder) + Swap ',' with ', ' in LoadRunOrder + SRP_JSON(objRow, 'SetValue', 'LoadRunOrder', LoadRunOrder) + SRP_JSON(objRow, 'SetValue', 'Comments', Row) + SRP_JSON(objReactArray, 'Add', objRow) + SRP_JSON(objRow, 'Release') + end + end + end + Next KeyId + SRP_JSON(objJSON, 'Set', 'MaterialReport', objReactArray) + SRP_JSON(objReactArray, 'Release') + end + Response = SRP_JSON(objJSON, 'Stringify', 'Styled') + SRP_JSON(objJSON, 'Release') + end + end else + Error_Services('Add', 'Error in ':Service:' service. No rows returned.') + end + end else + Error_Services('Add', 'Error in ':Service:' service. Error calling RList. Error message: ':ErrCode) + end + end service Service CalcDailyPerformanceData(DateOut) - - hSysLists = Database_Services('GetTableHandle', 'SYSLISTS') + + hSysLists = Database_Services('GetTableHandle', 'SYSLISTS') Lock hSysLists, ServiceKeyID then - LogData = '' - LogData<1> = LoggingDtm - LogData<2> = '1' - LogData<3> = 'Begin service.' - Logging_Services('AppendLog', objReportsLog, LogData, @RM, @FM) - - Response = '' - CurrDate = Date() - CurrDTM = Datetime() - ReportDate = IConv(DateOut, 'D') - ReportData = '' - - // Clear out previous daily_performance metrics - table_name = "DAILY_PERFORMANCE" - flag = "" - done = False$ - CursorVar = "" - - For counter = 0 To 8 - ClearSelect counter - Next counter - - sort_list = "DATE_OUT" - Reduce_Script = "WITH {DATE_OUT} EQ '":OConv(ReportDate, 'D4/'):"'" - mode = NEXT_CUR$ - DeleteKeyList = '' - LogData = '' - LogData<1> = LoggingDtm - LogData<2> = '2' - LogData<3> = 'Calling Reduce with query "':Reduce_Script:'" using next available cursor.' - Logging_Services('AppendLog', objReportsLog, LogData, @RM, @FM) - - Reduce(reduce_script, sort_list, mode, table_name, Cursorvar, flag) - If flag then - Select table_name By sort_list Using Cursorvar then - Open table_name To file_var then - Loop - ReadNext KeyID Using Cursorvar By AT Else done = TRUE$ - Until done - DeleteKeyList<-1> = KeyID - Repeat - End - end - End - LogData = '' - LogData<1> = LoggingDtm - LogData<2> = '3' - LogData<3> = 'Deleting selected records.' - Logging_Services('AppendLog', objReportsLog, LogData, @RM, @FM) - - If DeleteKeyList NE '' then - For each KeyID in DeleteKeyList using @FM - Database_Services('DeleteDataRow', 'DAILY_PERFORMANCE', KeyID, True$, False$) - Next KeyID - end - - // Begin by building DAILY_PERFORMANCE data from RDS table. We will need to supplement this below - // for work orders / parts that do not have any cassettes unloaded yet. - Query = 'SELECT RDS WITH DATE_OUT EQ ':Quote(OConv(ReportDate, 'D4/')): ' BY REACTOR' - EOF = False$ - ErrCode = '' - ReportData = '' - RawData = '' - - // Clear cursors for good measure - For counter = 0 To 8 - ClearSelect counter - Next counter - LogData = '' - LogData<1> = LoggingDtm - LogData<2> = '4' - LogData<3> = 'Selecting RDS records using query "':Query:'".' - Logging_Services('AppendLog', objReportsLog, LogData, @RM, @FM) - - RList(Query, TARGET_ACTIVELIST$, '', '', '') - RowIndex = 0 - If Not(Get_Status(ErrCode)) then - Loop - ReadNext KeyID else EOF = True$ - Until EOF - RowIndex += 1 - Database_Services('ActivateRecord', 'RDS', KeyID) - If Error_Services('NoError') then - Reactor = {REACTOR} - PSN = {PROD_SPEC_ID} - DateOut = {DATE_OUT} - PartNo = {PART_NUM} - WafersOut = {WAFERS_IN} - DtmIn = {DTM_IN} - DtmOut = {DTM_OUT} - ReportKey = DateOut:'*':Reactor:'*':PSN:'*':PartNo - ReportRow = Database_Services('ReadDataRow', 'DAILY_PERFORMANCE', ReportKey) - RepWafersOut = ReportRow - RepWafersOut += WafersOut - ReportRow = RepWafersOut - Database_Services('WriteDataRow', 'DAILY_PERFORMANCE', ReportKey, ReportRow) - end - Repeat - end - - Reactors = Reactor_Services('GetReactorNumbers') - RowIndex = 0 - For each ReactorNo in Reactors using @FM setting RIndex - ReactorAssign = Xlate('REACTOR', ReactorNo, 'REACT_ASSIGNMENT', 'X') - // Only report reactors that are not out of service. - If ReactorAssign NE 'O' then - KeyList = '' - ReportRow = '' - ReportRow<0, 1> = ReactorNo - - // Supplement DAILY_PERFORMANCE data for work orders / parts that do not have any cassettes unloaded yet. - // Get the scheduled PSN, PartNo, and ReactType - SchedWONos = '' - SchedPSNs = '' - SchedEpiParts = '' - SchedDetKeyIDs = '' - // The below EpiPro reactors are scheduled via a "sister" reactor (e.g. 44 for 46) - If ( (ReactorNo EQ 42) or (ReactorNo EQ 46) or (ReactorNo EQ 50) or (ReactorNo EQ 54) ) then - QueryReactorNo = ReactorNo - 2 - end else - QueryReactorNo = ReactorNo - end - Query = "SELECT SCHED_DET_NG WITH REACT_NO EQ ":QueryReactorNo:" AND WITH BLOCK_OUT NE 1 AND WITH START_DTM LT '":OConv(ReportDate + 1, 'DT2/^H'):"' AND WITH STOP_DTM GT '":OConv(ReportDate, 'DT2/^H'):"'" - LogData = '' - LogData<1> = LoggingDtm - LogData<2> = '5.':RIndex:'.1' - LogData<3> = 'Selecting SCHED_DET_NG records for reactor ':ReactorNo:' using query "':Query:'".' - Logging_Services('AppendLog', objReportsLog, LogData, @RM, @FM) - - // Clear cursors for good measure. - For counter = 0 To 8 - ClearSelect counter - Next counter - - RList(Query, TARGET_ACTIVELIST$, '', '', '') - If Not(Get_Status(ErrCode)) then - EOF = False$ - Loop - ReadNext SchedKeyID else EOF = True$ - Until EOF - SchedDetKeyIDs<0, -1> = SchedKeyID - Repeat - end - LogData = '' - LogData<1> = LoggingDtm - LogData<2> = '5.':RIndex:'.2' - LogData<3> = 'Reading SCHED_DET_NG records for reactor ':ReactorNo:'.' - Logging_Services('AppendLog', objReportsLog, LogData, @RM, @FM) - - If SchedDetKeyIDs NE '' then - If Error_Services('NoError') then - HoursUp = '' - SchedKeys = '' - For Each SchedDetKeyID in SchedDetKeyIDs using @VM setting vPos - SchedDetRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', SchedDetKeyID) - SchedWONo = SchedDetRec - SchedStartDtm = SchedDetRec - SchedStopDtm = SchedDetRec - SchedStartDt = SchedStartDTM[1, 'F.'] - SchedStopDt = SchedStopDTM[1, 'F.'] - Begin Case - Case SchedStopDt EQ ReportDate - // This scheduled part is ending - If SchedStopDtm GT CurrDtm then - HoursUp<0, vPos> = (CurrDtm - ReportDate) * 24 - end else - HoursUp<0, vPos> = (SchedStopDtm - ReportDate) * 24 - end - Case SchedStartDt EQ ReportDate - // This scheduled part is starting on the day of the report - Begin Case - Case SchedStartDtm GT CurrDtm - TempHours = 0 - Case ReportDate EQ CurrDate - TempHours = ( ( CurrDtm - SchedStartDtm) * 24 ) - Case Otherwise$ - TempHours = ( ( (ReportDate + 1) - SchedStartDtm) * 24 ) - End Case - If TempHours LT 0 then TempHours = 0 - HoursUp<0, vPos> = TempHours - Case ReportDate EQ CurrDate - // Part is still running. Calculate how long it has been up today. - HoursUp<0, vPos> = (CurrDtm - ReportDate) * 24 - Case Otherwise$ - HoursUp<0, vPos> = 24 - End Case - SchedWONos<0, -1> = SchedWONo - SchedPSN = Xlate('WO_LOG', SchedWONo, 'PS_NO', 'X') - SchedPSNs<0, -1> = SchedPSN - SchedEpiParts<0, -1> = Xlate('WO_LOG', SchedWONo, 'EPI_PART_NO', 'X') - - SchedKeys<0, -1> = SchedDetKeyID - Next SchedDetKeyID - end - end - LogData = '' - LogData<1> = LoggingDtm - LogData<2> = '5.':RIndex:'.3' - LogData<3> = 'Writing new DAILY_PERFORMANCE records reactor ':ReactorNo:'.' - Logging_Services('AppendLog', objReportsLog, LogData, @RM, @FM) - - RepEpiParts = SRP_Array('Clean', SchedEpiParts, 'TrimAndMakeUnique', @VM) - If RepEpiParts NE '' then - For each SchedEpiPart in RepEpiParts using @VM setting vPos - If SchedEpiPart NE '' then - Locate SchedEpiPart in SchedEpiParts using @VM setting sPos then - SchedPSN = SchedPSNs<0, sPos> - end - end else - SchedPSN = '' - end - PSN = SchedPSN - PartNo = SchedEpiPart - PerfKey = DateOut:'*':ReactorNo:'*':PSN:'*':PartNo - PerfRow = Database_Services('ReadDataRow', 'DAILY_PERFORMANCE', PerfKey) - RepWafersOut = PerfRow - If RepWafersOut EQ '' then RepWafersOut = 0 - PerfRow = RepWafersOut - PerfRow = OConv(IConv(HoursUp<0, vPos>, 'MD2'), 'MD2') - PerfRow = SchedKeys<0, vPos> - Database_Services('WriteDataRow', 'DAILY_PERFORMANCE', PerfKey, PerfRow) - Next SchedEpiPart - end - // Merge in Changeover data and build the report row from the DAILY_PERFORMANCE data generated above. - - table_name = "DAILY_PERFORMANCE" - flag = "" - done = False$ - CursorVar = "" - - * Clears all cursors - For counter = 0 To 8 - ClearSelect counter - Next counter - - sort_list = "DATE_OUT" - Reduce_Script = "WITH {REACTOR} EQ '":ReactorNo:"' AND WITH {DATE_OUT} EQ '":OConv(ReportDate, 'D4/'):"'" - mode = NEXT_CUR$ + LogData = '' + LogData<1> = LoggingDtm + LogData<2> = '1' + LogData<3> = 'Begin service.' + Logging_Services('AppendLog', objReportsLog, LogData, @RM, @FM) + + Response = '' + CurrDate = Date() + CurrDTM = Datetime() + ReportDate = IConv(DateOut, 'D') + ReportData = '' + + // Clear out previous daily_performance metrics + table_name = "DAILY_PERFORMANCE" + flag = "" + done = False$ + CursorVar = "" + + For counter = 0 To 8 + ClearSelect counter + Next counter + + sort_list = "DATE_OUT" + Reduce_Script = "WITH {DATE_OUT} EQ '":OConv(ReportDate, 'D4/'):"'" + mode = NEXT_CUR$ + DeleteKeyList = '' + LogData = '' + LogData<1> = LoggingDtm + LogData<2> = '2' + LogData<3> = 'Calling Reduce with query "':Reduce_Script:'" using next available cursor.' + Logging_Services('AppendLog', objReportsLog, LogData, @RM, @FM) + + Reduce(reduce_script, sort_list, mode, table_name, Cursorvar, flag) + If flag then + Select table_name By sort_list Using Cursorvar then + Open table_name To file_var then + Loop + ReadNext KeyID Using Cursorvar By AT Else done = TRUE$ + Until done + DeleteKeyList<-1> = KeyID + Repeat + End + end + End + LogData = '' + LogData<1> = LoggingDtm + LogData<2> = '3' + LogData<3> = 'Deleting selected records.' + Logging_Services('AppendLog', objReportsLog, LogData, @RM, @FM) + + If DeleteKeyList NE '' then + For each KeyID in DeleteKeyList using @FM + Database_Services('DeleteDataRow', 'DAILY_PERFORMANCE', KeyID, True$, False$) + Next KeyID + end + + // Begin by building DAILY_PERFORMANCE data from RDS table. We will need to supplement this below + // for work orders / parts that do not have any cassettes unloaded yet. + Query = 'SELECT RDS WITH DATE_OUT EQ ':Quote(OConv(ReportDate, 'D4/')): ' BY REACTOR' + EOF = False$ + ErrCode = '' + ReportData = '' + RawData = '' + + // Clear cursors for good measure + For counter = 0 To 8 + ClearSelect counter + Next counter + LogData = '' + LogData<1> = LoggingDtm + LogData<2> = '4' + LogData<3> = 'Selecting RDS records using query "':Query:'".' + Logging_Services('AppendLog', objReportsLog, LogData, @RM, @FM) + + RList(Query, TARGET_ACTIVELIST$, '', '', '') + RowIndex = 0 + If Not(Get_Status(ErrCode)) then + Loop + ReadNext KeyID else EOF = True$ + Until EOF + RowIndex += 1 + Database_Services('ActivateRecord', 'RDS', KeyID) + If Error_Services('NoError') then + Reactor = {REACTOR} + PSN = {PROD_SPEC_ID} + DateOut = {DATE_OUT} + PartNo = {PART_NUM} + WafersOut = {WAFERS_IN} + DtmIn = {DTM_IN} + DtmOut = {DTM_OUT} + ReportKey = DateOut:'*':Reactor:'*':PSN:'*':PartNo + ReportRow = Database_Services('ReadDataRow', 'DAILY_PERFORMANCE', ReportKey) + RepWafersOut = ReportRow + RepWafersOut += WafersOut + ReportRow = RepWafersOut + Database_Services('WriteDataRow', 'DAILY_PERFORMANCE', ReportKey, ReportRow) + end + Repeat + end + + Reactors = Reactor_Services('GetReactorNumbers') + RowIndex = 0 + For each ReactorNo in Reactors using @FM setting RIndex + ReactorAssign = Xlate('REACTOR', ReactorNo, 'REACT_ASSIGNMENT', 'X') + // Only report reactors that are not out of service. + If ReactorAssign NE 'O' then + KeyList = '' + ReportRow = '' + ReportRow<0, 1> = ReactorNo + + // Supplement DAILY_PERFORMANCE data for work orders / parts that do not have any cassettes unloaded yet. + // Get the scheduled PSN, PartNo, and ReactType + SchedWONos = '' + SchedPSNs = '' + SchedEpiParts = '' + SchedDetKeyIDs = '' + // The below EpiPro reactors are scheduled via a "sister" reactor (e.g. 44 for 46) + If ( (ReactorNo EQ 42) or (ReactorNo EQ 46) or (ReactorNo EQ 50) or (ReactorNo EQ 54) ) then + QueryReactorNo = ReactorNo - 2 + end else + QueryReactorNo = ReactorNo + end + Query = "SELECT SCHED_DET_NG WITH REACT_NO EQ ":QueryReactorNo:" AND WITH BLOCK_OUT NE 1 AND WITH START_DTM LT '":OConv(ReportDate + 1, 'DT2/^H'):"' AND WITH STOP_DTM GT '":OConv(ReportDate, 'DT2/^H'):"'" LogData = '' - LogData<1> = LoggingDtm - LogData<2> = '5.':RIndex:'.4' - LogData<3> = 'Selecting new DAILY_PERFORMANCE records for reactor ':ReactorNo:' using query "':Reduce_Script:'" via Reduce.' - Logging_Services('AppendLog', objReportsLog, LogData, @RM, @FM) - - Reduce(reduce_script, sort_list, mode, table_name, Cursorvar, flag) - If flag then - Select table_name By sort_list Using Cursorvar then - Open table_name To file_var then - Loop - ReadNext KeyID Using Cursorvar By AT Else done = TRUE$ - Until done - KeyList<-1> = KeyID - Repeat - End - end - End - LogData = '' - LogData<1> = LoggingDtm - LogData<2> = '5.':RIndex:'.5' - LogData<3> = 'Updating new DAILY_PERFORMANCE records for reactor ':ReactorNo:'.' - Logging_Services('AppendLog', objReportsLog, LogData, @RM, @FM) - - If KeyList NE '' then - // Build the final report row with data compiled above. - For each KeyID in KeyList using @FM setting fPos - WafersOut = Xlate('DAILY_PERFORMANCE', KeyID, 'WAFERS_OUT', 'X') - PSN = Field(KeyID, '*', 3) - PartNo = Field(KeyID, '*', 4) - ReactType = Xlate('REACTOR', ReactorNo, 'REACT_TYPE', 'X') - If ReactType EQ 'EPP' then ReactType = 'EPIPRO' - ReportRow<0, 2, -1> = PSN - ReportRow<0, 3, -1> = PartNo - HoursOnPart = Xlate('DAILY_PERFORMANCE', KeyID, 'HOURS_ON_PART', 'X') - ReportRow<0, 4, -1> = OConv(IConv(HoursOnPart, 'MD2'), 'MD2') - ReportRow<0, 5, -1> = WafersOut ; // ActualOuts - ReportRow<0, 6, -1> = XLATE('DAILY_PERFORMANCE', KeyID, DAILY_PERFORMANCE.SCHED_DET_KEY_IDS$, 'X') - ReportRow<0, 7> = ReactorNo - Next KeyID - ReportData<-1> = ReportRow - end - end - - Next ReactorNo - LogData = '' - LogData<1> = LoggingDtm - LogData<2> = '6' - LogData<3> = 'Begin building DAILY_PERFORMANCE_REPORT rows.' - Logging_Services('AppendLog', objReportsLog, LogData, @RM, @FM) - - ReportKeys = '' - For each Row in ReportData using @FM setting fPos - LogData = '' + LogData<1> = LoggingDtm + LogData<2> = '5.':RIndex:'.1' + LogData<3> = 'Selecting SCHED_DET_NG records for reactor ':ReactorNo:' using query "':Query:'".' + Logging_Services('AppendLog', objReportsLog, LogData, @RM, @FM) + + // Clear cursors for good measure. + For counter = 0 To 8 + ClearSelect counter + Next counter + + RList(Query, TARGET_ACTIVELIST$, '', '', '') + If Not(Get_Status(ErrCode)) then + EOF = False$ + Loop + ReadNext SchedKeyID else EOF = True$ + Until EOF + SchedDetKeyIDs<0, -1> = SchedKeyID + Repeat + end + LogData = '' + LogData<1> = LoggingDtm + LogData<2> = '5.':RIndex:'.2' + LogData<3> = 'Reading SCHED_DET_NG records for reactor ':ReactorNo:'.' + Logging_Services('AppendLog', objReportsLog, LogData, @RM, @FM) + + If SchedDetKeyIDs NE '' then + If Error_Services('NoError') then + HoursUp = '' + SchedKeys = '' + For Each SchedDetKeyID in SchedDetKeyIDs using @VM setting vPos + SchedDetRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', SchedDetKeyID) + SchedWONo = SchedDetRec + SchedStartDtm = SchedDetRec + SchedStopDtm = SchedDetRec + SchedStartDt = SchedStartDTM[1, 'F.'] + SchedStopDt = SchedStopDTM[1, 'F.'] + Begin Case + Case SchedStopDt EQ ReportDate + // This scheduled part is ending + If SchedStopDtm GT CurrDtm then + HoursUp<0, vPos> = (CurrDtm - ReportDate) * 24 + end else + HoursUp<0, vPos> = (SchedStopDtm - ReportDate) * 24 + end + Case SchedStartDt EQ ReportDate + // This scheduled part is starting on the day of the report + Begin Case + Case SchedStartDtm GT CurrDtm + TempHours = 0 + Case ReportDate EQ CurrDate + TempHours = ( ( CurrDtm - SchedStartDtm) * 24 ) + Case Otherwise$ + TempHours = ( ( (ReportDate + 1) - SchedStartDtm) * 24 ) + End Case + If TempHours LT 0 then TempHours = 0 + HoursUp<0, vPos> = TempHours + Case ReportDate EQ CurrDate + // Part is still running. Calculate how long it has been up today. + HoursUp<0, vPos> = (CurrDtm - ReportDate) * 24 + Case Otherwise$ + HoursUp<0, vPos> = 24 + End Case + SchedWONos<0, -1> = SchedWONo + SchedPSN = Xlate('WO_LOG', SchedWONo, 'PS_NO', 'X') + SchedPSNs<0, -1> = SchedPSN + SchedEpiParts<0, -1> = Xlate('WO_LOG', SchedWONo, 'EPI_PART_NO', 'X') + + SchedKeys<0, -1> = SchedDetKeyID + Next SchedDetKeyID + end + end + LogData = '' + LogData<1> = LoggingDtm + LogData<2> = '5.':RIndex:'.3' + LogData<3> = 'Writing new DAILY_PERFORMANCE records reactor ':ReactorNo:'.' + Logging_Services('AppendLog', objReportsLog, LogData, @RM, @FM) + + RepEpiParts = SRP_Array('Clean', SchedEpiParts, 'TrimAndMakeUnique', @VM) + If RepEpiParts NE '' then + For each SchedEpiPart in RepEpiParts using @VM setting vPos + If SchedEpiPart NE '' then + Locate SchedEpiPart in SchedEpiParts using @VM setting sPos then + SchedPSN = SchedPSNs<0, sPos> + end + end else + SchedPSN = '' + end + PSN = SchedPSN + PartNo = SchedEpiPart + PerfKey = DateOut:'*':ReactorNo:'*':PSN:'*':PartNo + PerfRow = Database_Services('ReadDataRow', 'DAILY_PERFORMANCE', PerfKey) + RepWafersOut = PerfRow + If RepWafersOut EQ '' then RepWafersOut = 0 + PerfRow = RepWafersOut + PerfRow = OConv(IConv(HoursUp<0, vPos>, 'MD2'), 'MD2') + PerfRow = SchedKeys<0, vPos> + Database_Services('WriteDataRow', 'DAILY_PERFORMANCE', PerfKey, PerfRow) + Next SchedEpiPart + end + // Merge in Changeover data and build the report row from the DAILY_PERFORMANCE data generated above. + + table_name = "DAILY_PERFORMANCE" + flag = "" + done = False$ + CursorVar = "" + + * Clears all cursors + For counter = 0 To 8 + ClearSelect counter + Next counter + + sort_list = "DATE_OUT" + Reduce_Script = "WITH {REACTOR} EQ '":ReactorNo:"' AND WITH {DATE_OUT} EQ '":OConv(ReportDate, 'D4/'):"'" + mode = NEXT_CUR$ + LogData = '' + LogData<1> = LoggingDtm + LogData<2> = '5.':RIndex:'.4' + LogData<3> = 'Selecting new DAILY_PERFORMANCE records for reactor ':ReactorNo:' using query "':Reduce_Script:'" via Reduce.' + Logging_Services('AppendLog', objReportsLog, LogData, @RM, @FM) + + Reduce(reduce_script, sort_list, mode, table_name, Cursorvar, flag) + If flag then + Select table_name By sort_list Using Cursorvar then + Open table_name To file_var then + Loop + ReadNext KeyID Using Cursorvar By AT Else done = TRUE$ + Until done + KeyList<-1> = KeyID + Repeat + End + end + End + LogData = '' + LogData<1> = LoggingDtm + LogData<2> = '5.':RIndex:'.5' + LogData<3> = 'Updating new DAILY_PERFORMANCE records for reactor ':ReactorNo:'.' + Logging_Services('AppendLog', objReportsLog, LogData, @RM, @FM) + + If KeyList NE '' then + // Build the final report row with data compiled above. + For each KeyID in KeyList using @FM setting fPos + WafersOut = Xlate('DAILY_PERFORMANCE', KeyID, 'WAFERS_OUT', 'X') + PSN = Field(KeyID, '*', 3) + PartNo = Field(KeyID, '*', 4) + ReactType = Xlate('REACTOR', ReactorNo, 'REACT_TYPE', 'X') + If ReactType EQ 'EPP' then ReactType = 'EPIPRO' + ReportRow<0, 2, -1> = PSN + ReportRow<0, 3, -1> = PartNo + HoursOnPart = Xlate('DAILY_PERFORMANCE', KeyID, 'HOURS_ON_PART', 'X') + ReportRow<0, 4, -1> = OConv(IConv(HoursOnPart, 'MD2'), 'MD2') + ReportRow<0, 5, -1> = WafersOut ; // ActualOuts + ReportRow<0, 6, -1> = XLATE('DAILY_PERFORMANCE', KeyID, DAILY_PERFORMANCE.SCHED_DET_KEY_IDS$, 'X') + ReportRow<0, 7> = ReactorNo + Next KeyID + ReportData<-1> = ReportRow + end + end + + Next ReactorNo + LogData = '' + LogData<1> = LoggingDtm + LogData<2> = '6' + LogData<3> = 'Begin building DAILY_PERFORMANCE_REPORT rows.' + Logging_Services('AppendLog', objReportsLog, LogData, @RM, @FM) + + ReportKeys = '' + For each Row in ReportData using @FM setting fPos + LogData = '' LogData<1> = LoggingDtm - LogData<2> = '6.':fPos - LogData<3> = 'Building DAILY_PERFORMANCE_REPORT row ':fPos:'.' - Logging_Services('AppendLog', objReportsLog, LogData, @RM, @FM) - - PSNs = Row<0, 2> - NumPSNs = DCount(Row<0, 2>, @SVM) - If NumPSNs GT 0 then - For PSNIndex = 1 to NumPSNs - KeyID = ReportDate:'*':Row<0, 1>:'*':Row<0, 2, PSNIndex>:'*':Row<0, 3, PSNIndex> - ReportKeys<0, -1> = KeyID - If RowExists('DAILY_PERFORMANCE_REPORT', KeyID) then - Rec = Database_Services('ReadDataRow', 'DAILY_PERFORMANCE_REPORT', KeyID) - end else - Rec = '' - end - Rec = Row<0, 4, PSNIndex> - Rec = Row<0, 5, PSNIndex> - ActualStartDTM = '' - ActualStopDTM = '' - SchedDetRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', Row<0, 6, PSNIndex>) - SchedDetStartDTM = SchedDetRec - SchedDetStopDTM = SchedDetRec - If SchedDetStartDTM LT ReportDate then - ActualStartDTM = ReportDate - end else - ActualStartDTM = SchedDetStartDTM - end - If SchedDetStopDTM GT ReportDate + 1 then - ActualStopDTM = ReportDate + 1 - end else - ActualStopDTM = SchedDetStopDTM - end - Rec = ActualStartDTM - Rec = ActualStopDTM - - //Get Mode Metric here - EQU PRODUCTIVE$ To 1 - EQU UNSCHED$ to 2 - EQU SCHED$ to 3 - TotalReactorData = Reactor_Services('GetReactorUptimeMetricsByTimeSpan', Row<0, 7> , ActualStartDTM, ActualStopDTM) - Rec = TotalReactorData<1, PRODUCTIVE$> - Rec = TotalReactorData<2, PRODUCTIVE$> - Rec = TotalReactorData<1, UNSCHED$> - Rec = TotalReactorData<2, UNSCHED$> - Rec = TotalReactorData<2, SCHED$> - Rec = TotalReactorData<1, SCHED$> - - Database_Services('WriteDataRow', 'DAILY_PERFORMANCE_REPORT', KeyID, Rec) - Next PSNIndex - end else - // Nothing ran or is scheduled on this reactor - KeyID = ReportDate:'*':Row<0, 1>:'*':Row<0, 2, PSNIndex>:'*':Row<0, 3, PSNIndex> - ReportKeys<0, -1> = KeyID - If RowExists('DAILY_PERFORMANCE_REPORT', KeyID) then - Rec = Database_Services('ReadDataRow', 'DAILY_PERFORMANCE_REPORT', KeyID) - end else - Rec = '' - end - Rec = 0 - Rec = 0 - Database_Services('WriteDataRow', 'DAILY_PERFORMANCE_REPORT', KeyID, Rec) - end - Next Row - - // Clean out any rows that weren't just generated. - table_name = "DAILY_PERFORMANCE_REPORT" - flag = "" - done = False$ - CursorVar = "" - * Clears all cursors - For counter = 0 To 8 - ClearSelect counter - Next counter - sort_list = "DATE_OUT" - Reduce_Script = "WITH {DATE_OUT} EQ '":OConv(ReportDate, 'D4/'):"'" - mode = NEXT_CUR$ - LogData = '' - LogData<1> = LoggingDtm - LogData<2> = '7' - LogData<3> = 'Selecing DAILY_PERFORMANCE_REPORT rows to delete using query "':Reduce_Script:'" via Reduce.' - Logging_Services('AppendLog', objReportsLog, LogData, @RM, @FM) - - Reduce(reduce_script, sort_list, mode, table_name, Cursorvar, flag) - If flag then - Select table_name By sort_list Using Cursorvar then - Open table_name To file_var then - Loop - ReadNext KeyID Using Cursorvar By AT Else done = TRUE$ - Until done - Locate KeyID in ReportKeys using @VM setting vPos else - Database_Services('DeleteDataRow', 'DAILY_PERFORMANCE_REPORT', KeyID) - end - Repeat - End - end - end - LogData = '' - LogData<1> = LoggingDtm - LogData<2> = '8' - LogData<3> = 'End service.' - Logging_Services('AppendLog', objReportsLog, LogData, @RM, @FM) - - Unlock hSysLists, ServiceKeyID else Null - end - + LogData<2> = '6.':fPos + LogData<3> = 'Building DAILY_PERFORMANCE_REPORT row ':fPos:'.' + Logging_Services('AppendLog', objReportsLog, LogData, @RM, @FM) + + PSNs = Row<0, 2> + NumPSNs = DCount(Row<0, 2>, @SVM) + If NumPSNs GT 0 then + For PSNIndex = 1 to NumPSNs + KeyID = ReportDate:'*':Row<0, 1>:'*':Row<0, 2, PSNIndex>:'*':Row<0, 3, PSNIndex> + ReportKeys<0, -1> = KeyID + If RowExists('DAILY_PERFORMANCE_REPORT', KeyID) then + Rec = Database_Services('ReadDataRow', 'DAILY_PERFORMANCE_REPORT', KeyID) + end else + Rec = '' + end + Rec = Row<0, 4, PSNIndex> + Rec = Row<0, 5, PSNIndex> + ActualStartDTM = '' + ActualStopDTM = '' + SchedDetRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', Row<0, 6, PSNIndex>) + SchedDetStartDTM = SchedDetRec + SchedDetStopDTM = SchedDetRec + If SchedDetStartDTM LT ReportDate then + ActualStartDTM = ReportDate + end else + ActualStartDTM = SchedDetStartDTM + end + If SchedDetStopDTM GT ReportDate + 1 then + ActualStopDTM = ReportDate + 1 + end else + ActualStopDTM = SchedDetStopDTM + end + Rec = ActualStartDTM + Rec = ActualStopDTM + + //Get Mode Metric here + EQU PRODUCTIVE$ To 1 + EQU UNSCHED$ to 2 + EQU SCHED$ to 3 + TotalReactorData = Reactor_Services('GetReactorUptimeMetricsByTimeSpan', Row<0, 7> , ActualStartDTM, ActualStopDTM) + Rec = TotalReactorData<1, PRODUCTIVE$> + Rec = TotalReactorData<2, PRODUCTIVE$> + Rec = TotalReactorData<1, UNSCHED$> + Rec = TotalReactorData<2, UNSCHED$> + Rec = TotalReactorData<2, SCHED$> + Rec = TotalReactorData<1, SCHED$> + + Database_Services('WriteDataRow', 'DAILY_PERFORMANCE_REPORT', KeyID, Rec) + Next PSNIndex + end else + // Nothing ran or is scheduled on this reactor + KeyID = ReportDate:'*':Row<0, 1>:'*':Row<0, 2, PSNIndex>:'*':Row<0, 3, PSNIndex> + ReportKeys<0, -1> = KeyID + If RowExists('DAILY_PERFORMANCE_REPORT', KeyID) then + Rec = Database_Services('ReadDataRow', 'DAILY_PERFORMANCE_REPORT', KeyID) + end else + Rec = '' + end + Rec = 0 + Rec = 0 + Database_Services('WriteDataRow', 'DAILY_PERFORMANCE_REPORT', KeyID, Rec) + end + Next Row + + // Clean out any rows that weren't just generated. + table_name = "DAILY_PERFORMANCE_REPORT" + flag = "" + done = False$ + CursorVar = "" + * Clears all cursors + For counter = 0 To 8 + ClearSelect counter + Next counter + sort_list = "DATE_OUT" + Reduce_Script = "WITH {DATE_OUT} EQ '":OConv(ReportDate, 'D4/'):"'" + mode = NEXT_CUR$ + LogData = '' + LogData<1> = LoggingDtm + LogData<2> = '7' + LogData<3> = 'Selecing DAILY_PERFORMANCE_REPORT rows to delete using query "':Reduce_Script:'" via Reduce.' + Logging_Services('AppendLog', objReportsLog, LogData, @RM, @FM) + + Reduce(reduce_script, sort_list, mode, table_name, Cursorvar, flag) + If flag then + Select table_name By sort_list Using Cursorvar then + Open table_name To file_var then + Loop + ReadNext KeyID Using Cursorvar By AT Else done = TRUE$ + Until done + Locate KeyID in ReportKeys using @VM setting vPos else + Database_Services('DeleteDataRow', 'DAILY_PERFORMANCE_REPORT', KeyID) + end + Repeat + End + end + end + LogData = '' + LogData<1> = LoggingDtm + LogData<2> = '8' + LogData<3> = 'End service.' + Logging_Services('AppendLog', objReportsLog, LogData, @RM, @FM) + + Unlock hSysLists, ServiceKeyID else Null + end + end service Service GenerateOrUpdateDailyReactorUptimeData() @@ -1389,14 +1200,14 @@ Service GetDailyReactorUptimeDataJSON(ReportStartDt, ReportEndDt) //Release it SRP_Json(ReactorUptimeDayJson, "Release") - + end Next day //Add array to root object SRP_Json(ReactorUptimeJson, 'Set', 'Days', ReactorUptimeDaysJson) //Close out array SRP_Json(ReactorUptimeDaysJson, 'Release') - + end ReactorUptimeWTDJson = '' If SRP_Json(ReactorUptimeWTDJson, 'New') then @@ -1436,154 +1247,1087 @@ Service GetDailyReactorUptimeDataJSON(ReportStartDt, ReportEndDt) SRP_Json(ReactorUptimeWTDJson, 'Release') end // Now get the actual JSON - ResponseJson = SRP_Json(ReactorUptimeJson, "Stringify", "STYLED") + ResponseJson = SRP_Json(ReactorUptimeJson, "Stringify", "STYLED") - // All done with the root object - SRP_Json(ReactorUptimeJson, "Release") + // All done with the root object + SRP_Json(ReactorUptimeJson, "Release") Response = ResponseJson end end service Service GetDailyPerformanceDataJSON(DateOut) - - Response = '' - ReportDate = IConv(DateOut, 'D') - ReportData = '' - - Query = "SELECT DAILY_PERFORMANCE_REPORT WITH DATE_OUT EQ '":DateOut:"' BY REACTOR" - RList(Query, TARGET_ACTIVELIST$, '', '', '') - If Not(Get_Status(ErrCode)) then - EOF = False$ - If SRP_JSON(objJSON, 'New', 'Object') then - If SRP_JSON(objReactArray, 'New', 'Array') then - Loop - ReadNext KeyID else EOF = True$ - Until EOF - Database_Services('ActivateRecord', 'DAILY_PERFORMANCE_REPORT', KeyID) - If SRP_JSON(objRow, 'New', 'Object') then - - ReactorNo = Field(KeyID, '*', 2) - SRP_JSON(objRow, 'SetValue', 'reactorNo', ReactorNo) - CurrModeKeys = Xlate('REACTOR_CHILD_KEY_IDS_NG', ReactorNo, 'REACT_MODE_KEY_IDS', 'X') - CurrModeKey = CurrModeKeys<0, 1> - CurrMode = Xlate('REACT_MODE_NG', CurrModeKey, 'MODE', 'X') - SRP_JSON(objRow, 'SetValue', 'reactorType', {REACTOR_TYPE}) - SRP_JSON(objRow, 'SetValue', 'currMode', CurrMode) - SRP_JSON(objRow, 'SetValue', 'psn', Field(KeyID, '*', 3)) - SRP_JSON(objRow, 'SetValue', 'partNo', Field(KeyID, '*', 4)) - SRP_JSON(objRow, 'SetValue', 'upHours', {HOURS_ON_PART}) - SRP_JSON(objRow, 'SetValue', 'uptimePercent', {PERCENT_ON_PART}) - SRP_JSON(objRow, 'SetValue', 'minutesPerWafer', {MIN_PER_WAFER}) - SRP_JSON(objRow, 'SetValue', 'wafersPerDay', {WAFERS_PER_DAY}) - SRP_JSON(objRow, 'SetValue', 'oee', {OEE}) - SRP_JSON(objRow, 'SetValue', 'projOut', {PROJECTED_OUT}) - SRP_JSON(objRow, 'SetValue', 'oeeCalculation', {OEE_CALCULATION}) - SRP_JSON(objRow, 'SetValue', 'timeAdjProjOut', {TIME_ADJ_PROJECTED_OUT}) - SRP_JSON(objRow, 'SetValue', 'actualOut', {ACTUAL_OUT}, 'Number') - SRP_JSON(objRow, 'SetValue', 'totalDelta', {TOTAL_DELTA}) - SRP_JSON(objRow, 'SetValue', 'totalDeltaAlt', {TOTAL_DELTA_ALT}) - SRP_JSON(objRow, 'SetValue', 'comments', {COMMENTS}) - SRP_JSON(objRow, 'SetValue', 'projOutAlt', {PROJECTED_OUT_ALT}) - SRP_JSON(objRow, 'SetValue', 'toolProdPecent', SRP_MATH('ROUND',Xlate('DAILY_PERFORMANCE_REPORT', @ID, DAILY_PERFORMANCE_REPORT.TOTAL_PROD_PERCENT$, 'X'), 2)) - SRP_JSON(objRow, 'SetValue', 'toolUnschedPecent', SRP_MATH('ROUND',Xlate('DAILY_PERFORMANCE_REPORT', @ID, DAILY_PERFORMANCE_REPORT.TOTAL_UNSCHED_PERCENT$, 'X'), 2)) - SRP_JSON(objRow, 'SetValue', 'toolSchedPecent', SRP_MATH('ROUND',Xlate('DAILY_PERFORMANCE_REPORT', @ID, DAILY_PERFORMANCE_REPORT.TOTAL_SCHED_PERCENT$, 'X'), 2)) - SRP_JSON(objRow, 'SetValue', 'toolProdMin', SRP_MATH('ROUND',Xlate('DAILY_PERFORMANCE_REPORT', @ID, DAILY_PERFORMANCE_REPORT.TOTAL_PROD_MIN$, 'X'), 2)) - SRP_JSON(objRow, 'SetValue', 'toolUnschedMin', SRP_MATH('ROUND',Xlate('DAILY_PERFORMANCE_REPORT', @ID, DAILY_PERFORMANCE_REPORT.TOTAL_UNSCHED_MIN$, 'X'), 2)) - SRP_JSON(objRow, 'SetValue', 'toolSchedMin', SRP_MATH('ROUND',Xlate('DAILY_PERFORMANCE_REPORT', @ID, DAILY_PERFORMANCE_REPORT.TOTAL_SCHED_MIN$, 'X'), 2)) - SRP_JSON(objReactArray, 'Add', objRow) - SRP_JSON(objRow, 'Release') - end - Repeat - SRP_JSON(objJSON, 'Set', 'performanceReport', objReactArray) - SRP_JSON(objReactArray, 'Release') - end - end - Response = SRP_JSON(objJSON, 'Stringify', 'Styled') - SRP_JSON(objJSON, 'Release') - end - + + Response = '' + ReportDate = IConv(DateOut, 'D') + ReportData = '' + + Query = "SELECT DAILY_PERFORMANCE_REPORT WITH DATE_OUT EQ '":DateOut:"' BY REACTOR" + RList(Query, TARGET_ACTIVELIST$, '', '', '') + If Not(Get_Status(ErrCode)) then + EOF = False$ + If SRP_JSON(objJSON, 'New', 'Object') then + If SRP_JSON(objReactArray, 'New', 'Array') then + Loop + ReadNext KeyID else EOF = True$ + Until EOF + Database_Services('ActivateRecord', 'DAILY_PERFORMANCE_REPORT', KeyID) + If SRP_JSON(objRow, 'New', 'Object') then + + ReactorNo = Field(KeyID, '*', 2) + SRP_JSON(objRow, 'SetValue', 'reactorNo', ReactorNo) + CurrModeKeys = Xlate('REACTOR_CHILD_KEY_IDS_NG', ReactorNo, 'REACT_MODE_KEY_IDS', 'X') + CurrModeKey = CurrModeKeys<0, 1> + CurrMode = Xlate('REACT_MODE_NG', CurrModeKey, 'MODE', 'X') + SRP_JSON(objRow, 'SetValue', 'reactorType', {REACTOR_TYPE}) + SRP_JSON(objRow, 'SetValue', 'currMode', CurrMode) + SRP_JSON(objRow, 'SetValue', 'psn', Field(KeyID, '*', 3)) + SRP_JSON(objRow, 'SetValue', 'partNo', Field(KeyID, '*', 4)) + SRP_JSON(objRow, 'SetValue', 'upHours', {HOURS_ON_PART}) + SRP_JSON(objRow, 'SetValue', 'uptimePercent', {PERCENT_ON_PART}) + SRP_JSON(objRow, 'SetValue', 'minutesPerWafer', {MIN_PER_WAFER}) + SRP_JSON(objRow, 'SetValue', 'wafersPerDay', {WAFERS_PER_DAY}) + SRP_JSON(objRow, 'SetValue', 'oee', {OEE}) + SRP_JSON(objRow, 'SetValue', 'projOut', {PROJECTED_OUT}) + SRP_JSON(objRow, 'SetValue', 'oeeCalculation', {OEE_CALCULATION}) + SRP_JSON(objRow, 'SetValue', 'timeAdjProjOut', {TIME_ADJ_PROJECTED_OUT}) + SRP_JSON(objRow, 'SetValue', 'actualOut', {ACTUAL_OUT}, 'Number') + SRP_JSON(objRow, 'SetValue', 'totalDelta', {TOTAL_DELTA}) + SRP_JSON(objRow, 'SetValue', 'totalDeltaAlt', {TOTAL_DELTA_ALT}) + SRP_JSON(objRow, 'SetValue', 'comments', {COMMENTS}) + SRP_JSON(objRow, 'SetValue', 'projOutAlt', {PROJECTED_OUT_ALT}) + SRP_JSON(objRow, 'SetValue', 'toolProdPecent', SRP_MATH('ROUND',Xlate('DAILY_PERFORMANCE_REPORT', @ID, DAILY_PERFORMANCE_REPORT.TOTAL_PROD_PERCENT$, 'X'), 2)) + SRP_JSON(objRow, 'SetValue', 'toolUnschedPecent', SRP_MATH('ROUND',Xlate('DAILY_PERFORMANCE_REPORT', @ID, DAILY_PERFORMANCE_REPORT.TOTAL_UNSCHED_PERCENT$, 'X'), 2)) + SRP_JSON(objRow, 'SetValue', 'toolSchedPecent', SRP_MATH('ROUND',Xlate('DAILY_PERFORMANCE_REPORT', @ID, DAILY_PERFORMANCE_REPORT.TOTAL_SCHED_PERCENT$, 'X'), 2)) + SRP_JSON(objRow, 'SetValue', 'toolProdMin', SRP_MATH('ROUND',Xlate('DAILY_PERFORMANCE_REPORT', @ID, DAILY_PERFORMANCE_REPORT.TOTAL_PROD_MIN$, 'X'), 2)) + SRP_JSON(objRow, 'SetValue', 'toolUnschedMin', SRP_MATH('ROUND',Xlate('DAILY_PERFORMANCE_REPORT', @ID, DAILY_PERFORMANCE_REPORT.TOTAL_UNSCHED_MIN$, 'X'), 2)) + SRP_JSON(objRow, 'SetValue', 'toolSchedMin', SRP_MATH('ROUND',Xlate('DAILY_PERFORMANCE_REPORT', @ID, DAILY_PERFORMANCE_REPORT.TOTAL_SCHED_MIN$, 'X'), 2)) + SRP_JSON(objReactArray, 'Add', objRow) + SRP_JSON(objRow, 'Release') + end + Repeat + SRP_JSON(objJSON, 'Set', 'performanceReport', objReactArray) + SRP_JSON(objReactArray, 'Release') + end + end + Response = SRP_JSON(objJSON, 'Stringify', 'Styled') + SRP_JSON(objJSON, 'Release') + end + end service Service UpdateDailyPerformanceData(RepDate, RepJSON) - - If ( (RepDate NE '') and (RepJSON NE '') ) then - If (SRP_JSON(objJSON, 'Parse', RepJSON) EQ '') then - objArray = SRP_JSON(objJSON, 'Get', 'performanceReport') - ArrayCount = SRP_JSON(objArray, 'GetCount') - For ArrayIndex = 1 to ArrayCount - objRow = SRP_JSON(objArray, 'Get', '[':ArrayIndex:']') - ReactorNo = SRP_JSON(objRow, 'GetValue', 'reactorNo') - PSNo = SRP_JSON(objRow, 'GetValue', 'psn') - PartNo = SRP_JSON(objRow, 'GetValue', 'partNo') - Comments = SRP_JSON(objRow, 'GetValue', 'comments', '') - RepKey = IConv(RepDate, 'D'):'*':ReactorNo:'*':PSNo:'*':PartNo - RepRec = Database_Services('ReadDataRow', 'DAILY_PERFORMANCE_REPORT', RepKey) - If Error_Services('NoError') then - RepRec = Comments - Database_Services('WriteDataRow', 'DAILY_PERFORMANCE_REPORT', RepKey, RepRec) - end - SRP_JSON(objRow, 'Release') - Next ArrayIndex - SRP_JSON(objArray, 'Release') - SRP_JSON(objJSON, 'Release') - end - end - + + If ( (RepDate NE '') and (RepJSON NE '') ) then + If (SRP_JSON(objJSON, 'Parse', RepJSON) EQ '') then + objArray = SRP_JSON(objJSON, 'Get', 'performanceReport') + ArrayCount = SRP_JSON(objArray, 'GetCount') + For ArrayIndex = 1 to ArrayCount + objRow = SRP_JSON(objArray, 'Get', '[':ArrayIndex:']') + ReactorNo = SRP_JSON(objRow, 'GetValue', 'reactorNo') + PSNo = SRP_JSON(objRow, 'GetValue', 'psn') + PartNo = SRP_JSON(objRow, 'GetValue', 'partNo') + Comments = SRP_JSON(objRow, 'GetValue', 'comments', '') + RepKey = IConv(RepDate, 'D'):'*':ReactorNo:'*':PSNo:'*':PartNo + RepRec = Database_Services('ReadDataRow', 'DAILY_PERFORMANCE_REPORT', RepKey) + If Error_Services('NoError') then + RepRec = Comments + Database_Services('WriteDataRow', 'DAILY_PERFORMANCE_REPORT', RepKey, RepRec) + end + SRP_JSON(objRow, 'Release') + Next ArrayIndex + SRP_JSON(objArray, 'Release') + SRP_JSON(objJSON, 'Release') + end + end + end service // Calculate the last month's worth of performance data one day at a time. Service CalcInProcessDailyPerformanceData() - - ReportDate = Database_Services('ReadDataRow', 'APP_INFO', 'PERFORMANCE_REPORT_DATE') - Report_Services('CalcDailyPerformanceData', ReportDate) - ReportDate = IConv(ReportDate, 'D') - ReportDate -= 1 - If ReportDate LT Date() - 2 then ReportDate = Date() - ReportDate = OConv(ReportDate, 'D2/') - Database_Services('WriteDataRow', 'APP_INFO', 'PERFORMANCE_REPORT_DATE', ReportDate) - + + ReportDate = Database_Services('ReadDataRow', 'APP_INFO', 'PERFORMANCE_REPORT_DATE') + Report_Services('CalcDailyPerformanceData', ReportDate) + ReportDate = IConv(ReportDate, 'D') + ReportDate -= 1 + If ReportDate LT Date() - 2 then ReportDate = Date() + ReportDate = OConv(ReportDate, 'D2/') + Database_Services('WriteDataRow', 'APP_INFO', 'PERFORMANCE_REPORT_DATE', ReportDate) + end service + Service GetOpenTestWaferLotWIPReportJson() - ErrorMessage = '' - JSONCollection = '' - TestWaferLots = Test_Run_Services('GetTestWaferLots', True$) - hJSONCollection = '' - If SRP_JSON(hJSONCollection, 'New', 'Object') then - hTWLotArray = '' - If SRP_JSON(hTWLotArray, 'New', 'Array') then - Abort = False$ - for each TestWaferLotId in TestWaferLots using @VM - ThisLotJson = Lot_Services('ConvertLotRecordToJson', TestWaferLotId, '', '', False$) - If Error_Services('NoError') then - hTWLot = '' - If (SRP_JSON(hTWLot, 'Parse', ThisLotJson) EQ '') then - SRP_JSON(hTWLotArray, 'Add', hTWLot) - SRP_JSON(hTWLot, 'Release') - end - end else - Abort = True$ - end - Until Abort - Next TestWaferLotId - If Abort EQ False$ then - SRP_JSON(hJSONCollection, 'Set', 'Lots', hTWLotArray) - end - SRP_JSON(hTWLotArray, 'Release') - end else - ErrorMessage = 'Error creating test wafer Json array.' - end - JSONCollection = SRP_JSON(hJSONCollection, 'Stringify', 'Styled') - SRP_JSON(hJSONCollection, 'Release') + + ErrorMessage = '' + JSONCollection = '' + TestWaferLots = Test_Run_Services('GetTestWaferLots', True$) + hJSONCollection = '' + If SRP_JSON(hJSONCollection, 'New', 'Object') then + hTWLotArray = '' + If SRP_JSON(hTWLotArray, 'New', 'Array') then + Abort = False$ + for each TestWaferLotId in TestWaferLots using @VM + ThisLotJson = Lot_Services('ConvertLotRecordToJson', TestWaferLotId, '', '', False$) + If Error_Services('NoError') then + hTWLot = '' + If (SRP_JSON(hTWLot, 'Parse', ThisLotJson) EQ '') then + SRP_JSON(hTWLotArray, 'Add', hTWLot) + SRP_JSON(hTWLot, 'Release') + end + end else + Abort = True$ + end + Until Abort + Next TestWaferLotId + If Abort EQ False$ then + SRP_JSON(hJSONCollection, 'Set', 'Lots', hTWLotArray) + end + SRP_JSON(hTWLotArray, 'Release') + end else + ErrorMessage = 'Error creating test wafer Json array.' + end + JSONCollection = SRP_JSON(hJSONCollection, 'Stringify', 'Styled') + SRP_JSON(hJSONCollection, 'Release') + end else + ErrorMessage = 'Error creating test wafer Json Collection' + end + If ErrorMessage NE '' then + Error_Services('Add', ErrorMessage) + end + Response = JSONCollection + +end service + + +Service GenerateMaterialTrackRows() + + hSysLists = Database_Services('GetTableHandle', 'SYSLISTS') + Lock hSysLists, ServiceKeyID then + + Abort = False$ + NoMatFlag = True$ + + LocationFilter = '' + LocationFilter<1, 1> = 'SR*KTR]' + LocationFilter<1, 2> = '1K*PTI' + LocationFilter<1, 3> = 'CR*BE' + LocationFilter<1, 4> = 'CR*BO' + LocationFilter<1, 5> = 'CR*TUN' + LocationFilter<1, 6> = 'CR*EPR' + LocationFilter<1, 7> = 'CR*FE' + LocationFilter<1, 8> = 'CR*FEH' + LocationFilter<1, 9> = 'CR*FO' + LocationFilter<1, 10> = 'CR*FOH' + + // All Possible Report Columns + AllRptColumns = '' + AllRptColumns<1, 1> = 'React No' + AllRptColumns<1, 2> = 'React Type' + AllRptColumns<1, 3> = 'WO No' + AllRptColumns<1, 4> = 'SAP Prod No' + AllRptColumns<1, 5> = 'Sub Part No' + AllRptColumns<1, 6> = 'Epi Part No' + AllRptColumns<1, 7> = 'WO Qty' + AllRptColumns<1, 8> = 'RX Qty' + AllRptColumns<1, 9> = 'UnRel Qty' + AllRptColumns<1, 10> = 'Kit Location' + AllRptColumns<1, 11> = 'Kit Qty' + AllRptColumns<1, 12> = '+/-' + AllRptColumns<1, 13> = 'Kit RO' + AllRptColumns<1, 14> = 'PTI RO' + AllRptColumns<1, 15> = 'Load' + AllRptColumns<1, 16> = 'Comments' + + RptColumns = AllRptColumns + + ErrorTitle = 'Error in service ':Service + ErrCode = '' + ErrorMsg = '' + + OPEN 'SCHED_DET_NG' TO SchedDetTable then + OPEN 'DICT.SCHED_DET_NG' TO @DICT then + Today = Datetime() + + ReactList = '' + WOList = '' + SchedDetKeys = '' + PrevReactNo = '' + PrevWO = '' + + SelectSent = 'SELECT SCHED_DET_NG WITH STOP_DTM GE "':OCONV(Today, 'DT'):'" BY REACT_NO' + + RList(SelectSent,TARGET_ACTIVELIST$,'','','') + IF Get_Status(errCode) THEN + ErrMsg(errCode) + Unlock hSysLists, ServiceKeyID else Null + RETURN + END + + Done = 0 + @ID = '' + LOOP + PrevSchedDetKey = @ID + READNEXT @ID ELSE Done = 1 + UNTIL Done + READ SchedDetRec FROM SchedDetTable,@ID THEN + ReactNo = SchedDetRec + WONo = SchedDetRec + If ReactNo NE '' then + LOCATE ReactNo IN ReactList BY 'AR' USING @FM SETTING Pos ELSE + ReactList = INSERT(ReactList,Pos,0,0,ReactNo) + END + END + If WONo NE '' then + LOCATE WONo IN WOList USING @VM SETTING WPos ELSE + WOList = INSERT(WOList,Pos,-1,0,WONo) + SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,@ID) + END + END + END + + REPEAT + + CALL Make.List(0,SchedDetKeys,SchedDetTable,@DICT) + + DateRange = 'Effective ':OCONV(Date(),'D4') + + RowIndex = 0 + AllReportData = '' + @RECCOUNT = 0 + FirstPass = 1 + LastRecord = 0 + FirstLine = 1 + fontSpacing = 100 + + * Zero Accumulators For Each Break + + Prev.ReactNo = '' + Last.ReactNo.Break = 1 + + Loop + + ReactNo.Break = 0 + + READNEXT @ID, Which.Value ELSE + LastRecord = 1 + ReactNo.Break = 1 + ReactNo = Prev.ReactNo + END + + S.ATID = @ID + Abort = (FirstPass and LastRecord) + If Not(Abort) then + + If Not(LastRecord) then + + READO @RECORD FROM SchedDetTable,@ID then + + // GOTO ReadRecord + @RECCOUNT += 1 + + * Calculate Value(s) For Column(s) + + S.ATID = {@ID} + I.ATID = S.ATID + S.ReactNo = {REACT_NO} + I.ReactNo = S.ReactNo + S.WoNo = {WO_NO} + I.WoNo = S.WoNo + S.SubPartNo = XLATE('WO_LOG', S.WoNo, 'ORD_SUB_PART_NO', 'X') + I.SubPartNo = S.SubPartNo + S.EpiPartNo = XLATE('WO_LOG', S.WoNo, WO_LOG_EPI_PART_NO$, 'X') + I.EpiPartNo = S.EpiPartNo + S.WO_Qty = Xlate('WO_LOG', {WO_NO}, WO_LOG_WO_QTY$, 'X') + I.WO_Qty = S.WO_Qty + S.WO_RX_Qty = Xlate('WO_LOG', {WO_NO}, 'RX_QTY', 'X') + I.WO_RX_Qty = S.WO_RX_Qty + S.WO_UnRel_QTY = Xlate('WO_LOG', {WO_NO}, 'UNREL_QTY', 'X') + I.WO_UnRel_QTY = S.WO_UnRel_QTY + S.REACT_TYPE = Xlate('WO_LOG', {WO_NO}, 'REACT_TYPE', 'X') + S.ProdOrdNo = Xlate('WO_LOG', {WO_NO}, 'PROD_ORD_NO', 'X') + + Locate 'SR*KTR]' in LocationFilter using @VM setting vPos then + KitData = Location_Services('GetLocationCassInfo', S.WONo, 'SR*KTR]') + SWAP CRLF$ WITH @VM IN KitData + end else + KitData = '' + end + + KitCassList = KitData<3> + NewKitData = '' + + Swap ',' with @VM in KitData + + // Filter out cassettes on hold + NewKitData<1> = KitData<1> + Swap @VM with ',' in KitCassList + For each Cass in KitCassList using ',' setting cPos + Key = S.WONo:'*':Cass + OnHold = Xlate('WO_MAT', Key, 'HOLD', 'X') + If OnHold NE True$ then + NewKitData<3, -1> = KitData<3, cPos> + end + Next Cass + + LocInfo = '' + LocInfo<1> = NewKitData<1> + LocInfo<2> = DCount(NewKitData<3>, @VM) + LocInfo<3> = NewKitData<3> + Database_Services('WriteDataRow', 'WO_LOC', S.WONo:'*':'SR*KTR]', LocInfo) + + NewKitData<2> = DCount(NewKitData<3>, @VM) ; // Update cassette count + KitData = NewKitData + + Swap @VM with ',' in KitData + + S.KitLocation = KitData<1> + I.KitLocation = S.KitLocation + + S.KitCassCnt = COUNT(KitData<3>,',') + (KitData<3> NE '') + I.KitCassCnt = S.KitCassCnt + + KitCassList = KitData<3> + S.KitQty = 0 + For each CassNo in KitCassList using ',' + S.KitQty += Xlate('WO_MAT', S.WONo:'*':CassNo, 'WAFER_QTY', 'X') + Next CassNo + I.KitQty = S.KitQty + + Locate '1K*PTI' in LocationFilter using @VM setting vPos then + PTIData = Location_Services('GetLocationCassInfo', S.WONo, '1K*PTI') + SWAP CRLF$ WITH @VM IN PTIData + end else + PTIData = '' + end + PTICassList = PTIData<3> + NewPTIData = '' + + Swap ',' with @VM in PTIData + // Filter out cassettes on hold + NewPTIData<1> = PTIData<1> + Swap @VM with ',' in PTICassList + For each Cass in PTICassList using ',' setting cPos + Key = S.WONo:'*':Cass + OnHold = Xlate('WO_MAT', Key, 'HOLD', 'X') + If OnHold NE True$ then + NewPTIData<3, -1> = PTIData<3, cPos> + end + Next Cass + + LocInfo = '' + LocInfo<1> = '1K*PTI' + LocInfo<2> = DCount(NewPTIData<3>, @VM) + LocInfo<3> = NewPTIData<3> + Database_Services('WriteDataRow', 'WO_LOC', S.WONo:'*':'1K*PTI', LocInfo) + + NewPTIData<2> = DCount(NewPTIData<3>, @VM) ; // Update cassette count + PTIData = NewPTIData + + Swap @VM with ',' in PTIData + PTICassList = PTIData<3> + + CRLocs = '' + CRLocs<0, -1> = 'CR*BE' + CRLocs<0, -1> = 'CR*BO' + CRLocs<0, -1> = 'CR*TUN' + CRLocs<0, -1> = 'CR*EPR' + CRLocs<0, -1> = 'CR*FE' + CRLocs<0, -1> = 'CR*FEH' + CRLocs<0, -1> = 'CR*FO' + CRLocs<0, -1> = 'CR*FOH' + + LoadedData = '' + LocQueryList = '' + For each Loc in CRLocs using @VM setting crPos + Locate Loc in LocationFilter using @VM setting vPos then + LocQueryList<0, -1> = Loc + end + Next Loc + LoadedCassList = '' + ReactType = Xlate('WO_LOG', S.WONo, 'REACT_TYPE', 'X') + + If ReactType NE 'EPP' then + If LocQueryList NE '' then + For each CRLoc in LocQueryList using @VM + CRLocCassList = '' + LoadedData = Location_Services('GetLocationCassInfo', S.WONo, CRLoc) + Swap CRLF$ with @VM in LoadedData + CassList = LoadedData<3> + Swap @VM with ',' in CassList + For each CassNo in CassList using ',' + If ( (S.WONo NE '') and (CassNo NE '') ) then + WOMatKey = S.WONo:'*':CassNo + UnloadSigComp = Signature_Services('CheckSignature', WOMatKey, 'UNLOAD') + OnHold = Xlate('WO_MAT', WOMatKey, 'HOLD', 'X') + CurrStatus = Xlate('WO_MAT', WOMatKey, 'CURR_STATUS', 'X') + If Not(UnloadSigComp or OnHold or (CurrStatus EQ 'REJ') ) then + CRLocCassList<0, -1> = CassNo + Locate CassNo in LoadedCassList using @VM setting vPos else + LoadedCassList<0, -1> = CassNo + end + end + end + Next CassNo + LocInfo = '' + LocInfo<3> = CRLocCassList + Database_Services('WriteDataRow', 'WO_LOC', S.WONo:'*':CRLoc, LocInfo) + Next CRLoc + end + end + + * TEST FOR CONTROL BREAK(S) + + IF (S.ReactNo NE Prev.ReactNo) OR ReactNo.Break THEN + ReactNo = Prev.ReactNo + Prev.ReactNo = S.ReactNo + ReactNo.Break += 1 + END + + IF FirstPass THEN FirstPass = False$ + + * Do Conversion If Any + + IF S.REACTNO NE "" THEN S.REACTNO = OCONV(S.REACTNO,"MD0,") + IF S.WONO NE "" THEN S.WONO = OCONV(S.WONO,"MD0") + IF S.WO_QTY NE "" THEN S.WO_QTY = OCONV(S.WO_QTY,"MD0,") + IF S.WO_RX_QTY NE "" THEN S.WO_RX_QTY = OCONV(S.WO_RX_QTY,"MD0,") + IF S.WO_UNREL_QTY NE "" THEN S.WO_UNREL_QTY = OCONV(S.WO_UNREL_QTY,"MD0,") + + * PRINT DETAIL LINE + + COLDATA = '' + RowNumber = 0 + + /* ascending sort */ + Convert @VM to ',' in KitCassList + Convert @VM to ',' in PTICassList + Convert @VM to ',' in LoadedCassList + KitCassList = SRP_Array('SortSimpleList', KitCassList, 'AscendingNumbers', ',') + PTICassList = SRP_Array('SortSimpleList', PTICassList, 'AscendingNumbers', ',') + LoadedCassList = SRP_Array('SortSimpleList', LoadedCassList, 'AscendingNumbers', ',') + + CassNeeded = '' + EpiPartNo = Xlate('WO_LOG', S.WONo, 'EPI_PART_NO', 'X') + If EpiPartNo NE '' then + WPDAdjusted = Epi_Part_Services('GetAdjustedWafersPerDayScheduler', EpiPartNo, S.React_Type) + If WPDAdjusted NE '' then + CPDAdjusted = SRP_Math('CEILING', (WPDAdjusted/25) ) + CassInCR = DCount(KitCassList, ',') + DCount(PTICassList, ',') + DCount(LoadedCassList, ',') + CassNeeded = CassInCR - CPDAdjusted + end + end + + RowIndex += 1 + Swap '.1' with '' in S.ProdOrdNo + + AllReportData = S.ReactNo + AllReportData = S.React_Type + AllReportData = S.WONo + AllReportData = S.ProdOrdNo + AllReportData = S.SubPartNo + AllReportData = S.EpiPartNo + AllReportData = S.WO_Qty + AllReportData = S.WO_RX_Qty + AllReportData = S.WO_UnRel_Qty + AllReportData = S.KitLocation + AllReportData = S.KitQty + AllReportData = CassNeeded + AllReportData = KitCassList ; // Skip field 14, it is populated by users + AllReportData = PTICassList + AllReportData = LoadedCassList ; // Skip field 17, it is populated by users + + end + end else + // Last record -> write data + + Database_Services('WriteDataRow', 'SYSLISTS', 'MAT_REPORT', AllReportData) + + If AllReportData NE '' then + KeyList = '' + For each Row in AllReportData using @FM setting fPos + Key = Row<0, 1> : '*': Row<0, 3> ; // Key = ReactNo * WONo + KeyList<0, -1> = Key + Convert @VM to @FM in Row + If RowExists('MATERIAL_TRACK', Key) then + // Update it + Rec = Database_Services('ReadDataRow', 'MATERIAL_REPORT', Key) + If Error_Services('NoError') then + // Preserve user input fields + Row = Rec + Row = Rec + Database_Services('WriteDataRow', 'MATERIAL_REPORT', Key, Row) + end + end else + // New record -> Just write it + Database_Services('WriteDataRow', 'MATERIAL_REPORT', Key, Row) + end + Next Row + + // Remove rows no longer current + Open "MATERIAL_REPORT" To hTable then + Select hTable + EOF = False$ + Loop + ReadNext Key else EOF = True$ + Until EOF + If Not(InList(KeyList, Key, @VM)) then + Database_Services('DeleteDataRow', 'MATERIAL_REPORT', Key, True$, False$) + end + Repeat + End else + // Open table failed + end + end + end + end else + ErrorMsg = 'No records selected!' + end + Until (LastRecord or Abort) + Repeat + end else + ErrorMsg = 'Unable to open "SCHED_DET_NG" table.' + end + end else + ErrorMsg = 'Unable to open "SCHED_DET_NG" table.' + end + Unlock hSysLists, ServiceKeyID else Null + end + +end service + + +Service UpdateMaterialTrackData(MaterialTrackJSON) + + If MaterialTrackJSON NE '' then + If (SRP_JSON(objJSON, 'Parse', MaterialTrackJSON) EQ '') then + objArray = SRP_JSON(objJSON, 'Get', 'MaterialReport') + ArrayCount = SRP_JSON(objArray, 'GetCount') + For ArrayIndex = 1 to ArrayCount + objRow = SRP_JSON(objArray, 'Get', '[':ArrayIndex:']') + KeyId = SRP_JSON(objRow, 'GetValue', 'KeyId') + KitDemand = SRP_JSON(objRow, 'GetValue', 'KitDemand', '') + Comments = SRP_JSON(objRow, 'GetValue', 'Comments', '') + HaveLock = Database_Services('GetKeyIDLock', 'MATERIAL_REPORT', KeyId, True$) + If HaveLock then + MatRepRec = Database_Services('ReadDataRow', 'MATERIAL_REPORT', KeyId) + If Error_Services('NoError') then + MatRepRec = KitDemand + MatRepRec = Comments + Database_Services('WriteDataRow', 'MATERIAL_REPORT', KeyId, MatRepRec, True$, False$, False$) + end + end + SRP_JSON(objRow, 'Release') + Next ArrayIndex + SRP_JSON(objArray, 'Release') + SRP_JSON(objJSON, 'Release') + end else + Error_Services('Add', 'Error in ':Service:' service. Error parsing MaterialTrackJSON.') + end + end else + Error_Services('Add', 'Error in ':Service:' service. Empty MaterialTrackJSON passed into service.') + end + +end service + + +Service PrintMaterialTrackReport(RptColumns, LocationFilter, NoMatFlag, OldReport=BOOLEAN) + + If OldReport EQ '' then OldReport = False$ + Abort = False$ + // All Possible Report Columns + AllRptColumns = '' + AllRptColumns<1, 1> = 'React No' + AllRptColumns<1, 2> = 'React Type' + AllRptColumns<1, 3> = 'WO No' + AllRptColumns<1, 4> = 'SAP Prod No' + AllRptColumns<1, 5> = 'Sub Part No' + AllRptColumns<1, 6> = 'Epi Part No' + AllRptColumns<1, 7> = 'WO Qty' + AllRptColumns<1, 8> = 'RX Qty' + AllRptColumns<1, 9> = 'UnRel Qty' + AllRptColumns<1, 10> = 'Kit Location' + AllRptColumns<1, 11> = 'Kit Qty' + AllRptColumns<1, 12> = '+/-' + AllRptColumns<1, 13> = 'Kit RO' + AllRptColumns<1, 14> = 'PTI RO' + AllRptColumns<1, 15> = 'Load' + AllRptColumns<1, 16> = 'Comments' + + If Index(RptColumns, 'Comments', 1) then + AllColFmt = '' + AllColFmt<1, 1> = '+^720' + AllColFmt<1, 2> = '+<720' + AllColFmt<1, 3> = '+^1000' + AllColFmt<1, 4> = '+^1100' + AllColFmt<1, 5> = '+^1300' + AllColFmt<1, 6> = '+^1200' + AllColFmt<1, 7> = '+>720' + AllColFmt<1, 8> = '+>720' + AllColFmt<1, 9> = '+>720' + AllColFmt<1, 10> = '+^1260' + AllColFmt<1, 11> = '+^720' + AllColFmt<1, 12> = '+^500' + AllColFmt<1, 13> = '+^1300' + AllColFmt<1, 14> = '+^1300' + AllColFmt<1, 15> = '+^700' + AllColFmt<1, 16> = '+^1300' end else - ErrorMessage = 'Error creating test wafer Json Collection' + AllColFmt = '' + AllColFmt<1, 1> = '+^720' + AllColFmt<1, 2> = '+<720' + AllColFmt<1, 3> = '+^1000' + AllColFmt<1, 4> = '+^1100' + AllColFmt<1, 5> = '+^1300' + AllColFmt<1, 6> = '+^1200' + AllColFmt<1, 7> = '+>720' + AllColFmt<1, 8> = '+>720' + AllColFmt<1, 9> = '+>720' + AllColFmt<1, 10> = '+^1260' + AllColFmt<1, 11> = '+^720' + AllColFmt<1, 12> = '+^500' + AllColFmt<1, 13> = '+^1800' + AllColFmt<1, 14> = '+^1800' + AllColFmt<1, 15> = '+^1100' + AllColFmt<1, 16> = '' end - If ErrorMessage NE '' then - Error_Services('Add', ErrorMessage) + + ErrorTitle = 'Error in service ':Service + ErrCode = '' + ErrorMsg = '' + + OPEN 'SCHED_DET_NG' TO SchedDetTable then + OPEN 'DICT.SCHED_DET_NG' TO @DICT then + Today = Datetime() + + ReactList = '' + WOList = '' + SchedDetKeys = '' + PrevReactNo = '' + PrevWO = '' + + If OldReport then + SelectSent = 'SELECT SCHED_DET_NG WITH STOP_DTM GE ':Today:' BY REACT_NO' + end else + SelectSent = 'SELECT SCHED_DET_NG WITH STOP_DTM GE "':OCONV(Today, 'DT'):'" BY REACT_NO' + end + + RList(SelectSent,TARGET_ACTIVELIST$,'','','') + IF Get_Status(errCode) THEN + ErrMsg(errCode) + RETURN + END + + Done = 0 + @ID = '' + LOOP + PrevSchedDetKey = @ID + READNEXT @ID ELSE Done = 1 + UNTIL Done + READ SchedDetRec FROM SchedDetTable,@ID THEN + ReactNo = SchedDetRec + WONo = SchedDetRec + If ReactNo NE '' then + LOCATE ReactNo IN ReactList BY 'AR' USING @FM SETTING Pos ELSE + ReactList = INSERT(ReactList,Pos,0,0,ReactNo) + END + END + If WONo NE '' then + LOCATE WONo IN WOList USING @VM SETTING WPos ELSE + WOList = INSERT(WOList,Pos,-1,0,WONo) + SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,@ID) + END + END + END + + REPEAT + + CALL Make.List(0,SchedDetKeys,SchedDetTable,@DICT) + + Header = "'D'":@VM:obj_Install('Get_Prop','CompTitle'):' Material Tracking by Reactor':@VM:"Page 'P'" + MinDemand = 0 + Set_Status(0) + + * Start of printing process + FileName = 'Print Material Demand' + Title = 'Printing Material Demand' + + TopMargin = 1.0 + BottomMargin = 0.75 + LeftMargin = 0.25 + RightMargin = 0.25 + + Margins = LeftMargin:@FM:TopMargin:@FM:RightMargin:@FM:BottomMargin + + PageSetup = '1' ;* LandScape + PrintSetup = '2' ;* Preview Normal + PrintSetup<1,2> = '0' ;* All buttons + PrintSetup<1,5> = '1' ;* Page Range + PrintSetup<1,6> = 7 ;* full mouse and keyboard support + + PrintPath = '' + stat = Set_Printer('INIT',FileName,Title,Margins,PageSetup,PrintSetup,PrintPath) + + If Stat GE 0 THEN + DateRange = 'Effective ':OCONV(Date(),'D4') + + Header<-1> = "'T'" + Header<-1> = '' ;* Blank line following heading + + font = 'Arial' + font<2> = '10' + font<4> = '0' ;* Bold + + stat = Set_Printer('FONTHEADFOOT',font) + If Stat GE 0 then + stat = Set_Printer('HEADER',Header) + If Stat GE 0 then + Footer = " 'D' 'T'":@VM:@VM:"Page: 'P'" + stat = Set_Printer('FOOTER',Footer) + If Stat GE 0 then + @RECCOUNT = 0 + FirstPass = 1 + LastRecord = 0 + FirstLine = 1 + fontSpacing = 100 + + * Make Column Heading + ColHead = '' + ColFmt = '' + + For each Column in RptColumns using @VM setting rcPos + Locate Column in AllRptColumns using @VM setting dataPos then + ColHead<0, -1> = Column + ColFmt<0, -1> = AllColFmt<0, dataPos> + end + Next Column + + * Zero Accumulators For Each Break + + Prev.ReactNo = '' + Last.ReactNo.Break = 1 + + Loop + + * Zero Break Flags To False + + ReactNo.Break = 0 + + READNEXT @ID, Which.Value ELSE + LastRecord = 1 + ReactNo.Break = 1 + ReactNo = Prev.ReactNo + END + + S.ATID = @ID + Abort = (FirstPass AND LastRecord) + IF Not(Abort) THEN + + IF Not(LastRecord) then + READO @RECORD FROM SchedDetTable,@ID then + + @RECCOUNT += 1 + + * Calculate Value(s) For Column(s) + + S.ATID = {@ID} + I.ATID = S.ATID + S.ReactNo = {REACT_NO} + I.ReactNo = S.ReactNo + S.WoNo = {WO_NO} + I.WoNo = S.WoNo + S.SubPartNo = XLATE('WO_LOG', S.WoNo, 'ORD_SUB_PART_NO', 'X') + I.SubPartNo = S.SubPartNo + S.EpiPartNo = XLATE('WO_LOG', S.WoNo, WO_LOG_EPI_PART_NO$, 'X') + I.EpiPartNo = S.EpiPartNo + S.WO_Qty = Xlate('WO_LOG', {WO_NO}, WO_LOG_WO_QTY$, 'X') + I.WO_Qty = S.WO_Qty + S.WO_RX_Qty = Xlate('WO_LOG', {WO_NO}, 'RX_QTY', 'X') + I.WO_RX_Qty = S.WO_RX_Qty + S.WO_UnRel_QTY = Xlate('WO_LOG', {WO_NO}, 'UNREL_QTY', 'X') + I.WO_UnRel_QTY = S.WO_UnRel_QTY + S.REACT_TYPE = Xlate('WO_LOG', {WO_NO}, 'REACT_TYPE', 'X') + S.ProdOrdNo = Xlate('WO_LOG', {WO_NO}, 'PROD_ORD_NO', 'X') + + + If OldReport then + + Locate 'SR*KTR]' in LocationFilter using @VM setting vPos then + KitData = Location_Services('GetLocationCassInfo', S.WONo, 'SR*KTR]') + SWAP CRLF$ WITH @VM IN KitData + end else + KitData = '' + end + + S.KitLocation = KitData<1> + I.KitLocation = S.KitLocation + + S.KitQty = OCONV(SUM(KitData<2>) * 25,'MD0,Z') + I.KitQty = S.KitQty + + S.KitCassCnt = COUNT(KitData<3>,',') + (KitData<3> NE '') + I.KitCassCnt = S.KitCassCnt + + KitCassList = KitData<3> + + Locate '1K*PTI' in LocationFilter using @VM setting vPos then + PTIData = Location_Services('GetLocationCassInfo', S.WONo, '1K*PTI') + SWAP CRLF$ WITH @VM IN PTIData + end else + PTIData = '' + end + + end else + + Locate 'SR*KTR]' in LocationFilter using @VM setting vPos then + KitData = Database_Services('ReadDataRow', 'WO_LOC', S.WONo:'*':'SR*KTR]') + end else + KitData = '' + end + + Swap @VM with ',' in KitData + + S.KitLocation = KitData<1> + I.KitLocation = S.KitLocation + + S.KitCassCnt = COUNT(KitData<3>,',') + (KitData<3> NE '') + I.KitCassCnt = S.KitCassCnt + + KitCassList = KitData<3> + S.KitQty = 0 + For each CassNo in KitCassList using ',' + S.KitQty += Xlate('WO_MAT', S.WONo:'*':CassNo, 'WAFER_QTY', 'X') + Next CassNo + I.KitQty = S.KitQty + + Locate '1K*PTI' in LocationFilter using @VM setting vPos then + PTIData = Database_Services('ReadDataRow', 'WO_LOC', S.WONo:'*':'1K*PTI') + end else + PTIData = '' + end + PTICassList = PTIData<3> + + Swap @VM with ',' in PTIData + + end + + PTICassList = PTIData<3> + + CRLocs = '' + CRLocs<0, -1> = 'CR*BE' + CRLocs<0, -1> = 'CR*BO' + CRLocs<0, -1> = 'CR*TUN' + CRLocs<0, -1> = 'CR*EPR' + CRLocs<0, -1> = 'CR*FE' + CRLocs<0, -1> = 'CR*FEH' + CRLocs<0, -1> = 'CR*FO' + CRLocs<0, -1> = 'CR*FOH' + + LoadedData = '' + LocQueryList = '' + For each Loc in CRLocs using @VM setting crPos + Locate Loc in LocationFilter using @VM setting vPos then + LocQueryList<0, -1> = Loc + end + Next Loc + LoadedCassList = '' + ReactType = Xlate('WO_LOG', S.WONo, 'REACT_TYPE', 'X') + If ReactType NE 'EPP' then + If LocQueryList NE '' then + If OldReport then + LoadedData = Location_Services('GetLocationCassInfo', S.WONo, LocQueryList) + Swap CRLF$ with @VM in LoadedData + CassList = LoadedData<3> + Swap @VM with ',' in CassList + For each CassNo in CassList using ',' + If ( (S.WONo NE '') and (CassNo NE '') ) then + WOMatKey = S.WONo:'*':CassNo + UnloadSigComp = Signature_Services('CheckSignature', WOMatKey, 'UNLOAD') + OnHold = Xlate('WO_MAT', WOMatKey, 'HOLD', 'X') + CurrStatus = Xlate('WO_MAT', WOMatKey, 'CURR_STATUS', 'X') + If Not(UnloadSigComp or OnHold or (CurrStatus EQ 'REJ') ) then + LoadedCassList<0, -1> = CassNo + end + end + Next CassNo + end else + For each CRLoc in LocQueryList using @VM + CRLocInfo = Database_Services('ReadDataRow', 'WO_LOC', S.WONo:'*':CRLoc) + CRLocCassList = CRLocInfo<3> + LoadedCassList = SRP_Array('Join', LoadedCassList, CRLocCassList, 'OR', @VM) + Next CRLoc + end + end + end + + If Not(OldReport) then LoadedCassList = SRP_Array('Clean', LoadedCassList, 'TrimAndMakeUnique', @VM) + * TEST FOR CONTROL BREAK(S) + + IF (S.ReactNo NE Prev.ReactNo) OR ReactNo.Break THEN + ReactNo = Prev.ReactNo + Prev.ReactNo = S.ReactNo + ReactNo.Break += 1 + END + + IF ReactNo.Break THEN stat = Set_Printer('TEXT') + + IF FirstPass THEN FirstPass = False$ + + * Do Conversion If Any + + IF S.REACTNO NE "" THEN S.REACTNO = OCONV(S.REACTNO,"MD0,") + IF S.WONO NE "" THEN S.WONO = OCONV(S.WONO,"MD0") + IF S.WO_QTY NE "" THEN S.WO_QTY = OCONV(S.WO_QTY,"MD0,") + IF S.WO_RX_QTY NE "" THEN S.WO_RX_QTY = OCONV(S.WO_RX_QTY,"MD0,") + IF S.WO_UNREL_QTY NE "" THEN S.WO_UNREL_QTY = OCONV(S.WO_UNREL_QTY,"MD0,") + + * PRINT DETAIL LINE + + COLDATA = '' + RowNumber = 0 + + /* ascending sort */ + Convert @VM to ',' in KitCassList + Convert @VM to ',' in PTICassList + Convert @VM to ',' in LoadedCassList + KitCassList = SRP_Array('SortSimpleList', KitCassList, 'AscendingNumbers', ',') + PTICassList = SRP_Array('SortSimpleList', PTICassList, 'AscendingNumbers', ',') + LoadedCassList = SRP_Array('SortSimpleList', LoadedCassList, 'AscendingNumbers', ',') + + Convert ',' to @VM in KitCassList + Convert ',' to @VM in PTICassList + Convert ',' to @VM in LoadedCassList + + NumKitCass = DCount(KitCassList, @VM) + If NumKitCass GT 4 then + For CassIndex = 4 to NumKitCass Step 4 + CassNo = KitCassList<0, CassIndex> + CassNo := CRLF$ + KitCassList<0, CassIndex> = CassNo + Next CassIndex + end + NumPTICass = DCount(PTICassList, @VM) + If NumPTICass GT 4 then + For CassIndex = 4 to NumPTICass Step 4 + CassNo = PTICassList<0, CassIndex> + CassNo := CRLF$ + PTICassList<0, CassIndex> = CassNo + Next CassIndex + end + NumLoadedCass = DCount(LoadedCassList, @VM) + If NumLoadedCass GT 2 then + For CassIndex = 2 to NumLoadedCass Step 2 + CassNo = LoadedCassList<0, CassIndex> + CassNo := CRLF$ + LoadedCassList<0, CassIndex> = CassNo + Next CassIndex + end + Convert @VM to ',' in KitCassList + Convert @VM to ',' in PTICassList + Convert @VM to ',' in LoadedCassList + + CassNeeded = '' + EpiPartNo = Xlate('WO_LOG', S.WONo, 'EPI_PART_NO', 'X') + If EpiPartNo NE '' then + WPDAdjusted = Epi_Part_Services('GetAdjustedWafersPerDayScheduler', EpiPartNo, S.React_Type) + If WPDAdjusted NE '' then + CPDAdjusted = SRP_Math('CEILING', (WPDAdjusted/25) ) + CassInCR = DCount(KitCassList, ',') + DCount(PTICassList, ',') + DCount(LoadedCassList, ',') + CassNeeded = CassInCR - CPDAdjusted + end + end + + Swap '.1' with '' in S.ProdOrdNo + AllReportData = '' + AllReportData<1> = S.ReactNo + AllReportData<2> = S.React_Type + AllReportData<3> = S.WONo + AllReportData<4> = S.ProdOrdNo + AllReportData<5> = S.SubPartNo + AllReportData<6> = S.EpiPartNo + AllReportData<7> = S.WO_Qty + AllReportData<8> = S.WO_RX_Qty + AllReportData<9> = S.WO_UnRel_Qty + AllReportData<10> = S.KitLocation + AllReportData<11> = S.KitQty + AllReportData<12> = CassNeeded + AllReportData<13> = KitCassList + AllReportData<14> = PTICassList + AllReportData<15> = LoadedCassList + AllReportData<16> = '' + + If ( (KitCassList NE '') or (PTICassList NE '') or (LoadedCassList NE '') or (NoMatFlag EQ True$) ) then + RowNumber += 1 + For each RptColumn in RptColumns using @VM setting rcPos + Locate RptColumn in AllRptColumns using @VM setting dataPos then + COLDATA = AllReportData + end + Next RptColumn + If COLDATA NE '' then + // Print the data + PageHeight = Get_Printer('PAGESIZE')<2> + PrintableHeight = PageHeight - TopMargin - BottomMargin + PrinterHeight = Get_Printer('POS')<2> + stat = Set_Printer('CALCTABLE',ColFmt:@FM:ColData) + TableSize = Get_Printer('CALCTABLE') + TableHeight = TableSize<2> + fontSpacing = 120 + + IF ( TableHeight + PrinterHeight >= PrintableHeight ) OR FirstLine THEN + IF NOT(FirstLine) THEN + stat = Set_Printer('PAGEBREAK') + END + FirstLine = 0 + font<2> = 10 + font<4> = 1 ;* Bold + stat = Set_Printer('FONT',font,'100') + stat = Set_Printer('ADDTABLE',colFmt,colHead,'',LTGREY$,'',0,TB_ALL) + font<4> = 0 + stat = Set_Printer('FONT',font,fontSpacing) + stat = Set_Printer('ADDTABLE',colFmt,'',colData,LTGREY$,'',0,7) + END ELSE + font<2> = 10 + font<4> = 0 + stat = Set_Printer('FONT',font,fontSpacing) + stat = Set_Printer('ADDTABLE',colFmt,'',colData,LTGREY$,'',1,TB_ALL) + END + end + END + end + end else + // Last record -> Finish printing + colData = '' + stat = Set_Printer('TERM',1) + end + END else + // No records selected -> Bail + stat = Set_Printer('TERM',1) + end + Until (LastRecord or Abort) + Repeat + end else + GoSub OipiPrintError + end + end else + GoSub OipiPrintError + end + end else + GoSub OipiPrintError + end + end else + ErrorMsg = 'Stat = ' : Stat : ', PrintPath = ' : PrintPath + GoSub OipiPrintError + end + end else + ErrorMsg = 'Unable to open "SCHED_DET_NG" table.' + ErrMsg(ErrorTitle:@SVM:ErrorMsg) + end + end else + ErrorMsg = 'Unable to open "SCHED_DET_NG" table.' + ErrMsg(ErrorTitle:@SVM:ErrorMsg) end - Response = JSONCollection + end service @@ -1591,299 +2335,20 @@ end service // Internal GoSubs //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -ReadRecord: - - * Zero Break Flags To False - - ReactNo.Break=0 - - READNEXT @ID, Which.Value ELSE - LastRecord = 1 - ReactNo.Break = 1 - ReactNo = Prev.ReactNo - END - - S.ATID = @ID - - IF FirstPass AND LastRecord THEN - GOTO Bail - END - - IF LastRecord THEN GOTO BREAKS - - READO @RECORD FROM SchedDetTable,@ID ELSE - GOTO ReadRecord - END - - @RECCOUNT += 1 - - * Calculate Value(s) For Column(s) - - S.ATID = {@ID} - I.ATID = S.ATID - S.ReactNo = {REACT_NO} - I.ReactNo = S.ReactNo - S.WoNo = {WO_NO} - I.WoNo = S.WoNo - S.SubPartNo = XLATE('WO_LOG',S.WoNo,'ORD_SUB_PART_NO','X') - I.SubPartNo = S.SubPartNo - S.EpiPartNo = XLATE('WO_LOG',S.WoNo,WO_LOG_EPI_PART_NO$,'X') - I.EpiPartNo = S.EpiPartNo - S.WO_Qty = {WO_QTY} - I.WO_Qty = S.WO_Qty - S.WO_RX_Qty = {WO_RX_QTY} - I.WO_RX_Qty = S.WO_RX_Qty - S.WO_UnRel_QTY = {WO_UNREL_QTY} - I.WO_UnRel_QTY = S.WO_UnRel_QTY - S.Sched_DT = {SCHED_DT} - I.Sched_DT = S.Sched_DT - S.REACT_TYPE = {REACTOR_TYPE} - S.ProdOrdNo = {PROD_ORD_NO} - - Locate 'SR*KTR]' in LocationFilter using @VM setting vPos then - KitData = Location_Services('GetLocationCassInfo', S.WONo, 'SR*KTR]') - SWAP CRLF$ WITH @VM IN KitData - end else - KitData = '' - end - - S.KitLocation = KitData<1> - I.KitLocation = S.KitLocation - - S.KitQty = OCONV(SUM(KitData<2>) * 25,'MD0,Z') - I.KitQty = S.KitQty - - S.KitCassCnt = COUNT(KitData<3>,',') + (KitData<3> NE '') - I.KitCassCnt = S.KitCassCnt - - KitCassList = KitData<3> - - Locate '1K*PTI' in LocationFilter using @VM setting vPos then - PTIData = Location_Services('GetLocationCassInfo', S.WONo, '1K*PTI') - SWAP CRLF$ WITH @VM IN PTIData - end else - PTIData = '' - end - PTICassList = PTIData<3> - - CRLocs = '' - CRLocs<0, -1> = 'CR*BE' - CRLocs<0, -1> = 'CR*BO' - CRLocs<0, -1> = 'CR*TUN' - CRLocs<0, -1> = 'CR*EPR' - CRLocs<0, -1> = 'CR*FE' - CRLocs<0, -1> = 'CR*FEH' - CRLocs<0, -1> = 'CR*FO' - CRLocs<0, -1> = 'CR*FOH' - - LoadedData = '' - LocQueryList = '' - For each Loc in CRLocs using @VM setting crPos - Locate Loc in LocationFilter using @VM setting vPos then - LocQueryList<0, -1> = Loc - end - Next Loc - - LoadedCassList = '' - ReactType = Xlate('WO_LOG', S.WONo, 'REACT_TYPE', 'X') - If ReactType NE 'EPP' then - If LocQueryList NE '' then - LoadedData = Location_Services('GetLocationCassInfo', S.WONo, LocQueryList) - Swap CRLF$ with @VM in LoadedData - CassList = LoadedData<3> - For each CassNo in CassList using ',' - If ( (S.WONo NE '') and (CassNo NE '') ) then - WOMatKey = S.WONo:'*':CassNo - UnloadSigComp = Signature_Services('CheckSignature', WOMatKey, 'UNLOAD') - If UnloadSigComp then - // Add this cassette to the PTI list instead of the Load list -* PTICassList<0, -1> = CassNo - end else - LoadedCassList<0, -1> = CassNo - end - end - Next CassNo - end - end - - * TEST FOR CONTROL BREAK(S) - - IF (S.ReactNo NE Prev.ReactNo) OR ReactNo.Break THEN - ReactNo = Prev.ReactNo - Prev.ReactNo = S.ReactNo - ReactNo.Break += 1 - END - - IF FirstPass THEN - FirstPass=0 - GOTO DETAIL - END - - -BREAKS: - - * Print Break Total(s) And Accumulate Total(s) - IF ReactNo.Break THEN stat = Set_Printer('TEXT') - - * Perform Last Record Output If Done - IF LastRecord THEN - colData = '' - GOTO Bail - END - - -DETAIL: - - * Do Conversion If Any - - IF S.REACTNO NE "" THEN S.REACTNO = OCONV(S.REACTNO,"MD0,") - IF S.WONO NE "" THEN S.WONO = OCONV(S.WONO,"MD0") - IF S.WO_QTY NE "" THEN S.WO_QTY = OCONV(S.WO_QTY,"MD0,") - IF S.WO_RX_QTY NE "" THEN S.WO_RX_QTY = OCONV(S.WO_RX_QTY,"MD0,") - IF S.WO_UNREL_QTY NE "" THEN S.WO_UNREL_QTY = OCONV(S.WO_UNREL_QTY,"MD0,") - IF S.SCHED_DT NE "" THEN S.SCHED_DT = OCONV(S.SCHED_DT,"D4/") - - * PRINT DETAIL LINE - - COLDATA = '' - RowNumber = 0 - - /* ascending sort */ - Convert @VM to ',' in KitCassList - Convert @VM to ',' in PTICassList - Convert @VM to ',' in LoadedCassList - KitCassList = SRP_Array('SortSimpleList', KitCassList, 'AscendingNumbers', ',') - PTICassList = SRP_Array('SortSimpleList', PTICassList, 'AscendingNumbers', ',') - LoadedCassList = SRP_Array('SortSimpleList', LoadedCassList, 'AscendingNumbers', ',') - - Convert ',' to @VM in KitCassList - Convert ',' to @VM in PTICassList - Convert ',' to @VM in LoadedCassList - - NumKitCass = DCount(KitCassList, @VM) - If NumKitCass GT 4 then - For CassIndex = 4 to NumKitCass Step 4 - CassNo = KitCassList<0, CassIndex> - CassNo := CRLF$ - KitCassList<0, CassIndex> = CassNo - Next CassIndex - end - NumPTICass = DCount(PTICassList, @VM) - If NumPTICass GT 4 then - For CassIndex = 4 to NumPTICass Step 4 - CassNo = PTICassList<0, CassIndex> - CassNo := CRLF$ - PTICassList<0, CassIndex> = CassNo - Next CassIndex - end - NumLoadedCass = DCount(LoadedCassList, @VM) - If NumLoadedCass GT 2 then - For CassIndex = 2 to NumLoadedCass Step 2 - CassNo = LoadedCassList<0, CassIndex> - CassNo := CRLF$ - LoadedCassList<0, CassIndex> = CassNo - Next CassIndex - end - Convert @VM to ',' in KitCassList - Convert @VM to ',' in PTICassList - Convert @VM to ',' in LoadedCassList - - CassNeeded = '' - EpiPartNo = Xlate('WO_LOG', S.WONo, 'EPI_PART_NO', 'X') - If EpiPartNo NE '' then - WPDAdjusted = Epi_Part_Services('GetAdjustedWafersPerDayScheduler', EpiPartNo, S.React_Type) - If WPDAdjusted NE '' then - CPDAdjusted = SRP_Math('CEILING', (WPDAdjusted/25) ) - CassInCR = DCount(KitCassList, ',') + DCount(PTICassList, ',') + DCount(LoadedCassList, ',') - CassNeeded = CassInCR - CPDAdjusted - end - end - - Swap '.1' with '' in S.ProdOrdNo - AllReportData = '' - AllReportData<1> = S.ReactNo - AllReportData<2> = S.React_Type - AllReportData<3> = S.WONo - AllReportData<4> = S.ProdOrdNo - AllReportData<5> = S.SubPartNo - AllReportData<6> = S.EpiPartNo - AllReportData<7> = S.WO_Qty - AllReportData<8> = S.WO_RX_Qty - AllReportData<9> = S.WO_UnRel_Qty - AllReportData<10> = S.KitLocation - AllReportData<11> = S.KitQty - AllReportData<12> = CassNeeded - AllReportData<13> = KitCassList - AllReportData<14> = PTICassList - AllReportData<15> = LoadedCassList - AllReportData<16> = '' - - If ( (KitCassList NE '') or (PTICassList NE '') or (LoadedCassList NE '') ) then - RowNumber += 1 - For each RptColumn in RptColumns using @VM setting rcPos - Locate RptColumn in AllRptColumns using @VM setting dataPos then - COLDATA = AllReportData - end - Next RptColumn - If COLDATA NE '' then GoSub PrintTable - END - - GOTO ReadRecord - -Bail: - - stat = Set_Printer('TERM',1) - -RETURN - - -OIPrintErr: - - ErrMsg(ErrorTitle:@SVM:ErrorMsg) - ErrMsg(ErrorTitle:@SVM:'Set_Printer returned errorcode ':stat) - stat = Set_Printer('TERM',1) - -RETURN - - -PrintTable: - - PageHeight = Get_Printer('PAGESIZE')<2> - PrintableHeight = PageHeight - TopMargin - BottomMargin - PrinterHeight = Get_Printer('POS')<2> - stat = Set_Printer('CALCTABLE',ColFmt:@FM:ColData) - TableSize = Get_Printer('CALCTABLE') - TableHeight = TableSize<2> - fontSpacing = 120 - - IF ( TableHeight + PrinterHeight >= PrintableHeight ) OR FirstLine THEN - IF NOT(FirstLine) THEN - stat = Set_Printer('PAGEBREAK') - END - FirstLine = 0 - font<2> = 10 - font<4> = 1 ;* Bold - stat = Set_Printer('FONT',font,'100') - stat = Set_Printer('ADDTABLE',colFmt,colHead,'',LTGREY$,'',0,TB_ALL) - font<4> = 0 - stat = Set_Printer('FONT',font,fontSpacing) - stat = Set_Printer('ADDTABLE',colFmt,'',colData,LTGREY$,'',0,7) - END ELSE - font<2> = 10 - font<4> = 0 - stat = Set_Printer('FONT',font,fontSpacing) - stat = Set_Printer('ADDTABLE',colFmt,'',colData,LTGREY$,'',1,TB_ALL) - END - -RETURN - - ClearCursors: - - For counter = 0 to 8 - ClearSelect counter - Next counter - + + For counter = 0 to 8 + ClearSelect counter + Next counter + return +OipiPrintError: + + ErrMsg(ErrorTitle:@SVM:ErrorMsg) + ErrMsg(ErrorTitle:@SVM:'Set_Printer returned errorcode ':stat) + stat = Set_Printer('TERM',1) + +return + diff --git a/LSL2/STPROC/REPORT_SERVICES_DEV.txt b/LSL2/STPROC/REPORT_SERVICES_DEV.txt deleted file mode 100644 index a859875..0000000 --- a/LSL2/STPROC/REPORT_SERVICES_DEV.txt +++ /dev/null @@ -1,552 +0,0 @@ -Compile function Report_Services_Dev(@Service, @Params) -/*********************************************************************************************************************** - - Name : Report_Services - - Description : Handler program for all Report 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) - 07/28/21 djs Copied original source code from Report_Services. Modified GetMaterialTrackReport - to use the SCHED_DET_NG table (i.e. Scheduler 2.0) instead of the SCHED_DET table. - - -***********************************************************************************************************************/ -#pragma precomp SRP_PreCompiler - -$Insert SERVICE_SETUP -$Insert LOGICAL -$Insert OIPRINT_EQUATES -$Insert SCHED_DET_NG_EQUATES -$Insert WO_LOG_EQUATES -$Insert APPCOLORS -$Insert MSG_EQUATES -$Insert SCHEDULE_EQU -$Insert LOCATION_EQUATES -$Insert RLIST_EQUATES - -Declare subroutine Utility, ErrMsg, Set_Status, Set_Printer, RList, SRP_Stopwatch, Btree.Extract, Error_Services, V119 -Declare subroutine Push.Select, Pop.Select -Declare function Set_Printer, Get_Printer, Msg, Get_Status, Printer_Select, obj_Install, Dialog_Box, obj_Location -Declare function Error_Services, Location_Services, SRP_Array, Signature_Services -Declare function Epi_Part_Services, SRP_Math, Datetime, MemberOf - -Equ TAB$ TO \09\ - -GoToService - -Return Response or "" - -//----------------------------------------------------------------------------- -// SERVICES -//----------------------------------------------------------------------------- - -Service GetMaterialTrackReport(RptColumns, LocationFilter, NoMatFlag) - - // All Possible Report Columns - AllRptColumns = '' - AllRptColumns<1, 1> = 'React No' - AllRptColumns<1, 2> = 'React Type' - AllRptColumns<1, 3> = 'WO No' - AllRptColumns<1, 4> = 'SAP Prod No' - AllRptColumns<1, 5> = 'Sub Part No' - AllRptColumns<1, 6> = 'Epi Part No' - AllRptColumns<1, 7> = 'WO Qty' - AllRptColumns<1, 8> = 'RX Qty' - AllRptColumns<1, 9> = 'UnRel Qty' - AllRptColumns<1, 10> = 'Kit Location' - AllRptColumns<1, 11> = 'Kit Qty' - AllRptColumns<1, 12> = '+/-' - AllRptColumns<1, 13> = 'Kit RO' - AllRptColumns<1, 14> = 'PTI RO' - AllRptColumns<1, 15> = 'Load' - AllRptColumns<1, 16> = 'Comments' - - If Index(RptColumns, 'Comments', 1) then - AllColFmt = '' - AllColFmt<1, 1> = '+^720' - AllColFmt<1, 2> = '+<720' - AllColFmt<1, 3> = '+^1000' - AllColFmt<1, 4> = '+^1100' - AllColFmt<1, 5> = '+^1300' - AllColFmt<1, 6> = '+^1200' - AllColFmt<1, 7> = '+>720' - AllColFmt<1, 8> = '+>720' - AllColFmt<1, 9> = '+>720' - AllColFmt<1, 10> = '+^1260' - AllColFmt<1, 11> = '+^720' - AllColFmt<1, 12> = '+^500' - AllColFmt<1, 13> = '+^1300' - AllColFmt<1, 14> = '+^1300' - AllColFmt<1, 15> = '+^700' - AllColFmt<1, 16> = '+^1300' - end else - AllColFmt = '' - AllColFmt<1, 1> = '+^720' - AllColFmt<1, 2> = '+<720' - AllColFmt<1, 3> = '+^1000' - AllColFmt<1, 4> = '+^1100' - AllColFmt<1, 5> = '+^1300' - AllColFmt<1, 6> = '+^1200' - AllColFmt<1, 7> = '+>720' - AllColFmt<1, 8> = '+>720' - AllColFmt<1, 9> = '+>720' - AllColFmt<1, 10> = '+^1260' - AllColFmt<1, 11> = '+^720' - AllColFmt<1, 12> = '+^500' - AllColFmt<1, 13> = '+^1800' - AllColFmt<1, 14> = '+^1800' - AllColFmt<1, 15> = '+^1100' - AllColFmt<1, 16> = '' - end - - ErrorTitle = 'Error in service ':Service - ErrCode = '' - ErrorMsg = '' - - OPEN 'SCHED_DET_NG' TO SchedDetTable then - OPEN 'DICT.SCHED_DET_NG' TO @DICT then - Today = Datetime() - - ReactList = '' - WOList = '' - SchedDetKeys = '' - PrevReactNo = '' - PrevWO = '' - - SelectSent = 'SELECT SCHED_DET_NG WITH STOP_DTM GE ':Today:' BY REACT_NO' - - RList(SelectSent,TARGET_ACTIVELIST$,'','','') - IF Get_Status(errCode) THEN - ErrMsg(errCode) - RETURN - END - - Done = 0 - @ID = '' - LOOP - PrevSchedDetKey = @ID - READNEXT @ID ELSE Done = 1 - UNTIL Done - READ SchedDetRec FROM SchedDetTable,@ID THEN - ReactNo = SchedDetRec - WONo = SchedDetRec - If ReactNo NE '' then - LOCATE ReactNo IN ReactList BY 'AR' USING @FM SETTING Pos ELSE - ReactList = INSERT(ReactList,Pos,0,0,ReactNo) - END - END - If WONo NE '' then - LOCATE WONo IN WOList USING @VM SETTING WPos ELSE - WOList = INSERT(WOList,Pos,-1,0,WONo) - SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,@ID) - END - END - END - - REPEAT - - CALL Make.List(0,SchedDetKeys,SchedDetTable,@DICT) - - Header = "'D'":@VM:obj_Install('Get_Prop','CompTitle'):' Material Tracking by Reactor':@VM:"Page 'P'" - MinDemand = 0 - Set_Status(0) - - * Start of printing process - FileName = 'Print Material Demand' - Title = 'Printing Material Demand' - - TopMargin = 1.0 - BottomMargin = 0.75 - LeftMargin = 0.25 - RightMargin = 0.25 - - Margins = LeftMargin:@FM:TopMargin:@FM:RightMargin:@FM:BottomMargin - - PageSetup = '1' ;* LandScape - PrintSetup = '2' ;* Preview Normal - PrintSetup<1,2> = '0' ;* All buttons - PrintSetup<1,5> = '1' ;* Page Range - PrintSetup<1,6> = 7 ;* full mouse and keyboard support - - PrintPath = '' - stat = Set_Printer('INIT',FileName,Title,Margins,PageSetup,PrintSetup,PrintPath) - - IF stat < 0 THEN - ErrorMsg = 'Stat = ' : Stat : ', PrintPath = ' : PrintPath - GOTO OIPrintErr - end - DateRange = 'Effective ':OCONV(Date(),'D4') - - Header<-1> = "'T'" - Header<-1> = '' ;* Blank line following heading - - font = 'Arial' - font<2> = '10' - font<4> = '0' ;* Bold - - stat = Set_Printer('FONTHEADFOOT',font) ; IF stat < 0 THEN GOTO OIPrintErr - stat = Set_Printer('HEADER',Header) ; IF stat < 0 THEN GOTO OIPrintErr - - Footer = " 'D' 'T'":@VM:@VM:"Page: 'P'" - stat = Set_Printer('FOOTER',Footer) ; IF stat < 0 THEN GOTO OIPrintErr - - @RECCOUNT = 0 - FirstPass = 1 - LastRecord = 0 - FirstLine = 1 - fontSpacing = 100 - - * Make Column Heading - ColHead = '' - ColFmt = '' - - For each Column in RptColumns using @VM setting rcPos - Locate Column in AllRptColumns using @VM setting dataPos then - ColHead<0, -1> = Column - ColFmt<0, -1> = AllColFmt<0, dataPos> - end - Next Column - - * Zero Accumulators For Each Break - - Prev.ReactNo = '' - Last.ReactNo.Break = 1 - - GoTo ReadRecord - - end else - ErrorMsg = 'Unable to open "SCHED_DET_NG" table.' - ErrMsg(ErrorTitle:@SVM:ErrorMsg) - end - end else - ErrorMsg = 'Unable to open "SCHED_DET_NG" table.' - ErrMsg(ErrorTitle:@SVM:ErrorMsg) - end - -End Service - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Internal GoSubs -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -ReadRecord: - - * Zero Break Flags To False - - ReactNo.Break=0 - - READNEXT @ID, Which.Value ELSE - LastRecord = 1 - ReactNo.Break = 1 - ReactNo = Prev.ReactNo - END - - S.ATID = @ID - - IF FirstPass AND LastRecord THEN - GOTO Bail - END - - IF LastRecord THEN GOTO BREAKS - - READO @RECORD FROM SchedDetTable,@ID ELSE - GOTO ReadRecord - END - - @RECCOUNT += 1 - - * Calculate Value(s) For Column(s) - - S.ATID = {@ID} - I.ATID = S.ATID - S.ReactNo = {REACT_NO} - I.ReactNo = S.ReactNo - S.WoNo = {WO_NO} - I.WoNo = S.WoNo - S.SubPartNo = XLATE('WO_LOG', S.WoNo, 'ORD_SUB_PART_NO', 'X') - I.SubPartNo = S.SubPartNo - S.EpiPartNo = XLATE('WO_LOG', S.WoNo, WO_LOG_EPI_PART_NO$, 'X') - I.EpiPartNo = S.EpiPartNo - S.WO_Qty = Xlate('WO_LOG', {WO_NO}, WO_LOG_WO_QTY$, 'X') - I.WO_Qty = S.WO_Qty - S.WO_RX_Qty = Xlate('WO_LOG', {WO_NO}, 'RX_QTY', 'X') - I.WO_RX_Qty = S.WO_RX_Qty - S.WO_UnRel_QTY = Xlate('WO_LOG', {WO_NO}, 'UNREL_QTY', 'X') - I.WO_UnRel_QTY = S.WO_UnRel_QTY - S.REACT_TYPE = Xlate('WO_LOG', {WO_NO}, 'REACT_TYPE', 'X') - S.ProdOrdNo = Xlate('WO_LOG', {WO_NO}, 'PROD_ORD_NO', 'X') - - Locate 'SR*KTR]' in LocationFilter using @VM setting vPos then - KitData = Location_Services('GetLocationCassInfo', S.WONo, 'SR*KTR]') - SWAP CRLF$ WITH @VM IN KitData - end else - KitData = '' - end - - S.KitLocation = KitData<1> - I.KitLocation = S.KitLocation - - S.KitQty = OCONV(SUM(KitData<2>) * 25,'MD0,Z') - I.KitQty = S.KitQty - - S.KitCassCnt = COUNT(KitData<3>,',') + (KitData<3> NE '') - I.KitCassCnt = S.KitCassCnt - - KitCassList = KitData<3> - - Locate '1K*PTI' in LocationFilter using @VM setting vPos then - PTIData = Location_Services('GetLocationCassInfo', S.WONo, '1K*PTI') - SWAP CRLF$ WITH @VM IN PTIData - end else - PTIData = '' - end - PTICassList = PTIData<3> - - CRLocs = '' - CRLocs<0, -1> = 'CR*BE' - CRLocs<0, -1> = 'CR*BO' - CRLocs<0, -1> = 'CR*TUN' - CRLocs<0, -1> = 'CR*EPR' - CRLocs<0, -1> = 'CR*FE' - CRLocs<0, -1> = 'CR*FEH' - CRLocs<0, -1> = 'CR*FO' - CRLocs<0, -1> = 'CR*FOH' - - LoadedData = '' - LocQueryList = '' - For each Loc in CRLocs using @VM setting crPos - Locate Loc in LocationFilter using @VM setting vPos then - LocQueryList<0, -1> = Loc - end - Next Loc - - LoadedCassList = '' - ReactType = Xlate('WO_LOG', S.WONo, 'REACT_TYPE', 'X') - If ReactType NE 'EPP' then - If LocQueryList NE '' then - LoadedData = Location_Services('GetLocationCassInfo', S.WONo, LocQueryList) - Swap CRLF$ with @VM in LoadedData - CassList = LoadedData<3> - Swap @VM with ',' in CassList - For each CassNo in CassList using ',' - If ( (S.WONo NE '') and (CassNo NE '') ) then - WOMatKey = S.WONo:'*':CassNo - UnloadSigComp = Signature_Services('CheckSignature', WOMatKey, 'UNLOAD') - OnHold = Xlate('WO_MAT', WOMatKey, 'HOLD', 'X') - CurrStatus = Xlate('WO_MAT', WOMatKey, 'CURR_STATUS', 'X') - If Not(UnloadSigComp or OnHold or (CurrStatus EQ 'REJ') ) then - LoadedCassList<0, -1> = CassNo - end - end - Next CassNo - end - end - - * TEST FOR CONTROL BREAK(S) - - IF (S.ReactNo NE Prev.ReactNo) OR ReactNo.Break THEN - ReactNo = Prev.ReactNo - Prev.ReactNo = S.ReactNo - ReactNo.Break += 1 - END - - IF FirstPass THEN - FirstPass=0 - GOTO DETAIL - END - - -BREAKS: - - * Print Break Total(s) And Accumulate Total(s) - IF ReactNo.Break THEN stat = Set_Printer('TEXT') - - * Perform Last Record Output If Done - IF LastRecord THEN - colData = '' - GOTO Bail - END - - -DETAIL: - - * Do Conversion If Any - - IF S.REACTNO NE "" THEN S.REACTNO = OCONV(S.REACTNO,"MD0,") - IF S.WONO NE "" THEN S.WONO = OCONV(S.WONO,"MD0") - IF S.WO_QTY NE "" THEN S.WO_QTY = OCONV(S.WO_QTY,"MD0,") - IF S.WO_RX_QTY NE "" THEN S.WO_RX_QTY = OCONV(S.WO_RX_QTY,"MD0,") - IF S.WO_UNREL_QTY NE "" THEN S.WO_UNREL_QTY = OCONV(S.WO_UNREL_QTY,"MD0,") - - * PRINT DETAIL LINE - - COLDATA = '' - RowNumber = 0 - - /* ascending sort */ - Convert @VM to ',' in KitCassList - Convert @VM to ',' in PTICassList - Convert @VM to ',' in LoadedCassList - KitCassList = SRP_Array('SortSimpleList', KitCassList, 'AscendingNumbers', ',') - PTICassList = SRP_Array('SortSimpleList', PTICassList, 'AscendingNumbers', ',') - LoadedCassList = SRP_Array('SortSimpleList', LoadedCassList, 'AscendingNumbers', ',') - - Convert ',' to @VM in KitCassList - Convert ',' to @VM in PTICassList - Convert ',' to @VM in LoadedCassList - - NumKitCass = DCount(KitCassList, @VM) - If NumKitCass GT 4 then - For CassIndex = 4 to NumKitCass Step 4 - CassNo = KitCassList<0, CassIndex> - CassNo := CRLF$ - KitCassList<0, CassIndex> = CassNo - Next CassIndex - end - NumPTICass = DCount(PTICassList, @VM) - If NumPTICass GT 4 then - For CassIndex = 4 to NumPTICass Step 4 - CassNo = PTICassList<0, CassIndex> - CassNo := CRLF$ - PTICassList<0, CassIndex> = CassNo - Next CassIndex - end - NumLoadedCass = DCount(LoadedCassList, @VM) - If NumLoadedCass GT 2 then - For CassIndex = 2 to NumLoadedCass Step 2 - CassNo = LoadedCassList<0, CassIndex> - CassNo := CRLF$ - LoadedCassList<0, CassIndex> = CassNo - Next CassIndex - end - Convert @VM to ',' in KitCassList - Convert @VM to ',' in PTICassList - Convert @VM to ',' in LoadedCassList - - CassNeeded = '' - EpiPartNo = Xlate('WO_LOG', S.WONo, 'EPI_PART_NO', 'X') - If EpiPartNo NE '' then - WPDAdjusted = Epi_Part_Services('GetAdjustedWafersPerDayScheduler', EpiPartNo, S.React_Type) - If WPDAdjusted NE '' then - CPDAdjusted = SRP_Math('CEILING', (WPDAdjusted/25) ) - CassInCR = DCount(KittCassList, ',') + DCount(PTICassList, ',') + DCount(LoadedCassList, ',') - CassNeeded = CassInCR - CPDAdjusted - end - end - - Swap '.1' with '' in S.ProdOrdNo - AllReportData = '' - AllReportData<1> = S.ReactNo - AllReportData<2> = S.React_Type - AllReportData<3> = S.WONo - AllReportData<4> = S.ProdOrdNo - AllReportData<5> = S.SubPartNo - AllReportData<6> = S.EpiPartNo - AllReportData<7> = S.WO_Qty - AllReportData<8> = S.WO_RX_Qty - AllReportData<9> = S.WO_UnRel_Qty - AllReportData<10> = S.KitLocation - AllReportData<11> = S.KitQty - AllReportData<12> = CassNeeded - AllReportData<13> = KitCassList - AllReportData<14> = PTICassList - AllReportData<15> = LoadedCassList - AllReportData<16> = '' - - If ( (KitCassList NE '') or (PTICassList NE '') or (LoadedCassList NE '') or (NoMatFlag EQ True$) ) then - RowNumber += 1 - For each RptColumn in RptColumns using @VM setting rcPos - Locate RptColumn in AllRptColumns using @VM setting dataPos then - COLDATA = AllReportData - end - Next RptColumn - If COLDATA NE '' then GoSub PrintTable - END - - GOTO ReadRecord - -Bail: - - stat = Set_Printer('TERM',1) - -RETURN - - -OIPrintErr: - - ErrMsg(ErrorTitle:@SVM:ErrorMsg) - ErrMsg(ErrorTitle:@SVM:'Set_Printer returned errorcode ':stat) - stat = Set_Printer('TERM',1) - -RETURN - - -PrintTable: - - PageHeight = Get_Printer('PAGESIZE')<2> - PrintableHeight = PageHeight - TopMargin - BottomMargin - PrinterHeight = Get_Printer('POS')<2> - stat = Set_Printer('CALCTABLE',ColFmt:@FM:ColData) - TableSize = Get_Printer('CALCTABLE') - TableHeight = TableSize<2> - fontSpacing = 120 - - IF ( TableHeight + PrinterHeight >= PrintableHeight ) OR FirstLine THEN - IF NOT(FirstLine) THEN - stat = Set_Printer('PAGEBREAK') - END - FirstLine = 0 - font<2> = 10 - font<4> = 1 ;* Bold - stat = Set_Printer('FONT',font,'100') - stat = Set_Printer('ADDTABLE',colFmt,colHead,'',LTGREY$,'',0,TB_ALL) - font<4> = 0 - stat = Set_Printer('FONT',font,fontSpacing) - stat = Set_Printer('ADDTABLE',colFmt,'',colData,LTGREY$,'',0,7) - END ELSE - font<2> = 10 - font<4> = 0 - stat = Set_Printer('FONT',font,fontSpacing) - stat = Set_Printer('ADDTABLE',colFmt,'',colData,LTGREY$,'',1,TB_ALL) - END - -RETURN - - diff --git a/LSL2/STPROC/REPORT_SERVICES_DEV2.txt b/LSL2/STPROC/REPORT_SERVICES_DEV2.txt deleted file mode 100644 index 137db35..0000000 --- a/LSL2/STPROC/REPORT_SERVICES_DEV2.txt +++ /dev/null @@ -1,589 +0,0 @@ -Compile function Report_Services_Dev2(@Service, @Params) -/*********************************************************************************************************************** - - Name : Report_Services - - Description : Handler program for all Report 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) - 07/28/21 djs Copied original source code from Report_Services. Modified GetMaterialTrackReport - to use the SCHED_DET_NG table (i.e. Scheduler 2.0) instead of the SCHED_DET table. - - -***********************************************************************************************************************/ -#pragma precomp SRP_PreCompiler - -$Insert SERVICE_SETUP -$Insert LOGICAL -$Insert OIPRINT_EQUATES -$Insert SCHED_DET_NG_EQUATES -$Insert WO_LOG_EQUATES -$Insert APPCOLORS -$Insert MSG_EQUATES -$Insert SCHEDULE_EQU -$Insert LOCATION_EQUATES -$Insert RLIST_EQUATES - -Declare subroutine Utility, ErrMsg, Set_Status, Set_Printer, RList, SRP_Stopwatch, Btree.Extract, Error_Services, V119 -Declare subroutine Push.Select, Pop.Select -Declare function Set_Printer, Get_Printer, Msg, Get_Status, Printer_Select, obj_Install, Dialog_Box, obj_Location -Declare function Error_Services, Location_Services, SRP_Array, Signature_Services -Declare function Epi_Part_Services, SRP_Math, Datetime - -Equ TAB$ TO \09\ - -GoToService - -Return Response or "" - -//----------------------------------------------------------------------------- -// SERVICES -//----------------------------------------------------------------------------- - -Service GetMaterialTrackReport(RptColumns, LocationFilter, NoMatFlag) - - // All Possible Report Columns - AllRptColumns = '' - AllRptColumns<1, 1> = 'React No' - AllRptColumns<1, 2> = 'React Type' - AllRptColumns<1, 3> = 'WO No' - AllRptColumns<1, 4> = 'SAP Prod No' - AllRptColumns<1, 5> = 'Sub Part No' - AllRptColumns<1, 6> = 'Epi Part No' - AllRptColumns<1, 7> = 'WO Qty' - AllRptColumns<1, 8> = 'RX Qty' - AllRptColumns<1, 9> = 'UnRel Qty' - AllRptColumns<1, 10> = 'Kit Location' - AllRptColumns<1, 11> = 'Kit Qty' - AllRptColumns<1, 12> = '+/-' - AllRptColumns<1, 13> = 'Kit RO' - AllRptColumns<1, 14> = 'PTI RO' - AllRptColumns<1, 15> = 'Load' - AllRptColumns<1, 16> = 'Comments' - - If Index(RptColumns, 'Comments', 1) then - AllColFmt = '' - AllColFmt<1, 1> = '+^720' - AllColFmt<1, 2> = '+<720' - AllColFmt<1, 3> = '+^1000' - AllColFmt<1, 4> = '+^1100' - AllColFmt<1, 5> = '+^1300' - AllColFmt<1, 6> = '+^1200' - AllColFmt<1, 7> = '+>720' - AllColFmt<1, 8> = '+>720' - AllColFmt<1, 9> = '+>720' - AllColFmt<1, 10> = '+^1260' - AllColFmt<1, 11> = '+^720' - AllColFmt<1, 12> = '+^500' - AllColFmt<1, 13> = '+^1300' - AllColFmt<1, 14> = '+^1300' - AllColFmt<1, 15> = '+^700' - AllColFmt<1, 16> = '+^1300' - end else - AllColFmt = '' - AllColFmt<1, 1> = '+^720' - AllColFmt<1, 2> = '+<720' - AllColFmt<1, 3> = '+^1000' - AllColFmt<1, 4> = '+^1100' - AllColFmt<1, 5> = '+^1300' - AllColFmt<1, 6> = '+^1200' - AllColFmt<1, 7> = '+>720' - AllColFmt<1, 8> = '+>720' - AllColFmt<1, 9> = '+>720' - AllColFmt<1, 10> = '+^1260' - AllColFmt<1, 11> = '+^720' - AllColFmt<1, 12> = '+^500' - AllColFmt<1, 13> = '+^1800' - AllColFmt<1, 14> = '+^1800' - AllColFmt<1, 15> = '+^1100' - AllColFmt<1, 16> = '' - end - - ErrorTitle = 'Error in service ':Service - ErrCode = '' - ErrorMsg = '' - - OPEN 'SCHED_DET_NG' TO SchedDetTable then - OPEN 'DICT.SCHED_DET_NG' TO @DICT then - Today = Datetime() - 30 - - ReactList = '' - WOList = '' - SchedDetKeys = '' - PrevReactNo = '' - PrevWO = '' - - SelectSent = 'SELECT SCHED_DET_NG WITH STOP_DTM GE ':Today:' BY REACT_NO' - - RList(SelectSent,TARGET_ACTIVELIST$,'','','') - IF Get_Status(errCode) THEN - ErrMsg(errCode) - RETURN - END - - Done = 0 - @ID = '' - LOOP - PrevSchedDetKey = @ID - READNEXT @ID ELSE Done = 1 - UNTIL Done - READ SchedDetRec FROM SchedDetTable,@ID THEN - ReactNo = SchedDetRec - WONo = SchedDetRec - If ReactNo NE '' then - LOCATE ReactNo IN ReactList BY 'AR' USING @FM SETTING Pos ELSE - ReactList = INSERT(ReactList,Pos,0,0,ReactNo) - END - END - If WONo NE '' then - LOCATE WONo IN WOList USING @VM SETTING WPos ELSE - WOList = INSERT(WOList,Pos,-1,0,WONo) - SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,@ID) - END - END - END - - REPEAT - - CALL Make.List(0,SchedDetKeys,SchedDetTable,@DICT) - - Header = "'D'":@VM:obj_Install('Get_Prop','CompTitle'):' Material Tracking by Reactor':@VM:"Page 'P'" - MinDemand = 0 - Set_Status(0) - - * Start of printing process - FileName = 'Print Material Demand' - Title = 'Printing Material Demand' - - TopMargin = 1.0 - BottomMargin = 0.75 - LeftMargin = 0.25 - RightMargin = 0.25 - - Margins = LeftMargin:@FM:TopMargin:@FM:RightMargin:@FM:BottomMargin - - PageSetup = '1' ;* LandScape - PrintSetup = '2' ;* Preview Normal - PrintSetup<1,2> = '0' ;* All buttons - PrintSetup<1,5> = '1' ;* Page Range - PrintSetup<1,6> = 7 ;* full mouse and keyboard support - - PrintPath = '' - stat = Set_Printer('INIT',FileName,Title,Margins,PageSetup,PrintSetup,PrintPath) - - IF stat < 0 THEN - ErrorMsg = 'Stat = ' : Stat : ', PrintPath = ' : PrintPath - GOTO OIPrintErr - end - DateRange = 'Effective ':OCONV(Date(),'D4') - - Header<-1> = "'T'" - Header<-1> = '' ;* Blank line following heading - - font = 'Arial' - font<2> = '10' - font<4> = '0' ;* Bold - - stat = Set_Printer('FONTHEADFOOT',font) ; IF stat < 0 THEN GOTO OIPrintErr - stat = Set_Printer('HEADER',Header) ; IF stat < 0 THEN GOTO OIPrintErr - - Footer = " 'D' 'T'":@VM:@VM:"Page: 'P'" - stat = Set_Printer('FOOTER',Footer) ; IF stat < 0 THEN GOTO OIPrintErr - - @RECCOUNT = 0 - FirstPass = 1 - LastRecord = 0 - FirstLine = 1 - fontSpacing = 100 - - * Make Column Heading - ColHead = '' - ColFmt = '' - - For each Column in RptColumns using @VM setting rcPos - Locate Column in AllRptColumns using @VM setting dataPos then - ColHead<0, -1> = Column - ColFmt<0, -1> = AllColFmt<0, dataPos> - end - Next Column - - * Zero Accumulators For Each Break - - Prev.ReactNo = '' - Last.ReactNo.Break = 1 - - GoTo ReadRecord - - end else - ErrorMsg = 'Unable to open "SCHED_DET_NG" table.' - ErrMsg(ErrorTitle:@SVM:ErrorMsg) - end - end else - ErrorMsg = 'Unable to open "SCHED_DET_NG" table.' - ErrMsg(ErrorTitle:@SVM:ErrorMsg) - end - -End Service - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Internal GoSubs -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -ReadRecord: - - * Zero Break Flags To False - - ReactNo.Break=0 - - READNEXT @ID, Which.Value ELSE - LastRecord = 1 - ReactNo.Break = 1 - ReactNo = Prev.ReactNo - END - - S.ATID = @ID - - IF FirstPass AND LastRecord THEN - GOTO Bail - END - - IF LastRecord THEN GOTO BREAKS - - READO @RECORD FROM SchedDetTable,@ID ELSE - GOTO ReadRecord - END - - @RECCOUNT += 1 - - * Calculate Value(s) For Column(s) - - S.ATID = {@ID} - I.ATID = S.ATID - S.ReactNo = {REACT_NO} - I.ReactNo = S.ReactNo - S.WoNo = {WO_NO} - I.WoNo = S.WoNo - S.SubPartNo = XLATE('WO_LOG', S.WoNo, 'ORD_SUB_PART_NO', 'X') - I.SubPartNo = S.SubPartNo - S.EpiPartNo = XLATE('WO_LOG', S.WoNo, WO_LOG_EPI_PART_NO$, 'X') - I.EpiPartNo = S.EpiPartNo - S.WO_Qty = Xlate('WO_LOG', {WO_NO}, WO_LOG_WO_QTY$, 'X') - I.WO_Qty = S.WO_Qty - S.WO_RX_Qty = Xlate('WO_LOG', {WO_NO}, 'RX_QTY', 'X') - I.WO_RX_Qty = S.WO_RX_Qty - S.WO_UnRel_QTY = Xlate('WO_LOG', {WO_NO}, 'UNREL_QTY', 'X') - I.WO_UnRel_QTY = S.WO_UnRel_QTY - S.REACT_TYPE = Xlate('WO_LOG', {WO_NO}, 'REACT_TYPE', 'X') - S.ProdOrdNo = Xlate('WO_LOG', {WO_NO}, 'PROD_ORD_NO', 'X') - - Locate 'SR*KTR]' in LocationFilter using @VM setting vPos then - KitData = Location_Services('GetLocationCassInfo', S.WONo, 'SR*KTR]') - SWAP CRLF$ WITH @VM IN KitData - end else - KitData = '' - end - - KitCassList = KitData<3> - NewKitData = '' - - Swap ',' with @VM in KitData - - // Filter out cassettes on hold - NewKitData<1> = KitData<1> - Swap @VM with ',' in KitCassList - For each Cass in KitCassList using ',' setting cPos - Key = S.WONo:'*':Cass - OnHold = Xlate('WO_MAT', Key, 'HOLD', 'X') - If OnHold NE True$ then - NewKitData<3, -1> = KitData<3, cPos> - end - Next Cass - - NewKitData<2> = DCount(NewKitData<3>, @VM) ; // Update cassette count - KitData = NewKitData - - Swap @VM with ',' in KitData - - S.KitLocation = KitData<1> - I.KitLocation = S.KitLocation - - S.KitQty = OCONV(SUM(KitData<2>) * 25,'MD0,Z') - I.KitQty = S.KitQty - - S.KitCassCnt = COUNT(KitData<3>,',') + (KitData<3> NE '') - I.KitCassCnt = S.KitCassCnt - - KitCassList = KitData<3> - - Locate '1K*PTI' in LocationFilter using @VM setting vPos then - PTIData = Location_Services('GetLocationCassInfo', S.WONo, '1K*PTI') - SWAP CRLF$ WITH @VM IN PTIData - end else - PTIData = '' - end - PTICassList = PTIData<3> - NewPTIData = '' - - Swap ',' with @VM in PTIData - // Filter out cassettes on hold - NewPTIData<1> = PTIData<1> - Swap @VM with ',' in PTICassList - For each Cass in PTICassList using ',' setting cPos - Key = S.WONo:'*':Cass - OnHold = Xlate('WO_MAT', Key, 'HOLD', 'X') - If OnHold NE True$ then - NewPTIData<3, -1> = PTIData<3, cPos> - end - Next Cass - NewPTIData<2> = DCount(NewPTIData<3>, @VM) ; // Update cassette count - PTIData = NewPTIData - - Swap @VM with ',' in PTIData - PTICassList = PTIData<3> - - CRLocs = '' - CRLocs<0, -1> = 'CR*BE' - CRLocs<0, -1> = 'CR*BO' - CRLocs<0, -1> = 'CR*TUN' - CRLocs<0, -1> = 'CR*EPR' - CRLocs<0, -1> = 'CR*FE' - CRLocs<0, -1> = 'CR*FEH' - CRLocs<0, -1> = 'CR*FO' - CRLocs<0, -1> = 'CR*FOH' - - LoadedData = '' - LocQueryList = '' - For each Loc in CRLocs using @VM setting crPos - Locate Loc in LocationFilter using @VM setting vPos then - LocQueryList<0, -1> = Loc - end - Next Loc - LoadedCassList = '' - ReactType = Xlate('WO_LOG', S.WONo, 'REACT_TYPE', 'X') - If ReactType NE 'EPP' then - If LocQueryList NE '' then - LoadedData = Location_Services('GetLocationCassInfo', S.WONo, LocQueryList) - Swap CRLF$ with @VM in LoadedData - CassList = LoadedData<3> - Swap @VM with ',' in CassList - For each CassNo in CassList using ',' - If ( (S.WONo NE '') and (CassNo NE '') ) then - WOMatKey = S.WONo:'*':CassNo - UnloadSigComp = Signature_Services('CheckSignature', WOMatKey, 'UNLOAD') - OnHold = Xlate('WO_MAT', WOMatKey, 'HOLD', 'X') - If Not(UnloadSigComp or OnHold) then - LoadedCassList<0, -1> = CassNo - end - end - Next CassNo - end - end - - * TEST FOR CONTROL BREAK(S) - - IF (S.ReactNo NE Prev.ReactNo) OR ReactNo.Break THEN - ReactNo = Prev.ReactNo - Prev.ReactNo = S.ReactNo - ReactNo.Break += 1 - END - - IF FirstPass THEN - FirstPass=0 - GOTO DETAIL - END - - -BREAKS: - - * Print Break Total(s) And Accumulate Total(s) - IF ReactNo.Break THEN stat = Set_Printer('TEXT') - - * Perform Last Record Output If Done - IF LastRecord THEN - colData = '' - GOTO Bail - END - - -DETAIL: - - * Do Conversion If Any - - IF S.REACTNO NE "" THEN S.REACTNO = OCONV(S.REACTNO,"MD0,") - IF S.WONO NE "" THEN S.WONO = OCONV(S.WONO,"MD0") - IF S.WO_QTY NE "" THEN S.WO_QTY = OCONV(S.WO_QTY,"MD0,") - IF S.WO_RX_QTY NE "" THEN S.WO_RX_QTY = OCONV(S.WO_RX_QTY,"MD0,") - IF S.WO_UNREL_QTY NE "" THEN S.WO_UNREL_QTY = OCONV(S.WO_UNREL_QTY,"MD0,") - - * PRINT DETAIL LINE - - COLDATA = '' - RowNumber = 0 - - /* ascending sort */ - Convert @VM to ',' in KitCassList - Convert @VM to ',' in PTICassList - Convert @VM to ',' in LoadedCassList - KitCassList = SRP_Array('SortSimpleList', KitCassList, 'AscendingNumbers', ',') - PTICassList = SRP_Array('SortSimpleList', PTICassList, 'AscendingNumbers', ',') - LoadedCassList = SRP_Array('SortSimpleList', LoadedCassList, 'AscendingNumbers', ',') - - Convert ',' to @VM in KitCassList - Convert ',' to @VM in PTICassList - Convert ',' to @VM in LoadedCassList - - NumKitCass = DCount(KitCassList, @VM) - If NumKitCass GT 4 then - For CassIndex = 4 to NumKitCass Step 4 - CassNo = KitCassList<0, CassIndex> - CassNo := CRLF$ - KitCassList<0, CassIndex> = CassNo - Next CassIndex - end - NumPTICass = DCount(PTICassList, @VM) - If NumPTICass GT 4 then - For CassIndex = 4 to NumPTICass Step 4 - CassNo = PTICassList<0, CassIndex> - CassNo := CRLF$ - PTICassList<0, CassIndex> = CassNo - Next CassIndex - end - NumLoadedCass = DCount(LoadedCassList, @VM) - If NumLoadedCass GT 2 then - For CassIndex = 2 to NumLoadedCass Step 2 - CassNo = LoadedCassList<0, CassIndex> - CassNo := CRLF$ - LoadedCassList<0, CassIndex> = CassNo - Next CassIndex - end - Convert @VM to ',' in KitCassList - Convert @VM to ',' in PTICassList - Convert @VM to ',' in LoadedCassList - - CassNeeded = '' - EpiPartNo = Xlate('WO_LOG', S.WONo, 'EPI_PART_NO', 'X') - If EpiPartNo NE '' then - WPDAdjusted = Epi_Part_Services('GetAdjustedWafersPerDayScheduler', EpiPartNo, S.React_Type) - If WPDAdjusted NE '' then - CPDAdjusted = SRP_Math('CEILING', (WPDAdjusted/25) ) - CassInCR = DCount(KittCassList, ',') + DCount(PTICassList, ',') + DCount(LoadedCassList, ',') - CassNeeded = CassInCR - CPDAdjusted - end - end - - Swap '.1' with '' in S.ProdOrdNo - AllReportData = '' - AllReportData<1> = S.ReactNo - AllReportData<2> = S.React_Type - AllReportData<3> = S.WONo - AllReportData<4> = S.ProdOrdNo - AllReportData<5> = S.SubPartNo - AllReportData<6> = S.EpiPartNo - AllReportData<7> = S.WO_Qty - AllReportData<8> = S.WO_RX_Qty - AllReportData<9> = S.WO_UnRel_Qty - AllReportData<10> = S.KitLocation - AllReportData<11> = S.KitQty - AllReportData<12> = CassNeeded - AllReportData<13> = KitCassList - AllReportData<14> = PTICassList - AllReportData<15> = LoadedCassList - AllReportData<16> = '' - - If ( (KitCassList NE '') or (PTICassList NE '') or (LoadedCassList NE '') or (NoMatFlag EQ True$) ) then - RowNumber += 1 - For each RptColumn in RptColumns using @VM setting rcPos - Locate RptColumn in AllRptColumns using @VM setting dataPos then - COLDATA = AllReportData - end - Next RptColumn - If COLDATA NE '' then GoSub PrintTable - END - - GOTO ReadRecord - -Bail: - - stat = Set_Printer('TERM',1) - -RETURN - - -OIPrintErr: - - ErrMsg(ErrorTitle:@SVM:ErrorMsg) - ErrMsg(ErrorTitle:@SVM:'Set_Printer returned errorcode ':stat) - stat = Set_Printer('TERM',1) - -RETURN - - -PrintTable: - - PageHeight = Get_Printer('PAGESIZE')<2> - PrintableHeight = PageHeight - TopMargin - BottomMargin - PrinterHeight = Get_Printer('POS')<2> - stat = Set_Printer('CALCTABLE',ColFmt:@FM:ColData) - TableSize = Get_Printer('CALCTABLE') - TableHeight = TableSize<2> - fontSpacing = 120 - - IF ( TableHeight + PrinterHeight >= PrintableHeight ) OR FirstLine THEN - IF NOT(FirstLine) THEN - stat = Set_Printer('PAGEBREAK') - END - FirstLine = 0 - font<2> = 10 - font<4> = 1 ;* Bold - stat = Set_Printer('FONT',font,'100') - stat = Set_Printer('ADDTABLE',colFmt,colHead,'',LTGREY$,'',0,TB_ALL) - font<4> = 0 - stat = Set_Printer('FONT',font,fontSpacing) - stat = Set_Printer('ADDTABLE',colFmt,'',colData,LTGREY$,'',0,7) - END ELSE - font<2> = 10 - font<4> = 0 - stat = Set_Printer('FONT',font,fontSpacing) - stat = Set_Printer('ADDTABLE',colFmt,'',colData,LTGREY$,'',1,TB_ALL) - END - -RETURN - - diff --git a/LSL2/STPROC/REPORT_SERVICES_DEV3.txt b/LSL2/STPROC/REPORT_SERVICES_DEV3.txt deleted file mode 100644 index 2454413..0000000 --- a/LSL2/STPROC/REPORT_SERVICES_DEV3.txt +++ /dev/null @@ -1,468 +0,0 @@ -Compile function Report_Services_Dev3(@Service, @Params) -/*********************************************************************************************************************** - - Name : Report_Services - - Description : Handler program for all Report 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) - 07/28/21 djs Copied original source code from Report_Services. Modified GetMaterialTrackReport - to use the SCHED_DET_NG table (i.e. Scheduler 2.0) instead of the SCHED_DET table. - - -***********************************************************************************************************************/ -#pragma precomp SRP_PreCompiler - -$Insert SERVICE_SETUP -$Insert LOGICAL -$Insert OIPRINT_EQUATES -$Insert SCHED_DET_NG_EQUATES -$Insert WO_LOG_EQUATES -$Insert APPCOLORS -$Insert MSG_EQUATES -$Insert SCHEDULE_EQU -$Insert LOCATION_EQUATES -$Insert RLIST_EQUATES - -Declare subroutine Utility, ErrMsg, Set_Status, Set_Printer, RList, SRP_Stopwatch, Btree.Extract, Error_Services, V119 -Declare subroutine Push.Select, Pop.Select, SRP_Stopwatch, Database_Services -Declare function Set_Printer, Get_Printer, Msg, Get_Status, Printer_Select, obj_Install, Dialog_Box, obj_Location -Declare function Error_Services, Location_Services, SRP_Array, Signature_Services -Declare function Epi_Part_Services, SRP_Math, Datetime, Database_Services - -Equ TAB$ TO \09\ - -GoToService - -Return Response or "" - -//----------------------------------------------------------------------------- -// SERVICES -//----------------------------------------------------------------------------- - -Service CalculateMaterialTrackData(RptColumns, LocationFilter, NoMatFlag) - hSysLists = Database_Services('GetTableHandle', 'SYSLISTS') - Lock hSysLists, ServiceKeyID then - - NoMatFlag = True$ - - LocationFilter = '' - LocationFilter<1, 1> = 'SR*KTR]' - LocationFilter<1, 2> = '1K*PTI' - LocationFilter<1, 3> = 'CR*BE' - LocationFilter<1, 4> = 'CR*BO' - LocationFilter<1, 5> = 'CR*TUN' - LocationFilter<1, 6> = 'CR*EPR' - LocationFilter<1, 7> = 'CR*FE' - LocationFilter<1, 8> = 'CR*FEH' - LocationFilter<1, 9> = 'CR*FO' - LocationFilter<1, 10> = 'CR*FOH' - - - // All Possible Report Columns - AllRptColumns = '' - AllRptColumns<1, 1> = 'React No' - AllRptColumns<1, 2> = 'React Type' - AllRptColumns<1, 3> = 'WO No' - AllRptColumns<1, 4> = 'SAP Prod No' - AllRptColumns<1, 5> = 'Sub Part No' - AllRptColumns<1, 6> = 'Epi Part No' - AllRptColumns<1, 7> = 'WO Qty' - AllRptColumns<1, 8> = 'RX Qty' - AllRptColumns<1, 9> = 'UnRel Qty' - AllRptColumns<1, 10> = 'Kit Location' - AllRptColumns<1, 11> = 'Kit Qty' - AllRptColumns<1, 12> = '+/-' - AllRptColumns<1, 13> = 'Kit RO' - AllRptColumns<1, 14> = 'PTI RO' - AllRptColumns<1, 15> = 'Load' - AllRptColumns<1, 16> = 'Comments' - - RptColumns = AllRptColumns - - ErrorTitle = 'Error in service ':Service - ErrCode = '' - ErrorMsg = '' - - OPEN 'SCHED_DET_NG' TO SchedDetTable then - OPEN 'DICT.SCHED_DET_NG' TO @DICT then - Today = Datetime() - - ReactList = '' - WOList = '' - SchedDetKeys = '' - PrevReactNo = '' - PrevWO = '' - - SelectSent = 'SELECT SCHED_DET_NG WITH STOP_DTM GE "':OCONV(Today, 'DT'):'" BY REACT_NO' - - RList(SelectSent,TARGET_ACTIVELIST$,'','','') - IF Get_Status(errCode) THEN - ErrMsg(errCode) - Unlock hSysLists, ServiceKeyID else Null - RETURN - END - - Done = 0 - @ID = '' - LOOP - PrevSchedDetKey = @ID - READNEXT @ID ELSE Done = 1 - UNTIL Done - READ SchedDetRec FROM SchedDetTable,@ID THEN - ReactNo = SchedDetRec - WONo = SchedDetRec - If ReactNo NE '' then - LOCATE ReactNo IN ReactList BY 'AR' USING @FM SETTING Pos ELSE - ReactList = INSERT(ReactList,Pos,0,0,ReactNo) - END - END - If WONo NE '' then - LOCATE WONo IN WOList USING @VM SETTING WPos ELSE - WOList = INSERT(WOList,Pos,-1,0,WONo) - SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,@ID) - END - END - END - - REPEAT - - CALL Make.List(0,SchedDetKeys,SchedDetTable,@DICT) - - DateRange = 'Effective ':OCONV(Date(),'D4') - - RowIndex = 0 - AllReportData = '' - @RECCOUNT = 0 - FirstPass = 1 - LastRecord = 0 - FirstLine = 1 - fontSpacing = 100 - - * Zero Accumulators For Each Break - - Prev.ReactNo = '' - Last.ReactNo.Break = 1 - - GoTo ReadRecord - - end else - ErrorMsg = 'Unable to open "SCHED_DET_NG" table.' - ErrMsg(ErrorTitle:@SVM:ErrorMsg) - end - end else - ErrorMsg = 'Unable to open "SCHED_DET_NG" table.' - ErrMsg(ErrorTitle:@SVM:ErrorMsg) - end - Unlock hSysLists, ServiceKeyID else Null - end - -End Service - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Internal GoSubs -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -ReadRecord: - - * Zero Break Flags To False - - ReactNo.Break=0 - - READNEXT @ID, Which.Value ELSE - LastRecord = 1 - ReactNo.Break = 1 - ReactNo = Prev.ReactNo - END - - S.ATID = @ID - - IF FirstPass AND LastRecord THEN - GOTO Bail - END - - IF LastRecord THEN GOTO BREAKS - - READO @RECORD FROM SchedDetTable,@ID ELSE - GOTO ReadRecord - END - - @RECCOUNT += 1 - - * Calculate Value(s) For Column(s) - - S.ATID = {@ID} - I.ATID = S.ATID - S.ReactNo = {REACT_NO} - I.ReactNo = S.ReactNo - S.WoNo = {WO_NO} - I.WoNo = S.WoNo - S.SubPartNo = XLATE('WO_LOG', S.WoNo, 'ORD_SUB_PART_NO', 'X') - I.SubPartNo = S.SubPartNo - S.EpiPartNo = XLATE('WO_LOG', S.WoNo, WO_LOG_EPI_PART_NO$, 'X') - I.EpiPartNo = S.EpiPartNo - S.WO_Qty = Xlate('WO_LOG', {WO_NO}, WO_LOG_WO_QTY$, 'X') - I.WO_Qty = S.WO_Qty - S.WO_RX_Qty = Xlate('WO_LOG', {WO_NO}, 'RX_QTY', 'X') - I.WO_RX_Qty = S.WO_RX_Qty - S.WO_UnRel_QTY = Xlate('WO_LOG', {WO_NO}, 'UNREL_QTY', 'X') - I.WO_UnRel_QTY = S.WO_UnRel_QTY - S.REACT_TYPE = Xlate('WO_LOG', {WO_NO}, 'REACT_TYPE', 'X') - S.ProdOrdNo = Xlate('WO_LOG', {WO_NO}, 'PROD_ORD_NO', 'X') - - Locate 'SR*KTR]' in LocationFilter using @VM setting vPos then - KitData = Location_Services('GetLocationCassInfo', S.WONo, 'SR*KTR]') - SWAP CRLF$ WITH @VM IN KitData - end else - KitData = '' - end - - KitCassList = KitData<3> - NewKitData = '' - - Swap ',' with @VM in KitData - - // Filter out cassettes on hold - NewKitData<1> = KitData<1> - Swap @VM with ',' in KitCassList - For each Cass in KitCassList using ',' setting cPos - Key = S.WONo:'*':Cass - OnHold = Xlate('WO_MAT', Key, 'HOLD', 'X') - If OnHold NE True$ then - NewKitData<3, -1> = KitData<3, cPos> - end - Next Cass - - LocInfo = '' - LocInfo<1> = NewKitData<1> - LocInfo<2> = DCount(NewKitData<3>, @VM) - LocInfo<3> = NewKitData<3> - Database_Services('WriteDataRow', 'WO_LOC', S.WONo:'*':'SR*KTR]', LocInfo) - - NewKitData<2> = DCount(NewKitData<3>, @VM) ; // Update cassette count - KitData = NewKitData - - Swap @VM with ',' in KitData - - S.KitLocation = KitData<1> - I.KitLocation = S.KitLocation - -* S.KitQty = OCONV(SUM(KitData<2>) * 25,'MD0,Z') - - - S.KitCassCnt = COUNT(KitData<3>,',') + (KitData<3> NE '') - I.KitCassCnt = S.KitCassCnt - - KitCassList = KitData<3> - S.KitQty = 0 - For each CassNo in KitCassList using ',' - S.KitQty += Xlate('WO_MAT', S.WONo:'*':CassNo, 'WAFER_QTY', 'X') - Next CassNo - I.KitQty = S.KitQty - - Locate '1K*PTI' in LocationFilter using @VM setting vPos then - PTIData = Location_Services('GetLocationCassInfo', S.WONo, '1K*PTI') - SWAP CRLF$ WITH @VM IN PTIData - end else - PTIData = '' - end - PTICassList = PTIData<3> - NewPTIData = '' - - Swap ',' with @VM in PTIData - // Filter out cassettes on hold - NewPTIData<1> = PTIData<1> - Swap @VM with ',' in PTICassList - For each Cass in PTICassList using ',' setting cPos - Key = S.WONo:'*':Cass - OnHold = Xlate('WO_MAT', Key, 'HOLD', 'X') - If OnHold NE True$ then - NewPTIData<3, -1> = PTIData<3, cPos> - end - Next Cass - - LocInfo = '' - LocInfo<1> = '1K*PTI' - LocInfo<2> = DCount(NewPTIData<3>, @VM) - LocInfo<3> = NewPTIData<3> - Database_Services('WriteDataRow', 'WO_LOC', S.WONo:'*':'1K*PTI', LocInfo) - - NewPTIData<2> = DCount(NewPTIData<3>, @VM) ; // Update cassette count - PTIData = NewPTIData - - Swap @VM with ',' in PTIData - PTICassList = PTIData<3> - - CRLocs = '' - CRLocs<0, -1> = 'CR*BE' - CRLocs<0, -1> = 'CR*BO' - CRLocs<0, -1> = 'CR*TUN' - CRLocs<0, -1> = 'CR*EPR' - CRLocs<0, -1> = 'CR*FE' - CRLocs<0, -1> = 'CR*FEH' - CRLocs<0, -1> = 'CR*FO' - CRLocs<0, -1> = 'CR*FOH' - - LoadedData = '' - LocQueryList = '' - For each Loc in CRLocs using @VM setting crPos - Locate Loc in LocationFilter using @VM setting vPos then - LocQueryList<0, -1> = Loc - end - Next Loc - LoadedCassList = '' - ReactType = Xlate('WO_LOG', S.WONo, 'REACT_TYPE', 'X') - - If ReactType NE 'EPP' then - If LocQueryList NE '' then - For each CRLoc in LocQueryList using @VM - CRLocCassList = '' - LoadedData = Location_Services('GetLocationCassInfo', S.WONo, CRLoc) - Swap CRLF$ with @VM in LoadedData - CassList = LoadedData<3> - Swap @VM with ',' in CassList - For each CassNo in CassList using ',' - If ( (S.WONo NE '') and (CassNo NE '') ) then - WOMatKey = S.WONo:'*':CassNo - UnloadSigComp = Signature_Services('CheckSignature', WOMatKey, 'UNLOAD') - OnHold = Xlate('WO_MAT', WOMatKey, 'HOLD', 'X') - CurrStatus = Xlate('WO_MAT', WOMatKey, 'CURR_STATUS', 'X') - If Not(UnloadSigComp or OnHold or (CurrStatus EQ 'REJ') ) then - CRLocCassList<0, -1> = CassNo - Locate CassNo in LoadedCassList using @VM setting vPos else - LoadedCassList<0, -1> = CassNo - end - end - end - Next CassNo - LocInfo = '' - LocInfo<3> = CRLocCassList - Database_Services('WriteDataRow', 'WO_LOC', S.WONo:'*':CRLoc, LocInfo) - Next CRLoc - end - end - - * TEST FOR CONTROL BREAK(S) - - IF (S.ReactNo NE Prev.ReactNo) OR ReactNo.Break THEN - ReactNo = Prev.ReactNo - Prev.ReactNo = S.ReactNo - ReactNo.Break += 1 - END - - IF FirstPass THEN - FirstPass=0 - GOTO DETAIL - END - - -BREAKS: - - * Perform Last Record Output If Done - IF LastRecord THEN - colData = '' - GOTO Bail - END - - -DETAIL: - - * Do Conversion If Any - - IF S.REACTNO NE "" THEN S.REACTNO = OCONV(S.REACTNO,"MD0,") - IF S.WONO NE "" THEN S.WONO = OCONV(S.WONO,"MD0") - IF S.WO_QTY NE "" THEN S.WO_QTY = OCONV(S.WO_QTY,"MD0,") - IF S.WO_RX_QTY NE "" THEN S.WO_RX_QTY = OCONV(S.WO_RX_QTY,"MD0,") - IF S.WO_UNREL_QTY NE "" THEN S.WO_UNREL_QTY = OCONV(S.WO_UNREL_QTY,"MD0,") - - * PRINT DETAIL LINE - - COLDATA = '' - RowNumber = 0 - - /* ascending sort */ - Convert @VM to ',' in KitCassList - Convert @VM to ',' in PTICassList - Convert @VM to ',' in LoadedCassList - KitCassList = SRP_Array('SortSimpleList', KitCassList, 'AscendingNumbers', ',') - PTICassList = SRP_Array('SortSimpleList', PTICassList, 'AscendingNumbers', ',') - LoadedCassList = SRP_Array('SortSimpleList', LoadedCassList, 'AscendingNumbers', ',') - - CassNeeded = '' - EpiPartNo = Xlate('WO_LOG', S.WONo, 'EPI_PART_NO', 'X') - If EpiPartNo NE '' then - WPDAdjusted = Epi_Part_Services('GetAdjustedWafersPerDayScheduler', EpiPartNo, S.React_Type) - If WPDAdjusted NE '' then - CPDAdjusted = SRP_Math('CEILING', (WPDAdjusted/25) ) - CassInCR = DCount(KitCassList, ',') + DCount(PTICassList, ',') + DCount(LoadedCassList, ',') - CassNeeded = CassInCR - CPDAdjusted - end - end - - RowIndex += 1 - Swap '.1' with '' in S.ProdOrdNo - - AllReportData = S.ReactNo - AllReportData = S.React_Type - AllReportData = S.WONo - AllReportData = S.ProdOrdNo - AllReportData = S.SubPartNo - AllReportData = S.EpiPartNo - AllReportData = S.WO_Qty - AllReportData = S.WO_RX_Qty - AllReportData = S.WO_UnRel_Qty - AllReportData = S.KitLocation - AllReportData = S.KitQty - AllReportData = CassNeeded - AllReportData = KitCassList - AllReportData = PTICassList - AllReportData = LoadedCassList - AllReportData = '' - - GOTO ReadRecord - -Bail: - - Unlock hSysLists, ServiceKeyID else Null - Database_Services('WriteDataRow', 'SYSLISTS', 'MAT_REPORT', AllReportData) - -RETURN - - diff --git a/LSL2/STPROC/REPORT_SERVICES_DEV4.txt b/LSL2/STPROC/REPORT_SERVICES_DEV4.txt deleted file mode 100644 index 45130c4..0000000 --- a/LSL2/STPROC/REPORT_SERVICES_DEV4.txt +++ /dev/null @@ -1,402 +0,0 @@ -Compile function Report_Services_Dev4(@Service, @Params) -/*********************************************************************************************************************** - - Name : Report_Services - - Description : Handler program for all Report 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) - 07/28/21 djs Copied original source code from Report_Services. Modified GetMaterialTrackReport - to use the SCHED_DET_NG table (i.e. Scheduler 2.0) instead of the SCHED_DET table. - - -***********************************************************************************************************************/ -#pragma precomp SRP_PreCompiler - -$Insert SERVICE_SETUP -$Insert LOGICAL -$Insert OIPRINT_EQUATES -$Insert SCHED_DET_NG_EQUATES -$Insert WO_LOG_EQUATES -$Insert APPCOLORS -$Insert MSG_EQUATES -$Insert SCHEDULE_EQU -$Insert LOCATION_EQUATES -$Insert RLIST_EQUATES - -Declare subroutine Utility, ErrMsg, Set_Status, Set_Printer, RList, SRP_Stopwatch, Btree.Extract, Error_Services, V119 -Declare subroutine Push.Select, Pop.Select, SRP_Stopwatch, Database_Services -Declare function Set_Printer, Get_Printer, Msg, Get_Status, Printer_Select, obj_Install, Dialog_Box, obj_Location -Declare function Error_Services, Location_Services, SRP_Array, Signature_Services -Declare function Epi_Part_Services, SRP_Math, Datetime, Database_Services - -Equ TAB$ TO \09\ - -GoToService - -Return Response or "" - -//----------------------------------------------------------------------------- -// SERVICES -//----------------------------------------------------------------------------- - -Service GetMaterialTrackReport(RptColumns, LocationFilter, NoMatFlag) - - SRP_Stopwatch('Reset') - SRP_Stopwatch('Start', 'Select') - NoMatFlag = False$ - - LocationFilter = '' - LocationFilter<1, 1> = 'SR*KTR]' - LocationFilter<1, 2> = '1K*PTI' - LocationFilter<1, 3> = 'CR*BE' - LocationFilter<1, 4> = 'CR*BO' - LocationFilter<1, 5> = 'CR*TUN' - LocationFilter<1, 6> = 'CR*EPR' - LocationFilter<1, 7> = 'CR*FE' - LocationFilter<1, 8> = 'CR*FEH' - LocationFilter<1, 9> = 'CR*FO' - LocationFilter<1, 10> = 'CR*FOH' - - - // All Possible Report Columns - AllRptColumns = '' - AllRptColumns<1, 1> = 'React No' - AllRptColumns<1, 2> = 'React Type' - AllRptColumns<1, 3> = 'WO No' - AllRptColumns<1, 4> = 'SAP Prod No' - AllRptColumns<1, 5> = 'Sub Part No' - AllRptColumns<1, 6> = 'Epi Part No' - AllRptColumns<1, 7> = 'WO Qty' - AllRptColumns<1, 8> = 'RX Qty' - AllRptColumns<1, 9> = 'UnRel Qty' - AllRptColumns<1, 10> = 'Kit Location' - AllRptColumns<1, 11> = 'Kit Qty' - AllRptColumns<1, 12> = '+/-' - AllRptColumns<1, 13> = 'Kit RO' - AllRptColumns<1, 14> = 'PTI RO' - AllRptColumns<1, 15> = 'Load' - AllRptColumns<1, 16> = 'Comments' - - RptColumns = AllRptColumns - - ErrorTitle = 'Error in service ':Service - ErrCode = '' - ErrorMsg = '' - - OPEN 'SCHED_DET_NG' TO SchedDetTable then - OPEN 'DICT.SCHED_DET_NG' TO @DICT then - Today = Datetime() - 45 - - ReactList = '' - WOList = '' - SchedDetKeys = '' - PrevReactNo = '' - PrevWO = '' - - SelectSent = 'SELECT SCHED_DET_NG WITH STOP_DTM GE ':Today:' BY REACT_NO' - - RList(SelectSent,TARGET_ACTIVELIST$,'','','') - IF Get_Status(errCode) THEN - ErrMsg(errCode) - RETURN - END - - Done = 0 - @ID = '' - LOOP - PrevSchedDetKey = @ID - READNEXT @ID ELSE Done = 1 - UNTIL Done - READ SchedDetRec FROM SchedDetTable,@ID THEN - ReactNo = SchedDetRec - WONo = SchedDetRec - If ReactNo NE '' then - LOCATE ReactNo IN ReactList BY 'AR' USING @FM SETTING Pos ELSE - ReactList = INSERT(ReactList,Pos,0,0,ReactNo) - END - END - If WONo NE '' then - LOCATE WONo IN WOList USING @VM SETTING WPos ELSE - WOList = INSERT(WOList,Pos,-1,0,WONo) - SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,@ID) - END - END - END - - REPEAT - - CALL Make.List(0,SchedDetKeys,SchedDetTable,@DICT) - - DateRange = 'Effective ':OCONV(Date(),'D4') - - RowIndex = 0 - AllReportData = '' - @RECCOUNT = 0 - FirstPass = 1 - LastRecord = 0 - FirstLine = 1 - fontSpacing = 100 - - * Zero Accumulators For Each Break - - Prev.ReactNo = '' - Last.ReactNo.Break = 1 - - GoTo ReadRecord - - end else - ErrorMsg = 'Unable to open "SCHED_DET_NG" table.' - ErrMsg(ErrorTitle:@SVM:ErrorMsg) - end - end else - ErrorMsg = 'Unable to open "SCHED_DET_NG" table.' - ErrMsg(ErrorTitle:@SVM:ErrorMsg) - end - -End Service - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Internal GoSubs -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -ReadRecord: - - * Zero Break Flags To False - - ReactNo.Break=0 - - READNEXT @ID, Which.Value ELSE - LastRecord = 1 - ReactNo.Break = 1 - ReactNo = Prev.ReactNo - END - - S.ATID = @ID - - IF FirstPass AND LastRecord THEN - GOTO Bail - END - - IF LastRecord THEN GOTO BREAKS - - READO @RECORD FROM SchedDetTable,@ID ELSE - GOTO ReadRecord - END - - @RECCOUNT += 1 - - * Calculate Value(s) For Column(s) - SRP_Stopwatch('Start', 'Read Record 1.1') - S.ATID = {@ID} - I.ATID = S.ATID - S.ReactNo = {REACT_NO} - I.ReactNo = S.ReactNo - S.WoNo = {WO_NO} - I.WoNo = S.WoNo - S.SubPartNo = XLATE('WO_LOG', S.WoNo, 'ORD_SUB_PART_NO', 'X') - I.SubPartNo = S.SubPartNo - S.EpiPartNo = XLATE('WO_LOG', S.WoNo, WO_LOG_EPI_PART_NO$, 'X') - I.EpiPartNo = S.EpiPartNo - S.WO_Qty = Xlate('WO_LOG', {WO_NO}, WO_LOG_WO_QTY$, 'X') - I.WO_Qty = S.WO_Qty - S.WO_RX_Qty = Xlate('WO_LOG', {WO_NO}, 'RX_QTY', 'X') - I.WO_RX_Qty = S.WO_RX_Qty - S.WO_UnRel_QTY = Xlate('WO_LOG', {WO_NO}, 'UNREL_QTY', 'X') - I.WO_UnRel_QTY = S.WO_UnRel_QTY - S.REACT_TYPE = Xlate('WO_LOG', {WO_NO}, 'REACT_TYPE', 'X') - S.ProdOrdNo = Xlate('WO_LOG', {WO_NO}, 'PROD_ORD_NO', 'X') - SRP_Stopwatch('Stop', 'Read Record 1.1') - SRP_Stopwatch('Start', 'Read Record 1.2.1') - Locate 'SR*KTR]' in LocationFilter using @VM setting vPos then - KitData = Database_Services('ReadDataRow', 'WO_LOC', S.WONo:'*':'SR*KTR]') - end else - KitData = '' - end - SRP_Stopwatch('Stop', 'Read Record 1.2.1') - SRP_Stopwatch('Start', 'Read Record 1.2.2') - - Swap @VM with ',' in KitData - - S.KitLocation = KitData<1> - I.KitLocation = S.KitLocation - - S.KitQty = OCONV(SUM(KitData<2>) * 25,'MD0,Z') - I.KitQty = S.KitQty - - S.KitCassCnt = KitData<2> - I.KitCassCnt = S.KitCassCnt - - KitCassList = KitData<3> - - SRP_Stopwatch('Stop', 'Read Record 1.2.2') - SRP_Stopwatch('Start', 'Read Record 1.2.3') - - Locate '1K*PTI' in LocationFilter using @VM setting vPos then - PTIData = Database_Services('ReadDataRow', 'WO_LOC', S.WONo:'*':'1K*PTI') - end else - PTIData = '' - end - - SRP_Stopwatch('Stop', 'Read Record 1.2.3') - SRP_Stopwatch('Start', 'Read Record 1.3.1') - - Swap @VM with ',' in PTIData - - PTICassList = PTIData<3> - - CRLocs = '' - CRLocs<0, -1> = 'CR*BE' - CRLocs<0, -1> = 'CR*BO' - CRLocs<0, -1> = 'CR*TUN' - CRLocs<0, -1> = 'CR*EPR' - CRLocs<0, -1> = 'CR*FE' - CRLocs<0, -1> = 'CR*FEH' - CRLocs<0, -1> = 'CR*FO' - CRLocs<0, -1> = 'CR*FOH' - - LoadedData = '' - LocQueryList = '' - For each Loc in CRLocs using @VM setting crPos - Locate Loc in LocationFilter using @VM setting vPos then - LocQueryList<0, -1> = Loc - end - Next Loc - LoadedCassList = '' - ReactType = Xlate('WO_LOG', S.WONo, 'REACT_TYPE', 'X') - SRP_Stopwatch('Stop', 'Read Record 1.3.1') - SRP_Stopwatch('Start', 'Read Record 1.3.2') - If ReactType NE 'EPP' then - If LocQueryList NE '' then - For each CRLoc in LocQueryList using @VM - CRLocInfo = Database_Services('ReadDataRow', 'WO_LOC', S.WONo:'*':CRLoc) - CRLocCassList = CRLocInfo<3> - LoadedCassList = SRP_Array('Join', LoadedCassList, CRLocCassList, 'OR', @VM) - Next CRLoc - end - end - - LoadedCassList = SRP_Array('Clean', LoadedCassList, 'TrimAndMakeUnique', @VM) - * TEST FOR CONTROL BREAK(S) - - IF (S.ReactNo NE Prev.ReactNo) OR ReactNo.Break THEN - ReactNo = Prev.ReactNo - Prev.ReactNo = S.ReactNo - ReactNo.Break += 1 - END - SRP_Stopwatch('Stop', 'Read Record 1.3.2') - IF FirstPass THEN - FirstPass=0 - GOTO DETAIL - END - - -BREAKS: - - * Perform Last Record Output If Done - IF LastRecord THEN - colData = '' - GOTO Bail - END - - -DETAIL: - SRP_Stopwatch('Start', 'Detail') - * Do Conversion If Any - - IF S.REACTNO NE "" THEN S.REACTNO = OCONV(S.REACTNO,"MD0,") - IF S.WONO NE "" THEN S.WONO = OCONV(S.WONO,"MD0") - IF S.WO_QTY NE "" THEN S.WO_QTY = OCONV(S.WO_QTY,"MD0,") - IF S.WO_RX_QTY NE "" THEN S.WO_RX_QTY = OCONV(S.WO_RX_QTY,"MD0,") - IF S.WO_UNREL_QTY NE "" THEN S.WO_UNREL_QTY = OCONV(S.WO_UNREL_QTY,"MD0,") - - * PRINT DETAIL LINE - - COLDATA = '' - RowNumber = 0 - - /* ascending sort */ - Convert @VM to ',' in KitCassList - Convert @VM to ',' in PTICassList - Convert @VM to ',' in LoadedCassList - KitCassList = SRP_Array('SortSimpleList', KitCassList, 'AscendingNumbers', ',') - PTICassList = SRP_Array('SortSimpleList', PTICassList, 'AscendingNumbers', ',') - LoadedCassList = SRP_Array('SortSimpleList', LoadedCassList, 'AscendingNumbers', ',') - - CassNeeded = '' - EpiPartNo = Xlate('WO_LOG', S.WONo, 'EPI_PART_NO', 'X') - If EpiPartNo NE '' then - WPDAdjusted = Epi_Part_Services('GetAdjustedWafersPerDayScheduler', EpiPartNo, S.React_Type) - If WPDAdjusted NE '' then - CPDAdjusted = SRP_Math('CEILING', (WPDAdjusted/25) ) - CassInCR = DCount(KittCassList, ',') + DCount(PTICassList, ',') + DCount(LoadedCassList, ',') - CassNeeded = CassInCR - CPDAdjusted - end - end - - RowIndex += 1 - Swap '.1' with '' in S.ProdOrdNo - - AllReportData = S.ReactNo - AllReportData = S.React_Type - AllReportData = S.WONo - AllReportData = S.ProdOrdNo - AllReportData = S.SubPartNo - AllReportData = S.EpiPartNo - AllReportData = S.WO_Qty - AllReportData = S.WO_RX_Qty - AllReportData = S.WO_UnRel_Qty - AllReportData = S.KitLocation - AllReportData = S.KitQty - AllReportData = CassNeeded - AllReportData = KitCassList - AllReportData = PTICassList - AllReportData = LoadedCassList - AllReportData = '' - SRP_Stopwatch('Stop', 'Detail') - GOTO ReadRecord - -Bail: - - SRP_Stopwatch('ShowAll') - -RETURN - - diff --git a/LSL2/STPROC/REPORT_SERVICES_DEV5.txt b/LSL2/STPROC/REPORT_SERVICES_DEV5.txt deleted file mode 100644 index c05c5ea..0000000 --- a/LSL2/STPROC/REPORT_SERVICES_DEV5.txt +++ /dev/null @@ -1,547 +0,0 @@ -Compile function Report_Services_Dev5(@Service, @Params) -/*********************************************************************************************************************** - - Name : Report_Services - - Description : Handler program for all Report 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) - 07/28/21 djs Copied original source code from Report_Services. Modified GetMaterialTrackReport - to use the SCHED_DET_NG table (i.e. Scheduler 2.0) instead of the SCHED_DET table. - - -***********************************************************************************************************************/ -#pragma precomp SRP_PreCompiler - -$Insert SERVICE_SETUP -$Insert LOGICAL -$Insert OIPRINT_EQUATES -$Insert SCHED_DET_NG_EQUATES -$Insert WO_LOG_EQUATES -$Insert APPCOLORS -$Insert MSG_EQUATES -$Insert SCHEDULE_EQU -$Insert LOCATION_EQUATES -$Insert RLIST_EQUATES - -Declare subroutine Utility, ErrMsg, Set_Status, Set_Printer, RList, Btree.Extract, Error_Services, V119 -Declare subroutine Push.Select, Pop.Select -Declare function Set_Printer, Get_Printer, Msg, Get_Status, Printer_Select, obj_Install, Dialog_Box, obj_Location -Declare function Error_Services, Location_Services, SRP_Array, Signature_Services -Declare function Epi_Part_Services, SRP_Math, Datetime, Database_Services - -Equ TAB$ TO \09\ - -GoToService - -Return Response or "" - -//----------------------------------------------------------------------------- -// SERVICES -//----------------------------------------------------------------------------- - -Service GetMaterialTrackReport(RptColumns, LocationFilter, NoMatFlag) - - // All Possible Report Columns - AllRptColumns = '' - AllRptColumns<1, 1> = 'React No' - AllRptColumns<1, 2> = 'React Type' - AllRptColumns<1, 3> = 'WO No' - AllRptColumns<1, 4> = 'SAP Prod No' - AllRptColumns<1, 5> = 'Sub Part No' - AllRptColumns<1, 6> = 'Epi Part No' - AllRptColumns<1, 7> = 'WO Qty' - AllRptColumns<1, 8> = 'RX Qty' - AllRptColumns<1, 9> = 'UnRel Qty' - AllRptColumns<1, 10> = 'Kit Location' - AllRptColumns<1, 11> = 'Kit Qty' - AllRptColumns<1, 12> = '+/-' - AllRptColumns<1, 13> = 'Kit RO' - AllRptColumns<1, 14> = 'PTI RO' - AllRptColumns<1, 15> = 'Load' - AllRptColumns<1, 16> = 'Comments' - - If Index(RptColumns, 'Comments', 1) then - AllColFmt = '' - AllColFmt<1, 1> = '+^720' - AllColFmt<1, 2> = '+<720' - AllColFmt<1, 3> = '+^1000' - AllColFmt<1, 4> = '+^1100' - AllColFmt<1, 5> = '+^1300' - AllColFmt<1, 6> = '+^1200' - AllColFmt<1, 7> = '+>720' - AllColFmt<1, 8> = '+>720' - AllColFmt<1, 9> = '+>720' - AllColFmt<1, 10> = '+^1260' - AllColFmt<1, 11> = '+^720' - AllColFmt<1, 12> = '+^500' - AllColFmt<1, 13> = '+^1300' - AllColFmt<1, 14> = '+^1300' - AllColFmt<1, 15> = '+^700' - AllColFmt<1, 16> = '+^1300' - end else - AllColFmt = '' - AllColFmt<1, 1> = '+^720' - AllColFmt<1, 2> = '+<720' - AllColFmt<1, 3> = '+^1000' - AllColFmt<1, 4> = '+^1100' - AllColFmt<1, 5> = '+^1300' - AllColFmt<1, 6> = '+^1200' - AllColFmt<1, 7> = '+>720' - AllColFmt<1, 8> = '+>720' - AllColFmt<1, 9> = '+>720' - AllColFmt<1, 10> = '+^1260' - AllColFmt<1, 11> = '+^720' - AllColFmt<1, 12> = '+^500' - AllColFmt<1, 13> = '+^1800' - AllColFmt<1, 14> = '+^1800' - AllColFmt<1, 15> = '+^1100' - AllColFmt<1, 16> = '' - end - - ErrorTitle = 'Error in service ':Service - ErrCode = '' - ErrorMsg = '' - - OPEN 'SCHED_DET_NG' TO SchedDetTable then - OPEN 'DICT.SCHED_DET_NG' TO @DICT then - Today = Datetime() - - ReactList = '' - WOList = '' - SchedDetKeys = '' - PrevReactNo = '' - PrevWO = '' - - SelectSent = 'SELECT SCHED_DET_NG WITH STOP_DTM GE "':OCONV(Today, 'DT'):'" BY REACT_NO' - - RList(SelectSent,TARGET_ACTIVELIST$,'','','') - IF Get_Status(errCode) THEN - ErrMsg(errCode) - RETURN - END - - Done = 0 - @ID = '' - LOOP - PrevSchedDetKey = @ID - READNEXT @ID ELSE Done = 1 - UNTIL Done - READ SchedDetRec FROM SchedDetTable,@ID THEN - ReactNo = SchedDetRec - WONo = SchedDetRec - If ReactNo NE '' then - LOCATE ReactNo IN ReactList BY 'AR' USING @FM SETTING Pos ELSE - ReactList = INSERT(ReactList,Pos,0,0,ReactNo) - END - END - If WONo NE '' then - LOCATE WONo IN WOList USING @VM SETTING WPos ELSE - WOList = INSERT(WOList,Pos,-1,0,WONo) - SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,@ID) - END - END - END - - REPEAT - - CALL Make.List(0,SchedDetKeys,SchedDetTable,@DICT) - - Header = "'D'":@VM:obj_Install('Get_Prop','CompTitle'):' Material Tracking by Reactor':@VM:"Page 'P'" - MinDemand = 0 - Set_Status(0) - - * Start of printing process - FileName = 'Print Material Demand' - Title = 'Printing Material Demand' - - TopMargin = 1.0 - BottomMargin = 0.75 - LeftMargin = 0.25 - RightMargin = 0.25 - - Margins = LeftMargin:@FM:TopMargin:@FM:RightMargin:@FM:BottomMargin - - PageSetup = '1' ;* LandScape - PrintSetup = '2' ;* Preview Normal - PrintSetup<1,2> = '0' ;* All buttons - PrintSetup<1,5> = '1' ;* Page Range - PrintSetup<1,6> = 7 ;* full mouse and keyboard support - - PrintPath = '' - stat = Set_Printer('INIT',FileName,Title,Margins,PageSetup,PrintSetup,PrintPath) - - IF stat < 0 THEN - ErrorMsg = 'Stat = ' : Stat : ', PrintPath = ' : PrintPath - GOTO OIPrintErr - end - DateRange = 'Effective ':OCONV(Date(),'D4') - - Header<-1> = "'T'" - Header<-1> = '' ;* Blank line following heading - - font = 'Arial' - font<2> = '10' - font<4> = '0' ;* Bold - - stat = Set_Printer('FONTHEADFOOT',font) ; IF stat < 0 THEN GOTO OIPrintErr - stat = Set_Printer('HEADER',Header) ; IF stat < 0 THEN GOTO OIPrintErr - - Footer = " 'D' 'T'":@VM:@VM:"Page: 'P'" - stat = Set_Printer('FOOTER',Footer) ; IF stat < 0 THEN GOTO OIPrintErr - - @RECCOUNT = 0 - FirstPass = 1 - LastRecord = 0 - FirstLine = 1 - fontSpacing = 100 - - * Make Column Heading - ColHead = '' - ColFmt = '' - - For each Column in RptColumns using @VM setting rcPos - Locate Column in AllRptColumns using @VM setting dataPos then - ColHead<0, -1> = Column - ColFmt<0, -1> = AllColFmt<0, dataPos> - end - Next Column - - * Zero Accumulators For Each Break - - Prev.ReactNo = '' - Last.ReactNo.Break = 1 - - GoTo ReadRecord - - end else - ErrorMsg = 'Unable to open "SCHED_DET_NG" table.' - ErrMsg(ErrorTitle:@SVM:ErrorMsg) - end - end else - ErrorMsg = 'Unable to open "SCHED_DET_NG" table.' - ErrMsg(ErrorTitle:@SVM:ErrorMsg) - end - -End Service - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Internal GoSubs -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -ReadRecord: - - * Zero Break Flags To False - - ReactNo.Break=0 - - READNEXT @ID, Which.Value ELSE - LastRecord = 1 - ReactNo.Break = 1 - ReactNo = Prev.ReactNo - END - - S.ATID = @ID - - IF FirstPass AND LastRecord THEN - GOTO Bail - END - - IF LastRecord THEN GOTO BREAKS - - READO @RECORD FROM SchedDetTable,@ID ELSE - GOTO ReadRecord - END - - @RECCOUNT += 1 - - * Calculate Value(s) For Column(s) - - S.ATID = {@ID} - I.ATID = S.ATID - S.ReactNo = {REACT_NO} - I.ReactNo = S.ReactNo - S.WoNo = {WO_NO} - I.WoNo = S.WoNo - S.SubPartNo = XLATE('WO_LOG', S.WoNo, 'ORD_SUB_PART_NO', 'X') - I.SubPartNo = S.SubPartNo - S.EpiPartNo = XLATE('WO_LOG', S.WoNo, WO_LOG_EPI_PART_NO$, 'X') - I.EpiPartNo = S.EpiPartNo - S.WO_Qty = Xlate('WO_LOG', {WO_NO}, WO_LOG_WO_QTY$, 'X') - I.WO_Qty = S.WO_Qty - S.WO_RX_Qty = Xlate('WO_LOG', {WO_NO}, 'RX_QTY', 'X') - I.WO_RX_Qty = S.WO_RX_Qty - S.WO_UnRel_QTY = Xlate('WO_LOG', {WO_NO}, 'UNREL_QTY', 'X') - I.WO_UnRel_QTY = S.WO_UnRel_QTY - S.REACT_TYPE = Xlate('WO_LOG', {WO_NO}, 'REACT_TYPE', 'X') - S.ProdOrdNo = Xlate('WO_LOG', {WO_NO}, 'PROD_ORD_NO', 'X') - - Locate 'SR*KTR]' in LocationFilter using @VM setting vPos then - KitData = Database_Services('ReadDataRow', 'WO_LOC', S.WONo:'*':'SR*KTR]') - end else - KitData = '' - end - - Swap @VM with ',' in KitData - - S.KitLocation = KitData<1> - I.KitLocation = S.KitLocation - - S.KitCassCnt = COUNT(KitData<3>,',') + (KitData<3> NE '') - I.KitCassCnt = S.KitCassCnt - - KitCassList = KitData<3> - S.KitQty = 0 - For each CassNo in KitCassList using ',' - S.KitQty += Xlate('WO_MAT', S.WONo:'*':CassNo, 'WAFER_QTY', 'X') - Next CassNo - I.KitQty = S.KitQty - - Locate '1K*PTI' in LocationFilter using @VM setting vPos then - PTIData = Database_Services('ReadDataRow', 'WO_LOC', S.WONo:'*':'1K*PTI') - end else - PTIData = '' - end - PTICassList = PTIData<3> - - Swap @VM with ',' in PTIData - PTICassList = PTIData<3> - - CRLocs = '' - CRLocs<0, -1> = 'CR*BE' - CRLocs<0, -1> = 'CR*BO' - CRLocs<0, -1> = 'CR*TUN' - CRLocs<0, -1> = 'CR*EPR' - CRLocs<0, -1> = 'CR*FE' - CRLocs<0, -1> = 'CR*FEH' - CRLocs<0, -1> = 'CR*FO' - CRLocs<0, -1> = 'CR*FOH' - - LoadedData = '' - LocQueryList = '' - For each Loc in CRLocs using @VM setting crPos - Locate Loc in LocationFilter using @VM setting vPos then - LocQueryList<0, -1> = Loc - end - Next Loc - LoadedCassList = '' - ReactType = Xlate('WO_LOG', S.WONo, 'REACT_TYPE', 'X') - If ReactType NE 'EPP' then - If LocQueryList NE '' then - For each CRLoc in LocQueryList using @VM - CRLocInfo = Database_Services('ReadDataRow', 'WO_LOC', S.WONo:'*':CRLoc) - CRLocCassList = CRLocInfo<3> - LoadedCassList = SRP_Array('Join', LoadedCassList, CRLocCassList, 'OR', @VM) - Next CRLoc - end - end - - LoadedCassList = SRP_Array('Clean', LoadedCassList, 'TrimAndMakeUnique', @VM) - * TEST FOR CONTROL BREAK(S) - - IF (S.ReactNo NE Prev.ReactNo) OR ReactNo.Break THEN - ReactNo = Prev.ReactNo - Prev.ReactNo = S.ReactNo - ReactNo.Break += 1 - END - - IF FirstPass THEN - FirstPass=0 - GOTO DETAIL - END - - -BREAKS: - - * Print Break Total(s) And Accumulate Total(s) - IF ReactNo.Break THEN stat = Set_Printer('TEXT') - - * Perform Last Record Output If Done - IF LastRecord THEN - colData = '' - GOTO Bail - END - - -DETAIL: - - * Do Conversion If Any - - IF S.REACTNO NE "" THEN S.REACTNO = OCONV(S.REACTNO,"MD0,") - IF S.WONO NE "" THEN S.WONO = OCONV(S.WONO,"MD0") - IF S.WO_QTY NE "" THEN S.WO_QTY = OCONV(S.WO_QTY,"MD0,") - IF S.WO_RX_QTY NE "" THEN S.WO_RX_QTY = OCONV(S.WO_RX_QTY,"MD0,") - IF S.WO_UNREL_QTY NE "" THEN S.WO_UNREL_QTY = OCONV(S.WO_UNREL_QTY,"MD0,") - - * PRINT DETAIL LINE - - COLDATA = '' - RowNumber = 0 - - /* ascending sort */ - Convert @VM to ',' in KitCassList - Convert @VM to ',' in PTICassList - Convert @VM to ',' in LoadedCassList - KitCassList = SRP_Array('SortSimpleList', KitCassList, 'AscendingNumbers', ',') - PTICassList = SRP_Array('SortSimpleList', PTICassList, 'AscendingNumbers', ',') - LoadedCassList = SRP_Array('SortSimpleList', LoadedCassList, 'AscendingNumbers', ',') - - Convert ',' to @VM in KitCassList - Convert ',' to @VM in PTICassList - Convert ',' to @VM in LoadedCassList - - NumKitCass = DCount(KitCassList, @VM) - If NumKitCass GT 4 then - For CassIndex = 4 to NumKitCass Step 4 - CassNo = KitCassList<0, CassIndex> - CassNo := CRLF$ - KitCassList<0, CassIndex> = CassNo - Next CassIndex - end - NumPTICass = DCount(PTICassList, @VM) - If NumPTICass GT 4 then - For CassIndex = 4 to NumPTICass Step 4 - CassNo = PTICassList<0, CassIndex> - CassNo := CRLF$ - PTICassList<0, CassIndex> = CassNo - Next CassIndex - end - NumLoadedCass = DCount(LoadedCassList, @VM) - If NumLoadedCass GT 2 then - For CassIndex = 2 to NumLoadedCass Step 2 - CassNo = LoadedCassList<0, CassIndex> - CassNo := CRLF$ - LoadedCassList<0, CassIndex> = CassNo - Next CassIndex - end - Convert @VM to ',' in KitCassList - Convert @VM to ',' in PTICassList - Convert @VM to ',' in LoadedCassList - - CassNeeded = '' - EpiPartNo = Xlate('WO_LOG', S.WONo, 'EPI_PART_NO', 'X') - If EpiPartNo NE '' then - WPDAdjusted = Epi_Part_Services('GetAdjustedWafersPerDayScheduler', EpiPartNo, S.React_Type) - If WPDAdjusted NE '' then - CPDAdjusted = SRP_Math('CEILING', (WPDAdjusted/25) ) - CassInCR = DCount(KitCassList, ',') + DCount(PTICassList, ',') + DCount(LoadedCassList, ',') - CassNeeded = CassInCR - CPDAdjusted - end - end - - Swap '.1' with '' in S.ProdOrdNo - AllReportData = '' - AllReportData<1> = S.ReactNo - AllReportData<2> = S.React_Type - AllReportData<3> = S.WONo - AllReportData<4> = S.ProdOrdNo - AllReportData<5> = S.SubPartNo - AllReportData<6> = S.EpiPartNo - AllReportData<7> = S.WO_Qty - AllReportData<8> = S.WO_RX_Qty - AllReportData<9> = S.WO_UnRel_Qty - AllReportData<10> = S.KitLocation - AllReportData<11> = S.KitQty - AllReportData<12> = CassNeeded - AllReportData<13> = KitCassList - AllReportData<14> = PTICassList - AllReportData<15> = LoadedCassList - AllReportData<16> = '' - - If ( (KitCassList NE '') or (PTICassList NE '') or (LoadedCassList NE '') or (NoMatFlag EQ True$) ) then - RowNumber += 1 - For each RptColumn in RptColumns using @VM setting rcPos - Locate RptColumn in AllRptColumns using @VM setting dataPos then - COLDATA = AllReportData - end - Next RptColumn - If COLDATA NE '' then GoSub PrintTable - END - - GOTO ReadRecord - -Bail: - - stat = Set_Printer('TERM',1) - -RETURN - - -OIPrintErr: - - ErrMsg(ErrorTitle:@SVM:ErrorMsg) - ErrMsg(ErrorTitle:@SVM:'Set_Printer returned errorcode ':stat) - stat = Set_Printer('TERM',1) - -RETURN - - -PrintTable: - - PageHeight = Get_Printer('PAGESIZE')<2> - PrintableHeight = PageHeight - TopMargin - BottomMargin - PrinterHeight = Get_Printer('POS')<2> - stat = Set_Printer('CALCTABLE',ColFmt:@FM:ColData) - TableSize = Get_Printer('CALCTABLE') - TableHeight = TableSize<2> - fontSpacing = 120 - - IF ( TableHeight + PrinterHeight >= PrintableHeight ) OR FirstLine THEN - IF NOT(FirstLine) THEN - stat = Set_Printer('PAGEBREAK') - END - FirstLine = 0 - font<2> = 10 - font<4> = 1 ;* Bold - stat = Set_Printer('FONT',font,'100') - stat = Set_Printer('ADDTABLE',colFmt,colHead,'',LTGREY$,'',0,TB_ALL) - font<4> = 0 - stat = Set_Printer('FONT',font,fontSpacing) - stat = Set_Printer('ADDTABLE',colFmt,'',colData,LTGREY$,'',0,7) - END ELSE - font<2> = 10 - font<4> = 0 - stat = Set_Printer('FONT',font,fontSpacing) - stat = Set_Printer('ADDTABLE',colFmt,'',colData,LTGREY$,'',1,TB_ALL) - END - -RETURN - - diff --git a/LSL2/STPROCINS/MATERIAL_REPORT_EQUATES.txt b/LSL2/STPROCINS/MATERIAL_REPORT_EQUATES.txt new file mode 100644 index 0000000..719eeee --- /dev/null +++ b/LSL2/STPROCINS/MATERIAL_REPORT_EQUATES.txt @@ -0,0 +1,28 @@ +compile insert MATERIAL_REPORT_EQUATES +/*---------------------------------------- + Author : Table Create Insert Routine + Written : 23/01/2025 + Description : Insert for Table MATERIAL_REPORT +----------------------------------------*/ +#ifndef __MATERIAL_REPORT_EQUATES__ +#define __MATERIAL_REPORT_EQUATES__ + + equ MATERIAL_REPORT.REACT_NO$ to 1 + equ MATERIAL_REPORT.REACT_TYPE$ to 2 + equ MATERIAL_REPORT.WO_NO$ to 3 + equ MATERIAL_REPORT.PROD_ORD_NO$ to 4 + equ MATERIAL_REPORT.SUB_PART_NO$ to 5 + equ MATERIAL_REPORT.EPI_PART_NO$ to 6 + equ MATERIAL_REPORT.WO_QTY$ to 7 + equ MATERIAL_REPORT.WO_RX_QTY$ to 8 + equ MATERIAL_REPORT.WO_UNREL_QTY$ to 9 + equ MATERIAL_REPORT.KIT_LOCATION$ to 10 + equ MATERIAL_REPORT.KIT_QTY$ to 11 + equ MATERIAL_REPORT.CASS_DELTA$ to 12 + equ MATERIAL_REPORT.KIT_RO$ to 13 + equ MATERIAL_REPORT.KIT_DEMAND$ to 14 + equ MATERIAL_REPORT.PTI_RO$ to 15 + equ MATERIAL_REPORT.LOAD_RO$ to 16 + equ MATERIAL_REPORT.COMMENTS$ to 17 + +#endif