Compare commits

...

20 Commits

Author SHA1 Message Date
Infineon\StieberD
e5f0e9b7f1 modified passdown commuter module to clear form on successful entry post 2025-06-05 13:07:21 -07:00
Infineon\StieberD
869787e0f3 Added logging to proc queue processing. Refactored code to delete request on failures. Restored MCP call in Service_Manager_Events to avoid issues calling certain procedures. 2025-06-04 17:05:06 -07:00
Infineon\StieberD
38fc89dac6 Updated service manager debugger intercept to also send notes (emails). Refactored Service_Manager_Events so that the call stack is not hidden behind MCP.
updated debugger intercept distribution group
2025-06-04 11:21:30 -07:00
Ouellette Jonathan (CSC FI SPS MESLEO)
614da8ad3b Merged PR 18112: Changed faulty call to LotEventServices -> CreateLotEvent to correct call
Changed faulty call to LotEventServices -> CreateLotEvent to correct call
2025-06-04 18:22:08 +02:00
Infineon\StieberD
dcb61e220c added production supervisors to MET DEPT popup so that calibration reminders are sent to them 2025-06-03 13:03:40 -07:00
Ouellette Jonathan (CSC FI SPS MESLEO)
117e5c8b4b Merged PR 18016: Added a new notification group and added group to get notifications on return...
Added a new notification group and added group to get notifications on return to fab
2025-06-02 21:00:34 +02:00
Infineon\StieberD
25c608c9a6 added a check for status of VOID within WO_MAT_ACTIONS to prevent creating MAKEUP_WAFERS record if lot is voided 2025-06-02 09:35:26 -07:00
Infineon\StieberD
31632e28aa fixed typo preventing location of calibration from being inserted into reminder email 2025-05-28 12:04:08 -07:00
Infineon\StieberD
03b0c8f606 re-enabling code temporarily turned off to populate REACT_ITEM<CURR_STATUS_STATIC> 2025-05-28 10:37:06 -07:00
Infineon\StieberD
6cfb6e521e Added new metric to track for reactor maintenance. Fixed a bug in DecrementWfrMetrics service.
added in equate changes
2025-05-28 01:29:32 +02:00
Infineon\StieberD
481f083804 added JFUENTE1 to MET DEPT so that MET type calibration notifications are also sent to her 2025-05-27 16:18:10 -07:00
Infineon\StieberD
18919090d8 updated wo_daily_sched_comm2 to pull the run order number from RUN_ORDER_NUM column in the RDS table 2025-05-27 11:30:13 -07:00
Infineon\StieberD
550f376a0b ready for deployment 2025-05-27 18:38:30 +02:00
Chase Tucker
6aad8036e5 Require TW logging at HTR last cassette unload 2025-05-27 08:54:38 -07:00
Chase Tucker
4fc7eb189b Add isAuthorizedToOverrideROTR flag 2025-05-27 17:30:21 +02:00
Infineon\StieberD
5e917e65ac added prod spec special instruction message for WMO makeup additions if flag set in PSN
added checkbox on prod spec form to set or unset show special instruction on backfill operation
2025-05-23 16:55:33 -07:00
Stieber Daniel (CSC FI SPS MESLEO)
97f3c3fce2 Merged PR 17496: updated CancelNicaOrder service to adapt to an update in the NICAIntegrationS...
updated CancelNicaOrder service to adapt to an update in the NICAIntegrationService
2025-05-23 20:36:18 +02:00
Stieber Daniel (CSC FI SPS MESLEO)
27d55d83a1 Merged PR 17495: fixed WM_OUT form Special Instruction source
fixed WM_OUT form Special Instruction source
2025-05-23 19:41:15 +02:00
Ouellette Jonathan (CSC FI SPS MESLEO)
4e213ff253 Merged PR 17284: Added call to CreateLotEvent routine on successful
Added call to CreateLotEvent routine on successful
completion of a lot qty adjustment to mark it as
as manual adjustment.
2025-05-21 23:53:18 +02:00
292bc4646b Merged PR 17058: Start sending 10 point thickness runs to InfinityQS
Start sending 10 point thickness runs to InfinityQS by copying the logic of the 14 point

Related work items: #255371, #255376
2025-05-21 21:34:30 +02:00
42 changed files with 13695 additions and 10015 deletions

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,675 @@
{
"header": {
"version": 1,
"type": "record"
},
"body": {
"record1": {
"<1>": "1010",
"<2>": "3",
"<3>": ""
},
"record2": {
"<1>": {
"<1,1>": "NDW_ACKNOWLEDGE_MESSAGE",
"<1,2>": "",
"<1,3>": "WINDOW",
"<1,4>": "",
"<1,5>": "137",
"<1,6>": "173",
"<1,7>": "-765",
"<1,8>": "-539",
"<1,9>": "Process Message",
"<1,10>": {
"<1,10,1>": "0x84C80000",
"<1,10,2>": "0x101"
},
"<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>": "0"
},
"<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,19>": "CREATE",
"<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>": "2",
"<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>": "EDB_DATA",
"<1,2>": "",
"<1,3>": "EDITBOX",
"<1,4>": "NDW_ACKNOWLEDGE_MESSAGE",
"<1,5>": "16",
"<1,6>": "12",
"<1,7>": "-17",
"<1,8>": "-48",
"<1,9>": "",
"<1,10>": {
"<1,10,1>": "0x56200840",
"<1,10,2>": "0x200"
},
"<1,11>": {
"<1,11,1>": "0xC400",
"<1,11,2>": "0x80000000"
},
"<1,12>": "3",
"<1,13>": {
"<1,13,1>": "-2",
"<1,13,2>": "-2",
"<1,13,3>": ""
},
"<1,14>": "-2",
"<1,15>": {
"<1,15,1>": {
"<1,15,1,1>": "Segoe UI",
"<1,15,1,2>": "-15",
"<1,15,1,3>": "400",
"<1,15,1,4>": "0",
"<1,15,1,5>": "0",
"<1,15,1,6>": "0",
"<1,15,1,7>": "0",
"<1,15,1,8>": "34",
"<1,15,1,9>": "0",
"<1,15,1,10>": "3",
"<1,15,1,11>": "2",
"<1,15,1,12>": "1"
}
},
"<1,16>": "",
"<1,17>": "",
"<1,18>": "",
"<1,19>": "",
"<1,20>": "",
"<1,21>": "",
"<1,22>": "",
"<1,23>": "",
"<1,24>": "",
"<1,25>": "",
"<1,26>": "",
"<1,27>": "",
"<1,28>": "<<None>>",
"<1,29>": "<<None>>",
"<1,30>": "",
"<1,31>": "0",
"<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,59>": "",
"<1,60>": "",
"<1,61>": "",
"<1,62>": "0",
"<1,63>": "",
"<1,64>": "",
"<1,65>": "",
"<1,66>": "",
"<1,67>": "",
"<1,68>": "",
"<1,69>": "",
"<1,70>": "",
"<1,71>": "",
"<1,72>": "",
"<1,73>": "",
"<1,74>": "",
"<1,75>": "",
"<1,76>": "",
"<1,77>": "",
"<1,78>": "",
"<1,79>": "",
"<1,80>": "",
"<1,81>": "",
"<1,82>": "",
"<1,83>": "",
"<1,84>": "",
"<1,85>": "",
"<1,86>": "",
"<1,87>": "",
"<1,88>": "",
"<1,89>": "",
"<1,90>": "",
"<1,91>": "",
"<1,92>": "",
"<1,93>": "",
"<1,94>": "",
"<1,95>": "",
"<1,96>": "",
"<1,97>": "",
"<1,98>": "",
"<1,99>": "",
"<1,100>": "",
"<1,101>": "",
"<1,102>": "",
"<1,103>": "",
"<1,104>": "",
"<1,105>": "",
"<1,106>": "",
"<1,107>": "",
"<1,108>": ""
},
"<2>": {
"<2,1>": "PUB_OK",
"<2,2>": "",
"<2,3>": "PUSHBUTTON",
"<2,4>": "NDW_ACKNOWLEDGE_MESSAGE",
"<2,5>": "-184",
"<2,6>": "-37",
"<2,7>": "80",
"<2,8>": "24",
"<2,9>": "&OK",
"<2,10>": {
"<2,10,1>": "0x56000300",
"<2,10,2>": "0x0"
},
"<2,11>": {
"<2,11,1>": "0x3005",
"<2,11,2>": "0x80000000"
},
"<2,12>": "1",
"<2,13>": {
"<2,13,1>": "-2",
"<2,13,2>": "-2",
"<2,13,3>": "0"
},
"<2,14>": "-2",
"<2,15>": {
"<2,15,1>": {
"<2,15,1,1>": "Segoe UI",
"<2,15,1,2>": "-12",
"<2,15,1,3>": "400",
"<2,15,1,4>": "0",
"<2,15,1,5>": "0",
"<2,15,1,6>": "0",
"<2,15,1,7>": "1",
"<2,15,1,8>": "0",
"<2,15,1,9>": "0",
"<2,15,1,10>": "0",
"<2,15,1,11>": "0",
"<2,15,1,12>": "0"
}
},
"<2,16>": "",
"<2,17>": "",
"<2,18>": {
"<2,18,1>": {
"<2,18,1,1>": "X",
"<2,18,1,2>": "EXECUTE",
"<2,18,1,3>": "@WINDOW_EVENTS",
"<2,18,1,4>": {
"<2,18,1,4,1>": "@SELF",
"<2,18,1,4,2>": "@EVENT",
"<2,18,1,4,3>": "@PARAM1",
"<2,18,1,4,4>": "@PARAM2",
"<2,18,1,4,5>": "@PARAM3",
"<2,18,1,4,6>": "@PARAM4",
"<2,18,1,4,7>": "@PARAM5",
"<2,18,1,4,8>": "@PARAM6"
},
"<2,18,1,5>": "",
"<2,18,1,6>": "",
"<2,18,1,7>": "",
"<2,18,1,8>": "",
"<2,18,1,9>": "",
"<2,18,1,10>": "",
"<2,18,1,11>": "",
"<2,18,1,12>": "",
"<2,18,1,13>": "",
"<2,18,1,14>": "",
"<2,18,1,15>": "COMMEVT",
"<2,18,1,16>": "0"
}
},
"<2,19>": "CLICK",
"<2,20>": "",
"<2,21>": "",
"<2,22>": "",
"<2,23>": "",
"<2,24>": "",
"<2,25>": "",
"<2,26>": "",
"<2,27>": "",
"<2,28>": "",
"<2,29>": "",
"<2,30>": "",
"<2,31>": "",
"<2,32>": "",
"<2,33>": "",
"<2,34>": "",
"<2,35>": "",
"<2,36>": "",
"<2,37>": "",
"<2,38>": "",
"<2,39>": "",
"<2,40>": "-1",
"<2,41>": {
"<2,41,1>": "",
"<2,41,2>": "-1"
},
"<2,42>": "",
"<2,43>": "",
"<2,44>": "",
"<2,45>": "",
"<2,46>": "",
"<2,47>": "",
"<2,48>": "",
"<2,49>": "",
"<2,50>": "",
"<2,51>": "",
"<2,52>": "",
"<2,53>": "",
"<2,54>": "",
"<2,55>": "",
"<2,56>": "",
"<2,57>": "",
"<2,58>": "",
"<2,59>": "",
"<2,60>": "",
"<2,61>": "",
"<2,62>": "0",
"<2,63>": "",
"<2,64>": {
"<2,64,1>": "-2",
"<2,64,2>": "-2",
"<2,64,3>": "0"
},
"<2,65>": "-2",
"<2,66>": "",
"<2,67>": "",
"<2,68>": "",
"<2,69>": "",
"<2,70>": "",
"<2,71>": "",
"<2,72>": "",
"<2,73>": "",
"<2,74>": "",
"<2,75>": "",
"<2,76>": "",
"<2,77>": "",
"<2,78>": "",
"<2,79>": "",
"<2,80>": "",
"<2,81>": "",
"<2,82>": "",
"<2,83>": "",
"<2,84>": "",
"<2,85>": "",
"<2,86>": "",
"<2,87>": "",
"<2,88>": "",
"<2,89>": "",
"<2,90>": "0",
"<2,91>": "0",
"<2,92>": "",
"<2,93>": "",
"<2,94>": "",
"<2,95>": "",
"<2,96>": "",
"<2,97>": "",
"<2,98>": "",
"<2,99>": "",
"<2,100>": "",
"<2,101>": "",
"<2,102>": "",
"<2,103>": "",
"<2,104>": "",
"<2,105>": "",
"<2,106>": "",
"<2,107>": "",
"<2,108>": ""
},
"<3>": {
"<3,1>": "PUB_CANCEL",
"<3,2>": "",
"<3,3>": "PUSHBUTTON",
"<3,4>": "NDW_ACKNOWLEDGE_MESSAGE",
"<3,5>": "-97",
"<3,6>": "-37",
"<3,7>": "80",
"<3,8>": "24",
"<3,9>": "&Cancel",
"<3,10>": {
"<3,10,1>": "0x56000300",
"<3,10,2>": "0x0"
},
"<3,11>": {
"<3,11,1>": "0x3002",
"<3,11,2>": "0x80000000"
},
"<3,12>": "2",
"<3,13>": {
"<3,13,1>": "-2",
"<3,13,2>": "-2",
"<3,13,3>": "0"
},
"<3,14>": "-2",
"<3,15>": {
"<3,15,1>": {
"<3,15,1,1>": "Segoe UI",
"<3,15,1,2>": "-12",
"<3,15,1,3>": "400",
"<3,15,1,4>": "0",
"<3,15,1,5>": "0",
"<3,15,1,6>": "0",
"<3,15,1,7>": "1",
"<3,15,1,8>": "0",
"<3,15,1,9>": "0",
"<3,15,1,10>": "0",
"<3,15,1,11>": "0",
"<3,15,1,12>": "0"
}
},
"<3,16>": "",
"<3,17>": "",
"<3,18>": {
"<3,18,1>": {
"<3,18,1,1>": "X",
"<3,18,1,2>": "EXECUTE",
"<3,18,1,3>": "@WINDOW_EVENTS",
"<3,18,1,4>": {
"<3,18,1,4,1>": "@SELF",
"<3,18,1,4,2>": "@EVENT",
"<3,18,1,4,3>": "@PARAM1",
"<3,18,1,4,4>": "@PARAM2",
"<3,18,1,4,5>": "@PARAM3",
"<3,18,1,4,6>": "@PARAM4",
"<3,18,1,4,7>": "@PARAM5",
"<3,18,1,4,8>": "@PARAM6"
},
"<3,18,1,5>": "",
"<3,18,1,6>": "",
"<3,18,1,7>": "",
"<3,18,1,8>": "",
"<3,18,1,9>": "",
"<3,18,1,10>": "",
"<3,18,1,11>": "",
"<3,18,1,12>": "",
"<3,18,1,13>": "",
"<3,18,1,14>": "",
"<3,18,1,15>": "COMMEVT",
"<3,18,1,16>": "0"
}
},
"<3,19>": "CLICK",
"<3,20>": "",
"<3,21>": "",
"<3,22>": "",
"<3,23>": "",
"<3,24>": "",
"<3,25>": "",
"<3,26>": "",
"<3,27>": "",
"<3,28>": "",
"<3,29>": "",
"<3,30>": "",
"<3,31>": "",
"<3,32>": "",
"<3,33>": "",
"<3,34>": "",
"<3,35>": "",
"<3,36>": "",
"<3,37>": "",
"<3,38>": "",
"<3,39>": "",
"<3,40>": "-1",
"<3,41>": {
"<3,41,1>": "",
"<3,41,2>": "-1"
},
"<3,42>": "",
"<3,43>": "",
"<3,44>": "",
"<3,45>": "",
"<3,46>": "",
"<3,47>": "",
"<3,48>": "",
"<3,49>": "",
"<3,50>": "",
"<3,51>": "",
"<3,52>": "",
"<3,53>": "",
"<3,54>": "",
"<3,55>": "",
"<3,56>": "",
"<3,57>": "",
"<3,58>": "",
"<3,59>": "",
"<3,60>": "",
"<3,61>": "",
"<3,62>": "0",
"<3,63>": "",
"<3,64>": {
"<3,64,1>": "-2",
"<3,64,2>": "-2",
"<3,64,3>": "0"
},
"<3,65>": "-2",
"<3,66>": "",
"<3,67>": "",
"<3,68>": "",
"<3,69>": "",
"<3,70>": "",
"<3,71>": "",
"<3,72>": "",
"<3,73>": "",
"<3,74>": "",
"<3,75>": "",
"<3,76>": "",
"<3,77>": "",
"<3,78>": "",
"<3,79>": "",
"<3,80>": "",
"<3,81>": "",
"<3,82>": "",
"<3,83>": "",
"<3,84>": "",
"<3,85>": "",
"<3,86>": "",
"<3,87>": "",
"<3,88>": "",
"<3,89>": "",
"<3,90>": "0",
"<3,91>": "0",
"<3,92>": "",
"<3,93>": "",
"<3,94>": "",
"<3,95>": "",
"<3,96>": "",
"<3,97>": "",
"<3,98>": "",
"<3,99>": "",
"<3,100>": "",
"<3,101>": "",
"<3,102>": "",
"<3,103>": "",
"<3,104>": "",
"<3,105>": "",
"<3,106>": "",
"<3,107>": "",
"<3,108>": ""
}
},
"record4": {
"<1>": ""
}
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -423,7 +423,7 @@
"<1,31>": "", "<1,31>": "",
"<1,32>": "", "<1,32>": "",
"<1,33>": "", "<1,33>": "",
"<1,34>": "", "<1,34>": "LSL2*IMAGE*ICO*INFINEON",
"<1,35>": "", "<1,35>": "",
"<1,36>": "", "<1,36>": "",
"<1,37>": { "<1,37>": {

View File

@ -6655,13 +6655,6 @@
"<41,35,3,3>": "", "<41,35,3,3>": "",
"<41,35,3,4>": "", "<41,35,3,4>": "",
"<41,35,3,5>": "" "<41,35,3,5>": ""
},
"<41,35,4>": {
"<41,35,4,1>": "",
"<41,35,4,2>": "",
"<41,35,4,3>": "",
"<41,35,4,4>": "",
"<41,35,4,5>": ""
} }
}, },
"<41,36>": "", "<41,36>": "",
@ -7886,7 +7879,7 @@
"<45,10,2>": "0x200" "<45,10,2>": "0x200"
}, },
"<45,11>": { "<45,11>": {
"<45,11,1>": "0x0", "<45,11,1>": "0x80000",
"<45,11,2>": "0x80000000" "<45,11,2>": "0x80000000"
}, },
"<45,12>": "45", "<45,12>": "45",
@ -7922,7 +7915,7 @@
"<45,21>": "", "<45,21>": "",
"<45,22>": "", "<45,22>": "",
"<45,23>": "WM_OUT", "<45,23>": "WM_OUT",
"<45,24>": "SPECIAL_INST", "<45,24>": "SPEC_INST",
"<45,25>": "", "<45,25>": "",
"<45,26>": "", "<45,26>": "",
"<45,27>": "", "<45,27>": "",

View File

@ -40,7 +40,7 @@
"<8,2>": { "<8,2>": {
"<8,2,1>": "MET", "<8,2,1>": "MET",
"<8,2,2>": "Metrology", "<8,2,2>": "Metrology",
"<8,2,3>": "TODD_C, JEANNE_M" "<8,2,3>": "TODD_C, JEANNE_M, JFUENTE1, JUSTIN_H, JONATHON_S, MARROQUINBRA, TIFFANY_M"
}, },
"<8,3>": { "<8,3>": {
"<8,3,1>": "MTC", "<8,3,1>": "MTC",

View File

@ -9,7 +9,7 @@
"<2>": "-1", "<2>": "-1",
"<3>": "-1", "<3>": "-1",
"<4>": "-1", "<4>": "-1",
"<5>": "16777215", "<5>": "-2",
"<6>": { "<6>": {
"<6,1>": { "<6,1>": {
"<6,1,1>": "Tahoma", "<6,1,1>": "Tahoma",
@ -31,7 +31,7 @@
} }
}, },
"<7>": "REACT_ITEM", "<7>": "REACT_ITEM",
"<8>": "BY @ID", "<8>": "BY-DSND ENTER_DTM",
"<9>": { "<9>": {
"<9,1>": { "<9,1>": {
"<9,1,1>": "RI_NO", "<9,1,1>": "RI_NO",
@ -120,6 +120,22 @@
"<9,11,4>": "C", "<9,11,4>": "C",
"<9,11,5>": "D4/", "<9,11,5>": "D4/",
"<9,11,6>": "Retire Dt" "<9,11,6>": "Retire Dt"
},
"<9,12>": {
"<9,12,1>": "ENTER_DTM",
"<9,12,2>": "14",
"<9,12,3>": "L",
"<9,12,4>": "C",
"<9,12,5>": "DT2/^H",
"<9,12,6>": "Enter Dtm"
},
"<9,13>": {
"<9,13,1>": "CURR_STATUS",
"<9,13,2>": "5",
"<9,13,3>": "L",
"<9,13,4>": "C",
"<9,13,5>": "[CONV_ITEM_CURR_STATUS]",
"<9,13,6>": "Curr Status"
} }
}, },
"<10>": "T", "<10>": "T",
@ -147,7 +163,17 @@
"<32>": "0", "<32>": "0",
"<33>": "1", "<33>": "1",
"<34>": "16777215", "<34>": "16777215",
"<35>": "16777215" "<35>": "16766894",
"<36>": "",
"<37>": "",
"<38>": "",
"<39>": "",
"<40>": "-2",
"<41>": "1000",
"<42>": "",
"<43>": "",
"<44>": "",
"<45>": ""
} }
} }
} }

View File

@ -9,7 +9,7 @@
"<2>": "-1", "<2>": "-1",
"<3>": "-1", "<3>": "-1",
"<4>": "-1", "<4>": "-1",
"<5>": "16777215", "<5>": "-2",
"<6>": { "<6>": {
"<6,1>": { "<6,1>": {
"<6,1,1>": "MS Sans Serif", "<6,1,1>": "MS Sans Serif",
@ -91,7 +91,17 @@
"<32>": "0", "<32>": "0",
"<33>": "1", "<33>": "1",
"<34>": "16777215", "<34>": "16777215",
"<35>": "16777215" "<35>": "16777215",
"<36>": "",
"<37>": "",
"<38>": "",
"<39>": "",
"<40>": "-2",
"<41>": "1000",
"<42>": "",
"<43>": "",
"<44>": "",
"<45>": ""
} }
} }
} }

View File

@ -235,7 +235,7 @@ Service SendReminders()
IF CLType = 'E' THEN IF CLType = 'E' THEN
Desc = CLRec<CALIB_LIST_EQ_DESC$> Desc = CLRec<CALIB_LIST_EQ_DESC$>
SN = CLRec<CALIB_LIST_EQ_SN$> SN = CLRec<CALIB_LIST_EQ_SN$>
Loc = CLRec<CALIB_LIST_EQ_LOC$ Loc = CLRec<CALIB_LIST_EQ_LOC$>
NewLine = Desc:' (S/N: ':SN:') located in the ':Loc:' is due for calibration on ':NextCalDt:CRLF$ NewLine = Desc:' (S/N: ':SN:') located in the ':Loc:' is due for calibration on ':NextCalDt:CRLF$
END END
IF CLType = 'S' THEN IF CLType = 'S' THEN

View File

@ -50,109 +50,112 @@ RETURN Result
* * * * * * * * * * * * * *
Create: Create:
* * * * * * * * * * * * * *
obj_AppWindow('Create') obj_AppWindow('Create')
Set_Property(@WINDOW,'STATUSLINE',@WINDOW:'.STATUSLINE_FIX') Set_Property(@WINDOW,'STATUSLINE',@WINDOW:'.STATUSLINE_FIX')
GOSUB Refresh GOSUB Refresh
RETURN RETURN
* * * * * * * * * * * * * *
Refresh: Refresh:
* * * * * * * * * * * * * *
RETURN RETURN
* * * * * * * * * * * * * *
ReactNoGF: ReactNoGF:
* * * * * * * * * * * * * *
* Don't add a return here * Don't add a return here
* * * * * * * * * * * * * *
LUReactor: LUReactor:
* * * * * * * * * * * * * *
IF NOT(ASSIGNED(Parm1)) THEN FocusControl = '' ELSE FocusControl = Parm1 IF NOT(ASSIGNED(Parm1)) THEN FocusControl = '' ELSE FocusControl = Parm1
IF NOT(ASSIGNED(Parm2)) THEN FocusPos = '' ELSE FocusPos = Parm2 IF NOT(ASSIGNED(Parm2)) THEN FocusPos = '' ELSE FocusPos = Parm2
Set_Status(0) Set_Status(0)
TypeOver = '' TypeOver = ''
TypeOver<PSELECT$> = '2' ;* Multiple Select TypeOver<PSELECT$> = '2' ;* Multiple Select
TypeOver<PTYPE$> = 'E' ;* Return entire row TypeOver<PTYPE$> = 'E' ;* Return entire row
ReactData = Popup(@WINDOW,TypeOver,'REACTORS') ReactData = Popup(@WINDOW,TypeOver,'REACTORS')
IF ReactData = '' THEN RETURN IF ReactData = '' THEN RETURN
Set_Property(@WINDOW:'.REACT_NO','LIST',ReactData) Set_Property(@WINDOW:'.REACT_NO','LIST',ReactData)
LineCnt = COUNT(ReactData,@FM) + (ReactData NE '') LineCnt = COUNT(ReactData,@FM) + (ReactData NE '')
ColCnt = 7 ColCnt = 7
FOR Line = 1 TO LineCnt FOR Line = 1 TO LineCnt
FOR Column = 2 TO ColCnt FOR Column = 2 TO ColCnt
stat = Send_Message(@WINDOW:'.REACT_NO','COLOR_BY_POS',Column,Line,GREEN$) stat = Send_Message(@WINDOW:'.REACT_NO','COLOR_BY_POS',Column,Line,GREEN$)
NEXT Column NEXT Column
NEXT Line NEXT Line
RETURN RETURN
* * * * * * * * * * * * * *
Cancel: Cancel:
* * * * * * * * * * * * * *
End_Dialog(@WINDOW,'') End_Dialog(@WINDOW,'')
RETURN RETURN
* * * * * * * * * * * * * *
PostEntries: PostEntries:
* * * * * * * * * * * * * *
ReactNos = Get_Property(@WINDOW:'.REACT_NO','ARRAY')<COL$REACT_NO>
Comment = Get_Property(@WINDOW:'.COMMENT','DEFPROP')
LOOP
TestChar = ReactNos[-1,1]
UNTIL TestChar NE @VM OR ReactNos = ''
ReactNos[-1,1] = ''
REPEAT
EventKeys = '' ;* Keys to return to the REACT_EVENT window for a browse of the newly created records
IF ReactNos NE '' AND Comment NE '' THEN
EventDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS') ;* Same DTM for all new records
EventType = 'PD' ;* Passdown
LoggedBy = @USER4
ReactCnt = COUNT(ReactNos,@VM) + (ReactNos NE '') ReactNos = Get_Property(@WINDOW:'.REACT_NO','ARRAY')<COL$REACT_NO>
Comment = Get_Property(@WINDOW:'.COMMENT','DEFPROP')
FOR I = 1 TO ReactCnt LOOP
ReactNo = ReactNos<1,I> TestChar = ReactNos[-1,1]
CurrMode = XLATE('REACTOR',ReactNo,'CURR_MODE','X') UNTIL TestChar NE @VM OR ReactNos = ''
ReactNos[-1,1] = ''
REPEAT
EventKeys = '' ;* Keys to return to the REACT_EVENT window for a browse of the newly created records
IF ReactNos NE '' AND Comment NE '' THEN
obj_React_Event('Create',ReactNo:@RM:EventDTM:@RM:EventType:@RM:LoggedBy:@RM:Comment:@RM:@RM:CurrMode) EventDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS') ;* Same DTM for all new records
EventKeys<I> = ReactNo:'*':ICONV(EventDTM,'DT') EventType = 'PD' ;* Passdown
NEXT I LoggedBy = @USER4
END ReactCnt = COUNT(ReactNos,@VM) + (ReactNos NE '')
End_Dialog(@WINDOW,EventKeys) FOR I = 1 TO ReactCnt
ReactNo = ReactNos<1,I>
CurrMode = XLATE('REACTOR',ReactNo,'CURR_MODE','X')
obj_React_Event('Create',ReactNo:@RM:EventDTM:@RM:EventType:@RM:LoggedBy:@RM:Comment:@RM:@RM:CurrMode)
ErrCode = ''
If Get_Status(ErrCode) then
Msg(@Window, '', 'OK', '', 'Process Error':@FM:'Error posting entries. ':ErrCode)
end else
Set_Property(@Window:'.REACT_NO', 'LIST', '')
Set_Property(@Window:'.COMMENT', 'TEXT', '')
end
EventKeys<I> = ReactNo:'*':ICONV(EventDTM,'DT')
NEXT I
END else
Msg(@Window, '', 'OK', '', 'Process Error':@FM:'React No(s) and Comment must not be null!')
end
RETURN RETURN

View File

@ -20,7 +20,7 @@ Declare Function Get_Property, Get_Status, Dialog_Box, Utility, Popup, Collect.I
Declare Function Send_Message, Msg, Security_Check, obj_React_Item, Select_Into, MemberOf, Create_Dialog, obj_Calendar Declare Function Send_Message, Msg, Security_Check, obj_React_Item, Select_Into, MemberOf, Create_Dialog, obj_Calendar
Declare Function GetAsyncKeyState, obj_Tables, MemberOf, Environment_Services, Database_Services, Rds_Services Declare Function GetAsyncKeyState, obj_Tables, MemberOf, Environment_Services, Database_Services, Rds_Services
Declare Function Reactor_Services, Error_Services, React_Servs_Services, Reactor_Log_Services, Send_Event, SRP_List Declare Function Reactor_Services, Error_Services, React_Servs_Services, Reactor_Log_Services, Send_Event, SRP_List
Declare Function Nica_Orders_Services Declare Function Nica_Orders_Services, SRP_Date, React_Item_Services, SRP_Datetime, Datetime
$Insert MSG_EQUATES $Insert MSG_EQUATES
$Insert APPCOLORS $Insert APPCOLORS
@ -1229,64 +1229,51 @@ SvcsOptions:
If ItemType NE '' then If ItemType NE '' then
RetVal = '' RetVal = ''
ItemType = ICONV(ItemType,'[CONV_CODE_DESC,REACT_ITEM_TYPE]')
ItemType = ICONV(ItemType,'[CONV_CODE_DESC,REACT_ITEM_TYPE]') RIKeys = React_Item_Services('GetReactItems', ItemType, 'N,U')
OPEN 'DICT.REACT_ITEM' to DictReactItem else If Error_Services('NoError') then
ErrMsg('Unable to open DICT.REACT_ITEM')
return TypeOver = ''
end TypeOVer<PMODE$> = 'K'
TypeOver<PDISPLAY$> = RIKeys
SearchString = 'RI_TYPE':@VM:ItemType:@FM RetVal = Popup(@Window,TypeOver,'REACT_ITEM')
SearchString := 'CURR_STATUS':@VM:'N':@VM:'U':@FM
If RetVal NE '' then
RIKeys = '' obj_AppWindow('LUValReturn',RetVal:@RM:@Window:'.SERV_INFO':@RM:SelPos)
Option = ''
Flag = '' RIRec = XLATE('REACT_ITEM',RetVal,'','X')
Btree.Extract(SearchString,'REACT_ITEM',DictReactItem,RIKeys,Option,Flag) If RIRec<REACT_ITEM_RI_TYPE$> = 'T' then
If Get_Status(errCode) then CardWindow = 'REACT_ITEM'
ErrMsg(errCode) CardKey = RetVal
return DefaultRec = ''
end NewCardCtrl = ''
RecalcCtrl = @Window:'.SERV_INFO'
TypeOver = '' RecalcPos = SelPos
TypeOVer<PMODE$> = 'K' RetCtrl = @Window:'.SERV_INFO'
TypeOver<PDISPLAY$> = RIKeys RetPos = SelPos
RetVal = Popup(@Window,TypeOver,'REACT_ITEM')
oAParms = CardWindow:@RM:CardKey:@RM:DefaultRec:@RM:NewCardCtrl:@RM:RecalcCtrl:@RM:RecalcPos:@RM:RetCtrl:@RM:RetPos
If RetVal NE '' then
obj_AppWindow('LUValReturn',RetVal:@RM:@Window:'.SERV_INFO':@RM:SelPos) obj_AppWindow('ViewNewCard',oAParms)
RIRec = XLATE('REACT_ITEM',RetVal,'','X') Set_Property('REACT_ITEM.TUBE_GRADE','FOCUS',1)
If RIRec<REACT_ITEM_RI_TYPE$> = 'T' then If Get_Status(errCode) then
CardWindow = 'REACT_ITEM' ErrMsg(errCode)
CardKey = RetVal end
DefaultRec = '' end
NewCardCtrl = ''
RecalcCtrl = @Window:'.SERV_INFO' GoSub Refresh
RecalcPos = SelPos end
RetCtrl = @Window:'.SERV_INFO' end else
RetPos = SelPos Error_Services('DisplayError')
oAParms = CardWindow:@RM:CardKey:@RM:DefaultRec:@RM:NewCardCtrl:@RM:RecalcCtrl:@RM:RecalcPos:@RM:RetCtrl:@RM:RetPos
obj_AppWindow('ViewNewCard',oAParms)
Set_Property('REACT_ITEM.TUBE_GRADE','FOCUS',1)
If Get_Status(errCode) then
ErrMsg(errCode)
end
end
GoSub Refresh
end end
end ;* End of check for null SNReq end ;* End of check for null SNReq
End Case End Case
GoSub Refresh GoSub Refresh
@ -1877,4 +1864,3 @@ ColorRemRiTable:
return return

View File

@ -1099,7 +1099,7 @@ SignSupVer:
************************************************************************ ************************************************************************
WMOKey = Get_Property(@WINDOW,'ID') WMOKey = Get_Property(@WINDOW,'ID')
PSNo = Get_Property(@WINDOW:'.PS_NO)','TEXT') PSNo = Get_Property(@WINDOW:'.PS_NO)','TEXT')
VerInst = XLATE('PRS_STAGE',PSNo:'*QA',PRS_STAGE_INST$,'X') VerInst = XLATE('PRS_STAGE',PSNo:'*MO_QA',PRS_STAGE_INST$,'X')
IF (VerInst NE '') THEN IF (VerInst NE '') THEN
Yes = Dialog_Box( 'RDS_VER', @WINDOW, VerInst ) Yes = Dialog_Box( 'RDS_VER', @WINDOW, VerInst )
IF NOT(Yes) THEN IF NOT(Yes) THEN
@ -1711,129 +1711,142 @@ AddMakeup:
END END
NEXT I NEXT I
Response = Dialog_Box('NDW_MAKEUP_WAFERS', @Window, WOMatKey) Continue = True$
ShowSpecInst = Xlate('PROD_SPEC', PSNo, PROD_SPEC_SHOW_SPEC_INST_ON_MU_ADD$, 'X')
If ShowSpecInst then
SpecInst = Xlate('PROD_SPEC', PSNo, PROD_SPEC_SPEC_INST$, 'X')
If SpecInst NE '' then
Continue = Dialog_Box('NDW_ACKNOWLEDGE_MESSAGE', @Window, SpecInst)
If Not(Continue) then
Msg(@Window, '', 'OK', '', 'Process Error':@FM:'This PSN requires you to acknowledge special instructions to add makeup wafers.')
end
end
end
Begin Case If Continue then
Case Response EQ True$ Response = Dialog_Box('NDW_MAKEUP_WAFERS', @Window, WOMatKey)
// User requested to convert the current cassette into a makeup box.
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey) Begin Case
If Error_Services('NoError') then Case Response EQ True$
SAPBatchNo = WOMatRec<WO_MAT_SAP_BATCH_NO$>
SAPTXDtm = WOMatRec<WO_MAT_SAP_TX_DTM$>
AwaitingBatchNo = ( (SAPTXDtm NE '') and (SAPBatchNo EQ '') )
HasBatchNo = (SAPBatchNo NE '')
FullBoxReject = (SAPBatchNo[-1, 1] = 'R')
Begin Case
Case AwaitingBatchNo
InvalidRequest = True$
ErrMsg('WARNING: Cassette ineligible to be converted as it is awaiting a batch number from SAP.')
Return
Case FullBoxReject
InvalidRequest = True$
ErrMsg('WARNING: Cassette is ineligible to be converted as it is a full box reject.')
Return
Case HasBatchNo
// Operation limited to LEAD and SUPERVISOR groups
OverrideMsg = "Cassette has a batch number. SUPERVISOR or LEAD must override."
Response = Msg(@Window, '', 'OVERRIDE', '', OverrideMsg)
Begin Case
Case Response EQ 1
Response = True$ ; // User Clicked Override
Case Response EQ 2
Response = False$ ; // User Clicked Cancel
Case Response EQ char(27)
Response = False$ ; // User Pressed Escape Key
End Case
If Response EQ True$ then
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:'LEAD':@VM:'SUPERVISOR')
Authorized = Response<1>
end else
Authorized = False$
end
If Not(Authorized) then Return
Case Otherwise$
Null
End Case
AvailMU_WMOKeys = ''
UserResp = Response
MakeupBox = ''
// User requested to convert the current cassette into a makeup box. // User requested to convert the current cassette into a makeup box.
// Verify the quantity before proceeding. WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
If WMOutKey NE '' then If Error_Services('NoError') then
Parms = '' SAPBatchNo = WOMatRec<WO_MAT_SAP_BATCH_NO$>
Parms<1> = WMOutKey ; // Cassette to verify wafer count of. SAPTXDtm = WOMatRec<WO_MAT_SAP_TX_DTM$>
Parms<2> = 0 ; // Wafer count adjustment - 0 because converting box. AwaitingBatchNo = ( (SAPTXDtm NE '') and (SAPBatchNo EQ '') )
Parms<3> = 'MU' ; // Wafer counter tool location HasBatchNo = (SAPBatchNo NE '')
Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms) FullBoxReject = (SAPBatchNo[-1, 1] = 'R')
If Proceed NE True$ then Return Begin Case
Case AwaitingBatchNo
InvalidRequest = True$
ErrMsg('WARNING: Cassette ineligible to be converted as it is awaiting a batch number from SAP.')
Return
Case FullBoxReject
InvalidRequest = True$
ErrMsg('WARNING: Cassette is ineligible to be converted as it is a full box reject.')
Return
Case HasBatchNo
// Operation limited to LEAD and SUPERVISOR groups
OverrideMsg = "Cassette has a batch number. SUPERVISOR or LEAD must override."
Response = Msg(@Window, '', 'OVERRIDE', '', OverrideMsg)
Begin Case
Case Response EQ 1
Response = True$ ; // User Clicked Override
Case Response EQ 2
Response = False$ ; // User Clicked Cancel
Case Response EQ char(27)
Response = False$ ; // User Pressed Escape Key
End Case
If Response EQ True$ then
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:'LEAD':@VM:'SUPERVISOR')
Authorized = Response<1>
end else
Authorized = False$
end
If Not(Authorized) then Return
Case Otherwise$
Null
End Case
AvailMU_WMOKeys = ''
UserResp = Response
MakeupBox = ''
// User requested to convert the current cassette into a makeup box.
// Verify the quantity before proceeding.
If WMOutKey NE '' then
Parms = ''
Parms<1> = WMOutKey ; // Cassette to verify wafer count of.
Parms<2> = 0 ; // Wafer count adjustment - 0 because converting box.
Parms<3> = 'MU' ; // Wafer counter tool location
Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms)
If Proceed NE True$ then Return
end else
ErrMsg('Error starting wafer counter check. WM_OUT key is missing.')
end
CheckValue = 1
FieldNo = WO_MAT_EPO_MAKEUP_BOX$
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue) ;* Set WMO_MAKEUP flag on WM_OUT
IF Get_Status(errCode) THEN ErrMsg(errCode)
Set_Property(@WINDOW:'.MAKEUP_BOX','DEFPROP',CheckValue) ;* Make this the makeup box
Send_Event(@WINDOW,'WRITE') ;* Write the record
WMOKey = WONo:'*':ProcStepNo:'*':CassNo
obj_AppWindow('LoadFormKeys',@WINDOW:@RM:WMOKey) ;* Reread the updated record
Return
end else end else
ErrMsg('Error starting wafer counter check. WM_OUT key is missing.') ErrMsg('WARNING: Error reading WO_MAT record.')
Return
end
Case Response EQ ''
// User has cancelled this process.
Return
Case Otherwise$
// User has selected a makeup box to use and backfill.
AvailMU_WMOKeys = Response
MakeupBox = Response
MuWfrsNeeded = SelCnt
If AvailMU_WMOKeys NE '' then
// Wafer counter check - Account for the possibility of selecting more than one makeup box.
For each MuWmoKey in AvailMU_WMOKeys using @FM
MuWoMatKey = Field(MuWmoKey, '*', 1):'*':Field(MuWmoKey, '*', 3)
QtyAdj = MuWfrsNeeded
CurrMuWfrCnt = obj_WO_Mat('CurrWaferCnt', MuWoMatKey)
If MuWfrsNeeded GT CurrMuWfrCnt then
QtyAdj = CurrMuWfrCnt
MuWfrsNeeded -= CurrMuWfrCnt
end
Parms = ''
Parms<1> = MuWmoKey ; // Cassette to verify wafer count of.
Parms<2> = QtyAdj ; // Wafer count adjustment - 0 because converting box.
Parms<3> = 'MU' ; // Wafer counter tool location
Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms)
If Proceed NE True$ then Return
Next MuWmoKey
end end
CheckValue = 1 * Signature block added 10/6/2010 JCH *
Valid = Dialog_Box('NDW_VERIFY_USER', @Window, @User4)
FieldNo = WO_MAT_EPO_MAKEUP_BOX$ IF NOT(Valid) THEN RETURN ;* User is not worthy or can't type
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue) ;* Set WMO_MAKEUP flag on WM_OUT
IF Get_Status(errCode) THEN ErrMsg(errCode)
Set_Property(@WINDOW:'.MAKEUP_BOX','DEFPROP',CheckValue) ;* Make this the makeup box Send_Event(@WINDOW,'WRITE')
Send_Event(@WINDOW,'WRITE') ;* Write the record
WMOKey = WONo:'*':ProcStepNo:'*':CassNo obj_WM_Out('AddMakeupWafers',WMOutKey:@RM:EmptySlots:@RM:MakeupBox)
obj_AppWindow('LoadFormKeys',@WINDOW:@RM:WMOKey) ;* Reread the updated record //Remove the signatures for the WO_MAT_QA record because they are changing its results.
WOMatQaKey = Field(WMOutKey, '*', 1) : '*' : Field(WMOutKey, '*', 3)
Wo_Mat_Qa_Services('ClearSignatureByStage', WOMatQaKey, 'MO_QA')
obj_Appwindow('LoadFormKeys',@WINDOW:@RM:WMOutKey)
Return RETURN
end else End Case
ErrMsg('WARNING: Error reading WO_MAT record.') end
Return
end
Case Response EQ ''
// User has cancelled this process.
Return
Case Otherwise$
// User has selected a makeup box to use and backfill.
AvailMU_WMOKeys = Response
MakeupBox = Response
MuWfrsNeeded = SelCnt
If AvailMU_WMOKeys NE '' then
// Wafer counter check - Account for the possibility of selecting more than one makeup box.
For each MuWmoKey in AvailMU_WMOKeys using @FM
MuWoMatKey = Field(MuWmoKey, '*', 1):'*':Field(MuWmoKey, '*', 3)
QtyAdj = MuWfrsNeeded
CurrMuWfrCnt = obj_WO_Mat('CurrWaferCnt', MuWoMatKey)
If MuWfrsNeeded GT CurrMuWfrCnt then
QtyAdj = CurrMuWfrCnt
MuWfrsNeeded -= CurrMuWfrCnt
end
Parms = ''
Parms<1> = MuWmoKey ; // Cassette to verify wafer count of.
Parms<2> = QtyAdj ; // Wafer count adjustment - 0 because converting box.
Parms<3> = 'MU' ; // Wafer counter tool location
Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms)
If Proceed NE True$ then Return
Next MuWmoKey
end
* Signature block added 10/6/2010 JCH *
Valid = Dialog_Box('NDW_VERIFY_USER', @Window, @User4)
IF NOT(Valid) THEN RETURN ;* User is not worthy or can't type
Send_Event(@WINDOW,'WRITE')
obj_WM_Out('AddMakeupWafers',WMOutKey:@RM:EmptySlots:@RM:MakeupBox)
//Remove the signatures for the WO_MAT_QA record because they are changing its results.
WOMatQaKey = Field(WMOutKey, '*', 1) : '*' : Field(WMOutKey, '*', 3)
Wo_Mat_Qa_Services('ClearSignatureByStage', WOMatQaKey, 'MO_QA')
obj_Appwindow('LoadFormKeys',@WINDOW:@RM:WMOutKey)
RETURN
End Case
end else end else
// Cassette is on hold so makeup wafers cannot be added. // Cassette is on hold so makeup wafers cannot be added.
ErrorMessage = 'Add MU Wafer Denied!. The cassette must be taken off hold before adding makeup wafers.' ErrorMessage = 'Add MU Wafer Denied!. The cassette must be taken off hold before adding makeup wafers.'

View File

@ -440,7 +440,7 @@ END
IF CurrStatus NE '' THEN IF CurrStatus NE '' THEN
SWAP @VM WITH '" "' IN CurrStatus SWAP @VM WITH '" "' IN CurrStatus
IF SelectSent NE '' THEN SelectSent := ' AND' IF SelectSent NE '' THEN SelectSent := ' AND'
SelectSent := ' WITH CURR_STATUS ':QUOTE(CurrStatus) SelectSent := ' WITH CURR_STATUS_STATIC ':QUOTE(CurrStatus)
END END
IF PartTypes NE '' THEN IF PartTypes NE '' THEN
@ -471,7 +471,7 @@ SelectSent = 'SELECT REACT_ITEM ':SelectSent
Def = "" Def = ""
Def<MTEXT$> = "Selecting Reactor Events..." Def<MTEXT$> = "Selecting Reactor Items..."
Def<MTYPE$> = "U" Def<MTYPE$> = "U"
* display the processing message and do the processing * display the processing message and do the processing
@ -502,6 +502,3 @@ End_Dialog(@WINDOW,RINos)
RETURN RETURN

View File

@ -1177,3 +1177,4 @@ end service

View File

@ -1059,6 +1059,10 @@ Service ImportBioRadData(RunData, FileName)
objSPC = Logging_Services('NewLog', LogPath, OConv(Datetime(), 'DT_^1_HS_'):'_Thickness_9Points.txt', CRLF$, Comma$, '', '', False$, True$) objSPC = Logging_Services('NewLog', LogPath, OConv(Datetime(), 'DT_^1_HS_'):'_Thickness_9Points.txt', CRLF$, Comma$, '', '', False$, True$)
NotesLog = Logging_Services('NewLog', LogPath2, 'Thickness_9Points.txt', CRLF$, Comma$, '', '', False$, False$) NotesLog = Logging_Services('NewLog', LogPath2, 'Thickness_9Points.txt', CRLF$, Comma$, '', '', False$, False$)
SendToSPC = True$ SendToSPC = True$
Case NumDataPoints EQ 10
objSPC = Logging_Services('NewLog', LogPath, OConv(Datetime(), 'DT_^1_HS_'):'_Thickness_10Points.txt', CRLF$, Comma$, '', '', False$, True$)
NotesLog = Logging_Services('NewLog', LogPath2, 'Thickness_10Points.txt', CRLF$, Comma$, '', '', False$, False$)
SendToSPC = True$
Case NumDataPoints EQ 14 Case NumDataPoints EQ 14
objSPC = Logging_Services('NewLog', LogPath, OConv(Datetime(), 'DT_^1_HS_'):'_Thickness_14Points.txt', CRLF$, Comma$, '', '', False$, True$) objSPC = Logging_Services('NewLog', LogPath, OConv(Datetime(), 'DT_^1_HS_'):'_Thickness_14Points.txt', CRLF$, Comma$, '', '', False$, True$)
NotesLog = Logging_Services('NewLog', LogPath2, 'Thickness_14Points.txt', CRLF$, Comma$, '', '', False$, False$) NotesLog = Logging_Services('NewLog', LogPath2, 'Thickness_14Points.txt', CRLF$, Comma$, '', '', False$, False$)

View File

@ -0,0 +1,99 @@
Compile function NDW_ACKNOWLEDGE_MESSAGE_EVENTS(CtrlEntId, Event, @PARAMS)
/***********************************************************************************************************************
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
permission from Infineon.
Name : NDW_ACKNOWLEDGE_MESSAGE_EVENTS
Description : This function acts as a commuter module for all events related to this window.
Notes : Commuter Modules are automatically called from the Promoted_Events function which is called by the
application-specific promoted event handler. This makes it possible to add QuickEvents that need to
execute Basic+ logic without having use the Form Designer to make the association, although this is
limited to the events which are currently promoted.
If the form needs to call the commuter module directly then the QuickEvent parameters should be
formatted like this:
'@SELF','@EVENT',['@PARAM1','@PARAMx']
Parameters :
CtrlEntId [in] -- The fully qualified name of the control calling the promoted event
Event [in] -- The event being executed. See the Notes section regarding "PRE" events
Param1-15 [in] -- Additional event parameter holders
EventFlow [out] -- Set to 1 or 0 so the calling event knows whether or not to chain forward. See comments in
EVENT_SETUP insert
History : (Date, Initials, Notes)
05/23/25 djs Created initial commuter module.
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
#window NDW_ACKNOWLEDGE_MESSAGE
$Insert APP_INSERTS
$Insert EVENT_SETUP
Declare subroutine PlaceDialog
SubclassInfo = Form_Services('FindSubclassControl')
Subclass = SubclassInfo<1>
// Update the arguments so that the OpenInsight OLE event will treate the ActiveX event as a native event handler.
If Event EQ 'OLE' then
Transfer Event to OIEvent
Transfer Param1 to Event
Transfer Param2 to Param1
Transfer Param3 to Param2
Transfer Param4 to Param3
Transfer Param5 to Param4
Transfer Param6 to Param5
Transfer Param7 to Param6
Transfer Param8 to Param7
end
GoToEvent Event for CtrlEntId else
// Event not implemented
end
Return EventFlow or 1
//-----------------------------------------------------------------------------
// EVENT HANDLERS
//-----------------------------------------------------------------------------
Event WINDOW.CREATE(CreateParam)
TextToAcknowledge = CreateParam
If TextToAcknowledge NE '' then
Swap @TM with CRLF$ in TextToAcknowledge
Set_Property(@Window:'.EDB_DATA', 'TEXT', TextToAcknowledge)
PlaceDialog(-2, -2)
end else
Post_Event(@Window, 'CLOSE')
end
End Event
Event WINDOW.CLOSE(CancelFlag, CloseFlags)
End_Dialog(@Window, False$)
end event
Event PUB_OK.CLICK()
End_Dialog(@Window, True$)
end event
Event PUB_CANCEL.CLICK()
End_Dialog(@Window, False$)
end event

View File

@ -3,7 +3,7 @@ Compile function NDW_ADJUST_LOT_QTY_EVENTS(CtrlEntId, Event, @PARAMS)
#window NDW_ADJUST_LOT_QTY #window NDW_ADJUST_LOT_QTY
Declare function MemberOf, Database_Services, Error_Services, Datetime Declare function MemberOf, Database_Services, Error_Services, Datetime
Declare subroutine PlaceDialog, Database_Services, Lot_Services Declare subroutine PlaceDialog, Database_Services, Lot_Services, Lot_Event_Services
$Insert App_Inserts $Insert App_Inserts
$Insert Lot_Equates $Insert Lot_Equates
@ -125,10 +125,16 @@ Event PUB_SUBMIT.CLICK()
Begin Case Begin Case
Case NewWfrQty LT CurrWfrQty Case NewWfrQty LT CurrWfrQty
AmountToDecrease = CurrWfrQty - NewWfrQty AmountToDecrease = CurrWfrQty - NewWfrQty
Lot_Services('ReduceLotWaferCount', LotId, AmountToDecrease, @User4) Lot_Services('ReduceLotWaferCount', LotId, AmountToDecrease, @User4)
If Error_Services('NoError') then
Lot_Event_Services('CreateLotEvent', LotId, Datetime(), 'COMMENT', 'Manual Lot Qty decrease performed.', '', @User4, '' , '')
end
Case NewWfrQty GT CurrWfrQty Case NewWfrQty GT CurrWfrQty
AmountToIncrease = NewWfrQty - CurrWfrQty AmountToIncrease = NewWfrQty - CurrWfrQty
Lot_Services('IncreaseLotWaferCount', LotId, AmountToIncrease, @User4) Lot_Services('IncreaseLotWaferCount', LotId, AmountToIncrease, @User4)
If Error_Services('NoError') then
Lot_Event_Services('CreateLotEvent', LotId, Datetime(), 'COMMENT', 'Manual Lot Qty increase performed.', '', @User4, '' , '')
end
End Case End Case
If Error_Services('NoError') then If Error_Services('NoError') then
msg(@Window, 'Wafer quantity adjusted successfully!') msg(@Window, 'Wafer quantity adjusted successfully!')
@ -176,3 +182,4 @@ return

View File

@ -3,25 +3,27 @@ Compile function NDW_WAFER_COUNTS_EVENTS(CtrlEntId, Event, @PARAMS)
#window NDW_WAFER_COUNTS #window NDW_WAFER_COUNTS
Declare function Reactor_Services, Database_Services, Get_Property, Error_Services, Environment_Services Declare function Reactor_Services, Database_Services, Get_Property, Error_Services, Environment_Services
Declare function SRP_Array, Logging_Services Declare function SRP_Array, Logging_Services
Declare subroutine Set_Property, Logging_Services Declare subroutine Set_Property, Logging_Services, PlaceDialog
$Insert EVENT_SETUP $Insert EVENT_SETUP
$Insert APP_INSERTS $Insert APP_INSERTS
$Insert REACTOR_EQUATES $Insert REACTOR_EQUATES
EQU DATA_ASM_REACT_ID$ to 1 EQU DATA_ASM_REACT_ID$ to 1
EQU DATA_ASM_SUSC_CNT$ to 2 EQU DATA_ASM_SUSC_CNT$ to 2
EQU DATA_ASM_SUSC_THK$ to 3 EQU DATA_ASM_SUSC_THK$ to 3
EQU DATA_ASM_TUBE_CNT$ to 4 EQU DATA_ASM_TUBE_CNT$ to 4
EQU DATA_ASM_TUBE_THK$ to 5 EQU DATA_ASM_TUBE_THK$ to 5
EQU DATA_ASM_ARM_CNT$ to 6 EQU DATA_ASM_ARM_CNT$ to 6
EQU DATA_ASM_EXHAUST_THK$ to 7
EQU DATA_HTR_REACT_ID$ to 1 EQU DATA_HTR_REACT_ID$ to 1
EQU DATA_HTR_SUSC_CNT$ TO 2 EQU DATA_HTR_SUSC_CNT$ TO 2
EQU DATA_HTR_SUSC_THK$ TO 3 EQU DATA_HTR_SUSC_THK$ TO 3
EQU DATA_HTR_TUBE_CNT$ TO 4 EQU DATA_HTR_TUBE_CNT$ TO 4
EQU DATA_HTR_TUBE_THK$ TO 5 EQU DATA_HTR_TUBE_THK$ TO 5
EQU DATA_HTR_ARM_CNT$ TO 6 EQU DATA_HTR_ARM_CNT$ TO 6
EQU DATA_HTR_EXHAUST_THK$ TO 7
EQU DATA_EPP_REACT_ID$ to 1 EQU DATA_EPP_REACT_ID$ to 1
EQU DATA_EPP_SUSC_CNT$ TO 2 EQU DATA_EPP_SUSC_CNT$ TO 2
@ -30,6 +32,7 @@ EQU DATA_EPP_BELL_JAR_CNT$ TO 4
EQU DATA_EPP_BELL_JAR_THK$ TO 5 EQU DATA_EPP_BELL_JAR_THK$ TO 5
EQU DATA_EPP_LOWER_QUARTZ_CNT$ TO 6 EQU DATA_EPP_LOWER_QUARTZ_CNT$ TO 6
EQU DATA_EPP_LOWER_QUARTZ_THK$ TO 7 EQU DATA_EPP_LOWER_QUARTZ_THK$ TO 7
EQU DATA_EPP_EXHAUST_THK$ TO 8
ASMDataTable = @Window : '.OLE_DATA_ASM' ASMDataTable = @Window : '.OLE_DATA_ASM'
HTRDataTable = @Window : '.OLE_DATA_HTR' HTRDataTable = @Window : '.OLE_DATA_HTR'
@ -49,11 +52,11 @@ If Event EQ 'OLE' then
Transfer Param1 to Event Transfer Param1 to Event
Transfer Param2 to Param1 Transfer Param2 to Param1
Transfer Param3 to Param2 Transfer Param3 to Param2
* Transfer Param4 to Param3 Transfer Param4 to Param3
* Transfer Param5 to Param4 Transfer Param5 to Param4
* Transfer Param6 to Param5 Transfer Param6 to Param5
* Transfer Param7 to Param6 Transfer Param7 to Param6
* Transfer Param8 to Param7 Transfer Param8 to Param7
end end
GoToEvent Event for CtrlEntId else GoToEvent Event for CtrlEntId else
@ -67,17 +70,25 @@ Return EventFlow or 1
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
Event WINDOW.CREATE(CreateParam) Event WINDOW.CREATE(CreateParam)
GoSub SetupOLEControls GoSub SetupOLEControls
GoSub GetReactorMetrics GoSub GetReactorMetrics
End Event End Event
Event TABCONTROL_1.CLICK() Event TABCONTROL_1.CLICK()
Page = Get_Property(@Window : '.TABCONTROL_1', 'VALUE') Page = Get_Property(@Window : '.TABCONTROL_1', 'VALUE')
Set_Property(@WINDOW,'VPOSITION', Page) Set_Property(@WINDOW,'VPOSITION', Page)
end event end event
Event PUB_REFRESH_DATA.CLICK() Event PUB_REFRESH_DATA.CLICK()
GoSub GetReactorMetrics GoSub GetReactorMetrics
end event end event
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -85,6 +96,7 @@ end event
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
GetReactorMetrics: GetReactorMetrics:
ReactorRec = '' ReactorRec = ''
ASMData = '' ASMData = ''
HTRData = '' HTRData = ''
@ -105,12 +117,13 @@ GetReactorMetrics:
for each Reactor in ASMList using @FM setting rPos for each Reactor in ASMList using @FM setting rPos
MetricData = Reactor_Services('GetWaferCntMetricsByReactorID', Reactor) MetricData = Reactor_Services('GetWaferCntMetricsByReactorID', Reactor)
if Error_Services('NoError') then if Error_Services('NoError') then
ASMData<rPos, DATA_ASM_REACT_ID$> = MetricData<1, DATA_ASM_REACT_ID$> ASMData<rPos, DATA_ASM_REACT_ID$> = MetricData<1, DATA_ASM_REACT_ID$>
ASMData<rPos, DATA_ASM_SUSC_CNT$> = MetricData<1, DATA_ASM_SUSC_CNT$> ASMData<rPos, DATA_ASM_SUSC_CNT$> = MetricData<1, DATA_ASM_SUSC_CNT$>
ASMData<rPos, DATA_ASM_SUSC_THK$> = MetricData<1, DATA_ASM_SUSC_THK$> ASMData<rPos, DATA_ASM_SUSC_THK$> = MetricData<1, DATA_ASM_SUSC_THK$>
ASMData<rPos, DATA_ASM_TUBE_CNT$> = MetricData<1, DATA_ASM_TUBE_CNT$> ASMData<rPos, DATA_ASM_TUBE_CNT$> = MetricData<1, DATA_ASM_TUBE_CNT$>
ASMData<rPos, DATA_ASM_TUBE_THK$> = MetricData<1, DATA_ASM_TUBE_THK$> ASMData<rPos, DATA_ASM_TUBE_THK$> = MetricData<1, DATA_ASM_TUBE_THK$>
ASMData<rPos, DATA_ASM_ARM_CNT$> = MetricData<1, DATA_ASM_ARM_CNT$> ASMData<rPos, DATA_ASM_ARM_CNT$> = MetricData<1, DATA_ASM_ARM_CNT$>
ASMData<rPos, DATA_ASM_EXHAUST_THK$> = MetricData<1, DATA_ASM_EXHAUST_THK$>
end else end else
ErrorMessage = Error_Services('GetMessage') ErrorMessage = Error_Services('GetMessage')
LogData = LoggingDTM : @FM : ErrorMessage LogData = LoggingDTM : @FM : ErrorMessage
@ -123,12 +136,13 @@ GetReactorMetrics:
for each Reactor in HTRList using @FM setting rPos for each Reactor in HTRList using @FM setting rPos
MetricData = Reactor_Services('GetWaferCntMetricsByReactorID', Reactor) MetricData = Reactor_Services('GetWaferCntMetricsByReactorID', Reactor)
if Error_Services('NoError') then if Error_Services('NoError') then
HTRData<rPos, DATA_HTR_REACT_ID$> = MetricData <1, DATA_HTR_REACT_ID$> HTRData<rPos, DATA_HTR_REACT_ID$> = MetricData <1, DATA_HTR_REACT_ID$>
HTRData<rPos, DATA_HTR_SUSC_CNT$> = MetricData<1, DATA_HTR_SUSC_CNT$> HTRData<rPos, DATA_HTR_SUSC_CNT$> = MetricData<1, DATA_HTR_SUSC_CNT$>
HTRData<rPos, DATA_HTR_SUSC_THK$> = MetricData<1, DATA_HTR_SUSC_THK$> HTRData<rPos, DATA_HTR_SUSC_THK$> = MetricData<1, DATA_HTR_SUSC_THK$>
HTRData<rPos, DATA_HTR_TUBE_CNT$> = MetricData<1, DATA_HTR_TUBE_CNT$> HTRData<rPos, DATA_HTR_TUBE_CNT$> = MetricData<1, DATA_HTR_TUBE_CNT$>
HTRData<rPos, DATA_HTR_TUBE_THK$> = MetricData<1, DATA_HTR_TUBE_THK$> HTRData<rPos, DATA_HTR_TUBE_THK$> = MetricData<1, DATA_HTR_TUBE_THK$>
HTRData<rPos, DATA_HTR_ARM_CNT$> = MetricData<1, DATA_HTR_ARM_CNT$> HTRData<rPos, DATA_HTR_ARM_CNT$> = MetricData<1, DATA_HTR_ARM_CNT$>
HTRData<rPos, DATA_HTR_EXHAUST_THK$> = MetricData<1, DATA_HTR_EXHAUST_THK$>
end else end else
ErrorMessage = Error_Services('GetMessage') ErrorMessage = Error_Services('GetMessage')
LogData = LoggingDTM : @FM : ErrorMessage LogData = LoggingDTM : @FM : ErrorMessage
@ -149,6 +163,7 @@ GetReactorMetrics:
EPPData<rPos, DATA_EPP_BELL_JAR_THK$> = MetricData<1, DATA_EPP_BELL_JAR_THK$> EPPData<rPos, DATA_EPP_BELL_JAR_THK$> = MetricData<1, DATA_EPP_BELL_JAR_THK$>
EPPData<rPos, DATA_EPP_LOWER_QUARTZ_CNT$> = MetricData<1, DATA_EPP_LOWER_QUARTZ_CNT$> EPPData<rPos, DATA_EPP_LOWER_QUARTZ_CNT$> = MetricData<1, DATA_EPP_LOWER_QUARTZ_CNT$>
EPPData<rPos, DATA_EPP_LOWER_QUARTZ_THK$> = MetricData<1, DATA_EPP_LOWER_QUARTZ_THK$> EPPData<rPos, DATA_EPP_LOWER_QUARTZ_THK$> = MetricData<1, DATA_EPP_LOWER_QUARTZ_THK$>
EPPData<rPos, DATA_EPP_EXHAUST_THK$> = MetricData<1, DATA_EPP_EXHAUST_THK$>
end else end else
ErrorMessage = Error_Services('GetMessage') ErrorMessage = Error_Services('GetMessage')
LogData = LoggingDTM : @FM : ErrorMessage LogData = LoggingDTM : @FM : ErrorMessage
@ -159,36 +174,55 @@ GetReactorMetrics:
return return
SetupOLEControls: SetupOLEControls:
//Set Row Headers to invisible // Set Row Headers to invisible
Set_Property(ASMDataTable, "OLE.HeaderColumn[1]", '':@FM:False$) Set_Property(ASMDataTable, "OLE.HeaderColumn[1]", '':@FM:False$)
Set_Property(HTRDataTable, "OLE.HeaderColumn[1]", '':@FM:False$) Set_Property(HTRDataTable, "OLE.HeaderColumn[1]", '':@FM:False$)
Set_Property(EPPDataTable, "OLE.HeaderColumn[1]", '':@FM:False$) Set_Property(EPPDataTable, "OLE.HeaderColumn[1]", '':@FM:False$)
//Set Number of columns for each table // Set Number of columns for each table
Set_Property(ASMDataTable, "OLE.Dimension", 6);*6 columns for ASM Data Table Set_Property(ASMDataTable, "OLE.Dimension", 7);*6 columns for ASM Data Table
Set_Property(HTRDataTable, "OLE.Dimension", 6);*6 columns for HTR Data Table Set_Property(HTRDataTable, "OLE.Dimension", 7);*6 columns for HTR Data Table
Set_Property(EPPDataTable, "OLE.Dimension", 7);*7 columns for EPP Data Table Set_Property(EPPDataTable, "OLE.Dimension", 8);*7 columns for EPP Data Table
//Set size of columns // Set size of all columns
ColSizeArray = '' ColSizeArray = ''
ColSizeArray<1> = 100 ColSizeArray<1> = 115
Set_Property(ASMDataTable, "OLE.DataColumn[All]", ColSizeArray) Set_Property(ASMDataTable, "OLE.DataColumn[All]", ColSizeArray)
Set_Property(HTRDataTable, "OLE.DataColumn[All]", ColSizeArray) Set_Property(HTRDataTable, "OLE.DataColumn[All]", ColSizeArray)
Set_Property(EPPDataTable, "OLE.DataColumn[All]", ColSizeArray) Set_Property(EPPDataTable, "OLE.DataColumn[All]", ColSizeArray)
// Shrink size of column 1
ColSizeArray<1> = 60
Set_Property(ASMDataTable, "OLE.DataColumn[1]", ColSizeArray)
Set_Property(HTRDataTable, "OLE.DataColumn[1]", ColSizeArray)
Set_Property(EPPDataTable, "OLE.DataColumn[1]", ColSizeArray)
// Set size of all columns
ColSizeArray = ''
ColSizeArray<1> = 125
Set_Property(EPPDataTable, "OLE.DataColumn[6]", ColSizeArray)
// Set autosize last column to true to fill out table width
ColSizeArray<1> = 125
ColSizeArray<4> = True$
Set_Property(ASMDataTable, "OLE.DataColumn[7]", ColSizeArray)
Set_Property(HTRDataTable, "OLE.DataColumn[7]", ColSizeArray)
Set_Property(EPPDataTable, "OLE.DataColumn[8]", ColSizeArray)
//Set ASM Table Col. Headers //Set ASM Table Col. Headers
HeaderTitles = 'Reactor#':@VM:'Susc. Wfr. Cnt.':@VM:'Susc. Thk':@VM:'Tube Wfr. Cnt.':@VM:'Tube Wfr. Thk':@VM:'Arm Wfr. Cnt.' HeaderTitles = 'Reactor#':@VM:'Susc. Wfr. Cnt.':@VM:'Susc. Thk':@VM:'Tube Wfr. Cnt.':@VM:'Tube Wfr. Thk':@VM:'Arm Wfr. Cnt.':@VM:'Exhaust Chamber Thk.'
Set_Property(ASMDataTable, "OLE.TitleList", HeaderTitles) Set_Property(ASMDataTable, "OLE.TitleList", HeaderTitles)
//Set HTR Table Col. Headers //Set HTR Table Col. Headers
HeaderTitles = 'Reactor#':@VM:'Susc. Run Cnt.':@VM:'Susc. Thk':@VM:'Tube Run Cnt.':@VM:'Tube Thk':@VM:'Arm Wfr. Cnt.' HeaderTitles = 'Reactor#':@VM:'Susc. Run Cnt.':@VM:'Susc. Thk':@VM:'Tube Run Cnt.':@VM:'Tube Thk':@VM:'Arm Wfr. Cnt.':@VM:'Exhaust Chamber Thk.'
Set_Property(HTRDataTable, "OLE.TitleList", HeaderTitles) Set_Property(HTRDataTable, "OLE.TitleList", HeaderTitles)
//Set EPP Table Col. Headers //Set EPP Table Col. Headers
HeaderTitles = 'Reactor#':@VM:'Susc. Run Cnt.':@VM:'Susc. Thk':@VM:'Bell Jar Run Cnt.':@VM:'Bell Jar Thk':@VM:'Lower Quartz Run Cnt.':@VM:'Lower Quartz thk.' HeaderTitles = 'Reactor#':@VM:'Susc. Run Cnt.':@VM:'Susc. Thk':@VM:'Bell Jar Run Cnt.':@VM:'Bell Jar Thk':@VM:'Lower Quartz Run Cnt.':@VM:'Lower Quartz thk.':@VM:'Exhaust Chamber Thk.'
Set_Property(EPPDataTable, "OLE.TitleList", HeaderTitles) Set_Property(EPPDataTable, "OLE.TitleList", HeaderTitles)
return return

View File

@ -535,9 +535,9 @@ Service CancelOrder(OrderId)
If HttpResponseJson NE '' then If HttpResponseJson NE '' then
ObjResponseJson = '' ObjResponseJson = ''
If SRP_JSON(ObjResponseJson, 'Parse', HttpResponseJson) EQ '' then If SRP_JSON(ObjResponseJson, 'Parse', HttpResponseJson) EQ '' then
IsComplete = SRP_JSON(ObjResponseJson, 'GetValue', 'pendingUpdate') IsComplete = SRP_JSON(ObjResponseJson, 'GetValue', 'isComplete')
NicaOrderRec<NICA_ORDERS.ORDER_STATUS$> = SRP_JSON(ObjResponseJson, 'GetValue', 'state') NicaOrderRec<NICA_ORDERS.ORDER_STATUS$> = 'cancelled'
NicaOrderRec<NICA_ORDERS.IS_COMPLETE$> = SRP_JSON(ObjResponseJson, 'GetValue', 'isComplete') NicaOrderRec<NICA_ORDERS.IS_COMPLETE$> = IsComplete
CloseDtm = Datetime() CloseDtm = Datetime()
NicaOrderRec<NICA_ORDERS.CLOSED_DTM$> = CloseDtm NicaOrderRec<NICA_ORDERS.CLOSED_DTM$> = CloseDtm
If IsComplete EQ False$ then If IsComplete EQ False$ then
@ -904,4 +904,3 @@ end service
// Internal GoSubs // Internal GoSubs
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@ -18,7 +18,7 @@ COMPILE FUNCTION obj_Reactor_Log(Method,Parms)
*/ */
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, ErrMsg, Btree.Extract, obj_React_Item_Hist, Update_Index, obj_Post_Log DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, ErrMsg, Btree.Extract, obj_React_Item_Hist, Update_Index, obj_Post_Log
Declare subroutine Error_Services, Database_Services Declare subroutine Error_Services, Database_Services, React_Item_Services
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, obj_React_Item, obj_Calendar, Database_Services DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, obj_React_Item, obj_Calendar, Database_Services
@ -195,18 +195,16 @@ PostReactItems:
ReactorLogRec<REACTOR_LOG_RI_POST_DTM$> = PostDTM ReactorLogRec<REACTOR_LOG_RI_POST_DTM$> = PostDTM
otParms = FIELDSTORE(otParms,@RM,4,0,ReactorLogRec) otParms = FIELDSTORE(otParms,@RM,4,0,ReactorLogRec)
//obj_Tables('WriteRec',otParms)
Database_Services('WriteDataRow', 'REACTOR_LOG', RLNo, ReactorLogRec, 1, 0, 1) Database_Services('WriteDataRow', 'REACTOR_LOG', RLNo, ReactorLogRec, 1, 0, 1)
Update_Index('REACT_ITEM_HIST', 'INST_RL_ID', False$, True$) ;* Don't wait for indexer - flush pending indexes now Update_Index('REACT_ITEM_HIST', 'INST_RL_ID', False$, True$) ;* Don't wait for indexer - flush pending indexes now
Update_Index('REACT_ITEM_HIST', 'REM_RL_ID', False$, True$) Update_Index('REACT_ITEM_HIST', 'REM_RL_ID', False$, True$)
end else end else
Error_Services('Add', ValidationFailureReason) Error_Services('Add', ValidationFailureReason)
end end
RETURN RETURN
@ -386,10 +384,3 @@ RemHistKeys:
RETURN RETURN

View File

@ -18,11 +18,12 @@ COMPILE FUNCTION obj_React_Item_Hist(Method,Parms)
*/ */
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, Send_Dyn, obj_Popup DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, Send_Dyn, obj_Popup
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, ErrMsg, Btree.Extract, React_Item_Services
DECLARE SUBROUTINE ErrMsg, Btree.Extract
$Insert LOGICAL
$INSERT REACT_ITEM_HIST_EQUATES $INSERT REACT_ITEM_HIST_EQUATES
$INSERT RLIST_EQUATES
EQU CRLF$ TO \0D0A\ EQU CRLF$ TO \0D0A\
EQU TAB$ TO CHAR(9) EQU TAB$ TO CHAR(9)
@ -62,26 +63,26 @@ RETURN Result
Install: Install:
* * * * * * * * * * * * * *
RIHKey = Parms[1,@RM] RIHKey = Parms[1,@RM]
RL_Id = Parms[COL2()+1,@RM] RL_Id = Parms[COL2()+1,@RM]
ReactWfrCnt = Parms[COL2()+1,@RM] ReactWfrCnt = Parms[COL2()+1,@RM]
ReactHrs = Parms[COL2()+1,@RM] ReactHrs = Parms[COL2()+1,@RM]
IF RIHKey = '' THEN ErrorMsg = 'Null Parameter "RIHKey" passed to routine. (':Method:')' IF RIHKey = '' THEN ErrorMsg = 'Null Parameter "RIHKey" passed to routine. (':Method:')'
IF RL_Id = '' THEN ErrorMsg = 'Null Parameter "RL_Id" passed to routine. (':Method:')' IF RL_Id = '' THEN ErrorMsg = 'Null Parameter "RL_Id" passed to routine. (':Method:')'
*IF ReactWfrCnt = '' THEN ErrorMsg = 'Null Parameter "ReactWfrCnt" passed to routine. (':Method:')' ;* Optional
*IF ReactHrs = '' THEN ErrorMsg = 'Null Parameter "ReactHrs" passed to routine. (':Method:')' ;* Optional
IF ErrorMsg NE '' THEN RETURN IF ErrorMsg NE '' THEN RETURN
RIHRec = '' RIHRec = ''
RIHRec<REACT_ITEM_HIST_INST_RL_ID$> = RL_ID RIHRec<REACT_ITEM_HIST_INST_RL_ID$> = RL_ID
RIHRec<REACT_ITEM_HIST_INST_REACT_WFR_CNT$> = ReactWfrCnt RIHRec<REACT_ITEM_HIST_INST_REACT_WFR_CNT$> = ReactWfrCnt
RIHRec<REACT_ITEM_HIST_INST_REACT_HRS$> = ReactHrs RIHRec<REACT_ITEM_HIST_INST_REACT_HRS$> = ReactHrs
otParms = 'REACT_ITEM_HIST':@RM:RIHKey:@RM:@RM:RIHRec otParms = 'REACT_ITEM_HIST':@RM:RIHKey:@RM:@RM:RIHRec
obj_Tables('WriteRec',otParms) obj_Tables('WriteRec',otParms)
RINo = Field(RIHKey, '*', 2, 1)
React_Item_Services('UpdateReactItemStatus', RINo)
RETURN RETURN
@ -90,38 +91,36 @@ RETURN
Remove: Remove:
* * * * * * * * * * * * * *
RIHKey = Parms[1,@RM] RIHKey = Parms[1,@RM]
RemoveDTM = Parms[COL2()+1,@RM] ;* Internal format * RemoveDTM = Parms[COL2()+1,@RM] ;* Internal format *
RL_Id = Parms[COL2()+1,@RM] RL_Id = Parms[COL2()+1,@RM]
ReactWfrCnt = Parms[COL2()+1,@RM] ReactWfrCnt = Parms[COL2()+1,@RM]
ReactHrs = Parms[COL2()+1,@RM] ReactHrs = Parms[COL2()+1,@RM]
IF RIHKey = '' THEN ErrorMsg = 'Null Parameter "RIHKey" passed to routine. (':Method:')' IF RIHKey = '' THEN ErrorMsg = 'Null Parameter "RIHKey" passed to routine. (':Method:')'
IF RemoveDTM = '' THEN ErrorMsg = 'Null Parameter "RemoveDTM" passed to routine. (':Method:')' IF RemoveDTM = '' THEN ErrorMsg = 'Null Parameter "RemoveDTM" passed to routine. (':Method:')'
IF RL_Id = '' THEN ErrorMsg = 'Null Parameter "RL_Id" passed to routine. (':Method:')' IF RL_Id = '' THEN ErrorMsg = 'Null Parameter "RL_Id" passed to routine. (':Method:')'
*IF ReactWfrCnt = '' THEN ErrorMsg = 'Null Parameter "ReactWfrCnt" passed to routine. (':Method:')' ;* Optional
*IF ReactHrs = '' THEN ErrorMsg = 'Null Parameter "ReactHrs" passed to routine. (':Method:')' ;* Optional
IF ErrorMsg NE '' THEN RETURN IF ErrorMsg NE '' THEN RETURN
* Read and update record * otParms = 'REACT_ITEM_HIST':@RM:RIHKey
otParms = 'REACT_ITEM_HIST':@RM:RIHKey RIHRec = obj_Tables('ReadRec',otParms)
RIHRec = obj_Tables('ReadRec',otParms) IF Get_Status(errCode) THEN
Set_Status(0)
RIHRec = ''
END
IF Get_Status(errCode) THEN RIHRec<REACT_ITEM_HIST_REM_DTM$> = RemoveDTM
Set_Status(0) RIHRec<REACT_ITEM_HIST_REM_RL_ID$> = RL_Id
RIHRec = '' RIHRec<REACT_ITEM_HIST_REM_REACT_WFR_CNT$> = ReactWfrCnt
END RIHRec<REACT_ITEM_HIST_REM_REACT_HRS$> = ReactHrs
RIHRec<REACT_ITEM_HIST_REM_DTM$> = RemoveDTM otParms = FIELDSTORE(otParms,@RM,4,0,RIHRec)
RIHRec<REACT_ITEM_HIST_REM_RL_ID$> = RL_Id obj_Tables('WriteRec',otParms)
RIHRec<REACT_ITEM_HIST_REM_REACT_WFR_CNT$> = ReactWfrCnt RINo = Field(RIHKey, '*', 2, 1)
RIHRec<REACT_ITEM_HIST_REM_REACT_HRS$> = ReactHrs React_Item_Services('UpdateReactItemStatus', RINo)
otParms = FIELDSTORE(otParms,@RM,4,0,RIHRec)
obj_Tables('WriteRec',otParms)
RETURN RETURN
@ -130,24 +129,21 @@ RETURN
ClearRemove: ClearRemove:
* * * * * * * * * * * * * *
RIHKey = Parms[1,@RM] RIHKey = Parms[1,@RM]
IF RIHKey = '' THEN RETURN IF RIHKey = '' THEN RETURN
otParms = 'REACT_ITEM_HIST':@RM:RIHKey
* Read and update record * RIHRec = obj_Tables('ReadRec',otParms)
otParms = 'REACT_ITEM_HIST':@RM:RIHKey RIHRec<REACT_ITEM_HIST_REM_DTM$> = ''
RIHRec<REACT_ITEM_HIST_REM_RL_ID$> = ''
RIHRec<REACT_ITEM_HIST_REM_REACT_WFR_CNT$> = ''
RIHRec<REACT_ITEM_HIST_REM_REACT_HRS$> = ''
RIHRec = obj_Tables('ReadRec',otParms) otParms = FIELDSTORE(otParms,@RM,4,0,RIHRec)
obj_Tables('WriteRec',otParms)
RIHRec<REACT_ITEM_HIST_REM_DTM$> = ''
RIHRec<REACT_ITEM_HIST_REM_RL_ID$> = ''
RIHRec<REACT_ITEM_HIST_REM_REACT_WFR_CNT$> = ''
RIHRec<REACT_ITEM_HIST_REM_REACT_HRS$> = ''
otParms = FIELDSTORE(otParms,@RM,4,0,RIHRec)
obj_Tables('WriteRec',otParms)
RETURN RETURN
@ -156,49 +152,50 @@ RETURN
GetHistory: GetHistory:
* * * * * * * * * * * * * *
ReactNo = Parms[1,@RM] ReactNo = Parms[1,@RM]
RINo = Parms[COL2()+1,@RM] RINo = Parms[COL2()+1,@RM]
RIType = Parms[COL2()+1,@RM] RIType = Parms[COL2()+1,@RM]
IF ReactNo = '' AND RINo = '' AND RIType = '' THEN RETURN IF ReactNo = '' AND RINo = '' AND RIType = '' THEN RETURN
OPEN 'DICT.REACT_ITEM_HIST' TO DictVar ELSE OPEN 'DICT.REACT_ITEM_HIST' TO DictVar ELSE
ErrorMsg = 'Unable to open DICT.REACT_ITEM_HIST for index lookup' ErrorMsg = 'Unable to open DICT.REACT_ITEM_HIST for index lookup'
RETURN RETURN
END END
Search = '' Search = ''
IF ReactNo NE '' THEN Search := 'REACT_NO':@VM:ReactNo:@FM IF ReactNo NE '' THEN Search := 'REACT_NO':@VM:ReactNo:@FM
IF RINo NE '' THEN Search := 'RI_NO':@VM:RINo:@FM IF RINo NE '' THEN Search := 'RI_NO':@VM:RINo:@FM
IF RIType NE '' THEN Search := 'RI_TYPE':@VM:RIType:@FM IF RIType NE '' THEN Search := 'RI_TYPE':@VM:RIType:@FM
Option = '' Option = ''
Flag = '' Flag = ''
Btree.Extract(Search, 'REACT_ITEM_HIST', DictVar, RIKeys, Option, Flag) ;* Get unsorted keys based on Search parameters Btree.Extract(Search, 'REACT_ITEM_HIST', DictVar, RIKeys, Option, Flag) ;* Get unsorted keys based on Search parameters
* Put sort data in first column (Install DTM) // Put sort data in first column (Install DTM)
WorkList = '' WorkList = ''
riCnt = COUNT(RIKeys,@VM) + (RIKeys NE '') riCnt = COUNT(RIKeys,@VM) + (RIKeys NE '')
FOR I = 1 TO riCnt FOR I = 1 TO riCnt
RIKey = RIKeys<1,I> RIKey = RIKeys<1,I>
WorkList<I> = FIELD(RIKey,'*',3):@VM:RIKey WorkList<I> = FIELD(RIKey,'*',3):@VM:RIKey
NEXT I NEXT I
WorkList := @RM WorkList := @RM
CONVERT @FM:@VM TO @RM:@FM IN WorkList ;* push delimiters higher for V119 CONVERT @FM:@VM TO @RM:@FM IN WorkList ;* push delimiters higher for V119
CALL V119('S','','D','L',WorkList,'') ;* Descending Left justified sort CALL V119('S','','D','L',WorkList,'') ;* Descending Left justified sort
CONVERT @FM:@RM TO @VM:@FM IN WorkList ;* pull delimiters lower CONVERT @FM:@RM TO @VM:@FM IN WorkList ;* pull delimiters lower
WorkList[-1,1] = '' ;* Trim trailing delimiter WorkList[-1,1] = '' ;* Trim trailing delimiter
FOR I = 1 TO riCnt FOR I = 1 TO riCnt
Result<1,I> = WorkList<I,2> ;* Strip Sort column(s) Result<1,I> = WorkList<I,2> ;* Strip Sort column(s)
NEXT I NEXT I
RETURN RETURN

View File

@ -84,6 +84,7 @@ $Insert NOTIFICATION_EQUATES
$Insert DICT_EQUATES $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
EQU COL$LSID TO 1 EQU COL$LSID TO 1
EQU COL$RECIPE TO 2 EQU COL$RECIPE TO 2
@ -848,6 +849,27 @@ Service IsTWLoggingReqd(RDSNo)
Response = IsTWReqd Response = IsTWReqd
end service end service
Service TestWaferRanAfterLoad(RDSNo)
TestWaferRanAfterLoad = False$
TestWaferKeys = Test_Run_Services('GetTestRunKeysByRDS', RDSNo)
for each Key in TestWaferKeys using @VM
TestWaferDtm = Xlate('TEST_RUN', Key, TEST_RUN_RUN_DTM$, 'X')
TestWaferDate = SRP_DateTime('Date', TestWaferDtm)
TestWaferTime = SRP_DateTime('Time', TestWaferDtm)
RdsDateIn = Xlate('RDS', RDSNo, RDS_DATE_IN$, 'X')
RdsTimeIn = Xlate('RDS', RDSNo, RDS_TIME_IN$, 'X')
TestWaferRanAfterLoad = TestWaferDate > RdsDateIn
If TestWaferRanAfterLoad EQ False$ then
TestWaferRanAfterLoad = (TestWaferDate EQ RdsDateIn) and TestWaferTime GT RdsTimeIn
end
Until TestWaferRanAfterLoad EQ True$
Next Key
Response = TestWaferRanAfterLoad
end service
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
// VerifyEPPMetrology // VerifyEPPMetrology
// //
@ -1805,3 +1827,4 @@ return

View File

@ -277,6 +277,7 @@ Event PUB_SIGN.CLICK()
end end
If (Valid EQ True$) then If (Valid EQ True$) then
ReactorType = XLATE('RDS',RDSNo,'REACTOR_TYPE','X') ReactorType = XLATE('RDS',RDSNo,'REACTOR_TYPE','X')
ErrMsg = ''
If Len(ReactorType) GE 3 and ReactorType[1, 3] _EQC 'HTR' then If Len(ReactorType) GE 3 and ReactorType[1, 3] _EQC 'HTR' then
WoMatKey = WONo:'*':CassNo WoMatKey = WONo:'*':CassNo
IsLastCassetteInWo = WO_MAT_Services('CassetteIsLastInWo', WoMatKey) IsLastCassetteInWo = WO_MAT_Services('CassetteIsLastInWo', WoMatKey)
@ -298,26 +299,44 @@ Event PUB_SIGN.CLICK()
WoMatRecord = Database_Services('ReadDataRow', 'WO_MAT', WoMatKey) WoMatRecord = Database_Services('ReadDataRow', 'WO_MAT', WoMatKey)
WoMatRecord<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACK_REQ$> = True$ WoMatRecord<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACK_REQ$> = True$
Message = '' TestWaferRanSinceLoad = WoMatRecord<WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$>
If NextEventScheduled EQ False$ or NextEventIsBlock EQ True$ then
Message = 'No material scheduled. Test wafer required.' If TestWaferRanSinceLoad NE True$ then
end else if NextEventHasSamePsn EQ False$ then TestWaferRanSinceLoad = Rds_Services('TestWaferRanAfterLoad', RDSNo)
Message = 'Next work order is a NEW PSN number. Test wafer required.' WoMatRecord<WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$> = TestWaferRanSinceLoad
If TestWaferRanSinceLoad NE True$ then
Message = ''
If NextEventScheduled EQ False$ or NextEventIsBlock EQ True$ then
Message = 'No material scheduled. Test wafer required.'
end else if NextEventHasSamePsn EQ False$ then
Message = 'Next work order is a NEW PSN number. Test wafer required.'
end
Message_Box(@Window, Message, "Test Wafer Required", MSG_BTN_OK$ + MSG_ICON_EXCLAM$)
TWLogResult = Dialog_Box('NDW_LOG_TEST_WAFER_USAGE', @Window, RDSNo : @VM : '' : @VM : 'REACTOR' : @VM : Reactor)
WoMatRecord<WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$> = TWLogResult
If TWLogResult NE True$ then
ErrMsg = 'Unload blocked! You must run a test wafer before signing the unload'
end
end
end end
MesageAcked = Message_Box(@Window, Message, "Test Wafer Required", MSG_BTN_OK$ + MSG_ICON_EXCLAM$)
WoMatRecord<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACKED$> = True$
Database_Services('WriteDataRow', 'WO_MAT', WoMatKey, WoMatRecord, True$, False$, False$)
ConfirmNote = 'Test wafer requirement acknowledged. [RDS:' : RDSNo : '], [WO:' : WONo : '], [Cassette:' : CassNo : ']'
Reactor_Log_Services('AddComment', Reactor, ConfirmNote, @User4)
end end
Database_Services('WriteDataRow', 'WO_MAT', WoMatKey, WoMatRecord, True$, False$, False$)
end end
end end
end end
QA_Services('SignUnloadStage', RDSNo, @User4) If ErrMsg NE '' then
Error_Services('Add', ErrMsg)
end
If Error_Services('NoError') then
QA_Services('SignUnloadStage', RDSNo, @User4)
end
end end
end end
If Error_Services('HasError') then If Error_Services('HasError') then
@ -446,3 +465,4 @@ return

View File

@ -62,24 +62,80 @@ API reactItems.HEAD
API reactItems.GET API reactItems.GET
QueryFields = HTTP_Services('GetHTTPGetString') QueryFields = HTTP_Services('GetHTTPGetString')
If Index(QueryFields, 'riType', 1) then If IndexC(QueryFields, 'includeNullRetireDt', 1) then
RIType = HTTP_Services('GetQueryField', 'riType') IncludeNullRetireDt = HTTP_Services('GetQueryField', 'includeNullRetireDt')
Begin Case
Case ( (IncludeNullRetireDt EQ 1) or (IncludeNullRetireDt EQ 0) )
Null
Case ( (IncludeNullRetireDt _EQC 'true') or (IncludeNullRetireDt _EQC 'yes') )
IncludeNullRetireDt = True$
Case ( (IncludeNullRetireDt _EQC 'false') or (IncludeNullRetireDt _EQC 'no') )
IncludeNullRetireDt = False$
Case Otherwise$
Error_Services('Add', 'Error in ':CurrentAPI:' API. Invalid value "':IncludeNullRetireDt:'" passed in for includeNullRetireDt.')
End Case
end else end else
RIType = '' IncludeNullRetireDt = ''
end
If Error_Services('NoError') then
If IndexC(QueryFields, 'showAllDetails', 1) then
ShowAllDetails = HTTP_Services('GetQueryField', 'showAllDetails')
Begin Case
Case ( (ShowAllDetails EQ 1) or (ShowAllDetails EQ 0) )
Null
Case ( (ShowAllDetails _EQC 'true') or (ShowAllDetails _EQC 'yes') )
ShowAllDetails = True$
Case ( (ShowAllDetails _EQC 'false') or (ShowAllDetails _EQC 'no') )
ShowAllDetails = False$
Case Otherwise$
Error_Services('Add', 'Error in ':CurrentAPI:' API. Invalid value "':ShowAllDetails:'" passed in for showAllDetails.')
End Case
end else
ShowAllDetails = False$
end
If Error_Services('NoError') then
If IndexC(QueryFields, 'currStatus', 1) then
CurrStatus = HTTP_Services('GetQueryField', 'currStatus')
end else
CurrStatus = ''
end
If IndexC(QueryFields, 'riType', 1) then
RIType = HTTP_Services('GetQueryField', 'riType')
end else
RIType = ''
end
If IndexC(QueryFields, 'entryDtStart', 1) then
EntryDtStart = HTTP_Services('GetQueryField', 'entryDtStart')
end else
EntryDtStart = ''
end
If IndexC(QueryFields, 'entryDtEnd', 1) then
EntryDtEnd = HTTP_Services('GetQueryField', 'entryDtEnd')
end else
EntryDtEnd = ''
end
If IndexC(QueryFields, 'retireDtStart', 1) then
RetireDtStart = HTTP_Services('GetQueryField', 'retireDtStart')
end else
RetireDtStart = ''
end
If IndexC(QueryFields, 'retireDtEnd', 1) then
RetireDtEnd = HTTP_Services('GetQueryField', 'retireDtEnd')
end else
RetireDtEnd = ''
end
StatusCode = 200
GoSub CreateHALCollection
end else
HTTP_Services('SetResponseStatus', 400, Error_Services("GetMessage"))
end
end else
HTTP_Services('SetResponseStatus', 400, Error_Services("GetMessage"))
end end
If Index(QueryFields, 'currStatus', 1 ) then
CurrStatus = Http_Services('GetQueryField', 'currStatus')
end else
CurrStatus = ''
end
If Index(QueryFields, 'showAllDetails', 1 ) then
ShowAllDetails = Http_Services('GetQueryField', 'showAllDetails')
end else
ShowAllDetails = False$
end
StatusCode = 200
GoSub CreateHALCollection
end api end api
@ -254,11 +310,7 @@ CreateHALCollection:
JSONCollection = '' JSONCollection = ''
Abort = False$ Abort = False$
If RIType NE '' OR CurrStatus NE '' then ReactItems = React_Item_Services('GetReactItems', RIType, CurrStatus, EntryDtStart, EntryDtEnd, RetireDtStart, RetireDtEnd, IncludeNullRetireDt)
ReactItems = React_Item_Services('GetReactItems', RIType, CurrStatus)
end else
ReactItems = React_Item_Services('GetAllReactItemKeys')
end
If ReactItems NE '' then If ReactItems NE '' then
If SRP_JSON(hJSONCollection, 'New', 'Object') then If SRP_JSON(hJSONCollection, 'New', 'Object') then
@ -304,3 +356,4 @@ CreateHALCollection:
end end
return return

File diff suppressed because it is too large Load Diff

View File

@ -101,7 +101,7 @@ Return Response else ''
// Service Parameter Options // Service Parameter Options
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Options BOOLEAN = True$, False$ Options BOOLEAN = True$, False$
Options REACTORMETRIC = 'TUBE_BELL_JAR_THK', 'TUBE_BELL_JAR_WFR_CNT', 'SUSC_THK', 'SUSC_WFR_CNT', 'LOWER_QUARTZ_THK', 'LOWER_QUARTZ_WFR', 'ARMS_WFR_CNT' Options REACTORMETRIC = 'TUBE_BELL_JAR_THK', 'TUBE_BELL_JAR_WFR_CNT', 'SUSC_THK', 'SUSC_WFR_CNT', 'LOWER_QUARTZ_THK', 'LOWER_QUARTZ_WFR', 'ARMS_WFR_CNT', 'EXHAUST_CHAMBER_THK'
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Services // Services
@ -136,6 +136,7 @@ Service IncrementWfrMetrics(RDSNo)
CurrSuscWfrCnt = OldReactorRec<REACTOR_SUSC_WFR_CNT$> CurrSuscWfrCnt = OldReactorRec<REACTOR_SUSC_WFR_CNT$>
CurrLowerQuartzThk = OldReactorRec<REACTOR_LOWER_QUARTZ_THK$> CurrLowerQuartzThk = OldReactorRec<REACTOR_LOWER_QUARTZ_THK$>
CurrLowerQuartzWfr = OldReactorRec<REACTOR_LOWER_QUARTZ_WFR$> CurrLowerQuartzWfr = OldReactorRec<REACTOR_LOWER_QUARTZ_WFR$>
CurrExhaustThk = OldReactorRec<REACTOR_EXHAUST_CHAMBER_THK$>
// Arms are not used for EPP // Arms are not used for EPP
If ReactorType NE 'EPP' then If ReactorType NE 'EPP' then
@ -150,6 +151,7 @@ Service IncrementWfrMetrics(RDSNo)
If CurrSuscWfrCnt = '' then CurrSuscWfrCnt = 0 If CurrSuscWfrCnt = '' then CurrSuscWfrCnt = 0
If CurrLowerQuartzThk = '' then CurrLowerQuartzThk = 0 If CurrLowerQuartzThk = '' then CurrLowerQuartzThk = 0
If CurrLowerQuartzWfr = '' then CurrLowerQuartzWfr = 0 If CurrLowerQuartzWfr = '' then CurrLowerQuartzWfr = 0
If CurrExhaustThk = '' then CurrExhaustThk = 0
Begin Case Begin Case
@ -161,6 +163,7 @@ Service IncrementWfrMetrics(RDSNo)
NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt + 1 NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt + 1
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + TargetThickness NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + TargetThickness
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + 1 NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + 1
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk + TargetThickness
Case ReactorType = 'HTR' Case ReactorType = 'HTR'
@ -176,6 +179,7 @@ Service IncrementWfrMetrics(RDSNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + CntAddition NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + CntAddition
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk + ThkAddition
Case SusceptorSize = 8 Case SusceptorSize = 8
// Round up // Round up
@ -192,6 +196,7 @@ Service IncrementWfrMetrics(RDSNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + CntAddition NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + CntAddition
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk + ThkAddition
End Case End Case
@ -206,6 +211,7 @@ Service IncrementWfrMetrics(RDSNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + WaferCount NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + WaferCount
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk + ThkAddition
End Case End Case
@ -229,6 +235,7 @@ Service GetWaferCntMetricsByReactorID(ReactorID)
ResponseData<1, 4> = ReactorRec<REACTOR_TUBE_BELL_JAR_WFR_CNT$> ResponseData<1, 4> = ReactorRec<REACTOR_TUBE_BELL_JAR_WFR_CNT$>
ResponseData<1, 5> = ReactorRec<REACTOR_TUBE_BELL_JAR_THK$> ResponseData<1, 5> = ReactorRec<REACTOR_TUBE_BELL_JAR_THK$>
ResponseData<1, 6> = ReactorRec<REACTOR_ARMS_WFR_CNT$> ResponseData<1, 6> = ReactorRec<REACTOR_ARMS_WFR_CNT$>
ResponseData<1, 7> = ReactorRec<REACTOR_EXHAUST_CHAMBER_THK$>
//These are the column titles to help us with API Responses //These are the column titles to help us with API Responses
ResponseData<2, 1> = 'ReactorID' ResponseData<2, 1> = 'ReactorID'
ResponseData<2, 2> = 'SusceptorWaferCount' ResponseData<2, 2> = 'SusceptorWaferCount'
@ -236,6 +243,7 @@ Service GetWaferCntMetricsByReactorID(ReactorID)
ResponseData<2, 4> = 'TubeWaferCount' ResponseData<2, 4> = 'TubeWaferCount'
ResponseData<2, 5> = 'TubeThickness' ResponseData<2, 5> = 'TubeThickness'
ResponseData<2, 6> = 'ArmsWaferCount' ResponseData<2, 6> = 'ArmsWaferCount'
ResponseData<2, 7> = 'ExhuastChamberThickness'
Case ReactorType EQ 'HTR' Case ReactorType EQ 'HTR'
ResponseData<1, 1> = ReactorID ResponseData<1, 1> = ReactorID
ResponseData<1, 2> = ReactorRec<REACTOR_SUSC_WFR_CNT$> ResponseData<1, 2> = ReactorRec<REACTOR_SUSC_WFR_CNT$>
@ -243,6 +251,7 @@ Service GetWaferCntMetricsByReactorID(ReactorID)
ResponseData<1, 4> = ReactorRec<REACTOR_TUBE_BELL_JAR_WFR_CNT$> ResponseData<1, 4> = ReactorRec<REACTOR_TUBE_BELL_JAR_WFR_CNT$>
ResponseData<1, 5> = ReactorRec<REACTOR_TUBE_BELL_JAR_THK$> ResponseData<1, 5> = ReactorRec<REACTOR_TUBE_BELL_JAR_THK$>
ResponseData<1, 6> = ReactorRec<REACTOR_ARMS_WFR_CNT$> ResponseData<1, 6> = ReactorRec<REACTOR_ARMS_WFR_CNT$>
ResponseData<1, 7> = ReactorRec<REACTOR_EXHAUST_CHAMBER_THK$>
//These are the column titles to help us with API Responses //These are the column titles to help us with API Responses
ResponseData<2, 1> = 'ReactorID' ResponseData<2, 1> = 'ReactorID'
ResponseData<2, 2> = 'SusceptorWaferCount' ResponseData<2, 2> = 'SusceptorWaferCount'
@ -250,6 +259,7 @@ Service GetWaferCntMetricsByReactorID(ReactorID)
ResponseData<2, 4> = 'TubeWaferCount' ResponseData<2, 4> = 'TubeWaferCount'
ResponseData<2, 5> = 'TubeThickness' ResponseData<2, 5> = 'TubeThickness'
ResponseData<2, 6> = 'ArmsWaferCount' ResponseData<2, 6> = 'ArmsWaferCount'
ResponseData<2, 7> = 'ExhuastChamberThickness'
Case ReactorType EQ 'EPP' Case ReactorType EQ 'EPP'
ResponseData<1, 1> = ReactorID ResponseData<1, 1> = ReactorID
ResponseData<1, 2> = ReactorRec<REACTOR_SUSC_WFR_CNT$> ResponseData<1, 2> = ReactorRec<REACTOR_SUSC_WFR_CNT$>
@ -258,6 +268,7 @@ Service GetWaferCntMetricsByReactorID(ReactorID)
ResponseData<1, 5> = ReactorRec<REACTOR_TUBE_BELL_JAR_THK$> ResponseData<1, 5> = ReactorRec<REACTOR_TUBE_BELL_JAR_THK$>
ResponseData<1, 6> = ReactorRec<REACTOR_LOWER_QUARTZ_WFR$> ResponseData<1, 6> = ReactorRec<REACTOR_LOWER_QUARTZ_WFR$>
ResponseData<1, 7> = ReactorRec<REACTOR_LOWER_QUARTZ_THK$> ResponseData<1, 7> = ReactorRec<REACTOR_LOWER_QUARTZ_THK$>
ResponseData<1, 8> = ReactorRec<REACTOR_EXHAUST_CHAMBER_THK$>
//These are the column titles to help us with API Responses //These are the column titles to help us with API Responses
ResponseData<2, 1> = 'ReactorID' ResponseData<2, 1> = 'ReactorID'
ResponseData<2, 2> = 'SusceptorWaferCount' ResponseData<2, 2> = 'SusceptorWaferCount'
@ -266,6 +277,7 @@ Service GetWaferCntMetricsByReactorID(ReactorID)
ResponseData<2, 5> = 'BellJarThickness' ResponseData<2, 5> = 'BellJarThickness'
ResponseData<2, 6> = 'LowerQuartzWaferCount' ResponseData<2, 6> = 'LowerQuartzWaferCount'
ResponseData<2, 7> = 'LowerQuartzThickness' ResponseData<2, 7> = 'LowerQuartzThickness'
ResponseData<2, 8> = 'ExhuastChamberThickness'
End Case End Case
Response = ResponseData Response = ResponseData
end else end else
@ -307,6 +319,7 @@ Service DecrementWfrMetrics(RDSNo)
CurrSuscWfrCnt = OldReactorRec<REACTOR_SUSC_WFR_CNT$> CurrSuscWfrCnt = OldReactorRec<REACTOR_SUSC_WFR_CNT$>
CurrLowerQuartzThk = OldReactorRec<REACTOR_LOWER_QUARTZ_THK$> CurrLowerQuartzThk = OldReactorRec<REACTOR_LOWER_QUARTZ_THK$>
CurrLowerQuartzWfr = OldReactorRec<REACTOR_LOWER_QUARTZ_WFR$> CurrLowerQuartzWfr = OldReactorRec<REACTOR_LOWER_QUARTZ_WFR$>
CurrExhaustThk = OldReactorRec<REACTOR_EXHAUST_CHAMBER_THK$>
// Arms are not used for EPP // Arms are not used for EPP
If ReactorType NE 'EPP' then If ReactorType NE 'EPP' then
@ -321,6 +334,7 @@ Service DecrementWfrMetrics(RDSNo)
If CurrSuscWfrCnt = '' then CurrSuscWfrCnt = 0 If CurrSuscWfrCnt = '' then CurrSuscWfrCnt = 0
If CurrLowerQuartzThk = '' then CurrLowerQuartzThk = 0 If CurrLowerQuartzThk = '' then CurrLowerQuartzThk = 0
If CurrLowerQuartzWfr = '' then CurrLowerQuartzWfr = 0 If CurrLowerQuartzWfr = '' then CurrLowerQuartzWfr = 0
If CurrExhaustThk = '' then CurrExhaustThk = 0
Begin Case Begin Case
@ -332,6 +346,7 @@ Service DecrementWfrMetrics(RDSNo)
NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt - 1 NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt - 1
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - TargetThickness NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - TargetThickness
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - 1 NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - 1
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk - TargetThickness
Case ReactorType = 'HTR' Case ReactorType = 'HTR'
@ -342,11 +357,12 @@ Service DecrementWfrMetrics(RDSNo)
ThkAddition = (WaferCount / 5) * TargetThickness ThkAddition = (WaferCount / 5) * TargetThickness
NewReactorRec<REACTOR_TUBE_BELL_JAR_THK$> = CurrTubeBellJarThk - ThkAddition NewReactorRec<REACTOR_TUBE_BELL_JAR_THK$> = CurrTubeBellJarThk - ThkAddition
NewReactorRec<REACTOR_TUBE_BELL_JAR_WFR_CNT$> = CurrTubeBellJarCnt - CntAddition NewReactorRec<REACTOR_TUBE_BELL_JAR_WFR_CNT$> = CurrTubeBellJarCnt - CntAddition
NewReactorRec<REACTOR_SUSC_THK$> = CurrSuscThk + ThkAddition NewReactorRec<REACTOR_SUSC_THK$> = CurrSuscThk - ThkAddition
NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt - CntAddition NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt - CntAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - CntAddition NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - CntAddition
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk - ThkAddition
Case SusceptorSize = 8 Case SusceptorSize = 8
// Round up // Round up
@ -363,6 +379,7 @@ Service DecrementWfrMetrics(RDSNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - CntAddition NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - CntAddition
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk - ThkAddition
End Case End Case
@ -377,6 +394,7 @@ Service DecrementWfrMetrics(RDSNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - WaferCount NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - WaferCount
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk - ThkAddition
End Case End Case
@ -410,6 +428,7 @@ Service IncrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
CurrSuscWfrCnt = OldReactorRec<REACTOR_SUSC_WFR_CNT$> CurrSuscWfrCnt = OldReactorRec<REACTOR_SUSC_WFR_CNT$>
CurrLowerQuartzThk = OldReactorRec<REACTOR_LOWER_QUARTZ_THK$> CurrLowerQuartzThk = OldReactorRec<REACTOR_LOWER_QUARTZ_THK$>
CurrLowerQuartzWfr = OldReactorRec<REACTOR_LOWER_QUARTZ_WFR$> CurrLowerQuartzWfr = OldReactorRec<REACTOR_LOWER_QUARTZ_WFR$>
CurrExhaustThk = OldReactorRec<REACTOR_EXHAUST_CHAMBER_THK$>
// Arms are not used for EPP // Arms are not used for EPP
If ReactorType NE 'EPP' then If ReactorType NE 'EPP' then
@ -435,6 +454,7 @@ Service IncrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt + 1 NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt + 1
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + TargetThickness NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + TargetThickness
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + 1 NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + 1
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk + TargetThickness
Case ReactorType = 'HTR' Case ReactorType = 'HTR'
@ -450,6 +470,7 @@ Service IncrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + CntAddition NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + CntAddition
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk + ThkAddition
Case SusceptorSize = 8 Case SusceptorSize = 8
// Round up // Round up
@ -466,6 +487,7 @@ Service IncrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + CntAddition NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + CntAddition
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk + ThkAddition
End Case End Case
@ -480,6 +502,7 @@ Service IncrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + WaferCount NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + WaferCount
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk + ThkAddition
End Case End Case
@ -513,6 +536,7 @@ Service DecrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
CurrSuscWfrCnt = OldReactorRec<REACTOR_SUSC_WFR_CNT$> CurrSuscWfrCnt = OldReactorRec<REACTOR_SUSC_WFR_CNT$>
CurrLowerQuartzThk = OldReactorRec<REACTOR_LOWER_QUARTZ_THK$> CurrLowerQuartzThk = OldReactorRec<REACTOR_LOWER_QUARTZ_THK$>
CurrLowerQuartzWfr = OldReactorRec<REACTOR_LOWER_QUARTZ_WFR$> CurrLowerQuartzWfr = OldReactorRec<REACTOR_LOWER_QUARTZ_WFR$>
CurrExhaustThk = OldReactorRec<REACTOR_EXHAUST_CHAMBER_THK$>
// Arms are not used for EPP // Arms are not used for EPP
If ReactorType NE 'EPP' then If ReactorType NE 'EPP' then
@ -527,6 +551,7 @@ Service DecrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
If CurrSuscWfrCnt = '' then CurrSuscWfrCnt = 0 If CurrSuscWfrCnt = '' then CurrSuscWfrCnt = 0
If CurrLowerQuartzThk = '' then CurrLowerQuartzThk = 0 If CurrLowerQuartzThk = '' then CurrLowerQuartzThk = 0
If CurrLowerQuartzWfr = '' then CurrLowerQuartzWfr = 0 If CurrLowerQuartzWfr = '' then CurrLowerQuartzWfr = 0
If CurrExhaustThk = '' then CurrExhaustThk = 0
Begin Case Begin Case
@ -538,6 +563,7 @@ Service DecrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt - 1 NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt - 1
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - TargetThickness NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - TargetThickness
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - 1 NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - 1
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk - TargetThickness
Case ReactorType = 'HTR' Case ReactorType = 'HTR'
@ -548,11 +574,12 @@ Service DecrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
ThkAddition = (WaferCount / 5) * TargetThickness ThkAddition = (WaferCount / 5) * TargetThickness
NewReactorRec<REACTOR_TUBE_BELL_JAR_THK$> = CurrTubeBellJarThk - ThkAddition NewReactorRec<REACTOR_TUBE_BELL_JAR_THK$> = CurrTubeBellJarThk - ThkAddition
NewReactorRec<REACTOR_TUBE_BELL_JAR_WFR_CNT$> = CurrTubeBellJarCnt - CntAddition NewReactorRec<REACTOR_TUBE_BELL_JAR_WFR_CNT$> = CurrTubeBellJarCnt - CntAddition
NewReactorRec<REACTOR_SUSC_THK$> = CurrSuscThk + ThkAddition NewReactorRec<REACTOR_SUSC_THK$> = CurrSuscThk - ThkAddition
NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt - CntAddition NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt - CntAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - CntAddition NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - CntAddition
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk - ThkAddition
Case SusceptorSize = 8 Case SusceptorSize = 8
// Round up // Round up
@ -569,6 +596,7 @@ Service DecrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - CntAddition NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - CntAddition
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk - ThkAddition
End Case End Case
@ -583,6 +611,7 @@ Service DecrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - WaferCount NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - WaferCount
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk - ThkAddition
End Case End Case
@ -596,7 +625,7 @@ end service
// ResetWfrMetric // ResetWfrMetric
// //
// RDSNo. - [Required] // RDSNo. - [Required]
// MetricType - [Required]('TUBE_BELL_JAR_THK', 'TUBE_BELL_JAR_WFR_CNT', 'SUSC_THK', 'SUSC_WFR_CNT', 'LOWER_QUARTZ_THK', 'LOWER_QUARTZ_WFR', 'ARMS_WFR_CNT') // MetricType - [Required]('TUBE_BELL_JAR_THK', 'TUBE_BELL_JAR_WFR_CNT', 'SUSC_THK', 'SUSC_WFR_CNT', 'LOWER_QUARTZ_THK', 'LOWER_QUARTZ_WFR', 'ARMS_WFR_CNT', EXHAUST_CHAMBER_THK)
// //
// Reset a specified REACTOR metric to 0. // Reset a specified REACTOR metric to 0.
// //
@ -628,6 +657,9 @@ Service ResetWfrMetric(ReactorNo, MetricType = REACTORMETRIC)
Case MetricType = 'ARMS_WFR_CNT' Case MetricType = 'ARMS_WFR_CNT'
ReactorRec<REACTOR_ARMS_WFR_CNT$> = 0 ReactorRec<REACTOR_ARMS_WFR_CNT$> = 0
Case MetricType = 'EXHAUST_CHAMBER_THK'
ReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = 0
End Case End Case
Database_Services('WriteDataRow', 'REACTOR', ReactorNo, ReactorRec, 1, 0, 0) Database_Services('WriteDataRow', 'REACTOR', ReactorNo, ReactorRec, 1, 0, 0)

View File

@ -1,254 +1,235 @@
Function REACT_ITEM_Actions(Action, CalcColName, FSList, Handle, Name, FMC, Record, Status, OrigRecord, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10) Function REACT_ITEM_ACTIONS(Action, CalcColName, FSList, Handle, Name, FMC, Record, Status, OrigRecord, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)
/*********************************************************************************************************************** /***********************************************************************************************************************
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written 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. permission from Infineon.
Name : RDS_Actions Name : React_Item_Actions
Description : Handles calculated columns and MFS calls for the current table. Description : Handles calculated columns and MFS calls for the current table.
Notes : This function uses @ID, @RECORD, and @DICT to make sure {ColumnName} references work correctly. Notes : This function uses @ID, @RECORD, and @DICT to make sure {ColumnName} references work correctly.
If called from outside of a calculated column these will need to be set and restored. If called from outside of a calculated column these will need to be set and restored.
Parameters : Parameters :
Action [in] -- Name of the action to be taken Action [in] -- Name of the action to be taken
CalcColName [in] -- Name of the calculated column that needs to be processed. Normally this should only be CalcColName [in] -- Name of the calculated column that needs to be processed. Normally this should only be
populated when the CalcField action is being used. populated when the CalcField action is being used.
FSList [in] -- The list of MFSs and the BFS name for the current file or volume. This is an @SVM FSList [in] -- The list of MFSs and the BFS name for the current file or volume. This is an @SVM
delimited array, with the current MFS name as the first value in the array, and the BFS delimited array, with the current MFS name as the first value in the array, and the BFS
name as the last value. Normally set by a calling MFS. name as the last value. Normally set by a calling MFS.
Handle [in] -- The file handle of the file or media map being accessed. Note, this does contain the Handle [in] -- The file handle of the file or media map being accessed. Note, this does contain the
entire handle structure that the Basic+ Open statement would provide. Normally set by a entire handle structure that the Basic+ Open statement would provide. Normally set by a
calling MFS. calling MFS.
Name [in] -- The name (key) of the record or file being accessed. Normally set by a calling MFS. Name [in] -- The name (key) of the record or file being accessed. Normally set by a calling MFS.
FMC [in] -- Various functions. Normally set by a calling MFS. FMC [in] -- Various functions. Normally set by a calling MFS.
Record [in] -- The entire record (for record-oriented functions) or a newly-created handle (for Record [in] -- The entire record (for record-oriented functions) or a newly-created handle (for
"get handle" functions). Normally set by a calling MFS. "get handle" functions). Normally set by a calling MFS.
Status [in/out] -- Indicator of the success or failure of an action. Normally set by the calling MFS but Status [in/out] -- Indicator of the success or failure of an action. Normally set by the calling MFS but
for some actions can be set by the action handler to indicate failure. for some actions can be set by the action handler to indicate failure.
OrigRecord [in] -- Original content of the record being processed by the current action. This is OrigRecord [in] -- Original content of the record being processed by the current action. This is
automatically being assigned by the WRITE_RECORD and DELETE_RECORD actions within automatically being assigned by the WRITE_RECORD and DELETE_RECORD actions within
BASE_MFS. BASE_MFS.
Param1-10 [in/out] -- Additional request parameter holders Param1-10 [in/out] -- Additional request parameter holders
ActionFlow [out] -- Used to control the action chain (see the ACTION_SETUP insert for more information.) ActionFlow [out] -- Used to control the action chain (see the ACTION_SETUP insert for more information.)
Can also be used to return a special value, such as the results of the CalcField Can also be used to return a special value, such as the results of the CalcField
method. method.
History : (Date, Initials, Notes) History : (Date, Initials, Notes)
04/10/18 dmb Original programmer. 05/12/25 djs Updated WRITE_PRE action to update the CURR_STATUS_STATIC field if the retire date changes.
10/04/18 djs Added a trigger within the WRITE_RECORD event, which fires when the reactor number has
changed. When this occurs the related RDS_LAYER records for this RDS record are populated ***********************************************************************************************************************/
with the most recent associated TOOL_PARMS record. (related by PSN and Reactor)
#pragma precomp SRP_PreCompiler
***********************************************************************************************************************/
$Insert ACTION_SETUP
#pragma precomp SRP_PreCompiler $Insert APP_INSERTS
$Insert FILE.SYSTEM.EQUATES
$Insert FILE.SYSTEM.EQUATES $Insert REACT_ITEM_EQUATES
$Insert ACTION_SETUP
$Insert RDS_EQUATES Declare function obj_React_Item
$Insert CLEAN_INSP_EQUATES Declare subroutine Error_Services
$Insert COMPANY_EQUATES
$Insert RDS_LAYER_EQUATES If KeyID then GoSub Initialize_System_Variables
$Insert TOOL_PARMS_EQUATES
$Insert RLIST_EQUATES Begin Case
$Insert APP_INSERTS
$Insert QA_MET_EQUATES Case Action _EQC 'CalculateColumn' ; GoSub CalculateColumn
$Insert PRS_STAGE_EQUATES Case Action _EQC 'READ_RECORD_PRE' ; GoSub READ_RECORD_PRE
$Insert WO_MAT_EQUATES Case Action _EQC 'READ_RECORD' ; GoSub READ_RECORD
$Insert WO_MAT_QA_EQUATES Case Action _EQC 'READONLY_RECORD_PRE' ; GoSub READONLY_RECORD_PRE
Case Action _EQC 'READONLY_RECORD' ; GoSub READONLY_RECORD
Equ COMMA$ to ',' Case Action _EQC 'WRITE_RECORD_PRE' ; GoSub WRITE_RECORD_PRE
Case Action _EQC 'WRITE_RECORD' ; GoSub WRITE_RECORD
Declare function Error_Services, Database_Services, obj_RDS_Test, Logging_Services, Environment_Services, SRP_Math Case Action _EQC 'DELETE_RECORD_PRE' ; GoSub DELETE_RECORD_PRE
Declare function Tool_Parms_Services, Signature_Services, obj_WO_Mat_QA, Datetime, Override_Services, obj_WO_Mat Case Action _EQC 'DELETE_RECORD' ; GoSub DELETE_RECORD
Declare subroutine Error_Services, Database_Services, Logging_Services, Set_Status, Schedule_Services_Dev Case Otherwise$ ; Status = 'Invalid Action'
Declare subroutine Work_Order_Services, Material_Services, Set_FSError
End Case
If KeyID then GoSub Restore_System_Variables
If Assigned(ActionFlow) else ActionFlow = ACTION_CONTINUE$
If KeyID then GoSub Initialize_System_Variables
Return ActionFlow
Begin Case
Case Action _EQC 'CalculateColumn' ; GoSub CalculateColumn ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Case Action _EQC 'READ_RECORD_PRE' ; GoSub READ_RECORD_PRE // Calculated Columns
Case Action _EQC 'READ_RECORD' ; GoSub READ_RECORD //
Case Action _EQC 'READONLY_RECORD_PRE' ; GoSub READONLY_RECORD_PRE // The typical structure of a calculated column will look like this:
Case Action _EQC 'READONLY_RECORD' ; GoSub READONLY_RECORD //
Case Action _EQC 'WRITE_RECORD_PRE' ; GoSub WRITE_RECORD_PRE // Declare function Database_Services
Case Action _EQC 'WRITE_RECORD' ; GoSub WRITE_RECORD //
Case Action _EQC 'DELETE_RECORD_PRE' ; GoSub DELETE_RECORD_PRE // @ANS = Database_Services('CalculateColumn')
Case Action _EQC 'DELETE_RECORD' ; GoSub DELETE_RECORD ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Case Otherwise$ ; Status = 'Invalid Action'
CalculateColumn:
End Case
// Make sure the ActionFlow return variable is cleared in case nothing is calculated.
If KeyID then GoSub Restore_System_Variables ActionFlow = ''
If Assigned(ActionFlow) else ActionFlow = ACTION_CONTINUE$ return
Return ActionFlow // ----- MFS calls -----------------------------------------------------------------------------------------------------
READ_RECORD_PRE:
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // In order to stop a record from being read in this action these lines of code must be used:
// Calculated Columns //
// // OrigFileError = 100 : @FM : KeyID
// The typical structure of a calculated column will look like this: // Status = 0
// // Record = ''
// Declare function Database_Services // ActionFlow = ACTION_STOP$
// return
// @ANS = Database_Services('CalculateColumn')
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
READ_RECORD:
CalculateColumn:
// In order to stop a record from being read in this action these lines of code must be used:
// Make sure the ActionFlow return variable is cleared in case nothing is calculated. //
ActionFlow = '' // OrigFileError = 100 : @FM : KeyID
// Status = 0
// Record = ''
return return
READONLY_RECORD_PRE:
// ----- MFS calls ----------------------------------------------------------------------------------------------------- // In order to stop a record from being read in this action these lines of code must be used:
//
READ_RECORD_PRE: // OrigFileError = 100 : @FM : KeyID
// In order to stop a record from being read in this action these lines of code must be used: // Status = 0
// // Record = ''
// OrigFileError = 100 : @FM : KeyID // ActionFlow = ACTION_STOP$
// Status = 0 return
// Record = ''
// ActionFlow = ACTION_STOP$
READONLY_RECORD:
// In order to stop a record from being read in this action these lines of code must be used:
return //
// OrigFileError = 100 : @FM : KeyID
READ_RECORD: // Status = 0
// Record = ''
// In order to stop a record from being read in this action these lines of code must be used: return
//
// OrigFileError = 100 : @FM : KeyID
// Status = 0 WRITE_RECORD_PRE:
// Record = ''
ErrMsg = ''
return
// Req'd parameter checks
READONLY_RECORD_PRE: ItemType = {RI_TYPE}
// In order to stop a record from being read in this action these lines of code must be used:
// If ItemType EQ '' then ErrMsg := 'Item Type was not specified. '
// OrigFileError = 100 : @FM : KeyID
// Status = 0 If ErrMsg NE '' then
// Record = '' Error_Services('Add', 'Error Saving Reactor Item: ' : ErrMsg)
// ActionFlow = ACTION_STOP$ OrigFileError = 104:': Error Saving Reactor Item: ' : ErrMsg
return Status = 0
Record = ''
READONLY_RECORD: ActionFlow = ACTION_STOP$
// In order to stop a record from being read in this action these lines of code must be used: end else
// OrigRetireDt = OrigRecord<REACT_ITEM_RETIRE_DT$>
// OrigFileError = 100 : @FM : KeyID NewRetireDt = Record<REACT_ITEM_RETIRE_DT$>
// Status = 0 OrigNotes = OrigRecord<REACT_ITEM_NOTES$>
// Record = '' NewNotes = Record<REACT_ITEM_NOTES$>
return If ( (OrigRetireDt NE NewRetireDt) or (OrigNotes NE NewNotes) ) then
CurrStatus = obj_React_Item('CurrStatus', Name:@RM:Record)
WRITE_RECORD_PRE: Record<REACT_ITEM_CURR_STATUS_STATIC$> = CurrStatus
SaveRecord = Record
ErrMsg = '' end
end
//Req'd parameter checks
ItemType = {RI_TYPE} return
If ItemType EQ '' then WRITE_RECORD:
ErrMsg := 'Item Type was not specified. ' return
end
DELETE_RECORD_PRE:
If ErrMsg NE '' then return
Error_Services('Add', 'Error Saving Reactor Item: ' : ErrMsg)
OrigFileError = 104:': Error Saving Reactor Item: ' : ErrMsg DELETE_RECORD:
Status = 0 return
Record = ''
ActionFlow = ACTION_STOP$
end ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
return ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
WRITE_RECORD: ClearCursors:
For counter = 0 to 8
ClearSelect counter
return Next counter
DELETE_RECORD_PRE: return
return Initialize_System_Variables:
DELETE_RECORD: // Save these for restoration later
return SaveDict = @DICT
SaveID = @ID
SaveRecord = @RECORD
OrigFileError = @FILE.ERROR
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs // Now make sure @DICT, ID, and @RECORD are populated
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// CurrentDictName = ''
If @DICT then
ClearCursors: DictHandle = @DICT<1, 2>
For counter = 0 to 8 Locate DictHandle in @TABLES(5) Using @FM Setting fPos then
ClearSelect counter CurrentDictName = Field(@TABLES(0), @FM, fPos, 1)
Next counter end
return end
If CurrentDictName NE DictName then
Initialize_System_Variables: Open DictName to @DICT else Status = 'Unable to initialize @DICT'
end
// Save these for restoration later
SaveDict = @DICT @ID = KeyID
SaveID = @ID If Record else
SaveRecord = @RECORD // Record might not have been passed in. Read the record from the database table just to make sure.
OrigFileError = @FILE.ERROR @FILE.ERROR = ''
Open TableName to hTable then
// Now make sure @DICT, ID, and @RECORD are populated FullFSList = hTable[1, 'F' : @VM]
CurrentDictName = '' BFS = FullFSList[-1, 'B' : @SVM]
If @DICT then LastHandle = hTable[-1, 'B' : \0D\]
DictHandle = @DICT<1, 2> FileHandle = \0D\ : LastHandle[1, @VM]
Locate DictHandle in @TABLES(5) Using @FM Setting fPos then
CurrentDictName = Field(@TABLES(0), @FM, fPos, 1) Call @BFS(READO.RECORD, BFS, FileHandle, KeyID, FMC, Record, ReadOStatus)
end end
end end
@RECORD = Record
If CurrentDictName NE DictName then
Open DictName to @DICT else Status = 'Unable to initialize @DICT' return
end
@ID = KeyID Restore_System_Variables:
If Record else
// Record might not have been passed in. Read the record from the database table just to make sure. Transfer SaveDict to @DICT
@FILE.ERROR = '' Transfer SaveID to @ID
Open TableName to hTable then Transfer SaveRecord to @RECORD
FullFSList = hTable[1, 'F' : @VM] @FILE.ERROR = OrigFileError
BFS = FullFSList[-1, 'B' : @SVM]
LastHandle = hTable[-1, 'B' : \0D\] return
FileHandle = \0D\ : LastHandle[1, @VM]
Call @BFS(READO.RECORD, BFS, FileHandle, KeyID, FMC, Record, ReadOStatus)
end
end
@RECORD = Record
return
Restore_System_Variables:
Transfer SaveDict to @DICT
Transfer SaveID to @ID
Transfer SaveRecord to @RECORD
@FILE.ERROR = OrigFileError
return

View File

@ -20,62 +20,110 @@ Compile function React_Item_Services(@Service, @Params)
08/02/22 djs Original programmer. 08/02/22 djs Original programmer.
***********************************************************************************************************************/ ***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler #pragma precomp SRP_PreCompiler
$Insert LOGICAL
$Insert APP_INSERTS $Insert APP_INSERTS
$Insert SERVICE_SETUP
$Insert RLIST_EQUATES $Insert RLIST_EQUATES
$Insert REACT_ITEM_EQUATES $Insert REACT_ITEM_EQUATES
Declare function Database_Services, Error_Services, SRP_JSON, NextKey Declare function Database_Services, Error_Services, SRP_JSON, NextKey, SRP_Date, obj_React_Item, SRP_Array
Declare subroutine SRP_JSON, Error_Services, Btree.Extract, Database_Services Declare subroutine SRP_JSON, Error_Services, Btree.Extract, Database_Services, Update_Index
GoToService
Return Response or "" GoToService else
Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
end
//----------------------------------------------------------------------------- Return Response else ''
// SERVICES
//-----------------------------------------------------------------------------
Service GetAllReactItemKeys() ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
AllKeys = '' // Service Parameter Options
RList('SELECT REACT_ITEM', TARGET_ACTIVELIST$, '', '', '') ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Done = False$ Options BOOLEAN = True$, False$
Reactors = ''
Loop
Readnext keyId else Done = True$
Until Done
AllKeys<1,-1> = keyId
Repeat
Response = AllKeys
end service
Service GetReactItems(RIType, CurrStatus) ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Services
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Service GetReactItems(RIType, CurrStatus, EntryDtStart, EntryDtEnd, RetireDtStart, RetireDtEnd, IncludeNullRetireDt=BOOLEAN)
ErrorMsg = '' ErrorMsg = ''
Response = '' Response = ''
Swap ',' with @VM in RIType If ( (RIType NE '') or (CurrStatus NE '') or (EntryDtStart NE '') or (EntryDtEnd NE '') or (RetireDtStart NE '') or (RetireDtEnd NE '') or (IncludeNullRetireDt NE '') ) then
Swap ',' with @VM in CurrStatus If EntryDtStart NE '' and Not(Num(EntryDtStart)) then EntryDtStart = IConv(EntryDtStart, 'D')
If EntryDtEnd NE '' and Not(Num(EntryDtEnd)) then EntryDtEnd = IConv(EntryDtEnd, 'D')
Open 'DICT.REACT_ITEM' to DictReactItem then If RetireDtStart NE '' and Not(Num(RetireDtStart)) then RetireDtStart = IConv(RetireDtStart, 'D')
If RetireDtEnd NE '' and Not(Num(RetireDtEnd)) then RetireDtEnd = IConv(RetireDtEnd, 'D')
SearchString = '' Open 'DICT.REACT_ITEM' to DictReactItem then
If RIType NE '' then SearchString := 'RI_TYPE':@VM:RIType:@FM SearchString = ''
If CurrStatus NE '' then SearchString := 'CURR_STATUS':@VM:CurrStatus:@FM If RIType NE '' then
RIKeys = '' Swap ',' with @VM in RIType
Btree.Extract(SearchString, 'REACT_ITEM', DictReactItem, RIKeys, '', '') SearchString := 'RI_TYPE':@VM:RIType:@FM
ErrCode = '' end
IF Get_Status(ErrCode) then Begin Case
ErrorMsg = 'Error in ':Service:' service. Error calling Btree.Extract. Error code ':ErrCode:'.' Case ( (EntryDtStart NE '') and (EntryDtEnd NE '') )
EntryDtStart = OConv(EntryDtStart - 1, 'D4/')
EntryDtEnd = OConv(EntryDtEnd + 1, 'D4/')
SearchString := 'ENTER_DT':@VM:EntryDtStart:'~':EntryDtEnd:@FM
Case (EntryDtStart NE '')
EntryDtStart = OConv(EntryDtStart, 'D4/')
SearchString := 'ENTER_DT':@VM:'>=':EntryDtStart:@FM
Case (EntryDtEnd NE '')
SearchString := 'ENTER_DT':@VM:'<=':EntryDtEnd:@FM
Case Otherwise$
Null
End Case
Begin Case
Case ( (RetireDtStart NE '') and (RetireDtEnd NE '') )
RetireDtStart = OConv(RetireDtStart - 1, 'D4/')
RetireDtEnd = OConv(RetireDtEnd + 1, 'D4/')
SearchString := 'RETIRE_DT':@VM:RetireDtStart:'~':RetireDtEnd
If IncludeNullRetireDt then SearchString := @VM:''
SearchString := @FM
Case (RetireDtStart NE '')
RetireDtStart = OConv(RetireDtStart, 'D4/')
SearchString := 'RETIRE_DT':@VM:'>=':RetireDtStart
If IncludeNullRetireDt then SearchString := @VM:''
SearchString := @FM
Case (RetireDtEnd NE '')
SearchString := 'RETIRE_DT':@VM:'<=':RetireDtEnd
If IncludeNullRetireDt then SearchString := @VM:''
SearchString := @FM
Case IncludeNullRetireDt
SearchString := 'RETIRE_DT':@VM:'':@FM
Case Otherwise$
Null
End Case
If CurrStatus NE '' then
Swap ',' with @VM in CurrStatus
SearchString := 'CURR_STATUS_STATIC':@VM:CurrStatus:@FM
end
Flag = ''
RIKeys = ''
Btree.Extract(SearchString, 'REACT_ITEM', DictReactItem, RIKeys, 'E', Flag)
If Flag EQ 0 then
EnterDtms = Xlate('REACT_ITEM', RIKeys, 'ENTER_DTM', 'X')
Array = RIKeys:@FM:EnterDtms
Array = SRP_Array('SortRows', Array, 'DN2', 'ARRAY', @FM, @VM)
Response = Array<1>
end else
ErrorMsg = 'Error in ':Service:' service. Error calling Btree.Extract.'
end
end else end else
Response = RIKeys ErrorMsg = 'Error in ':Service:' service. Error opening REACT_ITEM dictionary.'
end end
end else end else
ErrorMsg = 'Error in ':Service:' service. Error opening REACT_ITEM dictionary.' AllKeys = ''
RList('SELECT REACT_ITEM', TARGET_ACTIVELIST$, '', '', '')
Done = False$
Loop
Readnext KeyId else Done = True$
Until Done
AllKeys<1, -1> = KeyId
Repeat
Response = AllKeys
end end
If ErrorMsg NE '' then If ErrorMsg NE '' then
Error_Services('Add', ErrorMsg) Error_Services('Add', ErrorMsg)
end end
@ -155,7 +203,6 @@ Service ConvertRecordToJSON(KeyID, Record, ItemURL)
Response = jsonRecord Response = jsonRecord
end service end service
@ -326,11 +373,11 @@ Service GetReactItemTemplateJSON()
Response = jsonRecord Response = jsonRecord
end service end service
Service CreateReactItem(Record) Service CreateReactItem(Record)
ErrMsg = '' ErrMsg = ''
KeyID = '' KeyID = ''
If Record NE '' then If Record NE '' then
@ -355,6 +402,7 @@ Service CreateReactItem(Record)
end service end service
Service ConvertRecordToJSONQuick(KeyID, Record, ItemURL) Service ConvertRecordToJSONQuick(KeyID, Record, ItemURL)
jsonRecord = '' jsonRecord = ''
@ -407,6 +455,32 @@ Service ConvertRecordToJSONQuick(KeyID, Record, ItemURL)
Response = jsonRecord Response = jsonRecord
end service end service
Service UpdateReactItemStatus(RINo)
If RINo NE '' then
If RowExists('REACT_ITEM', RINo) then
RIRec = Database_Services('ReadDataRow', 'REACT_ITEM', RINo)
If Error_Services('NoError') then
Update_Index('REACT_ITEM_HIST', 'RI_NO', False$, True$)
ReactItemCurrStatus = obj_React_Item('CurrStatus', RINo:@RM:RIRec)
ReactItemCurrStatusStatic = RIRec<REACT_ITEM_CURR_STATUS_STATIC$>
If ReactItemCurrStatus NE ReactItemCurrStatusStatic then
Open 'REACT_ITEM' to hTable then
WriteV ReactItemCurrStatus on hTable, RINo, REACT_ITEM_CURR_STATUS_STATIC$ else
Error_Services('Add', 'Error in ':Service:' service. Error writing CURR_STATUS_STATIC, ':ReactItemCurrStatus:', for REACT_ITEM ':RINo:'.')
end
end else
Error_Services('Add', 'Error in ':Service:' service. Error opening REACT_ITEM table for status update.')
end
end
end
end
end
end service
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs // Internal GoSubs
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -419,6 +493,3 @@ ClearCursors:
return return

View File

@ -79,6 +79,7 @@ Service CreateReturnToFabRecord(CassId, UserId)
Recipients = XLATE('NOTIFICATION','SHIPPING',NOTIFICATION_USER_ID$,'X') Recipients = XLATE('NOTIFICATION','SHIPPING',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_ENG',NOTIFICATION_USER_ID$,'X') Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_ENG',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_MANUF',NOTIFICATION_USER_ID$,'X') Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_MANUF',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_GENERAL',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = UserId Recipients<1, -1> = UserId
SentFrom = 'OI_ADMIN' SentFrom = 'OI_ADMIN'
Subject = 'Return To Fab Form Created' Subject = 'Return To Fab Form Created'
@ -475,6 +476,7 @@ Service SetBinToBin(RTFId, MHUserId)
Recipients = XLATE('NOTIFICATION','SHIPPING',NOTIFICATION_USER_ID$,'X') Recipients = XLATE('NOTIFICATION','SHIPPING',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_ENG',NOTIFICATION_USER_ID$,'X') Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_ENG',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_MANUF',NOTIFICATION_USER_ID$,'X') Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_MANUF',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_GENERAL',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = RTFOrigUser Recipients<1, -1> = RTFOrigUser
SentFrom = 'OI_ADMIN' SentFrom = 'OI_ADMIN'
Subject = 'Return To Fab Form Updated' Subject = 'Return To Fab Form Updated'
@ -549,6 +551,7 @@ Service SetRTFCompleted(RTFId, CompleteUserId)
Recipients = XLATE('NOTIFICATION','SHIPPING',NOTIFICATION_USER_ID$,'X') Recipients = XLATE('NOTIFICATION','SHIPPING',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_ENG',NOTIFICATION_USER_ID$,'X') Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_ENG',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_MANUF',NOTIFICATION_USER_ID$,'X') Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_MANUF',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_GENERAL',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = RTFRecord<RETURN_TO_FAB_LOTS_REQUESTOR_USER_ID$> Recipients<1, -1> = RTFRecord<RETURN_TO_FAB_LOTS_REQUESTOR_USER_ID$>
SentFrom = 'OI_ADMIN' SentFrom = 'OI_ADMIN'
Subject = 'Return To Fab Form Completed' Subject = 'Return To Fab Form Completed'
@ -623,6 +626,7 @@ Service SetEvalInfo(RTFId, EvalUserId, ResultId)
Recipients = XLATE('NOTIFICATION','SHIPPING',NOTIFICATION_USER_ID$,'X') Recipients = XLATE('NOTIFICATION','SHIPPING',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_ENG',NOTIFICATION_USER_ID$,'X') Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_ENG',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_MANUF',NOTIFICATION_USER_ID$,'X') Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_MANUF',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_GENERAL',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = RTFRecord<RETURN_TO_FAB_LOTS_REQUESTOR_USER_ID$> Recipients<1, -1> = RTFRecord<RETURN_TO_FAB_LOTS_REQUESTOR_USER_ID$>
SentFrom = 'OI_ADMIN' SentFrom = 'OI_ADMIN'
Subject = 'Return To Fab Form Updated' Subject = 'Return To Fab Form Updated'
@ -822,3 +826,4 @@ end service

View File

@ -335,6 +335,18 @@ Service ProcessScanData(ScanID, ScanJSON)
Error_Services('Add', 'Inactive employee.') Error_Services('Add', 'Inactive employee.')
Case Otherwise$ Case Otherwise$
ScansRow<SCANS.EMPLOYEE_ID$> = {EMPLOYEE_ID} ScansRow<SCANS.EMPLOYEE_ID$> = {EMPLOYEE_ID}
Username = {EMPLOYEE_ID}
Member = False$
Groups = 'LEAD':@VM:'SUPERVISOR':@VM:'ENGINEER':@VM:'ENG_TECH':@VM:'ROTR_OVERRIDE'
For each Group in Groups using @VM
Member = MemberOf(Username, Group)
Until Member EQ True$
Next Group
ScansRow<SCANS.IS_AUTHORIZED_TO_OVERRIDE_ROTR$> = Member
End Case End Case
Case ScanData[1, 3] EQ '10S' Case ScanData[1, 3] EQ '10S'
@ -520,6 +532,9 @@ Service ProcessScanData(ScanID, ScanJSON)
Database_Services('WriteDataRow', 'REACTOR', Reactor, ReactorRec, True$, False$, True$) Database_Services('WriteDataRow', 'REACTOR', Reactor, ReactorRec, True$, False$, True$)
Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$) Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$)
ScansRow<SCANS.OVERRIDE_REQD$> = 0
ScansRow<SCANS.OVERRIDE_TYPE$> = ''
ScansRow<SCANS.OVERRIDE_REASON$> = ''
ScansRow<SCANS.EMPLOYEE_ID$>= '' ScansRow<SCANS.EMPLOYEE_ID$>= ''
Result = 'Override Performed successfully' Result = 'Override Performed successfully'
end end
@ -652,6 +667,7 @@ Service ProcessScanData(ScanID, ScanJSON)
If (CassetteIDs NE '') then If (CassetteIDs NE '') then
TestWaferLotData = ScansRow<SCANS.TW_LOT_ID$> TestWaferLotData = ScansRow<SCANS.TW_LOT_ID$>
Abort = False$ Abort = False$
TestWaferLotIsValid = False$
If TestWaferLotData NE '' then If TestWaferLotData NE '' then
ThisTestRunType = ScansRow<SCANS.TEST_RUN_TYPE_ID$> ThisTestRunType = ScansRow<SCANS.TEST_RUN_TYPE_ID$>
If ThisTestRunType NE '' then If ThisTestRunType NE '' then
@ -667,6 +683,8 @@ Service ProcessScanData(ScanID, ScanJSON)
If Not(TWLotCurrOpen) then If Not(TWLotCurrOpen) then
Abort = True$ Abort = True$
Scan_Services('AddNotAcceptableReason', 'Lot ':TWLot:' is closed and cannot be used at this time.') Scan_Services('AddNotAcceptableReason', 'Lot ':TWLot:' is closed and cannot be used at this time.')
end else
TestWaferLotIsValid = True$
end end
end else end else
Abort = True$ Abort = True$
@ -1090,6 +1108,60 @@ Service ProcessScanData(ScanID, ScanJSON)
Case Otherwise$ Case Otherwise$
// Keep error on Error_Services stack and return 400 level error. // Keep error on Error_Services stack and return 400 level error.
End Case End Case
end else
ReactorNo = Xlate('RDS', RDSNo, RDS_REACTOR$, 'X')
ReactorType = Xlate('REACTOR', ReactorNo, REACTOR_REACT_TYPE$, 'X')
If Len(ReactorType) GE 3 and ReactorType[1, 3] _EQC 'HTR' then
WO = Xlate('RDS', RDSNo, RDS_WO$, 'X')
CassNo = Xlate('RDS', RDSNo, 'RUN_ORDER_NUM', 'X')
WoMatKey = WO:'*':CassNo
WoMatRec = Database_Services('ReadDataRow', 'WO_MAT', WoMatKey)
LastCassInWoTestWaferAckReq = WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACK_REQ$>
LastCassInWoTestWaferAcked = WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACKED$>
LastCassInWoTestWaferReqMsg = ''
If LastCassInWoTestWaferAcked EQ False$ or LastCassInWoTestWaferAcked EQ '' then
LastCassInWo = WO_MAT_Services('CassetteIsLastInWo', WoMatKey)
If LastCassInWo then
NextEventScheduled = False$
NextEventHasSamePsn = True$
NextEventIsBlock = False$
NextScheduledEvent = Schedule_Services('GetNextEvent', ReactorNo)
If Error_Services('NoError') then
NextEventScheduled = True$
NextEventHasSamePsn = Schedule_Services('NextEventIsSamePsn', ReactorNo)
NextEventIsBlock = Schedule_Services('NextEventIsBlock', ReactorNo)
end
If NextEventScheduled EQ False$ or NextEventHasSamePsn EQ False$ or NextEventIsBlock EQ True$ then
LastCassInWoTestWaferAckReq = True$
WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACK_REQ$> = LastCassInWoTestWaferAckReq
TestWaferRanSinceLoad = WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$> or TestWaferLotIsValid EQ True$
If TestWaferLotIsValid NE True$ and TestWaferRanSinceLoad NE True$ then
TestWaferRanSinceLoad = Rds_Services('TestWaferRanAfterLoad', RDSNo)
If TestWaferRanSinceLoad NE True$ then
LastCassInWoTestWaferReqMsg = ''
If NextEventScheduled EQ False$ or NextEventIsBlock EQ True$ then
LastCassInWoTestWaferReqMsg = 'No material scheduled. Test wafer required.'
end else If NextEventHasSamePsn EQ False$ then
LastCassInWoTestWaferReqMsg = 'Next work order is a NEW PSN number. Test wafer required.'
end
Scan_Services('AddNotAcceptableReason', LastCassInWoTestWaferReqMsg)
end
end
WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$> = TestWaferRanSinceLoad
Database_Services('WriteDataRow', 'WO_MAT', WoMatKey, WoMatRec, True$, False$, False$)
end
end
end
end
end end
end else end else
ScanMsg = 'The POST stage engineering instructions must be acknowledged before the load operation can be signed.' ScanMsg = 'The POST stage engineering instructions must be acknowledged before the load operation can be signed.'
@ -1403,6 +1475,7 @@ Service AcceptScan(ScanID, ScanJSON)
LogData<3> = Username LogData<3> = Username
LogData<4> = CurrStage LogData<4> = CurrStage
LogData<5> = ScanID LogData<5> = ScanID
Begin Case Begin Case
Case CurrStage _EQC 'VER' Case CurrStage _EQC 'VER'
Action = 'LOAD' Action = 'LOAD'
@ -1493,14 +1566,32 @@ Service AcceptScan(ScanID, ScanJSON)
Case CurrStage _EQC 'UNLOAD' Case CurrStage _EQC 'UNLOAD'
Action = 'UNLOAD' Action = 'UNLOAD'
// Check if UNLOAD stage is ready to sign Continue = True$
UnloadStageSigned = QA_Services('SignUnloadStage', RDSNo, Username, 1) If TestWaferLots NE '' then
If UnloadStageSigned EQ True$ then ToolID = ScansRow<SCANS.TOOL_ID$>
Result = '(':CassetteID:') Unload stage signed.' Reactor = ToolID[-1, 'BR']
Username = ScansRow<SCANS.EMPLOYEE_ID$>
TestWaferLotQtys = ScansRow<SCANS.TW_LOT_QTY$>
TestRunType = ScansRow<SCANS.TEST_RUN_TYPE_ID$>
PSNo = Xlate('RDS', RDSNo, RDS_PROD_SPEC_ID$, True$, 'X')
NewTestRunId = Test_Run_Services('CreateTestRunRecord', TestRunType, 'R', Reactor, PSNo, RDSNo,Username , TestWaferLots, TestWaferLotQtys)
If Error_Services('HasError') then
ErrorMessage = Error_Services('GetMessage')
Error_Services('Set', ErrorMessage)
Continue = False$
end
end
If Continue EQ True$ then
// Check if UNLOAD stage is ready to sign
UnloadStageSigned = QA_Services('SignUnloadStage', RDSNo, Username, 1)
If UnloadStageSigned EQ True$ then
Result = '(':CassetteID:') Unload stage signed.'
end
LogData<6> = Action
LogData<7> = Result
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
end end
LogData<6> = Action
LogData<7> = Result
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
Case CurrStage _EQC 'COMP' Case CurrStage _EQC 'COMP'
Action = 'COMP' Action = 'COMP'
Error_Services('Set', '(':CassetteID:") Cassette has already been FQA'd.") Error_Services('Set', '(':CassetteID:") Cassette has already been FQA'd.")
@ -1674,6 +1765,7 @@ Service ConvertMVScanToJSON(ScanID, mvScan, itemURL)
SRP_JSON(objEmployee, 'SetValue', 'authorized', {EMPLOYEE_AUTHORIZED}, 'Boolean') SRP_JSON(objEmployee, 'SetValue', 'authorized', {EMPLOYEE_AUTHORIZED}, 'Boolean')
SRP_JSON(objEmployee, 'SetValue', 'notAuthorizedReason', {EMPLOYEE_NOT_AUTHORIZED_REASON}, 'String') SRP_JSON(objEmployee, 'SetValue', 'notAuthorizedReason', {EMPLOYEE_NOT_AUTHORIZED_REASON}, 'String')
SRP_JSON(objEmployee, 'SetValue', 'authenticated' , @Record<SCANS.AUTHENTICATED$> , 'Boolean');//JRO Change SRP_JSON(objEmployee, 'SetValue', 'authenticated' , @Record<SCANS.AUTHENTICATED$> , 'Boolean');//JRO Change
SRP_JSON(objEmployee, 'SetValue', 'isAuthorizedToOverrideROTR', @Record<SCANS.IS_AUTHORIZED_TO_OVERRIDE_ROTR$>, 'Boolean')
SRP_JSON(objJSONScan, 'Set', 'employee', objEmployee) SRP_JSON(objJSONScan, 'Set', 'employee', objEmployee)
SRP_JSON(objEmployee, 'Release') SRP_JSON(objEmployee, 'Release')
@ -1787,52 +1879,6 @@ Service ConvertMVScanToJSON(ScanID, mvScan, itemURL)
end else end else
SupplUnloadInstAckReq = False$ SupplUnloadInstAckReq = False$
end end
ReactorNo = Xlate('RDS', RDSNo, RDS_REACTOR$, 'X')
ReactorType = Xlate('REACTOR', ReactorNo, REACTOR_REACT_TYPE$, 'X')
If Len(ReactorType) GE 3 and ReactorType[1, 3] _EQC 'HTR' then
WO = Xlate('RDS', RDSNo, RDS_WO$, 'X')
CassNo = Xlate('RDS', RDSNo, 'RUN_ORDER_NUM', 'X')
WoMatKey = WO:'*':CassNo
WoMatRec = Database_Services('ReadDataRow', 'WO_MAT', WoMatKey)
LastCassInWoTestWaferAckReq = WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACK_REQ$>
LastCassInWoTestWaferAcked = WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACKED$>
LastCassInWoTestWaferReqMsg = ''
If LastCassInWoTestWaferAcked EQ False$ or LastCassInWoTestWaferAcked EQ '' then
LastCassInWo = WO_MAT_Services('CassetteIsLastInWo', WoMatKey)
If LastCassInWo then
NextEventScheduled = False$
NextEventHasSamePsn = True$
NextEventIsBlock = False$
NextScheduledEvent = Schedule_Services('GetNextEvent', ReactorNo)
If Error_Services('NoError') then
NextEventScheduled = True$
NextEventHasSamePsn = Schedule_Services('NextEventIsSamePsn', ReactorNo)
NextEventIsBlock = Schedule_Services('NextEventIsBlock', ReactorNo)
end
If NextEventScheduled EQ False$ or NextEventHasSamePsn EQ False$ or NextEventIsBlock EQ True$ then
LastCassInWoTestWaferAckReq = True$
WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACK_REQ$> = LastCassInWoTestWaferAckReq
WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACKED$> = LastCassInWoTestWaferAcked
Database_Services('WriteDataRow', 'WO_MAT', WoMatKey, WoMatRec, True$, False$, False$)
LastCassInWoTestWaferReqMsg = ''
If NextEventScheduled EQ False$ or NextEventIsBlock EQ True$ then
LastCassInWoTestWaferReqMsg = 'No material scheduled. Test wafer required.'
end else If NextEventHasSamePsn EQ False$ then
LastCassInWoTestWaferReqMsg = 'Next work order is a NEW PSN number. Test wafer required.'
end
end
end
end
SRP_JSON(objRDS, 'SetValue', 'lastCassInWoTestWaferAckReq', LastCassInWoTestWaferAckReq, 'Boolean')
SRP_JSON(objRDS, 'SetValue', 'lastCassInWoTestWaferAcked', LastCassInWoTestWaferAcked, 'Boolean')
SRP_JSON(objRDS, 'SetValue', 'lastCassInWoTestWaferAckReqMsg', LastCassInWoTestWaferReqMsg, 'String')
end
end else end else
SupplUnloadInstAckReq = False$ SupplUnloadInstAckReq = False$
end end
@ -2355,3 +2401,4 @@ return

View File

@ -16,7 +16,8 @@ Subroutine Service_Manager_Debugger_Intercept(Void)
Metadata : Metadata :
History : (Date, Initials, Notes) History : (Date, Initials, Notes)
07/25/23 djs Original programmer. 07/25/23 djs Original programmer.
06/04/25 djs Added LSL note creation (and email forwarding) to notify OI_ADMIN users when invoked.
***********************************************************************************************************************/ ***********************************************************************************************************************/
@ -24,24 +25,58 @@ Subroutine Service_Manager_Debugger_Intercept(Void)
$insert APP_INSERTS $insert APP_INSERTS
$insert RTI_DEBUG_COMMON $insert RTI_DEBUG_COMMON
$insert ENVIRON_CONSTANTS
Declare function Environment_Services, Logging_Services Declare function Environment_Services, Logging_Services, Environment_Services, GetCommandLine, Datetime
Declare subroutine Logging_Services Declare subroutine Logging_Services, obj_Notes, Set_Env
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\ServiceManager' Main:
LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS') // Log event in .\LogFiles\ServiceManager\<Date> OEngine Log.csv
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' OEngine Log.csv' LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\ServiceManager'
Headers = 'Stored Proc Status' : @FM : 'Stored Proc Status Code' : @FM : 'Current Program' : @FM : 'Call Depth' : @FM : 'Line No' : @FM : 'Call Stack' LogDate = Oconv(Date(), 'D4/')
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$) LogTime = Oconv(Time(), 'MTS')
LogData = '' LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' OEngine Log.csv'
LogData<1> = SPStatus@ Headers = 'Stored Proc Status' : @FM : 'Stored Proc Status Code' : @FM : 'Current Program' : @FM
LogData<2> = SPStatCode@ Headers := 'Call Depth' : @FM : 'Line No' : @FM : 'Call Stack'
LogData<3> = Curr_Program@ objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
LogData<4> = CallDepth@ LogData = ''
LogData<5> = LineNo@ LogData<1> = spStatus@
LogData<6> = CallStack@ LogData<2> = spStatCode@
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, '', '', '') LogData<3> = curr_Program@
LogData<4> = callDepth@
LogData<5> = lineNo@
LogData<6> = callStack@
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, '', '', '')
// Send an LSL message to FI admins to alert them. This is forward to their email address if configured in
// their LSL_USERS record.
CmdLine = GetCommandLine()
EngIndex = Index(CmdLine, '/S=', 1)
EngNo = CmdLine[EngIndex + 3, 'F ']
Server = Environment_Services('GetServer')
Recipients = ''
SentFrom = 'SYSTEM'
Subject = 'Service Manager Debugger Intercept Invoked'
Message = OConv(Datetime(), 'DT2/^H')
Message<2> = 'RevEngineHost (OEngine) ':EngNo:' encountered a runtime error on server ':Server
Message<3> = 'Stored Procedure Status: ':spStatus@
StatCodes = spStatCode@
Swap Char(0) with ',' in StatCodes
Swap Char(23) with '' in StatCodes
Message<4> = 'Stored Procedure Status Code: ':StatCodes
Message<5> = 'Current Program: ':curr_Program@
Message<6> = 'Call Depth: ':callDepth@
Message<7> = 'Line No: ':lineNo@
Message<8> = 'Call Stack: ':\0D0A\:callStack@
Swap @FM with \0D0A\ in Message
Swap @VM with ',' in Message
AttachWindow = ''
AttachKey = ''
SendToGroup = 'OI_SYSADMIN'
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
obj_Notes('Create',Parms)
Return Return

View File

@ -27,19 +27,29 @@ Function Service_Services(@Service, @Params)
#pragma precomp SRP_PreCompiler #pragma precomp SRP_PreCompiler
$insert LOGICAL $insert APP_INSERTS
$insert SERVICE_SETUP $insert SERVICE_SETUP
$insert SERVICES_EQUATES $insert SERVICES_EQUATES
$insert RLIST_EQUATES $insert RLIST_EQUATES
$insert SQL_REQUESTS_EQUATES $insert SQL_REQUESTS_EQUATES
$Insert PROC_QUEUE_EQUATES $Insert PROC_QUEUE_EQUATES
Equ Comma$ to ','
Common /ServiceServices/ Unused1@, Unused2@, Unused3@, Unused4@, Unused5@, Unused6@, Unused7@, Unused8@, Unused9@, Unused10@ Common /ServiceServices/ Unused1@, Unused2@, Unused3@, Unused4@, Unused5@, Unused6@, Unused7@, Unused8@, Unused9@, Unused10@
Declare function Service_Services, Memory_Services, SRP_List, SRP_FastArray, SRP_Array, Database_Services, Datetime Declare function Service_Services, Memory_Services, SRP_List, SRP_FastArray, SRP_Array, Database_Services, Datetime
Declare Function GetTickCount, SRP_Decode, RTI_CREATEGUID Declare function GetTickCount, SRP_Decode, RTI_CreateGuid, UCase, Environment_services, Logging_Services
Declare subroutine Service_Services, Memory_Services, SRP_List, SRP_FastArray, RList, Set_Status, Database_Services Declare subroutine Service_Services, Memory_Services, SRP_List, SRP_FastArray, RList, Set_Status, Database_Services
Declare Subroutine Yield, WinYield, Sleepery, Btree.Extract Declare Subroutine Yield, WinYield, Sleepery, Btree.Extract, Logging_Services, obj_Notes
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\ProcQueue'
LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS')
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Procedure Queue Log.csv'
Headers = 'Logging DTM' : @FM : 'Machine' : @FM : 'RequestKeyId' : @FM : 'Procedure' : @FM : 'Params' : @FM : 'Result' : @FM : 'Error Message'
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
GoToService else GoToService else
Error_Services('Add', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.') Error_Services('Add', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
@ -165,18 +175,21 @@ Service ProcessProcedureQueue()
ReadNext RequestKeyID else EOF = True$ ReadNext RequestKeyID else EOF = True$
Until EOF or Done Until EOF or Done
Lock hProcQueue, RequestKeyID then Lock hProcQueue, RequestKeyID then
Server = Environment_Services('GetServer')
Done = True$ Done = True$
Database_Services('GetKeyIDLock', 'PROC_QUEUE', RequestKeyId) Database_Services('GetKeyIDLock', 'PROC_QUEUE', RequestKeyId)
RequestRow = Database_Services('ReadDataRow', 'PROC_QUEUE', RequestKeyID) RequestRow = Database_Services('ReadDataRow', 'PROC_QUEUE', RequestKeyID)
If RequestRow NE '' then If RequestRow NE '' then
Procedure = RequestRow<PROC_QUEUE.PROC_NAME$> Procedure = RequestRow<PROC_QUEUE.PROC_NAME$>
Procedure = UCase(Procedure)
Params = RequestRow<PROC_QUEUE.PARAMS$> Params = RequestRow<PROC_QUEUE.PARAMS$>
If Procedure NE '' then If Procedure NE '' then
Dim ProcParams(11) Dim ProcParams(12)
For each Param in Params using @VM setting pPos For each Param in Params using @VM setting pPos
ProcParams(pPos) = Param ProcParams(pPos) = Param
Next Param Next Param
NumArguments = DCount(Params, @VM) NumArguments = DCount(Params, @VM)
Begin Case Begin Case
Case NumArguments EQ 0 ; Call @Procedure() Case NumArguments EQ 0 ; Call @Procedure()
Case NumArguments EQ 1 ; Call @Procedure(ProcParams(1)) Case NumArguments EQ 1 ; Call @Procedure(ProcParams(1))
@ -194,17 +207,40 @@ Service ProcessProcedureQueue()
Error_Services('Add', 'Error in ':Service:' service. More than 11 arguments are not currently supported.') Error_Services('Add', 'Error in ':Service:' service. More than 11 arguments are not currently supported.')
End Case End Case
end end
If Error_Services('NoError') then
Database_Services('DeleteDataRow', 'PROC_QUEUE', RequestKeyId, True$, False$) ; // This call will release the lock Swap @VM with ',' in Params
LogData = LoggingDTM
LogData<2> = Server
LogData<3> = RequestKeyId
LogData<4> = Procedure
LogData<5> = Params
ErrCode = ''
If ( Get_Status(ErrCode) or Error_Services('HasError') ) then
ErrorMessage = Error_Services('GetMessage')
Recipients = ''
SentFrom = 'SYSTEM'
Subject = 'Background Procedure Queue Error'
Message = OConv(Datetime(), 'DT2/^H')
Message<2> = 'Error on server ':Server
Message<3> = 'Stored Procedure: ':Procedure
StatCodes = 'Parameters: ':Params
Message<4> = 'Error_Services error message: ':ErrorMessage
Message<5> = 'Get_Status error code: ':ErrCode
Swap @FM with \0D0A\ in Message
AttachWindow = ''
AttachKey = ''
SendToGroup = 'OI_SYSADMIN'
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
obj_Notes('Create',Parms)
LogData<6> = 'Failed'
LogData<7> = 'Error_Services error message: ':ErrorMessage:' Get_Status error code: ':ErrCode
end else end else
RequestRow<PROC_QUEUE.LAST_ATTEMPT_DTM$> = DateTime() LogData<6> = 'Success'
RequestRow<PROC_QUEUE.ERROR$> = Error_Services('GetMessage')
Database_Services('WriteDataRow', 'PROC_QUEUE', RequestKeyID, RequestRow, True$, False$, False$) ; // This call will release the lock
end end
end else Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
// Empty request, so delete it from the queue
Database_Services('DeleteDataRow', 'PROC_QUEUE', RequestKeyId, True$, False$) ; // This call will release the lock
end end
Database_Services('DeleteDataRow', 'PROC_QUEUE', RequestKeyId, True$, False$) ; // This call should release the lock
Unlock hProcQueue, RequestKeyID else Null
end end
Repeat Repeat
end end
@ -258,4 +294,3 @@ return
/// Internal GoSubs /// Internal GoSubs
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@ -1231,19 +1231,23 @@ Service SignVoidNonEpp(WOMatKey, Username)
Service_Services('PostProcedure', 'RDS_SERVICES', 'DetachRDSFromWO':@vm:RDSNo) Service_Services('PostProcedure', 'RDS_SERVICES', 'DetachRDSFromWO':@vm:RDSNo)
If Error_Services('NoError') then If Error_Services('NoError') then
LotEventParams = '' LotEventParams = ''
LotEventParams<1,1> = 'CreateLotEvent' LotEventParams<1,1> = 'CreateLotEvent' ; //Service Module
LotEventParams<1,4> = DateTime() LotEventParams<1,2> = ''; //Legacy Lot Id, set below
LotEventParams<1,5> = 'VOID' LotEventParams<1,3> = DateTime(); //Datetime
LotEventParams<1,6> = 'Lot voided by ' : Username LotEventParams<1,4> = 'VOID'; //Event Type
LotEventParams<1,11> = Username LotEventParams<1,5> = 'Lot voided by ' : Username; //Event Note
LotEventParams<1,6> = ''; //Equipment id
LotEventParams<1,7> = Username ;//User Id
LotEventParams<1,8> = True$; //IsLegacyLotId
LotEventParams<1,9> = ''; //Legacy Lot Type, set below
If RDSNo NE '' then If RDSNo NE '' then
LotEventParams<1,2> = RDSNo LotEventParams<1,2> = RDSNo
LotEventParams<1,3> = 'RDS' LotEventParams<1,9> = 'RDS'; //Legacy Lot Type
Service_Services('PostProcedure', 'LOT_SERVICES', LotEventParams) Service_Services('PostProcedure', 'LOT_EVENT_SERVICES', LotEventParams)
end else end else
LotEventParams<1,2> = WoMatKey LotEventParams<1,2> = WoMatKey
LotEventParams<1,3> = 'WO_MAT' LotEventParams<1,9> = 'WO_MAT'
Service_Services('PostProcedure', 'LOT_SERVICES', LotEventParams) Service_Services('PostProcedure', 'LOT_EVENT_SERVICES', LotEventParams)
end end
If Error_Services('NoError') then If Error_Services('NoError') then
//Add inventory transaction //Add inventory transaction
@ -1311,13 +1315,15 @@ Service SignVoidWMI(WMInKey, Username)
If Error_Services('NoError') then If Error_Services('NoError') then
LotEventParams = '' LotEventParams = ''
LotEventParams<1,1> = 'CreateLotEvent' LotEventParams<1,1> = 'CreateLotEvent'
LotEventParams<1,4> = DateTime()
LotEventParams<1,5> = 'VOID'
LotEventParams<1,6> = 'Lot voided by ' : Username
LotEventParams<1,11> = Username
LotEventParams<1,2> = WMInKey LotEventParams<1,2> = WMInKey
LotEventParams<1,3> = 'WM_IN' LotEventParams<1,3> = DateTime()
Service_Services('PostProcedure', 'LOT_SERVICES', LotEventParams) LotEventParams<1,4> = 'VOID'
LotEventParams<1,5> = 'Lot voided by ' : Username
LotEventParams<1,6> = ''
LotEventParams<1,7> = Username
LotEventParams<1,8> = True$
LotEventParams<1,9> = 'WM_IN'
Service_Services('PostProcedure', 'LOT_EVENT_SERVICES', LotEventParams)
If Error_Services('NoError') then If Error_Services('NoError') then
//Check if WMO is also voided. If it is, remove it from the WO_MAT_KEY field in WO_LOG, and void the WO_MAT record //Check if WMO is also voided. If it is, remove it from the WO_MAT_KEY field in WO_LOG, and void the WO_MAT record
WMOKey = WMInKey; //the paired WMO key is the same as the WMIKey WMOKey = WMInKey; //the paired WMO key is the same as the WMIKey
@ -1386,13 +1392,15 @@ Service SignVoidWMO(WMOutKey, Username)
If Error_Services('NoError') then If Error_Services('NoError') then
LotEventParams = '' LotEventParams = ''
LotEventParams<1,1> = 'CreateLotEvent' LotEventParams<1,1> = 'CreateLotEvent'
LotEventParams<1,4> = DateTime()
LotEventParams<1,5> = 'VOID'
LotEventParams<1,6> = 'Lot voided by ' : Username
LotEventParams<1,11> = Username
LotEventParams<1,2> = WMOutKey LotEventParams<1,2> = WMOutKey
LotEventParams<1,3> = 'WM_OUT' LotEventParams<1,3> = DateTime()
Service_Services('PostProcedure', 'LOT_SERVICES', LotEventParams) LotEventParams<1,4> = 'VOID'
LotEventParams<1,5> = 'Lot voided by ' : Username
LotEventParams<1,6> = ''
LotEventParams<1,7> = Username
LotEventParams<1,8> = True$
LotEventParams<1,9> = 'WM_OUT'
Service_Services('PostProcedure', 'LOT_EVENT_SERVICES', LotEventParams)
If Error_Services('NoError') then If Error_Services('NoError') then
//Check if WMI is also voided. If it is, remove it from the WO_MAT_KEY field in WO_LOG, and void the WO_MAT record //Check if WMI is also voided. If it is, remove it from the WO_MAT_KEY field in WO_LOG, and void the WO_MAT record
WMIKey = WMOutKey; //the paired WMO key is the same as the WMIKey WMIKey = WMOutKey; //the paired WMO key is the same as the WMIKey
@ -1558,3 +1566,4 @@ ClearCursors:
return return

View File

@ -181,14 +181,7 @@ DoRead:
Reactor = get_property( @window, '@Reactor' ) Reactor = get_property( @window, '@Reactor' )
LoadedRDS = Xlate('REACT_STATUS', Reactor, 'LOAD_RDS', 'X') LoadedRDS = Xlate('REACT_STATUS', Reactor, 'LOAD_RDS', 'X')
LoadedRuns = '' LoadedRuns = Xlate('RDS', LoadedRDS, 'RUN_ORDER_NUM', 'X')
If LoadedRDS NE '' then
For each RDS in LoadedRDS using @VM setting vPos
Locate RDS in AllRDS using @VM setting rPos then
LoadedRuns<0, -1> = rPos
end
Next RDS
end
LoadedData = '' LoadedData = ''
For each RDSNo in LoadedRDS using @VM setting vPos For each RDSNo in LoadedRDS using @VM setting vPos
@ -507,5 +500,3 @@ REACT_MODE:
END END
RETURN RETURN

View File

@ -573,15 +573,16 @@ return
WRITE_RECORD: WRITE_RECORD:
WONo = Field(Name, '*', 1) WONo = Field(Name, '*', 1)
CassNo = Field(Name, '*', 2) CassNo = Field(Name, '*', 2)
WOMatKeyID = Name WOMatKeyID = Name
If {REACTOR_TYPE} NE 'EPP' then If {REACTOR_TYPE} NE 'EPP' then
If {MAKEUP_BOX} then If {MAKEUP_BOX} then
CurrWaferCount = obj_WO_Mat('CurrWaferCnt', WOMatKeyID) CurrWaferCount = obj_WO_Mat('CurrWaferCnt', WOMatKeyID)
If CurrWaferCount GT 0 then CurrStatus = {CURR_STATUS}
If ( (CurrWaferCount GT 0) and (CurrStatus NE 'VOID') ) then
// Populate MAKEUP_WAFERS table // Populate MAKEUP_WAFERS table
// Add/update cassette data to the MAKEUP_WAFERS table // Add/update cassette data to the MAKEUP_WAFERS table
If RowExists('MAKEUP_WAFERS', WOMatKeyID) then If RowExists('MAKEUP_WAFERS', WOMatKeyID) then
@ -600,7 +601,7 @@ WRITE_RECORD:
MUWfrRec<MAKEUP_WAFERS.PROD_VER_NO$> = {PROD_VER_NO} MUWfrRec<MAKEUP_WAFERS.PROD_VER_NO$> = {PROD_VER_NO}
MUWfrRec<MAKEUP_WAFERS.CUST_PART_NO$> = {CUST_PART_NO} MUWfrRec<MAKEUP_WAFERS.CUST_PART_NO$> = {CUST_PART_NO}
MUWfrRec<MAKEUP_WAFERS.REACT_TYPE$> = {REACTOR_TYPE} MUWfrRec<MAKEUP_WAFERS.REACT_TYPE$> = {REACTOR_TYPE}
MUWfrRec<MAKEUP_WAFERS.CURR_STATUS_STATIC$> = {CURR_STATUS} MUWfrRec<MAKEUP_WAFERS.CURR_STATUS_STATIC$> = CurrStatus
MUWfrRec<MAKEUP_WAFERS.WFR_QTY$> = CurrWaferCount MUWfrRec<MAKEUP_WAFERS.WFR_QTY$> = CurrWaferCount
DateOut = Xlate('RDS', {RDS_NO}, 'DATE_OUT', 'X') DateOut = Xlate('RDS', {RDS_NO}, 'DATE_OUT', 'X')
TimeOut = Xlate('RDS', {RDS_NO}, 'TIME_OUT', 'X') / 86400 TimeOut = Xlate('RDS', {RDS_NO}, 'TIME_OUT', 'X') / 86400

View File

@ -179,3 +179,4 @@ Equ PROD_SPEC_ANKO_MET_POCKETS$ To 166
Equ PROD_SPEC_ANKO_FULL_CHAR_POCKET$ To 167 Equ PROD_SPEC_ANKO_FULL_CHAR_POCKET$ To 167
Equ PROD_SPEC_ANKO_WAFER_SELECTION$ To 168 Equ PROD_SPEC_ANKO_WAFER_SELECTION$ To 168
Equ PROD_SPEC_LOCKED_BY$ To 169 Equ PROD_SPEC_LOCKED_BY$ To 169
Equ PROD_SPEC_SHOW_SPEC_INST_ON_MU_ADD$ To 170

View File

@ -83,4 +83,5 @@ Equ REACTOR_HGCV_CHECKLIST_ACTIVE$ To 71
Equ REACTOR_INTRUSIVE_MAINT_CHECKLIST_ACTIVE$ To 72 Equ REACTOR_INTRUSIVE_MAINT_CHECKLIST_ACTIVE$ To 72
Equ REACTOR_ABORT_ALARM_CHECKLIST_ACTIVE$ To 73 Equ REACTOR_ABORT_ALARM_CHECKLIST_ACTIVE$ To 73
Equ REACTOR_ABORT_ALARM_COMPLETE$ To 74 Equ REACTOR_ABORT_ALARM_COMPLETE$ To 74
Equ REACTOR_EXHAUST_CHAMBER_THK$ To 75

View File

@ -6,25 +6,27 @@ compile insert REACT_ITEM_EQUATES
----------------------------------------*/ ----------------------------------------*/
Equ REACT_ITEM_RI_NO$ To 0 Equ REACT_ITEM_RI_NO$ To 0
Equ REACT_ITEM_DESC$ To 1 Equ REACT_ITEM_DESC$ To 1
Equ REACT_ITEM_ENTER_BY$ To 2 Equ REACT_ITEM_ENTER_BY$ To 2
Equ REACT_ITEM_ENTER_DTM$ To 3 Equ REACT_ITEM_ENTER_DTM$ To 3
Equ REACT_ITEM_RETIRE_BY$ To 4 Equ REACT_ITEM_RETIRE_BY$ To 4
Equ REACT_ITEM_RETIRE_DT$ To 5 Equ REACT_ITEM_RETIRE_DT$ To 5
Equ REACT_ITEM_PART_TYPE$ To 6 Equ REACT_ITEM_PART_TYPE$ To 6
Equ REACT_ITEM_MFR_CD$ To 7 Equ REACT_ITEM_MFR_CD$ To 7
Equ REACT_ITEM_MFR_PART_NO$ To 8 Equ REACT_ITEM_MFR_PART_NO$ To 8
Equ REACT_ITEM_MFR_PART_NO_REV$ To 9 Equ REACT_ITEM_MFR_PART_NO_REV$ To 9
Equ REACT_ITEM_SERIAL_NO$ To 10 Equ REACT_ITEM_SERIAL_NO$ To 10
Equ REACT_ITEM_RI_TYPE$ To 11 Equ REACT_ITEM_RI_TYPE$ To 11
Equ REACT_ITEM_SUSC_SIZE$ To 12 Equ REACT_ITEM_SUSC_SIZE$ To 12
Equ REACT_ITEM_PKT_QTY$ To 13 Equ REACT_ITEM_PKT_QTY$ To 13
Equ REACT_ITEM_PKT_SIZE$ To 14 Equ REACT_ITEM_PKT_SIZE$ To 14
Equ REACT_ITEM_NOTES$ To 15 Equ REACT_ITEM_NOTES$ To 15
Equ REACT_ITEM_PPLUS_RDS_NO$ To 16 Equ REACT_ITEM_PPLUS_RDS_NO$ To 16
Equ REACT_ITEM_SERIAL$ To 17 Equ REACT_ITEM_SERIAL$ To 17
Equ REACT_ITEM_TUBE_GRADE$ To 18 Equ REACT_ITEM_TUBE_GRADE$ To 18
Equ REACT_ITEM_TUBE_PRESS$ To 19 Equ REACT_ITEM_TUBE_PRESS$ To 19
Equ REACT_ITEM_TUBE_STYLE$ To 20 Equ REACT_ITEM_TUBE_STYLE$ To 20
Equ REACT_ITEM_NEW_OR_REFURB$ To 21 Equ REACT_ITEM_NEW_OR_REFURB$ To 21
Equ REACT_ITEM_CURR_STATUS_STATIC$ To 22

View File

@ -40,6 +40,9 @@ compile insert SCANS_EQUATES
equ SCANS.TW_LOT_QTY$ to 31 equ SCANS.TW_LOT_QTY$ to 31
equ SCANS.TEST_RUN_TYPE_ID$ to 32 equ SCANS.TEST_RUN_TYPE_ID$ to 32
equ SCANS.TEST_RUN_TYPE_NAME$ to 33 equ SCANS.TEST_RUN_TYPE_NAME$ to 33
equ SCANS.IS_AUTHORIZED_TO_OVERRIDE_ROTR$ to 34
#endif #endif

View File

@ -156,4 +156,5 @@ Equ WO_MAT_LAST_CASSETTE_TEST_WAFER_ACK_REQ$ To 147
Equ WO_MAT_LAST_CASSETTE_TEST_WAFER_ACKED$ To 148 Equ WO_MAT_LAST_CASSETTE_TEST_WAFER_ACKED$ To 148
Equ WO_MAT_HOLD_STAGE$ To 149 Equ WO_MAT_HOLD_STAGE$ To 149
Equ WO_MAT_HOLD_INTERRUPTED$ To 150 Equ WO_MAT_HOLD_INTERRUPTED$ To 150
Equ WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$ To 151