Implemented ReceiveRelease_API.
Added OI Wizard Webview form to launch into OI Wizard from OI and auto-login the user. Added menu items to NDW_MAIN to launch the OI Wizard webview form and navigated to the appropriate page.
This commit is contained in:
File diff suppressed because it is too large
Load Diff
445
LSL2/OIWIN/WEB_OI_WIZARD.json
Normal file
445
LSL2/OIWIN/WEB_OI_WIZARD.json
Normal file
@ -0,0 +1,445 @@
|
|||||||
|
{
|
||||||
|
"header": {
|
||||||
|
"version": 1,
|
||||||
|
"type": "record"
|
||||||
|
},
|
||||||
|
"body": {
|
||||||
|
"record1": {
|
||||||
|
"<1>": "1010",
|
||||||
|
"<2>": "1",
|
||||||
|
"<3>": ""
|
||||||
|
},
|
||||||
|
"record2": {
|
||||||
|
"<1>": {
|
||||||
|
"<1,1>": "WEB_OI_WIZARD",
|
||||||
|
"<1,2>": "",
|
||||||
|
"<1,3>": "WINDOW",
|
||||||
|
"<1,4>": "",
|
||||||
|
"<1,5>": "0",
|
||||||
|
"<1,6>": "0",
|
||||||
|
"<1,7>": "-2083",
|
||||||
|
"<1,8>": "-1097",
|
||||||
|
"<1,9>": "OI Wizard",
|
||||||
|
"<1,10>": {
|
||||||
|
"<1,10,1>": "0x84CF0000",
|
||||||
|
"<1,10,2>": "0x100"
|
||||||
|
},
|
||||||
|
"<1,11>": {
|
||||||
|
"<1,11,1>": "0x8000",
|
||||||
|
"<1,11,2>": "0x80000000"
|
||||||
|
},
|
||||||
|
"<1,12>": "",
|
||||||
|
"<1,13>": {
|
||||||
|
"<1,13,1>": "-2",
|
||||||
|
"<1,13,2>": "-2",
|
||||||
|
"<1,13,3>": ""
|
||||||
|
},
|
||||||
|
"<1,14>": "",
|
||||||
|
"<1,15>": "",
|
||||||
|
"<1,16>": "",
|
||||||
|
"<1,17>": "",
|
||||||
|
"<1,18>": {
|
||||||
|
"<1,18,1>": {
|
||||||
|
"<1,18,1,1>": "X",
|
||||||
|
"<1,18,1,2>": "EXECUTE",
|
||||||
|
"<1,18,1,3>": "@WINDOW_EVENTS",
|
||||||
|
"<1,18,1,4>": {
|
||||||
|
"<1,18,1,4,1>": "@SELF",
|
||||||
|
"<1,18,1,4,2>": "@EVENT",
|
||||||
|
"<1,18,1,4,3>": "@PARAM1",
|
||||||
|
"<1,18,1,4,4>": "@PARAM2",
|
||||||
|
"<1,18,1,4,5>": "@PARAM3",
|
||||||
|
"<1,18,1,4,6>": "@PARAM4",
|
||||||
|
"<1,18,1,4,7>": "@PARAM5",
|
||||||
|
"<1,18,1,4,8>": "@PARAM6"
|
||||||
|
},
|
||||||
|
"<1,18,1,5>": "",
|
||||||
|
"<1,18,1,6>": "",
|
||||||
|
"<1,18,1,7>": "",
|
||||||
|
"<1,18,1,8>": "",
|
||||||
|
"<1,18,1,9>": "",
|
||||||
|
"<1,18,1,10>": "",
|
||||||
|
"<1,18,1,11>": "",
|
||||||
|
"<1,18,1,12>": "",
|
||||||
|
"<1,18,1,13>": "",
|
||||||
|
"<1,18,1,14>": "",
|
||||||
|
"<1,18,1,15>": "COMMEVT",
|
||||||
|
"<1,18,1,16>": "0"
|
||||||
|
},
|
||||||
|
"<1,18,2>": {
|
||||||
|
"<1,18,2,1>": "X",
|
||||||
|
"<1,18,2,2>": "EXECUTE",
|
||||||
|
"<1,18,2,3>": "@WINDOW_EVENTS",
|
||||||
|
"<1,18,2,4>": {
|
||||||
|
"<1,18,2,4,1>": "@SELF",
|
||||||
|
"<1,18,2,4,2>": "@EVENT",
|
||||||
|
"<1,18,2,4,3>": "@PARAM1",
|
||||||
|
"<1,18,2,4,4>": "@PARAM2",
|
||||||
|
"<1,18,2,4,5>": "@PARAM3",
|
||||||
|
"<1,18,2,4,6>": "@PARAM4",
|
||||||
|
"<1,18,2,4,7>": "@PARAM5",
|
||||||
|
"<1,18,2,4,8>": "@PARAM6"
|
||||||
|
},
|
||||||
|
"<1,18,2,5>": "",
|
||||||
|
"<1,18,2,6>": "",
|
||||||
|
"<1,18,2,7>": "",
|
||||||
|
"<1,18,2,8>": "",
|
||||||
|
"<1,18,2,9>": "",
|
||||||
|
"<1,18,2,10>": "",
|
||||||
|
"<1,18,2,11>": "",
|
||||||
|
"<1,18,2,12>": "",
|
||||||
|
"<1,18,2,13>": "",
|
||||||
|
"<1,18,2,14>": "",
|
||||||
|
"<1,18,2,15>": "COMMEVT",
|
||||||
|
"<1,18,2,16>": "0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"<1,19>": {
|
||||||
|
"<1,19,1>": "CREATE",
|
||||||
|
"<1,19,2>": "TIMER"
|
||||||
|
},
|
||||||
|
"<1,20>": "",
|
||||||
|
"<1,21>": "",
|
||||||
|
"<1,22>": "",
|
||||||
|
"<1,23>": "",
|
||||||
|
"<1,24>": {
|
||||||
|
"<1,24,1>": "",
|
||||||
|
"<1,24,2>": "0",
|
||||||
|
"<1,24,3>": "0",
|
||||||
|
"<1,24,4>": "0",
|
||||||
|
"<1,24,5>": "",
|
||||||
|
"<1,24,6>": "0",
|
||||||
|
"<1,24,7>": "",
|
||||||
|
"<1,24,8>": "",
|
||||||
|
"<1,24,9>": "",
|
||||||
|
"<1,24,10>": "0",
|
||||||
|
"<1,24,11>": "0",
|
||||||
|
"<1,24,12>": "0",
|
||||||
|
"<1,24,13>": "0",
|
||||||
|
"<1,24,14>": "0",
|
||||||
|
"<1,24,15>": "0",
|
||||||
|
"<1,24,16>": "0",
|
||||||
|
"<1,24,17>": "0"
|
||||||
|
},
|
||||||
|
"<1,25>": "",
|
||||||
|
"<1,26>": "",
|
||||||
|
"<1,27>": "",
|
||||||
|
"<1,28>": "",
|
||||||
|
"<1,29>": "",
|
||||||
|
"<1,30>": "",
|
||||||
|
"<1,31>": "",
|
||||||
|
"<1,32>": "",
|
||||||
|
"<1,33>": "",
|
||||||
|
"<1,34>": "LSL2*IMAGE*ICO*INFINEON",
|
||||||
|
"<1,35>": "",
|
||||||
|
"<1,36>": "",
|
||||||
|
"<1,37>": {
|
||||||
|
"<1,37,1>": "0X10001",
|
||||||
|
"<1,37,2>": "0X10001"
|
||||||
|
},
|
||||||
|
"<1,38>": "",
|
||||||
|
"<1,39>": "",
|
||||||
|
"<1,40>": "",
|
||||||
|
"<1,41>": "",
|
||||||
|
"<1,42>": "",
|
||||||
|
"<1,43>": "",
|
||||||
|
"<1,44>": "",
|
||||||
|
"<1,45>": "",
|
||||||
|
"<1,46>": "",
|
||||||
|
"<1,47>": "",
|
||||||
|
"<1,48>": "",
|
||||||
|
"<1,49>": "",
|
||||||
|
"<1,50>": "",
|
||||||
|
"<1,51>": "",
|
||||||
|
"<1,52>": "",
|
||||||
|
"<1,53>": "",
|
||||||
|
"<1,54>": "",
|
||||||
|
"<1,55>": "",
|
||||||
|
"<1,56>": "",
|
||||||
|
"<1,57>": "",
|
||||||
|
"<1,58>": "",
|
||||||
|
"<1,59>": "",
|
||||||
|
"<1,60>": "",
|
||||||
|
"<1,61>": "",
|
||||||
|
"<1,62>": {
|
||||||
|
"<1,62,1>": "0",
|
||||||
|
"<1,62,2>": "",
|
||||||
|
"<1,62,3>": "",
|
||||||
|
"<1,62,4>": "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": {
|
||||||
|
"<1>": {
|
||||||
|
"<1,1>": "WEBVIEW_MAIN",
|
||||||
|
"<1,2>": "",
|
||||||
|
"<1,3>": "WEBVIEW",
|
||||||
|
"<1,4>": "WEB_OI_WIZARD",
|
||||||
|
"<1,5>": "14",
|
||||||
|
"<1,6>": "",
|
||||||
|
"<1,7>": "-2069",
|
||||||
|
"<1,8>": "-1097",
|
||||||
|
"<1,9>": "",
|
||||||
|
"<1,10>": {
|
||||||
|
"<1,10,1>": "0x56000000",
|
||||||
|
"<1,10,2>": "0x0"
|
||||||
|
},
|
||||||
|
"<1,11>": {
|
||||||
|
"<1,11,1>": "0xC004",
|
||||||
|
"<1,11,2>": "0x80000000"
|
||||||
|
},
|
||||||
|
"<1,12>": "1",
|
||||||
|
"<1,13>": {
|
||||||
|
"<1,13,1>": "-2",
|
||||||
|
"<1,13,2>": "-2",
|
||||||
|
"<1,13,3>": ""
|
||||||
|
},
|
||||||
|
"<1,14>": "",
|
||||||
|
"<1,15>": "",
|
||||||
|
"<1,16>": "",
|
||||||
|
"<1,17>": "",
|
||||||
|
"<1,18>": {
|
||||||
|
"<1,18,1>": {
|
||||||
|
"<1,18,1,1>": "X",
|
||||||
|
"<1,18,1,2>": "EXECUTE",
|
||||||
|
"<1,18,1,3>": "@WINDOW_EVENTS",
|
||||||
|
"<1,18,1,4>": {
|
||||||
|
"<1,18,1,4,1>": "@SELF",
|
||||||
|
"<1,18,1,4,2>": "@EVENT",
|
||||||
|
"<1,18,1,4,3>": "@PARAM1",
|
||||||
|
"<1,18,1,4,4>": "@PARAM2",
|
||||||
|
"<1,18,1,4,5>": "@PARAM3",
|
||||||
|
"<1,18,1,4,6>": "@PARAM4",
|
||||||
|
"<1,18,1,4,7>": "@PARAM5",
|
||||||
|
"<1,18,1,4,8>": "@PARAM6"
|
||||||
|
},
|
||||||
|
"<1,18,1,5>": "",
|
||||||
|
"<1,18,1,6>": "",
|
||||||
|
"<1,18,1,7>": "",
|
||||||
|
"<1,18,1,8>": "",
|
||||||
|
"<1,18,1,9>": "",
|
||||||
|
"<1,18,1,10>": "",
|
||||||
|
"<1,18,1,11>": "",
|
||||||
|
"<1,18,1,12>": "",
|
||||||
|
"<1,18,1,13>": "",
|
||||||
|
"<1,18,1,14>": "",
|
||||||
|
"<1,18,1,15>": "COMMEVT",
|
||||||
|
"<1,18,1,16>": "0"
|
||||||
|
},
|
||||||
|
"<1,18,2>": {
|
||||||
|
"<1,18,2,1>": "X",
|
||||||
|
"<1,18,2,2>": "EXECUTE",
|
||||||
|
"<1,18,2,3>": "@WINDOW_EVENTS",
|
||||||
|
"<1,18,2,4>": {
|
||||||
|
"<1,18,2,4,1>": "@SELF",
|
||||||
|
"<1,18,2,4,2>": "@EVENT",
|
||||||
|
"<1,18,2,4,3>": "@PARAM1",
|
||||||
|
"<1,18,2,4,4>": "@PARAM2",
|
||||||
|
"<1,18,2,4,5>": "@PARAM3",
|
||||||
|
"<1,18,2,4,6>": "@PARAM4",
|
||||||
|
"<1,18,2,4,7>": "@PARAM5",
|
||||||
|
"<1,18,2,4,8>": "@PARAM6"
|
||||||
|
},
|
||||||
|
"<1,18,2,5>": "",
|
||||||
|
"<1,18,2,6>": "",
|
||||||
|
"<1,18,2,7>": "",
|
||||||
|
"<1,18,2,8>": "",
|
||||||
|
"<1,18,2,9>": "",
|
||||||
|
"<1,18,2,10>": "",
|
||||||
|
"<1,18,2,11>": "",
|
||||||
|
"<1,18,2,12>": "",
|
||||||
|
"<1,18,2,13>": "",
|
||||||
|
"<1,18,2,14>": "",
|
||||||
|
"<1,18,2,15>": "COMMEVT",
|
||||||
|
"<1,18,2,16>": "0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"<1,19>": {
|
||||||
|
"<1,19,1>": "WEBVIEWCREATED",
|
||||||
|
"<1,19,2>": "WEBNAVIGATED"
|
||||||
|
},
|
||||||
|
"<1,20>": "",
|
||||||
|
"<1,21>": "",
|
||||||
|
"<1,22>": "",
|
||||||
|
"<1,23>": "",
|
||||||
|
"<1,24>": "",
|
||||||
|
"<1,25>": "",
|
||||||
|
"<1,26>": "",
|
||||||
|
"<1,27>": "",
|
||||||
|
"<1,28>": "",
|
||||||
|
"<1,29>": "",
|
||||||
|
"<1,30>": "",
|
||||||
|
"<1,31>": "",
|
||||||
|
"<1,32>": "",
|
||||||
|
"<1,33>": "",
|
||||||
|
"<1,34>": "",
|
||||||
|
"<1,35>": "",
|
||||||
|
"<1,36>": "",
|
||||||
|
"<1,37>": "",
|
||||||
|
"<1,38>": "",
|
||||||
|
"<1,39>": "",
|
||||||
|
"<1,40>": "",
|
||||||
|
"<1,41>": "",
|
||||||
|
"<1,42>": "",
|
||||||
|
"<1,43>": "",
|
||||||
|
"<1,44>": "",
|
||||||
|
"<1,45>": "",
|
||||||
|
"<1,46>": "",
|
||||||
|
"<1,47>": "",
|
||||||
|
"<1,48>": "",
|
||||||
|
"<1,49>": "",
|
||||||
|
"<1,50>": "",
|
||||||
|
"<1,51>": "",
|
||||||
|
"<1,52>": "",
|
||||||
|
"<1,53>": "",
|
||||||
|
"<1,54>": "",
|
||||||
|
"<1,55>": "",
|
||||||
|
"<1,56>": "",
|
||||||
|
"<1,57>": "",
|
||||||
|
"<1,58>": {
|
||||||
|
"<1,58,1>": "1",
|
||||||
|
"<1,58,2>": "1",
|
||||||
|
"<1,58,3>": "1",
|
||||||
|
"<1,58,4>": "1",
|
||||||
|
"<1,58,5>": "1",
|
||||||
|
"<1,58,6>": "0",
|
||||||
|
"<1,58,7>": "1",
|
||||||
|
"<1,58,8>": "1",
|
||||||
|
"<1,58,9>": "1",
|
||||||
|
"<1,58,10>": "1",
|
||||||
|
"<1,58,11>": "1",
|
||||||
|
"<1,58,12>": "1",
|
||||||
|
"<1,58,13>": "1"
|
||||||
|
},
|
||||||
|
"<1,59>": "",
|
||||||
|
"<1,60>": "",
|
||||||
|
"<1,61>": "",
|
||||||
|
"<1,62>": "",
|
||||||
|
"<1,63>": "",
|
||||||
|
"<1,64>": "",
|
||||||
|
"<1,65>": "",
|
||||||
|
"<1,66>": "",
|
||||||
|
"<1,67>": "",
|
||||||
|
"<1,68>": "",
|
||||||
|
"<1,69>": "",
|
||||||
|
"<1,70>": "",
|
||||||
|
"<1,71>": "",
|
||||||
|
"<1,72>": "",
|
||||||
|
"<1,73>": "",
|
||||||
|
"<1,74>": "",
|
||||||
|
"<1,75>": "",
|
||||||
|
"<1,76>": "",
|
||||||
|
"<1,77>": "",
|
||||||
|
"<1,78>": "",
|
||||||
|
"<1,79>": "",
|
||||||
|
"<1,80>": "",
|
||||||
|
"<1,81>": "",
|
||||||
|
"<1,82>": "",
|
||||||
|
"<1,83>": "",
|
||||||
|
"<1,84>": "",
|
||||||
|
"<1,85>": "",
|
||||||
|
"<1,86>": "",
|
||||||
|
"<1,87>": "",
|
||||||
|
"<1,88>": "",
|
||||||
|
"<1,89>": "",
|
||||||
|
"<1,90>": "",
|
||||||
|
"<1,91>": "",
|
||||||
|
"<1,92>": "",
|
||||||
|
"<1,93>": "",
|
||||||
|
"<1,94>": {
|
||||||
|
"<1,94,1>": "",
|
||||||
|
"<1,94,2>": "",
|
||||||
|
"<1,94,3>": "",
|
||||||
|
"<1,94,4>": "0",
|
||||||
|
"<1,94,5>": "",
|
||||||
|
"<1,94,6>": "",
|
||||||
|
"<1,94,7>": "0",
|
||||||
|
"<1,94,8>": "",
|
||||||
|
"<1,94,9>": "0",
|
||||||
|
"<1,94,10>": "0"
|
||||||
|
},
|
||||||
|
"<1,95>": {
|
||||||
|
"<1,95,1>": "0",
|
||||||
|
"<1,95,2>": "0",
|
||||||
|
"<1,95,3>": "0",
|
||||||
|
"<1,95,4>": "0",
|
||||||
|
"<1,95,5>": "0",
|
||||||
|
"<1,95,6>": "0",
|
||||||
|
"<1,95,7>": "0",
|
||||||
|
"<1,95,8>": "0",
|
||||||
|
"<1,95,9>": "0",
|
||||||
|
"<1,95,10>": "0",
|
||||||
|
"<1,95,11>": "0"
|
||||||
|
},
|
||||||
|
"<1,96>": "",
|
||||||
|
"<1,97>": "",
|
||||||
|
"<1,98>": "",
|
||||||
|
"<1,99>": "",
|
||||||
|
"<1,100>": "",
|
||||||
|
"<1,101>": "",
|
||||||
|
"<1,102>": "",
|
||||||
|
"<1,103>": "",
|
||||||
|
"<1,104>": "",
|
||||||
|
"<1,105>": "",
|
||||||
|
"<1,106>": "",
|
||||||
|
"<1,107>": "",
|
||||||
|
"<1,108>": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"record4": {
|
||||||
|
"<1>": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -27,17 +27,22 @@ $Insert SERVICE_SETUP
|
|||||||
$Insert APP_INSERTS
|
$Insert APP_INSERTS
|
||||||
$Insert REVDOTNETEQUATES
|
$Insert REVDOTNETEQUATES
|
||||||
|
|
||||||
Declare function Logging_Services, Environment_Services, Active_Directory_Services
|
Declare function Logging_Services, Environment_Services, Active_Directory_Services, Database_Services
|
||||||
Declare subroutine Set_Property.Net, Logging_Services, Set_Status, Database_Services
|
Declare function Error_Services, SRP_Array
|
||||||
|
Declare subroutine Set_Property.Net, Logging_Services, Set_Status, Database_Services, Error_Services
|
||||||
|
|
||||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\ActiveDirectory'
|
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\ActiveDirectory'
|
||||||
LogDate = Oconv(Date(), 'D4/')
|
LogDate = Oconv(Date(), 'D4/')
|
||||||
LogTime = Oconv(Time(), 'MTS')
|
LogTime = Oconv(Time(), 'MTS')
|
||||||
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
||||||
|
|
||||||
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ActiveDirectoryAuthLog.csv'
|
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ActiveDirectoryAuthenticationLog.csv'
|
||||||
Headers = 'Logging DTM' : @FM : 'Username' : @FM : 'Authenticated'
|
Headers = 'Logging DTM' : @FM : 'Username' : @FM : 'Authenticated'
|
||||||
objADAuthLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
|
objADAuthenticationLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
|
||||||
|
|
||||||
|
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ActiveDirectoryAuthorizationLog.csv'
|
||||||
|
Headers = 'Logging DTM' : @FM : 'Username' : @FM : 'Authorized'
|
||||||
|
objADAuthorizationLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
|
||||||
|
|
||||||
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ActiveDirectoryLog.csv'
|
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ActiveDirectoryLog.csv'
|
||||||
Headers = 'Logging DTM' : @FM : 'Operation' : @FM : 'Message'
|
Headers = 'Logging DTM' : @FM : 'Operation' : @FM : 'Message'
|
||||||
@ -83,12 +88,43 @@ Service AuthenticateUser(Username, Password, Domain)
|
|||||||
LogData<1> = LoggingDTM
|
LogData<1> = LoggingDTM
|
||||||
LogData<2> = Username
|
LogData<2> = Username
|
||||||
LogData<3> = Authenticated
|
LogData<3> = Authenticated
|
||||||
Logging_Services('AppendLog', objADAuthLog, LogData, @RM, @FM, False$)
|
Logging_Services('AppendLog', objADAuthenticationLog, LogData, @RM, @FM, False$)
|
||||||
Response = Authenticated
|
Response = Authenticated
|
||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
|
Service AuthorizeUser(Username, Domain)
|
||||||
|
|
||||||
|
ErrorMsg = ''
|
||||||
|
Authorized = False$
|
||||||
|
If ( (Username NE '') and (Domain NE '') ) then
|
||||||
|
AuthAdGroups = ''
|
||||||
|
LoginConfig = Database_Services('ReadDataRow', 'SYSENV', 'CFG_LOGIN*LSL2')
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
AuthAdGroups<-1> = LoginConfig<2>
|
||||||
|
AuthAdGroups<-1> = LoginConfig<3>
|
||||||
|
AuthAdGroups<-1> = LoginConfig<4>
|
||||||
|
UserAdGroups = Active_Directory_Services('GetADGroups', Username, Domain)
|
||||||
|
MemberOfAuthGroups = SRP_Array('Join', UserAdGroups, AuthAdGroups, 'AND', @FM)
|
||||||
|
Authorized = (MemberOfAuthGroups NE '')
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Error retrieving active directory authorization groups.'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Username and domain required.'
|
||||||
|
end
|
||||||
|
LogData = ''
|
||||||
|
LogData<1> = LoggingDTM
|
||||||
|
LogData<2> = Username
|
||||||
|
LogData<3> = Authorized
|
||||||
|
Logging_Services('AppendLog', objADAuthorizationLog, LogData, @RM, @FM, False$)
|
||||||
|
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||||
|
Response = Authorized
|
||||||
|
|
||||||
|
end service
|
||||||
|
|
||||||
|
|
||||||
Service GetADGroups(Username, Domain)
|
Service GetADGroups(Username, Domain)
|
||||||
|
|
||||||
ADGroups = ''
|
ADGroups = ''
|
||||||
@ -143,7 +179,6 @@ Service GetADGroups(Username, Domain)
|
|||||||
End Service
|
End Service
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Service GetComputerDomain()
|
Service GetComputerDomain()
|
||||||
|
|
||||||
Domain = ''
|
Domain = ''
|
||||||
@ -166,6 +201,7 @@ Service GetComputerDomain()
|
|||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
// GetADGroupsByString
|
// GetADGroupsByString
|
||||||
//
|
//
|
||||||
@ -303,8 +339,10 @@ Service GetADGroupsByString(SearchString, Domain=DOMAIN, SearchByDescription=DES
|
|||||||
end
|
end
|
||||||
|
|
||||||
Response = ADGroups
|
Response = ADGroups
|
||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
// GetADGroupMembersByGroupDescription
|
// GetADGroupMembersByGroupDescription
|
||||||
//
|
//
|
||||||
@ -319,6 +357,7 @@ end service
|
|||||||
// 9/26/2024 - [JRO] Initial Programmer.
|
// 9/26/2024 - [JRO] Initial Programmer.
|
||||||
//----------------------------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
Service GetADGroupMembersByGroupDescription(DescriptionName, Domain=DOMAIN)
|
Service GetADGroupMembersByGroupDescription(DescriptionName, Domain=DOMAIN)
|
||||||
|
|
||||||
Set_Status(0)
|
Set_Status(0)
|
||||||
ErrMessage = ''
|
ErrMessage = ''
|
||||||
GroupUsers = ''
|
GroupUsers = ''
|
||||||
@ -397,8 +436,10 @@ Service GetADGroupMembersByGroupDescription(DescriptionName, Domain=DOMAIN)
|
|||||||
Error_Services('Add', ErrMessage)
|
Error_Services('Add', ErrMessage)
|
||||||
end
|
end
|
||||||
Response = GroupUsers
|
Response = GroupUsers
|
||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
// GetADGroupMembersByGroupName
|
// GetADGroupMembersByGroupName
|
||||||
//
|
//
|
||||||
@ -413,6 +454,7 @@ end service
|
|||||||
// 9/26/2024 - [JRO] Initial Programmer.
|
// 9/26/2024 - [JRO] Initial Programmer.
|
||||||
//----------------------------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
Service GetADGroupMembersByGroupName(GroupName, Domain=DOMAIN)
|
Service GetADGroupMembersByGroupName(GroupName, Domain=DOMAIN)
|
||||||
|
|
||||||
Set_Status(0)
|
Set_Status(0)
|
||||||
Users = ''
|
Users = ''
|
||||||
ErrMessage = ''
|
ErrMessage = ''
|
||||||
@ -501,8 +543,10 @@ Service GetADGroupMembersByGroupName(GroupName, Domain=DOMAIN)
|
|||||||
Error_Services('Add', ErrMessage)
|
Error_Services('Add', ErrMessage)
|
||||||
end
|
end
|
||||||
Response = Users
|
Response = Users
|
||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
// GetADUserAttributes
|
// GetADUserAttributes
|
||||||
//
|
//
|
||||||
@ -513,6 +557,7 @@ end service
|
|||||||
// First value is the AD User Name, Second value is the Display Name, and third value is the email.
|
// First value is the AD User Name, Second value is the Display Name, and third value is the email.
|
||||||
//----------------------------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
Service GetADUserAttributes(Username, Domain=DOMAIN)
|
Service GetADUserAttributes(Username, Domain=DOMAIN)
|
||||||
|
|
||||||
Set_Status(0)
|
Set_Status(0)
|
||||||
ThisUser = ''
|
ThisUser = ''
|
||||||
ErrMessage = ''
|
ErrMessage = ''
|
||||||
@ -593,5 +638,6 @@ Service GetADUserAttributes(Username, Domain=DOMAIN)
|
|||||||
Error_Services('Add', ErrMessage)
|
Error_Services('Add', ErrMessage)
|
||||||
end
|
end
|
||||||
Response = ThisUser
|
Response = ThisUser
|
||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
@ -220,10 +220,17 @@ Service GetWeekNum(InputDate)
|
|||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
Service ConvertDateTimeToISO8601(DatetimeToConv)
|
Service ConvertDateTimeToISO8601(DatetimeToConv)
|
||||||
|
|
||||||
|
Response = OConv(DatetimeToConv, "[SRP_DATETIME,()YYYY-MM-DD'T'hh:mm:ss.000Z]")
|
||||||
|
|
||||||
Response = OConv(DatetimeToConv, "[SRP_DATETIME,()YYYY-MM-DD hh:mm:ss.000Z]")
|
end service
|
||||||
swap ' ' with 'T' in Response
|
|
||||||
|
|
||||||
|
Service ConvertISO8601ToDateTime(ISO8601Dtm)
|
||||||
|
|
||||||
|
Response = IConv(ISO8601Dtm, "[SRP_DATETIME,()YYYY-MM-DD'T'hh:mm:ss.000Z]")
|
||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
@ -233,3 +240,4 @@ end service
|
|||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -111,7 +111,6 @@ API Lock.HEAD
|
|||||||
|
|
||||||
|
|
||||||
API Lock.POST
|
API Lock.POST
|
||||||
|
|
||||||
OIWizardID = ''
|
OIWizardID = ''
|
||||||
Cookies = HTTP_Services('GetHTTPCookie')
|
Cookies = HTTP_Services('GetHTTPCookie')
|
||||||
For each Cookie in Cookies using ';'
|
For each Cookie in Cookies using ';'
|
||||||
|
@ -117,11 +117,24 @@ API oiwizard.POST
|
|||||||
ParseResponse = SRP_JSON(hWizardJSON, 'PARSE', WizardJSON)
|
ParseResponse = SRP_JSON(hWizardJSON, 'PARSE', WizardJSON)
|
||||||
If (ParseResponse EQ '') then
|
If (ParseResponse EQ '') then
|
||||||
// Validate credentials and create a new session
|
// Validate credentials and create a new session
|
||||||
UserID = SRP_JSON(hWizardJSON, 'GetValue', 'userID')
|
UserID = SRP_JSON(hWizardJSON, 'GetValue', 'userID')
|
||||||
Password = SRP_JSON(hWizardJSON, 'GetValue', 'password')
|
Password = SRP_JSON(hWizardJSON, 'GetValue', 'password')
|
||||||
|
ADUsername = SRP_JSON(hWizardJSON, 'GetValue', 'adUsername')
|
||||||
SRP_JSON(hWizardJSON, 'Release')
|
SRP_JSON(hWizardJSON, 'Release')
|
||||||
Authenticated = Active_Directory_Services('AuthenticateUser', UserID, Password, 'Infineon')
|
Domain = 'Infineon'
|
||||||
If Authenticated then
|
Begin Case
|
||||||
|
Case ( (UserID NE '') and (Password NE '') )
|
||||||
|
Authenticated = Active_Directory_Services('AuthenticateUser', UserID, Password, Domain)
|
||||||
|
Authorized = Active_Directory_Services('AuthorizeUser', UserID, Domain)
|
||||||
|
Case (ADUsername NE '')
|
||||||
|
Authenticated = True$
|
||||||
|
Authorized = Active_Directory_Services('AuthorizeUser', ADUsername, Domain)
|
||||||
|
If Authorized then UserId = ADUsername
|
||||||
|
Case Otherwise$
|
||||||
|
Authenticated = False$
|
||||||
|
Authorized = False$
|
||||||
|
End Case
|
||||||
|
If Authenticated and Authorized then
|
||||||
LSLUserID = Security_Services('GetLSLUser', UserID)
|
LSLUserID = Security_Services('GetLSLUser', UserID)
|
||||||
If LSLUserID NE '' then
|
If LSLUserID NE '' then
|
||||||
OIWizardID = OI_Wizard_Services('CreateWizardID', LSLUserID)
|
OIWizardID = OI_Wizard_Services('CreateWizardID', LSLUserID)
|
||||||
@ -235,3 +248,4 @@ API oiwizard.checkidleoisessionvalid.GET
|
|||||||
end
|
end
|
||||||
|
|
||||||
end api
|
end api
|
||||||
|
|
||||||
|
@ -99,6 +99,13 @@ API rds.ID.PUT
|
|||||||
end api
|
end api
|
||||||
|
|
||||||
|
|
||||||
|
API rds.ID.zpl.HEAD
|
||||||
|
API rds.ID.zpl.GET
|
||||||
|
|
||||||
|
GoSub CreateZPLItem
|
||||||
|
|
||||||
|
end api
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Internal GoSubs
|
// Internal GoSubs
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
@ -128,3 +135,29 @@ CreateHALItem:
|
|||||||
end
|
end
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
// CreateZPLItem
|
||||||
|
//
|
||||||
|
// Creates a HAL+JSON object with the ZPL for the given WM_IN row
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
CreateZPLItem:
|
||||||
|
|
||||||
|
RdsKey = ParentSegment
|
||||||
|
ZPL = Rds_Services('GetRdsZpl', RdsKey)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
StatusCode = 200
|
||||||
|
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||||
|
HTTP_Services('SetResponseBody', ZPL, False$, 'text/plain')
|
||||||
|
If Assigned(Message) then
|
||||||
|
HTTP_Services('SetResponseStatus', StatusCode, Message)
|
||||||
|
end else
|
||||||
|
HTTP_Services('SetResponseStatus', StatusCode)
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Message = Error_Services('GetMessage')
|
||||||
|
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
|
||||||
|
end
|
||||||
|
|
||||||
|
return
|
||||||
|
@ -52,12 +52,10 @@ Function RDS_Services(@Service, @Params)
|
|||||||
***********************************************************************************************************************/
|
***********************************************************************************************************************/
|
||||||
#pragma precomp SRP_PreCompiler
|
#pragma precomp SRP_PreCompiler
|
||||||
|
|
||||||
|
$Insert SERVICE_SETUP
|
||||||
$Insert APP_INSERTS
|
$Insert APP_INSERTS
|
||||||
$Insert MSG_EQUATES
|
$Insert MSG_EQUATES
|
||||||
$Insert RTI_DEBUG_COMMON
|
$Insert RTI_DEBUG_COMMON
|
||||||
$Insert SRPMail_Inserts
|
|
||||||
$Insert LOGICAL
|
|
||||||
$Insert SERVICE_SETUP
|
|
||||||
$Insert RDS_EQUATES
|
$Insert RDS_EQUATES
|
||||||
$Insert PROD_SPEC_EQUATES
|
$Insert PROD_SPEC_EQUATES
|
||||||
$Insert RDS_LAYER_EQUATES
|
$Insert RDS_LAYER_EQUATES
|
||||||
@ -85,6 +83,11 @@ $Insert DICT_EQUATES
|
|||||||
$Insert COMPANY_EQUATES
|
$Insert COMPANY_EQUATES
|
||||||
$Insert RETURN_TO_FAB_LOTS_EQUATES
|
$Insert RETURN_TO_FAB_LOTS_EQUATES
|
||||||
$Insert TEST_RUN_EQUATES
|
$Insert TEST_RUN_EQUATES
|
||||||
|
$Insert RDS_LAYER_INFO_EQU
|
||||||
|
$Insert EPI_PART_EQUATES
|
||||||
|
$Insert CUST_EPI_PART_EQUATES
|
||||||
|
$Insert UNIT_EQUATES
|
||||||
|
$Insert QUOTE_SPEC_EQU
|
||||||
|
|
||||||
EQU COL$LSID TO 1
|
EQU COL$LSID TO 1
|
||||||
EQU COL$RECIPE TO 2
|
EQU COL$RECIPE TO 2
|
||||||
@ -108,6 +111,20 @@ EQU COL$MET_TWSIG TO 19
|
|||||||
EQU COL$MET_TWSIG_Z1 TO 20
|
EQU COL$MET_TWSIG_Z1 TO 20
|
||||||
EQU COL$MET_TWSIG_Z2 TO 21
|
EQU COL$MET_TWSIG_Z2 TO 21
|
||||||
|
|
||||||
|
EQU PI$LEFT TO 1
|
||||||
|
EQU PI$TOP TO 2
|
||||||
|
EQU PI$RIGHT TO 3
|
||||||
|
EQU PI$BOTTOM TO 4
|
||||||
|
EQU PI$WIDTH TO 5
|
||||||
|
EQU PI$HEIGHT TO 6
|
||||||
|
EQU PI$SIZE TO 7
|
||||||
|
|
||||||
|
EQU PS$TOOL TO 1
|
||||||
|
EQU PS$TYPE TO 2
|
||||||
|
EQU PS$RECIPE TO 3
|
||||||
|
EQU PS$FREQ TO 4
|
||||||
|
EQU PS$PATTERN TO 11
|
||||||
|
|
||||||
EQU COMMA$ to ','
|
EQU COMMA$ to ','
|
||||||
|
|
||||||
EQU NEW_EXIST$ To 0 ; * Reduce Mode 0
|
EQU NEW_EXIST$ To 0 ; * Reduce Mode 0
|
||||||
@ -119,13 +136,14 @@ AutoDisplayErrors = FALSE$ ; // Set this to True$ when debugging so all erro
|
|||||||
Declare subroutine SRP_Stopwatch, Error_Services, obj_Tables, Metrology_Services, obj_RDS_Test, SRP_JSON, Logging_Services
|
Declare subroutine SRP_Stopwatch, Error_Services, obj_Tables, Metrology_Services, obj_RDS_Test, SRP_JSON, Logging_Services
|
||||||
Declare subroutine RTI_Set_Debugger, Database_Services, Btree.Extract, Extract_SI_Keys, Obj_WO_Mat, Obj_WO_Mat_Log
|
Declare subroutine RTI_Set_Debugger, Database_Services, Btree.Extract, Extract_SI_Keys, Obj_WO_Mat, Obj_WO_Mat_Log
|
||||||
Declare subroutine Dialog_Box, Obj_Notes, RList, Set_Status, Errmsg, Obj_React_Status, Reactor_Services
|
Declare subroutine Dialog_Box, Obj_Notes, RList, Set_Status, Errmsg, Obj_React_Status, Reactor_Services
|
||||||
Declare subroutine Rds_Services, Obj_Post_Log, Mona_Services, Transaction_Services, Reduce
|
Declare subroutine Rds_Services, Obj_Post_Log, Mona_Services, Transaction_Services, Reduce, Update_Index
|
||||||
Declare function SRP_Sort_Array, Metrology_Services, obj_RDS_Test, obj_Test_Point_Map, Database_Services
|
Declare function SRP_Sort_Array, Metrology_Services, obj_RDS_Test, obj_Test_Point_Map, Database_Services
|
||||||
Declare function Work_Order_Services, SRP_JSON, Logging_Services, Environment_Services, SRP_Trim, Error_Services
|
Declare function Work_Order_Services, SRP_JSON, Logging_Services, Environment_Services, SRP_Trim, Error_Services
|
||||||
Declare function Memberof, Obj_WO_Mat, Obj_WO_Mat_Log, SRP_Array, DateTime, Dialog_Box, obj_Prod_Spec
|
Declare function Memberof, Obj_WO_Mat, Obj_WO_Mat_Log, SRP_Array, DateTime, Dialog_Box, obj_Prod_Spec
|
||||||
Declare function RDS_Services, RTI_DistinctList, GetTickCount, Clean_Insp_Services, WO_Mat_QA_Services
|
Declare function RDS_Services, RTI_DistinctList, GetTickCount, Clean_Insp_Services, WO_Mat_QA_Services
|
||||||
Declare function PSN_Services, Rds_Layer_Services, SRP_Rotate_Array, Qa_Services, SRP_Date, SRP_Time, SRP_Datetime
|
Declare function PSN_Services, Rds_Layer_Services, SRP_Rotate_Array, Qa_Services, SRP_Date, SRP_Time, SRP_Datetime
|
||||||
Declare function Reactor_Services, Signature_Services, obj_rds, Test_Run_Services, Return_To_Fab_Services
|
Declare function Reactor_Services, Signature_Services, obj_rds, Test_Run_Services, Return_To_Fab_Services
|
||||||
|
Declare function obj_Vendor_Code
|
||||||
|
|
||||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\RDS'
|
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\RDS'
|
||||||
LogDate = Oconv(Date(), 'D4/')
|
LogDate = Oconv(Date(), 'D4/')
|
||||||
@ -2559,6 +2577,797 @@ Service UnsignPreEpiSignature(RDSNo, UserId)
|
|||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
|
Service GetRdsZpl(RdsKey)
|
||||||
|
|
||||||
|
ZPL = ''
|
||||||
|
ErrorMsg = ''
|
||||||
|
If RdsKey NE '' then
|
||||||
|
If RowExists('RDS', RdsKey) then
|
||||||
|
Update_Index ("RDS", "WO", "")
|
||||||
|
UniqueWOs = ''
|
||||||
|
CustNos = ''
|
||||||
|
CompositeKeys = ''
|
||||||
|
WONo = XLATE('RDS',RdsKey,RDS_WO$,'X')
|
||||||
|
WOStepKey = Xlate('RDS', RdsKey, 'WO_STEP_KEY', 'X')
|
||||||
|
CustNo = XLATE('WO_LOG',WONo,WO_LOG_CUST_NO$,'X')
|
||||||
|
WOLogRec = XLATE('WO_LOG',WONo,'','X')
|
||||||
|
CassNo = XLATE('RDS',RdsKey,'CASS_NO','X')
|
||||||
|
WOMatRec = XLATE('WO_MAT',WONo:'*':CassNo,'','X')
|
||||||
|
ReShipCustNo = WOMatRec<WO_MAT_RESHIP_CUST_NO$>
|
||||||
|
ReShipDate = WOMatRec<WO_MAT_RESHIP_DT$>
|
||||||
|
ReShipCustEpiPartNo = WOMatRec<WO_MAT_RESHIP_CUST_EPI_PART_NO$>
|
||||||
|
ReShipCustPO = WOMatRec<WO_MAT_RESHIP_CUST_PO$>
|
||||||
|
ReShipCustPartNo = WOMatRec<WO_MAT_RESHIP_CUST_PART_NO$>
|
||||||
|
|
||||||
|
If ReShipCustNo EQ '' then
|
||||||
|
CustNo = WOLogRec<WO_LOG_CUST_NO$>
|
||||||
|
CustName = XLATE( 'RDS', RdsKey, 'ABBREV_OR_CO_NAME', 'X' )
|
||||||
|
CustName = XLATE( 'COMPANY', CustNo, 'ABBREV_OR_CO_NAME', 'X' )
|
||||||
|
end else
|
||||||
|
CustNo = ReShipCustNo
|
||||||
|
CompRec = XLATE('COMPANY',CustNo,'','X')
|
||||||
|
CustName = CompRec<COMPANY_ABBREV$>
|
||||||
|
end
|
||||||
|
|
||||||
|
If ReShipCustEpiPartNo EQ '' then
|
||||||
|
EpiPartNo = WOLogRec<WO_LOG_EPI_PART_NO$>
|
||||||
|
end else
|
||||||
|
EpiPartNo = ReShipCustEpiPartNo
|
||||||
|
end
|
||||||
|
|
||||||
|
EpiPartRec = XLATE('EPI_PART',EpiPartNo,'','X')
|
||||||
|
CustEpiPartRec = XLATE('CUST_EPI_PART',CustNo:'*':EpiPartNo,'','X')
|
||||||
|
CustEpiPartSpecNo = CustEpiPartRec<CUST_EPI_PART_SPEC_NO$>[-1,'B':@VM] ;* Last (current) Customer Spec Number
|
||||||
|
|
||||||
|
ShipBagReq = CustEpiPartRec<CUST_EPI_PART_SHIP_BAG_REQ$>
|
||||||
|
|
||||||
|
If ReShipDate EQ '' then
|
||||||
|
ReqShipDate = OCONV( XLATE( 'WO_LOG', WO, WO_LOG_PROMISE_SHIP_DT$, 'X' ), 'D2/' )
|
||||||
|
end else
|
||||||
|
ReqShipDate = ReShipDate
|
||||||
|
end
|
||||||
|
|
||||||
|
If ReShipCustPO EQ '' then
|
||||||
|
IF CustNo = '7108' THEN
|
||||||
|
PO = '' ;* Changed for "Foundry" customer additions 8/28/2012 JCH **********
|
||||||
|
END ELSE
|
||||||
|
PO = XLATE( 'RDS', RdsKey, rds_po$, 'X' )
|
||||||
|
END
|
||||||
|
end else
|
||||||
|
PO = ReShipCustPO
|
||||||
|
end
|
||||||
|
|
||||||
|
If ReShipCustPartNo EQ '' then
|
||||||
|
PartNum = XLATE( 'RDS', RdsKey, rds_part_num$, 'X' )
|
||||||
|
end else
|
||||||
|
PartNum = ReShipCustPartNo
|
||||||
|
end
|
||||||
|
|
||||||
|
ThickTarget = OCONV( XLATE( 'RDS', RdsKey, 'THICK_TARGET_ALL', 'X' ), 'MD3' )
|
||||||
|
ThickUnit = XLATE( 'RDS', RdsKey, 'THICK_UNITS_ALL', 'X' )
|
||||||
|
Dopant = XLATE( 'RDS', RdsKey, 'DOPANT_L1', 'X' )
|
||||||
|
ResTarget = OCONV( XLATE( 'RDS', RdsKey, 'RES_TARGET_ALL', 'X' ), 'MD3' )
|
||||||
|
ResUnit = XLATE( 'RDS', RdsKey, 'RES_UNITS_ALL', 'X' )
|
||||||
|
RecipeIDS = XLATE( 'RDS', RdsKey, 'RECIPE_NO', 'X' )
|
||||||
|
LotNum = XLATE( 'RDS', RdsKey, rds_lot_num$, 'X' )
|
||||||
|
RONum = XLATE( 'RDS', RdsKey, 'RUN_ORDER_NUM', 'X' )
|
||||||
|
PSNo = XLATE( 'RDS', RdsKey, rds_prod_spec_id$, 'X' )
|
||||||
|
SpecType = OCONV( XLATE( 'RDS', RdsKey, 'SPEC_TYPE', 'X' ), '[SPEC_TYPE_CONV]' )
|
||||||
|
SubPartNum = XLATE( 'RDS', RdsKey, 'SUB_PART_NUM', 'X' )
|
||||||
|
RecipeInfo = XLATE( 'RECIPE', RecipeIDS, 'RECIPE_NAME_NO', 'X' )
|
||||||
|
ThickVar = XLATE( 'PROD_SPEC', PSNo, 'THICK_MEASURE_L1', 'X' )
|
||||||
|
ResVar = XLATE( 'PROD_SPEC', PSNo, 'RES_MEASURE_L1', 'X' )
|
||||||
|
ConVar = XLATE( 'PROD_SPEC', PSNo, 'CON_MEASURE_L1', 'X' )
|
||||||
|
StressVar = XLATE( 'PROD_SPEC', PSNo, 'STRESS_MEASURE', 'X' )
|
||||||
|
TransVar = XLATE( 'PROD_SPEC', PSNo, 'TRANS_MEASURE', 'X' )
|
||||||
|
ReactTypes = OCONV( XLATE( 'PROD_SPEC', PSNo, 'REACTOR_TYPE', 'X' ), '[REACT_TYPE_CONV,CODE]')
|
||||||
|
SubOxide = OCONV(EpiPartRec<EPI_PART_SUB_OXIDE$>,'B')
|
||||||
|
|
||||||
|
SubPreCleans = ''
|
||||||
|
SubPostCleans = ''
|
||||||
|
PreAkrionRecipes = ''
|
||||||
|
PostAkrionRecipes = ''
|
||||||
|
|
||||||
|
SubPreCleans = XLATE('PRS_STAGE',PSNo:'*PRE','TOOL_DISPLAY','X')
|
||||||
|
SubPostCleans = XLATE('PRS_STAGE',PSNo:'*POST','TOOL_DISPLAY','X')
|
||||||
|
PreAkrionRecipes = XLATE('PRS_STAGE',PSNo:'*PRE',PRS_STAGE_CLEAN_RECIPE$,'X')
|
||||||
|
PostAkrionRecipes = XLATE('PRS_STAGE',PSNo:'*POST',PRS_STAGE_CLEAN_RECIPE$,'X')
|
||||||
|
|
||||||
|
SWAP 'AKRION' WITH 'Akr' IN SubPreCleans
|
||||||
|
SWAP 'AKRION' WITH 'Akr' IN SubPostCleans
|
||||||
|
|
||||||
|
SWAP ' or ' WITH '/' IN SubPreCleans
|
||||||
|
SWAP ' or ' WITH '/' IN SubPostCleans ;* To wide for field on small label "squeezed" data to fit JCH
|
||||||
|
|
||||||
|
SubPartNum = XLATE( 'RDS', RdsKey, 'SUB_PART_NUM', 'X' )
|
||||||
|
WOStepKeys = XLATE( 'RDS',RdsKey,RDS_WO_STEP_KEY$,'X' ) ;* 05/21/2005 - JCH - Added for Order Entry/Vision upgrade
|
||||||
|
|
||||||
|
IF CustNo = '7108' THEN
|
||||||
|
CustPNDescs = '' ;* 8/28/2012 - JCH Added for new "Foundry" customer ******************
|
||||||
|
END ELSE
|
||||||
|
CustPNDescs = XLATE('EPI_PART',EpiPartNo,EPI_PART_EPI_PART_DESC$,'X') ;* 12/2/2011 - JCH Added for SAP interface
|
||||||
|
END
|
||||||
|
|
||||||
|
************************************
|
||||||
|
PreSurfscan = XLATE( 'PRS_STAGE', PSNo:'*PRE' , PRS_STAGE_SURFSCAN_SIG_REQ$ , 'X' )
|
||||||
|
FirstSurfscan = XLATE( 'PRS_STAGE', PSNo:'*FWI' , PRS_STAGE_SURFSCAN_SIG_REQ$ , 'X' )
|
||||||
|
PostCleanSurfscan = XLATE( 'PRS_STAGE', PSNo:'*POST' , PRS_STAGE_SURFSCAN_SIG_REQ$ , 'X' )
|
||||||
|
|
||||||
|
CleaningReqs = ''
|
||||||
|
|
||||||
|
SRPFlag = XLATE( 'PROD_SPEC', PSNo, 'SRP_REQ', 'X' ) ;* Updated in PROD_SPEC dictionary JCH 4/21/2015
|
||||||
|
Qtys = XLATE( 'RDS', RdsKey, 'WAFERS_SCHEDULED', 'X' )
|
||||||
|
MultilayVar = XLATE( 'RDS', RdsKey, 'MULTI_LAYER', 'X' )
|
||||||
|
|
||||||
|
* Lets break out thick and res and see if it gets measured based on frequency
|
||||||
|
* Thickness
|
||||||
|
|
||||||
|
ThickPrintVar = ''
|
||||||
|
ResPrintVar = ''
|
||||||
|
SRPPrintVar = ''
|
||||||
|
SRPTypePrintVar = ''
|
||||||
|
|
||||||
|
ThisThickVar = ThickVar
|
||||||
|
ThisResVar = ResVar
|
||||||
|
ThisConVar = ConVar
|
||||||
|
ThisStressVar = StressVar
|
||||||
|
ThisTransVar = TransVar
|
||||||
|
ThisRunOrdNum = RONum
|
||||||
|
ThisWO = WONo
|
||||||
|
ThisWOStepKey = WOStepKey ;* 5/21/2005 - JCH - Added for Order Entry/Vision upgrade
|
||||||
|
MultiStep = 0
|
||||||
|
IF MultiStep > 0 THEN ThisWO = ThisWOStepKey[1,'*'] ;* 5/21/2005 - JCH - Added for Order Entry/Vision upgrade
|
||||||
|
|
||||||
|
ThickTool = field( ThisThickVar, '~', 1 )
|
||||||
|
ThickType = field( ThisThickVar, '~', 2 )
|
||||||
|
ThickRecipe = field( ThisThickVar, '~', 3 )
|
||||||
|
ThickFreq = field( ThisThickVar, '~', 4 )
|
||||||
|
ThickFirst = field( ThisThickVar, '~', 6 )
|
||||||
|
ThickLast = field( ThisThickVar, '~', 7 )
|
||||||
|
|
||||||
|
ResTool = field( ThisResVar, '~', 1 )
|
||||||
|
ResType = field( ThisResVar, '~', 2 )
|
||||||
|
ResRecipe = field( ThisResVar, '~', 3 )
|
||||||
|
ResFreq = field( ThisResVar, '~', 4 )
|
||||||
|
ResFirst = field( ThisResVar, '~', 6 )
|
||||||
|
ResLast = field( ThisResVar, '~', 7 )
|
||||||
|
|
||||||
|
ConTool = field( ThisConVar, '~', 1 )
|
||||||
|
ConType = field( ThisConVar, '~', 2 )
|
||||||
|
ConRecipe = field( ThisConVar, '~', 3 )
|
||||||
|
ConFreq = field( ThisConVar, '~', 4 )
|
||||||
|
ConFirst = field( ThisConVar, '~', 6 )
|
||||||
|
ConLast = field( ThisConVar, '~', 7 )
|
||||||
|
|
||||||
|
StressTool = field( ThisStressVar, '~', 1 )
|
||||||
|
StressType = field( ThisStressVar, '~', 2 )
|
||||||
|
StressRecipe = field( ThisStressVar, '~', 3 )
|
||||||
|
StressFreq = field( ThisStressVar, '~', 4 )
|
||||||
|
StressFirst = field( ThisStressVar, '~', 6 )
|
||||||
|
StressLast = field( ThisStressVar, '~', 7 )
|
||||||
|
|
||||||
|
TransTool = field( ThisTransVar, '~', 1 )
|
||||||
|
TransType = field( ThisTransVar, '~', 2 )
|
||||||
|
TransRecipe = field( ThisTransVar, '~', 3 )
|
||||||
|
TransFreq = field( ThisTransVar, '~', 4 )
|
||||||
|
TransFirst = field( ThisTransVar, '~', 6 )
|
||||||
|
TransLast = field( ThisTransVar, '~', 7 )
|
||||||
|
|
||||||
|
IF MultiStep > 0 THEN
|
||||||
|
WOBoxCnt = COUNT(XLATE('WO_STEP',ThisWOStepKey,6,'X'),@VM) ;* 5/21/2005 - JCH - Added for Order Entry/Vision upgrade
|
||||||
|
END ELSE
|
||||||
|
|
||||||
|
EXTRACT_SI_KEYS( 'RDS', 'WO', ThisWO, RDSsInWO ) ;* Original Code
|
||||||
|
|
||||||
|
WOBoxCnt = FIELDCOUNT( RDSsInWO, @VM ) ;* Original Code
|
||||||
|
END
|
||||||
|
|
||||||
|
* First check thickness
|
||||||
|
|
||||||
|
PrintThickness = false$
|
||||||
|
IF ( ThisRunOrdNum = 1 ) AND ( ThickFirst ) THEN PrintThickness = true$
|
||||||
|
IF ( ThisRunOrdNum = WOBoxCnt ) AND ( ThickLast ) THEN PrintThickness = true$
|
||||||
|
|
||||||
|
IF ThickFreq THEN
|
||||||
|
* Need to check run order and see if it needs to be printed
|
||||||
|
IF ThickFreq = 1 THEN
|
||||||
|
PrintThickness = true$
|
||||||
|
END ELSE
|
||||||
|
* Generate @FM delim of runs that should print
|
||||||
|
RoPrintFlag = str( @FM, WOBoxCnt-1 )
|
||||||
|
FOR J = 1 TO WOBoxCnt step ThickFreq
|
||||||
|
RoPrintFlag<J> = 1
|
||||||
|
NEXT J
|
||||||
|
IF ( RoPrintFlag<ThisRunOrdNum> = 1 ) THEN PrintThickness = true$
|
||||||
|
END
|
||||||
|
END
|
||||||
|
|
||||||
|
IF PrintThickness THEN
|
||||||
|
PSNRec = XLATE( 'PROD_SPEC', PSNo, '', 'X' )
|
||||||
|
SpecSub = PSNRec<prod_spec_spec_substrate$>
|
||||||
|
|
||||||
|
TOrient = SpecSub<1,QSSubOrientation$>
|
||||||
|
convert '<' TO '' in TOrient
|
||||||
|
convert '>' TO '' in TOrient
|
||||||
|
Orient = TOrient
|
||||||
|
|
||||||
|
ThickPrintVar = ThickTool:'~':ThickType:'~':Orient:'~':ThickRecipe
|
||||||
|
END ELSE
|
||||||
|
ThickPrintVar = ''
|
||||||
|
END
|
||||||
|
|
||||||
|
* Now check resistivity
|
||||||
|
|
||||||
|
PrintResistivity = false$
|
||||||
|
IF ( ThisRunOrdNum = 1 ) and ( ResFirst ) THEN PrintResistivity = true$
|
||||||
|
IF ( ThisRunOrdNum = WOBoxCnt ) and ( ResLast ) THEN PrintResistivity = true$
|
||||||
|
|
||||||
|
IF ResFreq THEN
|
||||||
|
* NEED TO CHECK RUN ORDER AND SEE IF IT NEEDS TO BE PRINTED
|
||||||
|
IF ResFreq = 1 THEN
|
||||||
|
PrintResistivity = true$
|
||||||
|
END ELSE
|
||||||
|
* Generate @FM delim of runs that should print
|
||||||
|
RoPrintFlag = str( @FM, WOBoxCnt-1 )
|
||||||
|
FOR J = 1 TO WOBoxCnt step ResFreq
|
||||||
|
RoPrintFlag<J> = 1
|
||||||
|
NEXT J
|
||||||
|
IF ( RoPrintFlag<ThisRunOrdNum> = 1 ) THEN PrintResistivity = true$
|
||||||
|
END
|
||||||
|
END
|
||||||
|
|
||||||
|
IF PrintResistivity THEN
|
||||||
|
PSNRec = XLATE( 'PROD_SPEC', PSNo, '', 'X' )
|
||||||
|
SpecSub = PSNRec<prod_spec_spec_substrate$> ;******* Moved to EPI_PART
|
||||||
|
|
||||||
|
TOrient = SpecSub<1,QSSubOrientation$>
|
||||||
|
convert '<' TO '' in TOrient
|
||||||
|
convert '>' TO '' in TOrient
|
||||||
|
Orient = TOrient
|
||||||
|
|
||||||
|
ResPrintVar = ResTool:'~':ResType:'~':Orient:'~':ResRecipe
|
||||||
|
END ELSE
|
||||||
|
ResPrintVar = ''
|
||||||
|
END
|
||||||
|
|
||||||
|
PrintSRP = false$
|
||||||
|
SRPType = ''
|
||||||
|
IF SRPFlag THEN
|
||||||
|
* We know that SRP is one of the tools
|
||||||
|
|
||||||
|
IF PrintThickness THEN
|
||||||
|
IF ThickTool = 'SRP' THEN
|
||||||
|
PrintSRP = true$
|
||||||
|
SRPType = ThickType
|
||||||
|
END
|
||||||
|
END
|
||||||
|
|
||||||
|
IF PrintResistivity THEN
|
||||||
|
IF ResTool = 'SRP' THEN
|
||||||
|
PrintSRP = true$
|
||||||
|
SRPType = ResType
|
||||||
|
END
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
|
IF NOT(PrintSRP) THEN
|
||||||
|
|
||||||
|
* Now need to check concentration
|
||||||
|
|
||||||
|
IF ConTool = 'SRP' THEN
|
||||||
|
IF ( ThisRunOrdNum = 1 ) and ( ConFirst ) THEN PrintSRP = true$
|
||||||
|
IF ( ThisRunOrdNum = WOBoxCnt ) and ( ConLast ) THEN PrintSRP = true$
|
||||||
|
|
||||||
|
IF ConFreq THEN
|
||||||
|
* Need to check run order and see if it needs to be printed
|
||||||
|
IF ConFreq = 1 THEN
|
||||||
|
PrintSRP = true$
|
||||||
|
END ELSE
|
||||||
|
* Generate fm delim of runs that should print
|
||||||
|
RoPrintFlag = str( @FM, WOBoxCnt-1 )
|
||||||
|
FOR J = 1 TO WOBoxCnt step ConFreq
|
||||||
|
RoPrintFlag<J> = 1
|
||||||
|
NEXT J
|
||||||
|
IF ( RoPrintFlag<ThisRunOrdNum> = 1 ) THEN PrintSRP = true$
|
||||||
|
END
|
||||||
|
END
|
||||||
|
END
|
||||||
|
IF PrintSRP THEN SRPType = ConType
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
|
IF NOT(PrintSRP) THEN
|
||||||
|
|
||||||
|
* Now need to check stress
|
||||||
|
|
||||||
|
IF StressTool = 'SRP' THEN
|
||||||
|
IF ( ThisRunOrdNum = 1 ) AND ( StressFirst ) THEN PrintSRP = true$
|
||||||
|
IF ( ThisRunOrdNum = WOBoxCnt ) AND ( StressLast ) THEN PrintSRP = true$
|
||||||
|
|
||||||
|
IF StressFreq THEN
|
||||||
|
* Need to check run order and see if it needs to be printed
|
||||||
|
IF StressFreq = 1 THEN
|
||||||
|
PrintSRP = true$
|
||||||
|
END ELSE
|
||||||
|
* Generate @FM delim of runs that should print
|
||||||
|
RoPrintFlag = str( @FM, WOBoxCnt-1 )
|
||||||
|
FOR J = 1 TO WOBoxCnt step StressFreq
|
||||||
|
RoPrintFlag<J> = 1
|
||||||
|
NEXT J
|
||||||
|
IF ( RoPrintFlag<ThisRunOrdNum> = 1 ) THEN PrintSRP = true$
|
||||||
|
END
|
||||||
|
END
|
||||||
|
END
|
||||||
|
IF PrintSRP THEN SRPType = StressType
|
||||||
|
END
|
||||||
|
|
||||||
|
IF NOT(PrintSRP) THEN
|
||||||
|
* Now need to check transition
|
||||||
|
IF TransTool = 'SRP' THEN
|
||||||
|
IF ( ThisRunOrdNum = 1 ) AND ( TransFirst ) THEN PrintSRP = true$
|
||||||
|
IF ( ThisRunOrdNum = WOBoxCnt ) AND ( TransLast ) THEN PrintSRP = true$
|
||||||
|
|
||||||
|
IF TransFreq THEN
|
||||||
|
* Need to check run order and see if it needs to be printed
|
||||||
|
IF TransFreq = 1 THEN
|
||||||
|
PrintSRP = true$
|
||||||
|
END ELSE
|
||||||
|
* Generate fm delim of runs that should print
|
||||||
|
RoPrintFlag = str( @FM, WOBoxCnt-1 )
|
||||||
|
FOR J = 1 TO WOBoxCnt step TransFreq
|
||||||
|
RoPrintFlag<J> = 1
|
||||||
|
NEXT J
|
||||||
|
IF ( ROPrintFlag<ThisRunOrdNum> = 1 ) THEN PrintSRP = true$
|
||||||
|
END
|
||||||
|
IF PrintSRP THEN SRPType = TransType
|
||||||
|
END
|
||||||
|
END
|
||||||
|
END
|
||||||
|
|
||||||
|
IF PrintSRP THEN
|
||||||
|
SRPPrintVar = true$
|
||||||
|
SRPTypePrintVar = SRPType
|
||||||
|
END ELSE
|
||||||
|
SRPPrintVar = false$
|
||||||
|
SRPTypePrintVar = ''
|
||||||
|
END
|
||||||
|
|
||||||
|
END ELSE
|
||||||
|
SRPPrintVar = false$
|
||||||
|
SRPTypePrintVar = ''
|
||||||
|
END
|
||||||
|
|
||||||
|
* Got all data now we can print
|
||||||
|
|
||||||
|
PrintCustName = CustName
|
||||||
|
|
||||||
|
IF MultiStep > 0 THEN
|
||||||
|
WONo = WONo:'.':MultiStep ;* 5/21/2005 - JCH - Added for Order Entry/Vision upgrade
|
||||||
|
WONo = WOStepKeys
|
||||||
|
CONVERT '*' TO '.' IN WONo
|
||||||
|
END
|
||||||
|
|
||||||
|
PrintWO = WoNo ;* 5/21/2005 - JCH - Changed for Order Entry/Vision upgrade
|
||||||
|
PrintPSNNo = PSNo ;* 6/10/2005 - JCH - Added per manufacturing manager request
|
||||||
|
PrintLotNum = LotNum
|
||||||
|
PrintRecipeInfo = RecipeInfo
|
||||||
|
PrintSpecType = SpecType
|
||||||
|
PrintRONum = RONum
|
||||||
|
PrintRdsId = RdsKey
|
||||||
|
PrintThickPrintVar = ThickPrintVar
|
||||||
|
PrintResPrintVar = ResPrintVar
|
||||||
|
PrintMultiLayVar = MultiLayVar
|
||||||
|
PrintSRPPrintVar = SRPPrintVar
|
||||||
|
PrintSRPTypePrintVar = SRPTypePrintVar
|
||||||
|
PrintQty = Qtys
|
||||||
|
PrintThickTargets = ''
|
||||||
|
PrintThickTargets = ThickTarget:ThickUnit
|
||||||
|
|
||||||
|
PrintResTargets = ''
|
||||||
|
IF ResTarget[1,1] = '.' THEN
|
||||||
|
TargetVal = '0':ResTarget
|
||||||
|
END ELSE
|
||||||
|
TargetVal = ResTarget
|
||||||
|
END
|
||||||
|
PrintResTargets = TargetVal:ResUnit
|
||||||
|
|
||||||
|
PrintPO = PO
|
||||||
|
PrintPartNum = PartNum:' ':CustPNDescs
|
||||||
|
PrintPartNo = PartNum
|
||||||
|
PrintSubPartNum = SubPartNum
|
||||||
|
|
||||||
|
SubSupplier = obj_Vendor_Code('SemiToEpi',WOMatRec<WO_MAT_SUB_VEND_CD$>)
|
||||||
|
|
||||||
|
VendCd = XLATE('COMPANY',CustNo,COMPANY_VEND_CD$,'X')
|
||||||
|
PrintCompany = XLATE('COMPANY', CustNo, COMPANY_CO_NAME$, 'X')
|
||||||
|
|
||||||
|
IF VendCd NE '' THEN
|
||||||
|
SubSupplier = VendCd ;* Substrate supplier code found in the EPI_PART window. 12/9/2011 for cust 7067
|
||||||
|
END
|
||||||
|
|
||||||
|
PrintSuppCd = SubSupplier
|
||||||
|
PrintDopant = Dopant
|
||||||
|
PrintShipBagReq = ShipBagReq ;* Changed to single value ShipBagReq 9/27/2012 JCH
|
||||||
|
PrintReqShipDate = ReqShipDate
|
||||||
|
PrintSubOxide = SubOxide
|
||||||
|
PrintReactType = ReactTypes
|
||||||
|
PrintSubPreClean = SubPreCleans
|
||||||
|
PrintSubPostClean = SubPostCleans
|
||||||
|
PrintPreAkrionRecipe = PreAkrionRecipes
|
||||||
|
PrintPostAkrionRecipe = PostAkrionRecipes
|
||||||
|
|
||||||
|
APreRec = ''
|
||||||
|
APostRec = ''
|
||||||
|
IF ( PreAkrionRecipes <> '' ) THEN
|
||||||
|
APreRec = ' ':PreAkrionRecipes<I>:' '
|
||||||
|
SubOxide = 'No' ;* IF AKRION THEN NO OXIDE STRIP
|
||||||
|
END
|
||||||
|
|
||||||
|
IF ( PostAkrionRecipes <> '' ) THEN
|
||||||
|
APostRec = ' ':PostAkrionRecipes
|
||||||
|
END
|
||||||
|
|
||||||
|
swap '~' with fmt( ' ', 'L#2' ) in PrintThickPrintVar
|
||||||
|
swap UNIT_MICROMETER$ with 'um' in PrintThickTargets
|
||||||
|
swap UNIT_OHM_CM$ with 'ohm.cm' in PrintThickTargets
|
||||||
|
swap UNIT_OHM_PER_SQ$ with 'ohm/sq' in PrintThickTargets
|
||||||
|
swap UNIT_A$ with 'A' in PrintThickTargets
|
||||||
|
|
||||||
|
swap '~' with fmt( ' ', 'L#2' ) in PrintResPrintVar
|
||||||
|
swap UNIT_MICROMETER$ with 'um' in PrintResTargets
|
||||||
|
swap UNIT_OHM_CM$ with 'ohm.cm' in PrintResTargets
|
||||||
|
swap UNIT_OHM_PER_SQ$ with 'ohm/sq' in PrintResTargets
|
||||||
|
swap UNIT_A$ with 'A' in PrintResTargets
|
||||||
|
|
||||||
|
//only print cheat sheet label on cassette #1
|
||||||
|
IF CassNo EQ 1 then
|
||||||
|
|
||||||
|
PsnRec = XLATE('PROD_SPEC', PSNo, '', 'X')
|
||||||
|
|
||||||
|
SpecEpi = PsnRec<prod_spec_spec_epi$>
|
||||||
|
SpecSub = PsnRec<PROD_SPEC_SPEC_SUBSTRATE$>
|
||||||
|
|
||||||
|
ThkSmile = PsnRec<PROD_SPEC_THICK_SMILE_REQ$>
|
||||||
|
ThkShift = Field(PsnRec, @FM, PROD_SPEC_THICK_LIMIT_SHIFT$)
|
||||||
|
|
||||||
|
ResShift = Field(PsnRec, @FM, PROD_SPEC_RES_LIMIT_SHIFT$)
|
||||||
|
|
||||||
|
SSRecipe = XLATE('PRS_STAGE', PSNo:'*LWI', 5, 'X')
|
||||||
|
PCRecipe = XLATE('PRS_STAGE', PSNo, 'POST_CLEAN_SURFSCAN_RECIPE', 'X')
|
||||||
|
CustPart = PsnRec<PROD_SPEC_CUST_PART_NO$>
|
||||||
|
WaferSize = XLATE('EPI_PART', CustPart, EPI_PART_SUB_WAFER_SIZE$, 'X')
|
||||||
|
*Field(SpecSub, @VM, QSSubWafersize$)
|
||||||
|
|
||||||
|
convert char(248) to @fm in SpecEpi ;* char(248) is used to separate layers
|
||||||
|
layerCount = fieldcount( SpecEpi, @fm )
|
||||||
|
layerInfo = SpecEpi<layerCount>
|
||||||
|
//if this is just 1 layer, we're returning that info, if 3 layers, we're returning layer 3 (combo)
|
||||||
|
|
||||||
|
ThkData = Field(layerInfo, @VM, QSEpiThickMeasure$)
|
||||||
|
ResData = Field(layerInfo, @VM, QSEpiResMeasure$)
|
||||||
|
ConData = Field(layerInfo, @VM, QSEpiConcMeasure$)
|
||||||
|
CResData = Field(layerInfo, @VM, QSEpiCresMeasure$)
|
||||||
|
|
||||||
|
ThkMin = OCONV(Field(layerInfo, @VM, QSEpiMinThick$), 'MD3')
|
||||||
|
ThkMax = OCONV(Field(layerInfo, @VM, QSEpiMaxThick$), 'MD3')
|
||||||
|
ThkTarg = ''
|
||||||
|
If ThkMin NE '' Then ThkTarg = oConv(iconv((ThkMin+ThkMax)/2, 'MD3'), 'MD3')
|
||||||
|
|
||||||
|
ResMin = OCONV(Field(layerInfo, @VM, QSEpiResMinThick$), 'MD3')
|
||||||
|
ResMax = OCONV(Field(layerInfo, @VM, QSEpiResMaxThick$), 'MD3')
|
||||||
|
ResTarg = ''
|
||||||
|
If ResMin NE '' Then ResTarg = oConv(iconv((ResMin+ResMax)/2, 'MD3'), 'MD3')
|
||||||
|
|
||||||
|
ConMin = OCONV(Field(layerInfo, @VM, QSEpiConcMinThick$), 'MD3')
|
||||||
|
ConMax = OCONV(Field(layerInfo, @VM, QSEpiConcMaxThick$), 'MD3')
|
||||||
|
ConTarg = ''
|
||||||
|
If ConMin NE '' Then ConTarg = oConv(iconv((ConMin+ConMax)/2, 'MD3'), 'MD3')
|
||||||
|
|
||||||
|
CResMin = OCONV(Field(layerInfo, @VM, QSEpiCresMin$), 'MD3')
|
||||||
|
CResMax = OCONV(Field(layerInfo, @VM, QSEpiCresMax$), 'MD3')
|
||||||
|
CResTarg = ''
|
||||||
|
If CResMin NE '' Then CResTarg = oConv(iconv((CResMin+CResMax)/2, 'MD3'), 'MD3')
|
||||||
|
|
||||||
|
ThkTool = Field(ThkData, '~', PS$TOOL)
|
||||||
|
ThkType = Field(ThkData, '~', PS$TYPE)
|
||||||
|
ThkRecipe = Field(ThkData, '~', PS$RECIPE)
|
||||||
|
ThkFreq = Field(ThkData, '~', PS$FREQ)
|
||||||
|
ThkPattern = Field(ThkData, '~', PS$PATTERN)
|
||||||
|
|
||||||
|
ResTool = Field(ResData, '~', PS$TOOL)
|
||||||
|
ResType = Field(ResData, '~', PS$TYPE)
|
||||||
|
ResRecipe = Field(ResData, '~', PS$RECIPE)
|
||||||
|
ResFreq = Field(ResData, '~', PS$FREQ)
|
||||||
|
ResPattern = Field(ResData, '~', PS$PATTERN)
|
||||||
|
|
||||||
|
ConTool = Field(ConData, '~', PS$TOOL)
|
||||||
|
ConType = Field(ConData, '~', PS$TYPE)
|
||||||
|
ConRecipe = Field(ConData, '~', PS$RECIPE)
|
||||||
|
ConFreq = Field(ConData, '~', PS$FREQ)
|
||||||
|
ConPattern = Field(ConData, '~', PS$PATTERN)
|
||||||
|
|
||||||
|
CResTool = Field(CResData, '~', PS$TOOL)
|
||||||
|
CResType = Field(CResData, '~', PS$TYPE)
|
||||||
|
CResRecipe = Field(CResData, '~', PS$RECIPE)
|
||||||
|
CResFreq = Field(CResData, '~', PS$FREQ)
|
||||||
|
CResPattern = Field(CResData, '~', PS$PATTERN)
|
||||||
|
|
||||||
|
IF ThkMin EQ '' THEN ThkMin = '--'
|
||||||
|
IF ThkMax EQ '' THEN ThkMax = '--'
|
||||||
|
IF ThkTarg EQ '' THEN ThkTarg = '--'
|
||||||
|
IF ThkTool EQ '' THEN ThkTool = '--'
|
||||||
|
IF ThkType EQ '' THEN ThkType = '--'
|
||||||
|
IF ThkRecipe EQ '' THEN ThkRecipe = '--'
|
||||||
|
IF ThkPattern EQ '' THEN ThkPattern = '--'
|
||||||
|
IF ThkFreq EQ '' THEN ThkFreq = '--'
|
||||||
|
|
||||||
|
IF ResMin EQ '' THEN ResMin = '--'
|
||||||
|
IF ResMax EQ '' THEN ResMax = '--'
|
||||||
|
IF ResTarg EQ '' THEN ResTarg = '--'
|
||||||
|
IF ResTool EQ '' THEN ResTool = '--'
|
||||||
|
IF ResType EQ '' THEN ResType = '--'
|
||||||
|
IF ResRecipe EQ '' THEN ResRecipe = '--'
|
||||||
|
IF ResPattern EQ '' THEN ResPattern = '--'
|
||||||
|
IF ResFreq EQ '' THEN ResFreq = '--'
|
||||||
|
|
||||||
|
IF ConMin EQ '' THEN ConMin = '--'
|
||||||
|
IF ConMax EQ '' THEN ConMax = '--'
|
||||||
|
IF ConTarg EQ '' THEN ConTarg = '--'
|
||||||
|
IF ConTool EQ '' THEN ConTool = '--'
|
||||||
|
IF ConType EQ '' THEN ConType = '--'
|
||||||
|
IF ConRecipe EQ '' THEN ConRecipe = '--'
|
||||||
|
IF ConPattern EQ '' THEN ConPattern = '--'
|
||||||
|
IF ConFreq EQ '' THEN ConFreq = '--'
|
||||||
|
|
||||||
|
IF CResMin EQ '' THEN CResMin = '--'
|
||||||
|
IF CResMax EQ '' THEN CResMax = '--'
|
||||||
|
IF CResTarg EQ '' THEN CResTarg = '--'
|
||||||
|
IF CResTool EQ '' THEN CResTool = '--'
|
||||||
|
IF CResType EQ '' THEN CResType = '--'
|
||||||
|
IF CResRecipe EQ '' THEN CResRecipe = '--'
|
||||||
|
IF CResPattern EQ '' THEN CResPattern = '--'
|
||||||
|
IF CResFreq EQ '' THEN CResFreq = '--'
|
||||||
|
|
||||||
|
Swap @VM with ' / ' in SSRecipe
|
||||||
|
IF PCRecipe EQ '' Then PCRecipe = '--'
|
||||||
|
|
||||||
|
If ThkSmile EQ '' OR ThkSmile EQ '0' then
|
||||||
|
ThkSmile = 'N'
|
||||||
|
end else
|
||||||
|
ThkSmile = 'Y'
|
||||||
|
end
|
||||||
|
|
||||||
|
If ThkShift EQ '' OR ThkShift EQ '0' then
|
||||||
|
ThkShift = 'N'
|
||||||
|
end else
|
||||||
|
ThkShift = 'Y'
|
||||||
|
end
|
||||||
|
|
||||||
|
If ResShift EQ '' OR ResShift EQ '0' then
|
||||||
|
ResShift = 'N'
|
||||||
|
end else
|
||||||
|
ResShift = 'Y'
|
||||||
|
end
|
||||||
|
|
||||||
|
if Len(ThkMin) > 6 then
|
||||||
|
ThkMin = ThkMin[1,6]
|
||||||
|
end
|
||||||
|
if Len(ThkMax) > 6 then
|
||||||
|
ThkMax = ThkMax[1,6]
|
||||||
|
end
|
||||||
|
if Len(ThkTarg) > 6 then
|
||||||
|
ThkTarg = ThkTarg[1,6]
|
||||||
|
end
|
||||||
|
|
||||||
|
if Len(ResMin) > 6 then
|
||||||
|
ResMin = ResMin[1,6]
|
||||||
|
end
|
||||||
|
if Len(ResMax) > 6 then
|
||||||
|
ResMax = ResMax[1,6]
|
||||||
|
end
|
||||||
|
if Len(ResTarg) > 6 then
|
||||||
|
ResTarg = ResTarg[1,6]
|
||||||
|
end
|
||||||
|
|
||||||
|
if Len(ConMin) > 6 then
|
||||||
|
ConMin = ConMin[1,6]
|
||||||
|
end
|
||||||
|
if Len(ConMax) > 6 then
|
||||||
|
ConMax = ConMax[1,6]
|
||||||
|
end
|
||||||
|
if Len(ConTarg) > 6 then
|
||||||
|
ConTarg = ConTarg[1,6]
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
if Len(CResMin) > 6 then
|
||||||
|
CResMin = CResMin[1,6]
|
||||||
|
end
|
||||||
|
if Len(CResMax) > 6 then
|
||||||
|
CResMax = CResMax[1,6]
|
||||||
|
end
|
||||||
|
if Len(CResTarg) > 6 then
|
||||||
|
CResTarg = CResTarg[1,6]
|
||||||
|
end
|
||||||
|
|
||||||
|
****** Begin ZPL
|
||||||
|
ZPL := '^XA'
|
||||||
|
ZPL := '^LH10,0'
|
||||||
|
ZPL := '^PR2' ;* Print speed 2 inches per second
|
||||||
|
ZPL := '^LL406' ;* Label length @203 dpi
|
||||||
|
ZPL := '^PW900'
|
||||||
|
ZPL := '^MD0' ;* Media darkness
|
||||||
|
ZPL := '^MMT' ;* Media mode t=tear off mode
|
||||||
|
|
||||||
|
****** 1st/2nd Line
|
||||||
|
ZPL := '^FO30,20^A0,,40^FDWO ':PrintWO:'^FS'
|
||||||
|
ZPL := '^FO590,10^A050,30^FDPSN ':PrintPSNNo:'^FS'
|
||||||
|
ZPL := '^FO555,40^A050,30^FDDopant ':PrintDopant:'^FS'
|
||||||
|
|
||||||
|
****** 3rd Line - headers
|
||||||
|
ZPL := '^FO85,100^A050,23^FDMin^FS'
|
||||||
|
ZPL := '^FO145,100^A050,23^FDTarg^FS'
|
||||||
|
ZPL := '^FO210,100^A050,23^FDMax^FS'
|
||||||
|
ZPL := '^FO280,100^A050,23^FDTool^FS'
|
||||||
|
ZPL := '^FO330,100^A050,23^FDType^FS'
|
||||||
|
ZPL := '^FO470,100^A050,23^FDRecipe^FS'
|
||||||
|
ZPL := '^FO600,100^A050,23^FDPattern^FS'
|
||||||
|
ZPL := '^FO740,100^A050,23^FDFreq^FS'
|
||||||
|
|
||||||
|
****** 4th Line - Thickness (Thk)
|
||||||
|
ZPL := '^FO70,130^GB720,0,3^FS'
|
||||||
|
ZPL := '^FO70,130^GB0,160,3^FS'
|
||||||
|
ZPL := '^FO10,140^A050,23^FDThk:^FS'
|
||||||
|
ZPL := '^FO80,140^A050,23^FD':ThkMin:'^FS'
|
||||||
|
ZPL := '^FO145,140^A050,23^FD':ThkTarg:'^FS'
|
||||||
|
ZPL := '^FO210,140^A050,23^FD':ThkMax:'^FS'
|
||||||
|
ZPL := '^FO280,140^A050,23^FD':ThkTool[1,5]:'^FS'
|
||||||
|
ZPL := '^FO330,140^A050,23^FD':ThkType[1,11]:'^FS'
|
||||||
|
ZPL := '^FO470,140^A050,23^FD':ThkRecipe[1,11]:'^FS'
|
||||||
|
ZPL := '^FO600,140^A050,23^FD':ThkPattern[1,11]:'^FS'
|
||||||
|
ZPL := '^FO750,140^A050,23^FD':ThkFreq:'^FS'
|
||||||
|
|
||||||
|
****** 5th Line - Resistivity (Res)
|
||||||
|
ZPL := '^FO10,170^GB780,0,3^FS'
|
||||||
|
ZPL := '^FO10,180^A050,23^FDRes:^FS'
|
||||||
|
ZPL := '^FO80,180^A050,23^FD':ResMin:'^FS'
|
||||||
|
ZPL := '^FO145,180^A050,23^FD':ResTarg:'^FS'
|
||||||
|
ZPL := '^FO210,180^A050,23^FD':ResMax:'^FS'
|
||||||
|
ZPL := '^FO280,180^A050,23^FD':ResTool[1,5]:'^FS'
|
||||||
|
ZPL := '^FO330,180^A050,23^FD':ResType[1,11]:'^FS'
|
||||||
|
ZPL := '^FO470,180^A050,23^FD':ResRecipe[1,11]:'^FS'
|
||||||
|
ZPL := '^FO600,180^A050,23^FD':ResPattern[1,11]:'^FS'
|
||||||
|
ZPL := '^FO750,180^A050,23^FD':ResFreq:'^FS'
|
||||||
|
|
||||||
|
****** 6th Line - Contact (Con)
|
||||||
|
ZPL := '^FX***LINE 4'
|
||||||
|
ZPL := '^FO10,210^GB780,0,3^FS'
|
||||||
|
ZPL := '^FO10,220^A050,23^FDCon:^FS'
|
||||||
|
ZPL := '^FO80,220^A050,23^FD':ConMin:'^FS'
|
||||||
|
ZPL := '^FO145,220^A050,23^FD':ConTarg:'^FS'
|
||||||
|
ZPL := '^FO210,220^A050,23^FD':ConMax:'^FS'
|
||||||
|
ZPL := '^FO280,220^A050,23^FD':ConTool[1,5]:'^FS'
|
||||||
|
ZPL := '^FO330,220^A050,23^FD':ConType[1,11]:'^FS'
|
||||||
|
ZPL := '^FO470,220^A050,23^FD':ConRecipe[1,11]:'^FS'
|
||||||
|
ZPL := '^FO600,220^A050,23^FD':ConPattern[1,11]:'^FS'
|
||||||
|
ZPL := '^FO750,220^A050,23^FD':ConFreq:'^FS'
|
||||||
|
|
||||||
|
****** 7th Line - Contact Resistance (CRes)
|
||||||
|
ZPL := '^FO10,250^GB780,0,3^FS'
|
||||||
|
ZPL := '^FO10,260^A050,23^FDCRes:^FS'
|
||||||
|
ZPL := '^FO80,260^A050,23^FD':CResMin:'^FS'
|
||||||
|
ZPL := '^FO145,260^A050,23^FD':CResTarg:'^FS'
|
||||||
|
ZPL := '^FO210,260^A050,23^FD':CResMax:'^FS'
|
||||||
|
ZPL := '^FO280,260^A050,23^FD':CResTool[1,5]:'^FS'
|
||||||
|
ZPL := '^FO330,260^A050,23^FD':CResType[1,11]:'^FS'
|
||||||
|
ZPL := '^FO470,260^A050,23^FD':CResRecipe[1,11]:'^FS'
|
||||||
|
ZPL := '^FO600,260^A050,23^FD':CResPattern[1,11]:'^FS'
|
||||||
|
ZPL := '^FO750,260^A050,23^FD':CResFreq:'^FS'
|
||||||
|
|
||||||
|
ZPL := '^FO10,290^GB780,0,3^FS'
|
||||||
|
|
||||||
|
****** 8th Line - Special Instructions
|
||||||
|
ZPL := '^FO10,310^A050,23^FDSurfScan: ':SSRecipe:'^FS'
|
||||||
|
ZPL := '^FO10,340^A050,23^FDPostClean: ':PCRecipe:'^FS'
|
||||||
|
ZPL := '^FO10,370^A050,23^FDWafer Size: ':WaferSize:'^FS'
|
||||||
|
ZPL := '^FO560,310^A050,23^FDSmile Required: ':ThkSmile:'^FS'
|
||||||
|
ZPL := '^FO560,340^A050,23^FDSPC Thk Shift: ':ThkShift:'^FS'
|
||||||
|
ZPL := '^FO560,370^A050,23^FDSPC Res Shift: ':ResShift:'^FS'
|
||||||
|
|
||||||
|
ZPL:= '^XZ':CRLF$
|
||||||
|
****** End ZPL
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
* Standard RDS Label print method
|
||||||
|
IF PrintSpecType EQ 'Production' THEN PrintSpecType = 'Prod'
|
||||||
|
IF PrintSpecType EQ 'Pre-Production' THEN PrintSpecType = 'Pre'
|
||||||
|
|
||||||
|
EpiPartRec = XLATE('EPI_PART',EpiPartNo,'','X')
|
||||||
|
IsExportControl = EpiPartRec<EPI_PART_EXPORT_CONTROL$>
|
||||||
|
CustEpiPartRec = XLATE('CUST_EPI_PART',CustNo:'*':EpiPartNo,'','X')
|
||||||
|
CustEpiPartSpecNo = CustEpiPartRec<CUST_EPI_PART_SPEC_NO$>[-1,'B':@VM] ;* Last (current) Customer Spec Number
|
||||||
|
PrintPSN = XLATE('RDS',PrintRDSId,'PROD_SPEC_ID', 'X')
|
||||||
|
PrintRecipe = ''
|
||||||
|
PSStageKey = PrintPSN:'*QA'
|
||||||
|
PrintRecipe = XLATE('PRS_STAGE',PSStageKey,'MET_RECIPE','X')
|
||||||
|
PrintQARecipe = FIELD(PrintRecipe, @VM, 1)
|
||||||
|
PrintCompany = PrintCompany[1,32]
|
||||||
|
|
||||||
|
// Looping instead of using ^PQ2 since I have to set sequential key in 2D barcode
|
||||||
|
For cnt = 1 to 2
|
||||||
|
ZPL := '^XA'
|
||||||
|
ZPL := '^LH0,0'
|
||||||
|
ZPL := '^PR1' ;* Print speed 2 inches per second
|
||||||
|
ZPL := '^LL406' ;* Label length @203 dpi
|
||||||
|
ZPL := '^PW900'
|
||||||
|
ZPL := '^MD5' ;* Media darkness
|
||||||
|
ZPL := '^MMT' ;* Media mode t=tear off mode
|
||||||
|
|
||||||
|
****** First Line, Cust, WO and RO
|
||||||
|
ZPL := '^FO25,25^AC,18^FDCust: ^FS':CRLF$
|
||||||
|
ZPL := '^FO95,14^A045,35^FD':PrintCompany:'^FS':CRLF$
|
||||||
|
ZPL := '^FO570,25^AC18^FDWO: ^FS':CRLF$
|
||||||
|
ZPL := '^FO610,14^A045,35^FD':PrintWO:'^FS':CRLF$
|
||||||
|
ZPL := '^FO730,25^AC18^FDRO: ^FS':CRLF$
|
||||||
|
ZPL := '^FO770,14^A045,35^FD':PrintRONum:'^FS':CRLF$
|
||||||
|
|
||||||
|
****** Second Line, Cust Spec, PSN and Type
|
||||||
|
ZPL := '^FO25,75^AC18^FD(P)Cust Spec: ^FS':CRLF$
|
||||||
|
ZPL := '^FO185,65^A045,35^FD':CustEpiPartSpecNo:'^FS':CRLF$
|
||||||
|
ZPL := '^FO25,95^BY2,2.0^B3,,50,N^FDP':CustEpiPartSpecNo:'^FS':CRLF$
|
||||||
|
ZPL := '^FO640,75^AC18^FDPSN:^FS':CRLF$
|
||||||
|
ZPL := '^FO690,65^A045,35^FD':PrintPSN:'^FS':CRLF$
|
||||||
|
ZPL := '^FO630,125^AC18^FDType:^FS':CRLF$
|
||||||
|
ZPL := '^FO690,115^A045,30^FD':PrintSpecType:'^FS':CRLF$
|
||||||
|
|
||||||
|
****** Third Line, Sub Lot, Qty and RDS
|
||||||
|
ZPL := '^FO25,175^AC18^FD(2T)Sub Lot:^FS':CRLF$
|
||||||
|
ZPL := '^FO175,165^A045,35^FD':PrintLotNum:'^FS':CRLF$
|
||||||
|
ZPL := '^FO25,195^BY1,3.0^B3,,50,N^FD2T':PrintLotNum:'^FS':CRLF$
|
||||||
|
ZPL := '^FO400,175^AC18^FD(Q)Qty:^FS':CRLF$
|
||||||
|
ZPL := '^FO500,165^A045,35^FD':PrintQty:'^FS':CRLF$
|
||||||
|
ZPL := '^FO400,195^B3,,50,N^FDQ':PrintQty:'^FS':CRLF$
|
||||||
|
ZPL := '^FO590,175^AC18^FD(1T)RDS: ^FS':CRLF$
|
||||||
|
ZPL := '^FO690,165^A045,35^FD':PrintRDSId:'^FS':CRLF$
|
||||||
|
ZPL := '^FO630,195^B3,,50,N^FD1T':PrintRDSId:'^FS':CRLF$
|
||||||
|
|
||||||
|
****** Fourth Line, SubPN, Vendor and QA Metrology recipe
|
||||||
|
ZPL := '^FO25,275^AC18^FD(S)Sub PN:^FS':CRLF$
|
||||||
|
ZPL := '^FO145,265^A045,35^FD':PrintSubPartNum:'^FS':CRLF$
|
||||||
|
ZPL := '^FO25,295^B3,,50,N^FDS':PrintSubPartNum:'^FS':CRLF$
|
||||||
|
ZPL := '^FO400,275^AC18^FD(1V)Vend:^FS':CRLF$
|
||||||
|
ZPL := '^FO510,265^A045,35^FD':PrintSuppCd:'^FS':CRLF$
|
||||||
|
ZPL := '^FO400,295^B3,,50,N^FD1V':PrintSuppCd:'^FS':CRLF$
|
||||||
|
ZPL := '^FO590,275^AC18^FD':PrintQARecipe:'^FS':CRLF$
|
||||||
|
|
||||||
|
****** Fifth Line, Motto and Data Matrix barcode
|
||||||
|
ZPL := '^FO25,370^A045,28':CRLF$
|
||||||
|
ZPL := "^FDWe do what we promise. That's quality made by Infineon.^FS":CRLF$
|
||||||
|
ZPL := '^FO725,320^CI28':CRLF$
|
||||||
|
ZPL := '^BXN,2,200^FDP':CustEpiPartSpecNo:'|S':PrintSubPartNum:'|1T':PrintRDSId:'|2T':PrintLotNum:'|':PrintPSN:'|Q':PrintQty:'|1V':PrintSuppCd:'|SEQ':cnt:'^FS':CRLF$
|
||||||
|
|
||||||
|
****** End the print job (ZPL script)
|
||||||
|
ZPL:= '^XZ'
|
||||||
|
Next
|
||||||
|
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. RDS ':RdsKey:' does not exist.'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Null RdsKey passed in.'
|
||||||
|
end
|
||||||
|
|
||||||
|
If ErrorMsg EQ '' then
|
||||||
|
Response = ZPL
|
||||||
|
end else
|
||||||
|
Error_Services('Add', ErrorMsg)
|
||||||
|
end
|
||||||
|
|
||||||
|
end service
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Internal GoSubs
|
// Internal GoSubs
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
@ -2571,3 +3380,4 @@ ClearCursors:
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
@ -361,6 +361,3 @@ CreateHALCollection:
|
|||||||
end
|
end
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
174
LSL2/STPROC/RECEIVECASSETTE_API.txt
Normal file
174
LSL2/STPROC/RECEIVECASSETTE_API.txt
Normal file
@ -0,0 +1,174 @@
|
|||||||
|
Function Receivecassette_API(@API)
|
||||||
|
/***********************************************************************************************************************
|
||||||
|
|
||||||
|
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
|
||||||
|
permission from SRP Computer Solutions, Inc.
|
||||||
|
|
||||||
|
Name : Receivecassette_API
|
||||||
|
|
||||||
|
Description : API logic for the Receivecassette resource.
|
||||||
|
|
||||||
|
Notes : All web APIs should include the API_SETUP insert. This will provide several useful variables:
|
||||||
|
|
||||||
|
HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.)
|
||||||
|
APIURL - The URL for the API entry point (e.g., api.mysite.com/v1).
|
||||||
|
FullEndpointURL - The URL submitted by the client, including query params.
|
||||||
|
FullEndpointURLNoQuery - The URL submitted by the client, excluding query params.
|
||||||
|
EndpointSegment - The URL endpoint segment.
|
||||||
|
ParentURL - The URL path preceeding the current endpoint.
|
||||||
|
CurrentAPI - The name of this stored procedure.
|
||||||
|
|
||||||
|
Parameters :
|
||||||
|
API [in] -- Web API to process. Format is [APIPattern].[HTTPMethod]:
|
||||||
|
- APIPattern must follow this structure Receivecassette[.ID.[<Property>]]
|
||||||
|
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||||
|
Examples:
|
||||||
|
- Receivecassette.POST
|
||||||
|
- Receivecassette.ID.PUT
|
||||||
|
- Receivecassette.ID.firstName.GET
|
||||||
|
Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API
|
||||||
|
services do not rely upon anything being returned in the response. This is what the
|
||||||
|
various services like SetResponseBody and SetResponseStatus services are for. A response
|
||||||
|
value is only helpful if the developers want to use it for debug purposes.
|
||||||
|
|
||||||
|
History : (Date, Initials, Notes)
|
||||||
|
08/28/25 xxx Original programmer.
|
||||||
|
|
||||||
|
***********************************************************************************************************************/
|
||||||
|
|
||||||
|
#pragma precomp SRP_PreCompiler
|
||||||
|
|
||||||
|
$insert APP_INSERTS
|
||||||
|
$insert API_SETUP
|
||||||
|
$insert HTTP_INSERTS
|
||||||
|
|
||||||
|
Declare function Work_Order_Services, Wo_Mat_Services, OI_Wizard_Services, Date_Services
|
||||||
|
|
||||||
|
GoToAPI else
|
||||||
|
// The specific resource endpoint doesn't have a API handler yet.
|
||||||
|
HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.')
|
||||||
|
end
|
||||||
|
|
||||||
|
Return Response OR ''
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Endpoint Handlers
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
API receivecassette.POST
|
||||||
|
|
||||||
|
OIWizardID = ''
|
||||||
|
Cookies = HTTP_Services('GetHTTPCookie')
|
||||||
|
For each Cookie in Cookies using ';'
|
||||||
|
Key = Field(Cookie, '=', 1)
|
||||||
|
If Key EQ 'sessionID' then
|
||||||
|
OIWizardID = Field(Cookie, '=', 2)
|
||||||
|
end
|
||||||
|
Next Cookie
|
||||||
|
|
||||||
|
ValidSession = OI_Wizard_Services('ValidateSession', OIWizardID)
|
||||||
|
|
||||||
|
If ValidSession then
|
||||||
|
ErrorMsg = ''
|
||||||
|
// Check if payload has the required information to create a react mode change record
|
||||||
|
Body = HTTP_Services('GetHTTPPostString')
|
||||||
|
If Body NE '' then
|
||||||
|
// The POST string will have been encoded so use percent (URL) decoding.
|
||||||
|
SubstrateScanJSON = HTTP_Services('DecodePercentString', Body)
|
||||||
|
ParseResponse = SRP_JSON(hJSON, 'PARSE', SubstrateScanJSON)
|
||||||
|
If (ParseResponse EQ '') then
|
||||||
|
WONo = SRP_JSON(hJSON, 'GetValue', 'WoNo', '')
|
||||||
|
LotNo = SRP_JSON(hJSON, 'GetValue', 'LotNo', '')
|
||||||
|
Qty = SRP_JSON(hJSON, 'GetValue', 'Qty', 0)
|
||||||
|
SubPartNo = SRP_JSON(hJSON, 'GetValue', 'SubPartNo', '')
|
||||||
|
SubVendCd = SRP_JSON(hJSON, 'GetValue', 'VendorCd', '')
|
||||||
|
ReceiveDtm = SRP_JSON(hJSON, 'GetValue', 'ReceiveDtm', '01/01/0001 00:00:00')
|
||||||
|
ReceiveUser = SRP_JSON(hJSON, 'GetValue', 'ReceiveUser', '')
|
||||||
|
Begin Case
|
||||||
|
Case (WONo EQ '')
|
||||||
|
ErrorMsg = 'WoNo cannot be null'
|
||||||
|
Case (ReceiveUser EQ '')
|
||||||
|
ErrorMsg = 'ReceiveUser cannot be null'
|
||||||
|
Case (LotNo EQ '')
|
||||||
|
ErrorMsg = 'Scanned LotNo cannot be null'
|
||||||
|
Case (Qty EQ 0)
|
||||||
|
ErrorMsg = 'Scanned Qty cannot be 0'
|
||||||
|
Case (SubPartNo EQ '')
|
||||||
|
ErrorMsg = 'Scanned SubPartNo cannot be null'
|
||||||
|
Case (SubVendCd EQ '')
|
||||||
|
ErrorMsg = 'Scanned VendorCd cannot be null'
|
||||||
|
Case (ReceiveDtm EQ '01/01/0001 00:00:00')
|
||||||
|
ErrorMsg = 'Invalid ReceiveDtm'
|
||||||
|
Case Otherwise$
|
||||||
|
Null
|
||||||
|
End Case
|
||||||
|
If (ErrorMsg EQ '') then
|
||||||
|
ReceiveDtm = Date_Services('ConvertISO8601ToDateTime', ReceiveDtm)
|
||||||
|
WOMatKey = Work_Order_Services('ReceiveReleaseCassette', WONo, ReceiveUser, LotNo, Qty, SubPartNo, SubVendCd, IConv(ReceiveDtm, 'DT'))
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
ResponseCode = 201
|
||||||
|
Message = 'Cassette ':WOMatKey:' received'
|
||||||
|
GoSub CreateHalItem
|
||||||
|
end else
|
||||||
|
HTTP_Services('SetResponseStatus', 400, Error_Services('GetMessage'))
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
HTTP_Services('SetResponseStatus', 400, 'Error receiving cassette. ':ErrorMsg)
|
||||||
|
end
|
||||||
|
SRP_JSON(hJSON, 'Release')
|
||||||
|
end else
|
||||||
|
// Error parsing JSON
|
||||||
|
HTTP_Services('SetResponseStatus', 400, 'Unable to parse the JSON data from the request.')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
// No JSON payload sent with request
|
||||||
|
HTTP_Services('SetResponseStatus', 400, 'JSON object is missing in the body of the request.')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
HTTP_Services('SetResponseStatus', 401, 'Invalid session. Reauthentication required.')
|
||||||
|
end
|
||||||
|
|
||||||
|
end api
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Internal GoSubs
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
CreateHalItem:
|
||||||
|
|
||||||
|
JSON = ''
|
||||||
|
|
||||||
|
IF RowExists('WO_MAT', WOMatKey) then
|
||||||
|
// Update Scan object in root JSON object to contain the returned WO_MAT object
|
||||||
|
WOMatJson = Wo_Mat_Services('ConvertRecordToJsonOIWizard', WOMatKey)
|
||||||
|
If (SRP_JSON(objWOMat, 'Parse', WOMatJson) EQ '') then
|
||||||
|
objTemp = SRP_JSON(objWOMat, 'Get', 'WO_Mat')
|
||||||
|
SRP_JSON(hJSON, 'Remove', 'ReceivedCass')
|
||||||
|
SRP_JSON(hJSON, 'Set', 'ReceivedCass', objTemp)
|
||||||
|
SRP_JSON(objTemp, 'Release')
|
||||||
|
SRP_JSON(objWOMat, 'Release')
|
||||||
|
JSON = SRP_JSON(hJSON, 'Stringify', 'Fast')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ResponseCode = 406
|
||||||
|
ResponseMessage = 'Error receiving and releasing cassette. WO_MAT record ':WOMatKey:' does not exist after calling ReceiveReleaseCassette.'
|
||||||
|
HTTP_Services('SetResponseStatus', ResponseCode, ResponseMessage)
|
||||||
|
end
|
||||||
|
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||||
|
HTTP_Services('SetResponseBody', JSON, False$, 'application/hal+json')
|
||||||
|
If Assigned(Message) then
|
||||||
|
HTTP_Services('SetResponseStatus', ResponseCode, Message)
|
||||||
|
end else
|
||||||
|
HTTP_Services('SetResponseStatus', ResponseCode)
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Message = Error_Services('GetMessage')
|
||||||
|
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
|
||||||
|
end
|
||||||
|
|
||||||
|
return
|
||||||
|
|
@ -243,4 +243,3 @@ API reports.GET
|
|||||||
HTTP_Resource_Services('LoremIpsum')
|
HTTP_Resource_Services('LoremIpsum')
|
||||||
|
|
||||||
end api
|
end api
|
||||||
|
|
||||||
|
@ -438,7 +438,3 @@ CreateHALItem:
|
|||||||
end
|
end
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
159
LSL2/STPROC/SEMI_VEND_CODE_API.txt
Normal file
159
LSL2/STPROC/SEMI_VEND_CODE_API.txt
Normal file
@ -0,0 +1,159 @@
|
|||||||
|
Function Semi_vend_code_API(@API)
|
||||||
|
/***********************************************************************************************************************
|
||||||
|
|
||||||
|
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
|
||||||
|
permission from SRP Computer Solutions, Inc.
|
||||||
|
|
||||||
|
Name : Semi_vend_code_API
|
||||||
|
|
||||||
|
Description : API logic for the Semi_vend_code resource.
|
||||||
|
|
||||||
|
Notes : All web APIs should include the API_SETUP insert. This will provide several useful variables:
|
||||||
|
|
||||||
|
HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.)
|
||||||
|
APIURL - The URL for the API entry point (e.g., api.mysite.com/v1).
|
||||||
|
FullEndpointURL - The URL submitted by the client, including query params.
|
||||||
|
FullEndpointURLNoQuery - The URL submitted by the client, excluding query params.
|
||||||
|
EndpointSegment - The URL endpoint segment.
|
||||||
|
ParentURL - The URL path preceeding the current endpoint.
|
||||||
|
CurrentAPI - The name of this stored procedure.
|
||||||
|
|
||||||
|
Parameters :
|
||||||
|
API [in] -- Web API to process. Format is [APIPattern].[HTTPMethod]:
|
||||||
|
- APIPattern must follow this structure Semi_vend_code[.ID.[<Property>]]
|
||||||
|
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||||
|
Examples:
|
||||||
|
- Semi_vend_code.POST
|
||||||
|
- Semi_vend_code.ID.PUT
|
||||||
|
- Semi_vend_code.ID.firstName.GET
|
||||||
|
Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API
|
||||||
|
services do not rely upon anything being returned in the response. This is what the
|
||||||
|
various services like SetResponseBody and SetResponseStatus services are for. A response
|
||||||
|
value is only helpful if the developers want to use it for debug purposes.
|
||||||
|
|
||||||
|
History : (Date, Initials, Notes)
|
||||||
|
09/12/25 djs Original programmer.
|
||||||
|
|
||||||
|
***********************************************************************************************************************/
|
||||||
|
|
||||||
|
#pragma precomp SRP_PreCompiler
|
||||||
|
|
||||||
|
$Insert APP_INSERTS
|
||||||
|
$Insert API_SETUP
|
||||||
|
$Insert HTTP_INSERTS
|
||||||
|
$Insert SEMI_VEND_CODE_EQUATES
|
||||||
|
|
||||||
|
Declare function Semi_Vend_Code_Services
|
||||||
|
|
||||||
|
GoToAPI else
|
||||||
|
// The specific resource endpoint doesn't have a API handler yet.
|
||||||
|
HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.')
|
||||||
|
end
|
||||||
|
|
||||||
|
Return Response OR ''
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Endpoint Handlers
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
API semi_vend_code.HEAD
|
||||||
|
API semi_vend_code.GET
|
||||||
|
|
||||||
|
GoSub CreateHALCollection
|
||||||
|
|
||||||
|
end api
|
||||||
|
|
||||||
|
|
||||||
|
API semi_vend_code.ID.HEAD
|
||||||
|
API semi_vend_code.ID.GET
|
||||||
|
|
||||||
|
GoSub CreateHALItem
|
||||||
|
|
||||||
|
end api
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Internal GoSubs
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
CreateHALItem:
|
||||||
|
|
||||||
|
ResponseCode = 200
|
||||||
|
SemiVendCd = EndpointSegment
|
||||||
|
IF RowExists('SEMI_VEND_CODE', SemiVendCd) then
|
||||||
|
JSON = Semi_Vend_Code_Services('ConvertRecordToJSON', SemiVendCd)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||||
|
HTTP_Services('SetResponseBody', JSON, False$, 'application/hal+json')
|
||||||
|
If Assigned(Message) then
|
||||||
|
HTTP_Services('SetResponseStatus', ResponseCode, Message)
|
||||||
|
end else
|
||||||
|
HTTP_Services('SetResponseStatus', ResponseCode)
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Message = Error_Services('GetMessage')
|
||||||
|
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ResponseCode = 406
|
||||||
|
ResponseMessage = 'No WO found based on the search criteria provided.'
|
||||||
|
HTTP_Services('SetResponseStatus', ResponseCode, ResponseMessage)
|
||||||
|
end
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
// CreateHALCollection
|
||||||
|
//
|
||||||
|
// Creates a HAL+JSON collection based on OpenInsight data row representations.
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
CreateHALCollection:
|
||||||
|
|
||||||
|
StatusCode = 200
|
||||||
|
JSONCollection = ''
|
||||||
|
Abort = False$
|
||||||
|
SemiVendCodes = Semi_Vend_Code_Services('GetSemiVendCodes')
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
If SemiVendCodes NE '' then
|
||||||
|
If SRP_JSON(hJSONCollection, 'New', 'Object') then
|
||||||
|
If SRP_Json(hSemiArray, 'New', 'Array') then
|
||||||
|
For each SemiVendCode in SemiVendCodes using @FM
|
||||||
|
SemiJson = Semi_Vend_Code_Services('ConvertRecordToJSON', SemiVendCode)
|
||||||
|
If (SRP_Json(hSemi, 'Parse', SemiJson) EQ '') then
|
||||||
|
hTemp = SRP_Json(hSemi, 'Get', 'SemiVendCode')
|
||||||
|
SRP_Json(hSemiArray, 'Add', hTemp)
|
||||||
|
SRP_Json(hTemp, 'Release')
|
||||||
|
SRP_Json(hSemi, 'Release')
|
||||||
|
end
|
||||||
|
Next SemiVendCode
|
||||||
|
end
|
||||||
|
SRP_Json(hJSONCollection, 'Set', 'SemiVendCodes', hSemiArray)
|
||||||
|
SRP_Json(hSemiArray, 'Release')
|
||||||
|
JSONCollection = SRP_JSON(hJSONCollection, 'Stringify', 'Fast')
|
||||||
|
SRP_JSON(hJSONCollection, 'Release')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Message = 'No Semi Vend Codes found!'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Message = Error_Services('GetMessage')
|
||||||
|
StatusCode = 500
|
||||||
|
end
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||||
|
HTTP_Services('SetResponseBody', JSONCollection, False$, 'application/hal+json')
|
||||||
|
If Assigned(Message) then
|
||||||
|
HTTP_Services('SetResponseStatus', StatusCode, Message)
|
||||||
|
end else
|
||||||
|
HTTP_Services('SetResponseStatus', StatusCode)
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Message = Error_Services('GetMessage')
|
||||||
|
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
|
||||||
|
end
|
||||||
|
|
||||||
|
return
|
||||||
|
|
124
LSL2/STPROC/SEMI_VEND_CODE_SERVICES.txt
Normal file
124
LSL2/STPROC/SEMI_VEND_CODE_SERVICES.txt
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
Function Semi_Vend_Code_Services(@Service, @Params)
|
||||||
|
/***********************************************************************************************************************
|
||||||
|
|
||||||
|
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
|
||||||
|
permission from Infineon Technologies.
|
||||||
|
|
||||||
|
Name : Semi_Vend_Code_Services
|
||||||
|
|
||||||
|
Description : Handler program for all module related services.
|
||||||
|
|
||||||
|
Notes : The generic parameters should contain all the necessary information to process the services. Often
|
||||||
|
this will be information like the data Record and Key ID.
|
||||||
|
|
||||||
|
Parameters :
|
||||||
|
Service [in] -- Name of the service being requested
|
||||||
|
Param1-10 [in/out] -- Additional request parameter holders
|
||||||
|
Response [out] -- Response to be sent back to the Controller (MCP) or requesting procedure
|
||||||
|
|
||||||
|
Metadata :
|
||||||
|
|
||||||
|
History : (Date, Initials, Notes)
|
||||||
|
09/12/2025 djs Created service module for OI Wizard Receive and Release operations.
|
||||||
|
|
||||||
|
***********************************************************************************************************************/
|
||||||
|
#pragma precomp SRP_PreCompiler
|
||||||
|
|
||||||
|
$Insert APP_INSERTS
|
||||||
|
$Insert SERVICE_SETUP
|
||||||
|
$Insert SEMI_VEND_CODE_EQUATES
|
||||||
|
|
||||||
|
Declare function Database_Services, SRP_Json
|
||||||
|
Declare subroutine Error_Services, SRP_Json
|
||||||
|
|
||||||
|
GoToService else
|
||||||
|
Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
|
||||||
|
end
|
||||||
|
|
||||||
|
Return Response else ''
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Service Parameter Options
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
Options BOOLEAN = True$, False$
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Services
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
// GetSemiVendCodes
|
||||||
|
//
|
||||||
|
// Returns an @FM delimited array of all SEMI_VEND_CD keys in the table.
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
Service GetSemiVendCodes()
|
||||||
|
|
||||||
|
ErrorMsg = ''
|
||||||
|
SemiVendCodes = ''
|
||||||
|
Open 'SEMI_VEND_CODE' to hTable then
|
||||||
|
Select hTable
|
||||||
|
EOF = False$
|
||||||
|
SemiVendCodes = ''
|
||||||
|
Loop
|
||||||
|
Readnext KeyId else EOF = True$
|
||||||
|
Until EOF
|
||||||
|
SemiVendCodes<-1> = KeyId
|
||||||
|
Repeat
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Error opening SEMI_VEND_CODE table.'
|
||||||
|
end
|
||||||
|
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||||
|
Response = SemiVendCodes
|
||||||
|
|
||||||
|
end service
|
||||||
|
|
||||||
|
|
||||||
|
Service ConvertRecordToJSON(KeyId, Record)
|
||||||
|
|
||||||
|
ErrorMsg = ''
|
||||||
|
JsonRecord = ''
|
||||||
|
If KeyId NE '' then
|
||||||
|
If Record EQ '' then Record = Database_Services('ReadDataRow', 'SEMI_VEND_CODE', KeyId)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
// Create the JSON response object
|
||||||
|
objJSON = ''
|
||||||
|
If SRP_JSON(objJSON, 'New', 'Object') then
|
||||||
|
objSemiVendCode = ''
|
||||||
|
If SRP_JSON(objSemiVendCode, 'New', 'Object') then
|
||||||
|
SRP_JSON(objSemiVendCode, 'SetValue', 'VendCd', KeyId)
|
||||||
|
SRP_JSON(objSemiVendCode, 'SetValue', 'VendorName', Record<SEMI_VEND_CODE_VENDOR_NAME$>)
|
||||||
|
SRP_JSON(objSemiVendCode, 'SetValue', 'Location', Record<SEMI_VEND_CODE_LOCATION$>)
|
||||||
|
SRP_JSON(objSemiVendCode, 'SetValue', 'EpiVendCd', Record<SEMI_VEND_CODE_EPI_VEND_CD$>)
|
||||||
|
SRP_JSON(objJSON, 'Set', 'SemiVendCode', objSemiVendCode)
|
||||||
|
SRP_JSON(objSemiVendCode, 'Release')
|
||||||
|
end
|
||||||
|
jsonRecord = SRP_JSON(objJSON, 'Stringify', 'Styled')
|
||||||
|
SRP_JSON(objJSON, 'Release')
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Unable to create JSON object'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Null KeyId passed into service.'
|
||||||
|
end
|
||||||
|
|
||||||
|
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||||
|
Response = JsonRecord
|
||||||
|
|
||||||
|
end service
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Internal GoSubs
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
ClearCursors:
|
||||||
|
|
||||||
|
For counter = 0 to 8
|
||||||
|
ClearSelect counter
|
||||||
|
Next counter
|
||||||
|
|
||||||
|
return
|
||||||
|
|
@ -381,5 +381,3 @@ API wafercounter.ID.GET
|
|||||||
HTTP_Services('SetResponseStatus', ResponseCode, ErrorMessage)
|
HTTP_Services('SetResponseStatus', ResponseCode, ErrorMessage)
|
||||||
|
|
||||||
end api
|
end api
|
||||||
|
|
||||||
|
|
||||||
|
103
LSL2/STPROC/WEB_OI_WIZARD_EVENTS.txt
Normal file
103
LSL2/STPROC/WEB_OI_WIZARD_EVENTS.txt
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
Compile function WEB_OI_WIZARD_EVENTS(CtrlEntId, Event, @PARAMS)
|
||||||
|
#pragma precomp SRP_PreCompiler
|
||||||
|
#window WEB_OI_WIZARD
|
||||||
|
|
||||||
|
$Insert EVENT_SETUP
|
||||||
|
$Insert APP_INSERTS
|
||||||
|
$Insert PS_WebView_Equates
|
||||||
|
|
||||||
|
EQU ONE_DAY_SECS$ to 84600
|
||||||
|
|
||||||
|
Declare function OI_Wizard_Services, Exec_Method, Environment_Services
|
||||||
|
Declare subroutine PlaceDialog
|
||||||
|
|
||||||
|
GoToEvent Event for CtrlEntId else
|
||||||
|
// Event not implemented
|
||||||
|
end
|
||||||
|
|
||||||
|
Return EventFlow or 1
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// EVENT HANDLERS
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Event WINDOW.CREATE(CreateParam)
|
||||||
|
|
||||||
|
OIWizardBaseUrl = Environment_Services('GetOIWizardBaseUrl')
|
||||||
|
Set_Property(@Window, '@BASE_URL', OIWizardBaseUrl)
|
||||||
|
InitNavPage = CreateParam
|
||||||
|
Set_Property(@Window, '@INIT_NAV_PAGE', InitNavPage)
|
||||||
|
Set_Property(@Window, '@FIRST_RENDER', True$)
|
||||||
|
PlaceDialog(-2, -2)
|
||||||
|
|
||||||
|
End Event
|
||||||
|
|
||||||
|
|
||||||
|
Event WEBVIEW_MAIN.WEBVIEWCREATED()
|
||||||
|
|
||||||
|
OIWizardURL = Get_Property(@Window, '@BASE_URL')
|
||||||
|
NavPage = Get_Property(@Window, '@INIT_NAV_PAGE')
|
||||||
|
NavTo = OIWizardURL:NavPage
|
||||||
|
SuccessFlag = Exec_Method( CtrlEntID, "NAVIGATE", NavTo)
|
||||||
|
If Not(SuccessFlag) then
|
||||||
|
Msg(@Window, '', 'OK', '', 'Application Error':@FM:'Error navigating to ':NavTo)
|
||||||
|
end
|
||||||
|
|
||||||
|
end event
|
||||||
|
|
||||||
|
|
||||||
|
Event WEBVIEW_MAIN.WEBNAVIGATED(NavID, URI, Redirected, UserInitiated, StatusInfo, FrameID)
|
||||||
|
|
||||||
|
FirstRender = Get_Property(@Window, '@FIRST_RENDER')
|
||||||
|
If FirstRender then
|
||||||
|
SuccessFlag = Exec_Method(CtrlEntID, "DELETECOOKIES", '*')
|
||||||
|
If SuccessFlag then
|
||||||
|
LSLUserId = @User4
|
||||||
|
OIWizardID = OI_Wizard_Services('CreateWizardID', LSLUserID)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
Expiry = Xlate('OI_WIZARD', OIWizardID, 'EXPIRY', 'X')
|
||||||
|
Domain = Get_Property(@Window, '@BASE_URL')
|
||||||
|
Swap 'http://' with '' in Domain
|
||||||
|
Swap 'https://' with '' in Domain
|
||||||
|
PortIndex = Index(Domain, ':', 1)
|
||||||
|
If PortIndex then Domain = Domain[1, PortIndex - 1]
|
||||||
|
Cookie = ""
|
||||||
|
Cookie<0, WBV_COOKIE_POS_NAME$> = "sessionID"
|
||||||
|
Cookie<0, WBV_COOKIE_POS_VALUE$> = OIWizardID
|
||||||
|
Cookie<0, WBV_COOKIE_POS_DOMAIN$> = Domain
|
||||||
|
Cookie<0, WBV_COOKIE_POS_EXPIRES$> = Expiry
|
||||||
|
SuccessFlag = Exec_Method( CtrlEntID, "SETCOOKIE", Cookie )
|
||||||
|
If SuccessFlag then
|
||||||
|
Cookies = Exec_Method( CtrlEntID, "GETCOOKIES")
|
||||||
|
Cookie<0, WBV_COOKIE_POS_NAME$> = "userID"
|
||||||
|
Cookie<0, WBV_COOKIE_POS_VALUE$> = LSLUserID
|
||||||
|
Cookie<0, WBV_COOKIE_POS_DOMAIN$> = Domain
|
||||||
|
Cookie<0, WBV_COOKIE_POS_EXPIRES$> = Expiry
|
||||||
|
SuccessFlag = Exec_Method( CtrlEntID, "SETCOOKIE", Cookie )
|
||||||
|
If SuccessFlag then
|
||||||
|
// Set a timer to execute our session service javascript hook once the page is ready
|
||||||
|
Set_Property(@Window, "TIMER", 0:@FM:1000)
|
||||||
|
Set_Property(@Window, '@FIRST_RENDER', False$)
|
||||||
|
end else
|
||||||
|
Msg(@Window, '', 'OK', '', 'Application Error':@FM:'Error setting userID cookie')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Msg(@Window, '', 'OK', '', 'Application Error':@FM:'Error setting sessionID cookie')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Msg(@Window, '', 'OK', '', 'Application Error':@FM:'Error creating OI Wizard session')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Msg(@Window, '', 'OK', '', 'Application Error':@FM:'Error deleting cookies')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end event
|
||||||
|
|
||||||
|
|
||||||
|
Event WINDOW.TIMER()
|
||||||
|
|
||||||
|
Response = Exec_Method(@Window:'.WEBVIEW_MAIN', 'EXECUTESCRIPT', 'SessionServiceHelper.SetSessionFromCookies()')
|
||||||
|
|
||||||
|
end event
|
||||||
|
|
132
LSL2/STPROC/WM_IN_API.txt
Normal file
132
LSL2/STPROC/WM_IN_API.txt
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
Function WM_IN_API(@API)
|
||||||
|
/***********************************************************************************************************************
|
||||||
|
|
||||||
|
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
|
||||||
|
permission from SRP Computer Solutions, Inc.
|
||||||
|
|
||||||
|
Name : WM_IN_Api
|
||||||
|
|
||||||
|
Description : API logic for the WM_IN resource.
|
||||||
|
|
||||||
|
Notes : All web APIs should include the API_SETUP insert. This will provide several useful variables:
|
||||||
|
|
||||||
|
HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.)
|
||||||
|
APIURL - The URL for the API entry point (e.g., api.mysite.com/v1).
|
||||||
|
FullEndpointURL - The URL submitted by the client, including query params.
|
||||||
|
FullEndpointURLNoQuery - The URL submitted by the client, excluding query params.
|
||||||
|
EndpointSegment - The URL endpoint segment.
|
||||||
|
ParentURL - The URL path preceeding the current endpoint.
|
||||||
|
CurrentAPI - The name of this stored procedure.
|
||||||
|
|
||||||
|
Parameters :
|
||||||
|
API [in] -- Web API to process. Format is [APIPattern].[HTTPMethod]:
|
||||||
|
- APIPattern must follow this structure Rds[.ID.[<Property>]]
|
||||||
|
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||||
|
Examples:
|
||||||
|
- Rds.POST
|
||||||
|
- Rds.ID.PUT
|
||||||
|
- Rds.ID.firstName.GET
|
||||||
|
Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API
|
||||||
|
services do not rely upon anything being returned in the response. This is what the
|
||||||
|
various services like SetResponseBody and SetResponseStatus services are for. A response
|
||||||
|
value is only helpful if the developers want to use it for debug purposes.
|
||||||
|
|
||||||
|
History : (Date, Initials, Notes)
|
||||||
|
09/27/22 xxx Original programmer.
|
||||||
|
|
||||||
|
***********************************************************************************************************************/
|
||||||
|
#pragma precomp SRP_PreCompiler
|
||||||
|
|
||||||
|
$insert APP_INSERTS
|
||||||
|
$insert API_SETUP
|
||||||
|
$insert HTTP_INSERTS
|
||||||
|
|
||||||
|
Declare function WM_In_Services
|
||||||
|
|
||||||
|
GoToAPI else
|
||||||
|
// The specific resource endpoint doesn't have a API handler yet.
|
||||||
|
HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.')
|
||||||
|
end
|
||||||
|
|
||||||
|
Return Response OR ''
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Endpoint Handlers
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
API wm_in.ID.HEAD
|
||||||
|
API wm_in.ID.GET
|
||||||
|
|
||||||
|
GoSub CreateHALItem
|
||||||
|
|
||||||
|
end api
|
||||||
|
|
||||||
|
|
||||||
|
API wm_in.ID.zpl.HEAD
|
||||||
|
API wm_in.ID.zpl.GET
|
||||||
|
|
||||||
|
GoSub CreateZPLItem
|
||||||
|
|
||||||
|
end api
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Internal GoSubs
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
// CreateHALItem
|
||||||
|
//
|
||||||
|
// Creates a HAL+JSON object based on the OpenInsight data row representation of the scan.
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
CreateHALItem:
|
||||||
|
|
||||||
|
WMInKey = EndpointSegment
|
||||||
|
Convert '-' to '*' in WMInKey
|
||||||
|
WmInJson = WM_In_Services('ConvertRecordToJSON', WMInKey, '', FullEndpointURL)
|
||||||
|
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
StatusCode = 200
|
||||||
|
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||||
|
HTTP_Services('SetResponseBody', WmInJson, False$, 'application/hal+json')
|
||||||
|
If Assigned(Message) then
|
||||||
|
HTTP_Services('SetResponseStatus', StatusCode, Message)
|
||||||
|
end else
|
||||||
|
HTTP_Services('SetResponseStatus', StatusCode)
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Message = Error_Services('GetMessage')
|
||||||
|
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
|
||||||
|
end
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
// CreateZPLItem
|
||||||
|
//
|
||||||
|
// Creates a HAL+JSON object with the ZPL for the given WM_IN row
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
CreateZPLItem:
|
||||||
|
|
||||||
|
WmInKey = ParentSegment
|
||||||
|
ZplJson = ''
|
||||||
|
ZPL = Wm_In_Services('GetWmInZpl', WmInKey)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
StatusCode = 200
|
||||||
|
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||||
|
HTTP_Services('SetResponseBody', ZPL, False$, 'text/plain')
|
||||||
|
If Assigned(Message) then
|
||||||
|
HTTP_Services('SetResponseStatus', StatusCode, Message)
|
||||||
|
end else
|
||||||
|
HTTP_Services('SetResponseStatus', StatusCode)
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Message = Error_Services('GetMessage')
|
||||||
|
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
|
||||||
|
end
|
||||||
|
|
||||||
|
return
|
||||||
|
|
@ -46,23 +46,48 @@ Compile function WM_IN_Services(@Service, @Params)
|
|||||||
|
|
||||||
***********************************************************************************************************************/
|
***********************************************************************************************************************/
|
||||||
#pragma precomp SRP_PreCompiler
|
#pragma precomp SRP_PreCompiler
|
||||||
$insert LOGICAL
|
|
||||||
$Insert SERVICE_SETUP
|
|
||||||
|
|
||||||
|
$Insert SERVICE_SETUP
|
||||||
|
$insert APP_INSERTS
|
||||||
|
$Insert UNIT_EQUATES
|
||||||
$Insert MSG_EQUATES
|
$Insert MSG_EQUATES
|
||||||
$Insert DICT_EQUATES
|
$Insert DICT_EQUATES
|
||||||
$Insert WM_IN_EQUATES
|
$Insert WM_IN_EQUATES
|
||||||
|
$Insert WO_LOG_EQUATES
|
||||||
|
$Insert PROD_SPEC_EQUATES
|
||||||
|
$Insert WO_MAT_EQUATES
|
||||||
|
$Insert CUST_EPI_PART_EQUATES
|
||||||
|
$Insert QUOTE_SPEC_EQU
|
||||||
|
$Insert WO_STEP_EQUATES
|
||||||
|
|
||||||
|
EQU PI$LEFT TO 1
|
||||||
|
EQU PI$TOP TO 2
|
||||||
|
EQU PI$RIGHT TO 3
|
||||||
|
EQU PI$BOTTOM TO 4
|
||||||
|
EQU PI$WIDTH TO 5
|
||||||
|
EQU PI$HEIGHT TO 6
|
||||||
|
EQU PI$SIZE TO 7
|
||||||
|
|
||||||
|
EQU PS$TOOL TO 1
|
||||||
|
EQU PS$TYPE TO 2
|
||||||
|
EQU PS$RECIPE TO 3
|
||||||
|
EQU PS$FREQ TO 4
|
||||||
|
EQU PS$PATTERN TO 11
|
||||||
|
|
||||||
Declare function PSN_Services, SRP_Rotate_Array, Datetime, Database_Services, Environment_Services, Logging_Services
|
Declare function PSN_Services, SRP_Rotate_Array, Datetime, Database_Services, Environment_Services, Logging_Services
|
||||||
|
Declare function obj_Install, SRP_Json
|
||||||
Declare subroutine Database_Services, Set_Status, obj_Wo_Mat_Log, Logging_Services, Extract_Si_Keys, Btree.Extract
|
Declare subroutine Database_Services, Set_Status, obj_Wo_Mat_Log, Logging_Services, Extract_Si_Keys, Btree.Extract
|
||||||
|
Declare subroutine SRP_Json
|
||||||
|
|
||||||
GoToService
|
GoToService else
|
||||||
|
Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
|
||||||
|
end
|
||||||
|
|
||||||
Return Response or ""
|
Return Response else ''
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// SERVICES
|
// Services
|
||||||
//-----------------------------------------------------------------------------
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
@ -76,15 +101,13 @@ Return Response or ""
|
|||||||
Service GetComments(WMINNo)
|
Service GetComments(WMINNo)
|
||||||
|
|
||||||
CommentArray = ''
|
CommentArray = ''
|
||||||
WMInRow = Database_Services('ReadDataRow', 'WM_IN', WMInNo)
|
WMInRow = Database_Services('ReadDataRow', 'WM_IN', WMInNo)
|
||||||
|
|
||||||
CommentDates = Oconv(WMInRow<WM_IN_EPP_COMMENT_DATE$>, 'DT')
|
CommentDates = Oconv(WMInRow<WM_IN_EPP_COMMENT_DATE$>, 'DT')
|
||||||
CommentUsers = WMInRow<WM_IN_EPP_COMMENT_USER$>
|
CommentUsers = WMInRow<WM_IN_EPP_COMMENT_USER$>
|
||||||
Comments = WMInRow<WM_IN_EPP_COMMENT_NOTE$>
|
Comments = WMInRow<WM_IN_EPP_COMMENT_NOTE$>
|
||||||
|
CommentList = CommentDates :@FM: CommentUsers :@FM: Comments
|
||||||
CommentList = CommentDates :@FM: CommentUsers :@FM: Comments
|
|
||||||
CommentArray = SRP_Rotate_Array(CommentList)
|
CommentArray = SRP_Rotate_Array(CommentList)
|
||||||
Response = CommentArray
|
Response = CommentArray
|
||||||
|
|
||||||
End Service
|
End Service
|
||||||
|
|
||||||
@ -368,6 +391,7 @@ Service VerifyWOMatWMIKeyIndex(WMIKey)
|
|||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
Service GetWMInKeys(WOLogId)
|
Service GetWMInKeys(WOLogId)
|
||||||
|
|
||||||
ErrorMsg = ''
|
ErrorMsg = ''
|
||||||
@ -393,3 +417,531 @@ Service GetWMInKeys(WOLogId)
|
|||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
|
Service GetWmInZpl(WmInKey)
|
||||||
|
|
||||||
|
ZPL = ''
|
||||||
|
ErrorMsg = ''
|
||||||
|
If WmInKey NE '' then
|
||||||
|
Swap '-' with '*' in WmInKey
|
||||||
|
Swap '.' with '*' in WmInKey
|
||||||
|
If RowExists('WM_IN', WmInKey) then
|
||||||
|
WONo = Field(WmInKey, '*', 1, 1)
|
||||||
|
WOStep = Field(WmInKey, '*', 2, 1)
|
||||||
|
WOStepKeys = XLATE('WO_LOG',WONo,WO_LOG_WO_STEP_KEY$,'X')
|
||||||
|
IF INDEX(WOStepKeys,@VM,1) THEN
|
||||||
|
PrintWONo = WONo:'.':WOStep
|
||||||
|
END ELSE
|
||||||
|
PrintWONo = WONo
|
||||||
|
END
|
||||||
|
WORec = XLATE('WO_LOG',WONo,'','X')
|
||||||
|
ReqShipDate = OCONV(WORec<WO_LOG_PROMISE_SHIP_DT$>,'D2/')
|
||||||
|
CustNo = WORec<WO_LOG_CUST_NO$>
|
||||||
|
CustName = XLATE('COMPANY',CustNo,'ABBREV_OR_CO_NAME','X')
|
||||||
|
Captive = XLATE('COMPANY',CustNo,'CAPTIVE','X')
|
||||||
|
PONo = WORec<WO_LOG_CUST_PO_NO$>
|
||||||
|
PSNo = XLATE('WO_STEP',WONo:'*':WOStep,WO_STEP_PROD_SPEC_ID$,'X')
|
||||||
|
PSRec = XLATE('PROD_SPEC',PSNo,'','X')
|
||||||
|
CustSpecNo = ''
|
||||||
|
IF Captive THEN
|
||||||
|
CustSpecNos = PSRec<PROD_SPEC_SPEC_NUM$>
|
||||||
|
CustSpecDescs = PSRec<PROD_SPEC_SPEC_DESC$>
|
||||||
|
CustSpecRevNos = PSRec<PROD_SPEC_REV_NUM$>
|
||||||
|
CustSpecRevDts = PSRec<PROD_SPEC_REV_DATE$>
|
||||||
|
SpecCnt = COUNT(CustSpecNos,@VM) + (CustSpecNos NE '')
|
||||||
|
FOR I = 1 TO SpecCnt
|
||||||
|
IF CustSpecDescs<1,I> _EQC 'GENERAL' THEN
|
||||||
|
CustSpecNo = CustSpecNos<1,I>
|
||||||
|
CustSpecDesc = CustSpecDescS<1,I>
|
||||||
|
CustSpecRevNo = CustSpecRevNos<1,I>
|
||||||
|
CustSpecRevDt = OCONV(CustSpecRevDts<1,I>,'D4/')
|
||||||
|
END
|
||||||
|
UNTIL CustSpecNo NE ''
|
||||||
|
NEXT I
|
||||||
|
END
|
||||||
|
EpiPartNo = WORec<WO_LOG_EPI_PART_NO$>
|
||||||
|
CustEpiPartRec = XLATE('CUST_EPI_PART',CustNo:'*':EpiPartNo,'','X')
|
||||||
|
ShipBagReq = CustEpiPartRec<CUST_EPI_PART_SHIP_BAG_REQ$>
|
||||||
|
PreSurfscan = PSRec<PROD_SPEC_PRE_SURFSCAN$>
|
||||||
|
FirstSurfscan = PSRec<PROD_SPEC_FIRST_SURFSCAN$>
|
||||||
|
PostCleanSurfScan = PSRec<PROD_SPEC_POST_CLEAN_SURFSCAN$>
|
||||||
|
SubPreClean = XLATE( 'PROD_SPEC', PSNo, 'SUB_PRE_CLEAN', 'X' )
|
||||||
|
SubPostClean = XLATE( 'PROD_SPEC', PSNo, 'SUB_POST_CLEAN', 'X' )
|
||||||
|
PreCleanTool = SubPreClean ;* Temporary for 2x4 -> 4x4 conversion
|
||||||
|
PostCleanTool = SubPostClean
|
||||||
|
PreAkrionRecipe = XLATE( 'PROD_SPEC', PSNo, 'PRE_AKRION_RECIPE', 'X' )
|
||||||
|
PostAkrionRecipe = XLATE( 'PROD_SPEC', PSNo, 'POST_AKRION_RECIPE', 'X' )
|
||||||
|
RecipeNo = XLATE( 'PROD_SPEC', PSNo, 'RECIPE_NO_L1', 'X' )
|
||||||
|
RecipeName = XLATE( 'PROD_SPEC', PSNo, 'RECIPE_NAME_L1', 'X' )
|
||||||
|
SpecType = OCONV( XLATE( 'PROD_SPEC', PSNo, 'SPEC_TYPE', 'X' ), '[SPEC_TYPE_CONV]' )
|
||||||
|
SubOxide = OCONV( XLATE( 'PROD_SPEC', PSNo, 'SUB_OXIDE_STRIP', 'X' ), 'B' )
|
||||||
|
ThickTarget = OCONV( XLATE( 'PROD_SPEC', PSNo, 'THICK_TARGET_ALL', 'X' ), 'MD3' )
|
||||||
|
ResTarget = OCONV( XLATE( 'PROD_SPEC', PSNo, 'RES_TARGET_ALL', 'X' ), 'MD3' )
|
||||||
|
ThickUnit = XLATE( 'PROD_SPEC', PSNo, 'THICK_UNITS_ALL', 'X' )
|
||||||
|
ResUnit = XLATE( 'PROD_SPEC', PSNo , 'RES_UNITS_ALL', 'X' )
|
||||||
|
Dopant = XLATE( 'PROD_SPEC', PSNo, 'DOPANT_L1', 'X' )
|
||||||
|
RecipeNo = XLATE( 'PROD_SPEC', PSNo, 'RECIPE_NO', 'X' )
|
||||||
|
RecipeInfo = XLATE( 'RECIPE', RecipeNo, 'RECIPE_NAME_NO', 'X' )
|
||||||
|
CleaningReqs = ''
|
||||||
|
ThickCnt = FIELDCOUNT( ThickTarget<1>, @VM )
|
||||||
|
PrintThickTargets = ''
|
||||||
|
FOR J = 1 TO ThickCnt
|
||||||
|
PrintThickTargets<1,J> = ThickTarget<1,J>:ThickUnit<1,J>
|
||||||
|
NEXT J
|
||||||
|
ResCnt = FIELDCOUNT( ResTarget<1>, @VM )
|
||||||
|
PrintResTargets = ''
|
||||||
|
FOR J = 1 TO ResCnt
|
||||||
|
IF ResTarget<1,J>[1,1] = '.' THEN
|
||||||
|
TargetVal = '0':ResTarget<1,J>
|
||||||
|
END ELSE
|
||||||
|
TargetVal = ResTarget<1,J>
|
||||||
|
END
|
||||||
|
PrintResTargets<1,J> = TargetVal:ResUnit<1,J>
|
||||||
|
NEXT J
|
||||||
|
APreRec = ''
|
||||||
|
APostRec = ''
|
||||||
|
IF ( PreAkrionRecipe<1> <> '' ) THEN
|
||||||
|
APreRec = ' ':PreAkrionRecipe:' '
|
||||||
|
SubOxide = 'No' ;* If Akrion then no oxide strip
|
||||||
|
END
|
||||||
|
IF ( PostAkrionRecipe<1> <> '' ) THEN
|
||||||
|
APostRec = ' ':PostAkrionRecipe
|
||||||
|
END
|
||||||
|
PrintCleaningReqs = TRIM( 'Strip:':SubOxide:' Pre:':SubPreClean:APreRec:' Post:':SubPostClean:APostRec )
|
||||||
|
swap UNIT_MICROMETER$ with 'um' in PrintThickTargets
|
||||||
|
swap UNIT_OHM_CM$ with 'ohm.cm' in PrintThickTargets
|
||||||
|
swap UNIT_OHM_PER_SQ$ with 'ohm/sq' in PrintThickTargets
|
||||||
|
swap UNIT_A$ with 'A' in PrintThickTargets
|
||||||
|
swap UNIT_MICROMETER$ with 'um' in PrintResTargets
|
||||||
|
swap UNIT_OHM_CM$ with 'ohm.cm' in PrintResTargets
|
||||||
|
swap UNIT_OHM_PER_SQ$ with 'ohm/sq' in PrintResTargets
|
||||||
|
swap UNIT_A$ with 'A' in PrintResTargets
|
||||||
|
|
||||||
|
PrintWMInKey = WMInKey
|
||||||
|
CONVERT '*' TO '.' IN PrintWMInKey
|
||||||
|
CassNo = FIELD(WMInKey,'*',3)
|
||||||
|
WOMatKey = WONo:'*':CassNo
|
||||||
|
WOMatRec = XLATE('WO_MAT',WOMatKey,'','X')
|
||||||
|
LotNo = WOMatRec<WO_MAT_LOT_NO$>
|
||||||
|
WfrQty = WOMatRec<WO_MAT_WAFER_QTY$>
|
||||||
|
CustPartNo = WOMatRec<WO_MAT_CUST_PART_NO$>
|
||||||
|
SubPartNo = WOMatRec<WO_MAT_SUB_PART_NO$>
|
||||||
|
OrderItem = WOMatRec<WO_MAT_ORDER_ITEM$>
|
||||||
|
Vendor = WOMatRec<WO_MAT_SUB_VEND_CD$>
|
||||||
|
OrderDetKey = WORec<WO_LOG_ORDER_NO$>:'*':OrderItem
|
||||||
|
LOCATE CustPartNo IN CustEpiPartRec<CUST_EPI_PART_CUST_PART_NO$> USING @VM SETTING Pos THEN
|
||||||
|
CustPartDesc = CustEpiPartRec<CUST_EPI_PART_CUST_PART_DESC$,Pos>
|
||||||
|
END ELSE
|
||||||
|
CustPartDesc = ''
|
||||||
|
END
|
||||||
|
PartNo = CustPartNo
|
||||||
|
PartDesc = CustPartDesc
|
||||||
|
SuppCd = TRIM(SubPartNo[-1,'B-'])
|
||||||
|
IF LEN(SuppCd) NE '2' THEN SuppCd =''
|
||||||
|
If CassNo EQ 1 then
|
||||||
|
SpecEpi = PSRec<prod_spec_spec_epi$>
|
||||||
|
SpecSub = PSRec<PROD_SPEC_SPEC_SUBSTRATE$>
|
||||||
|
ThkSmile = PSRec<PROD_SPEC_THICK_SMILE_REQ$>
|
||||||
|
ThkShift = Field(PSRec, @FM, PROD_SPEC_THICK_LIMIT_SHIFT$)
|
||||||
|
ResShift = Field(PSRec, @FM, PROD_SPEC_RES_LIMIT_SHIFT$)
|
||||||
|
SSRecipe = XLATE('PRS_STAGE', PSNo:'*LWI', 5, 'X')
|
||||||
|
PCRecipe = XLATE('PRS_STAGE', PSNo, 'POST_CLEAN_SURFSCAN_RECIPE', 'X')
|
||||||
|
WaferSize = Field(SpecSub, @VM, QSSubWafersize$)
|
||||||
|
convert char(248) to @fm in SpecEpi ;* char(248) is used to separate layers
|
||||||
|
layerCount = fieldcount( SpecEpi, @fm )
|
||||||
|
layerInfo = SpecEpi<layerCount>
|
||||||
|
// If this is just 1 layer, we're returning that info, if 3 layers, we're returning layer 3 (combo)
|
||||||
|
ThkData = Field(layerInfo, @VM, QSEpiThickMeasure$)
|
||||||
|
ResData = Field(layerInfo, @VM, QSEpiResMeasure$)
|
||||||
|
ConData = Field(layerInfo, @VM, QSEpiConcMeasure$)
|
||||||
|
CResData = Field(layerInfo, @VM, QSEpiCresMeasure$)
|
||||||
|
ThkMin = OCONV(Field(layerInfo, @VM, QSEpiMinThick$), 'MD3')
|
||||||
|
ThkMax = OCONV(Field(layerInfo, @VM, QSEpiMaxThick$), 'MD3')
|
||||||
|
ThkTarg = ''
|
||||||
|
If ThkMin NE '' Then ThkTarg = oConv(iconv((ThkMin+ThkMax)/2, 'MD3'), 'MD3')
|
||||||
|
ResMin = OCONV(Field(layerInfo, @VM, QSEpiResMinThick$), 'MD3')
|
||||||
|
ResMax = OCONV(Field(layerInfo, @VM, QSEpiResMaxThick$), 'MD3')
|
||||||
|
ResTarg = ''
|
||||||
|
If ResMin NE '' Then ResTarg = oConv(iconv((ResMin+ResMax)/2, 'MD3'), 'MD3')
|
||||||
|
ConMin = OCONV(Field(layerInfo, @VM, QSEpiConcMinThick$), 'MD3')
|
||||||
|
ConMax = OCONV(Field(layerInfo, @VM, QSEpiConcMaxThick$), 'MD3')
|
||||||
|
ConTarg = ''
|
||||||
|
If ConMin NE '' Then ConTarg = oConv(iconv((ConMin+ConMax)/2, 'MD3'), 'MD3')
|
||||||
|
CResMin = OCONV(Field(layerInfo, @VM, QSEpiCresMin$), 'MD3')
|
||||||
|
CResMax = OCONV(Field(layerInfo, @VM, QSEpiCresMax$), 'MD3')
|
||||||
|
CResTarg = ''
|
||||||
|
If CResMin NE '' Then CResTarg = oConv(iconv((CResMin+CResMax)/2, 'MD3'), 'MD3')
|
||||||
|
ThkTool = Field(ThkData, '~', PS$TOOL)
|
||||||
|
ThkType = Field(ThkData, '~', PS$TYPE)
|
||||||
|
ThkRecipe = Field(ThkData, '~', PS$RECIPE)
|
||||||
|
ThkFreq = Field(ThkData, '~', PS$FREQ)
|
||||||
|
ThkPattern = Field(ThkData, '~', PS$PATTERN)
|
||||||
|
ResTool = Field(ResData, '~', PS$TOOL)
|
||||||
|
ResType = Field(ResData, '~', PS$TYPE)
|
||||||
|
ResRecipe = Field(ResData, '~', PS$RECIPE)
|
||||||
|
ResFreq = Field(ResData, '~', PS$FREQ)
|
||||||
|
ResPattern = Field(ResData, '~', PS$PATTERN)
|
||||||
|
ConTool = Field(ConData, '~', PS$TOOL)
|
||||||
|
ConType = Field(ConData, '~', PS$TYPE)
|
||||||
|
ConRecipe = Field(ConData, '~', PS$RECIPE)
|
||||||
|
ConFreq = Field(ConData, '~', PS$FREQ)
|
||||||
|
ConPattern = Field(ConData, '~', PS$PATTERN)
|
||||||
|
CResTool = Field(CResData, '~', PS$TOOL)
|
||||||
|
CResType = Field(CResData, '~', PS$TYPE)
|
||||||
|
CResRecipe = Field(CResData, '~', PS$RECIPE)
|
||||||
|
CResFreq = Field(CResData, '~', PS$FREQ)
|
||||||
|
CResPattern = Field(CResData, '~', PS$PATTERN)
|
||||||
|
IF ThkMin EQ '' THEN ThkMin = '--'
|
||||||
|
IF ThkMax EQ '' THEN ThkMax = '--'
|
||||||
|
IF ThkTarg EQ '' THEN ThkTarg = '--'
|
||||||
|
IF ThkTool EQ '' THEN ThkTool = '--'
|
||||||
|
IF ThkType EQ '' THEN ThkType = '--'
|
||||||
|
IF ThkRecipe EQ '' THEN ThkRecipe = '--'
|
||||||
|
IF ThkPattern EQ '' THEN ThkPattern = '--'
|
||||||
|
IF ThkFreq EQ '' THEN ThkFreq = '--'
|
||||||
|
IF ResMin EQ '' THEN ResMin = '--'
|
||||||
|
IF ResMax EQ '' THEN ResMax = '--'
|
||||||
|
IF ResTarg EQ '' THEN ResTarg = '--'
|
||||||
|
IF ResTool EQ '' THEN ResTool = '--'
|
||||||
|
IF ResType EQ '' THEN ResType = '--'
|
||||||
|
IF ResRecipe EQ '' THEN ResRecipe = '--'
|
||||||
|
IF ResPattern EQ '' THEN ResPattern = '--'
|
||||||
|
IF ResFreq EQ '' THEN ResFreq = '--'
|
||||||
|
IF ConMin EQ '' THEN ConMin = '--'
|
||||||
|
IF ConMax EQ '' THEN ConMax = '--'
|
||||||
|
IF ConTarg EQ '' THEN ConTarg = '--'
|
||||||
|
IF ConTool EQ '' THEN ConTool = '--'
|
||||||
|
IF ConType EQ '' THEN ConType = '--'
|
||||||
|
IF ConRecipe EQ '' THEN ConRecipe = '--'
|
||||||
|
IF ConPattern EQ '' THEN ConPattern = '--'
|
||||||
|
IF ConFreq EQ '' THEN ConFreq = '--'
|
||||||
|
IF CResMin EQ '' THEN CResMin = '--'
|
||||||
|
IF CResMax EQ '' THEN CResMax = '--'
|
||||||
|
IF CResTarg EQ '' THEN CResTarg = '--'
|
||||||
|
IF CResTool EQ '' THEN CResTool = '--'
|
||||||
|
IF CResType EQ '' THEN CResType = '--'
|
||||||
|
IF CResRecipe EQ '' THEN CResRecipe = '--'
|
||||||
|
IF CResPattern EQ '' THEN CResPattern = '--'
|
||||||
|
IF CResFreq EQ '' THEN CResFreq = '--'
|
||||||
|
Swap @VM with ' / ' in SSRecipe
|
||||||
|
IF PCRecipe EQ '' Then PCRecipe = '--'
|
||||||
|
If ThkSmile EQ '' OR ThkSmile EQ '0' then
|
||||||
|
ThkSmile = 'N'
|
||||||
|
end else
|
||||||
|
ThkSmile = 'Y'
|
||||||
|
end
|
||||||
|
If ThkShift EQ '' OR ThkShift EQ '0' then
|
||||||
|
ThkShift = 'N'
|
||||||
|
end else
|
||||||
|
ThkShift = 'Y'
|
||||||
|
end
|
||||||
|
If ResShift EQ '' OR ResShift EQ '0' then
|
||||||
|
ResShift = 'N'
|
||||||
|
end else
|
||||||
|
ResShift = 'Y'
|
||||||
|
end
|
||||||
|
if Len(ThkMin) > 6 then
|
||||||
|
ThkMin = ThkMin[1,6]
|
||||||
|
end
|
||||||
|
if Len(ThkMax) > 6 then
|
||||||
|
ThkMax = ThkMax[1,6]
|
||||||
|
end
|
||||||
|
if Len(ThkTarg) > 6 then
|
||||||
|
ThkTarg = ThkTarg[1,6]
|
||||||
|
end
|
||||||
|
if Len(ResMin) > 6 then
|
||||||
|
ResMin = ResMin[1,6]
|
||||||
|
end
|
||||||
|
if Len(ResMax) > 6 then
|
||||||
|
ResMax = ResMax[1,6]
|
||||||
|
end
|
||||||
|
if Len(ResTarg) > 6 then
|
||||||
|
ResTarg = ResTarg[1,6]
|
||||||
|
end
|
||||||
|
if Len(ConMin) > 6 then
|
||||||
|
ConMin = ConMin[1,6]
|
||||||
|
end
|
||||||
|
if Len(ConMax) > 6 then
|
||||||
|
ConMax = ConMax[1,6]
|
||||||
|
end
|
||||||
|
if Len(ConTarg) > 6 then
|
||||||
|
ConTarg = ConTarg[1,6]
|
||||||
|
end
|
||||||
|
if Len(CResMin) > 6 then
|
||||||
|
CResMin = CResMin[1,6]
|
||||||
|
end
|
||||||
|
if Len(CResMax) > 6 then
|
||||||
|
CResMax = CResMax[1,6]
|
||||||
|
end
|
||||||
|
if Len(CResTarg) > 6 then
|
||||||
|
CResTarg = CResTarg[1,6]
|
||||||
|
end
|
||||||
|
****** Begin ZPL
|
||||||
|
ZPL := '^XA'
|
||||||
|
ZPL := '^LH10,0'
|
||||||
|
ZPL := '^PR2' ;* Print speed 2 inches per second
|
||||||
|
ZPL := '^LL406' ;* Label length @203 dpi
|
||||||
|
ZPL := '^PW900'
|
||||||
|
ZPL := '^MD0' ;* Media darkness
|
||||||
|
ZPL := '^MMT' ;* Media mode t=tear off mode
|
||||||
|
****** 1st/2nd Line
|
||||||
|
ZPL := '^FO30,20^A0,,40^FDWO ':WONo:'^FS'
|
||||||
|
ZPL := '^FO590,10^A050,30^FDPSN ':PSNo:'^FS'
|
||||||
|
ZPL := '^FO555,40^A050,30^FDDopant ':Dopant:'^FS'
|
||||||
|
****** 3rd Line - headers
|
||||||
|
ZPL := '^FO85,100^A050,23^FDMin^FS'
|
||||||
|
ZPL := '^FO145,100^A050,23^FDTarg^FS'
|
||||||
|
ZPL := '^FO210,100^A050,23^FDMax^FS'
|
||||||
|
ZPL := '^FO280,100^A050,23^FDTool^FS'
|
||||||
|
ZPL := '^FO330,100^A050,23^FDType^FS'
|
||||||
|
ZPL := '^FO470,100^A050,23^FDRecipe^FS'
|
||||||
|
ZPL := '^FO600,100^A050,23^FDPattern^FS'
|
||||||
|
ZPL := '^FO740,100^A050,23^FDFreq^FS'
|
||||||
|
****** 4th Line - Thickness (Thk)
|
||||||
|
ZPL := '^FO70,130^GB720,0,3^FS'
|
||||||
|
ZPL := '^FO70,130^GB0,160,3^FS'
|
||||||
|
ZPL := '^FO10,140^A050,23^FDThk:^FS'
|
||||||
|
ZPL := '^FO80,140^A050,23^FD':ThkMin:'^FS'
|
||||||
|
ZPL := '^FO145,140^A050,23^FD':ThkTarg:'^FS'
|
||||||
|
ZPL := '^FO210,140^A050,23^FD':ThkMax:'^FS'
|
||||||
|
ZPL := '^FO280,140^A050,23^FD':ThkTool[1,5]:'^FS'
|
||||||
|
ZPL := '^FO330,140^A050,23^FD':ThkType[1,11]:'^FS'
|
||||||
|
ZPL := '^FO470,140^A050,23^FD':ThkRecipe[1,11]:'^FS'
|
||||||
|
ZPL := '^FO600,140^A050,23^FD':ThkPattern[1,11]:'^FS'
|
||||||
|
ZPL := '^FO750,140^A050,23^FD':ThkFreq:'^FS'
|
||||||
|
****** 5th Line - Resistivity (Res)
|
||||||
|
ZPL := '^FO10,170^GB780,0,3^FS'
|
||||||
|
ZPL := '^FO10,180^A050,23^FDRes:^FS'
|
||||||
|
ZPL := '^FO80,180^A050,23^FD':ResMin:'^FS'
|
||||||
|
ZPL := '^FO145,180^A050,23^FD':ResTarg:'^FS'
|
||||||
|
ZPL := '^FO210,180^A050,23^FD':ResMax:'^FS'
|
||||||
|
ZPL := '^FO280,180^A050,23^FD':ResTool[1,5]:'^FS'
|
||||||
|
ZPL := '^FO330,180^A050,23^FD':ResType[1,11]:'^FS'
|
||||||
|
ZPL := '^FO470,180^A050,23^FD':ResRecipe[1,11]:'^FS'
|
||||||
|
ZPL := '^FO600,180^A050,23^FD':ResPattern[1,11]:'^FS'
|
||||||
|
ZPL := '^FO750,180^A050,23^FD':ResFreq:'^FS'
|
||||||
|
****** 6th Line - Contact (Con)
|
||||||
|
ZPL := '^FX***LINE 4'
|
||||||
|
ZPL := '^FO10,210^GB780,0,3^FS'
|
||||||
|
ZPL := '^FO10,220^A050,23^FDCon:^FS'
|
||||||
|
ZPL := '^FO80,220^A050,23^FD':ConMin:'^FS'
|
||||||
|
ZPL := '^FO145,220^A050,23^FD':ConTarg:'^FS'
|
||||||
|
ZPL := '^FO210,220^A050,23^FD':ConMax:'^FS'
|
||||||
|
ZPL := '^FO280,220^A050,23^FD':ConTool[1,5]:'^FS'
|
||||||
|
ZPL := '^FO330,220^A050,23^FD':ConType[1,11]:'^FS'
|
||||||
|
ZPL := '^FO470,220^A050,23^FD':ConRecipe[1,11]:'^FS'
|
||||||
|
ZPL := '^FO600,220^A050,23^FD':ConPattern[1,11]:'^FS'
|
||||||
|
ZPL := '^FO750,220^A050,23^FD':ConFreq:'^FS'
|
||||||
|
****** 7th Line - Contact Resistance (CRes)
|
||||||
|
ZPL := '^FO10,250^GB780,0,3^FS'
|
||||||
|
ZPL := '^FO10,260^A050,23^FDCRes:^FS'
|
||||||
|
ZPL := '^FO80,260^A050,23^FD':CResMin:'^FS'
|
||||||
|
ZPL := '^FO145,260^A050,23^FD':CResTarg:'^FS'
|
||||||
|
ZPL := '^FO210,260^A050,23^FD':CResMax:'^FS'
|
||||||
|
ZPL := '^FO280,260^A050,23^FD':CResTool[1,5]:'^FS'
|
||||||
|
ZPL := '^FO330,260^A050,23^FD':CResType[1,11]:'^FS'
|
||||||
|
ZPL := '^FO470,260^A050,23^FD':CResRecipe[1,11]:'^FS'
|
||||||
|
ZPL := '^FO600,260^A050,23^FD':CResPattern[1,11]:'^FS'
|
||||||
|
ZPL := '^FO750,260^A050,23^FD':CResFreq:'^FS'
|
||||||
|
ZPL := '^FO10,290^GB780,0,3^FS'
|
||||||
|
****** 8th Line - Special Instructions
|
||||||
|
ZPL := '^FO10,310^A050,23^FDSurfScan: ':SSRecipe:'^FS'
|
||||||
|
ZPL := '^FO10,340^A050,23^FDPostClean: ':PCRecipe:'^FS'
|
||||||
|
ZPL := '^FO10,370^A050,23^FDWafer Size: ':WaferSize:'^FS'
|
||||||
|
ZPL := '^FO500,310^A050,23^FDSmile Required: ':ThkSmile:'^FS'
|
||||||
|
ZPL := '^FO500,340^A050,23^FDSPC Thk Shift: ':ThkShift:'^FS'
|
||||||
|
ZPL := '^FO500,370^A050,23^FDSPC Res Shift: ':ResShift:'^FS'
|
||||||
|
ZPL := '^XZ':CRLF$
|
||||||
|
****** End Cheet Sheet ZPL
|
||||||
|
end
|
||||||
|
For cnt = 1 to 2
|
||||||
|
ZPL := '^XA'
|
||||||
|
ZPL := '^LH0,0'
|
||||||
|
ZPL := '^PR2' ;* Print speed 2 inches per second
|
||||||
|
ZPL := '^LL406' ;* Label length @203 dpi
|
||||||
|
ZPL := '^PW900'
|
||||||
|
ZPL := '^MD8' ;* Media darkness
|
||||||
|
ZPL := '^MMT' ;* Media mode t=tear off mode
|
||||||
|
ZPL := '^FO15,15^GB795,398,3,B^FS' ;* Border
|
||||||
|
ZPL:= '^FO680,25^A0,36^FDWM In^FS'
|
||||||
|
****** First Line
|
||||||
|
Company = 'IFX Epi Services'
|
||||||
|
ZPL := '^FO30,25^A0,,36^FD':Company:'^FS'
|
||||||
|
ZPL := '^FO290,25^AC,18^FDWO No:^FS':CRLF$
|
||||||
|
ZPL := '^FO370,25^A045,36^FD':PrintWONo:'^FS':CRLF$
|
||||||
|
IF CassNo = 1 THEN
|
||||||
|
ZPL := '^FO535,20^GB120,40,40,,3^FS':CRLF$
|
||||||
|
ZPL := '^FO540,25^AC,18^FR^FDCass:^FS':CRLF$
|
||||||
|
ZPL := '^FO600,25^A045,36^FR^FD':CassNo:'^FS':CRLF$
|
||||||
|
END ELSE
|
||||||
|
ZPL := '^FO540,25^AC,18^FDCass:^FS':CRLF$
|
||||||
|
ZPL := '^FO600,25^A045,36^FD':CassNo:'^FS':CRLF$
|
||||||
|
END
|
||||||
|
****** Second Line
|
||||||
|
ZPL := '^FO30,70^AC,18^FDWM In:^FS':CRLF$
|
||||||
|
ZPL := '^FO120,70^A050,30^FD':PrintWMInKey:'^FS':CRLF$
|
||||||
|
ZPL := '^BY2,2.0':CRLF$
|
||||||
|
ZPL := '^FO300,60^B3,,37,N^FD':'I':PrintWMInKey:'^FS':CRLF$
|
||||||
|
ZPL := '^BY2,3.0':CRLF$
|
||||||
|
ZPL := '^FO700,70^AC,18^FDQty:^FS':CRLF$
|
||||||
|
ZPL := '^FO760,70^A045,25^FD':WfrQty:'^FS':CRLF$
|
||||||
|
****** Third Line
|
||||||
|
ZPL := '^FO30,105^AC,18^FDShip Dt:^FS'
|
||||||
|
ZPL := '^FO140,105^A0,,25^FD':ReqShipDate:'^FS':CRLF$
|
||||||
|
ZPL := '^FO250,105^AC,18^FDCust:^FS':CRLF$
|
||||||
|
ZPL := '^FO320,105^A045,25^FD':CustName:'^FS':CRLF$
|
||||||
|
ZPL := '^FO560,105^AC,18^FDPO:^FS':CRLF$
|
||||||
|
ZPL := '^FO600,105^A045,25^FD':PONo:'^FS':CRLF$
|
||||||
|
****** Separator bar
|
||||||
|
ZPL := '^FO15,128^GB795,1^FS'
|
||||||
|
****** Fourth Line
|
||||||
|
ZPL := '^FO30,135^AC,18^FDLot No:^FS':CRLF$
|
||||||
|
ZPL := '^FO120,135^A0,20^FD':LotNo:'^FS':CRLF$
|
||||||
|
ZPL := '^FO410,135^AC,18^FDPart No:^FS':CRLF$
|
||||||
|
ZPL := '^FO510,135^A0,20^FD':PartNo:'^FS':CRLF$
|
||||||
|
****** Fifth Line
|
||||||
|
ZPL := '^FO30,160^AC,18^FDSub PN:^FS':CRLF$
|
||||||
|
ZPL := '^FO120,160^A0,20^FD':SubPartNo:'^FS':CRLF$
|
||||||
|
IF SuppCd NE '' THEN
|
||||||
|
ZPL := '^FO410,160^AC,18^FDSupp Cd:^FS':CRLF$
|
||||||
|
ZPL := '^FO510,160^A0,20^FD':SuppCd:'^FS':CRLF$
|
||||||
|
ZPL := '^BY2,2.0':CRLF$
|
||||||
|
ZPL := '^FO610,160^A040,20^B3,,23,N^FD':SuppCd:'^FS':CRLF$
|
||||||
|
ZPL := '^BY2,3.0':CRLF$
|
||||||
|
END
|
||||||
|
****** Separator bar
|
||||||
|
ZPL := '^FO15,183^GB795,1^FS'
|
||||||
|
****** Seventh Line
|
||||||
|
ZPL := '^FO30,210^AC,18^FDPre:^FS':CRLF$
|
||||||
|
ZPL := '^FO90,210^A0,20^FD':SubPreClean:'^FS':CRLF$
|
||||||
|
IF PreAkrionRecipe NE '' THEN
|
||||||
|
ZPL := '^FO210,210^AC,18^FDAkrion:^FS':CRLF$
|
||||||
|
ZPL := '^FO300,210^A0,20^FD':PreAkrionRecipe:'^FS':CRLF$
|
||||||
|
ZPL := '^BY2,2.0':CRLF$
|
||||||
|
ZPL := '^FO450,210^A040,20^B3,,23,N^FD':PreAkrionRecipe:'^FS':CRLF$
|
||||||
|
ZPL := '^BY2,3.0':CRLF$
|
||||||
|
END
|
||||||
|
****** Eighth Line
|
||||||
|
ZPL := '^FO30,235^AC,18^FDRecipe:^FS':CRLF$
|
||||||
|
ZPL := '^FO120,235^A0,20^FD':RecipeInfo:'^FS':CRLF$
|
||||||
|
ZPL := '^FO410,235^AC,18^FDEpi Dopant:^FS':CRLF$
|
||||||
|
ZPL := '^FO560,235^A040,20^FD':Dopant:'^FS':CRLF$
|
||||||
|
****** Tenth, Eleventh and Twelfth Lines
|
||||||
|
ZPL := '^FO30,285^AC,18^FDThk Spec:^FS':CRLF$
|
||||||
|
FOR M = 1 TO COUNT(PrintThickTargets,@VM) + (PrintThickTargets NE '')
|
||||||
|
BaseLine = 285 + (M-1)*20
|
||||||
|
ZPL := '^FO140,':BaseLine:'^A040,20^FD':PrintThickTargets<1,M>:'^FS':CRLF$
|
||||||
|
NEXT M
|
||||||
|
ZPL := '^FO410,285^AC,18^FDRes Spec:^FS':CRLF$
|
||||||
|
FOR M = 1 TO COUNT(PrintResTargets,@VM) + (PrintResTargets NE '')
|
||||||
|
BaseLine = 285 + (M-1)*20
|
||||||
|
ZPL := '^FO520,':BaseLine:'^A040,20^FD':PrintResTargets<1,M>:'^FS':CRLF$
|
||||||
|
NEXT M
|
||||||
|
****** Separator bar
|
||||||
|
ZPL := '^FO15,373^GB795,1^FS'
|
||||||
|
****** Fourteenth Line
|
||||||
|
ZPL := '^FO30,385^AC,18^FDProd Spec No:^FS':CRLF$
|
||||||
|
ZPL := '^FO190,385^A0,25^FD':PSNo:'^FS':CRLF$
|
||||||
|
IF SpecType = 'Production' THEN
|
||||||
|
SpecType = 'Prod'
|
||||||
|
end else IF SpecType = 'Pre-Production' THEN
|
||||||
|
SpecType = 'Pre'
|
||||||
|
end
|
||||||
|
ZPL := '^FO275,385^AC,18^FDSpec Type:^FS':CRLF$
|
||||||
|
ZPL := '^FO400,385^A0,25^FD':SpecType:'^FS':CRLF$
|
||||||
|
****** Data Matrix barcode
|
||||||
|
ZPL := '^FO720,280^CI28':CRLF$
|
||||||
|
ZPL := '^BXN,2,200^FDP':PartNo:'|S':SubPartNo:'|1T':PrintWMInKey:'|2T':LotNo:'|':PSNo:'|Q':WfrQty:'|1V':Vendor:'|SEQ':Cnt:'^FS':CRLF$
|
||||||
|
ZPL:= '^XZ'
|
||||||
|
Next
|
||||||
|
* Check to see if they get the monitor wafers based on the PSN
|
||||||
|
MonitorWafer = CustEpiPartRec<CUST_EPI_PART_MONITOR_WAFER_LABEL$>
|
||||||
|
IF MonitorWafer THEN
|
||||||
|
RDSIds = ''
|
||||||
|
ZPL := '^XA^CFD'
|
||||||
|
ZPL := '^LH0,0'
|
||||||
|
ZPL := '^PR2' ;* Print speed 2 inches per second
|
||||||
|
ZPL := '^LL325' ;* Label length in dots
|
||||||
|
ZPL := '^MD15' ;* Media darkness
|
||||||
|
ZPL := '^MMT':CRLF$ ;* Media mode t=tear off mode
|
||||||
|
ZPL := '^FO30,30^A060,40^FDMonitor Wafer^FS':CRLF$
|
||||||
|
ZPL := '^FO550,30^A060,40^FDReactor#_____^FS':CRLF$
|
||||||
|
ZPL := '^FO30,70^A060,40^FDDate_____________^FS':CRLF$
|
||||||
|
ZPL := '^FO30,130^A060,40^FDCustomer Name: ':CustName<I>:'^FS':CRLF$
|
||||||
|
ZPL := '^FO30,190^A060,40^FDRDS#: ':RDSIds<I>:'^FS':CRLF$
|
||||||
|
ZPL := '^FO400,190^A060,40^FDLot#: ':LotNo<I>:'^FS':CRLF$
|
||||||
|
ZPL := '^FO30,250^A060,40^FDThick Avg__________^FS':CRLF$
|
||||||
|
ZPL := '^FO400,250^A060,40^FDWafer Type__________^FS':CRLF$
|
||||||
|
ZPL := '^FO30,280^A060,40^FDRes Avg____________^FS':CRLF$
|
||||||
|
ZPL := '^FO400,280^A060,40^FDWafer Type__________^FS':CRLF$
|
||||||
|
ZPL := '^XZ'
|
||||||
|
END
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. WM_IN ':WmInKey:' does not exist.'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Null WmInKey passed in.'
|
||||||
|
end
|
||||||
|
|
||||||
|
If ErrorMsg EQ '' then
|
||||||
|
Response = ZPL
|
||||||
|
end else
|
||||||
|
Error_Services('Add', ErrorMsg)
|
||||||
|
end
|
||||||
|
|
||||||
|
end service
|
||||||
|
|
||||||
|
|
||||||
|
Service ConvertRecordToJSON(KeyID, Record, ItemURL)
|
||||||
|
|
||||||
|
jsonRecord = ''
|
||||||
|
|
||||||
|
If KeyID NE '' then
|
||||||
|
|
||||||
|
If Record EQ '' then Record = Database_Services('ReadDataRow', 'WM_IN', KeyID)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
@DICT = Database_Services('GetTableHandle', 'DICT.WM_IN')
|
||||||
|
@ID = KeyID
|
||||||
|
@RECORD = Record
|
||||||
|
objJSON = ''
|
||||||
|
If SRP_JSON(objJSON, 'New', 'Object') then
|
||||||
|
objWmIn = ''
|
||||||
|
If SRP_JSON(objWmIn, 'New', 'Object') then
|
||||||
|
SRP_JSON(objWmIn, 'SetValue', 'keyId', @ID)
|
||||||
|
SRP_JSON(objJSON, 'Set', 'wmIn', objWmIn)
|
||||||
|
SRP_JSON(objWmIn, 'Release')
|
||||||
|
end
|
||||||
|
|
||||||
|
If itemURL NE '' then
|
||||||
|
// The itemURL was passed in so add HAL+JSON properties.
|
||||||
|
// Create the _links property and then all link objects needed for this resource.
|
||||||
|
objLinks = ''
|
||||||
|
If SRP_JSON(objLinks, 'New', 'Object') then
|
||||||
|
// Create a self link.
|
||||||
|
objLink = ''
|
||||||
|
If SRP_JSON(objLink, 'New', 'Object') then
|
||||||
|
SRP_JSON(objLink, 'SetValue', 'href', ItemURL, 'String')
|
||||||
|
SRP_JSON(objLink, 'SetValue', 'title', 'Self', 'String')
|
||||||
|
SRP_JSON(objLinks, 'Set', 'self', objLink)
|
||||||
|
SRP_JSON(objLink, 'Release')
|
||||||
|
end
|
||||||
|
SRP_JSON(objJSON, 'Set', '_links', objLinks)
|
||||||
|
SRP_JSON(objLinks, 'Release')
|
||||||
|
end
|
||||||
|
// Create the _class property for this resource.
|
||||||
|
SRP_JSON(objJSON, 'SetValue', '_class', 'resource')
|
||||||
|
end
|
||||||
|
jsonRecord = SRP_JSON(objJSON, 'Stringify', 'Styled')
|
||||||
|
SRP_JSON(objJSON, 'Release')
|
||||||
|
end else
|
||||||
|
Error_Services('Add', 'Unable to create JSON representation in the ' : Service : ' service.')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Error_Services('Add', 'KeyID argument was missing in the ' : Service : ' service.')
|
||||||
|
end
|
||||||
|
|
||||||
|
Response = jsonRecord
|
||||||
|
|
||||||
|
End Service
|
||||||
|
|
||||||
|
130
LSL2/STPROC/WM_OUT_API.txt
Normal file
130
LSL2/STPROC/WM_OUT_API.txt
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
Function WM_OUT_API(@API)
|
||||||
|
/***********************************************************************************************************************
|
||||||
|
|
||||||
|
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
|
||||||
|
permission from SRP Computer Solutions, Inc.
|
||||||
|
|
||||||
|
Name : WM_OUT_Api
|
||||||
|
|
||||||
|
Description : API logic for the WM_OUT resource.
|
||||||
|
|
||||||
|
Notes : All web APIs should include the API_SETUP insert. This will provide several useful variables:
|
||||||
|
|
||||||
|
HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.)
|
||||||
|
APIURL - The URL for the API entry point (e.g., api.mysite.com/v1).
|
||||||
|
FullEndpointURL - The URL submitted by the client, including query params.
|
||||||
|
FullEndpointURLNoQuery - The URL submitted by the client, excluding query params.
|
||||||
|
EndpointSegment - The URL endpoint segment.
|
||||||
|
ParentURL - The URL path preceeding the current endpoint.
|
||||||
|
CurrentAPI - The name of this stored procedure.
|
||||||
|
|
||||||
|
Parameters :
|
||||||
|
API [in] -- Web API to process. Format is [APIPattern].[HTTPMethod]:
|
||||||
|
- APIPattern must follow this structure Rds[.ID.[<Property>]]
|
||||||
|
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||||
|
Examples:
|
||||||
|
- Rds.POST
|
||||||
|
- Rds.ID.PUT
|
||||||
|
- Rds.ID.firstName.GET
|
||||||
|
Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API
|
||||||
|
services do not rely upon anything being returned in the response. This is what the
|
||||||
|
various services like SetResponseBody and SetResponseStatus services are for. A response
|
||||||
|
value is only helpful if the developers want to use it for debug purposes.
|
||||||
|
|
||||||
|
History : (Date, Initials, Notes)
|
||||||
|
08/28/25 djs Original programmer.
|
||||||
|
|
||||||
|
***********************************************************************************************************************/
|
||||||
|
|
||||||
|
#pragma precomp SRP_PreCompiler
|
||||||
|
|
||||||
|
$insert APP_INSERTS
|
||||||
|
$insert API_SETUP
|
||||||
|
$insert HTTP_INSERTS
|
||||||
|
|
||||||
|
Declare function WM_Out_Services
|
||||||
|
|
||||||
|
GoToAPI else
|
||||||
|
// The specific resource endpoint doesn't have a API handler yet.
|
||||||
|
HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.')
|
||||||
|
end
|
||||||
|
|
||||||
|
Return Response OR ''
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Endpoint Handlers
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
API wm_out.ID.HEAD
|
||||||
|
API wm_out.ID.GET
|
||||||
|
|
||||||
|
GoSub CreateHALItem
|
||||||
|
|
||||||
|
end api
|
||||||
|
|
||||||
|
API wm_out.ID.zpl.HEAD
|
||||||
|
API wm_out.ID.zpl.GET
|
||||||
|
|
||||||
|
GoSub CreateZPLItem
|
||||||
|
|
||||||
|
end api
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Internal GoSubs
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
// CreateHALItem
|
||||||
|
//
|
||||||
|
// Creates a HAL+JSON object based on the OpenInsight data row representation of the scan.
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
CreateHALItem:
|
||||||
|
|
||||||
|
WMOutKey = EndpointSegment
|
||||||
|
Convert '-' to '*' in WMOutKey
|
||||||
|
WmOutJson = WM_Out_Services('ConvertRecordToJSON', WMOutKey, '', FullEndpointURL)
|
||||||
|
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
StatusCode = 200
|
||||||
|
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||||
|
HTTP_Services('SetResponseBody', WmOutJson, False$, 'application/hal+json')
|
||||||
|
If Assigned(Message) then
|
||||||
|
HTTP_Services('SetResponseStatus', StatusCode, Message)
|
||||||
|
end else
|
||||||
|
HTTP_Services('SetResponseStatus', StatusCode)
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Message = Error_Services('GetMessage')
|
||||||
|
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
|
||||||
|
end
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
// CreateZPLItem
|
||||||
|
//
|
||||||
|
// Creates a HAL+JSON object with the ZPL for the given WM_IN row
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
CreateZPLItem:
|
||||||
|
|
||||||
|
WmOutKey = ParentSegment
|
||||||
|
ZPL = Wm_Out_Services('GetWmOutZpl', WmOutKey)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
StatusCode = 200
|
||||||
|
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||||
|
HTTP_Services('SetResponseBody', ZPL, False$, 'text/plain')
|
||||||
|
If Assigned(Message) then
|
||||||
|
HTTP_Services('SetResponseStatus', StatusCode, Message)
|
||||||
|
end else
|
||||||
|
HTTP_Services('SetResponseStatus', StatusCode)
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Message = Error_Services('GetMessage')
|
||||||
|
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
|
||||||
|
end
|
||||||
|
|
||||||
|
return
|
@ -49,7 +49,7 @@ Compile function WM_Out_Services(@Service, @Params)
|
|||||||
#pragma precomp SRP_PreCompiler
|
#pragma precomp SRP_PreCompiler
|
||||||
|
|
||||||
$Insert SERVICE_SETUP
|
$Insert SERVICE_SETUP
|
||||||
$Insert LOGICAL
|
$Insert APP_INSERTS
|
||||||
$Insert MSG_EQUATES
|
$Insert MSG_EQUATES
|
||||||
$Insert DICT_EQUATES
|
$Insert DICT_EQUATES
|
||||||
$Insert WM_OUT_EQUATES
|
$Insert WM_OUT_EQUATES
|
||||||
@ -57,6 +57,12 @@ $Insert WO_MAT_EQUATES
|
|||||||
$Insert WO_LOG_EQUATES
|
$Insert WO_LOG_EQUATES
|
||||||
$Insert COMPANY_EQUATES
|
$Insert COMPANY_EQUATES
|
||||||
$Insert RETURN_TO_FAB_LOTS_EQUATES
|
$Insert RETURN_TO_FAB_LOTS_EQUATES
|
||||||
|
$INSERT PROD_SPEC_EQUATES
|
||||||
|
$INSERT WO_STEP_EQUATES
|
||||||
|
$INSERT EPI_PART_EQUATES
|
||||||
|
$INSERT CUST_EPI_PART_EQUATES
|
||||||
|
$INSERT PRS_STAGE_EQUATES
|
||||||
|
$insert UNIT_EQUATES
|
||||||
|
|
||||||
Declare function Database_Services, SRP_JSON, Error_Services, Clean_Insp_Services, WO_Mat_QA_Services
|
Declare function Database_Services, SRP_JSON, Error_Services, Clean_Insp_Services, WO_Mat_QA_Services
|
||||||
Declare function PSN_Services, SRP_Rotate_Array, Datetime, Return_To_Fab_Services, Environment_Services
|
Declare function PSN_Services, SRP_Rotate_Array, Datetime, Return_To_Fab_Services, Environment_Services
|
||||||
@ -64,13 +70,15 @@ Declare function Logging_Services
|
|||||||
Declare subroutine Database_Services, SRP_JSON, Error_Services, Extract_Si_Keys, Set_Status, obj_wo_mat_log
|
Declare subroutine Database_Services, SRP_JSON, Error_Services, Extract_Si_Keys, Set_Status, obj_wo_mat_log
|
||||||
Declare subroutine Logging_Services, Btree.Extract
|
Declare subroutine Logging_Services, Btree.Extract
|
||||||
|
|
||||||
GoToService
|
GoToService else
|
||||||
|
Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
|
||||||
|
end
|
||||||
|
|
||||||
Return Response or ""
|
Return Response else ''
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// SERVICES
|
// Services
|
||||||
//-----------------------------------------------------------------------------
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
@ -671,3 +679,273 @@ Service GetWMOutKeys(WOLogId)
|
|||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
|
Service GetWmOutZpl(WmOutKey)
|
||||||
|
|
||||||
|
ZPL = ''
|
||||||
|
ErrorMsg = ''
|
||||||
|
If WmOutKey NE '' then
|
||||||
|
Swap '-' with '*' in WmOutKey
|
||||||
|
Swap '.' with '*' in WmOutKey
|
||||||
|
If RowExists('WM_OUT', WmOutKey) then
|
||||||
|
WONo = Field(WmOutKey, '*', 1, 1)
|
||||||
|
WOStep = Field(WmOutKey, '*', 2, 1)
|
||||||
|
WOStepKeys = XLATE('WO_LOG', WONo, WO_LOG_WO_STEP_KEY$, 'X')
|
||||||
|
IF INDEX(WOStepKeys,@VM,1) THEN
|
||||||
|
PrintWONo = WONo:'.':WOStep
|
||||||
|
END ELSE
|
||||||
|
PrintWONo = WONo
|
||||||
|
END
|
||||||
|
WORec = XLATE('WO_LOG',WONo,'','X')
|
||||||
|
ReqShipDate = OCONV(WORec<WO_LOG_PROMISE_SHIP_DT$>,'D2/')
|
||||||
|
CustNo = WORec<WO_LOG_CUST_NO$>
|
||||||
|
CustName = XLATE('COMPANY',CustNo,'ABBREV_OR_CO_NAME','X')
|
||||||
|
Captive = XLATE('COMPANY',CustNo,'CAPTIVE','X')
|
||||||
|
PONo = WORec<WO_LOG_CUST_PO_NO$>
|
||||||
|
PSNo = XLATE('WO_STEP',WONo:'*':WOStep,WO_STEP_PROD_SPEC_ID$,'X')
|
||||||
|
PSRec = XLATE('PROD_SPEC',PSNo,'','X')
|
||||||
|
|
||||||
|
CustSpecNo = ''
|
||||||
|
IF Captive THEN
|
||||||
|
CustSpecNos = PSRec<PROD_SPEC_SPEC_NUM$>
|
||||||
|
CustSpecDescs = PSRec<PROD_SPEC_SPEC_DESC$>
|
||||||
|
CustSpecRevNos = PSRec<PROD_SPEC_REV_NUM$>
|
||||||
|
CustSpecRevDts = PSRec<PROD_SPEC_REV_DATE$>
|
||||||
|
SpecCnt = COUNT(CustSpecNos,@VM) + (CustSpecNos NE '')
|
||||||
|
FOR I = 1 TO SpecCnt
|
||||||
|
IF CustSpecDescs<1,I> _EQC 'GENERAL' THEN
|
||||||
|
CustSpecNo = CustSpecNos<1,I>
|
||||||
|
CustSpecDesc = CustSpecDescS<1,I>
|
||||||
|
CustSpecRevNo = CustSpecRevNos<1,I>
|
||||||
|
CustSpecRevDt = OCONV(CustSpecRevDts<1,I>,'D4/')
|
||||||
|
END
|
||||||
|
UNTIL CustSpecNo NE ''
|
||||||
|
NEXT I
|
||||||
|
END
|
||||||
|
|
||||||
|
EpiPartNo = WORec<WO_LOG_EPI_PART_NO$>
|
||||||
|
CustEpiPartRec = XLATE('CUST_EPI_PART',CustNo:'*':EpiPartNo,'','X')
|
||||||
|
ShipBagReq = CustEpiPartRec<CUST_EPI_PART_SHIP_BAG_REQ$>
|
||||||
|
PreSurfscan = XLATE('PRS_STAGE',PSNo:'*PRE',PRS_STAGE_SURFSCAN_SIG_REQ$,'X')
|
||||||
|
FirstSurfscan = XLATE('PRS_STAGE',PSNo:'*WFR',PRS_STAGE_SURFSCAN_SIG_REQ$,'X')
|
||||||
|
PostCleanSurfScan = XLATE('PRS_STAGE',PSNo:'*POST',PRS_STAGE_SURFSCAN_SIG_REQ$,'X')
|
||||||
|
PostCleanSSSampleQty = XLATE('PRS_STAGE',PSNo:'*POST',PRS_STAGE_SS_SAMP_QTY$, 'X' )
|
||||||
|
PostCleanSurfscanRecipe = XLATE('PRS_STAGE',PSNo:'*POST',PRS_STAGE_SURFSCAN_RECIPE$,'X')
|
||||||
|
PostCleanSurfDefects = XLATE('PRS_STAGE',PSNo:'*POST',PRS_STAGE_SURF_DEFECTS$,'X')
|
||||||
|
PostCleanSurfHaze = OCONV(XLATE('PRS_STAGE',PSNo:'*POST',PRS_STAGE_SURF_HAZE$,'X'),'MD2')
|
||||||
|
SubPreClean = XLATE('PRS_STAGE',PSNo:'*PRE','TOOL_DISPLAY','X')
|
||||||
|
SubPostClean = XLATE('PRS_STAGE',PSNo:'*POST','TOOL_DISPLAY','X')
|
||||||
|
PreCleanTool = XLATE('PRS_STAGE',PSNo:'*PRE','TOOL_DISPLAY','X')
|
||||||
|
PostCleanTool = XLATE('PRS_STAGE',PSNo:'*POST','TOOL_DISPLAY','X')
|
||||||
|
PreAkrionRecipe = XLATE('PRS_STAGE',PSNo:'*PRE',PRS_STAGE_CLEAN_RECIPE$,'X')
|
||||||
|
PostAkrionRecipe = XLATE('PRS_STAGE',PSNo:'*POST',PRS_STAGE_CLEAN_RECIPE$,'X')
|
||||||
|
* * * * * * * * Following needs update to point to the PRS_LAYER & PRS_STAGE tables as required.
|
||||||
|
* * * * * * * * It's the required part that needs sorted out JCH 1/28/2014
|
||||||
|
RecipeNo = XLATE( 'PROD_SPEC', PSNo, 'RECIPE_NO_L1', 'X' )
|
||||||
|
RecipeName = XLATE( 'PROD_SPEC', PSNo, 'RECIPE_NAME_L1', 'X' )
|
||||||
|
SpecType = OCONV( XLATE( 'PROD_SPEC', PSNo, 'SPEC_TYPE', 'X' ), '[SPEC_TYPE_CONV]' )
|
||||||
|
SubOxide = OCONV( XLATE( 'PROD_SPEC', PSNo, 'SUB_OXIDE_STRIP', 'X' ), 'B' )
|
||||||
|
ThickTarget = OCONV( XLATE( 'PROD_SPEC', PSNo, 'THICK_TARGET_ALL', 'X' ), 'MD3' )
|
||||||
|
ResTarget = OCONV( XLATE( 'PROD_SPEC', PSNo, 'RES_TARGET_ALL', 'X' ), 'MD3' )
|
||||||
|
ThickUnit = XLATE( 'PROD_SPEC', PSNo, 'THICK_UNITS_ALL', 'X' )
|
||||||
|
ResUnit = XLATE( 'PROD_SPEC', PSNo , 'RES_UNITS_ALL', 'X' )
|
||||||
|
Dopant = XLATE( 'PROD_SPEC', PSNo, 'DOPANT_L1', 'X' )
|
||||||
|
RecipeNo = XLATE( 'PROD_SPEC', PSNo, 'RECIPE_NO', 'X' )
|
||||||
|
RecipeInfo = XLATE( 'RECIPE', RecipeNo, 'RECIPE_NAME_NO', 'X' )
|
||||||
|
CleaningReqs = ''
|
||||||
|
|
||||||
|
ThickCnt = FIELDCOUNT( ThickTarget<1>, @VM )
|
||||||
|
PrintThickTargets = ''
|
||||||
|
FOR J = 1 TO ThickCnt
|
||||||
|
PrintThickTargets<1,J> = ThickTarget<1,J>:ThickUnit<1,J>
|
||||||
|
NEXT J
|
||||||
|
|
||||||
|
ResCnt = FIELDCOUNT( ResTarget<1>, @VM )
|
||||||
|
PrintResTargets = ''
|
||||||
|
FOR J = 1 TO ResCnt
|
||||||
|
IF ResTarget<1,J>[1,1] = '.' THEN
|
||||||
|
TargetVal = '0':ResTarget<1,J>
|
||||||
|
END ELSE
|
||||||
|
TargetVal = ResTarget<1,J>
|
||||||
|
END
|
||||||
|
PrintResTargets<1,J> = TargetVal:ResUnit<1,J>
|
||||||
|
NEXT J
|
||||||
|
|
||||||
|
APreRec = ''
|
||||||
|
APostRec = ''
|
||||||
|
IF ( PreAkrionRecipe<1> <> '' ) THEN
|
||||||
|
APreRec = ' ':PreAkrionRecipe:' '
|
||||||
|
SubOxide = 'No' ;* If Akrion then no oxide strip
|
||||||
|
END
|
||||||
|
|
||||||
|
IF ( PostAkrionRecipe<1> <> '' ) THEN
|
||||||
|
APostRec = ' ':PostAkrionRecipe
|
||||||
|
END
|
||||||
|
|
||||||
|
PrintCleaningReqs = TRIM( 'Strip:':SubOxide:' Pre:':SubPreClean:APreRec:' Post:':SubPostClean:APostRec )
|
||||||
|
|
||||||
|
swap UNIT_MICROMETER$ with 'um' in PrintThickTargets
|
||||||
|
swap UNIT_OHM_CM$ with 'ohm.cm' in PrintThickTargets
|
||||||
|
swap UNIT_OHM_PER_SQ$ with 'ohm/sq' in PrintThickTargets
|
||||||
|
swap UNIT_A$ with 'A' in PrintThickTargets
|
||||||
|
|
||||||
|
swap UNIT_MICROMETER$ with 'um' in PrintResTargets
|
||||||
|
swap UNIT_OHM_CM$ with 'ohm.cm' in PrintResTargets
|
||||||
|
swap UNIT_OHM_PER_SQ$ with 'ohm/sq' in PrintResTargets
|
||||||
|
swap UNIT_A$ with 'A' in PrintResTargets
|
||||||
|
|
||||||
|
MakeupBox = XLATE('WM_OUT',WMOutKey,WM_OUT_MAKEUP_BOX$ ,'X')
|
||||||
|
|
||||||
|
PrintWMOutKey = WMOutKey
|
||||||
|
CONVERT '*' TO '.' IN PrintWMOutKey
|
||||||
|
|
||||||
|
CassNo = FIELD(WMOutKey,'*',3)
|
||||||
|
LotNo = 'Multiple'
|
||||||
|
WfrQty = XLATE('WM_OUT',WMOutKey,'WFRS_SCHED','X')
|
||||||
|
SubPartNo = WORec<WO_LOG_ORD_SUB_PART_NO$>
|
||||||
|
CustPartNo = WORec<WO_LOG_CUST_PART_NO$>
|
||||||
|
EpiPartNo = WORec<WO_LOG_EPI_PART_NO$>
|
||||||
|
CustPartDesc = XLATE('EPI_PART',EpiPartNo,EPI_PART_EPI_PART_DESC$,'X')
|
||||||
|
PartNo = CustPartNo ;* Temporary for 4x2 to 4x4 conversion
|
||||||
|
PartDesc = CustPartDesc ;* Temporary for 4x2 to 4x4 conversion
|
||||||
|
SubVendCode = WORec<WO_LOG_EXP_VEND_CD$>
|
||||||
|
Vendor = XLATE('SEMI_VEND_CODE', SubVendCode, 'EPI_VEND_CD', 'X')
|
||||||
|
|
||||||
|
SuppCd = TRIM(SubPartNo[-1,'B-'])
|
||||||
|
IF LEN(SuppCd) NE '2' THEN SuppCd =''
|
||||||
|
|
||||||
|
For cnt = 1 to 2
|
||||||
|
***** Start of label ZPL
|
||||||
|
ZPL := '^XA'
|
||||||
|
***** Label setup
|
||||||
|
ZPL := '^LH0,0'
|
||||||
|
ZPL := '^PR2' ;* Print speed 2 inches per second
|
||||||
|
ZPL := '^LL406' ;* Label length 203 dpi
|
||||||
|
ZPL := '^PW900' ;* Print width 900 dpi
|
||||||
|
ZPL := '^MD2' ;* Media darkness
|
||||||
|
ZPL := '^MMT':CRLF$ ;* Media mode t=tear off mode
|
||||||
|
***** Border
|
||||||
|
ZPL := '^FO10,5^GB795,398,3,B^FS':CRLF$
|
||||||
|
****** First Line
|
||||||
|
Company = 'IFX Epi Services'
|
||||||
|
ZPL := '^FO30,20^A0,45,36^FD':Company:'^FS':CRLF$
|
||||||
|
ZPL := '^FO290,25^AC,18^FDWO No:^FS':CRLF$
|
||||||
|
ZPL := '^FO370,20^A045,36^FD':PrintWONo:'^FS':CRLF$
|
||||||
|
IF CassNo = 1 THEN
|
||||||
|
ZPL := '^FO535,15^GB120,40,40,,3^FS':CRLF$
|
||||||
|
ZPL := '^FO540,25^AC,18^FR^FDCass:^FS':CRLF$
|
||||||
|
ZPL := '^FO600,20^A045,36^FR^FD':CassNo:'^FS':CRLF$
|
||||||
|
END ELSE
|
||||||
|
ZPL := '^FO540,25^AC,18^FDCass:^FS':CRLF$
|
||||||
|
ZPL := '^FO600,20^A045,36^FD':CassNo:'^FS':CRLF$
|
||||||
|
END
|
||||||
|
ZPL:= '^FO665,20^A045,36^FDWM Out^FS':CRLF$
|
||||||
|
****** Second Line
|
||||||
|
ZPL:= '^FO30,70^AC,18^FDWM Out:^FS':CRLF$
|
||||||
|
ZPL:= '^FO120,65^A050,30^FD':PrintWMOutKey:'^FS':CRLF$
|
||||||
|
ZPL := '^BY2,2.0':CRLF$
|
||||||
|
ZPL := '^FO300,58^B3,,37,N^FD':'O':PrintWMOutKey:'^FS':CRLF$
|
||||||
|
ZPL := '^BY2,3.0':CRLF$
|
||||||
|
ZPL:= '^FO700,60^AC,18^FDQty:^FS':CRLF$
|
||||||
|
ZPL:= '^FO760,60^A045,25^FD':WfrQty:'^FS':CRLF$
|
||||||
|
****** Third Line
|
||||||
|
ZPL:= '^FO30,100^AC,18^FDShip Dt:^FS':CRLF$
|
||||||
|
ZPL:= '^FO140,100^A0,,25^FD':ReqShipDate:'^FS':CRLF$
|
||||||
|
ZPL:= '^FO250,100^AC,18^FDCust:^FS':CRLF$
|
||||||
|
ZPL:= '^FO320,100^A045,25^FD':CustName:'^FS':CRLF$
|
||||||
|
ZPL:= '^FO560,100^AC,18^FDPO:^FS':CRLF$
|
||||||
|
ZPL:= '^FO600,100^A045,25^FD':PONo:'^FS':CRLF$
|
||||||
|
****** Separator bar
|
||||||
|
ZPL:= '^FO15,125^GB790,1^FS':CRLF$
|
||||||
|
****** Fourth Line
|
||||||
|
ZPL := '^FO30,130^AC,18^FDLot No:^FS':CRLF$
|
||||||
|
ZPL := '^FO120,130^A0,20^FD':LotNo:'^FS':CRLF$
|
||||||
|
ZPL := '^FO410,130^AC,18^FDPart No:^FS':CRLF$
|
||||||
|
ZPL := '^FO510,130^A0,20^FD':PartNo:'^FS':CRLF$
|
||||||
|
****** Fifth Line
|
||||||
|
ZPL := '^FO30,155^AC,18^FDSub PN:^FS':CRLF$
|
||||||
|
ZPL := '^FO120,155^A0,20^FD':SubPartNo:'^FS':CRLF$
|
||||||
|
IF SuppCd NE '' THEN
|
||||||
|
ZPL := '^FO410,155^AC,18^FDSupp Cd:^FS':CRLF$
|
||||||
|
ZPL := '^FO510,155^A0,20^FD':SuppCd:'^FS':CRLF$
|
||||||
|
ZPL := '^BY2,2.0':CRLF$
|
||||||
|
ZPL := '^FO610,155^A040,20^B3,,23,N^FD':SuppCd:'^FS':CRLF$
|
||||||
|
ZPL := '^BY2,3.0':CRLF$
|
||||||
|
END
|
||||||
|
****** Separator bar
|
||||||
|
ZPL := '^FO15,180^GB790,1^FS':CRLF$
|
||||||
|
IF MakeupBox THEN
|
||||||
|
ZPL := '^FO410,190^A050,30^FD* * * M a k e u p B o x * * *^FS':CRLF$
|
||||||
|
END ELSE
|
||||||
|
ZPL := '^FO410,190^AC,18^FDReact Type:^FS':CRLF$
|
||||||
|
ZPL := '^FO560,190^A0,20^FDEpiPro^FS':CRLF$
|
||||||
|
END
|
||||||
|
****** Seventh Line
|
||||||
|
ZPL := '^FO30,190^AC,18^FDPre:^FS':CRLF$
|
||||||
|
ZPL := '^FO90,190^A0,20^FD':SubPreClean:'^FS':CRLF$
|
||||||
|
IF PreAkrionRecipe NE '' THEN
|
||||||
|
ZPL := '^FO210,190^AC,18^FDAkrion:^FS':CRLF$
|
||||||
|
ZPL := '^FO300,190^A0,20^FD':PreAkrionRecipe:'^FS':CRLF$
|
||||||
|
ZPL := '^BY2,2.0':CRLF$
|
||||||
|
ZPL := '^FO450,190^A040,20^B3,,23,N^FD':PreAkrionRecipe:'^FS':CRLF$
|
||||||
|
ZPL := '^BY2,3.0':CRLF$
|
||||||
|
END
|
||||||
|
****** Eighth Line
|
||||||
|
ZPL := '^FO30,225^AC,18^FDRecipe:^FS':CRLF$
|
||||||
|
ZPL := '^FO120,225^A0,20^FD':RecipeInfo:'^FS':CRLF$
|
||||||
|
ZPL := '^FO410,225^AC,18^FDEpi Dopant:^FS':CRLF$
|
||||||
|
ZPL := '^FO560,225^A040,20^FD':Dopant:'^FS':CRLF$
|
||||||
|
****** Ninth, Tenth and Eleventh Lines
|
||||||
|
ZPL := '^FO30,260^AC,18^FDThk Spec:^FS':CRLF$
|
||||||
|
FOR M = 1 TO COUNT(PrintThickTargets,@VM) + (PrintThickTargets NE '')
|
||||||
|
BaseLine = 260 + (M-1)*20
|
||||||
|
ZPL := '^FO140,':BaseLine:'^A040,20^FD':PrintThickTargets<1,M>:'^FS':CRLF$
|
||||||
|
NEXT M
|
||||||
|
ZPL := '^FO410,260^AC,18^FDRes Spec:^FS':CRLF$
|
||||||
|
FOR M = 1 TO COUNT(PrintResTargets,@VM) + (PrintResTargets NE '')
|
||||||
|
BaseLine = 260 + (M-1)*20
|
||||||
|
ZPL := '^FO520,':BaseLine:'^A040,20^FD':PrintResTargets<1,M>:'^FS':CRLF$
|
||||||
|
NEXT M
|
||||||
|
IF PostAkrionRecipe NE '' THEN
|
||||||
|
ZPL := '^FO30,335^AC,18^FDPost:^FS':CRLF$
|
||||||
|
ZPL := '^FO90,335^A0,20^FD':SubPostClean:'^FS':CRLF$
|
||||||
|
ZPL := '^FO210,335^AC,18^FDAkrion:^FS':CRLF$
|
||||||
|
ZPL := '^FO300,335^A0,20^FD':PostAkrionRecipe:'^FS':CRLF$
|
||||||
|
ZPL := '^BY2,2.0':CRLF$
|
||||||
|
ZPL := '^FO450,335^A040,20^B3,,23,N^FD':PostAkrionRecipe:'^FS':CRLF$
|
||||||
|
ZPL := '^BY2,3.0':CRLF$
|
||||||
|
END ELSE
|
||||||
|
ZPL := '^FO30,335^AC,18^FDPost:^FS':CRLF$
|
||||||
|
ZPL := '^FO120,335^A0,20^FD':SubPostClean:'^FS':CRLF$
|
||||||
|
END
|
||||||
|
****** Separator bar
|
||||||
|
ZPL := '^FO15,365^GB790,1^FS':CRLF$
|
||||||
|
****** Data Matrix barcode
|
||||||
|
ZPL := '^FO720,280^CI28':CRLF$
|
||||||
|
ZPL := '^BXN,2,200^FDP':PartNo:'|S':SubPartNo:'|1T':PrintWMOutKey:'|2T':LotNo:'|':PSNo:'|Q':WfrQty:'|1V':Vendor:'|SEQ':Cnt:'^FS':CRLF$
|
||||||
|
****** Fourteenth Line
|
||||||
|
ZPL := '^FO30,375^AC,18^FDProd Spec No:^FS':CRLF$
|
||||||
|
ZPL := '^FO190,375^A0,25^FD':PSNo:'^FS':CRLF$
|
||||||
|
IF SpecType = 'Production' THEN SpecType = 'Prod'
|
||||||
|
IF SpecType = 'Pre-Production' THEN SpecType = 'Pre'
|
||||||
|
ZPL := '^FO275,375^AC,18^FDSpec Type:^FS':CRLF$
|
||||||
|
ZPL := '^FO400,375^A0,25^FD':SpecType:'^FS':CRLF$
|
||||||
|
ZPL := '^FO480,375^AC,18^FDBag:^FS':CRLF$
|
||||||
|
ZPL := '^FO530,375^A0,20^FD':ShipBagReq:'^FS':CRLF$
|
||||||
|
***** End of Label
|
||||||
|
ZPL := '^XZ'
|
||||||
|
Next
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. WM_OUT ':WmOutKey:' does not exist.'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Null WmOutKey passed in.'
|
||||||
|
end
|
||||||
|
|
||||||
|
If ErrorMsg EQ '' then
|
||||||
|
Response = ZPL
|
||||||
|
end else
|
||||||
|
Error_Services('Add', ErrorMsg)
|
||||||
|
end
|
||||||
|
|
||||||
|
end service
|
||||||
|
|
||||||
|
@ -51,13 +51,14 @@ $Insert IFX_EQUATES
|
|||||||
$Insert CUST_EPI_PART_EQUATES
|
$Insert CUST_EPI_PART_EQUATES
|
||||||
|
|
||||||
Equ MAX_NUM_CASS$ to 150
|
Equ MAX_NUM_CASS$ to 150
|
||||||
|
Equ NUM_ATTEMPTS$ to 10
|
||||||
|
|
||||||
Declare subroutine Error_Services, Work_Order_Services, Memory_Services, RList, Database_Services, SRP_JSON
|
Declare subroutine Error_Services, Work_Order_Services, Memory_Services, RList, Database_Services, SRP_JSON
|
||||||
Declare subroutine Btree.Extract, Set_Status, obj_WO_Log, obj_Notes, Print_Wo_Mat_In_Labels, Print_Wo_Mat_Out_Labels
|
Declare subroutine Btree.Extract, Set_Status, obj_WO_Log, obj_Notes, Print_Wo_Mat_In_Labels, Print_Wo_Mat_Out_Labels
|
||||||
Declare subroutine Print_Wmi_Labels, Print_Wmo_Labels, ErrMsg, Print_Cass_Labels, Logging_Services, Service_Services
|
Declare subroutine Print_Wmi_Labels, Print_Wmo_Labels, ErrMsg, Print_Cass_Labels, Logging_Services, Service_Services
|
||||||
Declare subroutine obj_WO_Mat_Log, WO_Mat_Services, Work_Order_Services, Transaction_Services, Extract_Si_Keys
|
Declare subroutine obj_WO_Mat_Log, WO_Mat_Services, Work_Order_Services, Transaction_Services, Extract_Si_Keys
|
||||||
Declare subroutine Mona_Services, Lot_Event_Services, RDS_Services, Lot_Services, WM_In_Services, WM_Out_Services
|
Declare subroutine Mona_Services, Lot_Event_Services, RDS_Services, Lot_Services, WM_In_Services, WM_Out_Services
|
||||||
Declare subroutine obj_WO_Mat, obj_Post_Log
|
Declare subroutine obj_WO_Mat, obj_Post_Log, Delay
|
||||||
Declare function SRP_Array, Work_Order_Services, Memory_Services, Database_Services, SRP_Sort_Array, SRP_JSON
|
Declare function SRP_Array, Work_Order_Services, Memory_Services, Database_Services, SRP_Sort_Array, SRP_JSON
|
||||||
Declare function Company_Services, obj_Prod_Spec, Schedule_Services, obj_WO_Log, obj_WO_Step, Memberof, Datetime
|
Declare function Company_Services, obj_Prod_Spec, Schedule_Services, obj_WO_Log, obj_WO_Step, Memberof, Datetime
|
||||||
Declare function Environment_Services, Logging_Services, Hold_Services, Signature_Services, Lot_Services
|
Declare function Environment_Services, Logging_Services, Hold_Services, Signature_Services, Lot_Services
|
||||||
@ -1140,6 +1141,86 @@ Service UpdateReleasedQty(WONo)
|
|||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
|
Service AdjustReleasedQty(WONo, AdjustQty)
|
||||||
|
|
||||||
|
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
|
||||||
|
LogDate = Oconv(Date(), 'D4/')
|
||||||
|
LogTime = Oconv(Time(), 'MTS')
|
||||||
|
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Adjust Released Qty Log.csv'
|
||||||
|
Headers = 'Logging DTM' : @FM : 'WONo' : @FM : 'Notes'
|
||||||
|
objAdjRelLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$,',', Headers, '', False$, False$)
|
||||||
|
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
||||||
|
OrigRelQty = ''
|
||||||
|
RelQty = ''
|
||||||
|
UnrelQty = ''
|
||||||
|
ErrorMsg = ''
|
||||||
|
Begin Case
|
||||||
|
Case (WONo EQ '')
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Null WONo passed into service'
|
||||||
|
Case (AdjustQty EQ '')
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Null AdjustQty passed into service'
|
||||||
|
Case Not(Num(AdjustQty))
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. AdjustQty is not a number'
|
||||||
|
Case Index(AdjustQty, '.', 1)
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. AdjustQty cannot be a decimal value'
|
||||||
|
Case Otherwise$
|
||||||
|
Null
|
||||||
|
End Case
|
||||||
|
If (ErrorMsg EQ '' ) then
|
||||||
|
If RowExists('WO_LOG', WONo) then
|
||||||
|
For Attempt = 1 to NUM_ATTEMPTS$
|
||||||
|
If Attempt GT 0 then Delay(Attempt)
|
||||||
|
HaveLock = Database_Services('GetKeyIDLock', 'WO_LOG', WONo, True$)
|
||||||
|
If HaveLock then
|
||||||
|
WORec = Database_Services('ReadDataRow', 'WO_LOG', WONo)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
WOQty = WORec<WO_LOG_WO_QTY$>
|
||||||
|
OrigRelQty = WORec<WO_LOG_REL_QTY_STATIC$>
|
||||||
|
RelQty = OrigRelQty + AdjustQty
|
||||||
|
UnrelQty = WOQty - RelQty
|
||||||
|
If UnrelQty LT 0 then UnrelQty = 0
|
||||||
|
WORec<WO_LOG_REL_QTY_STATIC$> = RelQty
|
||||||
|
WORec<WO_LOG_UNREL_QTY_STATIC$> = UnRelQty
|
||||||
|
Database_Services('WriteDataRow', 'WO_LOG', WONo, WORec, True$, False$, False$)
|
||||||
|
If Error_Services('HasError') then
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Failed to write ':RelQty:' on REL_QTY_STATIC '
|
||||||
|
ErrorMsg := 'field and ':UnrelQty:' on UNREL_QTY_STATIC field of WO_LOG record ':WONo:'.'
|
||||||
|
ErrorMsg := 'Error message: ':Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Failed to read record ':WONo:' from the WO_LOG table. '
|
||||||
|
ErrorMsg := 'Error message: ':Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
If ( Not(HaveLock) and (Attempt GE NUM_ATTEMPTS$) ) then
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Failed to lock WO_LOG ':WoNo:' for update after ':Attempt:' attempts.'
|
||||||
|
end
|
||||||
|
Until HaveLock or (ErrorMsg NE '')
|
||||||
|
Next Attempt
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. ':WONo:' does not exist in the WO_LOG table.'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
LogData = ''
|
||||||
|
LogData<1> = LoggingDtm
|
||||||
|
LogData<2> = WONo
|
||||||
|
If ErrorMsg EQ '' then
|
||||||
|
LogResult = 'Successfully adjusted WO_LOG ':WONo:' released and unreleased quantities by ':AdjustQty
|
||||||
|
LogResult := '. Updated WO_LOG record ':WONo:' field REL_QTY_STATIC with released quantity ':RelQty
|
||||||
|
LogResult := ' and field UNREL_QTY_STATIC with unreleased quantity ':UnRelQty:'.'
|
||||||
|
LogData<3> = LogResult
|
||||||
|
Logging_Services('AppendLog', objAdjRelLog, LogData, @RM, @FM)
|
||||||
|
end else
|
||||||
|
LogResult = 'Failed to adjust WO_LOG ':WONo:' released and unreleased quantities by ':AdjustQty:'.'
|
||||||
|
LogData<3> = LogResult
|
||||||
|
Logging_Services('AppendLog', objAdjRelLog, LogData, @RM, @FM)
|
||||||
|
Error_Services('Add', ErrorMsg)
|
||||||
|
end
|
||||||
|
|
||||||
|
end service
|
||||||
|
|
||||||
|
|
||||||
Service UpdateReceivedQty(WONo)
|
Service UpdateReceivedQty(WONo)
|
||||||
|
|
||||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
|
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
|
||||||
@ -1215,6 +1296,84 @@ Service UpdateReceivedQty(WONo)
|
|||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
|
Service AdjustReceivedQty(WONo, AdjustQty)
|
||||||
|
|
||||||
|
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
|
||||||
|
LogDate = Oconv(Date(), 'D4/')
|
||||||
|
LogTime = Oconv(Time(), 'MTS')
|
||||||
|
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Adjust Received Qty Log.csv'
|
||||||
|
Headers = 'Logging DTM' : @FM : 'WONo' : @FM : 'Notes'
|
||||||
|
objAdjRecLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$,',', Headers, '', False$, False$)
|
||||||
|
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
||||||
|
RXQty = ''
|
||||||
|
OrigRXQty = ''
|
||||||
|
ErrorMsg = ''
|
||||||
|
Begin Case
|
||||||
|
Case (WONo EQ '')
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Null WONo passed into service'
|
||||||
|
Case (AdjustQty EQ '')
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Null AdjustQty passed into service'
|
||||||
|
Case Not(Num(AdjustQty))
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. AdjustQty is not a number'
|
||||||
|
Case Index(AdjustQty, '.', 1)
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. AdjustQty cannot be a decimal value'
|
||||||
|
Case Otherwise$
|
||||||
|
Null
|
||||||
|
End Case
|
||||||
|
If (ErrorMsg EQ '' ) then
|
||||||
|
If RowExists('WO_LOG', WONo) then
|
||||||
|
For Attempt = 1 to NUM_ATTEMPTS$
|
||||||
|
If Attempt GT 0 then Delay(Attempt)
|
||||||
|
HaveLock = Database_Services('GetKeyIDLock', 'WO_LOG', WONo, True$)
|
||||||
|
If HaveLock then
|
||||||
|
WORec = Database_Services('ReadDataRow', 'WO_LOG', WONo)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
WOQty = WORec<WO_LOG_WO_QTY$>
|
||||||
|
OrigRxQty = WORec<WO_LOG_RX_QTY_STATIC$>
|
||||||
|
RxQty = OrigRxQty + AdjustQty
|
||||||
|
OpenQty = WOQty - RXQty
|
||||||
|
WORec<WO_LOG_RX_QTY_STATIC$> = RxQty
|
||||||
|
WORec<WO_LOG_OPEN_QTY_STATIC$> = OpenQty
|
||||||
|
Database_Services('WriteDataRow', 'WO_LOG', WONo, WORec, True$, False$, False$)
|
||||||
|
If Error_Services('HasError') then
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Failed to write ':RxQty:' on RX_QTY_STATIC field '
|
||||||
|
ErrorMsg := 'and ':OpenQty:' on OPEN_QTY_STATIC to WO_LOG ':WONo:'. Error message: '
|
||||||
|
ErrorMsg := Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Failed to read record ':WONo:' from the WO_LOG table. '
|
||||||
|
ErrorMsg := 'Error message: ':Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
If ( Not(HaveLock) and (Attempt GE NUM_ATTEMPTS$) ) then
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Failed to lock WO_LOG ':WoNo:' for update after ':Attempt:' attempts.'
|
||||||
|
end
|
||||||
|
Until HaveLock or (ErrorMsg NE '')
|
||||||
|
Next Attempt
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. ':WONo:' does not exist in the WO_LOG table.'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
LogData = ''
|
||||||
|
LogData<1> = LoggingDtm
|
||||||
|
LogData<2> = WONo
|
||||||
|
If ErrorMsg EQ '' then
|
||||||
|
LogResult = 'Successfully adjusted WO_LOG ':WONo:' received and open quantities by ':AdjustQty
|
||||||
|
LogResult := '. Updated WO_LOG record ':WONo:' field RX_QTY_STATIC with received quantity ':RXQty
|
||||||
|
LogResult := ' and field OPEN_QTY_STATIC with open quantity ':OpenQty:'.'
|
||||||
|
LogData<3> = LogResult
|
||||||
|
Logging_Services('AppendLog', objAdjRecLog, LogData, @RM, @FM)
|
||||||
|
end else
|
||||||
|
LogResult = 'Failed to adjust WO_LOG ':WONo:' received and open quantities by ':AdjustQty
|
||||||
|
LogData<3> = LogResult
|
||||||
|
Logging_Services('AppendLog', objAdjRecLog, LogData, @RM, @FM)
|
||||||
|
Error_Services('Add', ErrorMsg)
|
||||||
|
end
|
||||||
|
|
||||||
|
end service
|
||||||
|
|
||||||
|
|
||||||
Service UpdateShippedQty(WONo)
|
Service UpdateShippedQty(WONo)
|
||||||
|
|
||||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
|
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
|
||||||
@ -1346,99 +1505,124 @@ end service
|
|||||||
|
|
||||||
Service ConvertRecordToJSON(WONo, Record, ItemURL)
|
Service ConvertRecordToJSON(WONo, Record, ItemURL)
|
||||||
|
|
||||||
jsonRecord = ''
|
ErrorMsg = ''
|
||||||
|
jsonRecord = ''
|
||||||
IF WONo NE '' then
|
IF WONo NE '' then
|
||||||
If Record EQ '' then Record = Database_Services('ReadDataRow', 'WO_LOG', WONo)
|
If Record EQ '' then Record = Database_Services('ReadDataRow', 'WO_LOG', WONo)
|
||||||
If Error_Services('NoError') then
|
If Error_Services('NoError') then
|
||||||
@DICT = Database_Services('GetTableHandle', 'DICT.WO_LOG')
|
EpiPartNo = Record<WO_LOG_EPI_PART_NO$>
|
||||||
@ID = WONo
|
EpiPartRec = Database_Services('ReadDataRow', 'EPI_PART', EpiPartNo)
|
||||||
@RECORD = Record
|
If Error_Services('NoError') then
|
||||||
objJSON = ''
|
SubSuppBy = EpiPartRec<EPI_PART_SUB_SUPP_BY$> ;* L - EpiSvcs supplied, C - Customer Supplied
|
||||||
If SRP_JSON(objJSON, 'New', 'Object') then
|
ProdVerNo = Record<WO_LOG_PROD_VER_NO$>
|
||||||
objWOLog = ''
|
ProdVerRec = Database_Services('ReadDataRow', 'PROD_VER', ProdVerNo)
|
||||||
If SRP_JSON(objWOLog, 'New', 'Object') then
|
If Error_Services('NoError') then
|
||||||
SRP_JSON(objWOLog, 'SetValue', 'KeyId', @ID)
|
SubPartNo = ProdVerRec<PROD_VER_SUB_PART_NO$>
|
||||||
SRP_JSON(objWOLog, 'SetValue', 'ProdOrdNo', {PROD_ORD_NO})
|
// Create the JSON response object
|
||||||
SRP_JSON(objWOLog, 'SetValue', 'PSN', {PS_NO})
|
objJSON = ''
|
||||||
SRP_JSON(objWOLog, 'SetValue', 'EpiPartNo', {EPI_PART_NO})
|
If SRP_JSON(objJSON, 'New', 'Object') then
|
||||||
SRP_JSON(objWOLog, 'SetValue', 'HotFlag', {HOT_FLAG})
|
objWOLog = ''
|
||||||
SRP_JSON(objWOLog, 'SetValue', 'WoQty', {WO_QTY})
|
If SRP_JSON(objWOLog, 'New', 'Object') then
|
||||||
SRP_JSON(objWOLog, 'SetValue', 'RxQty', {RX_QTY_STATIC})
|
SRP_JSON(objWOLog, 'SetValue', 'KeyId', WONo)
|
||||||
SRP_JSON(objWOLog, 'SetValue', 'RelQty', {REL_QTY_STATIC})
|
SRP_JSON(objWOLog, 'SetValue', 'ProdOrdNo', Record<WO_LOG_PROD_ORD_NO$>)
|
||||||
SRP_JSON(objWOLog, 'SetValue', 'UnRelQty', {UNREL_QTY_STATIC})
|
SRP_JSON(objWOLog, 'SetValue', 'PSN', Xlate('WO_LOG', WONo, 'PS_NO', 'X'))
|
||||||
SRP_JSON(objWOLog, 'SetValue', 'ShipQty', {SHIP_QTY_STATIC})
|
SRP_JSON(objWOLog, 'SetValue', 'EpiPartNo', EpiPartNo)
|
||||||
SRP_JSON(objWOLog, 'SetValue', 'ScrapQty', {SCRAP_QTY_STATIC})
|
SRP_JSON(objWOLog, 'SetValue', 'HotFlag', Record<WO_LOG_HOT_FLAG$>)
|
||||||
SRP_JSON(objWOLog, 'SetValue', 'OpenQty', {OPEN_QTY_STATIC})
|
SRP_JSON(objWOLog, 'SetValue', 'WoQty', Record<WO_LOG_WO_QTY$>)
|
||||||
SRP_JSON(objWOLog, 'SetValue', 'CustNo', {CUST_NO})
|
SRP_JSON(objWOLog, 'SetValue', 'RxQty', Record<WO_LOG_RX_QTY_STATIC$>)
|
||||||
SRP_JSON(objWOLog, 'SetValue', 'Customer', {CUST_NAME})
|
SRP_JSON(objWOLog, 'SetValue', 'RelQty', Record<WO_LOG_REL_QTY_STATIC$>)
|
||||||
// Create a list of cassettes
|
SRP_JSON(objWOLog, 'SetValue', 'UnRelQty', Record<WO_LOG_UNREL_QTY_STATIC$>)
|
||||||
CassIDs = {WO_MAT_KEY}
|
SRP_JSON(objWOLog, 'SetValue', 'ShipQty', Record<WO_LOG_SHIP_QTY_STATIC$>)
|
||||||
objChildCassettes = ''
|
SRP_JSON(objWOLog, 'SetValue', 'ScrapQty', Record<WO_LOG_SCRAP_QTY_STATIC$>)
|
||||||
If SRP_JSON(objChildCassettes, 'New', 'Array') then
|
SRP_JSON(objWOLog, 'SetValue', 'OpenQty', Record<WO_LOG_OPEN_QTY_STATIC$>)
|
||||||
If CassIDs NE '' then
|
SRP_JSON(objWOLog, 'SetValue', 'CustNo', Record<WO_LOG_CUST_NO$>)
|
||||||
for each Cass in CassIDs using @VM setting vPos
|
SRP_JSON(objWOLog, 'SetValue', 'Customer', Xlate('WO_LOG', WONo, 'CUST_NAME', 'X'))
|
||||||
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', Cass)
|
|
||||||
If Error_Services('NoError') then
|
ExpectedVendorCd = Record<WO_LOG_EXP_VEND_CD$>
|
||||||
// Add in each indv. cassette object
|
If ( (Len(ExpectedVendorCd) NE 2) or (SubSuppBy NE 'L') ) then ExpectedVendorCd = ''
|
||||||
objChildCassette = ''
|
SRP_JSON(objWOLog, 'SetValue', 'ExpectedVendorCd', ExpectedVendorCd)
|
||||||
If SRP_JSON(objChildCassette, 'New', 'Object') then
|
SRP_JSON(objWOLog, 'SetValue', 'SubPartNo', SubPartNo)
|
||||||
SRP_JSON(objChildCassette, 'SetValue', 'KeyId', Cass)
|
|
||||||
SRP_JSON(objChildCassette, 'SetValue', 'CassNo', Field(Cass, '*', 2, 1))
|
// Create a list of cassettes
|
||||||
SRP_JSON(objChildCassette, 'SetValue', 'SAPBatchNo', WOMatRec<WO_MAT_SAP_BATCH_NO$>)
|
CassIDs = Record<WO_LOG_WO_MAT_KEY$>
|
||||||
SRP_JSON(objChildCassette, 'SetValue', 'SAPTXDtm', Date_Services('ConvertDateTimeToISO8601', WOMatRec<WO_MAT_SAP_TX_DTM$>))
|
objChildCassettes = ''
|
||||||
SRP_JSON(objChildCassette, 'SetValue', 'RDSNo', WOMatRec<WO_MAT_RDS_NO$>)
|
If SRP_JSON(objChildCassettes, 'New', 'Array') then
|
||||||
SRP_JSON(objChildCassette, 'SetValue', 'ShipNo', WOMatRec<WO_MAT_SHIP_NO$>)
|
If CassIDs NE '' then
|
||||||
SRP_JSON(objChildCassette, 'SetValue', 'LotNo', WOMatRec<WO_MAT_LOT_NO$>)
|
for each Cass in CassIDs using @VM setting vPos
|
||||||
SRP_JSON(objChildCassette, 'SetValue', 'Qty', WOMatRec<WO_MAT_WAFER_QTY$>)
|
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', Cass)
|
||||||
SRP_JSON(objChildCassette, 'SetValue', 'CustPartNo', WOMatRec<WO_MAT_CUST_PART_NO$>)
|
If Error_Services('NoError') then
|
||||||
SRP_JSON(objChildCassette, 'SetValue', 'SubPartNo', WOMatRec<WO_MAT_SUB_PART_NO$>)
|
// Add in each indv. cassette object
|
||||||
SRP_JSON(objChildCassette, 'SetValue', 'VendorCd', WOMatRec<WO_MAT_SUB_VEND_CD$>)
|
objChildCassette = ''
|
||||||
SRP_JSON(objChildCassette, 'SetValue', 'RecDtm', Date_Services('ConvertDateTimeToISO8601', WOMatRec<WO_MAT_RX_DTM$>))
|
If SRP_JSON(objChildCassette, 'New', 'Object') then
|
||||||
SRP_JSON(objChildCassette, 'SetValue', 'RelDtm', Date_Services('ConvertDateTimeToISO8601', WOMatRec<WO_MAT_REL_DTM$>))
|
SRP_JSON(objChildCassette, 'SetValue', 'KeyId', Cass)
|
||||||
SRP_JSON(objChildCassette, 'SetValue', 'RecUser', OConv(WOMatRec<WO_MAT_RX_BY$>, '[XLATE_CONV,LSL_USERS*FIRST_LAST]'))
|
SRP_JSON(objChildCassette, 'SetValue', 'CassNo', Field(Cass, '*', 2, 1))
|
||||||
SRP_JSON(objChildCassette, 'SetValue', 'RelUser', OConv(WOMatRec<WO_MAT_REL_BY$>, '[XLATE_CONV,LSL_USERS*FIRST_LAST]' ))
|
SRP_JSON(objChildCassette, 'SetValue', 'SAPBatchNo', WOMatRec<WO_MAT_SAP_BATCH_NO$>)
|
||||||
SRP_JSON(objChildCassettes, 'Add', objChildCassette)
|
SRP_JSON(objChildCassette, 'SetValue', 'SAPTXDtm', Date_Services('ConvertDateTimeToISO8601', WOMatRec<WO_MAT_SAP_TX_DTM$>))
|
||||||
SRP_JSON(objChildCassette, 'Release')
|
SRP_JSON(objChildCassette, 'SetValue', 'RDSNo', WOMatRec<WO_MAT_RDS_NO$>)
|
||||||
end
|
SRP_JSON(objChildCassette, 'SetValue', 'ShipNo', WOMatRec<WO_MAT_SHIP_NO$>)
|
||||||
|
SRP_JSON(objChildCassette, 'SetValue', 'LotNo', WOMatRec<WO_MAT_LOT_NO$>)
|
||||||
|
SRP_JSON(objChildCassette, 'SetValue', 'Qty', WOMatRec<WO_MAT_WAFER_QTY$>)
|
||||||
|
SRP_JSON(objChildCassette, 'SetValue', 'CustPartNo', WOMatRec<WO_MAT_CUST_PART_NO$>)
|
||||||
|
SRP_JSON(objChildCassette, 'SetValue', 'SubPartNo', WOMatRec<WO_MAT_SUB_PART_NO$>)
|
||||||
|
SRP_JSON(objChildCassette, 'SetValue', 'VendorCd', WOMatRec<WO_MAT_SUB_VEND_CD$>)
|
||||||
|
SRP_JSON(objChildCassette, 'SetValue', 'RecDtm', Date_Services('ConvertDateTimeToISO8601', WOMatRec<WO_MAT_RX_DTM$>))
|
||||||
|
SRP_JSON(objChildCassette, 'SetValue', 'RelDtm', Date_Services('ConvertDateTimeToISO8601', WOMatRec<WO_MAT_REL_DTM$>))
|
||||||
|
SRP_JSON(objChildCassette, 'SetValue', 'RecUser', OConv(WOMatRec<WO_MAT_RX_BY$>, '[XLATE_CONV,LSL_USERS*FIRST_LAST]'))
|
||||||
|
SRP_JSON(objChildCassette, 'SetValue', 'RelUser', OConv(WOMatRec<WO_MAT_REL_BY$>, '[XLATE_CONV,LSL_USERS*FIRST_LAST]' ))
|
||||||
|
SRP_JSON(objChildCassettes, 'Add', objChildCassette)
|
||||||
|
SRP_JSON(objChildCassette, 'Release')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
Next Cass
|
||||||
|
end else
|
||||||
|
SRP_JSON(objWOLog, 'SetValue', 'ChildCassettes', '')
|
||||||
end
|
end
|
||||||
Next Cass
|
SRP_JSON(objWOLog, 'Set', 'ChildCassettes', objChildCassettes)
|
||||||
end else
|
SRP_JSON(objChildCassettes, 'Release')
|
||||||
SRP_JSON(objWOLog, 'SetValue', 'ChildCassettes', '')
|
end
|
||||||
|
SRP_JSON(objJSON, 'Set', 'WO_Log', objWOLog)
|
||||||
|
SRP_JSON(objWOLog, 'Release')
|
||||||
end
|
end
|
||||||
SRP_JSON(objWOLog, 'Set', 'ChildCassettes', objChildCassettes)
|
If itemURL NE '' then
|
||||||
SRP_JSON(objChildCassettes, 'Release')
|
// The itemURL was passed in so add HAL+JSON properties.
|
||||||
end
|
// Create the _links property and then all link objects needed for this resource.
|
||||||
SRP_JSON(objJSON, 'Set', 'WO_Log', objWOLog)
|
objLinks = ''
|
||||||
SRP_JSON(objWOLog, 'Release')
|
If SRP_JSON(objLinks, 'New', 'Object') then
|
||||||
end
|
// Create a self link.
|
||||||
If itemURL NE '' then
|
objLink = ''
|
||||||
// The itemURL was passed in so add HAL+JSON properties.
|
If SRP_JSON(objLink, 'New', 'Object') then
|
||||||
// Create the _links property and then all link objects needed for this resource.
|
SRP_JSON(objLink, 'SetValue', 'href', ItemURL, 'String')
|
||||||
objLinks = ''
|
SRP_JSON(objLink, 'SetValue', 'title', 'Self', 'String')
|
||||||
If SRP_JSON(objLinks, 'New', 'Object') then
|
SRP_JSON(objLinks, 'Set', 'self', objLink)
|
||||||
// Create a self link.
|
SRP_JSON(objLink, 'Release')
|
||||||
objLink = ''
|
end
|
||||||
If SRP_JSON(objLink, 'New', 'Object') then
|
SRP_JSON(objJSON, 'Set', '_links', objLinks)
|
||||||
SRP_JSON(objLink, 'SetValue', 'href', ItemURL, 'String')
|
SRP_JSON(objLinks, 'Release')
|
||||||
SRP_JSON(objLink, 'SetValue', 'title', 'Self', 'String')
|
end
|
||||||
SRP_JSON(objLinks, 'Set', 'self', objLink)
|
// Create the _class property for this resource.
|
||||||
SRP_JSON(objLink, 'Release')
|
SRP_JSON(objJSON, 'SetValue', '_class', 'resource')
|
||||||
end
|
end
|
||||||
SRP_JSON(objJSON, 'Set', '_links', objLinks)
|
jsonRecord = SRP_JSON(objJSON, 'Stringify', 'Styled')
|
||||||
SRP_JSON(objLinks, 'Release')
|
SRP_JSON(objJSON, 'Release')
|
||||||
end
|
end else
|
||||||
// Create the _class property for this resource.
|
ErrorMsg = 'Error in ':Service:' service. Unable to create JSON object'
|
||||||
SRP_JSON(objJSON, 'SetValue', '_class', 'resource')
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||||
end
|
end
|
||||||
jsonRecord = SRP_JSON(objJSON, 'Stringify', 'Styled')
|
|
||||||
SRP_JSON(objJSON, 'Release')
|
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', 'Unable to create JSON representation in the ' : Service : ' service.')
|
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||||
end
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
Error_Services('Add', 'KeyID argument was missing in the ' : Service : ' service.')
|
ErrorMsg = 'Error in ':Service:' service. Null WONo passed into service.'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||||
Response = jsonRecord
|
Response = jsonRecord
|
||||||
|
|
||||||
end service
|
end service
|
||||||
@ -2344,6 +2528,57 @@ Service UpdateWorkOrderData(WONo)
|
|||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
|
Service GetWoLogZpl(WoNo)
|
||||||
|
|
||||||
|
ZPL = ''
|
||||||
|
ErrorMsg = ''
|
||||||
|
If WoNo NE '' then
|
||||||
|
If RowExists('WO_LOG', WoNo) then
|
||||||
|
WOStepKeys = XLATE('WO_LOG',WONo,WO_LOG_WO_STEP_KEY$,'X')
|
||||||
|
IF INDEX(WOStepKeys,@VM,1) THEN
|
||||||
|
PrintWONo = WONo:'.':WOStep
|
||||||
|
END ELSE
|
||||||
|
PrintWONo = WONo
|
||||||
|
END
|
||||||
|
WORec = XLATE('WO_LOG',WONo,'','X')
|
||||||
|
ReqShipDate = OCONV(WORec<WO_LOG_PROMISE_SHIP_DT$>,'D2/')
|
||||||
|
CustNo = WORec<WO_LOG_CUST_NO$>
|
||||||
|
CustName = XLATE('COMPANY',CustNo,'ABBREV_OR_CO_NAME','X')
|
||||||
|
ZPL := '^XA^CFD'
|
||||||
|
ZPL := '^LH0,0'
|
||||||
|
ZPL := '^PR2' ;* Print speed 2 inches per second
|
||||||
|
ZPL := '^LL325' ;* Label length in dots
|
||||||
|
ZPL := '^MD15' ;* Media darkness
|
||||||
|
ZPL := '^PQ2' ;* Print 2 labels for each pass through here
|
||||||
|
ZPL := '^MMT':CRLF$ ;* Media mode t=tear off mode
|
||||||
|
IF INDEX(PrintWONo,'.',1) THEN
|
||||||
|
ZPL := '^FO10,30^A0,220,210^FD':PrintWONo:'^FS':CRLF$
|
||||||
|
END ELSE
|
||||||
|
ZPL := '^FO70,30^A0,220,210^FD':PrintWONo:'^FS':CRLF$
|
||||||
|
END
|
||||||
|
CharCnt = Len(CustName)
|
||||||
|
NameLength = CharCnt*72
|
||||||
|
WhiteSpace = INT(((2103 - NameLength)/2103) * 806)
|
||||||
|
StartingXPos = INT(WhiteSpace/2)
|
||||||
|
ZPL:= '^FO':StartingXPos:',230^A0,75,72^FD':CustName:'^FS':CRLF$
|
||||||
|
ZPL:= '^FO160,320^A080,50^FD':'Commit Date: ':OCONV( XLATE( 'WO_LOG', WONo, WO_LOG_COMMIT_DATE$, 'X' ), 'D2/' ):'^FS':CRLF$
|
||||||
|
ZPL:= '^XZ'
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. WO_LOG ':WoNo:' does not exist.'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMsg = 'Error in ':Service:' service. Null WoNo passed in.'
|
||||||
|
end
|
||||||
|
|
||||||
|
If ErrorMsg EQ '' then
|
||||||
|
Response = ZPL
|
||||||
|
end else
|
||||||
|
Error_Services('Add', ErrorMsg)
|
||||||
|
end
|
||||||
|
|
||||||
|
end service
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Internal GoSubs
|
// Internal GoSubs
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -35,16 +35,15 @@ Function Wo_API(@API)
|
|||||||
10/20/23 xxx Original programmer.
|
10/20/23 xxx Original programmer.
|
||||||
|
|
||||||
***********************************************************************************************************************/
|
***********************************************************************************************************************/
|
||||||
|
|
||||||
#pragma precomp SRP_PreCompiler
|
#pragma precomp SRP_PreCompiler
|
||||||
|
|
||||||
Declare function Environment_Services, SRP_Datetime, Logging_Services, Work_Order_Services
|
|
||||||
Declare Subroutine Btree.Extract, Logging_Services, Http_Services
|
|
||||||
|
|
||||||
$insert APP_INSERTS
|
$insert APP_INSERTS
|
||||||
$insert API_SETUP
|
$insert API_SETUP
|
||||||
$insert HTTP_INSERTS
|
$insert HTTP_INSERTS
|
||||||
|
|
||||||
|
Declare function Environment_Services, SRP_Datetime, Logging_Services, Work_Order_Services
|
||||||
|
Declare Subroutine Btree.Extract, Logging_Services, Http_Services
|
||||||
|
|
||||||
LogDate = Oconv(Date(), 'D4/')
|
LogDate = Oconv(Date(), 'D4/')
|
||||||
LogTime = Oconv(Time(), 'MTS')
|
LogTime = Oconv(Time(), 'MTS')
|
||||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\API\Materials\WO'
|
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\API\Materials\WO'
|
||||||
@ -55,6 +54,8 @@ LoggingDTM = LogDate : ' ' : LogTime
|
|||||||
ResponseCode = ''
|
ResponseCode = ''
|
||||||
ResponseMessage = ''
|
ResponseMessage = ''
|
||||||
LogData = ''
|
LogData = ''
|
||||||
|
Response = ''
|
||||||
|
|
||||||
GoToAPI else
|
GoToAPI else
|
||||||
// The specific resource endpoint doesn't have a API handler yet.
|
// The specific resource endpoint doesn't have a API handler yet.
|
||||||
ResponseCode = 204
|
ResponseCode = 204
|
||||||
@ -76,14 +77,6 @@ Return Response OR ''
|
|||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
API wo.HEAD
|
|
||||||
API wo.GET
|
|
||||||
|
|
||||||
HTTP_Resource_Services('LoremIpsum')
|
|
||||||
|
|
||||||
end api
|
|
||||||
|
|
||||||
|
|
||||||
API wo.ID.HEAD
|
API wo.ID.HEAD
|
||||||
API wo.ID.GET
|
API wo.ID.GET
|
||||||
|
|
||||||
@ -91,7 +84,20 @@ API wo.ID.GET
|
|||||||
|
|
||||||
end api
|
end api
|
||||||
|
|
||||||
|
|
||||||
|
API wo.ID.zpl.HEAD
|
||||||
|
API wo.ID.zpl.GET
|
||||||
|
|
||||||
|
GoSub CreateZPLItem
|
||||||
|
|
||||||
|
end api
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Internal GoSubs
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
CreateHALItem:
|
CreateHALItem:
|
||||||
|
|
||||||
ResponseCode = 200
|
ResponseCode = 200
|
||||||
MaterialKey = EndpointSegment
|
MaterialKey = EndpointSegment
|
||||||
WOLogKey = ''
|
WOLogKey = ''
|
||||||
@ -122,7 +128,7 @@ CreateHALItem:
|
|||||||
|
|
||||||
end
|
end
|
||||||
IF WOLogKey NE '' then
|
IF WOLogKey NE '' then
|
||||||
JSON = Work_Order_Services('ConvertRecordToJSON', WOLogKey, '', FullEndpointURL)
|
JSON = Work_Order_Services('ConvertRecordToJSON', WOLogKey, '', FullEndpointURL)
|
||||||
end else
|
end else
|
||||||
IF ResponseCode NE 500 then
|
IF ResponseCode NE 500 then
|
||||||
ResponseCode = 406
|
ResponseCode = 406
|
||||||
@ -148,4 +154,32 @@ CreateHALItem:
|
|||||||
Message = Error_Services('GetMessage')
|
Message = Error_Services('GetMessage')
|
||||||
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
|
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
// CreateZPLItem
|
||||||
|
//
|
||||||
|
// Creates a HAL+JSON object with the ZPL for the given WM_IN row
|
||||||
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
|
CreateZPLItem:
|
||||||
|
|
||||||
|
WoLogKey = ParentSegment
|
||||||
|
ZPL = Work_Order_Services('GetWoLogZpl', WoLogKey)
|
||||||
|
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
StatusCode = 200
|
||||||
|
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||||
|
HTTP_Services('SetResponseBody', ZPL, False$, 'text/plain')
|
||||||
|
If Assigned(Message) then
|
||||||
|
HTTP_Services('SetResponseStatus', StatusCode, Message)
|
||||||
|
end else
|
||||||
|
HTTP_Services('SetResponseStatus', StatusCode)
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Message = Error_Services('GetMessage')
|
||||||
|
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
|
||||||
|
end
|
||||||
|
|
||||||
return
|
return
|
||||||
|
@ -616,13 +616,25 @@ WRITE_RECORD:
|
|||||||
NewRelDtm = Record<WO_MAT_REL_DTM$>
|
NewRelDtm = Record<WO_MAT_REL_DTM$>
|
||||||
OrigRecDtm = OrigRecord<WO_MAT_RX_DTM$>
|
OrigRecDtm = OrigRecord<WO_MAT_RX_DTM$>
|
||||||
NewRecDtm = Record<WO_MAT_RX_DTM$>
|
NewRecDtm = Record<WO_MAT_RX_DTM$>
|
||||||
|
AdjustQty = NewWfrQty - OrigWfrQty
|
||||||
|
|
||||||
If ( ( (OrigWfrQty NE '' ) and (OrigWfrQty NE NewWfrQty) ) or ( (OrigRecDtm EQ '') and (NewRecDtm NE '') ) ) then
|
If ( (OrigWfrQty NE '' ) and (OrigWfrQty NE NewWfrQty) and (OrigRecDtm NE '' and NewRecDtm NE '') ) then
|
||||||
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'UpdateReceivedQty':SD$:WONo)
|
// Cassette already received, but casssette quantity has changed.
|
||||||
end
|
If AdjustQty NE 0 then Work_Order_Services('AdjustReceivedQty', WONo, AdjustQty)
|
||||||
If ( ( (OrigWfrQty NE '') and (OrigWfrQty NE NewWfrQty) ) or ( (OrigRelDtm EQ '') and (NewRelDtm NE '') ) ) then
|
end
|
||||||
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'UpdateReleasedQty':SD$:WONo)
|
If ( (OrigRecDtm EQ '') and (NewRecDtm NE '') ) then
|
||||||
end
|
// Cassette was just received. Increment received quantity of work order by the entire cassette wafer count.
|
||||||
|
Work_Order_Services('AdjustReceivedQty', WONo, NewWfrQty)
|
||||||
|
end
|
||||||
|
|
||||||
|
If ( (OrigWfrQty NE '') and (OrigWfrQty NE NewWfrQty) and ( (OrigRelDtm NE '') and (NewRelDtm NE '') ) ) then
|
||||||
|
// Cassette already released, but casssette quantity has changed.
|
||||||
|
If AdjustQty NE 0 then Work_Order_Services('AdjustReleasedQty', WONo, AdjustQty)
|
||||||
|
end
|
||||||
|
If ( (OrigRelDtm EQ '') and (NewRelDtm NE '') ) then
|
||||||
|
// Cassette was just released. Increment released quantity of work order by the entire cassette wafer count.
|
||||||
|
Work_Order_Services('AdjustReleasedQty', WONo, NewWfrQty)
|
||||||
|
end
|
||||||
|
|
||||||
If {REACTOR_TYPE} NE 'EPP' then
|
If {REACTOR_TYPE} NE 'EPP' then
|
||||||
If {MAKEUP_BOX} then
|
If {MAKEUP_BOX} then
|
||||||
|
@ -44,6 +44,7 @@ Declare Subroutine Logging_Services
|
|||||||
$insert APP_INSERTS
|
$insert APP_INSERTS
|
||||||
$insert API_SETUP
|
$insert API_SETUP
|
||||||
$insert HTTP_INSERTS
|
$insert HTTP_INSERTS
|
||||||
|
|
||||||
LogDate = Oconv(Date(), 'D4/')
|
LogDate = Oconv(Date(), 'D4/')
|
||||||
LogTime = Oconv(Time(), 'MTS')
|
LogTime = Oconv(Time(), 'MTS')
|
||||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\API\Materials\WO_MAT'
|
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\API\Materials\WO_MAT'
|
||||||
@ -54,6 +55,8 @@ LoggingDTM = LogDate : ' ' : LogTime
|
|||||||
ResponseCode = ''
|
ResponseCode = ''
|
||||||
ResponseMessage = ''
|
ResponseMessage = ''
|
||||||
LogData = ''
|
LogData = ''
|
||||||
|
Response = ''
|
||||||
|
|
||||||
GoToAPI else
|
GoToAPI else
|
||||||
// The specific resource endpoint doesn't have a API handler yet.
|
// The specific resource endpoint doesn't have a API handler yet.
|
||||||
HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.')
|
HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.')
|
||||||
@ -67,14 +70,6 @@ Return Response OR ''
|
|||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
API wo_mat.HEAD
|
|
||||||
API wo_mat.GET
|
|
||||||
|
|
||||||
HTTP_Resource_Services('LoremIpsum')
|
|
||||||
|
|
||||||
end api
|
|
||||||
|
|
||||||
|
|
||||||
API wo_mat.ID.HEAD
|
API wo_mat.ID.HEAD
|
||||||
API wo_mat.ID.GET
|
API wo_mat.ID.GET
|
||||||
|
|
||||||
@ -82,6 +77,12 @@ API wo_mat.ID.GET
|
|||||||
|
|
||||||
end api
|
end api
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Internal GoSubs
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
CreateHalItem:
|
CreateHalItem:
|
||||||
|
|
||||||
ResponseCode = 200
|
ResponseCode = 200
|
||||||
@ -119,4 +120,6 @@ CreateHalItem:
|
|||||||
LogData<4> = ResponseCode
|
LogData<4> = ResponseCode
|
||||||
LogData<5> = ResponseMessage
|
LogData<5> = ResponseMessage
|
||||||
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM)
|
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@ $Insert SERVICE_SETUP
|
|||||||
$Insert DICT_EQUATES
|
$Insert DICT_EQUATES
|
||||||
|
|
||||||
Declare function Database_Services, Error_Services, SRP_Json, SRP_Com, Environment_Services, Logging_Services
|
Declare function Database_Services, Error_Services, SRP_Json, SRP_Com, Environment_Services, Logging_Services
|
||||||
Declare function Datetime, Rds_Services, GetTickCount, SRP_Array
|
Declare function Datetime, Rds_Services, GetTickCount, SRP_Array, Date_Services
|
||||||
Declare subroutine Error_Services, SRP_Json, SRP_Com, Wo_Mat_Services, Database_Services, Logging_Services
|
Declare subroutine Error_Services, SRP_Json, SRP_Com, Wo_Mat_Services, Database_Services, Logging_Services
|
||||||
Declare subroutine obj_wo_mat_log, Set_Status, Rds_Services, Signature_Services, Mona_Services, Btree.Extract
|
Declare subroutine obj_wo_mat_log, Set_Status, Rds_Services, Signature_Services, Mona_Services, Btree.Extract
|
||||||
Declare subroutine Transaction_Services
|
Declare subroutine Transaction_Services
|
||||||
@ -86,6 +86,7 @@ Return Response or ""
|
|||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
Service ConvertRecordToJSON(WOMatKey, Record, ItemURL)
|
Service ConvertRecordToJSON(WOMatKey, Record, ItemURL)
|
||||||
|
|
||||||
jsonRecord = ''
|
jsonRecord = ''
|
||||||
IF WOMatKey NE '' then
|
IF WOMatKey NE '' then
|
||||||
If Record EQ '' then Record = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
|
If Record EQ '' then Record = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
|
||||||
@ -290,6 +291,50 @@ Service ConvertRecordToJSON(WOMatKey, Record, ItemURL)
|
|||||||
End Service
|
End Service
|
||||||
|
|
||||||
|
|
||||||
|
Service ConvertRecordToJsonOIWizard(WOMatKey, WOMatRec)
|
||||||
|
|
||||||
|
Json = ''
|
||||||
|
If WOMatKey NE '' then
|
||||||
|
If WOMatRec EQ '' then WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
objJSON = ''
|
||||||
|
If SRP_JSON(objJSON, 'New', 'Object') then
|
||||||
|
objWOMat = ''
|
||||||
|
If SRP_JSON(objWOMat, 'New', 'Object') then
|
||||||
|
SRP_JSON(objWOMat, 'SetValue', 'KeyId', WOMatKey)
|
||||||
|
SRP_JSON(objWOMat, 'SetValue', 'CassNo', Field(WOMatKey, '*', 2, 1))
|
||||||
|
SRP_JSON(objWOMat, 'SetValue', 'SAPBatchNo', WOMatRec<WO_MAT_SAP_BATCH_NO$>)
|
||||||
|
SRP_JSON(objWOMat, 'SetValue', 'SAPTXDtm', Date_Services('ConvertDateTimeToISO8601', WOMatRec<WO_MAT_SAP_TX_DTM$>))
|
||||||
|
SRP_JSON(objWOMat, 'SetValue', 'RDSNo', WOMatRec<WO_MAT_RDS_NO$>)
|
||||||
|
SRP_JSON(objWOMat, 'SetValue', 'ShipNo', WOMatRec<WO_MAT_SHIP_NO$>)
|
||||||
|
SRP_JSON(objWOMat, 'SetValue', 'LotNo', WOMatRec<WO_MAT_LOT_NO$>)
|
||||||
|
SRP_JSON(objWOMat, 'SetValue', 'Qty', WOMatRec<WO_MAT_WAFER_QTY$>)
|
||||||
|
SRP_JSON(objWOMat, 'SetValue', 'CustPartNo', WOMatRec<WO_MAT_CUST_PART_NO$>)
|
||||||
|
SRP_JSON(objWOMat, 'SetValue', 'SubPartNo', WOMatRec<WO_MAT_SUB_PART_NO$>)
|
||||||
|
SRP_JSON(objWOMat, 'SetValue', 'VendorCd', WOMatRec<WO_MAT_SUB_VEND_CD$>)
|
||||||
|
SRP_JSON(objWOMat, 'SetValue', 'RecDtm', Date_Services('ConvertDateTimeToISO8601', WOMatRec<WO_MAT_RX_DTM$>))
|
||||||
|
SRP_JSON(objWOMat, 'SetValue', 'RelDtm', Date_Services('ConvertDateTimeToISO8601', WOMatRec<WO_MAT_REL_DTM$>))
|
||||||
|
SRP_JSON(objWOMat, 'SetValue', 'RecUser', OConv(WOMatRec<WO_MAT_RX_BY$>, '[XLATE_CONV,LSL_USERS*FIRST_LAST]'))
|
||||||
|
SRP_JSON(objWOMat, 'SetValue', 'RelUser', OConv(WOMatRec<WO_MAT_REL_BY$>, '[XLATE_CONV,LSL_USERS*FIRST_LAST]' ))
|
||||||
|
SRP_JSON(objJSON, 'Set', 'WO_Mat', objWOMat)
|
||||||
|
SRP_JSON(objWOMat, 'Release')
|
||||||
|
Json = SRP_JSON(objJSON, 'Stringify', 'Fast')
|
||||||
|
end else
|
||||||
|
Error_Services('Add', 'Unable to create JSON representation in the ' : Service : ' service.')
|
||||||
|
end
|
||||||
|
SRP_JSON(objJSON, 'Release')
|
||||||
|
end else
|
||||||
|
Error_Services('Add', 'Unable to create JSON representation in the ' : Service : ' service.')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
Error_Services('Add', 'KeyID argument was missing in the ' : Service : ' service.')
|
||||||
|
end
|
||||||
|
Response = Json
|
||||||
|
|
||||||
|
end service
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------------------------
|
||||||
// GetWaferMap
|
// GetWaferMap
|
||||||
//
|
//
|
||||||
|
Reference in New Issue
Block a user