Compare commits

111 Commits

Author SHA1 Message Date
f4f63c28e3 Added JSON body and response logging to CreateNewOrder service. Modified how reactor log comments are added for ABORT_ALARM NICA orders. Modified ABORT_ALARM solution to not trigger on WAITING_FOR_MAINTENANCE_UNSCHEDULED 2025-08-12 16:24:12 -07:00
1f2b73797b Enable BioRad pdsf usage 2025-08-12 07:52:13 -07:00
54eaf15598 Increased the MAX_NUM_CASS$ equate to 150 as we have a workorder with more than 96 WO_MAT ID's 2025-08-08 11:44:44 -07:00
fffadaa1c3 Found that the location of the cassettes being added were first being sorted in an ascending order within a LOCATE loop. 2025-08-07 14:55:21 -07:00
a6da80dc3c Revert "Created temporary workarounds to QA Metrology not getting set correctly." 2025-08-07 18:07:28 +00:00
3125225639 Created temporary workarounds to QA Metrology not getting set correctly. 2025-08-06 16:20:43 -07:00
f54331eb0e Fixed HgCV frequency bug 2025-08-05 12:46:25 -07:00
847483f603 Added new Stratus Qual Data Import method to stop using BioRad Qual Data Import for Stratus runs 2025-08-05 16:02:39 +00:00
88281fff05 Added a query param in GetWOMatKeys service to only get WOMat Keys that are not VOID 2025-08-04 17:16:16 -07:00
8499d03ef8 modified update work order services to throttle better 2025-08-01 08:26:27 -07:00
3186ec1ad6 Bug fix to ensure correct WM_OUT key is identified and created. Added services to ensure WM_IN and WM_OUT indexes are maintained. 2025-07-31 17:18:09 -07:00
898f21b73d Refactored error checking to utilize ErrorMsg variable so that errors make their way back to the calling routine. 2025-07-30 17:07:01 +00:00
f7ee12a78d Fixed a bug where the ProcessProcedureQueue service would write an invalid record to the PROC_QUEUE2 table when failing to read a record. 2025-07-30 09:48:56 -07:00
475df5ba54 Minor bug fix in UpdateWorkOrderData. Modified ProcessRequest service to dump record for troubleshooting purposes. 2025-07-30 09:24:02 -07:00
28a8a10ba2 Not sure how this bug was re-introduced. 99% sure we pushed this to prod. 2025-07-29 16:16:32 -07:00
6934799e92 Added troubleshooting logs to find cause of LBLCHK transactions going missing 2025-07-29 21:11:25 +00:00
03f42dedea updated UpdateWorkOrderData service to correct WO_MAT records containing multiple RDS keys 2025-07-29 13:34:57 -07:00
033e3baee8 added condition to search RDS table for matching WO_MAT record to correct index 2025-07-29 12:52:06 -07:00
4bfae8e7b7 minor fix to prevent an error message from being displayed on brand new work orders 2025-07-29 12:03:55 -07:00
0f0c735023 added SYSOBJ check to the PostProcedure service to prevent invalid procedures from getting posted to the procedure queue 2025-07-29 11:56:42 -07:00
4eee1b0f0a modified check to look at WO_MAT record instead of WO_STEP to see if RDS already exists for a given cassette 2025-07-29 18:22:52 +00:00
e2e8731316 Removed uneccessary transaction postings 2025-07-29 10:52:39 -07:00
a21f41fd29 modified service to dispatch a single job at a time to avoid clogging up the SRP Engine Server 2025-07-29 09:33:11 -07:00
2bbc5c065d updated service to remove keys if lot is voided 2025-07-28 15:08:11 -07:00
9e54865e1e moved procedure call from WO_MAT_ACTIONS to a standalone service to avoid posting too many transactions 2025-07-28 14:34:20 -07:00
c7f1f86249 SP1 Misfit bug fix 2025-07-28 16:06:35 +00:00
c89bb6b3d4 added services and triggers to manually add index transactions to keep indexes up-to-date 2025-07-28 15:57:33 +00:00
71daf317f0 Added filtering criteria to only return available met tests relevant to the current operation 2025-07-25 18:16:00 +00:00
a48f47ddc9 modified WO_REC form to select WO_MAT keys instead of relying on WO_LOG<WO_MAT_KEY> field.
refactored print cass labels to select on RDS table for list of RDSes instead of using relational column in WO_STEP table
2025-07-24 17:13:52 -07:00
6396264e64 added combobox dropdown options to the CALIB_LIST form 2025-07-24 09:05:19 -07:00
8f233705a2 added call to clean array to prevent null values from truncating the list 2025-07-23 15:54:30 -07:00
b159e1aa27 fixed bug preventing rec rel jobs from posting if vendor code doesn't match expected vendor code 2025-07-23 09:44:12 -07:00
de2e6af5f7 Merged PR 21598: Refactored receive and release codebase.
Refactored receive and release codebase.

bug fixes and performance improvements

modified WO_REC form to use the same receive and same release dtm for all cassettes released in a given batch

Related work items: #259878
2025-07-23 15:40:25 +00:00
84da66ccd5 Enable SP1 pdsf usage 2025-07-22 08:48:23 -07:00
49e77a769f Release JSON handles in SCAN_SERVICES 2025-07-22 15:11:29 +00:00
490bfe21d4 Modified ship label printing routine to use the epi part number instead of the customer part number. Modified UpdateFailedWafers service to use the transaction queue to avoid clobbering WO_MAT records. 2025-07-22 00:33:29 +02:00
2aaed8944e Merge branch 'master' of https://tfs.intra.infineon.com/tfs/FactoryIntegration/_git/OpenInsight 2025-07-22 00:33:29 +02:00
ef104f889c Added in a check for the active flag when adding an operation to a lot. Added in material handler group to the CanUserModifyLot check 2025-07-22 00:33:29 +02:00
ea156489f1 Merged PR 21245: Added in a check for the active flag when adding an operation to a lot. Added...
Added in a check for the active flag when adding an operation to a lot. Added in material handler group to the CanUserModifyLot check.

Given the addition of a check for the active flag to allow adding an operation. I checked all OPERATION records to ensure that flag has already been set. The only operations that had a value other than true were the OPERATION records related to Return To Fab Lot processing.

Tested and verified creating test wafer lots, and creating RTF forms.
2025-07-22 00:31:04 +02:00
e1a44a7687 changed delimiter used for the background process queue so that all native delimiters are protected 2025-07-18 12:08:09 -07:00
c890a25d46 removed hgcv pattern from control plan 2025-07-17 13:30:23 -07:00
836b8c47a9 Merged PR 21153: Updated listing of FI Label Printer IP Address
Updated listing of FI Label Printer IP Address
2025-07-16 23:23:10 +02:00
aabd4c3a91 Merged PR 21151: Return To Fab Operations and Processing 2025-07-16 21:17:07 +02:00
b607432be4 Merged PR 21055: Added two new tools at request of engineering. TBI #1 and SCOPE #6
Added two new tools at request of engineering. TBI #1 and SCOPE #6
2025-07-16 17:36:41 +02:00
3debdce91e Revert "RDS JSON caching to minimize processing"
This reverts commit 4689b861d7.
2025-07-15 20:52:07 -07:00
4689b861d7 RDS JSON caching to minimize processing 2025-07-15 13:09:37 -07:00
350116fddc Modified WO_MAT_ACTIONS to not block write operations if critical fields are cleared. Instead it will restore the critical values and allow the write operation to continue. 2025-07-15 12:51:20 -07:00
59aed72156 modified changed OEngine memory logging to post to MonA instead 2025-07-15 09:41:48 -07:00
e97162dc1e fixed routines posting procedures with value marks instead of the new service delimiter 2025-07-14 15:13:45 -07:00
2a6c0afddf refactored codebase to not rely on WO_LOG calculated column indexes 2025-07-14 11:59:30 -07:00
b53e805929 Merged PR 20879: Initial commit.
Initial commit.
2025-07-14 20:55:07 +02:00
804b590773 added check to verify PROC_NAME exists before invoking 2025-07-14 18:50:09 +02:00
cd64511871 Scanner employee caching 2025-07-14 09:28:11 -07:00
2226f3112b added input checking to prevent runtime errors on bad input 2025-07-14 09:17:28 -07:00
184d2c2cba cache the TW type list 2025-07-14 17:55:12 +02:00
5830705c7d removing HF-Strip step from Oxide Epi Parts per Mark Cousten 2025-07-11 16:02:07 -07:00
1d32ec4fbb minor bug fix to release lock if record not updated 2025-07-11 10:44:14 -07:00
eb85afaf35 Updated WO_LOG_ACTIONS to also set the legacy status field in the WO_LOG table. Updated GetIQSViolationData to only update the Reactor record if something has changed. 2025-07-11 08:08:31 -07:00
269e5f9bd4 cache TW Lot JSON unless changed 2025-07-10 10:26:10 -07:00
d4ce96337b fixed bug in GetAvailableMakeupWafers which was using the CustPartNo instead of the EpiPartNo to find available makeup wafers 2025-07-10 09:16:00 -07:00
af6cd757de Remove TW_All_Signed CC dependency 2025-07-09 09:36:17 -07:00
ce252bf885 added additional checks in WO_LOG WRITE_PRE action to only set the closes date and closed status if the work order is not already closed 2025-07-08 11:08:54 -07:00
28d5b81b30 added triggers to calculate and store the scrapped quantity of a work order and auto close the work order when the scrap quantity and ship quantity equal the total work order quantity
added performance improvements to reduce unnecessary writes to the WO_LOG table
2025-07-08 10:31:25 -07:00
563871008e Move WO_MAT_LOG creation to background 2025-07-08 19:10:10 +02:00
272b2ce7d8 updated copy and delete record from sql routines to allow for a null pkey 2025-07-07 16:13:27 -07:00
14c77d9edf Merged PR 20357: Fixed typo in log object reference.
Fixed typo in log object reference.
2025-07-08 00:38:42 +02:00
d15cd38daf added UpdateOpenWorkOrderStatuses and UpdateWorkOrderStatus services 2025-07-07 15:10:47 -07:00
e3dbea2b7a fixed service manager group name 2025-07-07 11:48:36 -07:00
01fa3f8202 fixed logic determining which wafers can be NCRed 2025-07-04 01:58:45 +02:00
98ac420462 Modified copy and delete record to sql routines to lock the queue record before attempting to prevent long running copy or delete calls form being processed more than once and wasting resources. 2025-07-03 14:06:04 -07:00
5ca3778719 VNAV bug fix 2025-07-02 09:54:16 -07:00
5d27afcd68 minor bug fix 2025-07-01 14:41:29 -07:00
c786fce37b Deprecating old services. Refactored codebase to not use SwapResources GoSub. 2025-07-01 14:14:04 -07:00
b796060529 Updated CreateLotEvent to use Transaction Queue instead of Proc Queue to avoid locking errors. 2025-07-01 10:41:54 -07:00
ff0036d4c2 Fixed some error throwing in LOT_SERVICES 2025-07-01 09:31:50 -07:00
fd55fe06a9 Removing JSON not used by scanner app 2025-07-01 18:10:56 +02:00
653ba1619f Added square brackets around OPEN column in LOT table to prevent SQL insert/update errors. Updated PROC_QUEUE monitor to monitor the PROC_QUEUE2 table. 2025-07-01 08:54:24 -07:00
8f25d78fe6 Final fixes. 2025-06-30 23:23:55 +02:00
521c35af8f Fix column display issue on ENG_OPTIONS popup. 2025-06-30 23:23:55 +02:00
d021ab64b9 Commit to switch branches. 2025-06-30 23:23:55 +02:00
df5b217fe7 Merged PR 19805: Modified form and removed form items for the MU Inventory Report(Replaced by...
Modified form and removed form items for the MU Inventory Report(Replaced by Reporting Services) and thruput report also replaced my Reporting services
2025-06-30 22:46:32 +02:00
8415e99055 Switching to fast stringify 2025-06-30 11:39:40 -07:00
da208b2908 Remove duplicate calc column read 2025-06-30 18:33:40 +02:00
7b7f501145 added service to get nicaBaseInstructionId from NicaIntegrationService based on name of instruction/document
added UpdateNicaChecklistBaseInstructionIds call to GetOrderUpdates service
2025-06-30 18:04:37 +02:00
03e85359d1 ready for unit testing 2025-06-30 18:02:16 +02:00
401c03d752 Merged PR 19733: Bug Fix #2. TW Lot Qty Adjust
Fixed improper usage of CreateTestRunRecord.
Removed unnecessary development gates and unnecessary code usages.
2025-06-27 22:15:12 +02:00
a878c9bb2e Merged PR 19663: Modified the decrease lot qty functionality to reduce qty via test wafer usag...
Modified the decrease lot qty functionality to reduce qty via test wafer usage rather than directly reducing the qty.,
2025-06-27 21:39:06 +02:00
60b5386f27 modified logging dtm to include seconds 2025-06-26 16:24:10 -07:00
46f070e9cc Updated some logging to OConv the datetime. 2025-06-26 16:17:00 -07:00
2180ba3fb4 refactored Mona_Services to queue requests and send them in bulk via the Service Manager
Added queue count to mona monitors. Added email notification on ProcessMonaQueue.

Added hard limit of 2000 requests to be sent to MonInBufferedWorker at one time. Fixed outdated Shipment_Services in SharedTest environment.
2025-06-26 15:20:01 -07:00
c6910c14c2 modified ProcessProcedureQueue to mark requests as queued and only re-queue them if they have been queued for over ten minutes 2025-06-25 15:35:54 -07:00
38e7b6e276 Switched to RList from Select...By to prevent read issues. 2025-06-25 09:34:01 -07:00
e523f2085d moved log variables to prevent VNAVS when failing to read transaction record 2025-06-24 19:41:20 -07:00
7b386fe856 modified CLEAN_INSP_ACTIONS WRITE action to post to transaction queue and proc queue 2025-06-25 00:10:11 +02:00
bcdfbe0534 created transaction queue to process database writes and deletes in first in first out order 2025-06-24 13:25:47 -07:00
52499b7616 Merged PR 19430: Fix references to old supplement system. 2025-06-24 21:20:40 +02:00
1db89a3d3f fixing typo 2025-06-24 09:53:29 -07:00
de67e45c9a updated WRITE_PRE action to not use GetStackTrace and to notify FI of field name being cleared 2025-06-24 09:32:00 -07:00
3becd9cf4d updated WO_MAT_ACTIONS to block write operations if certain fields are cleared 2025-06-24 00:43:16 +02:00
d570e3cfef Merged PR 19340: Test wafer quantity 2025-06-23 20:22:02 +02:00
49f6cf505a Adding addtional smart scanner metrics 2025-06-23 18:21:12 +02:00
17e320923f Merged PR 19265: Moved call to MonA Metric setting above the local service error setting as th...
Moved call to MonA Metric setting above the local service error setting as the call to that MonA service was clearing out errors and preventing them from making their way back to the GUI.
2025-06-21 01:33:55 +02:00
c4a3edece2 fixed bug in generate material track rows that would clear user comments and kit demand values 2025-06-18 14:46:22 -07:00
273b7f67a6 Merged PR 19143: Require 100 percent centerpoint on MU conversion.
Initial commit.

Create FQASignatureReady service in QA_SERVICES.

Create SignFQA service in SIGNATURE_SERVICES.

Commit remaining portion of project.

Implement changes requested in review meeting.

Fix typo. Add new MU logic to final entry point.

Restrict logic to only apply to 'THICK'
inspections.

Bypass new logic if Biorad 4 and 5 are down.
2025-06-18 22:23:57 +02:00
5cb17c6d52 removing old notification code 2025-06-18 22:02:42 +02:00
0c7a1d55e2 fixed email notifications on failed calls to obj_WM_IN('Create') and obj_WM_OUT('Create') 2025-06-18 11:52:52 -07:00
b2c9e500f8 Modified WM_IN ZPL label generation to include a 2D datamatrix
barcode. Implemented 2D barcode verification in PTI and FQA Label Check
Operations.

Bug fixes

Changed WMI 2D barcode to have 8 fields to keep code base simpler

minor changes to error message verbiage

Refactored code to use post log. Refactored code to not use multiple returns. Modfield input form fields to force upper case only.

changed LSL password verification to be case insensitive to avoid barcode scanning issues when caps lock is on

temporary change to allow 1D WMI scans at PTI while we exhaust current supply
2025-06-18 19:09:34 +02:00
2f6b376ece Added removal of WO_STEP_KEY from RDS void routine 2025-06-18 09:32:19 -07:00
357b7ede64 added PROC_QUEUE metric to MONA_MONITORS 2025-06-17 11:20:38 -07:00
60493b3413 Refactored process proc queue service to handle more throughput. Fixed Metrology_Services import CDE qual service. 2025-06-17 09:35:34 -07:00
76327e9dbc Merged PR 18923: Added new vendor to REACT_VENDOR popup
Added new vendor to REACT_VENDOR popup
2025-06-16 23:10:40 +02:00
196 changed files with 105493 additions and 77997 deletions

1
.gitignore vendored
View File

@ -1,3 +1,4 @@
LSL2/STPROC/TEST_DANIEL*.txt
LSL2/STPROC/TEST_DAKOTA.txt
LSL2/STPROC/JONATHAN_SERVICES.txt
LSL2/STPROC/CHASE_SERVICES.txt

View File

@ -21,75 +21,77 @@
"<1,12>": "SCOPE #3",
"<1,13>": "SCOPE #4",
"<1,14>": "SCOPE #5",
"<1,15>": "SP1 1",
"<1,16>": "TENCOR1",
"<1,17>": "TENCOR2",
"<1,18>": "TENCOR3",
"<1,19>": "BIORAD2",
"<1,20>": "BIORAD3",
"<1,21>": "BIORAD4",
"<1,22>": "BIORAD5",
"<1,23>": "CDE4",
"<1,24>": "CDE5",
"<1,25>": "CDE6",
"<1,26>": "HGCV1",
"<1,27>": "HGCV2",
"<1,28>": "HGCV3",
"<1,29>": "SPV",
"<1,30>": "SRP",
"<1,31>": "BELLJAR",
"<1,32>": "6INLESS",
"<1,33>": "6INLESS2",
"<1,34>": "6MACTRONIX #1",
"<1,35>": "6MACTRONIX #2",
"<1,36>": "6MACTRONIX #3",
"<1,37>": "6MACTRONIX #4",
"<1,38>": "8INLESS",
"<1,39>": "8INLESS2",
"<1,40>": "BAGGER1",
"<1,41>": "BAGGER2",
"<1,42>": "BAGGER3",
"<1,43>": "BAGGER4",
"<1,44>": "6INFF01",
"<1,45>": "6INFF02",
"<1,46>": "6INFF03",
"<1,47>": "6INFF04",
"<1,48>": "6INFF05",
"<1,49>": "6INFF06",
"<1,50>": "6INFF07",
"<1,51>": "6INFF08",
"<1,52>": "6INFF09",
"<1,53>": "6INFF10",
"<1,54>": "8INNF01",
"<1,55>": "8INNF02",
"<1,56>": "8INNF03",
"<1,57>": "8INNF04",
"<1,58>": "8INNF05",
"<1,59>": "8INFF01",
"<1,60>": "8INFF02",
"<1,61>": "8INFF03",
"<1,62>": "8INFF04",
"<1,63>": "MACTRONIX #1",
"<1,64>": "MACTRONIX #2 ",
"<1,65>": "MACTRONIX #3",
"<1,66>": "MACTRONIX #4",
"<1,67>": "MACTRONIX #5",
"<1,68>": "MACTRONIX #6",
"<1,69>": "MACTRONIX #7",
"<1,70>": "TALL_PITCH1",
"<1,71>": "TALL_PITCH2",
"<1,72>": "TALL_PITCH3",
"<1,73>": "TALL_PITCH4",
"<1,74>": "WC6INCH1",
"<1,75>": "WC6INCH2",
"<1,76>": "WC6INCH3",
"<1,77>": "WC6INCH4",
"<1,78>": "WC8INCH1",
"<1,79>": "WC8INCH2",
"<1,80>": "WC8INCH3",
"<1,81>": "ELLP01",
"<1,82>": "LEAKCHK01",
"<1,83>": "LEAKCHK02"
"<1,15>": "SCOPE #6",
"<1,16>": "SP1 1",
"<1,17>": "TENCOR1",
"<1,18>": "TENCOR2",
"<1,19>": "TENCOR3",
"<1,20>": "BIORAD2",
"<1,21>": "BIORAD3",
"<1,22>": "BIORAD4",
"<1,23>": "BIORAD5",
"<1,24>": "CDE4",
"<1,25>": "CDE5",
"<1,26>": "CDE6",
"<1,27>": "HGCV1",
"<1,28>": "HGCV2",
"<1,29>": "HGCV3",
"<1,30>": "SPV",
"<1,31>": "SRP",
"<1,32>": "BELLJAR",
"<1,33>": "6INLESS",
"<1,34>": "6INLESS2",
"<1,35>": "6MACTRONIX #1",
"<1,36>": "6MACTRONIX #2",
"<1,37>": "6MACTRONIX #3",
"<1,38>": "6MACTRONIX #4",
"<1,39>": "8INLESS",
"<1,40>": "8INLESS2",
"<1,41>": "BAGGER1",
"<1,42>": "BAGGER2",
"<1,43>": "BAGGER3",
"<1,44>": "BAGGER4",
"<1,45>": "6INFF01",
"<1,46>": "6INFF02",
"<1,47>": "6INFF03",
"<1,48>": "6INFF04",
"<1,49>": "6INFF05",
"<1,50>": "6INFF06",
"<1,51>": "6INFF07",
"<1,52>": "6INFF08",
"<1,53>": "6INFF09",
"<1,54>": "6INFF10",
"<1,55>": "8INNF01",
"<1,56>": "8INNF02",
"<1,57>": "8INNF03",
"<1,58>": "8INNF04",
"<1,59>": "8INNF05",
"<1,60>": "8INFF01",
"<1,61>": "8INFF02",
"<1,62>": "8INFF03",
"<1,63>": "8INFF04",
"<1,64>": "MACTRONIX #1",
"<1,65>": "MACTRONIX #2 ",
"<1,66>": "MACTRONIX #3",
"<1,67>": "MACTRONIX #4",
"<1,68>": "MACTRONIX #5",
"<1,69>": "MACTRONIX #6",
"<1,70>": "MACTRONIX #7",
"<1,71>": "TALL_PITCH1",
"<1,72>": "TALL_PITCH2",
"<1,73>": "TALL_PITCH3",
"<1,74>": "TALL_PITCH4",
"<1,75>": "WC6INCH1",
"<1,76>": "WC6INCH2",
"<1,77>": "WC6INCH3",
"<1,78>": "WC6INCH4",
"<1,79>": "WC8INCH1",
"<1,80>": "WC8INCH2",
"<1,81>": "WC8INCH3",
"<1,82>": "ELLP01",
"<1,83>": "LEAKCHK01",
"<1,84>": "LEAKCHK02",
"<1,85>": "TBI #1"
}
}
}

View File

@ -1,11 +0,0 @@
{
"header": {
"version": 1,
"type": "record"
},
"body": {
"record1": {
"<1>": "declare function set_printer, Get_Property\r\ndeclare subroutine record_lock, Set_Property\r\n$insert msg_equates\r\n$insert lsl_users_equ\r\n\r\n*Void = Set_Property('SYSTSEM','IDLEPROC','')\r\nVoid = Set_Property(@WINDOW,'TIMER','')\r\n\r\n\r\nUNLOCK All\r\n/*\r\nDEAD - 1/27/2005 JCH\r\n* will write out the x and y coords for the user, so the menu comes up at the last used\r\n* location\r\nWinSize = get_property( @window, 'SIZE' )\r\nX = WinSize<1>\r\nY = WinSize<2>\r\nXsize = WinSize<3>\r\nYsize = WinSize<4>\r\n\r\nIF @USERNAME = 'BRYCE_BARB' THEN DEBUG\r\n\r\nopen 'LSL_USERS' to LSLUsersTableVar else\r\n MsgInfo = ''\r\n MsgInfo<mtext$> = 'Unable to open LSL_USERS...'\r\n MsgInfo<mcol$> = -2\r\n MsgInfo<mrow$> = -2\r\n Void = msg( '', MsgInfo )\r\nend\r\n\r\nread UserRec from LSLUsersTableVar, @user4 then\r\n\t \r\n\t*UserRec = xlate( 'LSL_USERS', @user4, '', 'X' )\r\n\tUserRec<lsl_users_menu_xpos$> = X\r\n\tUserRec<lsl_users_menu_ypos$> = Y\r\n\tUserRec<lsl_users_menu_xsize$> = Xsize\r\n\tUserRec<lsl_users_menu_ysize$> = Ysize\r\n\twrite UserRec on LSLUsersTableVar, @user4 else Null\r\n\r\nEND;* End of User Rec Read\r\n*/\r\n\r\nRETURN 1\r\n"
}
}
}

File diff suppressed because one or more lines are too long

View File

@ -1,11 +0,0 @@
{
"header": {
"version": 1,
"type": "record"
},
"body": {
"record1": {
"<1>": "DECLARE FUNCTION Start_Window\r\n\r\nvoid = Start_Window('REACT_STATUS_EVEN',@WINDOW,'')\r\nvoid = Start_Window('REACT_STATUS_ODD',@WINDOW,'')\r\n\r\nvoid = Start_Window('TOOL_STATUS',@WINDOW,'')\r\n\r\n\r\nRETURN 1"
}
}
}

View File

@ -1,11 +0,0 @@
{
"header": {
"version": 1,
"type": "record"
},
"body": {
"record1": {
"<1>": "DECLARE subroutine Print_Barcode_Label, ErrMsg\r\nDECLARE function Popup\r\n\r\nUserIDs = Popup(@WINDOW,TypeOver,'USER_ID')\t;* Popup uses active select list created with MAKE.LIST\r\n\r\nIF UserIDs = '' THEN\r\n\tErrMsg('No users selected...')\r\n\tRETURN\r\nEND\r\n\r\nUserCnt = COUNT(UserIDs,@VM) + (UserIDs NE '')\r\n\r\n\r\nIDList = ''\r\nFOR I = 1 TO UserCnt\r\n\tUserID = UserIDs<1,I>\r\nNEXT I\r\n\r\nPrint_Barcode_Label ('EmployeeBadge', UserIDs)\r\n\r\nRETURN 0"
}
}
}

View File

@ -1,11 +0,0 @@
{
"header": {
"version": 1,
"type": "record"
},
"body": {
"record1": {
"<1>": "DECLARE subroutine Print_Barcode_Label, ErrMsg\r\nDECLARE function Popup\r\n\r\nUserIDs = Popup(@WINDOW,TypeOver,'USER_ID')\t;* Popup uses active select list created with MAKE.LIST\r\n\r\nIF UserIDs = '' THEN\r\n\tErrMsg('No users selected...')\r\n\tRETURN\r\nEND\r\n\r\nUserCnt = COUNT(UserIDs,@VM) + (UserIDs NE '')\r\n\r\n\r\nIDList = ''\r\nFOR I = 1 TO UserCnt\r\n\tUserID = UserIDs<1,I>\r\nNEXT I\r\n\r\nPrint_Barcode_Label ('EmployeeBadge', UserIDs)\r\n\r\nRETURN 0"
}
}
}

View File

@ -1,11 +0,0 @@
{
"header": {
"version": 1,
"type": "record"
},
"body": {
"record1": {
"<1>": "DECLARE subroutine Print_Barcode_Label, ErrMsg\r\nDECLARE function Popup\r\n\r\nUserIDs = Popup(@WINDOW,TypeOver,'USER_ID')\t;* Popup uses active select list created with MAKE.LIST\r\n\r\nIF UserIDs = '' THEN\r\n\tErrMsg('No users selected...')\r\n\tRETURN\r\nEND\r\n\r\nUserCnt = COUNT(UserIDs,@VM) + (UserIDs NE '')\r\n\r\n\r\nIDList = ''\r\nFOR I = 1 TO UserCnt\r\n\tUserID = UserIDs<1,I>\r\nNEXT I\r\n\r\nPrint_Barcode_Label ('EmployeeBadge', UserIDs)\r\n\r\nRETURN 0"
}
}
}

View File

@ -1,11 +0,0 @@
{
"header": {
"version": 1,
"type": "record"
},
"body": {
"record1": {
"<1>": "DECLARE subroutine Print_Barcode_Label, ErrMsg\r\nDECLARE function Popup\r\n\r\nUserIDs = Popup(@WINDOW,TypeOver,'USER_ID')\t;* Popup uses active select list created with MAKE.LIST\r\n\r\nIF UserIDs = '' THEN\r\n\tErrMsg('No users selected...')\r\n\tRETURN\r\nEND\r\n\r\nUserCnt = COUNT(UserIDs,@VM) + (UserIDs NE '')\r\n\r\n\r\nIDList = ''\r\nFOR I = 1 TO UserCnt\r\n\tUserID = UserIDs<1,I>\r\nNEXT I\r\n\r\nPrint_Barcode_Label ('EmployeeBadge', UserIDs)\r\n\r\nRETURN 0"
}
}
}

View File

@ -1,11 +0,0 @@
{
"header": {
"version": 1,
"type": "record"
},
"body": {
"record1": {
"<1>": "declare subroutine forward_event\r\n\r\nforward_event( x, y, Width, Height )\r\n*.group_1->size = -10:@fm:-10:@fm:Width:@fm:Height\r\nRETURN 0"
}
}
}

View File

@ -1,11 +0,0 @@
{
"header": {
"version": 1,
"type": "record"
},
"body": {
"record1": {
"<1>": "\r\nDeclare subroutine Post_Event, Set_Property\r\n\r\n*If @User4 EQ 'ERIK_L' then Set_Property(@Window, '@CLOSE', 1)\r\n\r\nClose = Get_Property(@Window, '@CLOSE')\r\n\r\nCurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS')\r\n\r\nOPEN 'SYSLISTS' TO ListsFile THEN\r\n\tStation = @STATION\r\n\tStation = Station[1,'_']\t\t\r\n\tListKey = Station:'*KEEP_ALIVE'\r\n\tListRec = @USERNAME:@FM:CurrDTM\r\n\tWRITE ListRec ON ListsFile,ListKey ELSE NULL\r\nEND \r\n\r\n\r\nRETURN 1"
}
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,402 +0,0 @@
{
"header": {
"version": 1,
"type": "record"
},
"body": {
"record1": {
"<1>": "1010",
"<2>": "1",
"<3>": ""
},
"record2": {
"<1>": {
"<1,1>": "LSL_MAIN",
"<1,2>": "",
"<1,3>": "WINDOW",
"<1,4>": "",
"<1,5>": "147",
"<1,6>": "181",
"<1,7>": "-631",
"<1,8>": "-427",
"<1,9>": "Infineon Technologies",
"<1,10>": {
"<1,10,1>": "0x92C70000",
"<1,10,2>": "0x0"
},
"<1,11>": {
"<1,11,1>": "0x100",
"<1,11,2>": "0x80000000"
},
"<1,12>": "0",
"<1,13>": "-2",
"<1,14>": "0",
"<1,15>": "",
"<1,16>": "",
"<1,17>": "",
"<1,18>": "",
"<1,19>": "",
"<1,20>": "",
"<1,21>": "",
"<1,22>": "",
"<1,23>": "",
"<1,24>": {
"<1,24,1>": "0",
"<1,24,2>": "0",
"<1,24,3>": "0",
"<1,24,4>": "0",
"<1,24,5>": "0",
"<1,24,6>": "0"
},
"<1,25>": "0",
"<1,26>": "0",
"<1,27>": "",
"<1,28>": "",
"<1,29>": "",
"<1,30>": "",
"<1,31>": "",
"<1,32>": {
"<1,32,1>": "0x7FFFE",
"<1,32,2>": "0xF001E988"
},
"<1,33>": "",
"<1,34>": "LSL2*IMAGE*ICO*DATASET",
"<1,35>": "",
"<1,36>": "",
"<1,37>": {
"<1,37,1>": "0x10001",
"<1,37,2>": "0x10001"
},
"<1,38>": {
"<1,38,1>": "1",
"<1,38,2>": "1"
},
"<1,39>": "",
"<1,40>": "0",
"<1,41>": "",
"<1,42>": "",
"<1,43>": "",
"<1,44>": "",
"<1,45>": "",
"<1,46>": "",
"<1,47>": "",
"<1,48>": "",
"<1,49>": "",
"<1,50>": "",
"<1,51>": "",
"<1,52>": ""
}
},
"record3": {
"<1>": {
"<1,1>": "MDICLIENT",
"<1,2>": "RTIMDICLIENT",
"<1,3>": "MDICLIENT",
"<1,4>": "LSL_MAIN",
"<1,5>": "3",
"<1,6>": "7",
"<1,7>": "-625",
"<1,8>": "-607",
"<1,9>": "",
"<1,10>": {
"<1,10,1>": "0x56B00000",
"<1,10,2>": "0x0"
},
"<1,11>": {
"<1,11,1>": "0xC000",
"<1,11,2>": "0x80000000"
},
"<1,12>": "1",
"<1,13>": "-2",
"<1,14>": "0",
"<1,15>": "",
"<1,16>": "",
"<1,17>": "",
"<1,18>": "",
"<1,19>": "",
"<1,20>": "",
"<1,21>": "",
"<1,22>": "",
"<1,23>": "",
"<1,24>": "",
"<1,25>": "0",
"<1,26>": "0",
"<1,27>": "",
"<1,28>": "",
"<1,29>": "",
"<1,30>": "",
"<1,31>": "",
"<1,32>": {
"<1,32,1>": "0x7fffc",
"<1,32,2>": "0xf001c808"
},
"<1,33>": "",
"<1,34>": "",
"<1,35>": "",
"<1,36>": "",
"<1,37>": "",
"<1,38>": "",
"<1,39>": "",
"<1,40>": "1"
},
"<2>": ""
},
"record4": {
"<1>": {
"<1,1>": {
"<1,1,1>": "MENU",
"<1,1,2>": "4",
"<1,1,3>": "",
"<1,1,4>": "",
"<1,1,5>": "0",
"<1,1,6>": "0",
"<1,1,7>": "0",
"<1,1,8>": "0",
"<1,1,9>": "12",
"<1,1,10>": "",
"<1,1,11>": "0",
"<1,1,12>": ""
},
"<1,2>": {
"<1,2,1>": "POPUP",
"<1,2,2>": "1",
"<1,2,3>": "",
"<1,2,4>": "&File",
"<1,2,5>": "0",
"<1,2,6>": "0",
"<1,2,7>": "0",
"<1,2,8>": "0",
"<1,2,9>": "",
"<1,2,10>": "",
"<1,2,11>": "0",
"<1,2,12>": ""
},
"<1,3>": {
"<1,3,1>": "ITEM",
"<1,3,2>": "",
"<1,3,3>": "",
"<1,3,4>": "E&xit\tAlt+F4",
"<1,3,5>": "0",
"<1,3,6>": "0",
"<1,3,7>": "0",
"<1,3,8>": "1139",
"<1,3,9>": "",
"<1,3,10>": "",
"<1,3,11>": "0",
"<1,3,12>": ""
},
"<1,4>": {
"<1,4,1>": "POPUP",
"<1,4,2>": "2",
"<1,4,3>": "",
"<1,4,4>": "&DataWindows",
"<1,4,5>": "0",
"<1,4,6>": "0",
"<1,4,7>": "0",
"<1,4,8>": "0",
"<1,4,9>": "",
"<1,4,10>": "",
"<1,4,11>": "0",
"<1,4,12>": ""
},
"<1,5>": {
"<1,5,1>": "ITEM",
"<1,5,2>": "",
"<1,5,3>": "",
"<1,5,4>": "&Company",
"<1,5,5>": "0",
"<1,5,6>": "0",
"<1,5,7>": "0",
"<1,5,8>": "0",
"<1,5,9>": "",
"<1,5,10>": "",
"<1,5,11>": "0",
"<1,5,12>": ""
},
"<1,6>": {
"<1,6,1>": "ITEM",
"<1,6,2>": "",
"<1,6,3>": "",
"<1,6,4>": "&Personal Names",
"<1,6,5>": "0",
"<1,6,6>": "0",
"<1,6,7>": "0",
"<1,6,8>": "0",
"<1,6,9>": "",
"<1,6,10>": "",
"<1,6,11>": "0",
"<1,6,12>": ""
},
"<1,7>": {
"<1,7,1>": "POPUP",
"<1,7,2>": "2",
"<1,7,3>": "",
"<1,7,4>": "&Messages",
"<1,7,5>": "0",
"<1,7,6>": "0",
"<1,7,7>": "0",
"<1,7,8>": "0",
"<1,7,9>": "",
"<1,7,10>": "",
"<1,7,11>": "0",
"<1,7,12>": ""
},
"<1,8>": {
"<1,8,1>": "ITEM",
"<1,8,2>": "",
"<1,8,3>": "",
"<1,8,4>": "&New",
"<1,8,5>": "0",
"<1,8,6>": "0",
"<1,8,7>": "0",
"<1,8,8>": "0",
"<1,8,9>": "",
"<1,8,10>": "",
"<1,8,11>": "0",
"<1,8,12>": ""
},
"<1,9>": {
"<1,9,1>": "ITEM",
"<1,9,2>": "",
"<1,9,3>": "",
"<1,9,4>": "&Check/View",
"<1,9,5>": "0",
"<1,9,6>": "0",
"<1,9,7>": "0",
"<1,9,8>": "0",
"<1,9,9>": "",
"<1,9,10>": "",
"<1,9,11>": "0",
"<1,9,12>": ""
},
"<1,10>": {
"<1,10,1>": "POPUP",
"<1,10,2>": "2",
"<1,10,3>": "",
"<1,10,4>": "&Help",
"<1,10,5>": "0",
"<1,10,6>": "0",
"<1,10,7>": "0",
"<1,10,8>": "0",
"<1,10,9>": "",
"<1,10,10>": "",
"<1,10,11>": "0",
"<1,10,12>": ""
},
"<1,11>": {
"<1,11,1>": "ITEM",
"<1,11,2>": "",
"<1,11,3>": "",
"<1,11,4>": "&Help\tF1",
"<1,11,5>": "0",
"<1,11,6>": "0",
"<1,11,7>": "0",
"<1,11,8>": "112",
"<1,11,9>": "",
"<1,11,10>": "",
"<1,11,11>": "0",
"<1,11,12>": ""
},
"<1,12>": {
"<1,12,1>": "ITEM",
"<1,12,2>": "",
"<1,12,3>": "",
"<1,12,4>": "&About\tCtrl+F1",
"<1,12,5>": "0",
"<1,12,6>": "0",
"<1,12,7>": "0",
"<1,12,8>": "624",
"<1,12,9>": "",
"<1,12,10>": "",
"<1,12,11>": "0",
"<1,12,12>": ""
}
},
"<2>": {
"<2,1>": "",
"<2,2>": {
"<2,2,1>": {
"<2,2,1,1>": "E",
"<2,2,1,2>": "CLOSE",
"<2,2,1,3>": "@WINDOW",
"<2,2,1,4>": "",
"<2,2,1,5>": "",
"<2,2,1,6>": ""
},
"<2,2,2>": {
"<2,2,2,1>": "R",
"<2,2,2,2>": "EXECUTE",
"<2,2,2,3>": "LSL2*OIWINEXE**COMPANY",
"<2,2,2,4>": {
"<2,2,2,4,1>": "CreateParam",
"<2,2,2,4,2>": "LSL_MAIN"
},
"<2,2,2,5>": "",
"<2,2,2,6>": ""
},
"<2,2,3>": {
"<2,2,3,1>": "R",
"<2,2,3,2>": "EXECUTE",
"<2,2,3,3>": "LSL2*OIWINEXE**P_NAMES",
"<2,2,3,4>": {
"<2,2,3,4,1>": "CreateParam",
"<2,2,3,4,2>": "LSL_MAIN"
},
"<2,2,3,5>": "",
"<2,2,3,6>": ""
},
"<2,2,4>": {
"<2,2,4,1>": "R",
"<2,2,4,2>": "EXECUTE",
"<2,2,4,3>": "LSL2*OIWINEXE**NOTES",
"<2,2,4,4>": {
"<2,2,4,4,1>": "CreateParam",
"<2,2,4,4,2>": "LSL_MAIN"
},
"<2,2,4,5>": "",
"<2,2,4,6>": ""
},
"<2,2,5>": {
"<2,2,5,1>": "R",
"<2,2,5,2>": "EXECUTE",
"<2,2,5,3>": "LSL2*OIWINEXE**NOTE_PTRS",
"<2,2,5,4>": {
"<2,2,5,4,1>": "CreateParam",
"<2,2,5,4,2>": "LSL_MAIN"
},
"<2,2,5,5>": "",
"<2,2,5,6>": ""
},
"<2,2,6>": {
"<2,2,6,1>": "E",
"<2,2,6,2>": "HELP",
"<2,2,6,3>": "@FOCUS",
"<2,2,6,4>": "",
"<2,2,6,5>": "",
"<2,2,6,6>": ""
},
"<2,2,7>": {
"<2,2,7,1>": "E",
"<2,2,7,2>": "NOTES",
"<2,2,7,3>": "@FOCUS",
"<2,2,7,4>": "",
"<2,2,7,5>": "",
"<2,2,7,6>": ""
},
"<2,2,8>": ""
},
"<2,3>": {
"<2,3,1>": "FILE.EXIT",
"<2,3,2>": "DATAWINDOWS.COMPANY",
"<2,3,3>": "DATAWINDOWS.PERSONAL_NAMES",
"<2,3,4>": "MESSAGES.NEW",
"<2,3,5>": "MESSAGES.CHECK/VIEW",
"<2,3,6>": "HELP.HELP",
"<2,3,7>": "HELP.ABOUT",
"<2,3,8>": ""
},
"<2,4>": "0"
}
}
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -572,7 +572,7 @@
"<3,8>": "28",
"<3,9>": "",
"<3,10>": {
"<3,10,1>": "0x5E000080",
"<3,10,1>": "0x5E000088",
"<3,10,2>": "0x200"
},
"<3,11>": {
@ -739,7 +739,7 @@
"<4,8>": "28",
"<4,9>": "",
"<4,10>": {
"<4,10,1>": "0x5E000080",
"<4,10,1>": "0x5E000088",
"<4,10,2>": "0x200"
},
"<4,11>": {

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

@ -78,7 +78,7 @@
"<1,31>": "",
"<1,32>": "",
"<1,33>": "",
"<1,34>": "",
"<1,34>": "LSL2*IMAGE*ICO*INFINEON",
"<1,35>": "",
"<1,36>": "",
"<1,37>": {
@ -18233,7 +18233,7 @@
"<120,33>": "",
"<120,34>": "",
"<120,35>": "",
"<120,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<120,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<120,37>": "",
"<120,38>": "",
"<120,39>": "",
@ -18430,7 +18430,7 @@
"<121,33>": "",
"<121,34>": "",
"<121,35>": "",
"<121,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<121,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<121,37>": "",
"<121,38>": "",
"<121,39>": "",
@ -18627,7 +18627,7 @@
"<122,33>": "",
"<122,34>": "",
"<122,35>": "",
"<122,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<122,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<122,37>": "",
"<122,38>": "",
"<122,39>": "",
@ -18824,7 +18824,7 @@
"<123,33>": "",
"<123,34>": "",
"<123,35>": "",
"<123,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<123,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<123,37>": "",
"<123,38>": "",
"<123,39>": "",
@ -19021,7 +19021,7 @@
"<124,33>": "",
"<124,34>": "",
"<124,35>": "",
"<124,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<124,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<124,37>": "",
"<124,38>": "",
"<124,39>": "",
@ -19218,7 +19218,7 @@
"<125,33>": "",
"<125,34>": "",
"<125,35>": "",
"<125,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<125,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<125,37>": "",
"<125,38>": "",
"<125,39>": "",
@ -19415,7 +19415,7 @@
"<126,33>": "",
"<126,34>": "",
"<126,35>": "",
"<126,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<126,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<126,37>": "",
"<126,38>": "",
"<126,39>": "",
@ -19612,7 +19612,7 @@
"<127,33>": "",
"<127,34>": "",
"<127,35>": "",
"<127,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<127,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<127,37>": "",
"<127,38>": "",
"<127,39>": "",
@ -19809,7 +19809,7 @@
"<128,33>": "",
"<128,34>": "",
"<128,35>": "",
"<128,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<128,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<128,37>": "",
"<128,38>": "",
"<128,39>": "",
@ -20006,7 +20006,7 @@
"<129,33>": "",
"<129,34>": "",
"<129,35>": "",
"<129,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<129,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<129,37>": "",
"<129,38>": "",
"<129,39>": "",
@ -20203,7 +20203,7 @@
"<130,33>": "",
"<130,34>": "",
"<130,35>": "",
"<130,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<130,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<130,37>": "",
"<130,38>": "",
"<130,39>": "",
@ -20400,7 +20400,7 @@
"<131,33>": "",
"<131,34>": "",
"<131,35>": "",
"<131,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<131,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<131,37>": "",
"<131,38>": "",
"<131,39>": "",
@ -20597,7 +20597,7 @@
"<132,33>": "",
"<132,34>": "",
"<132,35>": "",
"<132,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<132,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<132,37>": "",
"<132,38>": "",
"<132,39>": "",
@ -20794,7 +20794,7 @@
"<133,33>": "",
"<133,34>": "",
"<133,35>": "",
"<133,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<133,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<133,37>": "",
"<133,38>": "",
"<133,39>": "",
@ -20991,7 +20991,7 @@
"<134,33>": "",
"<134,34>": "",
"<134,35>": "",
"<134,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<134,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<134,37>": "",
"<134,38>": "",
"<134,39>": "",
@ -21188,7 +21188,7 @@
"<135,33>": "",
"<135,34>": "",
"<135,35>": "",
"<135,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<135,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<135,37>": "",
"<135,38>": "",
"<135,39>": "",
@ -21385,7 +21385,7 @@
"<136,33>": "",
"<136,34>": "",
"<136,35>": "",
"<136,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<136,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<136,37>": "",
"<136,38>": "",
"<136,39>": "",
@ -21582,7 +21582,7 @@
"<137,33>": "",
"<137,34>": "",
"<137,35>": "",
"<137,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<137,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<137,37>": "",
"<137,38>": "",
"<137,39>": "",
@ -21779,7 +21779,7 @@
"<138,33>": "",
"<138,34>": "",
"<138,35>": "",
"<138,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<138,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<138,37>": "",
"<138,38>": "",
"<138,39>": "",
@ -21976,7 +21976,7 @@
"<139,33>": "",
"<139,34>": "",
"<139,35>": "",
"<139,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<139,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<139,37>": "",
"<139,38>": "",
"<139,39>": "",
@ -22173,7 +22173,7 @@
"<140,33>": "",
"<140,34>": "",
"<140,35>": "",
"<140,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<140,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<140,37>": "",
"<140,38>": "",
"<140,39>": "",
@ -22370,7 +22370,7 @@
"<141,33>": "",
"<141,34>": "",
"<141,35>": "",
"<141,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<141,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<141,37>": "",
"<141,38>": "",
"<141,39>": "",
@ -22567,7 +22567,7 @@
"<142,33>": "",
"<142,34>": "",
"<142,35>": "",
"<142,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<142,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<142,37>": "",
"<142,38>": "",
"<142,39>": "",
@ -22764,7 +22764,7 @@
"<143,33>": "",
"<143,34>": "",
"<143,35>": "",
"<143,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<143,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<143,37>": "",
"<143,38>": "",
"<143,39>": "",
@ -22961,7 +22961,7 @@
"<144,33>": "",
"<144,34>": "",
"<144,35>": "",
"<144,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<144,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<144,37>": "",
"<144,38>": "",
"<144,39>": "",
@ -23158,7 +23158,7 @@
"<145,33>": "",
"<145,34>": "",
"<145,35>": "",
"<145,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<145,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<145,37>": "",
"<145,38>": "",
"<145,39>": "",
@ -23355,7 +23355,7 @@
"<146,33>": "",
"<146,34>": "",
"<146,35>": "",
"<146,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<146,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<146,37>": "",
"<146,38>": "",
"<146,39>": "",
@ -23552,7 +23552,7 @@
"<147,33>": "",
"<147,34>": "",
"<147,35>": "",
"<147,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<147,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<147,37>": "",
"<147,38>": "",
"<147,39>": "",
@ -23749,7 +23749,7 @@
"<148,33>": "",
"<148,34>": "",
"<148,35>": "",
"<148,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<148,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<148,37>": "",
"<148,38>": "",
"<148,39>": "",
@ -23946,7 +23946,7 @@
"<149,33>": "",
"<149,34>": "",
"<149,35>": "",
"<149,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<149,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<149,37>": "",
"<149,38>": "",
"<149,39>": "",
@ -24293,7 +24293,7 @@
"<151,33>": "",
"<151,34>": "",
"<151,35>": "",
"<151,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<151,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<151,37>": "",
"<151,38>": "",
"<151,39>": "",
@ -24490,7 +24490,7 @@
"<152,33>": "",
"<152,34>": "",
"<152,35>": "",
"<152,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<152,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<152,37>": "",
"<152,38>": "",
"<152,39>": "",
@ -24687,7 +24687,7 @@
"<153,33>": "",
"<153,34>": "",
"<153,35>": "",
"<153,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<153,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<153,37>": "",
"<153,38>": "",
"<153,39>": "",
@ -24884,7 +24884,7 @@
"<154,33>": "",
"<154,34>": "",
"<154,35>": "",
"<154,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<154,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<154,37>": "",
"<154,38>": "",
"<154,39>": "",
@ -25081,7 +25081,7 @@
"<155,33>": "",
"<155,34>": "",
"<155,35>": "",
"<155,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<155,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<155,37>": "",
"<155,38>": "",
"<155,39>": "",
@ -25278,7 +25278,7 @@
"<156,33>": "",
"<156,34>": "",
"<156,35>": "",
"<156,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<156,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<156,37>": "",
"<156,38>": "",
"<156,39>": "",
@ -25475,7 +25475,7 @@
"<157,33>": "",
"<157,34>": "",
"<157,35>": "",
"<157,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<157,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<157,37>": "",
"<157,38>": "",
"<157,39>": "",
@ -25672,7 +25672,7 @@
"<158,33>": "",
"<158,34>": "",
"<158,35>": "",
"<158,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<158,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<158,37>": "",
"<158,38>": "",
"<158,39>": "",
@ -25869,7 +25869,7 @@
"<159,33>": "",
"<159,34>": "",
"<159,35>": "",
"<159,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<159,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<159,37>": "",
"<159,38>": "",
"<159,39>": "",
@ -26066,7 +26066,7 @@
"<160,33>": "",
"<160,34>": "",
"<160,35>": "",
"<160,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<160,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<160,37>": "",
"<160,38>": "",
"<160,39>": "",
@ -26263,7 +26263,7 @@
"<161,33>": "",
"<161,34>": "",
"<161,35>": "",
"<161,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<161,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<161,37>": "",
"<161,38>": "",
"<161,39>": "",
@ -26460,7 +26460,7 @@
"<162,33>": "",
"<162,34>": "",
"<162,35>": "",
"<162,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<162,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<162,37>": "",
"<162,38>": "",
"<162,39>": "",
@ -26657,7 +26657,7 @@
"<163,33>": "",
"<163,34>": "",
"<163,35>": "",
"<163,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<163,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<163,37>": "",
"<163,38>": "",
"<163,39>": "",
@ -26854,7 +26854,7 @@
"<164,33>": "",
"<164,34>": "",
"<164,35>": "",
"<164,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<164,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<164,37>": "",
"<164,38>": "",
"<164,39>": "",
@ -27051,7 +27051,7 @@
"<165,33>": "",
"<165,34>": "",
"<165,35>": "",
"<165,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<165,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<165,37>": "",
"<165,38>": "",
"<165,39>": "",
@ -27248,7 +27248,7 @@
"<166,33>": "",
"<166,34>": "",
"<166,35>": "",
"<166,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<166,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<166,37>": "",
"<166,38>": "",
"<166,39>": "",
@ -27445,7 +27445,7 @@
"<167,33>": "",
"<167,34>": "",
"<167,35>": "",
"<167,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<167,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<167,37>": "",
"<167,38>": "",
"<167,39>": "",
@ -27642,7 +27642,7 @@
"<168,33>": "",
"<168,34>": "",
"<168,35>": "",
"<168,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<168,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<168,37>": "",
"<168,38>": "",
"<168,39>": "",
@ -27839,7 +27839,7 @@
"<169,33>": "",
"<169,34>": "",
"<169,35>": "",
"<169,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<169,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<169,37>": "",
"<169,38>": "",
"<169,39>": "",
@ -28036,7 +28036,7 @@
"<170,33>": "",
"<170,34>": "",
"<170,35>": "",
"<170,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<170,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<170,37>": "",
"<170,38>": "",
"<170,39>": "",
@ -28233,7 +28233,7 @@
"<171,33>": "",
"<171,34>": "",
"<171,35>": "",
"<171,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<171,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<171,37>": "",
"<171,38>": "",
"<171,39>": "",
@ -28430,7 +28430,7 @@
"<172,33>": "",
"<172,34>": "",
"<172,35>": "",
"<172,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<172,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<172,37>": "",
"<172,38>": "",
"<172,39>": "",
@ -28627,7 +28627,7 @@
"<173,33>": "",
"<173,34>": "",
"<173,35>": "",
"<173,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<173,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<173,37>": "",
"<173,38>": "",
"<173,39>": "",
@ -28824,7 +28824,7 @@
"<174,33>": "",
"<174,34>": "",
"<174,35>": "",
"<174,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<174,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<174,37>": "",
"<174,38>": "",
"<174,39>": "",
@ -29021,7 +29021,7 @@
"<175,33>": "",
"<175,34>": "",
"<175,35>": "",
"<175,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<175,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<175,37>": "",
"<175,38>": "",
"<175,39>": "",
@ -29218,7 +29218,7 @@
"<176,33>": "",
"<176,34>": "",
"<176,35>": "",
"<176,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<176,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<176,37>": "",
"<176,38>": "",
"<176,39>": "",
@ -29415,7 +29415,7 @@
"<177,33>": "",
"<177,34>": "",
"<177,35>": "",
"<177,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<177,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<177,37>": "",
"<177,38>": "",
"<177,39>": "",
@ -29612,7 +29612,7 @@
"<178,33>": "",
"<178,34>": "",
"<178,35>": "",
"<178,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<178,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<178,37>": "",
"<178,38>": "",
"<178,39>": "",
@ -29809,7 +29809,7 @@
"<179,33>": "",
"<179,34>": "",
"<179,35>": "",
"<179,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<179,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<179,37>": "",
"<179,38>": "",
"<179,39>": "",
@ -30006,7 +30006,7 @@
"<180,33>": "",
"<180,34>": "",
"<180,35>": "",
"<180,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF205300650067006F006500200055004900FCF03000FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<180,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF162E005C0042004D00500053005C004100630074006900760065005F0030003300310031002E0070006E006700FFFEFF075300740072006500740063006800FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000",
"<180,37>": "",
"<180,38>": "",
"<180,39>": "",

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -39,6 +39,10 @@
"<8,2>": {
"<8,2,1>": "Update QA Metrology Specs",
"<8,2,2>": "QA_MET"
},
"<8,3>": {
"<8,3,1>": "Update RDS Layer Parameters",
"<8,3,2>": "UPDATE_RDS_LAYER"
}
},
"<9>": {
@ -46,29 +50,21 @@
"<9,1,1>": "1",
"<9,1,2>": "20",
"<9,1,3>": "L",
"<9,1,4>": "",
"<9,1,4>": "L",
"<9,1,5>": "",
"<9,1,6>": "Window Option"
},
"<9,2>": {
"<9,2,1>": "2",
"<9,2,2>": "0",
"<9,2,3>": "L",
"<9,2,4>": "",
"<9,2,3>": "R",
"<9,2,4>": "R",
"<9,2,5>": "",
"<9,2,6>": ""
},
"<9,3>": {
"<9,3,1>": "",
"<9,3,2>": "",
"<9,3,3>": "",
"<9,3,4>": "",
"<9,3,5>": "",
"<9,3,6>": ""
"<9,2,6>": "2"
}
},
"<10>": "L",
"<11>": "3",
"<11>": "2",
"<12>": "Engineering Options",
"<13>": "2",
"<14>": "F",
@ -91,8 +87,18 @@
"<31>": "0",
"<32>": "0",
"<33>": "0",
"<34>": "16777215",
"<35>": "16777215"
"<34>": "-2",
"<35>": "-2",
"<36>": "",
"<37>": "",
"<38>": "",
"<39>": "",
"<40>": "-2",
"<41>": "1000",
"<42>": "",
"<43>": "",
"<44>": "",
"<45>": ""
}
}
}

View File

@ -9,7 +9,7 @@
"<2>": "-2",
"<3>": "-1",
"<4>": "-1",
"<5>": "16777215",
"<5>": "-2",
"<6>": {
"<6,1>": {
"<6,1,1>": "Tahoma",
@ -76,11 +76,21 @@
"<28>": "",
"<29>": "0",
"<30>": "0",
"<31>": "0",
"<31>": "1",
"<32>": "0",
"<33>": "0",
"<34>": "16777215",
"<35>": "16777215"
"<34>": "-2",
"<35>": "-2",
"<36>": "",
"<37>": "",
"<38>": "",
"<39>": "",
"<40>": "-2",
"<41>": "1000",
"<42>": "",
"<43>": "",
"<44>": "",
"<45>": ""
}
}
}

View File

@ -9,7 +9,7 @@
"<2>": "-2",
"<3>": "-1",
"<4>": "-1",
"<5>": "16777215",
"<5>": "-2",
"<6>": {
"<6,1>": {
"<6,1,1>": "Tahoma",
@ -84,11 +84,21 @@
"<28>": "",
"<29>": "0",
"<30>": "0",
"<31>": "0",
"<31>": "1",
"<32>": "0",
"<33>": "0",
"<34>": "16777215",
"<35>": "16777215"
"<34>": "-2",
"<35>": "-2",
"<36>": "",
"<37>": "",
"<38>": "",
"<39>": "",
"<40>": "-2",
"<41>": "1000",
"<42>": "",
"<43>": "",
"<44>": "",
"<45>": ""
}
}
}

View File

@ -9,7 +9,7 @@
"<2>": "-1",
"<3>": "-1",
"<4>": "-1",
"<5>": "16777215",
"<5>": "-2",
"<6>": {
"<6,1>": {
"<6,1,1>": "Tahoma",
@ -53,24 +53,28 @@
"<8,5,2>": "Graphite Machining Services Inc"
},
"<8,6>": {
"<8,6,1>": "NRD",
"<8,6,2>": "Nuclecel"
"<8,6,1>": "MERSEN",
"<8,6,2>": "Mersen USA GS Corp."
},
"<8,7>": {
"<8,7,1>": "SGL",
"<8,7,2>": "SGL Group"
"<8,7,1>": "NRD",
"<8,7,2>": "Nuclecel"
},
"<8,8>": {
"<8,8,1>": "TOYO",
"<8,8,2>": "Toyo Tanso USA"
"<8,8,1>": "SGL",
"<8,8,2>": "SGL Group"
},
"<8,9>": {
"<8,9,1>": "WACOM",
"<8,9,2>": "WaCom"
"<8,9,1>": "TOYO",
"<8,9,2>": "Toyo Tanso USA"
},
"<8,10>": {
"<8,10,1>": "XYCARB",
"<8,10,2>": "Xycarb Ceramic"
"<8,10,1>": "WACOM",
"<8,10,2>": "WaCom"
},
"<8,11>": {
"<8,11,1>": "XYCARB",
"<8,11,2>": "Xycarb Ceramic"
}
},
"<9>": {
@ -89,14 +93,6 @@
"<9,2,4>": "C",
"<9,2,5>": "",
"<9,2,6>": "Description"
},
"<9,3>": {
"<9,3,1>": "",
"<9,3,2>": "",
"<9,3,3>": "",
"<9,3,4>": "",
"<9,3,5>": "",
"<9,3,6>": ""
}
},
"<10>": "L",
@ -124,7 +120,17 @@
"<32>": "0",
"<33>": "1",
"<34>": "16777215",
"<35>": "16777215"
"<35>": "16777215",
"<36>": "",
"<37>": "",
"<38>": "",
"<39>": "",
"<40>": "-2",
"<41>": "1000",
"<42>": "",
"<43>": "",
"<44>": "",
"<45>": ""
}
}
}

View File

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

View File

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

View File

@ -149,4 +149,3 @@ end api
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@ -67,25 +67,22 @@ END
RETURN Result
* * * * * * *
Create:
* * * * * * *
IF MemberOf(@USER4,'CALIBRATION') ELSE
IF MemberOf(@USER4,'CALIBRATION') ELSE
ErrMsg('Only authorized personnel may update the Calibration List.')
End_Window(@WINDOW)
RETURN
END
END
obj_Appwindow('Create',@WINDOW)
obj_Appwindow('Create',@WINDOW)
Set_List_Box_Data( @WINDOW )
// Use to determine whether or not the New Calibration label was just clicked
Set_Property(@Window : '.CALIBRATIONS', '@PrintLabel', False$)
GOSUB Refresh
Set_List_Box_Data( @WINDOW )
// Use to determine whether or not the New Calibration label was just clicked
Set_Property(@Window : '.CALIBRATIONS', '@PrintLabel', False$)
GOSUB Refresh
RETURN
@ -95,41 +92,41 @@ Clear:
* * * * * * *
IF Get_Property(@WINDOW,'@READONLY') THEN
IF Get_Property(@WINDOW,'@READONLY') THEN
obj_AppWindow('ReadOnly',@RM:1) ;* Reenables data bound controls
Set_Property(@WINDOW,'@READONLY',0) ;* Clear flag on window
END
END
* * * * * * *
Refresh:
* * * * * * *
* QBF buttons
* QBF buttons
Ctrls = @WINDOW:'.QBF_FIRST_FIX':@RM ; Props = 'ENABLED':@RM
Ctrls := @WINDOW:'.QBF_PREV_FIX':@RM ; Props := 'ENABLED':@RM
Ctrls := @WINDOW:'.QBF_ABS_FIX':@RM ; Props := 'ENABLED':@RM
Ctrls := @WINDOW:'.QBF_NEXT_FIX':@RM ; Props := 'ENABLED':@RM
Ctrls := @WINDOW:'.QBF_LAST_FIX':@RM ; Props := 'ENABLED':@RM
Ctrls := @WINDOW:'.QBF_STOP_FIX' ; Props := 'ENABLED'
Ctrls = @WINDOW:'.QBF_FIRST_FIX':@RM ; Props = 'ENABLED':@RM
Ctrls := @WINDOW:'.QBF_PREV_FIX':@RM ; Props := 'ENABLED':@RM
Ctrls := @WINDOW:'.QBF_ABS_FIX':@RM ; Props := 'ENABLED':@RM
Ctrls := @WINDOW:'.QBF_NEXT_FIX':@RM ; Props := 'ENABLED':@RM
Ctrls := @WINDOW:'.QBF_LAST_FIX':@RM ; Props := 'ENABLED':@RM
Ctrls := @WINDOW:'.QBF_STOP_FIX' ; Props := 'ENABLED'
IF Get_Property(@WINDOW,'QBFLIST') = '' THEN
IF Get_Property(@WINDOW,'QBFLIST') = '' THEN
Vals = 0:@RM:0:@RM:0:@RM:0:@RM:0:@RM:0
END ELSE
END ELSE
Vals = 1:@RM:1:@RM:1:@RM:1:@RM:1:@RM:1
END
END
Set_Property(Ctrls,Props,Vals)
Set_Property(Ctrls,Props,Vals)
* Turn edit table symbolic column backgrounds to green
* Turn edit table symbolic column backgrounds to green
ETSymbolics = Get_Property(@WINDOW,'@ET_SYMBOLICS') ;* Loaded during 'Create' in obj_Appwindow
ETSymbolics = Get_Property(@WINDOW,'@ET_SYMBOLICS') ;* Loaded during 'Create' in obj_Appwindow
ETCtrls = ETSymbolics<1>
ETCols = ETSymbolics<2>
ETCtrls = ETSymbolics<1>
ETCols = ETSymbolics<2>
FOR I = 1 TO COUNT(ETCtrls,@VM) + (ETCtrls NE '')
FOR I = 1 TO COUNT(ETCtrls,@VM) + (ETCtrls NE '')
ETCtrl = ETCtrls<1,I>
ETList = Get_Property(ETCtrl,'LIST')
FOR Line = 1 TO COUNT(ETList,@FM) + (ETList NE '')
@ -139,37 +136,32 @@ FOR I = 1 TO COUNT(ETCtrls,@VM) + (ETCtrls NE '')
NEXT N
END
NEXT Line
NEXT I
NEXT I
RETURN
* * * * * * *
Read:
* * * * * * *
CLNo = Get_Property(@WINDOW:'.CL_NO','DEFPROP')
CLNo = Get_Property(@WINDOW:'.CL_NO','DEFPROP')
IF RowExists('CALIB_LIST',CLNo) ELSE
IF RowExists('CALIB_LIST',CLNo) ELSE
IF Get_Property(@WINDOW:'.ENTER_DTM','DEFPROP') = '' THEN
CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTH')
Set_Property(@WINDOW:'.ENTER_DTM','DEFPROP',CurrDTM)
END
END
END
GOSUB Refresh
// Use to determine whether or not the New Calibration button was just clicked and print if it was
PrintCheck = Get_Property(@Window : '.CALIBRATIONS', '@PrintLabel')
If PrintCheck EQ True$ then
GOSUB Refresh
// Use to determine whether or not the New Calibration button was just clicked and print if it was
PrintCheck = Get_Property(@Window : '.CALIBRATIONS', '@PrintLabel')
If PrintCheck EQ True$ then
Gosub PrintMostRecentLabel
end
// Reset flag after read regardless
Set_Property(@Window : '.CALIBRATIONS', '@PrintLabel', False$)
end
// Reset flag after read regardless
Set_Property(@Window : '.CALIBRATIONS', '@PrintLabel', False$)
RETURN
@ -187,14 +179,6 @@ RETURN
Delete:
* * * * * * *
/*
IF Security_Check('Order',Delete$) THEN
Result = 1 ;* Proceed with delete
END ELSE
Security_Err_Msg('Order',Delete$)
Result = 0 ;* Stop event chain
END
*/
RETURN
@ -203,13 +187,12 @@ RETURN
NewItem:
* * * * * * *
CLNo = Get_Property(@WINDOW:'.CL_NO','DEFPROP')
CLNo = Get_Property(@WINDOW:'.CL_NO','DEFPROP')
IF CLNo = '' THEN
IF CLNo = '' THEN
NextCLNo = NextKey('CALIB_LIST')
obj_Appwindow('LoadFormKeys',@WINDOW:@RM:NextCLNo)
END
END
RETURN
@ -218,37 +201,35 @@ RETURN
LUCalibItem:
* * * * * * *
CLKeys = Popup(@WINDOW,'','CALIB_LIST')
CLKeys = Popup(@WINDOW,'','CALIB_LIST')
IF Get_Status(errCode) THEN ErrMsg(ErrCode)
IF Get_Status(errCode) THEN ErrMsg(ErrCode)
CONVERT @VM TO @FM IN CLKeys
CONVERT @VM TO @FM IN CLKeys
IF INDEX(CLKeys,@FM,1) THEN
IF INDEX(CLKeys,@FM,1) THEN
Send_Event(@WINDOW,'QBFINIT')
Set_Property(@WINDOW,'QBFLIST',CLKeys)
GOSUB Refresh
Send_Event(@WINDOW,'QBFIRST')
END ELSE
END ELSE
obj_Appwindow('LoadFormKeys',@WINDOW:@RM:CLKeys)
END
END
RETURN
* * * * * * *
LUCalibItemType:
* * * * * * *
CLItemType = Popup(@WINDOW,'','CALIB_LIST_TYPE')
CLItemType = Popup(@WINDOW,'','CALIB_LIST_TYPE')
IF Get_Status(errCode) THEN ErrMsg(ErrCode)
IF Get_Status(errCode) THEN ErrMsg(ErrCode)
IF CLItemType NE '' THEN
IF CLItemType NE '' THEN
obj_AppWindow('LUValReturn',CLItemType:@RM:@WINDOW:'.CL_TYPE')
END
END
RETURN
@ -257,27 +238,24 @@ RETURN
LUCalibItemLoc:
* * * * * * *
CLItemLoc = Popup(@WINDOW,'','CALIB_LIST_LOC')
CLItemLoc = Popup(@WINDOW,'','CALIB_LIST_LOC')
IF Get_Status(errCode) THEN ErrMsg(ErrCode)
IF Get_Status(errCode) THEN ErrMsg(ErrCode)
IF CLItemLoc NE '' THEN
IF CLItemLoc NE '' THEN
obj_AppWindow('LUValReturn',CLItemLoc:@RM:@WINDOW:'.CAL_LOC')
END
END
RETURN
* * * * * *
Close:
* * * * * *
obj_Notes('Inbox',@USER4) ;* Checks for any new messages
obj_Notes('Inbox',@USER4) ;* Checks for any new messages
Send_Event('MASTER_CALIB_LIST','CREATE')
Send_Event('MASTER_CALIB_LIST','CREATE')
RETURN
@ -287,18 +265,18 @@ RETURN
CalibrationsDC:
* * * * * * *
CtrlEntID = @WINDOW:'.CALIBRATIONS'
CtrlEntID = @WINDOW:'.CALIBRATIONS'
CurrPos = Get_Property(CtrlEntID,'SELPOS')
CurrCol = CurrPos<1>
CurrRow = CurrPos<2>
CurrPos = Get_Property(CtrlEntID,'SELPOS')
CurrCol = CurrPos<1>
CurrRow = CurrPos<2>
CalDt = Get_Property(CtrlEntID,'CELLPOS',COL$CAL_DT:@FM:CurrRow)
CalDt = Get_Property(CtrlEntID,'CELLPOS',COL$CAL_DT:@FM:CurrRow)
CalDt = ICONV(CalDt,'D')
CLNo = Get_Property(@WINDOW:'.CL_NO','DEFPROP')
CalDt = ICONV(CalDt,'D')
CLNo = Get_Property(@WINDOW:'.CL_NO','DEFPROP')
IF CLNo NE '' AND CalDt NE '' THEN
IF CLNo NE '' AND CalDt NE '' THEN
IF Get_Property(@WINDOW,'QBFLIST') = '' THEN
Send_Event(@WINDOW,'WRITE')
@ -314,8 +292,7 @@ IF CLNo NE '' AND CalDt NE '' THEN
obj_Appwindow('ViewNewDetail', oaParms)
END
END
RETURN
@ -324,11 +301,11 @@ RETURN
NewCalibClick:
* * * * * * *
CtrlEntID = @WINDOW:'.CALIBRATIONS'
CtrlEntID = @WINDOW:'.CALIBRATIONS'
CLNo = Get_Property(@WINDOW:'.CL_NO','DEFPROP')
CLNo = Get_Property(@WINDOW:'.CL_NO','DEFPROP')
IF CLNo NE '' THEN
IF CLNo NE '' THEN
IF Get_Property(@WINDOW,'QBFLIST') = '' THEN
Send_Event(@WINDOW,'WRITE')
@ -346,17 +323,18 @@ IF CLNo NE '' THEN
// New Calibration label was just clicked, set to true
Set_Property(@Window : '.CALIBRATIONS', '@PrintLabel', True$)
END
END
RETURN
*********************
PrintMostRecentLabel:
*********************
CLNo = Get_Property(@WINDOW:'.CL_NO','DEFPROP')
CLNo = Get_Property(@WINDOW:'.CL_NO','DEFPROP')
IF CLNo NE '' THEN
IF CLNo NE '' THEN
TableList = Get_Property(@WINDOW:'.CALIBRATIONS', 'LIST')
EquipmentID = Get_Property(@WINDOW:'.EQ_DESC', 'TEXT')
LastCalibration = Get_Property(@WINDOW:'.LAST_CAL_DT', 'TEXT')
@ -365,10 +343,7 @@ IF CLNo NE '' THEN
NextCalibration = Get_Property(@WINDOW:'.NEXT_CAL_DT', 'TEXT')
CalibratedBy = TableList<1,2>
Labeling_Services('PrintCalibrationLabel', EquipmentID, LastCalibration, NextCalibration, CalibratedBy, FrequencyVal, FrequencyUnit, '')
end
end
return

View File

@ -136,4 +136,3 @@ CreateHALCollection:
end
return

258
LSL2/STPROC/CLEAN_API.txt Normal file
View File

@ -0,0 +1,258 @@
Function Clean_API(@API)
/***********************************************************************************************************************
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
permission from SRP Computer Solutions, Inc.
Name : Clean_API
Description : API logic for the Clean resource.
Notes : All web APIs should include the API_SETUP insert. This will provide several useful variables:
HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.)
APIURL - The URL for the API entry point (e.g., api.mysite.com/v1).
FullEndpointURL - The URL submitted by the client, including query params.
FullEndpointURLNoQuery - The URL submitted by the client, excluding query params.
EndpointSegment - The URL endpoint segment.
ParentURL - The URL path preceeding the current endpoint.
CurrentAPI - The name of this stored procedure.
Parameters :
API [in] -- Web API to process. Format is [APIPattern].[HTTPMethod]:
- APIPattern must follow this structure Clean[.ID.[<Property>]]
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
Examples:
- Clean.POST
- Clean.ID.PUT
- Clean.ID.firstName.GET
Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API
services do not rely upon anything being returned in the response. This is what the
various services like SetResponseBody and SetResponseStatus services are for. A response
value is only helpful if the developers want to use it for debug purposes.
History : (Date, Initials, Notes)
06/18/25 xxx Original programmer.
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
Declare function OI_Wizard_Services, Lot_Operation_Services, Database_Services, Lot_Services, Clean_Services
Declare subroutine Clean_Services, Lot_Services
$insert APP_INSERTS
$insert API_SETUP
$insert HTTP_INSERTS
$insert OI_WIZARD_EQUATES
$insert LOT_OPERATION_EQUATES
GoToAPI else
// The specific resource endpoint doesn't have a API handler yet.
HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.')
end
Return Response OR ''
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Endpoint Handlers
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
API clean.ID.HEAD
API clean.ID.GET
ErrorMessage = ''
ResponseCode = ''
ResponseMessage = ''
Body = ''
OIWizardID = ''
Cookies = HTTP_Services('GetHTTPCookie')
For each Cookie in Cookies using ';'
Key = Field(Cookie, '=', 1)
If Key EQ 'sessionID' then
OIWizardID = Field(Cookie, '=', 2)
end
Next Cookie
ValidSession = OI_Wizard_Services('ValidateSession', OIWizardID)
If ValidSession then
UserId = Xlate('OI_WIZARD', OIWizardID, OI_WIZARD.EMPLOYEE_ID$, 'X')
StatusCode = ''
CleanRecId = EndpointSegment
CleanRecJson = Clean_Services('ConvertCleanRecToJson', CleanRecId)
If Error_Services('NoError') then
Http_Services('SetResponseBody', CleanRecJson, False$, 'application/hal+json')
ResponseCode = 200
end else
ErrorMessage = Error_Services('GetMessage')
ResponseCode = 500
end
end else
ErrorMessage = 'Invalid session. Reauthentication required.'
ResponseCode = 401
end
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
HTTP_Services('SetResponseStatus', ResponseCode, ErrorMessage)
end api
API clean.ID.markcleanrecordcomplete.POST
ErrorMessage = ''
ResponseCode = ''
ResponseMessage = ''
Body = ''
OIWizardID = ''
Cookies = HTTP_Services('GetHTTPCookie')
For each Cookie in Cookies using ';'
Key = Field(Cookie, '=', 1)
If Key EQ 'sessionID' then
OIWizardID = Field(Cookie, '=', 2)
end
Next Cookie
ValidSession = OI_Wizard_Services('ValidateSession', OIWizardID)
If ValidSession then
UserId = Xlate('OI_WIZARD', OIWizardID, OI_WIZARD.EMPLOYEE_ID$, 'X')
StatusCode = ''
Body = HTTP_Services('GetHTTPPostString', True$)
// The POST string will have been encoded so use percent (URL) decoding.
DecodedJSON = HTTP_Services('DecodePercentString', Body)
If SRP_JSON(objBody, 'Parse', Body) EQ '' then
CleanRecId = ParentSegment
LotOperationId = SRP_JSON(objBody, 'GetValue', 'LotOperationId')
CleanTool = SRP_JSON(objBody, 'GetValue', 'CleanTool')
CleanRecipe = SRP_JSON(objBody, 'GetValue', 'CleanRecipe')
SRP_JSON(objBody, 'Release')
Clean_Services('MarkCleanRecComplete', CleanRecId, CleanRecipe, CleanTool, UserId)
If Error_Services('NoError') then
CleanRecJson = Clean_Services('ConvertCleanRecToJson', CleanRecId)
HTTP_Services('SetResponseBody', CleanRecJson, False$, 'application/hal+json')
ResponseCode = 200
end else
ErrorMessage = Error_Services('GetMessage')
ResponseCode = 500
end
end
end else
ErrorMessage = 'Invalid session. Reauthentication required.'
ResponseCode = 401
end
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
HTTP_Services('SetResponseStatus', ResponseCode, ErrorMessage)
end api
API clean.createcleanrecord.POST
ErrorMessage = ''
ResponseCode = ''
ResponseMessage = ''
Body = ''
OIWizardID = ''
Cookies = HTTP_Services('GetHTTPCookie')
For each Cookie in Cookies using ';'
Key = Field(Cookie, '=', 1)
If Key EQ 'sessionID' then
OIWizardID = Field(Cookie, '=', 2)
end
Next Cookie
ValidSession = OI_Wizard_Services('ValidateSession', OIWizardID)
If ValidSession then
UserId = Xlate('OI_WIZARD', OIWizardID, OI_WIZARD.EMPLOYEE_ID$, 'X')
StatusCode = ''
Body = HTTP_Services('GetHTTPPostString', True$)
// The POST string will have been encoded so use percent (URL) decoding.
DecodedJSON = HTTP_Services('DecodePercentString', Body)
If SRP_JSON(objBody, 'Parse', Body) EQ '' then
LotId = SRP_JSON(objBody, 'GetValue', 'LotId')
LotOperationId = SRP_JSON(objBody, 'GetValue', 'LotOperationId')
SRP_JSON(objBody, 'Release')
end
CleanRecId = Clean_Services('CreateNewCleanRecord', LotId, LotOperationId, UserId)
If Error_Services('NoError') then
CleanRecJson = Clean_Services('ConvertCleanRecToJson', CleanRecId)
HTTP_Services('SetResponseBody', CleanRecJson, False$, 'application/hal+json')
ResponseCode = 200
end else
ErrorMessage = Error_Services('GetMessage')
ResponseCode = 500
end
end else
ErrorMessage = 'Invalid session. Reauthentication required.'
ResponseCode = 401
end
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
HTTP_Services('SetResponseStatus', ResponseCode, ErrorMessage)
end api
API clean.getnewcleanoperationparams.HEAD
API clean.getnewcleanoperationparams.GET
JSONCollection = ''
OIWizardID = ''
Cookies = HTTP_Services('GetHTTPCookie')
For each Cookie in Cookies using ';'
Key = Field(Cookie, '=', 1)
If Key EQ 'sessionID' then
OIWizardID = Field(Cookie, '=', 2)
end
Next Cookie
ValidSession = OI_Wizard_Services('ValidateSession', OIWizardID)
If ValidSession then
Body = HTTP_Services('GetHTTPGetString')
If Body NE '' then
RequestJson = HTTP_Services('DecodePercentString', Body)
LotId = Http_Services('GetQueryField', 'LotId')
objJSONResponse = ''
If SRP_Json(objJSONResponse, 'New', 'Object') then
//Available Tools
If SRP_Json(objCleanTools, 'New', 'Array') then
CleanTools = Clean_Services('GetCleanToolOptions')
for each CleanTool in CleanTools using @FM
SRP_Json(objCleanTools, 'AddValue', CleanTool, 'String')
Next CleanTool
SRP_Json(objJsonResponse, 'Set', 'CleanToolOptions', objCleanTools)
SRP_Json(objCleanTools, 'Release')
end
//Available Recipes
If SRP_Json(objCleanRecipes, 'New', 'Array') then
CleanRecipes = Clean_Services('GetCleanRecipeOptions')
for each Recipe in CleanRecipes using @VM
SRP_Json(objCleanRecipes, 'AddValue', Recipe, 'String')
Next Recipe
SRP_Json(objJsonResponse, 'Set', 'CleanRecipeOptions', objCleanRecipes)
SRP_Json(objCleanRecipes, 'Release')
end
JsonResponse = SRP_Json(objJsonResponse, 'Stringify', 'Styled')
SRP_Json(objJsonResponse, 'Release')
end else
Error_Services('Add', 'Error when creating JSON response.')
end
end else
Error_Services('Add', 'No body was sent with the request.')
end
If Error_Services('NoError') then
HTTP_Services('SetResponseStatus', 201, 'Success')
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
HTTP_Services('SetResponseBody', JsonResponse, False$, 'application/hal+json')
end else
HTTP_Services('SetResponseStatus', 400, Error_Services('GetMessage'))
end
end else
HTTP_Services('SetResponseStatus', 401, 'Invalid session. Reauthentication required.')
end
end api

View File

@ -72,11 +72,12 @@ $insert WM_OUT_EQUATES
$insert WO_LOG_EQUATES
$insert ROTR_EQUATES
$insert WO_MAT_EQUATES
$Insert IFX_EQUATES
Equ Comma$ to ','
Declare function Error_Services, Database_Services, Environment_Services, QA_Services, RDS_Services, MemberOf
Declare subroutine Error_Services, Database_Services, Post_Metrology_Manual_Data_Entry_Log
Declare subroutine Error_Services, Database_Services, Post_Metrology_Manual_Data_Entry_Log, Service_Services
Declare subroutine Qa_Services
If KeyID then GoSub Initialize_System_Variables
@ -799,96 +800,15 @@ WRITE_RECORD:
WONo = Record<CLEAN_INSP_WO_NO$>
ReactType = Xlate('WO_LOG', WONo, 'REACT_TYPE', 'X')
EpiPro = (ReactType EQ 'EPP')
GaN = (ReactType EQ 'GAN')
NonEpiPro = ( (ReactType NE 'EPP') and (ReactType NE 'GAN') )
Stage = Record<CLEAN_INSP_STAGE$>
If Stage EQ 'LWI' then
RDSNo = Record<CLEAN_INSP_RDS_NO$>
PostCIKey = Xlate('RDS', RDSNo, 'POST_CI_NO', 'X')
If PostCIKey NE '' then
FailedWafers = Record<CLEAN_INSP_FAILED_WAFERS$>
If FailedWafers NE '' then
NewPostSpecSampleQty = Sum(FailedWafers)
PostCIRec = Database_Services('ReadDataRow', 'CLEAN_INSP', PostCIKey)
PostSpecRecipes = PostCIRec<CLEAN_INSP_SPEC_SURFSCAN_RECIPE$>
NumRecipes = DCount(PostSpecRecipes, @VM)
If NumRecipes GT 0 then
For RecipeIndex = 1 to NumRecipes
CurrSpec = PostCIRec<CLEAN_INSP_SPEC_SS_SAMP_QTY$, RecipeIndex>
If ( (CurrSpec EQ '') or (CurrSpec LT NewPostSpecSampleQty) ) then
PostCIRec<CLEAN_INSP_SPEC_SS_SAMP_QTY$, RecipeIndex> = NewPostSpecSampleQty
Service_Services('PostProcedure', 'CLEAN_INSP_SERVICES', 'UpdatePostCISampleQty':SD$:Name)
end
Next RecipeIndex
Database_Services('WriteDataRow', 'CLEAN_INSP', PostCIKey, PostCIRec, True$, False$, True$)
end
end
end
end
If NonEpiPro then
// Sync up Insp, Clean, and SurfScan signatures with WO_MAT signature profile
Stage = {STAGE}
WOMatKey = {WO_MAT_KEY}
// Update failed wafer list
QA_Services('UpdateFailedWafers', WOMatKey)
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
WOMatSigProf = WOMatRec<WO_MAT_SIG_PROFILE$>
WOMatSigs = WOMatRec<WO_MAT_SIGNATURE$>
WOMatSigDTMs = WOMatRec<WO_MAT_SIG_DTM$>
OrigInspSig = OrigRecord<CLEAN_INSP_INSP_SIG$>
OrigInspSigDTM = OrigRecord<CLEAN_INSP_INSP_SIG_DTM$>
InspSig = Record<CLEAN_INSP_INSP_SIG$>
InspSigDTM = Record<CLEAN_INSP_INSP_SIG_DTM$>
OrigCleanSig = OrigRecord<CLEAN_INSP_CLEAN_SIG$>
OrigCleanSigDTM = OrigRecord<CLEAN_INSP_CLEAN_SIG_DTM$>
CleanSig = Record<CLEAN_INSP_CLEAN_SIG$>
CleanSigDTM = Record<CLEAN_INSP_CLEAN_SIG_DTM$>
OrigScanSig = OrigRecord<CLEAN_INSP_SCAN_SIG$>
OrigScanSigDTM = OrigRecord<CLEAN_INSP_SCAN_SIG_DTM$>
ScanSig = Record<CLEAN_INSP_SCAN_SIG$>
ScanSigDTM = Record<CLEAN_INSP_SCAN_SIG_DTM$>
SigProfUpdate = False$
If ( (OrigInspSig NE InspSig) or (OrigInspSigDTM NE InspSigDTM) ) then
WOMatStage = '1':Stage:'I'
Locate WOMatStage in WOMatSigProf using @VM setting vPos then
WOMatSigs<0, vPos> = InspSig[-1, 'B':@VM]
WOMatSigDTMs<0, vPos> = InspSigDTM[-1, 'B':@VM]
SigProfUpdate = True$
end
end
If ( (OrigCleanSig NE CleanSig) or (OrigCleanSigDTM NE CleanSigDTM) ) then
WOMatStage = '1':Stage:'C'
Locate WOMatStage in WOMatSigProf using @VM setting vPos then
WOMatSigs<0, vPos> = CleanSig[-1, 'B':@VM]
WOMatSigDTMs<0, vPos> = CleanSigDTM[-1, 'B':@VM]
SigProfUpdate = True$
end
end
If ( (OrigScanSig NE ScanSig) or (OrigScanSigDTM NE ScanSigDTM) ) then
WOMatStage = '1':Stage:'S'
Locate WOMatStage in WOMatSigProf using @VM setting vPos then
WOMatSigs<0, vPos> = ScanSig[-1, 'B':@VM]
WOMatSigDTMs<0, vPos> = ScanSigDTM[-1, 'B':@VM]
SigProfUpdate = True$
end
end
If SigProfUpdate then
NumSteps = DCount(WOMatSigProf, @VM)
WOMatRec<WO_MAT_SIGNATURE$> = Field(WOMatSigs, @VM, 1, NumSteps)
WOMatRec<WO_MAT_SIG_DTM$> = Field(WOMatSigDTMs, @VM, 1, NumSteps)
Database_Services('WriteDataRow', 'WO_MAT', WOMatKey, WOMatRec, True$, False$, True$)
end
Service_Services('PostProcedure', 'QA_SERVICES', 'UpdateFailedWafers':SD$:WOMatKey)
Service_Services('PostProcedure', 'CLEAN_INSP_SERVICES', 'PushSigProfileToWoMat':SD$:Name)
end
return
@ -945,4 +865,3 @@ Restore_System_Variables:
@FILE.ERROR = OrigFileError
return

View File

@ -56,7 +56,8 @@ $Insert PRS_STAGE_EQUATES
$Insert WO_MAT_EQUATES
Declare function Database_Services, SRP_JSON, Error_Services, obj_Clean_Insp
Declare subroutine Database_Services, SRP_JSON, Error_Services, obj_React_Run, Clean_Insp_Services, React_Run_Services, Btree.Extract
Declare subroutine Database_Services, SRP_JSON, Error_Services, obj_React_Run, Clean_Insp_Services, React_Run_Services
Declare subroutine Transaction_Services, Btree.Extract
GoToService
@ -439,11 +440,13 @@ Service UpdateAllCleanInsp(WOMatKey)
end service
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// This service functions as a means to get the latest CINo for a specified RDS No where the defectivity measurements took place
// This is specifically used to have the latest defectivity data
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Service GetLatestDefectCINoByRDSId(RDSNo)
LatestCINo = ''
LatestInspDtm = ''
Open 'DICT CLEAN_INSP' to @DICT then
@ -464,6 +467,136 @@ Service GetLatestDefectCINoByRDSId(RDSNo)
end
end
Response = LatestCINo
end service
Service PushSigProfileToWoMat(CleanInspKey)
ErrorMsg = ''
If (CleanInspKey NE '') then
If RowExists('CLEAN_INSP', CleanInspKey) then
Record = Database_Services('ReadDataRow', 'CLEAN_INSP', CleanInspKey)
If Error_Services('NoError') then
WONo = Record<CLEAN_INSP_WO_NO$>
ReactType = Xlate('WO_LOG', WONo, 'REACT_TYPE', 'X')
NonEpiPro = ( (ReactType NE 'EPP') and (ReactType NE 'GAN') )
If NonEpiPro then
// Sync up Insp, Clean, and SurfScan signatures with WO_MAT signature profile
Stage = Record<CLEAN_INSP_STAGE$>
WOMatKey = Xlate('CLEAN_INSP', CleanInspKey, 'WO_MAT_KEY', 'X')
If WOMatKey NE '' then
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
If Error_Services('NoError') then
WOMatSigProf = WOMatRec<WO_MAT_SIG_PROFILE$>
WOMatSigs = WOMatRec<WO_MAT_SIGNATURE$>
WOMatSigDTMs = WOMatRec<WO_MAT_SIG_DTM$>
WOMatSigsOrig = WOMatSigs
WOMatSigDTMsOrig = WOMatSigDTMs
InspSig = Record<CLEAN_INSP_INSP_SIG$>
InspSigDTM = Record<CLEAN_INSP_INSP_SIG_DTM$>
CleanSig = Record<CLEAN_INSP_CLEAN_SIG$>
CleanSigDTM = Record<CLEAN_INSP_CLEAN_SIG_DTM$>
ScanSig = Record<CLEAN_INSP_SCAN_SIG$>
ScanSigDTM = Record<CLEAN_INSP_SCAN_SIG_DTM$>
WOMatStage = '1':Stage:'I'
Locate WOMatStage in WOMatSigProf using @VM setting vPos then
WOMatSigs<0, vPos> = InspSig[-1, 'B':@VM]
WOMatSigDTMs<0, vPos> = InspSigDTM[-1, 'B':@VM]
end
WOMatStage = '1':Stage:'C'
Locate WOMatStage in WOMatSigProf using @VM setting vPos then
WOMatSigs<0, vPos> = CleanSig[-1, 'B':@VM]
WOMatSigDTMs<0, vPos> = CleanSigDTM[-1, 'B':@VM]
end
WOMatStage = '1':Stage:'S'
Locate WOMatStage in WOMatSigProf using @VM setting vPos then
WOMatSigs<0, vPos> = ScanSig[-1, 'B':@VM]
WOMatSigDTMs<0, vPos> = ScanSigDTM[-1, 'B':@VM]
end
NumSteps = DCount(WOMatSigProf, @VM)
WOMatSigs = Field(WOMatSigs, @VM, 1, NumSteps)
WOMatSigDTMs = Field(WOMatSigDTMs, @VM, 1, NumSteps)
If WOMatSigs NE WOMatSigsOrig then
Transaction_Services('PostWriteFieldTransaction', 'WO_MAT', WOMatKey, WO_MAT_SIGNATURE$, WOMatSigs)
end
If WOMatSigDTMs NE WOMatSigDTMsOrig then
Transaction_Services('PostWriteFieldTransaction', 'WO_MAT', WOMatKey, WO_MAT_SIG_DTM$, WOMatSigDTMs)
end
end else
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
end
end else
ErrorMsg = 'Error in ':Service:' service. Null WO_MAT_KEY returned for CLEAN_INSP ':CleanInspKey:'.'
end
end
end else
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
end
end else
ErrorMsg = 'Error in ':Service:' service. CLEAN_INSP ':CleanInspKey:' does not exist.'
end
end else
ErrorMsg = 'Error in ':Service:' service. Null CleanInspKey passed into service.'
end
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
end service
Service UpdatePostCISampleQty(CleanInspKey)
ErrorMsg = ''
If CleanInspKey NE '' then
If RowExists('CLEAN_INSP', CleanInspKey) then
Record = Database_Services('ReadDataRow', 'CLEAN_INSP', CleanInspKey)
If Error_Services('NoError') then
Stage = Record<CLEAN_INSP_STAGE$>
If Stage EQ 'LWI' then
RDSNo = Record<CLEAN_INSP_RDS_NO$>
PostCIKey = Xlate('RDS', RDSNo, 'POST_CI_NO', 'X')
If PostCIKey NE '' then
FailedWafers = Record<CLEAN_INSP_FAILED_WAFERS$>
If FailedWafers NE '' then
NewPostSpecSampleQty = Sum(FailedWafers)
PostCIRec = Database_Services('ReadDataRow', 'CLEAN_INSP', PostCIKey)
PostSpecRecipes = PostCIRec<CLEAN_INSP_SPEC_SURFSCAN_RECIPE$>
NumRecipes = DCount(PostSpecRecipes, @VM)
If NumRecipes GT 0 then
UpdatePostRec = False$
For RecipeIndex = 1 to NumRecipes
CurrSpec = PostCIRec<CLEAN_INSP_SPEC_SS_SAMP_QTY$, RecipeIndex>
If ( (CurrSpec EQ '') or (CurrSpec LT NewPostSpecSampleQty) ) then
UpdatePostRec = True$
PostCIRec<CLEAN_INSP_SPEC_SS_SAMP_QTY$, RecipeIndex> = NewPostSpecSampleQty
end
Next RecipeIndex
If UpdatePostRec then
PostCISpecSampQty = PostCIRec<CLEAN_INSP_SPEC_SS_SAMP_QTY$>
Transaction_Services('PostWriteFieldTransaction', 'CLEAN_INSP', PostCIKey, CLEAN_INSP_SPEC_SS_SAMP_QTY$, PostCISpecSampQty)
end
end
end
end
end
end else
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
end
end else
ErrorMsg = 'Error in ':Service:' service. CLEAN_INSP ':CleanInspKey:' does not exist.'
end
end else
ErrorMsg = 'Error in ':Service:' service. Null CleanInspKey passed into service.'
end
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
end service
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@ -0,0 +1,217 @@
Compile function Clean_Services(@Service, @Params)
#pragma precomp SRP_PreCompiler
Declare Function Database_Services, Error_Services, Logging_Services, Datetime
Declare Function RTI_CreateGUID, Tool_Services, SRP_Json, Date_Services
Declare Subroutine Database_Services, Error_Services, Logging_Services, SRP_Json, Lot_Event_Services
$insert LOGICAL
$Insert CLEAN_EQUATES
$Insert LOT_EQUATES
$Insert LOT_OPERATION_EQUATES
$Insert TOOL_EQUATES
$Insert TOOL_CLASS_EQUATES
Options Stage = 'LWI',
GoToService
Return Response or ""
//-----------------------------------------------------------------------------
// SERVICES
//-----------------------------------------------------------------------------
Service CreateNewCleanRecord(LotId, LotOperationId, UserId)
ErrorMessage = ''
CleanRecId = ''
If RowExists('LOT', LotId) then
//ToDo check Lot Operation Exists
//Checks complete, create the CLEAN record
TransDtm = Datetime()
CleanRecId = RTI_CreateGUID()
CleanRec = ''
CleanRec<CLEAN_LOT_ID$> = LotId
CleanRec<CLEAN_LOT_OPERATION_ID$> = LotOperationId
CleanRec<CLEAN_CLEAN_START_DTM$> = TransDtm
CleanRec<CLEAN_CLEAN_START_USER_ID$> = UserId
Database_Services('WriteDataRow', 'CLEAN', CleanRecId, CleanRec)
If Error_Services('NoError') then
If LotOperationId NE '' then
LotOperationRec = Database_Services('ReadDataRow', 'LOT_OPERATION', LotOperationId, True$, 0, False$)
LotOperationRec<LOT_OPERATION_CLEAN_ID$> = CleanRecId
Database_Services('WriteDataRow', 'LOT_OPERATION', LotOperationId, LotOperationRec)
If Error_Services('NoError') then
Lot_Event_Services('CreateLotEvent', LotId, TransDtm, 'CLEAN_START', 'Created clean record.', '', UserId)
end else
ErrorMessage = Error_Services('GetMessage')
end
end
end else
ErrorMessage = Error_Services('GetMessage')
end
end else
//Todo add error message
end
If ErrorMessage EQ '' then
Response = CleanRecId
end else
// Todo: Add logging
ErrorMessage = 'Error Creating a new clean record: ' : ErrorMessage
Error_Services('Add', ErrorMessage)
end
End Service
Service ConvertCleanRecToJson(CleanRecId)
ErrorMessage = ''
CleanRecJson = ''
If RowExists('CLEAN', CleanRecId) then
CleanRec = Database_Services('ReadDataRow', 'CLEAN', CleanRecId, True$, 0, False$)
If Error_Services('NoError') then
objJson = ''
If SRP_Json(objJson, 'New', 'Object') then
SRP_Json(objJson, 'SetValue', 'CleanId', CleanRecId, 'String')
SRP_Json(objJson, 'SetValue', 'LotId', CleanRec<CLEAN_LOT_ID$>, 'String')
LegacyLotId = Database_Services('ReadDataColumn', 'LOT', CleanRec<CLEAN_LOT_ID$>, LOT_LEGACY_LOT_ID$)
SRP_Json(objJson, 'SetValue', 'LegacyLotId', LegacyLotId, 'String')
SRP_Json(objJson, 'SetValue', 'Recipe', CleanRec<CLEAN_RECIPE$>, 'String')
SRP_Json(objJson, 'SetValue', 'Tool', CleanRec<CLEAN_TOOL$>, 'String')
SRP_Json(objJson, 'SetValue', 'StartUser', CleanRec<CLEAN_CLEAN_START_USER_ID$>, 'String')
StartDtm = Date_Services('ConvertDateTimeToISO8601', CleanRec<CLEAN_CLEAN_START_DTM$>)
if StartDtm NE '' then
SRP_Json(objJson, 'SetValue', 'StartDtm', StartDtm)
end
SRP_Json(objJson, 'SetValue', 'StopUser', CleanRec<CLEAN_CLEAN_STOP_USER_ID$>, 'String')
StopDtm = Date_Services('ConvertDateTimeToISO8601', CleanRec<CLEAN_CLEAN_STOP_DTM$>)
if StopDtm NE '' then
SRP_Json(objJson, 'SetValue', 'StopDtm', StopDtm, 'String')
end
SRP_Json(objJson, 'SetValue', 'LotOperationId', CleanRec<CLEAN_LOT_OPERATION_ID$>, 'String')
CleanRecJson = SRP_Json(objJson, 'Stringify', 'Styled')
SRP_Json(objJson, 'Release')
end else
ErrorMessage = 'Error creating clean record json'
end
end else
ErrorMessage = Error_Services('GetMessage')
end
end else
ErrorMessage = 'Clean record not found.'
end
If ErrorMessage EQ '' then
Response = CleanRecJson
end else
Error_Services('Add', 'Error getting clean record : ' : ErrorMessage)
end
end service
Service MarkCleanRecComplete(CleanRecId, CleanRecipe, CleanTool, CleanUser)
ErrorMessage = ''
TransDtm = Datetime()
If RowExists('CLEAN', CleanRecId) then
CleanRec = Database_Services('ReadDataRow', 'CLEAN', CleanRecId, True$, 0, False$)
If CleanRec<CLEAN_CLEAN_START_DTM$> NE '' then
If CleanRec<CLEAN_TOOL$> EQ '' AND CleanRec<CLEAN_RECIPE$> EQ '' then
if RowExists('LSL_USERS', CleanUser) then
If CleanRec<CLEAN_COMPLETE_DTM$> EQ '' then
CleanRec<CLEAN_TOOL$> = CleanTool
CleanRec<CLEAN_RECIPE$> = CleanRecipe
CleanRec<CLEAN_CLEAN_STOP_USER_ID$> = CleanUser
CleanRec<CLEAN_CLEAN_STOP_DTM$> = TransDtm
Database_Services('WriteDataRow', 'CLEAN', CleanRecId, CleanRec)
If Error_Services('NoError') then
LotId = CleanRec<CLEAN_LOT_ID$>
Lot_Event_Services('CreateLotEvent', LotId, TransDtm, 'CLEAN', 'Clean completed', CleanTool, CleanUser)
end else
ErrorMessage = Error_Services('GetMessage')
end
end else
ErrorMessage = 'Clean is already signed off.'
end
end else
ErrorMessage = 'Clean tool or clean recipe is missing.'
end
end else
ErrorMessage = 'Clean has already been logged.'
end
end else
ErrorMessage = 'Clean has not been started.'
end
end else
ErrorMessage = 'Clean record not found.'
end
If ErrorMessage NE '' then
Error_Services('Add', ErrorMessage)
end
end service
Service ValidateCleanRecord(CleanRecId)
//ErrorMessage = ''
CleanRecValid = False$
* If CleanRecId NE '' then
* If RowExists('CLEAN', CleanRecId) then
* CleanRec = Database_Services('ReadDataRow', 'CLEAN', CleanRecId, True$, 0, False$)
* SpecTool = CleanRec<CLEAN_TOOL$>
* ToolUsed = CleanRec<CLEAN_RECIPE$>
* If ToolUsed EQ SpecTool AND ToolUsed NE '' then
* SpecRecipe = CleanRec<CLEAN_SPEC_RECIPE$>
* RecipeUsed = CleanRec<CLEAN_RECIPE$>
* If RecipeUsed EQ SpecRecipe AND RecipeUsed NE '' then
* CleanRecValid = True$
* end
* end
* end else
* ErrorMessage = 'Clean record not found in CLEAN database.'
* end
* end else
* ErrorMessage = 'Clean ID was null.'
* end
*
* If ErrorMessage EQ '' then
* Response = CleanRecValid
* end else
* // Todo: Add logging
* ErrorMessage = 'Error validating clean record: ' : ErrorMessage
* Error_Services('Add', ErrorMessage)
* end
Response = CleanRecValid
End Service
Service GetCleanToolOptions(CleanRecId)
If RowExists('CLEAN', CleanRecId) then
CleanTools = Database_Services('ReadDataColumn', 'CLEAN', CleanRecId, CLEAN_SPEC_CLEAN_TOOL$, True$, 0, False$)
end else
CleanTools = Tool_Services('GetTools', 'AKRION')
end
Response = CleanTools
end service
Service GetCleanRecipeOptions(CleanRecId)
If RowExists('CLEAN', CleanRecId) then
Recipes = Database_Services('ReadDataColumn', 'CLEAN', CleanRecId, CLEAN_SPEC_CLEAN_RECIPE$, True$, 0, False$)
end else
//Todo: Make this smarter, so as to block out pre-epi recipes
Recipes = XLATE('TOOL_CLASS','AKRION',TOOL_CLASS_RECIPES$,'X')
end
Response = Recipes
end service

View File

@ -6,17 +6,22 @@ COMPILE FUNCTION Comm_Dialog_Cass_Met_Export(Method, Parm1)
10/28/2005 - John C. Henry, J.C. Henry & Co., Inc.
*/
DECLARE SUBROUTINE Set_Property, End_Dialog, Send_Event, Set_Status, ErrMsg
DECLARE SUBROUTINE obj_Appwindow, Start_Window, Btree.Extract, Msg, Send_Info
$INSERT LOGICAL
$INSERT WM_OUT_EQUATES
$INSERT PS_EQUATES
$INSERT POPUP_EQUATES
$INSERT MSG_EQUATES
DECLARE SUBROUTINE Set_Property, End_Dialog, Send_Event, Set_Status, ErrMsg, Btree.Extract, Msg, Send_Info
DECLARE SUBROUTINE obj_Appwindow, Start_Window
DECLARE FUNCTION Get_Property, Get_Status, Dialog_Box, Utility, Send_Message, Popup, Collect.IXVals, Msg
DECLARE FUNCTION SRP_Array
EQU CRLF$ TO \0D0A\
EQU COL$CUST_NO TO 1 ;* Customer edit table column equates
EQU COL$CUST_NAME TO 2
EQU LTGREY$ TO 229 + (229*256) + (229*65536) ;* JCH standard colors for edittable backgrounds
EQU GREY$ TO 192 + (192*256) + (192*65536)
EQU GREEN$ TO 192 + (220*256) + (192*65536)
@ -30,11 +35,6 @@ EQU PURPLE$ TO 225 + (181*256) + (255*65536)
EQU DTS_MULTIROW$ TO 512
EQU DTS_LARGEDATA$ TO 4096
$INSERT WM_OUT_EQUATES
$INSERT PS_EQUATES
$INSERT POPUP_EQUATES
$INSERT MSG_EQUATES
ErrTitle = 'Error in Comm_Dialog_Order_Find'
ErrorMsg = ''
@ -66,12 +66,9 @@ RETURN Result
Create:
* * * * * * *
obj_AppWindow('Create')
Set_Property(@WINDOW,'STATUSLINE',@WINDOW:'.STATUSLINE_FIX')
GOSUB Refresh
obj_AppWindow('Create')
Set_Property(@WINDOW,'STATUSLINE',@WINDOW:'.STATUSLINE_FIX')
GOSUB Refresh
RETURN
@ -80,9 +77,8 @@ RETURN
Refresh:
* * * * * * *
* Turn edit table symbolic column backgrounds to green
stat = Send_Message(@WINDOW:'.CUST_INFO','COLOR_BY_POS',COL$CUST_NAME,0,GREEN$) ;* Turn names column all rows green
* Turn edit table symbolic column backgrounds to green
stat = Send_Message(@WINDOW:'.CUST_INFO','COLOR_BY_POS',COL$CUST_NAME,0,GREEN$)
RETURN
@ -91,25 +87,19 @@ RETURN
CustChar:
* * * * * * *
CtrlName = @WINDOW:'.CUST_INFO'
CustArray = Get_Property(CtrlName,'ARRAY') ;* Customer Information table
CurrPos = Get_Property(CtrlName,'SELPOS')
CurrRow = CurrPos<2>
DataIn = CustArray<COL$CUST_NO,CurrRow>
IF LEN(DataIn) > 2 THEN
CtrlName = @WINDOW:'.CUST_INFO'
CustArray = Get_Property(CtrlName,'ARRAY') ;* Customer Information table
CurrPos = Get_Property(CtrlName,'SELPOS')
CurrRow = CurrPos<2>
DataIn = CustArray<COL$CUST_NO,CurrRow>
IF LEN(DataIn) > 2 THEN
ReturnToCtrl = CtrlName
ReturnToPos = CurrPos
IF NOT(NUM(DataIn)) THEN
Set_Property(CtrlName,'CELLPOS','',CurrPos) ;* Clear characters input
Start_Window('COMP_LOOKUP',@WINDOW,DataIn:@VM:'C':@FM:ReturnToCtrl:@FM:ReturnToPos,'','')
END
END
END
RETURN
@ -118,18 +108,15 @@ RETURN
CustPC:
* * * * * * *
CtrlName = @WINDOW:'.CUST_INFO'
CustList = Get_Property(CtrlName,'LIST') ;* Customer Information table
CurrPos = Get_Property(CtrlName,'SELPOS')
CurrCol = CurrPos<1>
CurrRow = CurrPos<2>
CustNo = CustList<CurrRow,COL$CUST_NO>
IF CustNo NE '' THEN
CtrlName = @WINDOW:'.CUST_INFO'
CustList = Get_Property(CtrlName,'LIST') ;* Customer Information table
CurrPos = Get_Property(CtrlName,'SELPOS')
CurrCol = CurrPos<1>
CurrRow = CurrPos<2>
CustNo = CustList<CurrRow,COL$CUST_NO>
IF CustNo NE '' THEN
Set_Property(CtrlName,'CELLPOS',XLATE('COMPANY',CustNo,4,'X'),COL$CUST_NAME:@FM:CurrRow)
END
END
RETURN
@ -138,17 +125,14 @@ RETURN
CustDC:
* * * * * * *
CtrlName = @WINDOW:'.CUST_INFO'
CustList = Get_Property(CtrlName,'LIST') ;* Customer Information table
CurrPos = Get_Property(CtrlName,'SELPOS')
CurrCol = CurrPos<1>
CurrRow = CurrPos<2>
CustNo = CustList<CurrRow,COL$CUST_NO>
LineCnt = COUNT(CustList,@FM) + (CustList NE '')
IF CustNo = '' THEN
CtrlName = @WINDOW:'.CUST_INFO'
CustList = Get_Property(CtrlName,'LIST') ;* Customer Information table
CurrPos = Get_Property(CtrlName,'SELPOS')
CurrCol = CurrPos<1>
CurrRow = CurrPos<2>
CustNo = CustList<CurrRow,COL$CUST_NO>
LineCnt = COUNT(CustList,@FM) + (CustList NE '')
IF CustNo = '' THEN
CustNos = Popup(@WINDOW,'','CUSTOMER')
CustCnt = COUNT(CustNos,@VM) + (CustNos NE '')
IF CustCnt > LineCnt THEN
@ -156,7 +140,6 @@ IF CustNo = '' THEN
stat = Send_Message(CtrlName,'INSERT',-1,@VM:@FM) ; * Add blank lines
NEXT I
END
FOR I = CurrRow TO CurrRow + CustCnt
CustNo = CustNos<1,I>
CustName = XLATE('COMPANY',CustNo,4,'X')
@ -164,10 +147,10 @@ IF CustNo = '' THEN
Set_Property(CtrlName,'CELLPOS',CustName,COL$CUST_NAME:@FM:I)
Set_Property(CtrlName,'SELPOS',COL$CUST_NO:@FM:I+1)
NEXT I
END ELSE
END ELSE
ErrMsg('DoubleClick on the first empty Cust No field to view a popup of all Customers')
END
END
RETURN
@ -175,79 +158,52 @@ RETURN
SubPNDC:
* * * * * * *
CustArray = Get_Property(@WINDOW:'.CUST_INFO','ARRAY')<COL$CUST_NO>
CustNos = CustArray<COL$CUST_NO>
LOOP
CustArray = Get_Property(@WINDOW:'.CUST_INFO','ARRAY')<COL$CUST_NO>
CustNos = CustArray<COL$CUST_NO>
LOOP
LastCustNo = CustNos[-1,'B':@VM]
UNTIL LastCustNo NE '' OR CustNos = ''
CustNos[COL1(),99] = '' ;* Trim trailing blanks
REPEAT
IF CustNos = '' THEN RETURN
* display the processing message and do the processing
Def = ""
Def<MTEXT$> = "Selecting Substrate Part Numbers..."
Def<MTYPE$> = "U"
MsgUp = Msg(@window, Def)
OPEN 'DICT.WO_LOG' TO DictVar THEN
UNTIL LastCustNo NE '' OR CustNos = ''
CustNos[COL1(),99] = ''
REPEAT
IF CustNos NE '' then
OPEN 'DICT.WO_LOG' TO DictVar THEN
SearchString = 'CUST_NO':@VM:CustNos:@VM:@FM
SearchString := 'SUB_PART_NO':@VM:'#':@FM
SearchString := 'ORD_SUB_PART_NO':@VM:'#':@FM
Btree.Extract(SearchString, 'WO_LOG', DictVar, WOKeys, '', Flag)
IF Get_Status(errCode) THEN
Msg(@WINDOW,MsgUp)
ErrMsg(errCode)
RETURN
END
IF WOKeys NE '' THEN
RawPartNos = XLATE('WO_LOG',WOKeys,'SUB_PART_NO','X') ;* Calculated field
IF Get_Status(errCode) THEN DEBUG
IF Not(Get_Status(errCode)) THEN
PartNos = ''
IF WOKeys NE '' THEN
RawPartNos = XLATE('WO_LOG',WOKeys,'ORD_SUB_PART_NO','X')
IF Get_Status(errCode) THEN ErrMsg(errCode)
FOR I = 1 TO COUNT(RawPartNos,@VM) + (RawPartNos NE '')
RawPartNo = RawPartNos<1,I>
LOCATE RawPartNo IN PartNos BY 'AL' USING @VM SETTING Pos ELSE
PartNos = INSERT(PartNos,1,Pos,0,RawPartNo)
END
NEXT I
END ELSE
PartNos = ''
END
Msg(@WINDOW,MsgUp)
IF PartNos = '' THEN
ErrMsg('No Substrate Part Numbers on file for specified customer.')
RETURN
END
IF PartNos NE '' THEN
PartNos := @VM
CONVERT @VM TO @RM IN PartNos
CALL V119('S','','D','R',PartNos,'')
IF Get_Status(errCode) THEN DEBUG
IF Get_Status(errCode) THEN ErrMsg(errCode)
CONVERT @RM TO @VM IN PartNos
PartNos[-1,1] = '' ;* Strip trailing delimiter
PartNos[-1,1] = ''
TypeOver = ''
TypeOver<PDISPLAY$> = PartNos
PartNos = Popup(@WINDow,TypeOver,'CUST_PO') ;****** Need a popup
IF Get_Status(errCode) THEN DEBUG
IF PartNos NE '' THEN
Set_Property(@WINDOW:'.SUB_PART_NO','DEFPROP',PartNos)
END
END ELSE
ErrMsg('Unable to open DICT.WO_LOG in COMM_DIALOG_WO_LOG_FIND.')
END
PartNos = Popup(@WINDow,TypeOver,'CUST_PO')
IF Get_Status(errCode) THEN ErrMsg(errCode)
IF PartNos NE '' THEN Set_Property(@WINDOW:'.SUB_PART_NO','DEFPROP',PartNos)
END else
ErrMsg('No Substrate Part Numbers on file for specified customer.')
end
end else
ErrMsg(errCode)
end
end else
ErrMsg('Unable to open DICT.WO_LOG in COMM_DIALOG_CASS_MET_EXPORT.')
end
end
RETURN
@ -256,172 +212,144 @@ RETURN
LotNoDC:
* * * * * * *
CustNos = Get_Property(@WINDOW:'.CUST_INFO','ARRAY')<COL$CUST_NO>
LOOP
LastCustNo = CustNos[-1,'B':@VM]
UNTIL LastCustNo NE '' OR CustNos = ''
CustNos[COL1(),99] = '' ;* Trim trailing blanks
REPEAT
IF CustNos = '' THEN RETURN
* display the processing message and do the processing
Def = ""
Def<MTEXT$> = "Selecting Lot Numbers..."
Def<MTYPE$> = "U"
MsgUp = Msg(@window, Def)
OPEN 'DICT.WO_LOG' TO DictVar THEN
SearchString = 'CUST_NO':@VM:CustNos:@VM:@FM
SearchString := 'LOT_NO':@VM:'#':@FM
Btree.Extract(SearchString, 'WO_LOG', DictVar, WOKeys, '', Flag)
IF Get_Status(errCode) THEN
Msg(@WINDOW,MsgUp)
ErrMsg(errCode)
RETURN
END
IF WOKeys NE '' THEN
RawLotNos = XLATE('WO_LOG',WOKeys,'LOT_NO','X') ;* Calculated field
IF Get_Status(errCode) THEN DEBUG
LotNos = ''
WOKeys = ''
CustNos = Get_Property(@WINDOW:'.CUST_INFO','ARRAY')<COL$CUST_NO>
CustNos = SRP_Array('Clean', CustNos, 'TrimAndMakeUnique', @VM)
IF CustNos NE '' then
OPEN 'DICT.WO_LOG' TO DictVar THEN
SearchString = 'CUST_NO':@VM:CustNos:@VM:@FM
Btree.Extract(SearchString, 'WO_LOG', DictVar, WOKeys, '', Flag)
IF Not(Get_Status(errCode)) THEN
Query = 'LOT_NO':@VM:'#':@FM
dWoMat = ''
WOMatWONos = ''
Open 'DICT.WO_MAT' to dWoMat then
Flag = ''
WOMatKeys = ''
Btree.Extract(Query, 'WO_MAT', dWoMat, WOMatKeys, 'E', Flag)
If Not(Get_status(errCode)) then
If WOMatKeys NE '' then
WOMatWONos = SRP_Array('Rotate', WOMatKeys, @VM, '*')
WOMatWONos = Delete(WOMatWONos, 0, 2, 0)
Convert '*' to @VM in WOMatWONos
WOMatWONos = SRP_Array('Clean', WOMatWONos, 'TrimAndMakeUnique', @VM)
WOKeys = SRP_Array('Join', WOKeys, WOMatWONos, 'OR', @VM)
end
end else
ErrMsg('Error querying LOT_NO field of the WO_MAT table.')
end
end else
ErrMsg('Error opening DICT.WO_MAT table in order to query on LOT_NO field')
end
end else
ErrMsg(errCode)
end
IF WOKeys NE '' THEN
RawLotNos = XLATE('WO_LOG',WOKeys,'LOT_NO','X')
IF Get_Status(errCode) THEN ErrMsg(errCode)
FOR I = 1 TO COUNT(RawLotNos,@VM) + (RawLotNos NE '')
RawLotNo = RawLotNos<1,I>
LOCATE RawLotNo IN LotNos BY 'AL' USING @VM SETTING Pos ELSE
LotNos = INSERT(LotNos,1,Pos,0,RawLotNo)
END
NEXT I
END ELSE
LotNos = ''
END
Msg(@WINDOW,MsgUp)
IF LotNos = '' THEN
ErrMsg('No Lot Numbers on file for specified customer.')
RETURN
END
IF LotNos NE '' THEN
LotNos := @VM
CONVERT @VM TO @RM IN LotNos
CALL V119('S','','D','R',LotNos,'')
IF Get_Status(errCode) THEN DEBUG
IF Get_Status(errCode) THEN ErrMsg(errCode)
CONVERT @RM TO @VM IN LotNos
LotNos[-1,1] = '' ;* Strip trailing delimiter
LotNos[-1,1] = ''
TypeOver = ''
TypeOver<PDISPLAY$> = LotNos
LotNos = Popup(@WINDow,TypeOver,'CUST_PO') ;****** Need a popup
IF Get_Status(errCode) THEN DEBUG
IF LotNos NE '' THEN
Set_Property(@WINDOW:'.LOT_NO','DEFPROP',LotNos)
LotNos = Popup(@WINDow,TypeOver,'CUST_PO')
IF Get_Status(errCode) THEN ErrMsg(errCode)
IF LotNos NE '' THEN Set_Property(@WINDOW:'.LOT_NO','DEFPROP',LotNos)
END else
ErrMsg('No Lot Numbers on file for specified customer.')
end
END ELSE
ErrMsg('Unable to open DICT.WO_LOG in COMM_DIALOG_CASS_MET_EXPORT.')
END
END ELSE
ErrMsg('Unable to open DICT.WO_LOG in COMM_DIALOG_WO_LOG_FIND.')
END
end
RETURN
* * * * * * *
PSNoDC:
* * * * * * *
CustArray = Get_Property(@WINDOW:'.CUST_INFO','ARRAY')
CustNos = CustArray<COL$CUST_NO>
LOOP
LastCustNo = CustNos[-1,'B':@VM]
UNTIL LastCustNo NE '' OR CustNos = ''
CustNos[COL1(),99] = '' ;* Trim trailing blanks
REPEAT
IF CustNos = '' THEN RETURN
* display the processing message and do the processing
Def = ""
Def<MTEXT$> = "Selecting Product Specifications..."
Def<MTYPE$> = "U"
MsgUp = Msg(@window, Def)
OPEN 'DICT.WO_LOG' TO DictVar THEN
SearchString = 'CUST_NO':@VM:CustNos:@VM:@FM
SearchString := 'PS_NO':@VM:'#':@FM
Btree.Extract(SearchString, 'WO_LOG', DictVar, WOKeys, '', Flag)
IF Get_Status(errCode) THEN
Msg(@WINDOW,MsgUp)
ErrMsg(errCode)
RETURN
END
IF WOKeys NE '' THEN
WOKeys = ''
PSNs = ''
CustArray = Get_Property(@WINDOW:'.CUST_INFO','ARRAY')
CustNos = CustArray<COL$CUST_NO>
CustNos = SRP_Array('Clean', CustNos, 'TrimAndMakeUnique', @VM)
If CustNos NE '' then
OPEN 'DICT.WO_LOG' TO DictVar THEN
SearchString = 'CUST_NO':@VM:CustNos:@VM:@FM
Btree.Extract(SearchString, 'WO_LOG', DictVar, WOKeys, '', Flag)
IF Not(Get_Status(errCode)) THEN
Query = 'PROD_SPEC_ID':@VM:'#':@FM
dWOStep = ''
WOStepWONos = ''
Open 'DICT.WO_STEP' to dWOStep then
Flag = ''
WOStepKeys = ''
Btree.Extract(Query, 'WO_STEP', dWOStep, WOStepKeys, 'E', Flag)
If Not(Get_Status(ErrCode)) then
If WOStepKeys NE '' then
WOStepWONos = SRP_Array('Rotate', WOStepKeys, @VM, '*')
WOStepWONos = Delete(WOStepWONos, 0, 2, 0)
Convert '*' to @VM in WOStepWONos
WOStepWONos = SRP_Array('Clean', WOStepWONos, 'TrimAndMakeUnique', @VM)
WOKeys = SRP_Array('Join', WOKeys, WOStepWONos, 'OR', @VM)
end
end else
ErrorMsg = 'Error querying PROD_SPEC_ID field in WO_STEP table.'
end
end else
ErrorMsg = 'Error opening DICT.WO_STEP table in order to query on PROD_SPEC_ID field. Error code: ':ErrCode
end
END else
ErrMsg(errCode)
end
IF WOKeys NE '' THEN
FOR N = 1 TO COUNT(WOKeys,@VM) + (WOKeys NE '')
WOKey = WOKeys<1,N>
RawPSNs = XLATE('WO_LOG',WOKey,'PS_NO','X')
FOR I = 1 TO COUNT(RawPSNs,@VM) + (RawPSNs NE '')
RawPSN = RawPSNs<1,I>
LOCATE RawPSN IN PSNs BY 'AL' USING @VM SETTING Pos ELSE
PSNs = INSERT(PSNs,1,Pos,0,RawPSN)
END
NEXT I
NEXT N
END ELSE
PSNs = ''
END
Msg(@WINDOW,MsgUp)
IF PSNs = '' THEN
ErrMsg('No Product Specifications on file for specified customer.')
RETURN
END
IF PSNs NE '' THEN
PSNs := @VM
CONVERT @VM TO @RM IN PSNs
CALL V119('S','','D','R',PSNs,'')
IF Get_Status(errCode) THEN DEBUG
IF Get_Status(errCode) THEN ErrMsg(errCode)
CONVERT @RM TO @VM IN PSNs
PSNs[-1,1] = '' ;* Strip trailing delimiter
TypeOver = ''
TypeOver<PDISPLAY$> = PSNs
PSNs = Popup(@WINDow,TypeOver,'CUST_PO')
IF Get_Status(errCode) THEN DEBUG
IF Get_Status(errCode) THEN ErrMsg(errCode)
IF PSNs NE '' THEN
CONVERT @VM TO @FM IN PSNs
Set_Property(@WINDOW:'.PS_NO','LIST',PSNs)
END
END ELSE
END else
ErrMsg('No Product Specifications on file for specified customer.')
end
END ELSE
ErrMsg('Unable to open DICT.WO_LOG in COMM_DIALOG_WO_LOG_FIND.')
END
END
end
RETURN
@ -430,65 +358,43 @@ RETURN
WONoDC:
* * * * * * *
WOKeys = Collect.IXVals('WM_OUT', 'WO_NO')
CONVERT @FM TO @VM IN WOKeys
IF Get_Status(errCode) THEN ErrMsg(ErrCode)
IF WOKeys NE '' THEN
WOKeys = Collect.IXVals('WM_OUT', 'WO_NO')
CONVERT @FM TO @VM IN WOKeys
IF Not(Get_Status(errCode)) THEN
IF WOKeys NE '' THEN
TypeOver = ''
TypeOver<PDISPLAY$> = WOKeys
TypeOver<PMODE$> = 'K'
WOKeys = Popup(@WINDOW,TypeOver,'WO_LOG_QUERY')
IF Get_Status(errCode) THEN
ErrMsg(errCode)
END
IF Not(Get_Status(errCode)) THEN
IF WOKeys NE '' THEN
CONVERT @VM TO @FM IN WOKeys
Set_Property(@WINDOW:'.WO_NO','LIST',WOKeys)
END
END
RETURN
END else
ErrMsg(errCode)
end
END
end else
ErrMsg(ErrCode)
end
RETURN
* * * * * * *
CustPNDC:
* * * * * * *
CustArray = Get_Property(@WINDOW:'.CUST_INFO','ARRAY')
CustNos = CustArray<COL$CUST_NO>
LOOP
LastCustNo = CustNos[-1,'B':@VM]
UNTIL LastCustNo NE '' OR CustNos = ''
CustNos[COL1(),99] = '' ;* Trim trailing blanks
REPEAT
IF CustNos = '' THEN RETURN
* display the processing message and do the processing
Def = ""
Def<MTEXT$> = "Selecting Part Numbers..."
Def<MTYPE$> = "U"
MsgUp = Msg(@window, Def)
OPEN 'DICT.WO_LOG' TO DictVar THEN
CustArray = Get_Property(@WINDOW:'.CUST_INFO','ARRAY')
CustNos = CustArray<COL$CUST_NO>
CustNos = SRP_Array('Clean', CustNos, 'TrimAndMakeUnique', @VM)
IF CustNos NE '' then
OPEN 'DICT.WO_LOG' TO DictVar THEN
SearchString = 'CUST_NO':@VM:CustNos:@VM:@FM
SearchString := 'CUST_PART_NO':@VM:'#':@FM
Btree.Extract(SearchString, 'WO_LOG', DictVar, WOKeys, '', Flag)
IF Get_Status(errCode) THEN
Msg(@WINDOW,MsgUp)
ErrMsg(errCode)
RETURN
END
IF Not(Get_Status(errCode)) THEN
IF WOKeys NE '' THEN
PartNos = ''
FOR N = 1 TO COUNT(WOKeys,@VM) + (WOKeys NE '')
@ -496,64 +402,49 @@ OPEN 'DICT.WO_LOG' TO DictVar THEN
RawPartNos = XLATE('WO_LOG',WOKey,'PART_NO','X')
FOR I = 1 TO COUNT(RawPartNos,@VM) + (RawPartNos NE '')
RawPartNo = RawPartNos<1,I>
LOCATE RawPartNo IN PartNos BY 'AL' USING @VM SETTING Pos ELSE
PartNos = INSERT(PartNos,1,Pos,0,RawPartNo)
END
NEXT I
NEXT N
END ELSE
PartNos = ''
END
Msg(@WINDOW,MsgUp)
IF PartNos = '' THEN
ErrMsg('No Customer Part Numbers on file for specified customer.')
RETURN
END
IF PartNos NE '' THEN
PartNos := @VM
CONVERT @VM TO @RM IN PartNos
CALL V119('S','','D','R',PartNos,'')
IF Get_Status(errCode) THEN DEBUG
IF Get_Status(errCode) THEN ErrMsg(errCode)
CONVERT @RM TO @VM IN PartNos
PartNos[-1,1] = '' ;* Strip trailing delimiter
PartNos[-1,1] = ''
TypeOver = ''
TypeOver<PDISPLAY$> = PartNos
PartNos = Popup(@WINDow,TypeOver,'CUST_PO') ;* Needs a popup
IF Get_Status(errCode) THEN DEBUG
IF PartNos NE '' THEN
Set_Property(@WINDOW:'.CUST_PART_NO','DEFPROP',PartNos)
END
END ELSE
PartNos = Popup(@WINDow,TypeOver,'CUST_PO')
IF Get_Status(errCode) THEN ErrMsg(errCode)
IF PartNos NE '' THEN Set_Property(@WINDOW:'.CUST_PART_NO','DEFPROP',PartNos)
END else
ErrMsg('No Customer Part Numbers on file for specified customer.')
end
END else
ErrMsg(errCode)
end
END ELSE
ErrMsg('Unable to open DICT.WO_LOG in COMM_DIALOG_WO_LOG_FIND.')
END
END
end
RETURN
* * * * * * *
LUDate:
* * * * * * *
ReturnCtrl = Parm1[1,@RM]
IF ReturnCtrl = '' THEN ReturnCtrl = Get_Property(@WINDOW,'FOCUS')
DateSelected = Dialog_Box('POPUP_YEAR',@WINDOW)
RetVal = OCONV(DateSelected, 'D4/')
IF RetVal NE '' THEN
obj_Appwindow('LUValReturn',RetVal:@RM:ReturnCtrl)
END
ReturnCtrl = Parm1[1,@RM]
IF ReturnCtrl = '' THEN ReturnCtrl = Get_Property(@WINDOW,'FOCUS')
DateSelected = Dialog_Box('POPUP_YEAR',@WINDOW)
RetVal = OCONV(DateSelected, 'D4/')
IF RetVal NE '' THEN obj_Appwindow('LUValReturn',RetVal:@RM:ReturnCtrl)
RETURN
@ -565,93 +456,40 @@ Cancel:
RETURN
* * * * * * *
PerformQuery:
* * * * * * *
* Customer numbers *
SearchString = 'MAKEUP_BOX':@VM:'0':@VM:'':@FM
SearchString = 'MAKEUP_BOX':@VM:'0':@VM:'':@FM
CustNos = Get_Property(@WINDOW:'.CUST_INFO','ARRAY')<COL$CUST_NO>
CustNos = SRP_Array('Clean', CustNos, 'TrimAndMakeUnique', @VM)
IF CustNos NE '' THEN SearchString := 'CUST_NO':@VM:CustNos:@FM
CustNos = Get_Property(@WINDOW:'.CUST_INFO','ARRAY')<COL$CUST_NO>
LotNos = Get_Property(@WINDOW:'.LOT_NO','ARRAY')<1>
LotNos = SRP_Array('Clean', LotNos, 'TrimAndMakeUnique', @VM)
IF LotNos NE '' THEN SearchString := 'LOT_NO':@VM:LotNos:@FM
LOOP
LastVar = CustNos[-1,'B':@VM]
UNTIL LastVar NE '' OR CustNos = ''
CustNos[COL1(),99] = '' ;* Trim trailing blanks
REPEAT
CustPNs = Get_Property(@WINDOW:'.CUST_PART_NO','ARRAY')<1>
CustPNs = SRP_Array('Clean', CustPNs, 'TrimAndMakeUnique', @VM)
IF CustPNs NE '' THEN SearchString := 'CUST_PART_NO':@VM:CustPNs:@FM
IF CustNos NE '' THEN SearchString := 'CUST_NO':@VM:CustNos:@FM
SubPartNos = Get_Property(@WINDOW:'.SUB_PART_NO','ARRAY')<1>
SubPartNos = SRP_Array('Clean', SubPartNos, 'TrimAndMakeUnique', @VM)
IF SubPartNos NE '' THEN SearchString := 'SUB_PART_NO':@VM:SubPartNos:@FM
* LotNumbers *
PS_NOs = Get_Property(@WINDOW:'.PS_NO','ARRAY')<1>
PS_NOs = SRP_Array('Clean', PS_NOs, 'TrimAndMakeUnique', @VM)
IF PS_NOs NE '' THEN SearchString := 'SHIP_PSN':@VM:PS_NOs:@FM
LotNos = Get_Property(@WINDOW:'.LOT_NO','ARRAY')<1>
WO_NOs = Get_Property(@WINDOW:'.WO_NO','ARRAY')<1>
WO_NOs = SRP_Array('Clean', WO_NOs, 'TrimAndMakeUnique', @VM)
IF WO_NOs NE '' THEN SearchString := 'WO_NO':@VM:WO_NOs:@FM
LOOP
LastVal = LotNos[-1,'B':@VM]
UNTIL LastVal NE '' OR LotNos = ''
LotNos[COL1(),99] = '' ;* Trim trailing blanks
REPEAT
StartDt = ICONV(Get_Property(@WINDOW:'.START_DT','TEXT'),'D')
EndDt = ICONV(Get_Property(@WINDOW:'.END_DT','TEXT'),'D')
IF LotNos NE '' THEN SearchString := 'LOT_NO':@VM:LotNos:@FM
* Cust Part Number *
CustPNs = Get_Property(@WINDOW:'.CUST_PART_NO','ARRAY')<1>
LOOP
LastVal = CustPNs[-1,'B':@VM]
UNTIL LastVal NE '' OR CustPNs = ''
CustPNS[COL1(),99] = '' ;* Trim trailing blanks
REPEAT
IF CustPNs NE '' THEN SearchString := 'CUST_PART_NO':@VM:CustPNs:@FM
* Substrate Part Numbers *
SubPartNos = Get_Property(@WINDOW:'.SUB_PART_NO','ARRAY')<1>
LOOP
LastVal = SubPartNos[-1,'B':@VM]
UNTIL LastVal NE '' OR SubPartNos = ''
SubPartNos[COL1(),99] = '' ;* Trim trailing blanks
REPEAT
IF SubPartNos NE '' THEN SearchString := 'SUB_PART_NO':@VM:SubPartNos:@FM
* PSN Nos *
PS_NOs = Get_Property(@WINDOW:'.PS_NO','ARRAY')<1>
LOOP
LastVal = PS_NOs[-1,'B':@VM]
UNTIL LastVal NE '' OR PS_NOs = ''
PS_NOs[COL1(),99] = '' ;* Trim trailing blanks
REPEAT
IF PS_NOs NE '' THEN SearchString := 'SHIP_PSN':@VM:PS_NOs:@FM
* WO Nos *
WO_NOs = Get_Property(@WINDOW:'.WO_NO','ARRAY')<1>
LOOP
LastVal = WO_NOs[-1,'B':@VM]
UNTIL LastVal NE '' OR WO_NOs = ''
WO_NOs[COL1(),99] = '' ;* Trim trailing blanks
REPEAT
IF WO_NOs NE '' THEN SearchString := 'WO_NO':@VM:WO_NOs:@FM
* Entry Dates *
StartDt = ICONV(Get_Property(@WINDOW:'.START_DT','TEXT'),'D')
EndDt = ICONV(Get_Property(@WINDOW:'.END_DT','TEXT'),'D')
BEGIN CASE
BEGIN CASE
CASE StartDt NE '' AND EndDt = ''
SearchString := 'RDS_FINAL_SIG_DT':@VM:'>=':OConv(StartDt, 'D4/'):@FM
@ -664,36 +502,21 @@ BEGIN CASE
EndDt += 1
SearchString := 'RDS_FINAL_SIG_DT':@VM:OConv(StartDt, 'D4/'):'~':OConv(EndDt, 'D4/'):@FM
CASE 1
CASE Otherwise$
NULL
END CASE
END CASE
OPEN 'DICT.WO_MAT' TO DictVar THEN
Def = ""
Def<MTEXT$> = "Selecting WO_MAT Recrods..."
Def<MTYPE$> = "U"
* display the processing message and do the processing
MsgUp = Msg(@window, Def)
OPEN 'DICT.WO_MAT' TO DictVar THEN
Btree.Extract(SearchString,'WO_MAT',DictVar,WMOKeys,'',flag)
IF Get_Status(errCode) THEN ErrMsg(errCode)
Msg(@window, MsgUp)
IF Get_Status(errCode) THEN
ErrMsg(errCode)
RETURN
END
IF Not(Get_Status(errCode)) THEN
End_Dialog(@WINDOW,WMOKeys)
END ELSE
end else
ErrMsg(errCode)
end
END ELSE
ErrMsg('Unable to open DICT.WO_MAT in routine COMM_DIALOG_CASS_MET_EXPORT')
END
END
RETURN

View File

@ -556,8 +556,6 @@ UnloadProduct:
Next CassNo
end
RETURN
@ -639,3 +637,4 @@ SlotOverview:
RETURN

View File

@ -1,24 +1,30 @@
COMPILE FUNCTION Comm_Dialog_WO_Find(Method, Parm1)
/*
Commuter module for Dialog_WO_Find window.
01/14/2005 - John C. Henry, J.C. Henry & Co., Inc.
*/
DECLARE SUBROUTINE Set_Property, End_Dialog, Send_Event, Set_Status, ErrMsg
DECLARE SUBROUTINE obj_Appwindow, Start_Window, Btree.Extract, Msg, Send_Info
DECLARE SUBROUTINE Set_Property, End_Dialog, Send_Event, Set_Status, ErrMsg, Btree.Extract, Msg, Send_Info
DECLARE SUBROUTINE obj_Appwindow, Start_Window
DECLARE FUNCTION Get_Property, Get_Status, Dialog_Box, Utility, Send_Message, Popup, Collect.IXVals, Msg
DECLARE FUNCTION SRP_Array
$INSERT LOGICAL
$INSERT PS_EQUATES
$INSERT POPUP_EQUATES
$INSERT MSG_EQUATES
$INSERT WO_LOG_EQUATES
$INSERT WO_STEP_EQUATES
$INSERT WO_MAT_EQUATES
EQU CRLF$ TO \0D0A\
EQU COL$CUST_NO TO 1 ;* Customer edit table column equates
EQU COL$CUST_NAME TO 2
EQU COL$REACT_TYPE TO 1
EQU LTGREY$ TO 229 + (229*256) + (229*65536) ;* JCH standard colors for edittable backgrounds
EQU GREY$ TO 192 + (192*256) + (192*65536)
EQU GREEN$ TO 192 + (220*256) + (192*65536)
@ -32,17 +38,13 @@ EQU PURPLE$ TO 225 + (181*256) + (255*65536)
EQU DTS_MULTIROW$ TO 512
EQU DTS_LARGEDATA$ TO 4096
$INSERT WO_LOG_EQU
$INSERT PS_EQUATES
$INSERT POPUP_EQUATES
$INSERT MSG_EQUATES
ErrTitle = 'Error in Comm_Dialog_Order_Find'
ErrorMsg = ''
Result = ''
BEGIN CASE
CASE Method = 'Create' ; GOSUB Create
CASE Method = 'CustChar' ; GOSUB CustChar
CASE Method = 'CustPC' ; GOSUB CustPC
@ -56,7 +58,7 @@ BEGIN CASE
CASE Method = 'Cancel' ; GOSUB Cancel
CASE Method = 'Refresh' ; GOSUB Refresh
CASE Method = 'PerformQuery' ; GOSUB PerformQuery
CASE 1
CASE Otherwise$
ErrMsg(ErrTitle:@SVM:'Unknown method ':QUOTE(Method):' passed to routine.')
END CASE
@ -68,12 +70,11 @@ RETURN Result
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
@ -82,9 +83,9 @@ RETURN
Refresh:
* * * * * * *
* Turn edit table symbolic column backgrounds to green
* Turn edit table symbolic column backgrounds to green
stat = Send_Message(@WINDOW:'.CUST_INFO','COLOR_BY_POS',COL$CUST_NAME,0,GREEN$) ;* Turn names column all rows green
stat = Send_Message(@WINDOW:'.CUST_INFO','COLOR_BY_POS',COL$CUST_NAME,0,GREEN$) ;* Turn names column all rows green
RETURN
@ -93,25 +94,20 @@ RETURN
CustChar:
* * * * * * *
CtrlName = @WINDOW:'.CUST_INFO'
CustArray = Get_Property(CtrlName,'ARRAY') ;* Customer Information table
CurrPos = Get_Property(CtrlName,'SELPOS')
CurrRow = CurrPos<2>
DataIn = CustArray<COL$CUST_NO,CurrRow>
IF LEN(DataIn) > 2 THEN
CtrlName = @WINDOW:'.CUST_INFO'
CustArray = Get_Property(CtrlName,'ARRAY') ;* Customer Information table
CurrPos = Get_Property(CtrlName,'SELPOS')
CurrRow = CurrPos<2>
DataIn = CustArray<COL$CUST_NO,CurrRow>
IF LEN(DataIn) > 2 THEN
ReturnToCtrl = CtrlName
ReturnToPos = CurrPos
IF NOT(NUM(DataIn)) THEN
Set_Property(CtrlName,'CELLPOS','',CurrPos) ;* Clear characters input
Start_Window('COMP_LOOKUP',@WINDOW,DataIn:@VM:'C':@FM:ReturnToCtrl:@FM:ReturnToPos,'','')
END
END
END
RETURN
@ -120,18 +116,15 @@ RETURN
CustPC:
* * * * * * *
CtrlName = @WINDOW:'.CUST_INFO'
CustList = Get_Property(CtrlName,'LIST') ;* Customer Information table
CurrPos = Get_Property(CtrlName,'SELPOS')
CurrCol = CurrPos<1>
CurrRow = CurrPos<2>
CustNo = CustList<CurrRow,COL$CUST_NO>
IF CustNo NE '' THEN
CtrlName = @WINDOW:'.CUST_INFO'
CustList = Get_Property(CtrlName,'LIST') ;* Customer Information table
CurrPos = Get_Property(CtrlName,'SELPOS')
CurrCol = CurrPos<1>
CurrRow = CurrPos<2>
CustNo = CustList<CurrRow,COL$CUST_NO>
IF CustNo NE '' THEN
Set_Property(CtrlName,'CELLPOS',XLATE('COMPANY',CustNo,4,'X'),COL$CUST_NAME:@FM:CurrRow)
END
END
RETURN
@ -140,17 +133,14 @@ RETURN
CustDC:
* * * * * * *
CtrlName = @WINDOW:'.CUST_INFO'
CustList = Get_Property(CtrlName,'LIST') ;* Customer Information table
CurrPos = Get_Property(CtrlName,'SELPOS')
CurrCol = CurrPos<1>
CurrRow = CurrPos<2>
CustNo = CustList<CurrRow,COL$CUST_NO>
LineCnt = COUNT(CustList,@FM) + (CustList NE '')
IF CustNo = '' THEN
CtrlName = @WINDOW:'.CUST_INFO'
CustList = Get_Property(CtrlName,'LIST') ;* Customer Information table
CurrPos = Get_Property(CtrlName,'SELPOS')
CurrCol = CurrPos<1>
CurrRow = CurrPos<2>
CustNo = CustList<CurrRow,COL$CUST_NO>
LineCnt = COUNT(CustList,@FM) + (CustList NE '')
IF CustNo = '' THEN
CustNos = Popup(@WINDOW,'','CUSTOMER')
CustCnt = COUNT(CustNos,@VM) + (CustNos NE '')
IF CustCnt > LineCnt THEN
@ -167,9 +157,10 @@ IF CustNo = '' THEN
Set_Property(CtrlName,'SELPOS',COL$CUST_NO:@FM:I+1)
NEXT I
END ELSE
END ELSE
ErrMsg('DoubleClick on the first empty Cust No field to view a popup of all Customers')
END
END
RETURN
@ -177,26 +168,23 @@ RETURN
SubPNDC:
* * * * * * *
CustArray = Get_Property(@WINDOW:'.CUST_INFO','ARRAY')<COL$CUST_NO>
CustNos = CustArray<COL$CUST_NO>
LOOP
CustArray = Get_Property(@WINDOW:'.CUST_INFO','ARRAY')<COL$CUST_NO>
CustNos = CustArray<COL$CUST_NO>
LOOP
LastCustNo = CustNos[-1,'B':@VM]
UNTIL LastCustNo NE '' OR CustNos = ''
UNTIL LastCustNo NE '' OR CustNos = ''
CustNos[COL1(),99] = '' ;* Trim trailing blanks
REPEAT
REPEAT
IF CustNos = '' THEN RETURN
IF CustNos = '' THEN RETURN
* display the processing message and do the processing
* display the processing message and do the processing
Def = ""
Def<MTEXT$> = "Selecting Substrate Part Numbers..."
Def<MTYPE$> = "U"
Def = ""
Def<MTEXT$> = "Selecting Substrate Part Numbers..."
Def<MTYPE$> = "U"
MsgUp = Msg(@window, Def)
OPEN 'DICT.WO_LOG' TO DictVar THEN
MsgUp = Msg(@window, Def)
OPEN 'DICT.WO_LOG' TO DictVar THEN
SearchString = 'CUST_NO':@VM:CustNos:@VM:@FM
SearchString := 'SUB_PART_NO':@VM:'#':@FM
@ -209,7 +197,7 @@ OPEN 'DICT.WO_LOG' TO DictVar THEN
IF WOKeys NE '' THEN
RawPartNos = XLATE('WO_LOG',WOKeys,'SUB_PART_NO','X') ;* Calculated field
IF Get_Status(errCode) THEN DEBUG
IF Get_Status(errCode) THEN ErrMsg(errCode)
PartNos = ''
FOR I = 1 TO COUNT(RawPartNos,@VM) + (RawPartNos NE '')
RawPartNo = RawPartNos<1,I>
@ -232,24 +220,22 @@ OPEN 'DICT.WO_LOG' TO DictVar THEN
PartNos := @VM
CONVERT @VM TO @RM IN PartNos
CALL V119('S','','D','R',PartNos,'')
IF Get_Status(errCode) THEN DEBUG
IF Get_Status(errCode) THEN ErrMsg(errCode)
CONVERT @RM TO @VM IN PartNos
PartNos[-1,1] = '' ;* Strip trailing delimiter
TypeOver = ''
TypeOver<PDISPLAY$> = PartNos
PartNos = Popup(@WINDow,TypeOver,'CUST_PO') ;****** Need a popup
IF Get_Status(errCode) THEN DEBUG
IF Get_Status(errCode) THEN ErrMsg(errCode)
IF PartNos NE '' THEN
Set_Property(@WINDOW:'.SUB_PART_NO','DEFPROP',PartNos)
END
END ELSE
END ELSE
ErrMsg('Unable to open DICT.WO_LOG in COMM_DIALOG_WO_LOG_FIND.')
END
END
RETURN
@ -258,25 +244,22 @@ RETURN
LotNoDC:
* * * * * * *
CustNos = Get_Property(@WINDOW:'.CUST_INFO','ARRAY')<COL$CUST_NO>
CustNos = Get_Property(@WINDOW:'.CUST_INFO','ARRAY')<COL$CUST_NO>
LOOP
LOOP
LastCustNo = CustNos[-1,'B':@VM]
UNTIL LastCustNo NE '' OR CustNos = ''
UNTIL LastCustNo NE '' OR CustNos = ''
CustNos[COL1(),99] = '' ;* Trim trailing blanks
REPEAT
REPEAT
IF CustNos = '' THEN RETURN
IF CustNos = '' THEN RETURN
* display the processing message and do the processing
Def = ""
Def<MTEXT$> = "Selecting Lot Numbers..."
Def<MTYPE$> = "U"
* display the processing message and do the processing
Def = ""
Def<MTEXT$> = "Selecting Lot Numbers..."
Def<MTYPE$> = "U"
MsgUp = Msg(@window, Def)
OPEN 'DICT.WO_LOG' TO DictVar THEN
MsgUp = Msg(@window, Def)
OPEN 'DICT.WO_LOG' TO DictVar THEN
SearchString = 'CUST_NO':@VM:CustNos:@VM:@FM
SearchString := 'LOT_NO':@VM:'#':@FM
@ -289,7 +272,7 @@ OPEN 'DICT.WO_LOG' TO DictVar THEN
IF WOKeys NE '' THEN
RawLotNos = XLATE('WO_LOG',WOKeys,'LOT_NO','X') ;* Calculated field
IF Get_Status(errCode) THEN DEBUG
IF Get_Status(errCode) THEN ErrMsg(errCode)
LotNos = ''
FOR I = 1 TO COUNT(RawLotNos,@VM) + (RawLotNos NE '')
RawLotNo = RawLotNos<1,I>
@ -312,57 +295,49 @@ OPEN 'DICT.WO_LOG' TO DictVar THEN
LotNos := @VM
CONVERT @VM TO @RM IN LotNos
CALL V119('S','','D','R',LotNos,'')
IF Get_Status(errCode) THEN DEBUG
IF Get_Status(errCode) THEN ErrMsg(errCode)
CONVERT @RM TO @VM IN LotNos
LotNos[-1,1] = '' ;* Strip trailing delimiter
TypeOver = ''
TypeOver<PDISPLAY$> = LotNos
LotNos = Popup(@WINDow,TypeOver,'CUST_PO') ;****** Need a popup
IF Get_Status(errCode) THEN DEBUG
IF Get_Status(errCode) THEN ErrMsg(errCode)
IF LotNos NE '' THEN
Set_Property(@WINDOW:'.LOT_NO','DEFPROP',LotNos)
END
END ELSE
END ELSE
ErrMsg('Unable to open DICT.WO_LOG in COMM_DIALOG_WO_LOG_FIND.')
END
END
RETURN
* * * * * * *
PSNoDC:
* * * * * * *
CustArray = Get_Property(@WINDOW:'.CUST_INFO','ARRAY')
CustArray = Get_Property(@WINDOW:'.CUST_INFO','ARRAY')
CustNos = CustArray<COL$CUST_NO>
CustNos = CustArray<COL$CUST_NO>
LOOP
LOOP
LastCustNo = CustNos[-1,'B':@VM]
UNTIL LastCustNo NE '' OR CustNos = ''
UNTIL LastCustNo NE '' OR CustNos = ''
CustNos[COL1(),99] = '' ;* Trim trailing blanks
REPEAT
REPEAT
IF CustNos = '' THEN RETURN
IF CustNos = '' THEN RETURN
* display the processing message and do the processing
* display the processing message and do the processing
Def = ""
Def<MTEXT$> = "Selecting Product Specifications..."
Def<MTYPE$> = "U"
Def = ""
Def<MTEXT$> = "Selecting Product Specifications..."
Def<MTYPE$> = "U"
MsgUp = Msg(@window, Def)
OPEN 'DICT.WO_LOG' TO DictVar THEN
MsgUp = Msg(@window, Def)
OPEN 'DICT.WO_LOG' TO DictVar THEN
SearchString = 'CUST_NO':@VM:CustNos:@VM:@FM
SearchString := 'PS_NO':@VM:'#':@FM
@ -405,45 +380,39 @@ OPEN 'DICT.WO_LOG' TO DictVar THEN
PSNs := @VM
CONVERT @VM TO @RM IN PSNs
CALL V119('S','','D','R',PSNs,'')
IF Get_Status(errCode) THEN DEBUG
IF Get_Status(errCode) THEN ErrMsg(errCode)
CONVERT @RM TO @VM IN PSNs
PSNs[-1,1] = '' ;* Strip trailing delimiter
TypeOver = ''
TypeOver<PDISPLAY$> = PSNs
PSNs = Popup(@WINDow,TypeOver,'CUST_PO')
IF Get_Status(errCode) THEN DEBUG
IF Get_Status(errCode) THEN ErrMsg(errCode)
IF PSNs NE '' THEN
CONVERT @VM TO @FM IN PSNs
Set_Property(@WINDOW:'.PS_NO','LIST',PSNs)
END
END ELSE
END ELSE
ErrMsg('Unable to open DICT.WO_LOG in COMM_DIALOG_WO_LOG_FIND.')
END
END
RETURN
* * * * * * *
ReactTypeDC:
* * * * * * *
CtrlName = @WINDOW:'.REACT_TYPE'
RTypeList = Get_Property(CtrlName,'LIST') ;* Customer Information table
CurrPos = Get_Property(CtrlName,'SELPOS')
CurrCol = CurrPos<1>
CurrRow = CurrPos<2>
RType = RTypeList<CurrRow,COL$REACT_TYPE>
LineCnt = COUNT(RTypeList,@FM) + (RTypeList NE '')
IF RType = '' THEN
CtrlName = @WINDOW:'.REACT_TYPE'
RTypeList = Get_Property(CtrlName,'LIST') ;* Customer Information table
CurrPos = Get_Property(CtrlName,'SELPOS')
CurrCol = CurrPos<1>
CurrRow = CurrPos<2>
RType = RTypeList<CurrRow,COL$REACT_TYPE>
LineCnt = COUNT(RTypeList,@FM) + (RTypeList NE '')
IF RType = '' THEN
RTypes = Popup(@WINDOW,'','REACTOR_TYPE')
rCnt = COUNT(RTypes,@VM) + (RTypes NE '')
IF rCnt > LineCnt THEN
@ -454,50 +423,40 @@ IF RType = '' THEN
FOR I = CurrRow TO CurrRow + rCnt
RType = RTypes<1,I>
*CustName = XLATE('COMPANY',CustNo,4,'X')
Set_Property(CtrlName,'CELLPOS',RType,COL$REACT_TYPE:@FM:I)
*Set_Property(CtrlName,'CELLPOS',CustName,COL$CUST_NAME:@FM:I)
*Set_Property(CtrlName,'SELPOS',COL$CUST_NO:@FM:I+1)
NEXT I
END ELSE
END ELSE
ErrMsg('DoubleClick on the first empty Cust No field to view a popup of all Customers')
END
END
RETURN
* * * * * * *
CustPNDC:
* * * * * * *
CustArray = Get_Property(@WINDOW:'.CUST_INFO','ARRAY')
CustArray = Get_Property(@WINDOW:'.CUST_INFO','ARRAY')
CustNos = CustArray<COL$CUST_NO>
CustNos = CustArray<COL$CUST_NO>
LOOP
LOOP
LastCustNo = CustNos[-1,'B':@VM]
UNTIL LastCustNo NE '' OR CustNos = ''
UNTIL LastCustNo NE '' OR CustNos = ''
CustNos[COL1(),99] = '' ;* Trim trailing blanks
REPEAT
REPEAT
IF CustNos = '' THEN RETURN
IF CustNos = '' THEN RETURN
* display the processing message and do the processing
* display the processing message and do the processing
Def = ""
Def<MTEXT$> = "Selecting Part Numbers..."
Def<MTYPE$> = "U"
Def = ""
Def<MTEXT$> = "Selecting Part Numbers..."
Def<MTYPE$> = "U"
MsgUp = Msg(@window, Def)
OPEN 'DICT.WO_LOG' TO DictVar THEN
MsgUp = Msg(@window, Def)
OPEN 'DICT.WO_LOG' TO DictVar THEN
SearchString = 'CUST_NO':@VM:CustNos:@VM:@FM
SearchString := 'CUST_PART_NO':@VM:'#':@FM
@ -520,7 +479,6 @@ OPEN 'DICT.WO_LOG' TO DictVar THEN
PartNos = INSERT(PartNos,1,Pos,0,RawPartNo)
END
NEXT I
NEXT N
END ELSE
PartNos = ''
@ -536,7 +494,7 @@ OPEN 'DICT.WO_LOG' TO DictVar THEN
PartNos := @VM
CONVERT @VM TO @RM IN PartNos
CALL V119('S','','D','R',PartNos,'')
IF Get_Status(errCode) THEN DEBUG
IF Get_Status(errCode) THEN ErrMsg(errCode)
CONVERT @RM TO @VM IN PartNos
PartNos[-1,1] = '' ;* Strip trailing delimiter
@ -544,36 +502,32 @@ OPEN 'DICT.WO_LOG' TO DictVar THEN
TypeOver = ''
TypeOver<PDISPLAY$> = PartNos
PartNos = Popup(@WINDow,TypeOver,'CUST_PO') ;* Needs a popup
IF Get_Status(errCode) THEN DEBUG
IF Get_Status(errCode) THEN ErrMsg(errCode)
IF PartNos NE '' THEN
Set_Property(@WINDOW:'.CUST_PART_NO','DEFPROP',PartNos)
END
END ELSE
END ELSE
ErrMsg('Unable to open DICT.WO_LOG in COMM_DIALOG_WO_LOG_FIND.')
END
END
RETURN
* * * * * * *
LUDate:
* * * * * * *
ReturnCtrl = Parm1[1,@RM]
ReturnCtrl = Parm1[1,@RM]
IF ReturnCtrl = '' THEN ReturnCtrl = Get_Property(@WINDOW,'FOCUS')
IF ReturnCtrl = '' THEN ReturnCtrl = Get_Property(@WINDOW,'FOCUS')
DateSelected = Dialog_Box('POPUP_YEAR',@WINDOW)
RetVal = OCONV(DateSelected, 'D4/')
obj_Appwindow('LUValReturn',RetVal:@RM:ReturnCtrl)
DateSelected = Dialog_Box('POPUP_YEAR',@WINDOW)
RetVal = OCONV(DateSelected, 'D4/')
obj_Appwindow('LUValReturn',RetVal:@RM:ReturnCtrl)
RETURN
@ -585,96 +539,33 @@ Cancel:
RETURN
* * * * * * *
PerformQuery:
* * * * * * *
* Customer numbers *
SearchString = ''
SearchString = ''
CustNos = Get_Property(@WINDOW:'.CUST_INFO','ARRAY')<COL$CUST_NO>
CustNos = SRP_Array('Clean', CustNos, 'TrimAndMakeUnique', @VM)
CustNos = Get_Property(@WINDOW:'.CUST_INFO','ARRAY')<COL$CUST_NO>
IF CustNos NE '' THEN SearchString := 'CUST_NO':@VM:CustNos:@FM
LOOP
LastVar = CustNos[-1,'B':@VM]
UNTIL LastVar NE '' OR CustNos = ''
CustNos[COL1(),99] = '' ;* Trim trailing blanks
REPEAT
CustPNs = Get_Property(@WINDOW:'.CUST_PART_NO','ARRAY')<1>
CustPNs = SRP_Array('Clean', CustPNs, 'TrimAndMakeUnique', @VM)
IF CustPNs NE '' THEN SearchString := 'CUST_PART_NO':@VM:CustPNs:@FM
IF CustNos NE '' THEN SearchString := 'CUST_NO':@VM:CustNos:@FM
SubPartNos = Get_Property(@WINDOW:'.SUB_PART_NO','ARRAY')<1>
SubPartNos = SRP_Array('Clean', SubPartNos, 'TrimAndMakeUnique', @VM)
IF SubPartNos NE '' THEN SearchString := 'ORD_SUB_PART_NO':@VM:SubPartNos:@FM
* LotNumbers *
ReactTypes = Get_Property(@WINDOW:'.REACT_TYPE','ARRAY')<COL$REACT_TYPE>
ReactTypes = SRP_Array('Clean', ReactTypes, 'TrimAndMakeUnique', @VM)
IF ReactTypes NE '' THEN SearchString := 'REACT_TYPE':@VM:ReactTypes:@FM
LotNos = Get_Property(@WINDOW:'.LOT_NO','ARRAY')<1>
StartDt = ICONV(Get_Property(@WINDOW:'.START_DT','TEXT'),'D')
EndDt = ICONV(Get_Property(@WINDOW:'.END_DT','TEXT'),'D')
LOOP
LastVal = LotNos[-1,'B':@VM]
UNTIL LastVal NE '' OR LotNos = ''
LotNos[COL1(),99] = '' ;* Trim trailing blanks
REPEAT
IF LotNos NE '' THEN SearchString := 'LOT_NO':@VM:LotNos:@FM
* Cust Part Number *
CustPNs = Get_Property(@WINDOW:'.CUST_PART_NO','ARRAY')<1>
LOOP
LastVal = CustPNs[-1,'B':@VM]
UNTIL LastVal NE '' OR CustPNs = ''
CustPNS[COL1(),99] = '' ;* Trim trailing blanks
REPEAT
IF CustPNs NE '' THEN SearchString := 'CUST_PART_NO':@VM:CustPNs:@FM
* Substrate Part Numbers *
SubPartNos = Get_Property(@WINDOW:'.SUB_PART_NO','ARRAY')<1>
LOOP
LastVal = SubPartNos[-1,'B':@VM]
UNTIL LastVal NE '' OR SubPartNos = ''
SubPartNos[COL1(),99] = '' ;* Trim trailing blanks
REPEAT
IF SubPartNos NE '' THEN SearchString := 'SUB_PART_NO':@VM:SubPartNos:@FM
* * * * * Reactor Type * * * * *
ReactTypes = Get_Property(@WINDOW:'.REACT_TYPE','ARRAY')<COL$REACT_TYPE>
LOOP
LastVal = ReactTypes[-1,'B':@VM]
UNTIL LastVal NE '' OR ReactTypes = ''
ReactTypes[COL1(),99] = '' ;* Trim trailing blanks
REPEAT
IF ReactTypes NE '' THEN SearchString := 'REACT_TYPE':@VM:ReactTypes:@FM
* PSN Nos *
PS_NOs = Get_Property(@WINDOW:'.PS_NO','ARRAY')<1>
LOOP
LastVal = PS_NOs[-1,'B':@VM]
UNTIL LastVal NE '' OR PS_NOs = ''
PS_NOs[COL1(),99] = '' ;* Trim trailing blanks
REPEAT
IF PS_NOs NE '' THEN SearchString := 'PS_NO':@VM:PS_NOs:@FM
* Entry Dates *
StartDt = ICONV(Get_Property(@WINDOW:'.START_DT','TEXT'),'D')
EndDt = ICONV(Get_Property(@WINDOW:'.END_DT','TEXT'),'D')
BEGIN CASE
BEGIN CASE
CASE StartDt NE '' AND EndDt = ''
SearchString := 'ENTRY_DATE':@VM:'>=':StartDt:@FM
@ -682,73 +573,134 @@ BEGIN CASE
SearchString := 'ENTRY_DATE':@VM:'<=':EndDt:@FM
CASE StartDt NE '' AND EndDt NE ''
* Fudge the dates - '~' is not inclusive of the end dates
// Modify the dates by one day. The '~' operator is not inclusive of the end dates.
StartDt -= 1
EndDt += 1
SearchString := 'ENTRY_DATE':@VM:StartDt:'~':EndDt:@FM
CASE 1
CASE Otherwise$
NULL
END CASE
END CASE
StartDt = ICONV(Get_Property(@WINDOW:'.MTL_RX_START_DT','TEXT'),'D')
EndDt = ICONV(Get_Property(@WINDOW:'.MTL_RX_END_DT','TEXT'),'D')
* RX Dates *
OrdStatus = Get_Property(@WINDOW:'.STATUS','VALUE')
StartDt = ICONV(Get_Property(@WINDOW:'.MTL_RX_START_DT','TEXT'),'D')
EndDt = ICONV(Get_Property(@WINDOW:'.MTL_RX_END_DT','TEXT'),'D')
BEGIN CASE
CASE StartDt NE '' AND EndDt = ''
SearchString := 'RX_DT':@VM:'>=':OConv(StartDt, 'D4/'):@FM
CASE StartDt = '' AND EndDt NE ''
SearchString := 'RX_DT':@VM:'<=':OConv(EndDt, 'D4/'):@FM
CASE StartDt NE '' AND EndDt NE ''
* Fudge the dates - '~' is not inclusive of the end dates
StartDt -= 1
EndDt += 1
SearchString := 'RX_DT':@VM:OConv(StartDt, 'D4/'):'~':OConv(EndDt, 'D4/'):@FM
CASE 1
NULL
END CASE
OrdStatus = Get_Property(@WINDOW:'.STATUS','VALUE')
IF OrdStatus NE 'I' THEN
IF OrdStatus NE 'I' THEN
IF OrdStatus = 1 THEN
SearchString := 'CLOSE_DATE':@VM:'#':@FM
END ELSE
SearchString := 'CLOSE_DATE':@VM:'=':@FM
END
END
OPEN 'DICT.WO_LOG' TO DictVar THEN
Def = ""
Def<MTEXT$> = "Selecting Orders..."
Def<MTYPE$> = "U"
* display the processing message and do the processing
MsgUp = Msg(@window, Def)
Btree.Extract(SearchString,'WO_LOG',DictVar,WOKeys,'',flag)
IF Get_Status(errCode) THEN ErrMsg(errCode)
Msg(@window, MsgUp)
IF Get_Status(errCode) THEN
ErrMsg(errCode)
RETURN
END
End_Dialog(@WINDOW,WOKeys)
WONos = ''
END ELSE
If SearchString NE '' then
OPEN 'DICT.WO_LOG' TO DictVar THEN
Btree.Extract(SearchString,'WO_LOG',DictVar,WOKeys,'',flag)
IF Get_Status(errCode) THEN
ErrorMsg = 'Error querying WO_LOG table with supplied fields.'
end
END ELSE
ErrMsg('Unable to open DICT.WO_LOG in routine COMM_DIALOG_WO_LOG_FIND')
END
END
end
LotNos = Get_Property(@WINDOW:'.LOT_NO','ARRAY')<1>
LotNos = SRP_Array('Clean', LotNos, 'TrimAndMakeUnique', @VM)
If LotNos NE '' then
Query = 'LOT_NO':@VM:LotNos:@FM
dWoMat = ''
WOMatWONos = ''
Open 'DICT.WO_MAT' to dWoMat then
Flag = ''
WOMatKeys = ''
Btree.Extract(Query, 'WO_MAT', dWoMat, WOMatKeys, 'E', Flag)
If Not(Get_status(errCode)) then
If WOMatKeys NE '' then
WOMatWONos = SRP_Array('Rotate', WOMatKeys, @VM, '*')
WOMatWONos = Delete(WOMatWONos, 0, 2, 0)
Convert '*' to @VM in WOMatWONos
WOMatWONos = SRP_Array('Clean', WOMatWONos, 'TrimAndMakeUnique', @VM)
WOKeys = SRP_Array('Join', WOKeys, WOMatWONos, 'OR', @VM)
end
end else
ErrorMsg = 'Error querying LOT_NO field of the WO_MAT table.'
end
end else
ErrorMsg = 'Error opening DICT.WO_MAT table in order to query on LOT_NO field'
end
end
PSNos = Get_Property(@WINDOW:'.PS_NO','ARRAY')<1>
PSNos = SRP_Array('Clean', PSNos, 'TrimAndMakeUnique', @VM)
If PSNos NE '' then
Query = 'PROD_SPEC_ID':@VM:PSNos:@FM
dWOStep = ''
WOStepWONos = ''
Open 'DICT.WO_STEP' to dWOStep then
Flag = ''
WOStepKeys = ''
Btree.Extract(Query, 'WO_STEP', dWOStep, WOStepKeys, 'E', Flag)
If Not(Get_Status(ErrCode)) then
If WOStepKeys NE '' then
WOStepWONos = SRP_Array('Rotate', WOStepKeys, @VM, '*')
WOStepWONos = Delete(WOStepWONos, 0, 2, 0)
Convert '*' to @VM in WOStepWONos
WOStepWONos = SRP_Array('Clean', WOStepWONos, 'TrimAndMakeUnique', @VM)
WOKeys = SRP_Array('Join', WOKeys, WOStepWONos, 'OR', @VM)
end
end else
ErrorMsg = 'Error querying PROD_SPEC_ID field in WO_STEP table.'
end
end else
ErrorMsg = 'Error opening DICT.WO_STEP table in order to query on PROD_SPEC_ID field. Error code: ':ErrCode
end
end
If ( (StartDt NE '') or (EndDt NE '') ) then
Begin Case
Case ( (StartDt NE '') and (EndDt EQ '') )
Query = 'RX_DT':@VM:'>=':OConv(StartDt, 'D4/'):@FM
Case ( (StartDt EQ '') and (EndDt NE '') )
Query = 'RX_DT':@VM:'<=':OConv(EndDt, 'D4/'):@FM
Case ( (StartDt NE '') and (EndDt NE '') )
// Modify the dates by one day. The '~' operator is not inclusive of the end dates.
StartDt -= 1
EndDt += 1
Query = 'RX_DT':@VM:OConv(StartDt, 'D4/'):'~':OConv(EndDt, 'D4/'):@FM
End case
dWOMat = ''
WOMatWONos = ''
Open 'DICT.WO_MAT' to dWOMat then
Flag = ''
WOMatKeys = ''
Btree.Extract(Query, 'WO_MAT', dWOMat, WOMatKeys, 'E', Flag)
If Not(Get_Status(ErrCode)) then
If WOMatKeys NE '' then
WOMatWONos = SRP_Array('Rotate', WOMatKeys, @VM, '*')
WOMatWONos = Delete(WOMatWONos, 0, 2, 0)
Convert '*' to @VM in WOMatWONos
WOMatWONos = SRP_Array('Clean', WOMatWONos, 'TrimAndMakeUnique', @VM)
WOKeys = SRP_Array('Join', WOKeys, WOMatWONos, 'OR', @VM)
end
end else
ErrorMsg = 'Error querying on RX_DT field in WO_MAT table.'
end
end else
ErrorMsg = 'Error opening DICT.WO_MAT table in order to query on RX_DT field.'
end
end
If ErrorMsg EQ '' then
WOKeys = SRP_Array('SortSimpleList', WOKeys, 'DescendingNumbers', @VM)
End_Dialog(@WINDOW,WOKeys)
end else
Msg(@Window, '', 'OK', '', 'Process Error':@FM:ErrorMsg)
end
RETURN

View File

@ -10,11 +10,12 @@ COMPILE FUNCTION Comm_Dialog_WO_Scan(Method, Parm1)
DECLARE SUBROUTINE Set_Property, End_Dialog, Set_Status, ErrMsg, Extract_SI_Keys, Logging_Services
DECLARE SUBROUTINE obj_Appwindow, Start_Window, Msg, Btree.Extract, Error_Services
DECLARE FUNCTION Get_Property, Get_Status, Dialog_Box, Send_Message, Set_FSError, Environment_Services
DECLARE FUNCTION obj_Vendor_Code, Msg, Error_Services, Logging_Services
DECLARE FUNCTION obj_Vendor_Code, Msg, Error_Services, Logging_Services, Error_Services, Service_Services
$INSERT LOGICAL
$INSERT MSG_EQUATES
$INSERT APPCOLORS
$INSERT IFX_EQUATES
EQU CRLF$ TO \0D0A\
@ -31,6 +32,8 @@ EQU CA$SUB_PART_NO TO 5
EQU CA$SCANNED_LOT_QTY TO 6
EQU CA$VERIFY_PART_NO TO 7
EQU CA$SUB_SUPP_BY TO 8
EQU CA$WO_NO TO 9
EQU CA$REC_DTM TO 10
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Receiving'
LogDate = Oconv(Date(), 'D4/')
@ -48,7 +51,6 @@ Result = ''
BEGIN CASE
CASE Method = 'Create' ; GOSUB Create
CASE Method = 'OK' ; GOSUB OK
CASE Method = 'Cancel' ; GOSUB Cancel
CASE Method = 'FieldClick' ; GOSUB FieldClick
CASE Method = 'LQP' ; GOSUB LQP
CASE 1
@ -61,47 +63,47 @@ RETURN Result
Create:
* * * * * * *
VendorDef = Parm1[1,@FM]
VendorDef = Parm1[1,@FM]
CheckArray = FIELD(Parm1,@FM,2,999)
CheckArray = FIELD(Parm1,@FM,2,999)
Set_Property(@WINDOW,'@VENDOR_DEF',VendorDef)
Set_Property(@WINDOW,'@VENDOR_DEF',VendorDef)
OpenQty = CheckArray<CA$LOT_QTY>
Set_Property(@WINDOW:'.OPEN_QTY','TEXT',OCONV(OpenQty,'MD0,')) ;* 12/6/2011 JCH
OpenQty = CheckArray<CA$LOT_QTY>
Set_Property(@WINDOW:'.OPEN_QTY','TEXT',OCONV(OpenQty,'MD0,')) ;* 12/6/2011 JCH
Set_Property(@WINDOW,'@CHECK_ARRAY',CheckArray)
obj_AppWindow('Create')
Set_Property(@WINDOW,'@CHECK_ARRAY',CheckArray)
obj_AppWindow('Create')
TimeStamp = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS')
Set_Property(@WINDOW:'.RX_DTM','DEFPROP',TimeStamp)
Set_Property(@WINDOW,'FOCUS',@WINDOW:'.RX_DTM')
Set_Property(@WINDOW:'.RX_DTM','SELECTION',1:@FM:65534)
TimeStamp = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS')
Set_Property(@WINDOW:'.RX_DTM','DEFPROP',TimeStamp)
Set_Property(@WINDOW,'FOCUS',@WINDOW:'.RX_DTM')
Set_Property(@WINDOW:'.RX_DTM','SELECTION',1:@FM:65534)
GOSUB Refresh
GOSUB Refresh
* * * * * * *
FieldClick:
* * * * * * *
CtrlEntID = @WINDOW:'.FIELD_RADIO'
CtrlEntID = @WINDOW:'.FIELD_RADIO'
ControlSelection = Get_Property(CtrlEntID,'VALUE')
ControlSelection = Get_Property(CtrlEntID,'VALUE')
Ctrls = @WINDOW:'.LOT_QTY':@RM ; Props = 'VISIBLE':@RM
Ctrls := @WINDOW:'.LOT_QTY_PART':@RM ; Props := 'VISIBLE':@RM
Ctrls := @WINDOW:'.LOT_QTY_SUB_PART':@RM ; Props := 'VISIBLE':@RM
Ctrls := @WINDOW:'.WINDOW_LABEL_FIX' ; Props := 'TEXT'
Ctrls = @WINDOW:'.LOT_QTY':@RM ; Props = 'VISIBLE':@RM
Ctrls := @WINDOW:'.LOT_QTY_PART':@RM ; Props := 'VISIBLE':@RM
Ctrls := @WINDOW:'.LOT_QTY_SUB_PART':@RM ; Props := 'VISIBLE':@RM
Ctrls := @WINDOW:'.WINDOW_LABEL_FIX' ; Props := 'TEXT'
BEGIN CASE
BEGIN CASE
CASE ControlSelection = 'LQ' ; Vals = '1':@RM:'0':@RM:'0':@RM:'Customer Wafers'
CASE ControlSelection = 'LQP' ; Vals = '0':@RM:'1':@RM:'0':@RM:'Customer Wafers'
CASE ControlSelection = 'LQSP' ; Vals = '0':@RM:'0':@RM:'1':@RM:'Substrates'
END CASE
END CASE
Set_Property(Ctrls,Props,Vals)
Set_Property(Ctrls,Props,Vals)
RETURN
@ -109,11 +111,15 @@ RETURN
Close:
* * * * * * *
* * * * * * *
Cancel:
* * * * * * *
ProcIds = Get_Property(@Window, '@PROC_IDS')
End_Dialog(@WINDOW,'Cancel')
If ProcIds NE '' then
Response = ProcIds
end else
Response = 'Cancel'
end
End_Dialog(@WINDOW,Response)
RETURN
@ -122,46 +128,47 @@ RETURN
Refresh:
* * * * * * *
ListArray = Get_Property(CtrlEntId,'ARRAY')
CheckArray = Get_Property(@WINDOW,'@CHECK_ARRAY')
TotalScannedQty = SUM(ListArray<COL$LQP_QTY>)
OpenQty = CheckArray<CA$LOT_QTY>
ListArray = Get_Property(CtrlEntId,'ARRAY')
CheckArray = Get_Property(@WINDOW,'@CHECK_ARRAY')
TotalScannedQty = SUM(ListArray<COL$LQP_QTY>)
OpenQty = CheckArray<CA$LOT_QTY>
Set_Property(@WINDOW:'.SCANNED_QTY','TEXT',OCONV(TotalScannedQty,'MD0,'))
Set_Property(@WINDOW:'.SCANNED_QTY','TEXT',OCONV(TotalScannedQty,'MD0,'))
IF TotalScannedQty < OpenQty THEN
IF TotalScannedQty < OpenQty THEN
Set_Property(@WINDOW:'.SCANNED_QTY','BACKCOLOR',GREEN$)
END ELSE
END ELSE
Set_Property(@WINDOW:'.SCANNED_QTY','BACKCOLOR',RED$)
END
END
RETURN
* * * * * * *
LQP:
* * * * * * *
CtrlEntID = Get_Property(@WINDOW,'FOCUS')
StripANSI = Get_Property(@WINDOW:'.STRIP_ANSI','CHECK')
SkipSubANSI = Get_Property(@WINDOW:'.SKIP_SUBSTRATE_ANSI','CHECK')
CtrlEntID = Get_Property(@WINDOW,'FOCUS')
StripANSI = Get_Property(@WINDOW:'.STRIP_ANSI','CHECK')
SkipSubANSI = Get_Property(@WINDOW:'.SKIP_SUBSTRATE_ANSI','CHECK')
CheckArray = Get_Property(@WINDOW,'@CHECK_ARRAY')
CheckArray = Get_Property(@WINDOW,'@CHECK_ARRAY')
BEGIN CASE
BEGIN CASE
CASE CtrlEntID = @WINDOW:'.LOT_QTY' ; ColCnt = 2
CASE CtrlEntID = @WINDOW:'.LOT_QTY_PART' ; ColCnt = 3
CASE CtrlEntID = @WINDOW:'.LOT_QTY_SUB_PART' ; ColCnt = 4
END CASE
END CASE
PrevSelPos = Get_Property(CtrlEntId,"PREVSELPOS")
PrevCol = PrevSelPos<1>
PrevRow = PrevSelPos<2>
CurrPos = Get_Property(CtrlEntId,'SELPOS')
CurrCol = CurrPos<1>
CurrRow = CurrPos<2>
ListData = Get_Property(CtrlEntId,'LIST')
PrevSelPos = Get_Property(CtrlEntId,"PREVSELPOS")
PrevCol = PrevSelPos<1>
PrevRow = PrevSelPos<2>
CurrPos = Get_Property(CtrlEntId,'SELPOS')
CurrCol = CurrPos<1>
CurrRow = CurrPos<2>
ListData = Get_Property(CtrlEntId,'LIST')
IF ListData<CurrRow,CurrCol> = '' THEN
IF ListData<CurrRow,CurrCol> = '' THEN
ColPointer = CurrCol
LinePointer = CurrRow
@ -188,20 +195,20 @@ IF ListData<CurrRow,CurrCol> = '' THEN
ColPointer += 1
END CASE
Set_Property(CtrlEntId,"SELPOS",ColPointer:@FM:LinePointer)
END
END
// Global scan validation check. Only alpha-numeric, dashes, spaces, and periods permitted.
ValidationScan = Trim(ListData<PrevRow,PrevCol>)
Convert @Lower_Case to @Upper_Case in ValidationScan
Convert 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789- ./' to '' in ValidationScan
//DPC 2/18/20 - changed validation to allow foward slash per supplier lot naming (Global Wafer)
//FYI - conversion would only work when separated from above line
Convert '/' to '' in ValidationScan
If ValidationScan NE '' then
// Global scan validation check. Only alpha-numeric, dashes, spaces, and periods permitted.
ValidationScan = Trim(ListData<PrevRow,PrevCol>)
Convert @Lower_Case to @Upper_Case in ValidationScan
Convert 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789- ./' to '' in ValidationScan
//DPC 2/18/20 - changed validation to allow foward slash per supplier lot naming (Global Wafer)
//FYI - conversion would only work when separated from above line
Convert '/' to '' in ValidationScan
If ValidationScan NE '' then
Error_Services('Set', 'Scanned code ' : Quote(Trim(ListData<PrevRow,PrevCol>)) : ' contains an invalid character. Please re-scan.')
end
end
If Error_Services('NoError') then
If Error_Services('NoError') then
IF ListData<PrevRow,PrevCol> NE '' THEN
BEGIN CASE
CASE PrevCol = COL$LQP_LOT
@ -356,7 +363,23 @@ If Error_Services('NoError') then
IF VendCode NE ExpectedCode AND ExpectedCode NE '' THEN
void = Msg(@WINDOW,'','EXPECTED_VENDOR_CODE','',ExpectedCode:@FM:VendCode)
Set_Property(CtrlEntID, 'FOCUS', True$)
END
end
ProcIds = Get_Property(@Window, '@PROC_IDS')
ListData = Get_Property(CtrlEntId, 'LIST')
WONo = CheckArray<CA$WO_NO - 1>
RecDtm = CheckArray<CA$REC_DTM - 1>
ScanLotNo = ListData<PrevRow, 1>
ScanQty = ListData<PrevRow, 2>
ScanSubPartNo = ListData<PrevRow, 3>
ScanVendor = ListData<PrevRow, 4>
ProcIds<-1> = Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'ReceiveReleaseCassette':SD$:WONo:SD$:@User4:SD$:ScanLotNo:SD$:ScanQty:SD$:ScanSubPartNo:SD$:ScanVendor:SD$:RecDtm)
If Error_Services('NoError') then
Set_Property(@Window, '@PROC_IDS', ProcIds)
end else
ErrorMsg = Error_Services('GetMessage')
Msg(@Window, '', 'OK', '', 'Process Error':@FM:'Error submitting scan data to server for processing')
end
ListArray = Get_Property(CtrlEntId,'ARRAY')
CheckArray = Get_Property(@WINDOW,'@CHECK_ARRAY')
@ -373,9 +396,9 @@ If Error_Services('NoError') then
END CASE
END
end
end
If Error_Services('HasError') then
If Error_Services('HasError') then
TypeOver = ''
TypeOver<MTYPE$> = 'B&Rescan'
Message = Error_Services('GetMessage')
@ -384,9 +407,9 @@ If Error_Services('HasError') then
Set_Property(CtrlEntId, 'SELPOS', PrevSelPos)
Set_Property(CtrlEntID, 'INVALUE', '', PrevSelPos)
Error_Services('Clear')
end else
end else
GOSUB Refresh
end
end
RETURN
@ -395,36 +418,36 @@ RETURN
OK:
* * * * * * *
CtrlEntID = @WINDOW:'.FIELD_RADIO'
CheckArray = Get_Property(@WINDOW,'@CHECK_ARRAY')
CtrlEntID = @WINDOW:'.FIELD_RADIO'
CheckArray = Get_Property(@WINDOW,'@CHECK_ARRAY')
ControlSelection = Get_Property(CtrlEntID,'VALUE')
ControlSelection = Get_Property(CtrlEntID,'VALUE')
Ctrls = @WINDOW:'.LOT_QTY':@RM ; Props = 'VISIBLE':@RM
Ctrls := @WINDOW:'.LOT_QTY_PART':@RM ; Props := 'VISIBLE':@RM
Ctrls := @WINDOW:'.LOT_QTY_SUB_PART' ; Props := 'VISIBLE'
Ctrls = @WINDOW:'.LOT_QTY':@RM ; Props = 'VISIBLE':@RM
Ctrls := @WINDOW:'.LOT_QTY_PART':@RM ; Props := 'VISIBLE':@RM
Ctrls := @WINDOW:'.LOT_QTY_SUB_PART' ; Props := 'VISIBLE'
BEGIN CASE
BEGIN CASE
CASE ControlSelection = 'LQ' ; Ctrl = @WINDOW:'.LOT_QTY'
CASE ControlSelection = 'LQP' ; Ctrl = @WINDOW:'.LOT_QTY_PART'
CASE ControlSelection = 'LQSP' ; Ctrl = @WINDOW:'.LOT_QTY_SUB_PART'
END CASE
END CASE
ListData = Get_Property(Ctrl,'LIST')
ListData = Get_Property(Ctrl,'LIST')
TimeStamp = Get_Property(@WINDOW:'.RX_DTM','TEXT')
TimeStamp = ICONV(TimeStamp,'DT')
IF TimeStamp = '' THEN
TimeStamp = Get_Property(@WINDOW:'.RX_DTM','TEXT')
TimeStamp = ICONV(TimeStamp,'DT')
IF TimeStamp = '' THEN
ErrMsg('Invalid Received DateTime data entered. "mm/dd/yy hh:mm:ss" is the basic format.')
RETURN
END
END
CheckArray<CA$SCANNED_LOT_QTY> = '' ;* Clear scanned lot quantities column
CheckArray<CA$SCANNED_LOT_QTY> = '' ;* Clear scanned lot quantities column
LineCnt = 1
LOOP
LineCnt = 1
LOOP
TestVal = ListData<LineCnt,1>
UNTIL TestVal = ''
UNTIL TestVal = ''
LotNo = TRIM(ListData<LineCnt,1>)
Qty = TRIM(ListData<LineCnt,2>)
@ -488,9 +511,9 @@ UNTIL TestVal = ''
Result<9,LineCnt> = OrderItemNo
LineCnt += 1
REPEAT
REPEAT
IF ControlSelection NE 'LQSP' THEN
IF ControlSelection NE 'LQSP' THEN
* Orders with Epi supplied substrates don't have any lot quantities to check against.
@ -517,37 +540,44 @@ IF ControlSelection NE 'LQSP' THEN
ErrMsg('Lot Quantity(s) Scanned do not match Order Item Lot Quantity(s)!||Review and rescan highlighted items.')
RETURN
END
END ELSE
END ELSE
*
END
END
NumRows = DCount(Result, @FM)
NullFound = False$
For LineIndex = 1 to NumRows
NumRows = DCount(Result, @FM)
NullFound = False$
For LineIndex = 1 to NumRows
Row = Result<LineIndex>
NumVals = DCount(Row, @VM)
For ValIndex = 1 to NumVals
Val = Row<0, ValIndex>
If Val EQ '' then NullFound = True$
Next ValIndex
Until NullFound
Next LineIndex
If NullFound EQ True$ then
Until NullFound
Next LineIndex
If NullFound EQ True$ then
ErrMsg('Missing value found in scanned data! Verify your labels and restart your scan operation.')
Result = 'Cancel'
end
end
ScanResult = Result
Swap @VM with ' | ' in ScanResult
ScanResult = Result
Swap @VM with ' | ' in ScanResult
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @User4
LogData<3> = ScanResult
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @User4
LogData<3> = ScanResult
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
End_Dialog(@WINDOW,Result)
ProcIds = Get_Property(@Window, '@PROC_IDS')
If ProcIds NE '' then
Response = ProcIds
end else
Response = 'Cancel'
end
End_Dialog(@WINDOW,Response)
RETURN

View File

@ -858,3 +858,4 @@ Result = ReturnData
RETURN

File diff suppressed because it is too large Load Diff

View File

@ -7,7 +7,7 @@ COMPILE FUNCTION Comm_WO_Mat(Instruction, Parm1,Parm2)
10/18/2006 - John C. Henry, J.C. Henry & Co., Inc.
*/
DECLARE SUBROUTINE Set_Property, Set_Status, ErrMsg, Set_Property, obj_AppWindow, Send_Message
DECLARE SUBROUTINE Set_Property, Set_Status, ErrMsg, Set_Property, obj_AppWindow, Send_Message, Wo_Mat_Services
DECLARE SUBROUTINE Btree.Extract, Send_Event, Security_Err_Msg, Forward_Event, End_Window, Start_Window
DECLARE SUBROUTINE EditCell, obj_NCR, obj_Notes, obj_WO_Mat, obj_Tables, SAP_Services, Hold_Services
@ -627,6 +627,7 @@ MakeUpClick:
LotId = Xlate('WO_MAT', WOMatKey, 'WMO_KEY', 'X')
end else
LotId = Xlate('WO_MAT', WOMatKey, 'RDS_NO', 'X')
RDSNo = LotID
end
If LotId NE '' then
@ -636,12 +637,22 @@ MakeUpClick:
Parms<3> = 'MU' ; // Wafer counter tool location
Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms)
If Proceed EQ True$ then
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue)
If EpiPro EQ False$ then
IF Get_Status(errCode) THEN
ErrMsg('Unable to set makeup flag until Unload stage is signed.')
InvalidRequest = True$
END else
Set_Property(@WINDOW,'SAVEWARN', False$)
Send_Event(@WINDOW,'CLEAR')
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue)
IF Get_Status(errCode) THEN
ErrMsg(errCode)
END
If (CheckValue EQ True$) then
Wo_Mat_Services('MakeupFlagOn', RDSNo)
end
end
end else
Set_Property(@WINDOW,'SAVEWARN', False$)
Send_Event(@WINDOW,'CLEAR')
end
end else
InvalidRequest = True$
end

View File

@ -17,11 +17,11 @@ DECLARE SUBROUTINE Set_Property, Set_Status, ErrMsg, Set_Property, obj_AppWindo
DECLARE SUBROUTINE Btree.Extract, Send_Event, Security_Err_Msg, Forward_Event, End_Window, Start_Window
DECLARE SUBROUTINE EditCell, obj_NCR, obj_Notes, Post_Event, obj_WO_Mat, obj_WO_Mat_Log, obj_WO_Wfr, obj_Tables
DECLARE SUBROUTINE SRP_Stopwatch, Update_Index, Database_Services, obj_RDS, Create_Dialog, Dialog_Box
DECLARE SUBROUTINE Sleepery
DECLARE SUBROUTINE Sleepery, Wo_Mat_Services
DECLARE FUNCTION Get_Property, Get_Status, Popup, Send_Message, Msg, Security_Check, Dialog_Box, RowExists
DECLARE FUNCTION Dialog_Box, obj_WO_Log, obj_NCR, Check_Notes, obj_MUWafers, obj_WO_Mat, Signature_Services
DECLARE FUNCTION MemberOf, obj_Tables, obj_RDS, Environment_Services, Logging_Services, Material_Services
DECLARE FUNCTION Database_Services, RetStack, Datetime, Error_Services
DECLARE FUNCTION Database_Services, RetStack, Datetime, Error_Services, Rds_Services
$INSERT POPUP_EQUATES
$INSERT LOGICAL
@ -434,7 +434,7 @@ RejMat:
WfrID = SlotList<SelectedRows<I>, COL$WAFER_ID>
PrevNCR = SlotList<SelectedRows<I>, COL$SLOT_NCR>
MUWfrID = SlotList<SelectedRows<I>, COL$MU_WAFER_ID>
If ( (MetNo NE '') or (WfrID EQ '') or (PrevNCR NE '' and MUWfrID EQ '') ) then
If (WfrId EQ '') then
AllSlotsPermitted = False$
IneligibleSlots<0, -1> = SlotNo
end
@ -830,9 +830,19 @@ AddMakeup:
FieldNo = WO_MAT_MAKEUP_BOX$
CheckValue = 1
EpiCheck = Rds_Services('IsEpiPro', RDSNo)
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue)
If EpiCheck EQ False$ then
IF Get_Status(errCode) THEN
ErrMsg('Unable to set makeup flag until Unload stage is signed.')
Return
END else
Wo_Mat_Services('MakeupFlagOn', RDSNo)
end
end
SlotWaferIDs = Xlate('WO_MAT', WOMatKey, 'SLOT_WAFER_ID', 'X')
Convert @VM to '' in SlotWaferIDs
@ -1057,6 +1067,7 @@ MakeUpLot:
If Not(InvalidRequest) then
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
EpiCheck = Rds_Services('IsEpiPro', RDSNo)
If RDSNo NE '' then
Parms = ''
Parms<1> = RDSNo ; // Cassette to verify wafer count of.
@ -1064,12 +1075,22 @@ MakeUpLot:
Parms<3> = 'MU' ; // Wafer counter tool location
Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms)
If Proceed EQ True$ then
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue)
If EpiCheck EQ False$ then
IF Get_Status(errCode) THEN
ErrMsg('Unable to set makeup flag until Unload stage is signed.')
InvalidRequest = True$
END else
Set_Property(@WINDOW,'SAVEWARN', False$)
Send_Event(@WINDOW,'CLEAR')
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue)
IF Get_Status(errCode) THEN
ErrMsg(errCode)
END
If (CheckValue EQ True$) then
Wo_Mat_Services('MakeupFlagOn', RDSNo)
end
end
end else
Set_Property(@WINDOW,'SAVEWARN', False$)
Send_Event(@WINDOW,'CLEAR')
end
end else
InvalidRequest = True$
end
@ -1212,5 +1233,3 @@ LogRecord:
return

File diff suppressed because it is too large Load Diff

View File

@ -213,4 +213,3 @@ UpdateHALItem:
end
return

View File

@ -1,6 +1,4 @@
Compile subroutine Copy_Backlog_Records_To_SQL(VOID)
#pragma precomp SRP_PreCompiler
/*****************************************************************************\
This is a utility function. For each record found in SQL_BACKLOG, it makes
sure the identified record is copied to SQL. Then the backlog record is
@ -10,14 +8,16 @@ Compile subroutine Copy_Backlog_Records_To_SQL(VOID)
-------
08/10/2010 KRF Original Programmer
\*****************************************************************************/
#pragma precomp SRP_PreCompiler
$Insert APP_INSERTS
Declare subroutine Copy_Record_To_SQL, Delete_Record_From_SQL, SRP_TcpClient, Copy_Pending_Records_To_Sql
Declare function GetTickCount, Database_Services, SRP_TcpClient, Datetime, Environment_Services
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
Lock hSysLists, 'Copy_Backlog_Records_To_SQL' then
Main:
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
Lock hSysLists, 'Copy_Backlog_Records_To_SQL' then
Copy_Pending_Records_To_Sql()
@ -86,8 +86,9 @@ Lock hSysLists, 'Copy_Backlog_Records_To_SQL' then
If Skip EQ False$ then
TcpClientHandle = 0
ServerIP = Environment_Services('GetApplicationRootIP')
ServerPort = Environment_Services('GetScrapeServerPort')
Convert '\' to '' in ServerIP
If SRP_TcpClient(TcpClientHandle, 'CONNECT', ServerIP, '20779') then
If SRP_TcpClient(TcpClientHandle, 'CONNECT', ServerIP, ServerPort) then
SRP_TcpClient(TcpClientHandle, 'SEND_SES', Command)
SRP_TcpClient(TcpClientHandle, 'CLOSE_SES')
end
@ -97,8 +98,7 @@ Lock hSysLists, 'Copy_Backlog_Records_To_SQL' then
end
end
Unlock hSysLists, 'Copy_Backlog_Records_To_SQL' else Null
end
end
Return

View File

@ -0,0 +1,45 @@
Compile function Copy_LOT_EVENT_Record_To_SQL(Connection, Key, Record)
/*****************************************************************************\
Copies the given LOT_EVENT record to the MSSQL database.
History
-------
06/10/2025 DJS Original Programmer
\*****************************************************************************/
$insert LOT_EVENT_EQUATES
Declare function SQL_Write, SQL_Write_MV, SQL_Format
Ans = ""
// Parse record into a dimensioned array for speed
Dim Rec(13)
MatParse Record into Rec
// List of key names and their values
Keys = "LOT_EVENT_ID":@VM:SQL_Format(Key, "STR")
// List of data fields and their values
DataFields = "LOT_ID" :@VM:SQL_Format(Rec(LOT_EVENT_LOT_ID$), "STR"):@FM
DataFields := "LOT_EVENT_TYPE" :@VM:SQL_Format(Rec(LOT_EVENT_LOT_EVENT_TYPE$), "STR"):@FM
DataFields := "EVENT_DATETIME" :@VM:SQL_Format(Rec(LOT_EVENT_EVENT_DATETIME$), "DATETIME"):@FM
DataFields := "EVENT_NOTE" :@VM:SQL_Format(Rec(LOT_EVENT_EVENT_NOTE$), "STR"):@FM
DataFields := "EQUIPMENT_ID" :@VM:SQL_Format(Rec(LOT_EVENT_EQUIPMENT_ID$), "STR"):@FM
DataFields := "EVENT_REDUCE_WAFER_QTY" :@VM:SQL_Format(Rec(LOT_EVENT_EVENT_REDUCE_WAFER_QTY$), "INT"):@FM
DataFields := "EVENT_BONUS_WAFER_QTY" :@VM:SQL_Format(Rec(LOT_EVENT_EVENT_BONUS_WAFER_QTY$), "INT"):@FM
DataFields := "EVENT_BEGIN_WAFER_QTY" :@VM:SQL_Format(Rec(LOT_EVENT_EVENT_BEGIN_WAFER_QTY$), "INT"):@FM
DataFields := "EVENT_END_WAFER_QTY" :@VM:SQL_Format(Rec(LOT_EVENT_EVENT_END_WAFER_QTY$), "INT"):@FM
DataFields := "EVENT_OPERATION_ID" :@VM:SQL_Format(Rec(LOT_EVENT_EVENT_OPERATION_ID$), "STR"):@FM
DataFields := "EVENT_OPERATOR_ID" :@VM:SQL_Format(Rec(LOT_EVENT_EVENT_OPERATOR_ID$), "STR"):@FM
DataFields := "SEQUENCE" :@VM:SQL_Format(Rec(LOT_EVENT_SEQUENCE$), "INT")
// Symbolics
// Write the data to the SQL database
Ans = SQL_Write(Connection, "LOT_EVENT", Keys, DataFields);
//-------------------------------------------------------------------------------------------------
// Multi-valued Fields
Return Ans

View File

@ -0,0 +1,35 @@
Compile function Copy_LOT_EVENT_TYPE_Record_To_SQL(Connection, Key, Record)
/*****************************************************************************\
Copies the given OPERATION record to the MSSQL database.
History
-------
06/19/2025 DJS Original Programmer
\*****************************************************************************/
$insert LOT_EVENT_TYPE_EQUATES
Declare function SQL_Write, SQL_Write_MV, SQL_Format
Ans = ""
// Parse record into a dimensioned array for speed
Dim Rec(2)
MatParse Record into Rec
// List of key names and their values
Keys = "LOT_EVENT_TYPE_ID":@VM:SQL_Format(Key, "STR")
// List of data fields and their values
DataFields = "DESCRIPTION" :@VM:SQL_Format(Rec(LOT_EVENT_TYPE.DESCRIPTION$), "STR"):@FM
DataFields := "WIP_TRANS_TYPE" :@VM:SQL_Format(Rec(LOT_EVENT_TYPE.WIP_TRANS_TYPE$), "STR")
// Symbolics
// Write the data to the SQL database
Ans = SQL_Write(Connection, "LOT_EVENT_TYPE", Keys, DataFields);
//-------------------------------------------------------------------------------------------------
// Multi-valued Fields
Return Ans

View File

@ -0,0 +1,56 @@
Compile function Copy_LOT_OPERATION_Record_To_SQL(Connection, Key, Record)
/*****************************************************************************\
Copies the given LOT_OPERATION record to the MSSQL database.
History
-------
06/19/2025 DJS Original Programmer
\*****************************************************************************/
$insert LOT_OPERATION_EQUATES
Declare function SQL_Write, SQL_Write_MV, SQL_Format
Ans = ""
// Parse record into a dimensioned array for speed
Dim Rec(24)
MatParse Record into Rec
// List of key names and their values
Keys = "LOT_OPERATION_ID":@VM:SQL_Format(Key, "STR")
// List of data fields and their values
DataFields = "LOT_ID" :@VM:SQL_Format(Rec(LOT_OPERATION_LOT_ID$), "STR"):@FM
DataFields := "OPERATION_ID" :@VM:SQL_Format(Rec(LOT_OPERATION_OPERATION_ID$), "STR"):@FM
DataFields := "DATETIME_IN" :@VM:SQL_Format(Rec(LOT_OPERATION_DATETIME_IN$), "DATETIME"):@FM
DataFields := "DATETIME_OUT" :@VM:SQL_Format(Rec(LOT_OPERATION_DATETIME_OUT$), "DATETIME"):@FM
DataFields := "EQUIPMENT_ID" :@VM:SQL_Format(Rec(LOT_OPERATION_EQUIPMENT_ID$), "STR"):@FM
DataFields := "WAFER_IN_QTY" :@VM:SQL_Format(Rec(LOT_OPERATION_WAFER_IN_QTY$), "INT"):@FM
DataFields := "WAFER_OUT_QTY" :@VM:SQL_Format(Rec(LOT_OPERATION_WAFER_OUT_QTY$), "INT"):@FM
DataFields := "OPERATOR_IN_ID" :@VM:SQL_Format(Rec(LOT_OPERATION_OPERATOR_IN_ID$), "STR"):@FM
DataFields := "OPERATOR_OUT_ID" :@VM:SQL_Format(Rec(LOT_OPERATION_OPERATOR_OUT_ID$), "STR"):@FM
DataFields := "OPERATION_SEQUENCE" :@VM:SQL_Format(Rec(LOT_OPERATION_OPERATION_SEQUENCE$), "INT"):@FM
DataFields := "REWORK" :@VM:SQL_Format(Rec(LOT_OPERATION_REWORK$), "BIT"):@FM
DataFields := "DATETIME_START" :@VM:SQL_Format(Rec(LOT_OPERATION_DATETIME_START$), "DATETIME"):@FM
DataFields := "DATETIME_STOP" :@VM:SQL_Format(Rec(LOT_OPERATION_DATETIME_STOP$), "DATETIME"):@FM
DataFields := "CLEAN_ID" :@VM:SQL_Format(Rec(LOT_OPERATION_CLEAN_ID$), "STR"):@FM
DataFields := "PACKAGING_ID" :@VM:SQL_Format(Rec(LOT_OPERATION_PACKAGING_ID$), "STR"):@FM
DataFields := "WAFER_COUNTER_ID" :@VM:SQL_Format(Rec(LOT_OPERATION_WAFER_COUNTER_ID$), "STR"):@FM
DataFields := "OPERATION_TYPE" :@VM:SQL_Format(Rec(LOT_OPERATION_OPERATION_TYPE$), "STR"):@FM
DataFields := "OPERATION_CLASS" :@VM:SQL_Format(Rec(LOT_OPERATION_OPERATION_CLASS$), "STR"):@FM
DataFields := "MET_TEST_TYPE_REQUIRED" :@VM:SQL_Format(Rec(LOT_OPERATION_MET_TEST_TYPE_REQUIRED$), "BIT"):@FM
DataFields := "MET_TEST_REQUIRED" :@VM:SQL_Format(Rec(LOT_OPERATION_MET_TEST_REQUIRED$), "BIT"):@FM
DataFields := "PACKAGING_REQUIRED" :@VM:SQL_Format(Rec(LOT_OPERATION_PACKAGING_REQUIRED$), "BIT"):@FM
DataFields := "CLEAN_REQUIRED" :@VM:SQL_Format(Rec(LOT_OPERATION_CLEAN_REQUIRED$), "BIT"):@FM
DataFields := "WAFER_COUNTER_REQUIRED" :@VM:SQL_Format(Rec(LOT_OPERATION_WAFER_COUNTER_REQUIRED$), "BIT")
// Symbolics
// Write the data to the SQL database
Ans = SQL_Write(Connection, "LOT_OPERATION", Keys, DataFields);
//-------------------------------------------------------------------------------------------------
// Multi-valued Fields
Return Ans

View File

@ -0,0 +1,51 @@
Compile function Copy_LOT_Record_To_SQL(Connection, Key, Record)
/*****************************************************************************\
Copies the given LOT record to the MSSQL database.
History
-------
06/10/2025 DJS Original Programmer
\*****************************************************************************/
$insert LOT_EQUATES
Declare function SQL_Write, SQL_Write_MV, SQL_Format
Ans = ""
// Parse record into a dimensioned array for speed
Dim Rec(23)
MatParse Record into Rec
// List of key names and their values
Keys = "LOT_ID":@VM:SQL_Format(Key, "STR")
// List of data fields and their values
DataFields = "TYPE" :@VM:SQL_Format(Rec(LOT_TYPE$), "STR"):@FM
DataFields := "PROD_ID" :@VM:SQL_Format(Rec(LOT_PROD_ID$), "STR"):@FM
DataFields := "ORIG_WAFER_QTY" :@VM:SQL_Format(Rec(LOT_ORIG_WAFER_QTY$), "INT"):@FM
DataFields := "WAFER_QTY" :@VM:SQL_Format(Rec(LOT_WAFER_QTY$), "INT"):@FM
DataFields := "VENDOR_PART_NO" :@VM:SQL_Format(Rec(LOT_VENDOR_PART_NO$), "STR"):@FM
DataFields := "VENDOR_LOT_NO" :@VM:SQL_Format(Rec(LOT_VENDOR_LOT_NO$), "STR"):@FM
DataFields := "VENDOR_CODE" :@VM:SQL_Format(Rec(LOT_VENDOR_CODE$), "STR"):@FM
DataFields := "[OPEN]" :@VM:SQL_Format(Rec(LOT_OPEN$), "BIT"):@FM
DataFields := "HOLD" :@VM:SQL_Format(Rec(LOT_HOLD$), "BIT"):@FM
DataFields := "HOT" :@VM:SQL_Format(Rec(LOT_HOT$), "BIT"):@FM
DataFields := "LEGACY_LOT_ID" :@VM:SQL_Format(Rec(LOT_LEGACY_LOT_ID$), "STR"):@FM
DataFields := "MOST_RECENT_LOT_EVENT_ID" :@VM:SQL_Format(Rec(LOT_MOST_RECENT_LOT_EVENT_ID$), "STR"):@FM
DataFields := "LEGACY_LOT_TYPE" :@VM:SQL_Format(Rec(LOT_LEGACY_LOT_TYPE$), "STR"):@FM
DataFields := "WO_LOG_ID" :@VM:SQL_Format(Rec(LOT_WO_LOG_ID$), "INT"):@FM
DataFields := "PROD_SPEC_ID" :@VM:SQL_Format(Rec(LOT_PROD_SPEC_ID$), "INT"):@FM
DataFields := "EPI_PART_NO" :@VM:SQL_Format(Rec(LOT_EPI_PART_NO$), "STR"):@FM
DataFields := "PROD_VER_NO" :@VM:SQL_Format(Rec(LOT_PROD_VER_NO$), "STR")
// Symbolics
// Write the data to the SQL database
Ans = SQL_Write(Connection, "LOT", Keys, DataFields);
//-------------------------------------------------------------------------------------------------
// Multi-valued Fields
Return Ans

View File

@ -0,0 +1,43 @@
Compile function Copy_OPERATION_Record_To_SQL(Connection, Key, Record)
/*****************************************************************************\
Copies the given OPERATION record to the MSSQL database.
History
-------
06/19/2025 DJS Original Programmer
\*****************************************************************************/
$insert OPERATION_EQUATES
Declare function SQL_Write, SQL_Write_MV, SQL_Format
Ans = ""
// Parse record into a dimensioned array for speed
Dim Rec(10)
MatParse Record into Rec
// List of key names and their values
Keys = "OPERATION_ID":@VM:SQL_Format(Key, "STR")
// List of data fields and their values
DataFields = "ACTIVE" :@VM:SQL_Format(Rec(OPERATION_ACTIVE$), "BIT"):@FM
DataFields := "CLASS_ID" :@VM:SQL_Format(Rec(OPERATION_CLASS_ID$), "STR"):@FM
DataFields := "OPERATION_DESCRIPTION" :@VM:SQL_Format(Rec(OPERATION_OPERATION_DESCRIPTION$), "STR"):@FM
DataFields := "TYPE" :@VM:SQL_Format(Rec(OPERATION_TYPE$), "STR"):@FM
DataFields := "REWORK" :@VM:SQL_Format(Rec(OPERATION_REWORK$), "BIT"):@FM
DataFields := "MET_TEST_TYPE_REQUIRED" :@VM:SQL_Format(Rec(OPERATION_MET_TEST_TYPE_REQUIRED$), "BIT"):@FM
DataFields := "MET_TEST_REQUIRED" :@VM:SQL_Format(Rec(OPERATION_MET_TEST_REQUIRED$), "BIT"):@FM
DataFields := "PACKAGING_REQUIRED" :@VM:SQL_Format(Rec(OPERATION_PACKAGING_REQUIRED$), "BIT"):@FM
DataFields := "CLEAN_REQUIRED" :@VM:SQL_Format(Rec(OPERATION_CLEAN_REQUIRED$), "BIT"):@FM
DataFields := "WAFER_COUNTER_REQUIRED" :@VM:SQL_Format(Rec(OPERATION_WAFER_COUNTER_REQUIRED$), "BIT")
// Symbolics
// Write the data to the SQL database
Ans = SQL_Write(Connection, "OPERATION", Keys, DataFields);
//-------------------------------------------------------------------------------------------------
// Multi-valued Fields
Return Ans

View File

@ -1,6 +1,4 @@
Compile subroutine Copy_Pending_Records_To_SQL(VOID)
#pragma precomp SRP_PreCompiler
/*****************************************************************************\
This is a utility function. For each record found in SQL_PENDING, it makes
sure the identified record is copied to SQL.
@ -9,28 +7,34 @@ Compile subroutine Copy_Pending_Records_To_SQL(VOID)
-------
02/06/2023 DJS Adapted from Copy_Backlog_Records_To_SQL
\*****************************************************************************/
#pragma precomp SRP_PreCompiler
$Insert APP_INSERTS
EQU FIVE_MINUTES$ to 0.003472
EQU SECONDS_PER_DAY$ to 86400
EQU THIRTY_MINUTES$ to 1800
Declare subroutine Copy_Record_To_SQL, Delete_Record_From_SQL, SRP_TcpClient, Database_Services
Declare function GetTickCount, Database_Services, SRP_TcpClient, Datetime, Database_Services, Environment_Services
// This only needs to be called every once in a while (e.g. 5 minutes ~ 0.003472)
Run = False$
CurrDtm = Datetime()
LastRunDtm = Database_Services('ReadDataRow', 'APP_INFO', 'SQL_PENDING_LAST_RUNTIME')
If LastRunDtm NE '' then
Main:
// This only needs to be called every once in a while (e.g. 5 minutes ~ 0.003472)
Run = False$
CurrDtm = Datetime()
LastRunDtm = Database_Services('ReadDataRow', 'APP_INFO', 'SQL_PENDING_LAST_RUNTIME')
If LastRunDtm NE '' then
TimeDiff = CurrDtm - LastRunDtm
If TimeDiff GT 0.003472 then
If TimeDiff GT FIVE_MINUTES$ then
Run = True$
LastRunDtm = CurrDtm
end
end else
end else
Run = True$
LastRunDtm = CurrDtm
end
end
If Run then
If Run then
Database_Services('WriteDataRow', 'APP_INFO', 'SQL_PENDING_LAST_RUNTIME', LastRunDtm)
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
Lock hSysLists, 'Copy_Pending_Records_To_SQL' then
@ -48,9 +52,9 @@ If Run then
Read Rec from pTable, Key then
TransDtm = Rec<1>
ElapSecs = (CurrDtm - TransDtm) * 86400
If ElapSecs LT 1800 then
// Retry recent pending transactions (1800 seconds = 30 minutes)
ElapSecs = (CurrDtm - TransDtm) * SECONDS_PER_DAY$
If ElapSecs LT THIRTY_MINUTES$ then
// Retry recent pending transactions (i.e., those submitted in the last 30 minutes)
Table = Key[1, "*"]
Locate Table in NonCriticalTables using @FM setting Dummy then
ID = Key[Col2() + 1, Len(Key)]
@ -81,9 +85,10 @@ If Run then
TcpClientHandle = 0
ServerIP = Environment_Services('GetApplicationRootIP')
ServerPort = Environment_Services('GetScrapeServerPort')
Convert '\' to '' in ServerIP
If SRP_TcpClient(TcpClientHandle, 'CONNECT', ServerIP, '20779') then
If SRP_TcpClient(TcpClientHandle, 'CONNECT', ServerIP, ServerPort) then
SRP_TcpClient(TcpClientHandle, 'SEND_SES', Command)
SRP_TcpClient(TcpClientHandle, 'CLOSE_SES')
end
@ -99,8 +104,7 @@ If Run then
end
Unlock hSysLists, 'Copy_Pending_Records_To_SQL' else Null
end
end
end
Return

View File

@ -22,20 +22,29 @@ Compile function Copy_Record_To_SQL(Table, Key, LogError, pKey)
09/23/2010 KRF Added logic to set @DICT, @ID, and @RECORD so handlers
can use symbolics
\*****************************************************************************/
$insert Microsoft_Ado_Equates
If Assigned(LogError) else LogError = 0
$Insert APP_INSERTS
$Insert MICROSOFT_ADO_EQUATES
Declare subroutine SRP_Com, Sql_Services
Declare function SRP_Com, Environment_Services, Datetime, Sql_Services, Error_Services, Database_Services
Ans = ""
Declare function SRP_Com, Environment_Services, Datetime, Sql_Services, Error_Services, Database_Services, Unassigned
// Make sure table is uppercase
Convert @LOWER_CASE to @UPPER_CASE in Table
Main:
TablesToSkip = Database_Services('ReadDataRow', 'APP_INFO', 'SQL_TABLES_TO_SKIP')
Locate Table in TablesToSkip by "AL" using "," setting ListPos else
If Unassigned(LogError) then LogError = False$
If Unassigned(pKey) then pKey = ''
Ans = ""
Done = False$
// Make sure table is uppercase
Convert @LOWER_CASE to @UPPER_CASE in Table
TablesToSkip = Database_Services('ReadDataRow', 'APP_INFO', 'SQL_TABLES_TO_SKIP')
Locate Table in TablesToSkip by "AL" using "," setting ListPos else
Open 'SQL_PENDING' to pTable then
If pKey NE '' then Lock pTable, pKey else Done = True$
If Not(Done) then
// The expected name of the handler
Handler = "COPY_":Table:"_RECORD_TO_SQL"
@ -53,12 +62,10 @@ Locate Table in TablesToSkip by "AL" using "," setting ListPos else
Open "DICT.":Table to @DICT then null
@ID = Key
Ans = Function(@Handler(Connection, Key, @RECORD))
If Ans EQ '' then
If (Ans EQ '') then
If Assigned(pKey) then
If pKey NE '' then
Open 'SQL_PENDING' to pTable then
Delete pTable, pKey else null
end
If (pKey NE '') then
Delete pTable, pKey else Null
end
end
end
@ -68,7 +75,8 @@ Locate Table in TablesToSkip by "AL" using "," setting ListPos else
end
end
end else
Ans = 'Unable to open connection to SQL server. SQL connection error: ':SRP_Com(Connection, "ERROR")
Ans = 'Unable to open connection to SQL server. SQL connection error: '
Ans := SRP_Com(Connection, "ERROR")
end
SRP_Com(Connection, "CALL", "Close")
SRP_Com(Connection, "RELEASE")
@ -93,6 +101,8 @@ Locate Table in TablesToSkip by "AL" using "," setting ListPos else
If Assigned(pKey) then
If (pKey NE '') then
// Call unlock here in case we ran into an error above
Unlock pTable, pKey else Null
// Always log the result
Open 'SQL_LOG' to hLog then
If Ans EQ '' then
@ -111,9 +121,9 @@ Locate Table in TablesToSkip by "AL" using "," setting ListPos else
end
end
end
end
end
end
end
Return Ans

View File

@ -14,7 +14,7 @@ Declare function SQL_Write, SQL_Write_MV, SQL_Format
Ans = ""
// Parse record into a dimensioned array for speed
Dim Rec(82)
Dim Rec(86)
MatParse Record into Rec
// List of key names and their values
@ -38,7 +38,7 @@ DataFields := "CYCLE_TIME" :@VM:SQL_Format(Rec(WO_LOG_CYCLE_TIME$),
DataFields := "UNIT_PRICE" :@VM:SQL_Format(Rec(WO_LOG_UNIT_PRICE$), "STR"):@FM
DataFields := "ORDER_NO" :@VM:SQL_Format(Rec(WO_LOG_ORDER_NO$), "STR"):@FM
DataFields := "RX_DTM" :@VM:SQL_Format(Rec(WO_LOG_RX_DTM$), "DATETIME"):@FM
DataFields := "OUT_CASS_LOAD_QTY":@VM:SQL_Format(Rec(WO_LOG_OUT_CASS_LOAD_QTY$), "INT"):@FM
DataFields := "OUT_CASS_LOAD_QTY" :@VM:SQL_Format(Rec(WO_LOG_OUT_CASS_LOAD_QTY$), "INT"):@FM
DataFields := "PART_NO" :@VM:SQL_Format(Rec(WO_LOG_PART_NO$), "STR"):@FM
DataFields := "PROD_ORD_NO" :@VM:SQL_Format(Rec(WO_LOG_PROD_ORD_NO$), "STR"):@FM
DataFields := "WO_START_DTM" :@VM:SQL_Format(Rec(WO_LOG_WO_START_DTM$), "DATETIME"):@FM
@ -50,13 +50,16 @@ DataFields := "ORD_SUB_PART_REV" :@VM:SQL_Format(Rec(WO_LOG_ORD_SUB_PART_REV$),
DataFields := "CUST_PO_NO" :@VM:SQL_Format(Rec(WO_LOG_CUST_PO_NO$), "STR"):@FM
DataFields := "SAP_ORD_QTY" :@VM:SQL_Format(Rec(WO_LOG_SAP_ORD_QTY$), "INT"):@FM
DataFields := "CUST_PART_NO" :@VM:SQL_Format(Rec(WO_LOG_CUST_PART_NO$), "STR"):@FM
DataFields := "CUST_PART_INBOUND":@VM:SQL_Format(Rec(WO_LOG_CUST_PART_INBOUND$), "STR"):@FM
DataFields := "CUST_PART_INBOUND" :@VM:SQL_Format(Rec(WO_LOG_CUST_PART_INBOUND$), "STR"):@FM
DataFields := "CUST_SUB_PART_NO" :@VM:SQL_Format(Rec(WO_LOG_CUST_SUB_PART_NO$), "STR"):@FM
DataFields := "CUST_SUB_MFR" :@VM:SQL_Format(Rec(WO_LOG_CUST_SUB_MFR$), "STR"):@FM
DataFields := "PROD_ORD_NO_TMP" :@VM:SQL_Format(Rec(WO_LOG_PROD_ORD_NO_TMP$), "STR"):@FM
DataFields := "ORIGIN" :@VM:SQL_Format(Rec(WO_LOG_ORIGIN$), "STR"):@FM
DataFields := "INCO_CODE" :@VM:SQL_Format(Rec(WO_LOG_INCO_CODE$), "STR"):@FM
DataFields := "HOT_FLAG" :@VM:SQL_Format(Rec(WO_LOG_HOT_FLAG$), "BIT"):@FM
DataFields := "CURR_STATUS_STATIC" :@VM:SQL_Format(Rec(WO_LOG_CURR_STATUS_STATIC$), "STR"):@FM
DataFields := "REL_QTY" :@VM:SQL_Format(Rec(WO_LOG_REL_QTY_STATIC$), "INT"):@FM
DataFields := "UNREL_QTY" :@VM:SQL_Format(Rec(WO_LOG_UNREL_QTY_STATIC$), "INT"):@FM
// Symbolics
DataFields := "START_DT" :@VM:SQL_Format({START_DT}, "DATE"):@FM
@ -68,9 +71,7 @@ DataFields := "CYCLE_TIME_WIP" :@VM:SQL_Format({CYCLE_TIME_WIP},
DataFields := "CYCLE_TIME_DELTA" :@VM:SQL_Format({CYCLE_TIME_DELTA}, "DEC", 1):@FM
DataFields := "CYCLE_TIME_QA_SHIP" :@VM:SQL_Format({CYCLE_TIME_QA_SHIP}, "DEC", 1):@FM
DataFields := "CYCLE_TIME_REL_FIRST_VER":@VM:SQL_Format({CYCLE_TIME_REL_FIRST_VER}, "DEC", 1):@FM
DataFields := "SAP_TOT_WFR_QTY" :@VM:SQL_Format({SAP_TOT_WFR_QTY}, "STR"):@FM
DataFields := "REL_QTY" :@VM:SQL_Format({REL_QTY}, "INT"):@FM
DataFields := "UNREL_QTY" :@VM:SQL_Format({UNREL_QTY}, "INT")
DataFields := "SAP_TOT_WFR_QTY" :@VM:SQL_Format({SAP_TOT_WFR_QTY}, "STR")
// Write the data to the SQL database
Ans = SQL_Write(Connection, "WO_LOG", Keys, DataFields)
@ -349,3 +350,4 @@ If Ans EQ "" AND CassIdSap NE "" then
end
Return Ans

View File

@ -609,7 +609,6 @@ Service ReadDataRow(TableName, KeyID, NotExpired, ExpirationDuration, IgnoreMFSR
Memory_Services('SetValue', ServiceKeyID, DataRow)
end else
Error_Services('Add', 'Error reading ' : KeyID : ' from the ' : TableName : ' table in the ' : Service : ' service. Error = ' : @File_Error<1>)
end
end
end
@ -943,11 +942,9 @@ Service WriteDataRow(TableName, KeyID, DataRow, IgnoreSelfLock, IgnoreMFSRoutine
Error_Services('Add', 'Error writing ' : KeyID : ' to the ' : TableName : ' table in the ' : Service : ' service. Error message: ':ErrorMsg)
end
end
* If Error_Services('NoError') then
If IgnoreAllLocks EQ False$ then
Database_Services('ReleaseKeyIDLock', TableName, KeyID)
end
* end
end else
Error_Services('Add', 'Unable to lock ' : KeyID : ' for the ' : TableName : ' table in the ' : Service : ' service.')
end
@ -958,6 +955,68 @@ Service WriteDataRow(TableName, KeyID, DataRow, IgnoreSelfLock, IgnoreMFSRoutine
end service
//----------------------------------------------------------------------------------------------------------------------
// WriteDataColumn
//
// TableName. The linear hash database table name. - [REQUIRED]
// KeyID. The KeyID to the database table. - [REQUIRED]
// ColumnNo. Column number of the table to write. - [REQUIRED]
//
// Writes a value to a column for the indicated Key ID and database table.
//----------------------------------------------------------------------------------------------------------------------
Service WriteDataColumn(TableName, KeyID, ColumnNo, Value, IgnoreSelfLock, IgnoreMFSRoutines, IgnoreAllLocks)
If TableName NE '' AND KeyID NE '' AND ColumnNo NE '' then
If ( Num(ColumnNo) and (ColumnNo GT 0) ) then
If Unassigned(Value) then Value = ''
If IgnoreSelfLock NE True$ then IgnoreSelfLock = False$
If IgnoreMFSRoutines NE True$ then IgnoreMFSRoutines = False$
If IgnoreAllLocks NE True$ then IgnoreAllLocks = False$
If IgnoreAllLocks then
HaveLock = True$
end else
HaveLock = Database_Services('GetKeyIDLock', TableName, KeyID, IgnoreSelfLock)
end
If HaveLock EQ True$ then
TableHandle = Database_Services('GetTableHandle', TableName)
If IgnoreMFSRoutines then
MFSList = TableHandle<1, 1> ; // MFS routines are @SVM delimited.
NumMFS = DCount(MFSList, @SVM)
For MFSCnt = NumMFS to 1 Step -1
MFSRoutine = MFSList<0, 0, MFSCnt>
If (MFSRoutine NE 'SI.MFS') AND (MFSRoutine NE 'RTP57') then
MFSList = Delete(MFSList, 0, 0, MFSCnt)
end
Next MFSCnt
TableHandle<1, 1> = MFSList
end
If Error_Services('NoError') then
WriteV Value on TableHandle, KeyID, ColumnNo then
Memory_Services('SetValue', ServiceModule : '*' : 'ReadDataColumn' : '*' : TableName : '*' : KeyID : '*' : ColumnNo, Value)
end else
ErrorMsg = 'Error writing value ' : Quote(Value) ' to column number ' : ColumnNo : ' to key ' : KeyID |
: ' of table ' : TableName : ' in the ' : Service : ' service.'
Error_Services('Add', ErrorMsg)
end
end
If IgnoreAllLocks EQ False$ then
Database_Services('ReleaseKeyIDLock', TableName, KeyID)
end
end else
Error_Services('Add', 'Unable to lock ' : KeyID : ' for the ' : TableName : ' table in the ' : Service : ' service.')
end
end else
Error_Services('Add', 'ColumnNo was not a number or was not greater than zero in the ' :Service : ' service.')
end
end else
Error_Services('Add', 'TableName, KeyID, or ColumnNo argument was missing in the ' : Service : ' service.')
end
end service
//----------------------------------------------------------------------------------------------------------------------
// UnlockKeyID
//
@ -1043,5 +1102,3 @@ end service
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@ -220,6 +220,13 @@ Service GetWeekNum(InputDate)
end service
Service ConvertDateTimeToISO8601(DatetimeToConv)
Response = OConv(DatetimeToConv, "[SRP_DATETIME,()YYYY-MM-DD hh:mm:ss.000Z]")
swap ' ' with 'T' in Response
end service
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs

View File

@ -18,23 +18,31 @@ Compile function Delete_Record_From_SQL(Table, Key, LogError, pKey)
-------
09/15/2010 KRF Original Programmer
\*****************************************************************************/
$insert Microsoft_Ado_Equates
If Assigned(LogError) else LogError = 0
$Insert APP_INSERTS
$insert MICROSOFT_ADO_EQUATES
Declare subroutine Sql_Services, SRP_COM
Declare function Sql_Services, Error_Services, SRP_COM, Environment_Services
Ans = ""
Declare function Sql_Services, Error_Services, SRP_COM, Environment_Services, Unassigned
// Make sure table is uppercase
Convert @LOWER_CASE to @UPPER_CASE in Table
Main:
// The expected name of the handler
Handler = "DELETE_":Table:"_RECORD_FROM_SQL"
If Unassigned(LogError) then LogError = False$
If Unassigned(pKey) then pKey = ''
Ans = ""
Done = False$
// Make sure table is uppercase
Convert @LOWER_CASE to @UPPER_CASE in Table
// Find the stored procedure that handles this table
Open "SYSOBJ" to hSysObj then
Open 'SQL_PENDING' to pTable then
If pKey NE '' then Lock pTable, pKey else Done = True$
If Not(Done) then
// The expected name of the handler
Handler = "DELETE_":Table:"_RECORD_FROM_SQL"
// Find the stored procedure that handles this table
Open "SYSOBJ" to hSysObj then
Read ObjCode from hSysObj, "$":Handler:"*LSL2" then
// Connect to the ODBC/ADO
If SRP_Com(Connection, "CREATE", "ADODB.Connection") then
@ -44,10 +52,10 @@ Open "SYSOBJ" to hSysObj then
// Read the record and call the handler
If Key NE "" then
Ans = Function(@Handler(Connection, Key))
If Ans EQ '' then
If (Ans EQ '') then
If Assigned(pKey) then
Open 'SQL_PENDING' to pTable then
Delete pTable, pKey else null
If (pKey NE '') then
Delete pTable, pKey else Null
end
end
end
@ -61,9 +69,9 @@ Open "SYSOBJ" to hSysObj then
Ans = "Unable to create ADO connection."
end
end
end
end
If LogError AND Len(Ans) then
If LogError AND Len(Ans) then
Open "SQL_ERROR" to hSqlError then
Read Errors from hSqlError, Date() then
Errors := @FM:Table:@VM:Key:@VM:Ans
@ -73,11 +81,14 @@ If LogError AND Len(Ans) then
Write Errors to hSqlError, Date()
end
end
end
end
// Always log the result
// Always log the result
If Assigned(pKey) then
If Assigned(pKey) then
If (pKey NE '') then
// Call unlock here in case an error was encountered above
Unlock pTable, pKey else Null
Open 'SQL_LOG' to hLog then
If Ans EQ '' then
Result = 'PROCESSED'
@ -92,7 +103,10 @@ If Assigned(pKey) then
end
Write Log to hLog, CurrDate
end
end
end
end
end
end
Return Ans

View File

@ -590,7 +590,9 @@ Service SetupDevServices()
BaselineServices = 'Update Material Logs':@VM:'Log Transaction Postings':@VM:'Process Wafer Image Queue':@VM
BaselineServices := 'Process UCL Requests':@VM:'Process ROTR Requests':@VM:'Process Wafer Image Requests':@VM
BaselineServices := 'Process SQL Requests':@VM:'Send Notes':@VM:'Update Notification Groups':@VM
BaselineServices := 'Update Security Groups':@VM:'Auto Scheduler'
BaselineServices := 'Update Security Groups':@VM:'Auto Scheduler':@VM:'Update NICA Orders':@VM:'Process Procedure Queue':@VM
BaselineServices := 'Process Transaction Queue':@VM:'Update Open Work Order Statuses':@VM:'Update Work Order Wafer Quantities':@VM
BaselineServices := 'Process Mona Requests'
Query = "SELECT SERVICES"

View File

@ -94,4 +94,3 @@ API engineinfo.ID.GET
end
end api

View File

@ -36,7 +36,7 @@ Function Environment_Services(@Service, @Params)
#pragma precomp SRP_PreCompiler
$insert LOGICAL
$insert APP_INSERTS
$insert SERVICE_SETUP
$insert SRPMail_Inserts
@ -553,6 +553,30 @@ Service GetEnvironmentVariable(VariableName)
end service
Service GetServiceManagerPort()
FilePath = Drive():'\SRPEngineServer.ini'
OSRead IniFile from FilePath then
CharIndex = Index(IniFile, 'Port', 1)
Line = IniFile[CharIndex, 'F':CRLF$]
Response = Trim(Line[-1, 'B='])
end
end service
Service GetScrapeServerPort()
FilePath = Drive():'\SRPEngineServerScrape.ini'
OSRead IniFile from FilePath then
CharIndex = Index(IniFile, 'Port', 1)
Line = IniFile[CharIndex, 'F':CRLF$]
Response = Trim(Line[-1, 'B='])
end
end service
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@ -1,272 +0,0 @@
COMPILE SUBROUTINE Export_WO_Log( Dummy )
DECLARE FUNCTION Msg, Dialog_Box, Utility, obj_Export, obj_WO_Log
DECLARE FUNCTION Set_Printer, Get_Printer, obj_Install, Utility, obj_MUWafers, Database_Services
DECLARE SUBROUTINE Btree.Extract, RList, END_Dialog, Make.List, Msg, ErrMsg, SetInitDirOptions
$INSERT LSL_USERS_EQU
$INSERT MSG_EQUATES
$INSERT RLIST_EQUATES
$INSERT OIPRINT_EQUATES
$INSERT WO_LOG_EQUATES
$INSERT WO_STEP_EQU
$INSERT WO_MAT_EQUATES
$INSERT COMPANY_EQU
$INSERT QUOTE_EQU
$INSERT QUOTE_SPEC_EQU
$INSERT RECIPE_EQU
$INSERT ORDER_DET_EQU
$INSERT PROD_SPEC_EQUATES
$insert PROD_VER_EQUATES
$INSERT EXCEL_EQU
CRLF$ = \0D0A\
OPEN 'WO_STEP' TO WOStepTable ELSE
ErrMsg('Unable to open "WO_STEP" table in EXPORT_WO_LOG routine.')
RETURN
END
OPEN 'DICT.WO_STEP' TO DictWOStep ELSE
ErrMsg('Unable to open "DICT.WO_STEP" table in EXPORT_WO_LOG routine.')
RETURN
END
Def = ""
Def<MTEXT$> = "Selecting Uncheduled Work Orders..."
Def<MTYPE$> = "U"
MsgUp = Msg(@window, Def)
* SelectSent = 'SELECT WO_STEP WITH SCHEDULED NE "Yes" '
Declare subroutine SRP_Stopwatch
SRP_Stopwatch('Reset')
SRP_Stopwatch('Start', 'StartDate')
StartDate = Oconv(Date() - 182, 'D4/')
SelectSent = 'SELECT WO_LOG WITH ENTRY_DATE GE ' : Quote(StartDate)
RList(SelectSent,TARGET_ACTIVELIST$,'','','')
SRP_Stopwatch('Stop', 'StartDate')
SRP_Stopwatch('Start', 'Schedule')
SelectSent = 'SELECT WO_LOG WITH SCHEDULED NE "Yes" '
RList(SelectSent,TARGET_ACTIVELIST$,'','','')
SRP_Stopwatch('Stop', 'Schedule')
* SRP_Stopwatch('ShowAll')
*SelectSent = 'SELECT WO_STEP WITH CURR_STATUS NE "CL" "COMP" '
*SelectSent = 'SELECT WO_STEP WITH CURR_STATUS = "NEW" "RTP" "RTS" "RX" "INPR" '
*RList(SelectSent,TARGET_ACTIVELIST$,'','','')
WOLogKeys = ''
Done = 0
LOOP
READNEXT WOLogKey ELSE Done = 1
UNTIL Done
WOLogKeys<-1> = WOLogKey
REPEAT
CONVERT @VM TO @FM IN WOLogKeys
IF WOLogKeys = '' THEN
Msg(@window, MsgUp)
ErrMsg('No Work Orders remain unscheduled.')
RETURN
END
Make.List('',WOLogKeys,'','')
IF Get_Status(errCode) THEN
ErrMsg(errCode)
END
Results = ''
Results<1,1> = 'Spec Type'
Results<1,2> = 'WO'
Results<1,3> = 'Customer'
Results<1,4> = 'Qty'
Results<1,5> = 'PSN'
Results<1,6> = 'Cust Part Numbers'
Results<1,7> = 'Reactor Type'
Results<1,8> = 'Sched Reacts'
Results<1,9> = 'Inch'
Results<1,10> = 'Tube Press Type'
Results<1,11> = 'Epi Gases'
Results<1,12> = 'Dopant L1'
Results<1,13> = 'Cap/Burst Gases'
Results<1,14> = 'Thick Target'
Results<1,15> = 'Res Target'
Results<1,16> = 'Expected Rx Dt'
Results<1,17> = 'Received Date'
Results<1,18> = 'Promised Ship'
Results<1,19> = 'Qual'
Results<1,20> = 'Blkd'
Results<1,21> = 'MU Wfrs'
Done = 0
LineCnt = 1
LOOP
READNEXT WOLogKey ELSE Done = 1
UNTIL Done
WONo = WOLogKey
WORec = XLATE('WO_LOG',WONo,'','X')
WOMatKeys = WORec<WO_LOG_WO_MAT_KEY$>
CassCustPNs = XLATE('WO_MAT',WOMatKeys,WO_MAT_CUST_PART_NO$,'X')
CustPNs = ''
FOR I = 1 TO COUNT(CassCustPNs,@VM) + (CassCustPNs NE '')
LOCATE CassCustPNs<1,I> IN CustPNs USING @VM SETTING POS ELSE
CustPNs = INSERT(CustPNs,1,Pos,0,CassCustPNs<1,I>)
END
NEXT I
CompanyName = XLATE( 'COMPANY', WORec<WO_LOG_CUST_NO$>,COMPANY_CO_NAME$,'X')
SWAP ',' WITH '-' IN CompanyName
WaferQty = SUM(XLATE('WO_MAT',WOMatKeys,WO_MAT_WAFER_QTY$,'X'))
IF WaferQty > 0 THEN
ExpectedRxDts = ''
END ELSE
OrderNo = WORec<WO_LOG_ORDER_NO$>
OrderItems = WORec<WO_LOG_ORDER_ITEM$>
OrderDetKeys = ''
FOR N = 1 TO COUNT(OrderItems,@VM) + (OrderItems NE '')
OrderDetKeys<1,N> = OrderNo:'*':OrderItems<1,N>
NEXT N
WaferQty = SUM(XLATE('ORDER_DET',OrderDetKeys,ORDER_DET_ITEM_QTY$,'X'))
ExpectedRxDts = XLATE('ORDER_DET',OrderDetKeys,ORDER_DET_EXP_RX_DT$,'X')
END
MUWafers = obj_MUWafers('AvailWafers',WONo:@RM:WORec:@RM:0:@RM:1)
ShipThickTarget = XLATE('WO_LOG',WONo,'SHIP_THICK_TARGET','X')
ShipResTarget = XLATE('WO_LOG',WONo,'SHIP_RES_TARGET','X')
CustPSNs = XLATE('WO_STEP',WORec<34>,1,'X')
SWAP @VM WITH '\' IN CustPNs
* PSNo = WOStepRec<WO_STEP_PROD_SPEC_ID$>
ProdVerNo = WORec<WO_LOG_PROD_VER_NO$>
ProdVerRow = Database_Services('ReadDataRow', 'PROD_VER', ProdVerNo)
PSNo = ProdVerRow<PROD_VER_PROC_STEP_PSN$>
PSReactType = OCONV(XLATE('PROD_SPEC',PSNo,PROD_SPEC_REACTOR_TYPE$,'X'),'[REACT_TYPE_CONV]')
WaferSize = xlate( 'PROD_SPEC', PSNo, 'SUB_WAFER_SIZE', 'X' )
SWAP 75 WITH '' IN WaferSize
SWAP 100 WITH '' IN WaferSize
SWAP 125 WITH '' IN WaferSize
SWAP 150 WITH '' IN WaferSize
SWAP 200 WITH '' IN WaferSize
SWAP 'mm' WITH '' IN WaferSize
WaferSize = trim( WaferSize )
RecipeId = XLATE( 'PROD_SPEC', PSNo, 'RECIPE_NO_L1', 'X' )
EPIGases = XLATE( 'RECIPE', RecipeId, RECIPE_EPI_GASES$, 'X' )
* Reactors = WOStepRec<WO_STEP_REACTORS$>
Reactors = Xlate('PROD_SPEC', PSNo, PROD_SPEC_QUAL_REACTS$, 'X')
* BlockedReactors = WOStepRec<WO_STEP_BLOCKED_REACTORS$>
BlockedReactors = Xlate('PROD_SPEC', PSNo, PROD_SPEC_BLOCKED_REACTS$, 'X')
SchedReactors = XLATE('WO_LOG',WONo,'SCHED_REACTS','X')
CONVERT @VM TO ',' IN Reactors
CONVERT @VM TO ',' IN BlockedReactors
IF WaferQty > 0 THEN
LineCnt += 1
Results<LineCnt,1> = OCONV(XLATE( 'PROD_SPEC', PSNo, 'SPEC_TYPE', 'X' ),'[SPEC_TYPE_CONV]') ;* Spec Type
Results<LineCnt,2> = OCONV(WONo,'MD0') ;* WO
Results<LineCnt,3> = CompanyName ;* Company Name
Results<LineCnt,4> = OCONV(WaferQty,'MDO') ;* Wafer Qty
Results<LineCnt,5> = OCONV(PSNo,'MD0') ;* Prod Spec ID
Results<LineCnt,6> = CustPNs ;* Customer Part Numbers
Results<LineCnt,7> = PSReactType ;* Reactor type for Prod Spec
Results<LineCnt,8> = SchedReactors
Results<LineCnt,9> = WaferSize ;* Wafer Size
Results<LineCnt,10> = XLATE( 'PROD_SPEC', PSNo, 'TUBE_PRESSURE_TYPE', 'X' ) ;* Tube Pressure Type
Results<LineCnt,11> = EPIGases
Results<LineCnt,12> = XLATE( 'PROD_SPEC', PSNo, 'DOPANT_L1', 'X' ) ;* Dopant L1
Results<LineCnt,13> = XLATE( 'RECIPE', RecipeId, RECIPE_CAP_BURST_GASES$, 'X' ) ;* Cap Burst Gases
Results<LineCnt,14> = ShipThickTarget
Results<LineCnt,15> = ShipResTarget
Results<LineCnt,16> = OCONV(ExpectedRxDts<1,1>,'D4/')
Results<LineCnt,17> = OCONV(XLATE('WO_MAT',WONo:'*1',WO_MAT_RX_DTM$,'X')[1,'.'],'D4/')
Results<LineCnt,18> = OCONV(WORec<WO_LOG_PROMISE_SHIP_DT$>,'D4/')
Results<LineCnt,19> = Reactors
Results<LineCnt,20> = BlockedReactors
Results<LineCnt,21> = MUWafers
TempLine = Results<LineCnt>
CONVERT '"' TO '' IN TempLine
Results<LineCnt> = TempLine
END
REPEAT
PasteBlob = Results
* * * * * *
SWAP @VM WITH CHAR(9) IN PasteBlob
SWAP @FM WITH CRLF$ IN PasteBlob
CALL Set_Property('CLIPBOARD', 'TEXT', PasteBlob)
ExportColCnt = 20
* * * Paste it into a blank Excel Sheet
xlApp = OleCreateInstance("excel.Application")
IF OleStatus() THEN
Msg(@window, MsgUp)
ErrorMsg = 'Excel failed to start.':CRLF$:CRLF$
ErrorMsg := 'The data from this export is on your clipboard and can be pasted into Excel on your local machine using <Ctrl><V> .'
ErrMsg(ErrorMsg)
RETURN
END
xlWorkBooks = OleGetProperty(xlApp, "Workbooks")
xlWorkBook = OleCallMethod(xlWorkBooks,'Add')
* * * wait a second
Now = Time()
LOOP
CALL Yield()
WHILE Time() EQ Now
REPEAT
OlePutProperty(XlApp, 'Visible', xlSheetVisible)
void = OleCallMethod(xlWorkBook,'Activate')
xlActiveSheet = OleGetProperty(xlWorkBook,'ActiveSheet')
void = OleCallMethod(xlActiveSheet,'Paste')
eXcelCols = obj_Export('ExcelCol',TextColNos) ;* Returns alpha Excel columns from numeric columns
FirstLastCols = obj_Export('ExcelCol',1:@VM:ExportColCnt)
FirstColumn = FirstLastCols[1,@VM]
LastColumn = FirstLastCols[COL2()+1,@VM]
range = OleGetProperty(xlActiveSheet,'Range',FirstColumn:'1:':LastColumn:'1')
font = OleGetProperty(range,'Font')
OlePutProperty(font,'FontStyle','Bold')
OlePutProperty(font,'UnderLine',xlUnderlineStyleSingle)
column = OleGetProperty(xlActiveSheet,'Columns',FirstColumn:':':LastColumn)
void = OleCallMethod(column,'AutoFit')
Msg(@window, MsgUp)
RETURN

View File

@ -1,263 +0,0 @@
COMPILE SUBROUTINE Export_WO_Log_Orig( Dummy )
DECLARE FUNCTION Msg, Dialog_Box, Utility, obj_Export, obj_WO_Log
DECLARE FUNCTION Set_Printer, Get_Printer, obj_Install, Utility, obj_MUWafers
DECLARE SUBROUTINE Btree.Extract, RList, END_Dialog, Make.List, Msg, ErrMsg, SetInitDirOptions
$INSERT LSL_USERS_EQU
$INSERT MSG_EQUATES
$INSERT RLIST_EQUATES
$INSERT OIPRINT_EQUATES
$INSERT WO_LOG_EQU
$INSERT WO_STEP_EQU
$INSERT WO_MAT_EQUATES
$INSERT COMPANY_EQU
$INSERT QUOTE_EQU
$INSERT QUOTE_SPEC_EQU
$INSERT RECIPE_EQU
$INSERT ORDER_DET_EQU
$INSERT PROD_SPEC_EQUATES
$INSERT EXCEL_EQU
CRLF$ = \0D0A\
OPEN 'WO_STEP' TO WOStepTable ELSE
ErrMsg('Unable to open "WO_STEP" table in EXPORT_WO_LOG routine.')
RETURN
END
OPEN 'DICT.WO_STEP' TO DictWOStep ELSE
ErrMsg('Unable to open "DICT.WO_STEP" table in EXPORT_WO_LOG routine.')
RETURN
END
Def = ""
Def<MTEXT$> = "Selecting Uncheduled Work Orders..."
Def<MTYPE$> = "U"
MsgUp = Msg(@window, Def)
SelectSent = 'SELECT WO_STEP WITH SCHEDULED NE "Yes" '
RList(SelectSent,TARGET_ACTIVELIST$,'','','')
*SelectSent = 'SELECT WO_STEP WITH CURR_STATUS NE "CL" "COMP" '
*SelectSent = 'SELECT WO_STEP WITH CURR_STATUS = "NEW" "RTP" "RTS" "RX" "INPR" '
*RList(SelectSent,TARGET_ACTIVELIST$,'','','')
WOStepKeys = ''
Done = 0
LOOP
READNEXT WOStepKey ELSE Done = 1
UNTIL Done
WOStepKeys<-1> = WOStepKey
REPEAT
CONVERT @VM TO @FM IN WOStepKeys
IF WOStepKeys = '' THEN
Msg(@window, MsgUp)
ErrMsg('No Work Orders remain unscheduled.')
RETURN
END
Make.List('',WOStepKeys,WOStepTable,DictWOStep)
IF Get_Status(errCode) THEN
ErrMsg(errCode)
END
Results = ''
Results<1,1> = 'Spec Type'
Results<1,2> = 'WO'
Results<1,3> = 'Customer'
Results<1,4> = 'Qty'
Results<1,5> = 'PSN'
Results<1,6> = 'Cust Part Numbers'
Results<1,7> = 'Reactor Type'
Results<1,8> = 'Sched Reacts'
Results<1,9> = 'Inch'
Results<1,10> = 'Tube Press Type'
Results<1,11> = 'Epi Gases'
Results<1,12> = 'Dopant L1'
Results<1,13> = 'Cap/Burst Gases'
Results<1,14> = 'Thick Target'
Results<1,15> = 'Res Target'
Results<1,16> = 'Expected Rx Dt'
Results<1,17> = 'Received Date'
Results<1,18> = 'Promised Ship'
Results<1,19> = 'Qual'
Results<1,20> = 'Blkd'
Results<1,21> = 'MU Wfrs'
Done = 0
LineCnt = 1
LOOP
READNEXT WOStepKey ELSE Done = 1
UNTIL Done
READ WOStepRec FROM WOStepTable,WOStepKey THEN
IF WOStepRec<WO_STEP_SCHEDULED$> NE '1' THEN
WONo = WOStepKey[1,'*']
WORec = XLATE('WO_LOG',WONo,'','X')
WOMatKeys = WORec<WO_LOG_WO_MAT_KEY$>
CassCustPNs = XLATE('WO_MAT',WOMatKeys,WO_MAT_CUST_PART_NO$,'X')
CustPNs = ''
FOR I = 1 TO COUNT(CassCustPNs,@VM) + (CassCustPNs NE '')
LOCATE CassCustPNs<1,I> IN CustPNs USING @VM SETTING POS ELSE
CustPNs = INSERT(CustPNs,1,Pos,0,CassCustPNs<1,I>)
END
NEXT I
CompanyName = XLATE( 'COMPANY', WORec<WO_LOG_CUST_NO$>,COMPANY_CO_NAME$,'X')
SWAP ',' WITH '-' IN CompanyName
WaferQty = SUM(XLATE('WO_MAT',WOMatKeys,WO_MAT_WAFER_QTY$,'X'))
IF WaferQty > 0 THEN
ExpectedRxDts = ''
END ELSE
OrderNo = WORec<WO_LOG_ORDER_NO$>
OrderItems = WORec<WO_LOG_ORDER_ITEM$>
OrderDetKeys = ''
FOR N = 1 TO COUNT(OrderItems,@VM) + (OrderItems NE '')
OrderDetKeys<1,N> = OrderNo:'*':OrderItems<1,N>
NEXT N
WaferQty = SUM(XLATE('ORDER_DET',OrderDetKeys,ORDER_DET_ITEM_QTY$,'X'))
ExpectedRxDts = XLATE('ORDER_DET',OrderDetKeys,ORDER_DET_EXP_RX_DT$,'X')
END
MUWafers = obj_MUWafers('AvailWafers',WONo:@RM:WORec:@RM:0:@RM:1)
ShipThickTarget = XLATE('WO_LOG',WONo,'SHIP_THICK_TARGET','X')
ShipResTarget = XLATE('WO_LOG',WONo,'SHIP_RES_TARGET','X')
CustPSNs = XLATE('WO_STEP',@RECORD<34>,1,'X')
SWAP @VM WITH '\' IN CustPNs
PSNo = WOStepRec<WO_STEP_PROD_SPEC_ID$>
PSReactType = OCONV(XLATE('PROD_SPEC',PSNo,PROD_SPEC_REACTOR_TYPE$,'X'),'[REACT_TYPE_CONV]')
WaferSize = xlate( 'PROD_SPEC', PSNo, 'SUB_WAFER_SIZE', 'X' )
SWAP 75 WITH '' IN WaferSize
SWAP 100 WITH '' IN WaferSize
SWAP 125 WITH '' IN WaferSize
SWAP 150 WITH '' IN WaferSize
SWAP 200 WITH '' IN WaferSize
SWAP 'mm' WITH '' IN WaferSize
WaferSize = trim( WaferSize )
RecipeId = XLATE( 'PROD_SPEC', PSNo, 'RECIPE_NO_L1', 'X' )
EPIGases = XLATE( 'RECIPE', RecipeId, RECIPE_EPI_GASES$, 'X' )
Reactors = WOStepRec<WO_STEP_REACTORS$>
BlockedReactors = WOStepRec<WO_STEP_BLOCKED_REACTORS$>
SchedReactors = XLATE('WO_LOG',WONo,'SCHED_REACTS','X')
CONVERT @VM TO ',' IN Reactors
CONVERT @VM TO ',' IN BlockedReactors
IF WaferQty > 0 THEN
LineCnt += 1
Results<LineCnt,1> = OCONV(XLATE( 'PROD_SPEC', PSNo, 'SPEC_TYPE', 'X' ),'[SPEC_TYPE_CONV]') ;* Spec Type
Results<LineCnt,2> = OCONV(WONo,'MD0') ;* WO
Results<LineCnt,3> = CompanyName ;* Company Name
Results<LineCnt,4> = OCONV(WaferQty,'MDO') ;* Wafer Qty
Results<LineCnt,5> = OCONV(PSNo,'MD0') ;* Prod Spec ID
Results<LineCnt,6> = CustPNs ;* Customer Part Numbers
Results<LineCnt,7> = PSReactType ;* Reactor type for Prod Spec
Results<LineCnt,8> = SchedReactors
Results<LineCnt,9> = WaferSize ;* Wafer Size
Results<LineCnt,10> = XLATE( 'PROD_SPEC', PSNo, 'TUBE_PRESSURE_TYPE', 'X' ) ;* Tube Pressure Type
Results<LineCnt,11> = EPIGases
Results<LineCnt,12> = XLATE( 'PROD_SPEC', PSNo, 'DOPANT_L1', 'X' ) ;* Dopant L1
Results<LineCnt,13> = XLATE( 'RECIPE', RecipeId, RECIPE_CAP_BURST_GASES$, 'X' ) ;* Cap Burst Gases
Results<LineCnt,14> = ShipThickTarget
Results<LineCnt,15> = ShipResTarget
Results<LineCnt,16> = OCONV(ExpectedRxDts<1,1>,'D4/')
Results<LineCnt,17> = OCONV(XLATE('WO_MAT',WONo:'*1',WO_MAT_RX_DTM$,'X')[1,'.'],'D4/')
Results<LineCnt,18> = OCONV(WORec<WO_LOG_PROMISE_SHIP_DT$>,'D4/')
Results<LineCnt,19> = Reactors
Results<LineCnt,20> = BlockedReactors
Results<LineCnt,21> = MUWafers
TempLine = Results<LineCnt>
CONVERT '"' TO '' IN TempLine
Results<LineCnt> = TempLine
END
END
END
REPEAT
PasteBlob = Results
* * * * * *
SWAP @VM WITH CHAR(9) IN PasteBlob
SWAP @FM WITH CRLF$ IN PasteBlob
CALL Set_Property('CLIPBOARD', 'TEXT', PasteBlob)
ExportColCnt = 20
* * * Paste it into a blank Excel Sheet
xlApp = OleCreateInstance("excel.Application")
IF OleStatus() THEN
Msg(@window, MsgUp)
ErrorMsg = 'Excel failed to start.':CRLF$:CRLF$
ErrorMsg := 'The data from this export is on your clipboard and can be pasted into Excel on your local machine using <Ctrl><V> .'
ErrMsg(ErrorMsg)
RETURN
END
xlWorkBooks = OleGetProperty(xlApp, "Workbooks")
xlWorkBook = OleCallMethod(xlWorkBooks,'Add')
* * * wait a second
Now = Time()
LOOP
CALL Yield()
WHILE Time() EQ Now
REPEAT
OlePutProperty(XlApp, 'Visible', xlSheetVisible)
void = OleCallMethod(xlWorkBook,'Activate')
xlActiveSheet = OleGetProperty(xlWorkBook,'ActiveSheet')
void = OleCallMethod(xlActiveSheet,'Paste')
eXcelCols = obj_Export('ExcelCol',TextColNos) ;* Returns alpha Excel columns from numeric columns
FirstLastCols = obj_Export('ExcelCol',1:@VM:ExportColCnt)
FirstColumn = FirstLastCols[1,@VM]
LastColumn = FirstLastCols[COL2()+1,@VM]
range = OleGetProperty(xlActiveSheet,'Range',FirstColumn:'1:':LastColumn:'1')
font = OleGetProperty(range,'Font')
OlePutProperty(font,'FontStyle','Bold')
OlePutProperty(font,'UnderLine',xlUnderlineStyleSingle)
column = OleGetProperty(xlActiveSheet,'Columns',FirstColumn:':':LastColumn)
void = OleCallMethod(column,'AutoFit')
Msg(@window, MsgUp)
RETURN

View File

@ -593,15 +593,9 @@ Service RemoveRunID(RunID)
LogData<2> = @USER4
LogData<3> = EtchID
Machine = Environment_Services('GetServer')
If Machine NE 'MESSA01EC' then
EmailAddr = 'dstieber@srpcs.com,Dan.Crisp@infineon.com,4805890050@vtext.com,6613649828@txt.att.net'
EmailMsg = 'Error removing Run ID: ':RunID:' from APP_INFO*PRERUN_GAN_RUN_IDS'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$, EmailAddr, EmailMsg)
end else
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
end
end
end
end service
@ -1763,15 +1757,8 @@ Service RemoveCassFromWIP(WOMatKey)
end else
LogData<6> = 'Error removing Cass ID ':WOMatKey:' from queue ':CassQueue:'. Number of attempts: ':NumAttempts:'.'
end
Machine = Environment_Services('GetServer')
If Machine NE 'MESSA01EC' then
EmailAddr = 'dstieber@srpcs.com,6613649828@txt.att.net'
EmailMsg = 'Error removing Cass ID ':WOMatKey:' from queue ':CassQueue:'.'
Logging_Services('AppendLog', objWIPLog, LogData, @RM, @FM, False$, EmailAddr, EmailMsg)
end else
Logging_Services('AppendLog', objWIPLog, LogData, @RM, @FM, False$)
end
end
end else
// Cass not in queue that was passed in. Log this information.
LogData = ''
@ -1781,15 +1768,8 @@ Service RemoveCassFromWIP(WOMatKey)
LogData<4> = CassQueue
LogData<5> = CassQueue
LogData<6> = 'Error in ':Service:' service. Cass not in QueueID ':CassQueue:'.'
Machine = Environment_Services('GetServer')
If Machine NE 'MESSA01EC' then
EmailAddr = 'dstieber@srpcs.com,6613649828@txt.att.net'
EmailMsg = 'Error in ':Service:' service. Cass not in QueueID ':CassQueue:'.'
Logging_Services('AppendLog', objWIPLog, LogData, @RM, @FM, False$, EmailAddr, EmailMsg)
end else
Logging_Services('AppendLog', objWIPLog, LogData, @RM, @FM, False$)
end
end
end else
// WOMatKey is null
LogData = ''

File diff suppressed because it is too large Load Diff

View File

@ -69,4 +69,3 @@ API healthinfo.GET
HTTP_Resource_Services('LoremIpsum')
end api

View File

@ -382,7 +382,7 @@ Service GetAllZebraPrinters()
ZebraPrinterList<6> = 'MESZBRPRT007' : @VM : '10.95.1.13' : @VM : 9100
ZebraPrinterList<7> = 'MESZBRPRT008' : @VM : '10.95.164.24' : @VM : 9100
ZebraPrinterList<8> = 'MESZBRPRT0011' : @VM : '10.95.15.33' : @VM : 6101
ZebraPrinterList<9> = 'FI_ZEBRA_PRINTER' : @VM : '10.95.164.55' : @VM : 9100
ZebraPrinterList<9> = 'FI_ZEBRA_PRINTER' : @VM : '10.95.164.68' : @VM : 9100
If Server EQ 'MESTSA01EC' OR Server EQ 'MESSA01EC' or Server EQ 'MESTSA09EC' |
or Server EQ 'MESTSA010EC' or Server EQ 'MESTSA011EC' or Server EQ 'MESTSA012EC' then
ZebraPrinterList<10> = 'JONATHAN_HOME_TEST' : @VM : '192.168.0.123' : @VM : 9100

View File

@ -161,7 +161,3 @@ API Lock.HEAD
end
end api

View File

@ -0,0 +1,460 @@
Function Lotoperation_API(@API)
/***********************************************************************************************************************
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
permission from SRP Computer Solutions, Inc.
Name : Lotoperation_API
Description : API logic for the Lotoperation resource.
Notes : All web APIs should include the API_SETUP insert. This will provide several useful variables:
HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.)
APIURL - The URL for the API entry point (e.g., api.mysite.com/v1).
FullEndpointURL - The URL submitted by the client, including query params.
FullEndpointURLNoQuery - The URL submitted by the client, excluding query params.
EndpointSegment - The URL endpoint segment.
ParentURL - The URL path preceeding the current endpoint.
CurrentAPI - The name of this stored procedure.
Parameters :
API [in] -- Web API to process. Format is [APIPattern].[HTTPMethod]:
- APIPattern must follow this structure Lotoperation[.ID.[<Property>]]
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
Examples:
- Lotoperation.POST
- Lotoperation.ID.PUT
- Lotoperation.ID.firstName.GET
Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API
services do not rely upon anything being returned in the response. This is what the
various services like SetResponseBody and SetResponseStatus services are for. A response
value is only helpful if the developers want to use it for debug purposes.
History : (Date, Initials, Notes)
05/20/25 xxx Original programmer.
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
Declare function OI_Wizard_Services, Lot_Operation_Services, Database_Services, Lot_Services, Clean_Services
Declare function Met_Test_Services
Declare subroutine Lot_Services, Met_Test_Services, Wafer_Counter_Services
$insert APP_INSERTS
$insert API_SETUP
$insert HTTP_INSERTS
$insert OI_WIZARD_EQUATES
$insert LOT_OPERATION_EQUATES
GoToAPI else
// The specific resource endpoint doesn't have a API handler yet.
HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.')
end
Return Response OR ''
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Endpoint Handlers
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
API lotoperation.HEAD
API lotoperation.GET
HTTP_Resource_Services('LoremIpsum')
end api
API lotoperation.addoperation.POST
ErrorMessage = ''
ResponseCode = ''
ResponseMessage = ''
Body = ''
OIWizardID = ''
Cookies = HTTP_Services('GetHTTPCookie')
For each Cookie in Cookies using ';'
Key = Field(Cookie, '=', 1)
If Key EQ 'sessionID' then
OIWizardID = Field(Cookie, '=', 2)
end
Next Cookie
ValidSession = OI_Wizard_Services('ValidateSession', OIWizardID)
If ValidSession then
UserId = Xlate('OI_WIZARD', OIWizardID, OI_WIZARD.EMPLOYEE_ID$, 'X')
StatusCode = ''
Body = HTTP_Services('GetHTTPPostString', True$)
// The POST string will have been encoded so use percent (URL) decoding.
DecodedJSON = HTTP_Services('DecodePercentString', Body)
If SRP_JSON(objBody, 'Parse', Body) EQ '' then
LotId = SRP_JSON(objBody, 'GetValue', 'NewLotOperationData.LotId')
OperationId = SRP_JSON(objBody, 'GetValue', 'NewLotOperationData.OperationId')
Sequence = SRP_JSON(objBody, 'GetValue', 'NewLotOperationData.Sequence')
SRP_JSON(objBody, 'Release')
end
If RowExists('LOT', LotId) then
If RowExists('OPERATION', OperationId) then
If Sequence NE '' then
NewOperationId = Lot_Operation_Services('AddOperationToLot', LotId, OperationId, Sequence, UserId)
If Error_Services('NoError') then
LotJsonString = Lot_Services('ConvertLotRecordToJson', LotId, '', UserId)
HTTP_Services('SetResponseBody', LotJsonString, False$, 'application/hal+json')
ResponseCode = 200
end else
ErrorMessage = Error_Services('GetMessage')
ResponseCode = 500
end
end else
ErrorMessage = 'Invalid Sequence.'
ResponseCode = 500
end
end else
ErrorMessage = 'Invalid Operation.'
ResponseCode = 500
end
end else
ErrorMessage = 'Invalid Lot.'
ResponseCode = 500
end
end else
ErrorMessage = 'Invalid session. Reauthentication required.'
ResponseCode = 401
end
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
HTTP_Services('SetResponseStatus', ResponseCode, ErrorMessage)
end api
API lotoperation.removeoperation.POST
ErrorMessage = ''
ResponseCode = ''
ResponseMessage = ''
Body = ''
OIWizardID = ''
Cookies = HTTP_Services('GetHTTPCookie')
For each Cookie in Cookies using ';'
Key = Field(Cookie, '=', 1)
If Key EQ 'sessionID' then
OIWizardID = Field(Cookie, '=', 2)
end
Next Cookie
ValidSession = OI_Wizard_Services('ValidateSession', OIWizardID)
If ValidSession then
UserId = Xlate('OI_WIZARD', OIWizardID, OI_WIZARD.EMPLOYEE_ID$, 'X')
StatusCode = ''
Body = HTTP_Services('GetHTTPPostString', True$)
// The POST string will have been encoded so use percent (URL) decoding.
DecodedJSON = HTTP_Services('DecodePercentString', Body)
If SRP_JSON(objBody, 'Parse', Body) EQ '' then
LotOperationId = SRP_JSON(objBody, 'GetValue', 'LotOperationIdToRemove')
SRP_JSON(objBody, 'Release')
end
If RowExists('LOT_OPERATION', LotOperationId) then
LotId = Database_Services('ReadDataColumn', 'LOT_OPERATION', LotOperationId, LOT_OPERATION_LOT_ID$, True$, 0, False$)
Removed = Lot_Operation_Services('RemoveLotOperation', LotOperationId, UserId)
If Error_Services('NoError') then
LotJsonString = Lot_Services('ConvertLotRecordToJson', LotId, '', UserId)
HTTP_Services('SetResponseBody', LotJsonString, False$, 'application/hal+json')
ResponseCode = 200
end else
ErrorMessage = Error_Services('GetMessage')
ResponseCode = 500
end
end else
ErrorMessage = 'Invalid Operation.'
ResponseCode = 500
end
end else
ErrorMessage = 'Invalid session. Reauthentication required.'
ResponseCode = 401
end
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
HTTP_Services('SetResponseStatus', ResponseCode, ErrorMessage)
end api
API lotoperation.startlotoperation.POST
ErrorMessage = ''
ResponseCode = ''
ResponseMessage = ''
Body = ''
OIWizardID = ''
Cookies = HTTP_Services('GetHTTPCookie')
For each Cookie in Cookies using ';'
Key = Field(Cookie, '=', 1)
If Key EQ 'sessionID' then
OIWizardID = Field(Cookie, '=', 2)
end
Next Cookie
ValidSession = OI_Wizard_Services('ValidateSession', OIWizardID)
If ValidSession then
UserId = Xlate('OI_WIZARD', OIWizardID, OI_WIZARD.EMPLOYEE_ID$, 'X')
StatusCode = ''
Body = HTTP_Services('GetHTTPPostString', True$)
// The POST string will have been encoded so use percent (URL) decoding.
DecodedJSON = HTTP_Services('DecodePercentString', Body)
If SRP_JSON(objBody, 'Parse', Body) EQ '' then
LotOperationId = SRP_JSON(objBody, 'GetValue', 'lotOperationId')
SRP_JSON(objBody, 'Release')
end
LotProcessStarted = Lot_Operation_Services('StartLotOperation', LotOperationId, UserId)
If Error_Services('NoError') then
LotOperationJson = Lot_Operation_Services('ConvertRecordToJson', LotOperationId)
HTTP_Services('SetResponseBody', LotOperationJson,False$, 'application/hal+json')
ResponseCode = 200
end else
ErrorMessage = 'Error while moving lot in. ' : Error_Services('GetMessage')
ResponseCode = 500
end
end else
ErrorMessage = 'Invalid session. Reauthentication required.'
ResponseCode = 401
end
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
HTTP_Services('SetResponseStatus', ResponseCode, ErrorMessage)
end api
API lotoperation.completelotoperation.POST
ErrorMessage = ''
ResponseCode = ''
ResponseMessage = ''
Body = ''
OIWizardID = ''
Cookies = HTTP_Services('GetHTTPCookie')
For each Cookie in Cookies using ';'
Key = Field(Cookie, '=', 1)
If Key EQ 'sessionID' then
OIWizardID = Field(Cookie, '=', 2)
end
Next Cookie
ValidSession = OI_Wizard_Services('ValidateSession', OIWizardID)
If ValidSession then
UserId = Xlate('OI_WIZARD', OIWizardID, OI_WIZARD.EMPLOYEE_ID$, 'X')
StatusCode = ''
Body = HTTP_Services('GetHTTPPostString', True$)
// The POST string will have been encoded so use percent (URL) decoding.
DecodedJSON = HTTP_Services('DecodePercentString', Body)
If SRP_JSON(objBody, 'Parse', Body) EQ '' then
LotOperationId = SRP_JSON(objBody, 'GetValue', 'lotOperationId')
SRP_JSON(objBody, 'Release')
end
LotProcessCompleted = Lot_Operation_Services('CompleteLotOperation', LotOperationId, UserId)
If Error_Services('NoError') then
LotOperationJson = Lot_Operation_Services('ConvertRecordToJson', LotOperationId)
HTTP_Services('SetResponseBody', LotOperationJson)
ResponseCode = 200
end else
ErrorMessage = Error_Services('GetMessage')
ResponseCode = 500
end
end else
ErrorMessage = 'Invalid session. Reauthentication required.'
ResponseCode = 401
end
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
HTTP_Services('SetResponseStatus', ResponseCode, ErrorMessage)
end api
API lotoperation.ID.HEAD
API lotoperation.ID.GET
ErrorMessage = ''
ResponseCode = ''
ResponseMessage = ''
Body = ''
OIWizardID = ''
Cookies = HTTP_Services('GetHTTPCookie')
For each Cookie in Cookies using ';'
Key = Field(Cookie, '=', 1)
If Key EQ 'sessionID' then
OIWizardID = Field(Cookie, '=', 2)
end
Next Cookie
ValidSession = OI_Wizard_Services('ValidateSession', OIWizardID)
If ValidSession then
LotOperationId = EndpointSegment
If RowExists('LOT_OPERATION', LotOperationId) then
LotOperationJson = Lot_Operation_Services('ConvertRecordToJson', LotOperationId)
HTTP_Services('SetResponseBody', LotOperationJson, False$, 'application/hal+json')
ResponseCode = 200
end else
ErrorMessage = 'Lot Operation not found in database.'
end
end else
ErrorMessage = 'Invalid session. Reauthentication required.'
ResponseCode = 401
end
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
HTTP_Services('SetResponseStatus', ResponseCode, ErrorMessage)
end api
API lotoperation.associatemettest.POST
ErrorMessage = ''
ResponseCode = ''
ResponseMessage = ''
Body = ''
OIWizardID = ''
Cookies = HTTP_Services('GetHTTPCookie')
For each Cookie in Cookies using ';'
Key = Field(Cookie, '=', 1)
If Key EQ 'sessionID' then
OIWizardID = Field(Cookie, '=', 2)
end
Next Cookie
ValidSession = OI_Wizard_Services('ValidateSession', OIWizardID)
If ValidSession then
UserId = Xlate('OI_WIZARD', OIWizardID, OI_WIZARD.EMPLOYEE_ID$, 'X')
StatusCode = ''
Body = HTTP_Services('GetHTTPPostString', True$)
// The POST string will have been encoded so use percent (URL) decoding.
DecodedJSON = HTTP_Services('DecodePercentString', Body)
If SRP_JSON(objBody, 'Parse', Body) EQ '' then
LotOperationId = SRP_JSON(objBody, 'GetValue', 'LotOperationId')
MetTestId = SRP_JSON(objBody, 'GetValue', 'MetTestId')
SRP_JSON(objBody, 'Release')
end
Met_Test_Services('AttachMetTestToLotOperation', MetTestId, LotOperationId, UserId)
If Error_Services('NoError') then
ResponseCode = 200
end else
ErrorMessage = Error_Services('GetMessage')
ResponseCode = 500
end
end else
ErrorMessage = 'Invalid session. Reauthentication required.'
ResponseCode = 401
end
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
HTTP_Services('SetResponseStatus', ResponseCode, ErrorMessage)
end api
API lotoperation.removemettest.POST
ErrorMessage = ''
ResponseCode = ''
ResponseMessage = ''
Body = ''
OIWizardID = ''
Cookies = HTTP_Services('GetHTTPCookie')
For each Cookie in Cookies using ';'
Key = Field(Cookie, '=', 1)
If Key EQ 'sessionID' then
OIWizardID = Field(Cookie, '=', 2)
end
Next Cookie
ValidSession = OI_Wizard_Services('ValidateSession', OIWizardID)
If ValidSession then
UserId = Xlate('OI_WIZARD', OIWizardID, OI_WIZARD.EMPLOYEE_ID$, 'X')
StatusCode = ''
Body = HTTP_Services('GetHTTPPostString', True$)
// The POST string will have been encoded so use percent (URL) decoding.
DecodedJSON = HTTP_Services('DecodePercentString', Body)
If SRP_JSON(objBody, 'Parse', Body) EQ '' then
LotOperationId = SRP_JSON(objBody, 'GetValue', 'LotOperationId')
MetTestId = SRP_JSON(objBody, 'GetValue', 'MetTestId')
SRP_JSON(objBody, 'Release')
end
Met_Test_Services('RemoveMetTestFromLotOperation', MetTestId, LotOperationId, UserId)
If Error_Services('NoError') then
HTTP_Services('SetResponseBody', LotJsonString, False$, 'application/hal+json')
ResponseCode = 200
end else
ErrorMessage = Error_Services('GetMessage')
ResponseCode = 500
end
end else
ErrorMessage = 'Invalid session. Reauthentication required.'
ResponseCode = 401
end
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
HTTP_Services('SetResponseStatus', ResponseCode, ErrorMessage)
end api
API lotoperation.associatewafercounter.POST
ErrorMessage = ''
ResponseCode = ''
ResponseMessage = ''
Body = ''
OIWizardID = ''
Cookies = HTTP_Services('GetHTTPCookie')
For each Cookie in Cookies using ';'
Key = Field(Cookie, '=', 1)
If Key EQ 'sessionID' then
OIWizardID = Field(Cookie, '=', 2)
end
Next Cookie
ValidSession = OI_Wizard_Services('ValidateSession', OIWizardID)
If ValidSession then
UserId = Xlate('OI_WIZARD', OIWizardID, OI_WIZARD.EMPLOYEE_ID$, 'X')
StatusCode = ''
Body = HTTP_Services('GetHTTPPostString', True$)
// The POST string will have been encoded so use percent (URL) decoding.
DecodedJSON = HTTP_Services('DecodePercentString', Body)
If SRP_JSON(objBody, 'Parse', Body) EQ '' then
LotOperationId = SRP_JSON(objBody, 'GetValue', 'LotOperationId')
WaferCounterId = SRP_JSON(objBody, 'GetValue', 'WaferCounterId')
SRP_JSON(objBody, 'Release')
end
Wafer_Counter_Services('AssociateWaferCounter', LotOperationId, WaferCounterId, UserId)
If Error_Services('NoError') then
ResponseCode = 200
end else
ErrorMessage = Error_Services('GetMessage')
ResponseCode = 500
end
end else
ErrorMessage = 'Invalid session. Reauthentication required.'
ResponseCode = 401
end
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
HTTP_Services('SetResponseStatus', ResponseCode, ErrorMessage)
end api

View File

@ -38,9 +38,12 @@ Function Lot_API(@API)
#pragma precomp SRP_PreCompiler
Declare function OI_Wizard_Services, Lot_Services, Database_Services, PSN_Services, Clean_Services
$insert APP_INSERTS
$insert API_SETUP
$insert HTTP_INSERTS
$Insert OI_WIZARD_EQUATES
GoToAPI else
// The specific resource endpoint doesn't have a API handler yet.
@ -55,3 +58,159 @@ Return Response OR ''
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
API lot.ID.HEAD
API lot.ID.GET
ErrorMessage = ''
ResponseCode = ''
ResponseMessage = ''
Body = ''
OIWizardID = ''
UserId = ''
Cookies = HTTP_Services('GetHTTPCookie')
For each Cookie in Cookies using ';'
Key = Field(Cookie, '=', 1)
If Key EQ 'sessionID' then
OIWizardID = Field(Cookie, '=', 2)
end
Next Cookie
ValidSession = OI_Wizard_Services('ValidateSession', OIWizardID)
If ValidSession then
UserId = Xlate('OI_WIZARD', OIWizardID, OI_WIZARD.EMPLOYEE_ID$, 'X')
LotId = EndpointSegment
If RowExists('LOT', LotId) then
LotJson = Lot_Services('ConvertLotRecordToJson', LotId, '', UserId)
HTTP_Services('SetResponseBody', LotJson, False$, 'application/hal+json')
ResponseCode = 200
end else
ResponseCode = 500
ErrorMessage = 'Lot not found in database.'
end
end else
ErrorMessage = 'Invalid session. Reauthentication required.'
ResponseCode = 401
end
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
HTTP_Services('SetResponseStatus', ResponseCode, ErrorMessage)
end api
API lot.getlotbylegacylotid.HEAD
API lot.getlotbylegacylotid.GET
ErrorMessage = ''
ResponseCode = ''
ResponseMessage = ''
Body = ''
OIWizardID = ''
Cookies = HTTP_Services('GetHTTPCookie')
For each Cookie in Cookies using ';'
Key = Field(Cookie, '=', 1)
If Key EQ 'sessionID' then
OIWizardID = Field(Cookie, '=', 2)
end
Next Cookie
ValidSession = OI_Wizard_Services('ValidateSession', OIWizardID)
If ValidSession then
UserId = Xlate('OI_WIZARD', OIWizardID, OI_WIZARD.EMPLOYEE_ID$, 'X')
StatusCode = ''
Body = HTTP_Services('GetHTTPGetString')
LegacyLotId = Http_Services('GetQueryField', 'LegacyLotId')
LegacyLotType = Http_Services('GetQueryField', 'LegacyLotType')
LotId = Lot_Services('GetLotIdByLegacyLotIdAndType', LegacyLotId, LegacyLotType)
LotJson = Lot_Services('ConvertLotRecordToJson', LotId, '', UserId)
If Error_Services('NoError') then
HTTP_Services('SetResponseBody', LotJson, False$, 'application/hal+json')
ResponseCode = 200
end else
ErrorMessage = Error_Services('GetMessage')
ResponseCode = 500
end
end else
ErrorMessage = 'Invalid session. Reauthentication required.'
ResponseCode = 401
end
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
HTTP_Services('SetResponseStatus', ResponseCode, ErrorMessage)
end api
end api
API lot.ID.getrecipeoptions.HEAD
API lot.ID.getrecipeoptions.GET
JSONCollection = ''
OIWizardID = ''
Cookies = HTTP_Services('GetHTTPCookie')
For each Cookie in Cookies using ';'
Key = Field(Cookie, '=', 1)
If Key EQ 'sessionID' then
OIWizardID = Field(Cookie, '=', 2)
end
Next Cookie
ValidSession = OI_Wizard_Services('ValidateSession', OIWizardID)
If ValidSession then
LotId = EndpointSegment
PSN = Database_Services('ReadDataColumn', 'LOT', LotId, LOT_PROD_SPEC_ID$, True$, 0, False$)
RecipeParameters = PSN_Services('GetAllMetrologyRecipes', PSN, True$, True$, True$, True$)
If Error_Services('NoError') then
If Body NE '' then
RequestJson = HTTP_Services('DecodePercentString', Body)
objJSONResponse = ''
If SRP_Json(objJSONResponse, 'New', 'Object') then
//Available Tools
If SRP_Json(objCleanTools, 'New', 'Array') then
CleanTools = Clean_Services('GetCleanToolOptions')
for each CleanTool in CleanTools using @FM
SRP_Json(objCleanTools, 'AddValue', CleanTool, 'String')
Next CleanTool
SRP_Json(objJsonResponse, 'Set', 'CleanToolOptions', objCleanTools)
SRP_Json(objCleanTools, 'Release')
end
//Available Recipes
If SRP_Json(objCleanRecipes, 'New', 'Array') then
CleanRecipes = Clean_Services('GetCleanRecipeOptions')
for each Recipe in CleanRecipes using @VM
SRP_Json(objCleanRecipes, 'AddValue', Recipe, 'String')
Next Recipe
SRP_Json(objJsonResponse, 'Set', 'CleanRecipeOptions', objCleanRecipes)
SRP_Json(objCleanRecipes, 'Release')
end
JsonResponse = SRP_Json(objJsonResponse, 'Stringify', 'Styled')
SRP_Json(objJsonResponse, 'Release')
end else
Error_Services('Add', 'Error when creating JSON response.')
end
end else
Error_Services('Add', 'No body was sent with the request.')
end
end else
ErrorMessage = Error_Services('GetMessage')
end
If Error_Services('NoError') then
HTTP_Services('SetResponseStatus', 201, 'Success')
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
HTTP_Services('SetResponseBody', JsonResponse, False$, 'application/hal+json')
end else
HTTP_Services('SetResponseStatus', 400, Error_Services('GetMessage'))
end
end else
HTTP_Services('SetResponseStatus', 401, 'Invalid session. Reauthentication required.')
end
end api

View File

@ -1,17 +1,65 @@
Compile function Lot_Event_Services(@Service, @Params)
/***********************************************************************************************************************
Name : Lot_Event_Services
Description : Handler program for all LOT_EVENT services.
Notes : Application errors should be logged using the Error Services module. There are a few methodological
assumptions built into way errors are managed which are important to understand in order to properly
work with Error Services:
- The term 'top' refers to the originating procedure of a call stack and the term 'bottom' refers to
the last routine (or the current routine) within a call stack. Within the OpenInsight Debugger
this will appear backwards since the originating procedure always appears at the bottom of the
list and the current routine appears at the top of the list. We are using this orientation because
it is common to refer to the process of calling other procedures as 'drilling down'.
- The reason for defining the orientation of the call stack is because Error_Services allows for
multiple error conditions to be appended to an original error. In most cases this will happen when
a procedure at the bottom of the stack generates an error condition and then returns to its
calling procedure. This higher level procedure can optionally add more information relevant to
itself. This continues as the call stack 'bubbles' its way back to the top to where the
originating procedure is waiting.
- Native OpenInsight commands that handle errors (e.g., Set_Status, Set_FSError, Set_EventStatus)
preserve their error state until explicitly cleared. This can hinder the normal execution of code
since subsequent procedures (usually SSPs) will fail if a pre-existing error condition exists.
Our philosophy is that error conditions should automatically be cleared before a new procedure
is executed to avoid this problem. However, the nature of Basic+ does not make this easy to
automate for any given stored procedure. Therefore, if a stored procedure wants to conform to our
philosophy then it should include a call into the 'Clear' service request at the top of the
program. Alternatively this can be done through a common insert (see SERVICE_SETUP for example.)
- Service modules will use the SERVICE_SETUP insert and therefore automatically clear out any
error conditions that were set before.
Parameters :
Service [in] -- Name of the service being requested
Param1-10 [in/out] -- Additional request parameter holders
Response [out] -- Response to be sent back to the Controller (MCP) or requesting procedure
Metadata :
History : (Date, Initials, Notes)
07/01/25 djs Modified CreateLotEvent to use Transaction Queue instead of Proc Queue to avoid locking
errors on LOT table. Updated error throwing.
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
Declare function Error_Services, Logging_Services, Environment_Services, Database_Services, RTI_CreateGUID, Lot_Services
Declare function Lot_Event_Services
Declare subroutine Error_Services, Logging_Services, Database_Services, Lot_Services, Service_Services
$insert LOGICAL
$Insert SERVICE_SETUP
$insert APP_INSERTS
$Insert LOT_EVENT_EQUATES
$Insert LOT_EQUATES
$Insert LOT_OPERATION_EQUATES
Options EVENT_TYPES = 'MOVE_IN', 'MOVE_OUT', 'HOLD_ON', 'HOLD_OFF', 'REDUCE_WAFER_QTY', 'BONUS_WAFER_QTY', 'COMMENT', 'LOCATION', 'LOAD', 'UNSIGN_LOAD', 'TW_USE', 'CLOSE'
Declare function Error_Services, Logging_Services, Environment_Services, Database_Services, RTI_CreateGUID
Declare function Lot_Event_Services, Lot_Services
Declare subroutine Error_Services, Logging_Services, Database_Services, Lot_Services, Service_Services
Declare subroutine Transaction_Services
Options EVENT_TYPES = 'MOVE_IN', 'MOVE_OUT', 'HOLD_ON', 'HOLD_OFF', 'REDUCE_WAFER_QTY', 'BONUS_WAFER_QTY', 'COMMENT', 'LOCATION', 'LOAD', 'UNSIGN_LOAD', 'TW_USE', 'CLOSE', 'SIGN_FQA', 'UNSIGN_FQA', 'ADD_LOT_OPERATION', 'REMOVE_LOT_OPERATION', 'MET_TEST', 'LOG_WAFER_COUNT', 'PACKAGING'
Options LOT_TYPES = 'TW', 'RDS', 'WM_OUT', 'WM_IN', 'WO_MAT', 'LOT'
Options LEGACY_LOT_TYPES = 'RDS', 'WM_OUT', 'WM_IN'
Options BOOLEAN = 'True', 'False'
@ -20,15 +68,15 @@ GoToService
Return Response or ""
//-----------------------------------------------------------------------------
// SERVICES
//-----------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------------------------
// Services
//----------------------------------------------------------------------------------------------------------------------
Service CreateLotEvent(LotId, EventDateTime, EventType=EVENT_TYPES, EventNote, EventEquipmentId, OperatorId, IsLegacyLotId=BOOLEAN, LegacyLotType=LEGACY_LOT_TYPES)
GoSub InitEventLog
ErrorMessage = ''
//Handle Legacy Lots
// Handle Legacy Lots
If IsLegacyLotId then
If LegacyLotType NE '' then
LegacyLotId = LotId
@ -55,7 +103,8 @@ Service CreateLotEvent(LotId, EventDateTime, EventType=EVENT_TYPES, EventNote, E
NewEventRec<LOT_EVENT_SEQUENCE$> = NewEventSequence
Database_Services('WriteDataRow', 'LOT_EVENT', NewEventId, NewEventRec)
If Error_Services('NoError') then
Service_Services('PostProcedure', 'LOT_EVENT_SERVICES', 'SetLatestLotEvent':@VM:LotId:@VM:NewEventId, True$)
Transaction_Services('PostWriteFieldTransaction', 'LOT', LotId, LOT_MOST_RECENT_LOT_EVENT_ID$, NewEventId)
If Error_Services('HasError') then ErrorMessage = Error_Services('GetMessage')
end else
ErrorMessage = 'Error creating new event : ' : Error_Services('GetMessage')
end
@ -89,6 +138,7 @@ Service CreateLotEvent(LotId, EventDateTime, EventType=EVENT_TYPES, EventNote, E
end service
Service GetLotEventNextSequence(LotId)
ErrorMessage = ''
@ -111,26 +161,37 @@ Service GetLotEventNextSequence(LotId)
end else
Error_Services('Add', ErrorMessage)
end
end service
//Returns a @FM delimited list of events in sequence
// Returns a @FM delimited list of events in sequence
Service GetLotEventsInSequence(LotId)
ErrorMsg = ''
LotEventsUnsorted = ''
LotEventsSorted = ''
LotEventsToReturn = ''
If LotID NE '' then
//Get Operations
// Get Operations
LotEvents = Xlate('LOT', LotId, LOT_LOT_EVENTS$, 'X')
for each LotEvent in LotEvents using @VM
ThisEventSequence = XLATE('LOT_EVENT', LotEvent, LOT_EVENT_SEQUENCE$, 'X')
LotEventsToReturn<ThisEventSequence> = LotEvent
Next LotOperation
end else
//error: lot id was null
ErrorMsg = 'Error in ':Service:' service. Null LotID passed into service.'
end
If ErrorMsg EQ '' then
Response = LotEventsToReturn
end else
Error_Services('Add', ErrorMsg)
end
end service
Service SetLatestLotEvent(LotId, LotEventId)
ErrorMessage = ''
@ -148,14 +209,14 @@ Service SetLatestLotEvent(LotId, LotEventId)
end else
ErrorMessage = 'Lot Id ' : LotId : ' not found in LOT table.'
end
If ErrorMessage NE '' then
Error_Services('Add', ErrorMessage)
end
If ErrorMessage NE '' then Error_Services('Add', ErrorMessage)
end service
/* * * * * * * * * *
* INTERNAL GOSUBS
* * * * * * * * * */
//----------------------------------------------------------------------------------------------------------------------
// Internal GoSubs
//----------------------------------------------------------------------------------------------------------------------
InitEventLog:
@ -170,3 +231,5 @@ InitEventLog:
return

View File

@ -0,0 +1,524 @@
Compile function Lot_Operation_Services(@Service, @Params)
#pragma precomp SRP_PreCompiler
Declare function Lot_Services, Database_Services, Error_Services, Srp_Sort_Array, Lot_Operation_Services
Declare function RTI_CreateGUID, MemberOf, SRP_JSON, Operation_Services, Datetime, Met_Test_Services, PSN_Services
Declare function Date_Services, SRP_Stopwatch
Declare subroutine Database_Services, Error_Services, SRP_JSON, Lot_Services, Lot_Event_Services, Lot_Operation_Services, SRP_Stopwatch
$insert LOGICAL
$insert LOT_EQUATES
$Insert LOT_OPERATION_EQUATES
$Insert OPERATION_EQUATES
$Insert MET_TEST_EQUATES
$Insert WAFER_COUNTER_EQUATES
Options OPERATION_TYPE = 'CLEAN', 'THICK_METROLOGY', 'RES_METROLOGY', 'SURFACE_METROLOGY', 'VISUAL_INSPECTION', 'PACKAGING'
GoToService
Return Response or ""
//-----------------------------------------------------------------------------
// SERVICES
//-----------------------------------------------------------------------------
Service AddOperationToLot(LotId, OperationId, PrescribedSequence, UserId)
Operation = ''
ErrorMessage = ''
If RowExists('LOT', LotId) then
If RowExists('OPERATION', OperationId) then
OperationActive = XLATE('OPERATION', OperationId, OPERATION_ACTIVE$, 'X')
If OperationActive then
If PrescribedSequence AND Num(PrescribedSequence) then
If Lot_Services('CanUserModifyLot', UserId) then
LotCurrOperation = Lot_Services('GetLotCurrOperationId', LotId)
CurrOperationSequence = Xlate('LOT_OPERATION', LotCurrOperation, LOT_OPERATION_OPERATION_SEQUENCE$, 'X')
If CurrOperationSequence LT PrescribedSequence then
//Get Curr Operation Sequence
Done = False$
LotCurrOperationSequence = Lot_Services('GetLotOperationSequence', LotId)
for each Operation in LotCurrOperationSequence using @Fm setting OpPos
ThisOperationRec = Database_Services('ReadDataRow', 'LOT_OPERATION', Operation)
ThisOperationSequence = ThisOperationRec<LOT_OPERATION_OPERATION_SEQUENCE$>
If ThisOperationSequence GE PrescribedSequence then
NewOperationSequence = ThisOperationSequence + 1
ThisOperationRec<LOT_OPERATION_OPERATION_SEQUENCE$> = NewOperationSequence
Database_Services('WriteDataRow', 'LOT_OPERATION', Operation, ThisOperationRec)
If Error_Services('HasError') then
Done = True$
ErrorMessage = Error_Services('GetMessage')
end
end
Until Done
Next Operation
If ErrorMessage EQ '' then
LotOperationRecID = RTI_CreateGUID()
If Not(RowExists('LOT_OPERATION', LotOperationRecID)) then
OperationRec = Database_Services('ReadDataRow', 'OPERATION', OperationId)
Class = OperationRec<OPERATION_CLASS_ID$>
Type = OperationRec<OPERATION_TYPE$>
Rework = OperationRec<OPERATION_REWORK$>
ThisNewOperationRec = Database_Services('ReadDataRow', 'OPERATION', OperationId)
LotOperationRec = ''
LotOperationRec<LOT_OPERATION_LOT_ID$> = LotId
LotOperationRec<LOT_OPERATION_OPERATION_ID$> = OperationId
LotOperationRec<LOT_OPERATION_OPERATION_SEQUENCE$> = PrescribedSequence
LotOperationRec<LOT_OPERATION_REWORK$> = Rework
LotOperationRec<LOT_OPERATION_OPERATION_TYPE$> = Type
LotOperationRec<LOT_OPERATION_OPERATION_CLASS$> = Class
LotOperationRec<LOT_OPERATION_MET_TEST_TYPE_REQUIRED$> = OperationRec<OPERATION_MET_TEST_TYPE_REQUIRED$>
LotOperationRec<LOT_OPERATION_MET_TEST_REQUIRED$> = OperationRec<OPERATION_MET_TEST_REQUIRED$>
LotOperationRec<LOT_OPERATION_PACKAGING_REQUIRED$> = OperationRec<OPERATION_PACKAGING_REQUIRED$>
LotOperationRec<LOT_OPERATION_CLEAN_REQUIRED$> = OperationRec<OPERATION_CLEAN_REQUIRED$>
LotOperationRec<LOT_OPERATION_WAFER_COUNTER_REQUIRED$> = OperationRec<OPERATION_WAFER_COUNTER_REQUIRED$>
IsOperationRework = Database_Services('ReadDataColumn', 'OPERATION', OperationId, OPERATION_REWORK$)
Database_Services('WriteDataRow', 'LOT_OPERATION', LotOperationRecId, LotOperationRec)
If Error_Services('NoError') then
OperationDesc = XLATE('OPERATION', OperationId, OPERATION_OPERATION_DESCRIPTION$, 'X')
Lot_Event_Services('CreateLotEvent', LotId, Datetime(), 'ADD_LOT_OPERATION', 'Added operation ' : Quote(OperationDesc) : ' to lot.', '', UserId)
end else
ErrorMessage = Error_Services('GetMessage')
end
end else
ErrorMessage = 'Lot Operation already existed, cannot overwrite'
end
end
end else
ErrorMessage = 'Not allowed to add new operations prior to current operation'
end
end else
ErrorMessage = 'User ' : UserId : ' does not have permission to modify lots.'
end
end else
ErrorMessage = 'Invalid operation sequence entered.'
end
end else
ErrorMessage = 'Operation is inactive. Unable to add.'
end
end else
ErrorMessage = 'Operation ' : OperationId : 'not found in OPERATION table.'
end
end else
ErrorMessage = 'Lot ' : LotId : ' not found in LOT table.'
end
If ErrorMessage EQ '' then
Response = Operation
end else
Error_Services('Add', 'Error in ' : Service : '.' : ErrorMessage)
end
end service
Service RemoveLotOperation(LotOperationId, UserId)
//Todo User permission check
ErrorMessage = ''
Success = False$
If RowExists('LOT_OPERATION', LotOperationId) then
If Lot_Services('CanUserModifyLot', UserId) then
LotOperationRec = Database_Services('ReadDataRow', 'LOT_OPERATION', LotOperationId, True$, 0, False$)
LotId = LotOperationRec<LOT_OPERATION_LOT_ID$>
MoveInTime = LotOperationRec<LOT_OPERATION_DATETIME_IN$>
MoveOutTime = LotOperationRec<LOT_OPERATION_DATETIME_OUT$>
Sequence = LotOperationRec<LOT_OPERATION_OPERATION_SEQUENCE$>
OperationId = LotOperationRec<LOT_OPERATION_OPERATION_ID$>
OperationClass = XLATE('OPERATION', OperationId, OPERATION_CLASS_ID$, 'X')
If OperationClass NE 'RTF_DEFAULT' AND OperationClass NE 'RTF_DEFAULT_END' then
If MoveInTime EQ '' AND MoveOutTime EQ '' then
LotOperationRec<LOT_OPERATION_LOT_ID$> = '';//Nulling this value out should disassociated the lot operation record from the lot.
Database_Services('WriteDataRow', 'LOT_OPERATION', LotOperationId, LotOperationRec)
If Error_Services('NoError') then
Lot_Operation_Services('UpdateLotOperationSequence', LotId, Sequence)
If Error_Services('NoError') then
Success = True$
end else
ErrorMessage = Error_Services('GetMessage')
end
OperationDesc = XLATE('OPERATION', OperationId, OPERATION_OPERATION_DESCRIPTION$, 'X')
Lot_Event_Services('CreateLotEvent', LotId, Datetime(), 'REMOVE_LOT_OPERATION', 'Removed operation ' : Quote(OperationDesc) : ' from lot.', '', UserId)
end else
ErrorMessage = Error_Services('GetMessage')
end
end else
ErrorMessage = 'Lot has already started processing on operation ' : OperationId
end
end else
ErrorMessage = 'Unable to remove default operations.'
end
end else
ErrorMessage = 'User ' : UserId : ' does not have permission modify lots.'
end
end else
ErrorMessage = 'Lot Operation record not found'
end
If ErrorMessage NE '' then
Error_Services('Add', ErrorMessage)
end
Response = Success
end service
Service UpdateLotOperationSequence(LotId, StartSequence)
ErrorMessage = ''
If StartSequence EQ '' then
StartSequence = 1
end
If RowExists('LOT', LotId) then
LotOperationSequence = Lot_Services('GetLotOperationSequence', LotId)
Offset = 0
for each LotOperationId in LotOperationSequence using @FM setting SeqPos
If LotOperationId NE '' then
ThisLotOperationRec = Database_Services('ReadDataRow', 'LOT_OPERATION', LotOperationId, True$, 0, False$)
OrigSeq = ThisLotOperationRec<LOT_OPERATION_OPERATION_SEQUENCE$>
NewSeq = OrigSeq - Offset
ThisLotOperationRec<LOT_OPERATION_OPERATION_SEQUENCE$> = NewSeq
Database_Services('WriteDataRow', 'LOT_OPERATION', LotOperationId, ThisLotOperationRec)
If Error_Services('HasError') then
ErrorMessage = Error_Services('GetMessage')
end
end else
Offset += 1
end
Until ErrorMessage NE ''
Next LotOperation
end else
ErrorMessage = 'Lot Id not found'
end
If ErrorMessage NE '' then
Error_Services('Add', 'Error in ' : Service : ' : ' : ErrorMessage)
end
end service
Service GetAvailableSequences(LotId)
AvailableSequences = ''
If RowExists('LOT', LotId) then
CurrentLotOperations = Lot_Services('GetLotOperationSequence', LotId)
For each LotOperationId in CurrentLotOperations using @FM setting Sequence
LotOperationRec = Database_Services('ReadDataRow', 'LOT_OPERATION', LotOperationId, True$, 0, False$)
OperationId = LotOperationRec<LOT_OPERATION_OPERATION_ID$>
OperationClass = Database_Services('ReadDataColumn', 'OPERATION', OperationId, OPERATION_CLASS_ID$)
StartDtm = LotOperationRec<LOT_OPERATION_DATETIME_IN$>
If StartDTM EQ '' then
AvailableSequences<1, -1> = Sequence + 1
end
Next LotOperationId
end
Response = AvailableSequences
end service
Service ConvertRecordToJson(LotOperationId)
JsonString = ''
objJSON = ''
LotOperationRec = Database_Services('ReadDataRow', 'LOT_OPERATION', LotOperationId, True$, 0, False$)
If SRP_JSON(objJSON, 'New', 'Object') then
SRP_JSON(objJSON, 'SetValue', 'LotOperationId', LotOperationId)
LotId = LotOperationRec<LOT_OPERATION_LOT_ID$>
LegacyLotId = Database_Services('ReadDataColumn', 'LOT', LotId, LOT_LEGACY_LOT_ID$, True$, 0, False$)
SRP_JSON(objJSON, 'SetValue', 'LotOperationId', LotOperationId)
SRP_JSON(objJSON, 'SetValue', 'LotId', LotId, 'String')
SRP_JSON(objJSON, 'SetValue', 'LegacyLotId', LegacyLotId, 'String')
SRP_JSON(objJSON, 'SetValue', 'OperationId', LotOperationRec<LOT_OPERATION_OPERATION_ID$>, 'String')
OperationDesc = XLATE('OPERATION', LotOperationRec<LOT_OPERATION_OPERATION_ID$>, OPERATION_OPERATION_DESCRIPTION$, 'X')
SRP_JSON(objJSON, 'SetValue', 'Description', OperationDesc, 'String')
OperationClass = XLATE('OPERATION', LotOperationRec<LOT_OPERATION_OPERATION_ID$>, OPERATION_CLASS_ID$, 'X')
SRP_JSON(objJSON, 'SetValue', 'OperationClass', OperationClass)
DatetimeIn = Date_Services('ConvertDateTimeToISO8601', LotOperationRec<LOT_OPERATION_DATETIME_IN$>)
SRP_JSON(objJSON, 'SetValue', 'DateTimeIn', DatetimeIn)
DatetimeOut = Date_Services('ConvertDateTimeToISO8601', LotOperationRec<LOT_OPERATION_DATETIME_OUT$>)
SRP_JSON(objJSON, 'SetValue', 'DateTimeOut', DatetimeOut)
EquipmentId = LotOperationRec<LOT_OPERATION_EQUIPMENT_ID$>
SRP_JSON(objJSON, 'SetValue', 'EquipmentId', EquipmentId)
SRP_JSON(objJSON, 'SetValue', 'WaferInQty', LotOperationRec<LOT_OPERATION_WAFER_IN_QTY$>, 'Number')
SRP_JSON(objJSON, 'SetValue', 'WaferOutQty', LotOperationRec<LOT_OPERATION_WAFER_OUT_QTY$>, 'Number')
SRP_JSON(objJSON, 'SetValue', 'OperatorInId', LotOperationRec<LOT_OPERATION_OPERATOR_IN_ID$>)
SRP_JSON(objJSON, 'SetValue', 'OperatorOutId', LotOperationRec<LOT_OPERATION_OPERATOR_OUT_ID$>)
SRP_JSON(objJSON, 'SetValue', 'OperationSequence', LotOperationRec<LOT_OPERATION_OPERATION_SEQUENCE$>)
DatetimeStart = Date_Services('ConvertDateTimeToISO8601', LotOperationRec<LOT_OPERATION_DATETIME_START$>)
SRP_JSON(objJSON, 'SetValue', 'DateTimeStart', DatetimeStart)
DatetimeStop = Date_Services('ConvertDateTimeToISO8601', LotOperationRec<LOT_OPERATION_DATETIME_STOP$>)
SRP_JSON(objJSON, 'SetValue', 'DateTimeStop', DatetimeStop)
SRP_JSON(objJSON, 'SetValue', 'MetTestId', LotOperationRec<LOT_OPERATION_MET_TEST_ID$>)
SRP_JSON(objJSON, 'SetValue', 'CleanId', LotOperationRec<LOT_OPERATION_CLEAN_ID$>)
SRP_JSON(objJSON, 'SetValue', 'PackagingId', LotOperationRec<LOT_OPERATION_PACKAGING_ID$>)
SRP_JSON(objJSON, 'SetValue', 'WaferCounterId', LotOperationRec<LOT_OPERATION_WAFER_COUNTER_ID$>)
SRP_JSON(objJson, 'SetValue', 'MetTestTypeRequired', LotOperationRec<LOT_OPERATION_MET_TEST_TYPE_REQUIRED$>, 'STRING')
SRP_JSON(objJson, 'SetValue', 'MetTestRequired', LotOperationRec<LOT_OPERATION_MET_TEST_REQUIRED$>, 'Boolean')
SRP_JSON(objJson, 'SetValue', 'PackagingRequired', LotOperationRec<LOT_OPERATION_PACKAGING_REQUIRED$>, 'Boolean')
SRP_JSON(objJson, 'SetValue', 'CleanRequired', LotOperationRec<LOT_OPERATION_CLEAN_REQUIRED$>, 'Boolean')
SRP_JSON(objJson, 'SetValue', 'WaferCounterRequired', LotOperationRec<LOT_OPERATION_WAFER_COUNTER_REQUIRED$>, 'Boolean')
PSNo = Xlate('LOT', LotId, LOT_PROD_SPEC_ID$, 'X')
RecipeToolInfo = PSN_Services('GetAllMetrologyRecipes', PSNo, True$, True$, True$, True$)
objRecipeInfo = ''
If SRP_Json(objRecipeInfo, 'New', 'Array') then
for each RecipeLine in RecipeToolInfo using @FM
If SRP_Json(objRecipeLine, 'New', 'Object') then
SRP_Json(objRecipeLine, 'SetValue', 'ToolClass', RecipeLine<1,1>, 'String')
SRP_Json(objRecipeLine, 'SetValue', 'Recipe', RecipeLine<1,2>, 'String')
SRP_Json(objRecipeLine, 'SetValue', 'Stage', RecipeLine<1,3>, 'String')
SRP_Json(objRecipeInfo, 'Add', objRecipeLine)
SRP_Json(objRecipeLine, 'Release')
end
Next RecipeLine
SRP_Json(objJSON, 'Set', 'RecipeInfo', objRecipeInfo)
SRP_Json(objRecipeInfo, 'Release')
end
SRP_JSON(objJSON, 'SetValue', 'OperationType', LotOperationRec<LOT_OPERATION_OPERATION_TYPE$>)
//Add OPERATION Object
OperationJson = Operation_Services('ConvertRecordToJSON', LotOperationRec<LOT_OPERATION_OPERATION_ID$>)
If SRP_JSON(objOperationJson, 'Parse', OperationJson) EQ '' then
SRP_Json(objJSON, 'Set', 'OperationInfo',objOperationJson)
SRP_Json(objOperationJson, 'Release')
end
//Add Associated MET_TEST JSON Object
AssocMetTestIds = LotOperationRec<LOT_OPERATION_MET_TEST_ID$>
objAssocMetTest = ''
If SRP_Json(objAssocMetTest, 'New', 'Array') then
for each MetTestId in AssocMetTestIds using @VM
MetTestJson = Met_Test_Services('ConvertRecordToJson', MetTestId)
If SRP_Json(objMetTest, 'Parse', MetTestJson) EQ '' then
SRP_Json(objAssocMetTest, 'Add', objMetTest)
SRP_Json(objMetTest, 'Release')
end
Next MetTestId
SRP_Json(objJSON, 'Set', 'AssociatedMetTests', objAssocMetTest)
SRP_Json(objAssocMetTest, 'Release')
end
//Add Available Met Test Record
RequiredClasses = LotOperationRec<LOT_OPERATION_MET_TEST_TYPE_REQUIRED$>
AvailMetTestIds = ''
ThisOperationDTMIn = LotOperationRec<LOT_OPERATION_DATETIME_IN$>
ThisOperationDTMOut = LotOperationRec<LOT_OPERATION_DATETIME_OUT$>
if RequiredClasses NE '' AND DatetimeIn NE '' AND DatetimeOut EQ '' then
AvailMetTestIds = Met_Test_Services('GetMetTests', LotId, LegacyLotId, '', True$, RequiredClasses, ThisOperationDTMIn, ThisOperationDTMOut)
end
objAvailMetTest = ''
If SRP_Json(objAvailMetTest, 'New', 'Array') then
if AvailMetTestIds NE '' then
for each MetTestId in AvailMetTestIds using @VM
SRP_Stopwatch('Start', 'MetTestJson')
MetTestJson = Met_Test_Services('ConvertRecordToJson', MetTestId)
SRP_Stopwatch('Stop', 'MetTestJson')
totalTime = SRP_Stopwatch('GetBenchmark', 'MetTestJson')
If SRP_Json(objMetTest, 'Parse', MetTestJson) EQ '' then
SRP_Json(objAvailMetTest, 'Add', objMetTest)
SRP_Json(objMetTest, 'Release')
end
Next MetTestId
end
SRP_Json(objJSON, 'Set', 'AvailMetTests', objAvailMetTest)
SRP_Json(objAvailMetTest, 'Release')
end
//Add in relevant recipes
Recipes = ''
ShowThickRecipes = False$
ShowResRecipes = False$
ShowCleanRecipes = False$
ShowSurfscanRecipes = False$
IsMetTestReqd = LotOperationRec<LOT_OPERATION_MET_TEST_REQUIRED$>
IsCleanRequired = LotOperationRec<LOT_OPERATION_CLEAN_REQUIRED$>
If IsMetTestReqd then
MetTestTypeRequired = LotOperationRec<LOT_OPERATION_MET_TEST_TYPE_REQUIRED$>
Begin Case
Case MetTestTypeRequired EQ 'TENCOR'
ShowSurfscanRecipes = True$
Case MetTestTypeRequired EQ 'THICK'
ShowThickRecipes = True$
Case MetTestTypeRequired EQ 'RES'
ShowResRecipes = True$
End Case
end
If IsCleanRequired then
ShowCleanRecipes = True$
end
ProdSpecNo = XLATE('LOT', LotId, LOT_PROD_SPEC_ID$, 'X')
Recipes = PSN_Services('GetAllMetrologyRecipes', ProdSpecNo, ShowSurfscanRecipes, ShowCleanRecipes, ShowResRecipes, ShowThickRecipes)
If SRP_JSON(objRecipes, 'New', 'Array') then
for each Recipe in Recipes using @FM
//ToolClass : @VM : Recipe : @VM : Stage
ToolClass = Recipe<1,1>
RecipeName = Recipe<1,2>
Stage = Recipe<1,3>
If SRP_JSON(objRecipe, 'New', 'Object') then
SRP_JSON(objRecipe, 'SetValue', 'ToolClass', ToolClass, 'String')
SRP_JSON(objRecipe, 'SetValue', 'RecipeName', RecipeName, 'String')
SRP_JSON(objRecipe, 'SetValue', 'StageName', Stage, 'String')
SRP_JSON(objRecipes, 'Add', objRecipe)
SRP_JSON(objRecipe, 'Release')
end
Next Recipe
SRP_JSON(objJSON, 'Set', 'RecipeParams', objRecipes)
SRP_JSON(objRecipes, 'Release')
end
JsonString = SRP_JSON(objJSON, 'Stringify', 'Fast')
SRP_JSON(objJSON, 'Release')
end
Response = JsonString
end service
Service StartLotOperation(LotOperationId, UserId)
ErrorMessage = ''
If RowExists('LOT_OPERATION', LotOperationId) then
If RowExists('LSL_USERS', UserId) then
//We can also add additional checks like security checks, training checks, etc here if needed.
LotOperationRec = Database_Services('ReadDataRow', 'LOT_OPERATION', LotOperationId, True$, 0, False$)
LotId = LotOperationRec<LOT_OPERATION_LOT_ID$>
LotCurrentLotOpId = Lot_Services('GetLotCurrOperationId', LotId)
If LotOperationId EQ LotCurrentLotOpId then
LotMovedIn = Lot_Services('IsLotMovedIn', LotId)
If Not(LotMovedIn) then
Lot_Services('MoveInLot', LotId, UserId)
If Error_Services('HasError') then
ErrorMessage = Error_Services('GetMessage')
end
end else
ErrorMessage = 'Lot is already moved into this operation.'
end
end else
end
end else
ErrorMessage = 'Invalid user passed to routine.'
end
end else
ErrorMessage = 'Invalid Lot Operation passed to routine.'
end
If ErrorMessage EQ '' then
Response = True$
end else
Response = False$
Error_Services('Add', 'Error in ' : Service : '. ' : ErrorMessage)
end
end service
Service CompleteLotOperation(LotOperationId, UserId)
ErrorMessage = ''
If RowExists('LOT_OPERATION', LotOperationId) then
If RowExists('LSL_USERS', UserId) then
//We can also add additional checks like security checks, training checks, etc here if needed.
LotOperationRec = Database_Services('ReadDataRow', 'LOT_OPERATION', LotOperationId, True$, 0, False$)
LotId = LotOperationRec<LOT_OPERATION_LOT_ID$>
LotCurrentLotOpId = Lot_Services('GetLotCurrOperationId', LotId)
If LotOperationId EQ LotCurrentLotOpId then
LotMovedIn = Lot_Services('IsLotMovedIn', LotId)
If LotMovedIn then
//Perform Validation for the particular operation here.
OperationValid = Lot_Operation_Services('ValidateLotOperation', LotOperationId)
If OperationValid then
Lot_Services('MoveOutLot', LotId, UserId)
If Error_Services('HasError') then
ErrorMessage = Error_Services('GetMessage')
end
end else
ErrorMessage = 'Lot Operation has not finished processing and cannot be moved out.'
end
end else
ErrorMessage = 'Cannot complete operation because lot is not currently moved in.'
end
end else
CurrOperationId = Xlate('LOT_OPERATION', LotCurrentLotOpId, LOT_OPERATION_OPERATION_ID$, 'X')
CurrOperationDesc = Xlate('OPERATION', CurrOperationId, OPERATION_OPERATION_DESCRIPTION$, 'X')
ErrorMessage = 'Cannot complete operation. Lot is currently at ' : CurrOperationDesc
end
end else
ErrorMessage = 'Invalid user passed to routine.'
end
end else
ErrorMessage = 'Invalid Lot Operation passed to routine.'
end
If ErrorMessage EQ '' then
Response = True$
end else
Response = False$
Error_Services('Add', ErrorMessage)
end
end service
Service ValidateLotOperation(LotOperationId)
ErrorMessage = ''
IsValid = True$
If RowExists('LOT_OPERATION', LotOperationId) then
LotOperationRec = Database_Services('ReadDataRow', 'LOT_OPERATION', LotOperationId, True$, 0, False$)
OperationId = LotOperationRec<LOT_OPERATION_OPERATION_ID$>
MetTestRequired = LotOperationRec<LOT_OPERATION_MET_TEST_REQUIRED$>
MetTestTypeRequired = LotOperationRec<LOT_OPERATION_MET_TEST_TYPE_REQUIRED$>
PackagingRequired = LotOperationRec<LOT_OPERATION_PACKAGING_REQUIRED$>
CleanRequired = LotOperationRec<LOT_OPERATION_CLEAN_REQUIRED$>
WaferCountRequired = LotOperationRec<LOT_OPERATION_WAFER_COUNTER_REQUIRED$>
OperationClass = XLATE('OPERATION', OperationId, OPERATION_CLASS_ID$, 'X')
If MetTestRequired then
MetTestsInSpec = True$
AssociatedMetTestIds = LotOperationRec<LOT_OPERATION_MET_TEST_ID$>
If AssociatedMetTestIds NE '' then
for each MetTestId in AssociatedMetTestIds using @VM
MetTestOoS = Database_Services('ReadDataColumn', 'MET_TEST', MetTestId, MET_TEST.OUT_OF_SPEC$, True$, 0, False)
If MetTestOoS AND OperationClass NE 'RTF' AND OperationClass NE 'RTF_DEFAULT' then
MetTestsInSpec = False$
ErrorMessage = 'An associated Met test record is out of spec.'
end
Until MetTestsInSpec EQ False$
Next MetTestId
end else
IsValid = False$
ErrorMessage = 'Met tests are required and none are assigned.'
end
end
If PackagingRequired AND IsValid then
AssociatedPackagingIds = LotOperationRec<LOT_OPERATION_PACKAGING_ID$>
If AssociatedPackagingIds NE '' then
end else
IsValid = False$
end
end
If CleanRequired AND IsValid then
AssociatedCleanIds = LotOperationRec<LOT_OPERATION_CLEAN_ID$>
If AssociatedCleanIds NE '' then
IsValid = True$
end else
IsValid = False$
end
end
If WaferCountRequired AND IsValid then
AssociatedWaferCountIds = LotOperationRec<LOT_OPERATION_WAFER_COUNTER_ID$>
If AssociatedWaferCountIds NE '' then
IsValid = True$
end else
IsValid = False$
end
end
end else
ErrorMessage = 'Lot Operation not found'
end
If ErrorMessage NE '' then
IsValid = False$
Error_Services('Add', ErrorMessage)
end
Response = IsValid
end service

File diff suppressed because it is too large Load Diff

View File

@ -132,4 +132,3 @@ CreateHALItem:
end
return

View File

@ -62,11 +62,8 @@ Options SCAN_TYPES_PTO = 'LABEL1', 'LABEL2'
//----------------------------------------------------------------------------------------------------------------------
Service ProcessFQAScanData(ScanData, ScanType = SCAN_TYPES, Param1, Param2, Param3)
ErrorMsg = ''
If (ScanData NE '') then
// Code 3of9 encodes the asterisk and underscore characters. These need to be decoded.
//ScanData = Scan_Services('DecodeScanData', ScanData)
If Error_Services('NoError') then
ColumnIndex = ''
ColumnValue = ''
@ -91,25 +88,31 @@ Service ProcessFQAScanData(ScanData, ScanType = SCAN_TYPES, Param1, Param2, Para
ValidLot = Rds_Services('IsValidSubLot', CassetteID, RDSType, ScanSubLot)
If ValidLot NE True$ then
// Add error to error stack
ErrorMessage = 'Invalid Supplier Lot: ':ScanData
Error_Services('Add', ErrorMessage)
ErrorMsg = 'Invalid Supplier Lot: ':ScanData
end
If Error_Services('NoError') then
Response = ScanSubLot
end
If ErrorMsg EQ '' then Response = ScanSubLot
Case ScanType EQ 'CASSETTE1'
// Assume this is intended to be a Cassette ID scan (either WMO or RDS). Only if this is a
// non-existent carrier will the scan data be considered invalid.
// Strip '1T', 'I', and 'O' prefixes.
If ScanData[1, 2] EQ '1T' then
ScanData[1, 2] = ''
end else If ScanData[1,1] EQ 'I' OR ScanData[1,1] EQ 'O' then
ScanData[1,1] = ''
DelimCount = DCount(ScanData, '|')
Begin Case
Case ( (ScanData[1, 2] EQ '1T') or (ScanData[1, 1] EQ 'O') )
ErrorMsg = '1D Lot Label Scanned. 2D Lot Label Required.'
Case (DelimCount NE 8)
ErrorMsg = 'Invalid Lot Label Scan.'
Case Otherwise$
CassetteID = Field(ScanData, '|', 3)
SeqNo = Field(ScanData, '|', 8)
End Case
If ErrorMsg EQ '' then
If CassetteID[1, 2] EQ '1T' then
CassetteID[1, 2] = ''
end else If CassetteID[1,1] EQ 'I' OR CassetteID[1,1] EQ 'O' then
CassetteID[1,1] = ''
end
CassetteID = ScanData
If INDEX(CassetteID,'.',2) then
RDSType = 'EPP'
@ -119,20 +122,14 @@ Service ProcessFQAScanData(ScanData, ScanType = SCAN_TYPES, Param1, Param2, Para
WOMatKey = Xlate('RDS', CassetteID, 'WO_MAT_KEY', 'X')
end
ValidCassetteID = False$ ; // Assume Cassette ID is not valid for now.
ValidCassetteID = Rds_Services('IsValidRDS', CassetteID, RDSType )
If RDSType EQ 'EPP' then
LotDesc = 'EPP Lot '
end else
LotDesc = 'RDS Number '
end
If ValidCassetteID EQ True$ then
If Param1 NE '' AND ScanData NE Param1 then ;*Cassette2 Scan
Error_Services('Add', LotDesc:'Mismatch: ':CassetteID: ' does not match ': Param1)
ErrorMsg = 'Lot Label Mismatch: ':CassetteID: ' does not match ': Param1
end
If ErrorMsg EQ '' then
// Check if FQA is signed
FQASigned = ''
WorkOrdNo = Field(WOMatKey, '*', 1)
@ -148,31 +145,78 @@ Service ProcessFQAScanData(ScanData, ScanType = SCAN_TYPES, Param1, Param2, Para
FQASigned = Signature_Services('CheckSignature', WOMatKey, QAStage)
IF NOT(FQASigned) THEN
Error_Services('Add', 'FQA not signed for ':LotDesc:CassetteID: '!')
END
end else
Error_Services('Add', 'Invalid ':LotDesc:CassetteID)
If NOT(FQASigned) then ErrorMsg = 'FQA not signed for ':CassetteID:'!'
end
If Error_Services('NoError') then
Response = CassetteID
end else
ErrorMsg = 'Invalid Lot ID ':CassetteID
end
If ErrorMsg EQ '' then
Response = ''
Response<1> = CassetteID
Response<2> = SeqNo
end
end
Case ScanType EQ 'CASSETTE2'
Response = Material_Movement_Services('ProcessPTIScanData', ScanData, 'CASSETTE1', Param1)
Response = ScanData
// Assume this is intended to be a Cassette ID scan (either WMO or RDS). Only if this is a
// non-existent carrier will the scan data be considered invalid.
// Strip '1T', 'I', and 'O' prefixes.
ValidCassetteID = False$ ; // Assume Cassette ID is not valid for now.
Cassette1ID = Param1
Seq1No = Param2
DelimCount = DCount(ScanData, '|')
Begin Case
Case ( (ScanData[1, 2] EQ '1T') or (ScanData[1, 1] EQ 'O') )
ErrorMsg = '1D Lot Label Scanned. 2D Lot Label Required.'
Case (DelimCount NE 8)
ErrorMsg = 'Invalid Lot Label Scan.'
Case Otherwise$
CassetteID = Field(ScanData, '|', 3)
Seq2No = Field(ScanData, '|', 8)
End Case
end
end else
Error_Services('Add', 'ScanData argument was missing in the ' : Service : ' service.')
If ErrorMsg EQ '' then
If CassetteID[1, 2] EQ '1T' then
CassetteID[1, 2] = ''
end else If CassetteID[1,1] EQ 'I' OR CassetteID[1,1] EQ 'O' then
CassetteID[1,1] = ''
end
If INDEX(CassetteID,'.',2) then
RDSType = 'EPP'
end else
RDSType = 'SIC'
end
ValidCassetteID = Rds_Services('IsValidRDS', CassetteID, RDSType )
If ValidCassetteID EQ True$ then
If Cassette1ID NE '' AND (CassetteID NE Cassette1ID) then ;*Cassette2 Scan
ErrorMsg = 'Lot Label Mismatch: ':CassetteID: ' does not match ': Cassette1ID
end
If Seq1No EQ Seq2No then
ErrorMsg = 'FQA Label verification failed due':CRLF$:'to operator double-scanning barcode.'
end
end else
ErrorMsg = 'Invalid RDS Number: ':CassetteID
end
If ErrorMsg EQ '' then Response = CassetteID
end
End Case
end else
ErrorMsg = 'ScanData argument was missing in the ' : Service : ' service.'
end
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
end service
//----------------------------------------------------------------------------------------------------------------------
// ProcessPTIScanData
//
@ -183,11 +227,8 @@ end service
//----------------------------------------------------------------------------------------------------------------------
Service ProcessPTIScanData(ScanData, ScanType = SCAN_TYPES, Param1, Param2, Param3)
ErrorMsg = ''
If (ScanData NE '') then
// Code 3of9 encodes the asterisk and underscore characters. These need to be decoded.
//ScanData = Scan_Services('DecodeScanData', ScanData)
If Error_Services('NoError') then
ColumnIndex = ''
ColumnValue = ''
@ -198,39 +239,48 @@ Service ProcessPTIScanData(ScanData, ScanType = SCAN_TYPES, Param1, Param2, Para
Begin Case
Case ScanType EQ 'SUPPLIER'
ValidLot = False$
If ScanData[1, 2] EQ '2T' OR ScanData[1,2] EQ '1T' then ScanData[1, 2] = ''
ScanSubLot = ScanData
CassetteID = Param1
If INDEX(CassetteID,'.',2) then
RDSType = 'EPP'
end else
RDSType = 'SIC'
end
ValidLot = Rds_Services('IsValidSubLot', CassetteID, RDSType, ScanSubLot)
If ValidLot NE True$ then
// Add error to error stack
ErrorMessage = 'Invalid Supplier Lot: ':ScanData
Error_Services('Add', ErrorMessage)
end
If Error_Services('NoError') then
Response = ScanSubLot
end
If ValidLot NE True$ then ErrorMsg = 'Invalid Supplier Lot: ':ScanData
If ErrorMsg EQ '' then Response = ScanSubLot
Case ScanType EQ 'CASSETTE1'
debug
// Assume this is intended to be a Cassette ID scan (either WMO or RDS). Only if this is a
// non-existent carrier will the scan data be considered invalid.
// Strip '1T', 'I', and 'O' prefixes.
If ScanData[1, 2] EQ '1T' then
ScanData[1, 2] = ''
end else If ScanData[1,1] EQ 'I' OR ScanData[1,1] EQ 'O' then
ScanData[1,1] = ''
end
ValidCassetteID = False$ ; // Assume Cassette ID is not valid for now.
DelimCount = DCount(ScanData, '|')
Begin Case
Case (ScanData[1, 1] EQ 'I')
! Temporary exception while we exhaust current WMI inventory on KIT racks that
! do not have a 2D barcode.
CassetteID = ScanData
SeqNo = 'SEQ1'
Case ( (ScanData[1, 2] EQ '1T') or (ScanData[1, 1] EQ 'O') )
ErrorMsg = '1D Lot Label Scanned. 2D Lot Label Required.'
Case (DelimCount NE 8)
ErrorMsg = 'Invalid Lot Label Scan.'
Case Otherwise$
CassetteID = Field(ScanData, '|', 3)
SeqNo = Field(ScanData, '|', 8)
End Case
If ErrorMsg EQ '' then
If CassetteID[1, 2] EQ '1T' then
CassetteID[1, 2] = ''
end else If CassetteID[1,1] EQ 'I' OR CassetteID[1,1] EQ 'O' then
CassetteID[1,1] = ''
end
If INDEX(CassetteID,'.',2) then
RDSType = 'EPP'
@ -238,37 +288,87 @@ Service ProcessPTIScanData(ScanData, ScanType = SCAN_TYPES, Param1, Param2, Para
RDSType = 'SIC'
end
ValidCassetteID = False$ ; // Assume Cassette ID is not valid for now.
ValidCassetteID = Rds_Services('IsValidRDS', CassetteID, RDSType )
ValidCassetteID = Rds_Services('IsValidRDS', CassetteID, RDSType)
If ValidCassetteID EQ True$ then
If Param1 NE '' AND ScanData NE Param1 then ;*Cassette2 Scan
Error_Services('Add', 'RDS Mismatch: ':CassetteID: ' does not match ': Param1)
If Param1 NE '' AND (ScanData NE Param1) then ;*Cassette2 Scan
ErrorMsg = 'Lot Label Mismatch: ':CassetteID: ' does not match ': Param1
end
end else
Error_Services('Add', 'Invalid RDS Number: ':CassetteID)
ErrorMsg = 'Invalid Cassette Number: ':CassetteID
end
If Error_Services('NoError') then
Response = CassetteID
If ErrorMsg EQ '' then
Response = ''
Response<1> = CassetteID
Response<2> = SeqNo
end
end
Case ScanType EQ 'CASSETTE2'
Response = Material_Movement_Services('ProcessPTIScanData', ScanData, 'CASSETTE1', Param1)
Response = ScanData
// Assume this is intended to be a Cassette ID scan (either WMO or RDS). Only if this is a
// non-existent carrier will the scan data be considered invalid.
// Strip '1T', 'I', and 'O' prefixes.
ValidCassetteID = False$ ; // Assume Cassette ID is not valid for now.
Cassette1ID = Param1
Seq1No = Param2
DelimCount = DCount(ScanData, '|')
Begin Case
Case (ScanData[1, 1] EQ 'I')
! Temporary exception while we exhaust current WMI inventory on KIT racks that
! do not have a 2D barcode.
CassetteID = ScanData
Seq2No = 'SEQ2'
Case ( (ScanData[1, 2] EQ '1T') or (ScanData[1, 1] EQ 'O') )
ErrorMsg = '1D Lot Label Scanned. 2D Lot Label Required.'
Case (DelimCount NE 8)
ErrorMsg = 'Invalid Lot Label Scan.'
Case Otherwise$
CassetteID = Field(ScanData, '|', 3)
Seq2No = Field(ScanData, '|', 8)
End Case
If ErrorMsg EQ '' then
If CassetteID[1, 2] EQ '1T' then
CassetteID[1, 2] = ''
end else If CassetteID[1,1] EQ 'I' OR CassetteID[1,1] EQ 'O' then
CassetteID[1,1] = ''
end
If INDEX(CassetteID,'.',2) then
RDSType = 'EPP'
end else
RDSType = 'SIC'
end
ValidCassetteID = Rds_Services('IsValidRDS', CassetteID, RDSType)
If ValidCassetteID EQ True$ then
If Cassette1ID NE '' AND (CassetteID NE Cassette1ID) then ;*Cassette2 Scan
ErrorMsg = 'Lot Label Mismatch: ':CassetteID: ' does not match ': Cassette1ID
end
If Seq1No EQ Seq2No then
ErrorMsg = 'PTI Label verification failed due':CRLF$:'to operator double-scanning barcode.'
end
end else
ErrorMsg = 'Invalid Cassette Number: ':CassetteID
end
If ErrorMsg EQ '' then Response = CassetteID
end
End Case
end
end else
Error_Services('Add', 'ScanData argument was missing in the ' : Service : ' service.')
ErrorMsg = 'ScanData argument was missing in the ' : Service : ' service.'
end
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
end service
//to do before release of ProcessPTOScanData
//1. prerequisite - waiting on newly printed (on/after 10/18/21) labels to make their way through warehouse, though not critical
//2. showstopper - need barcode scanners to be able to scan 2D barcodes - currently only 1 such scanner (purchased for shipping but not deployed, given to Cheryl)
//3. fix prod print routine to use SRP GetPrinter methods similar to what the Test_Print_SAP_Cass_Ship_Label does
//----------------------------------------------------------------------------------------------------------------------
// ProcessPTOScanData
//
@ -282,11 +382,10 @@ end service
//----------------------------------------------------------------------------------------------------------------------
Service ProcessPTOScanData(ScanData, ScanType = SCAN_TYPES_PTO, Param1, Param2)
ErrorMsg = ''
Location = 'PTO Mat'
If (ScanData NE '') then
If Error_Services('NoError') then
ColumnIndex = ''
ColumnValue = ''
Cassette1 = ''
@ -295,26 +394,24 @@ Service ProcessPTOScanData(ScanData, ScanType = SCAN_TYPES_PTO, Param1, Param2)
Begin Case
Case ScanType EQ 'LABEL1'
//determine whether regular NEPP or EPP label scan
//NEPP should be data matrix scan and have 7 parts, RDS_No is the 3rd
//EPP is 1D scan and will have the WMO number (e.g. 170369*1*48)
// Determine whether regular NEPP or EPP label scan
// NEPP should be data matrix scan and have 7 parts, RDS_No is the 3rd
// EPP is 1D scan and will have the WMO number (e.g. 170369*1*48)
// This should be a multi-part 2D datamatrix scan, so there should be a long string separated by pipe symbols.
// Validate the 1. it is multi-part string and 2. that the RDS number from the string is a) valid RDS number
// and b) is currently is the proper state to do PTO transaction.
// Strip any standardized prefixes (e.g. '1T', '2T', etc.) as necessary
// data from Label1 should have 8 parts (no matter type - Si or EPP), we're looking for the 3rd
// Data from Label1 should have 8 parts (no matter type - Si or EPP), we're looking for the 3rd
cnt = DCount(ScanData, '|')
if cnt NE 8 then
Cassette1 = 0
Error_Services('Add', 'Invalid Lot Label Scan.')
return
ErrorMsg = 'Invalid Lot Label Scan.'
end else
//RDS should be 3rd position
Cassette1 = Field(ScanData, '|', 3)
end
//strip the prefix encoding
If ErrorMsg EQ '' then
// Strip the prefix encoding
If Cassette1[1, 2] EQ '1T' OR Cassette1[1, 2] EQ '2T' then
Cassette1[1, 2] = ''
end else If Cassette1[1,1] EQ 'I' OR ScanData[1,1] EQ 'O' then
@ -352,18 +449,16 @@ Service ProcessPTOScanData(ScanData, ScanType = SCAN_TYPES_PTO, Param1, Param2)
If Rds_Services('IsPackaged', Cassette1, RDSType) EQ True$ then
ValidCassette1 = True$
end else
Error_Services('Add', RDSType: ' RDS ':testCass1: ' has not completed packaging.')
return
ErrorMsg = RDSType: ' RDS ':testCass1: ' has not completed packaging.'
end
end else
Error_Services('Add', RDSType: ' RDS ':testCass1: ' is currently on hold.')
return
ErrorMsg = RDSType: ' RDS ':testCass1: ' is currently on hold.'
end
end else
Error_Services('Add', RDSType: ' RDS ' : testCass1 : ' is an invalid RDS number.')
return
ErrorMsg = RDSType: ' RDS ' : testCass1 : ' is an invalid RDS number.'
end
If ErrorMsg EQ '' then
LastPTO = obj_WO_Mat('OutofPTO',WOMatKey)
StepNo = 1
IF LastPTO THEN
@ -374,43 +469,43 @@ Service ProcessPTOScanData(ScanData, ScanType = SCAN_TYPES_PTO, Param1, Param2)
OK = Msg(@WINDOW, '','YESNO','',MsgHead:@FM:MsgText)
IF NOT(OK) THEN
Error_Services('Add', 'Scan Cancelled')
RETURN
ErrorMsg = 'Scan Cancelled'
END else
Print_SAP_Cass_Ship_Label(WONo,StepNo,CassNo,Cassette1, RDSType)
end
end else
Print_SAP_Cass_Ship_Label(WONo,StepNo,CassNo,Cassette1, RDSType)
END
end
If ErrorMsg EQ '' then
If ValidCassette1 EQ True$ then
If Param1 NE '' AND ScanData NE Param1 then ;*Cassette2 Scan
Error_Services('Add', 'RDS Mismatch: ':Cassette1: ' does not match ': Param1)
return
ErrorMsg = 'RDS Mismatch: ':Cassette1: ' does not match ': Param1
end
end else
Error_Services('Add', 'Invalid RDS Number: ':Cassette1)
return
ErrorMsg = 'Invalid RDS Number: ':Cassette1
end
If Error_Services('NoError') then
Response = Cassette1
If ErrorMsg EQ '' then Response = Cassette1
end
end
end
Case ScanType EQ 'LABEL2'
cnt = DCount(ScanData, ';')
if cnt EQ 9 then
//Tower is customer and RDS should be 2nd position
// Tower is customer and RDS should be 2nd position
Cassette2 = Field(ScanData, ';', 2)
end else if cnt EQ 10 then
//all other customers and RDS should be 3rd position
// All other customers and RDS should be 3rd position
Cassette2 = Field(ScanData, ';', 3)
end else
Error_Services('Add', 'Invalid Shipping Label Scan.')
return
ErrorMsg = 'Invalid Shipping Label Scan.'
end
//strip the prefix encoding
If ErrorMsg EQ '' then
// Strip the prefix encoding
If Cassette2[1, 2] EQ '1T' OR Cassette2[1, 2] EQ '2T' then
Cassette2[1, 2] = ''
end else If Cassette2[1,1] EQ 'I' OR ScanData[1,1] EQ 'O' then
@ -427,29 +522,25 @@ Service ProcessPTOScanData(ScanData, ScanType = SCAN_TYPES_PTO, Param1, Param2)
: 'RDS Label #2: ':testCass2:CRLF$
ScanMismatch = True$
gosub ToggleLotHold
Error_Services('Add', ErrorMsg)
return
GoSub ToggleLotHold
end
If Error_Services('NoError') then
Response = Cassette2
If ErrorMsg EQ '' then Response = Cassette2
end
End Case
end
end else
Error_Services('Add', 'ScanData argument was missing in the ' : Service : ' service.')
ErrorMsg = 'ScanData argument was missing in the ' : Service : ' service.'
end
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
end service
Service SaveRecord(CassetteID, Warehouse, Location, OperatorID)
* Write success record in Material Log
// Write success record in Material Log
RDSKey = CassetteID
WMOKey = CassetteID
Convert '.' to '*' in WMOKey
@ -504,40 +595,33 @@ Service SaveRecord(CassetteID, Warehouse, Location, OperatorID)
errCode = ''
obj_WO_Mat_Log('Create',WOMLParms)
* aiParms = 'WO_MAT':@RM:WONo:@RM:CassNo:@RM:WhCd:'*':LocCd:@RM:Action:@RM:InvDTM:@RM:UserID:@RM:Tag:@RM:ToolID
* obj_WO_Mat('AddInvTrans', aiParms)
IF Get_Status(errCode) THEN
swap @SVM with CRLF$ in errCode
ErrorMsg = 'Errors calling obj_WO_Mat_Log("Create"). Error code: ':errCode:', Len(errCode)=':Len(errCode):'. FI has been notified.'
If Get_Status(errCode) then
Swap @SVM with CRLF$ in errCode
ErrorMsg = 'Errors calling obj_WO_Mat_Log("Create"). Error code: ':errCode
Error_Services('Add', ErrorMsg)
if LEN(errCode) > 5 then
Gosub SendErrorNotification
end
end
end
end service
SendErrorNotification:
Recipients = XLATE('NOTIFICATION','FI_SUPPORT',NOTIFICATION_USER_ID$,'X')
Recipients = ''
SentFrom = 'MATERIAL_MOVEMENT_SERVICES'
Subject = 'ERROR CALLING OBJ_WO_MAT '
Message = 'Error occured while attempting to write WO_MAT_LOG at ':Location:' Scan':CRLF$:ErrorMsg
AttachKey = WoMatKey
AttachWindow = ''
SendToGroup = ''
SendToGroup = 'FI_SUPPORT'
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
obj_Notes('Create',Parms)
return
ToggleLotHold:
If ScanMismatch EQ True$ then
@ -578,22 +662,26 @@ ToggleLotHold:
// To do: Throw Error
End Case
Convert '*' to '.' in Cassette1
HoldEntityID = Cassette1
// Manually add work order material log entry
WOMatKey = WONo:'*':CassNo
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
NumTimestamps = Dcount(WOMatRec<WO_MAT_INV_WH$>, @VM)
NewEntryPos = NumTimestamps + 1
WOMatRec = INSERT(WOMatRec, WO_MAT_INV_WH$, NewEntryPos, 0, WhCd)
WOMatRec = INSERT(WOMatRec, WO_MAT_INV_LOCATION$, NewEntryPos, 0, LocCd)
WOMatRec = INSERT(WOMatRec, WO_MAT_INV_ACTION$, NewEntryPos, 0, Action)
WOMatRec = INSERT(WOMatRec, WO_MAT_INV_DTM$, NewEntryPos, 0, LogDTM)
WOMatRec = INSERT(WOMatRec, WO_MAT_INV_USER$, NewEntryPos, 0, UserID)
WOMatRec = INSERT(WOMatRec, WO_MAT_INV_TAG$, NewEntryPos, 0, Tags)
WOMatRec = INSERT(WOMatRec, WO_MAT_INV_TOOL_ID$, NewEntryPos, 0, ToolID)
Database_Services('WriteDataRow', 'WO_MAT', WOMatKey, WOMatRec, True$, False$, True$)
WOMLParms = LogFile:@RM
WOMLParms := LogDTM:@RM
WOMLParms := Action:@RM
WOMLParms := WhCd:@RM
WOMLParms := LocCd:@RM
WOMLParms := WONo:@RM
WOMLParms := CassNo:@RM
WOMLParms := UserID:@RM
WOMLParms := Tags:@RM
WOMLParms := ToolID
Set_Status(0)
errCode = ''
obj_WO_Mat_Log('Create',WOMLParms)
If Get_Status(errCode) then
Swap @SVM with CRLF$ in errCode
ErrorMsg = 'Error calling obj_WO_Mat_Log("Create"). Error code: ':errCode
Gosub SendErrorNotification
end
// Place first cassette on hold
WOMatKey = WONo:'*':CassNo
@ -637,24 +725,26 @@ ToggleLotHold:
ToolID = ''
HoldEntityID = Cassette2
// Manually add work order material log entry
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
NumTimestamps = Dcount(WOMatRec<WO_MAT_INV_WH$>, @VM)
NewEntryPos = NumTimestamps + 1
WOMatRec = INSERT(WOMatRec, WO_MAT_INV_WH$, NewEntryPos, 0, WhCd)
WOMatRec = INSERT(WOMatRec, WO_MAT_INV_LOCATION$, NewEntryPos, 0, LocCd)
WOMatRec = INSERT(WOMatRec, WO_MAT_INV_ACTION$, NewEntryPos, 0, Action)
WOMatRec = INSERT(WOMatRec, WO_MAT_INV_DTM$, NewEntryPos, 0, LogDTM)
WOMatRec = INSERT(WOMatRec, WO_MAT_INV_USER$, NewEntryPos, 0, UserID)
WOMatRec = INSERT(WOMatRec, WO_MAT_INV_TAG$, NewEntryPos, 0, Tags)
WOMatRec = INSERT(WOMatRec, WO_MAT_INV_TOOL_ID$, NewEntryPos, 0, ToolID)
Database_Services('WriteDataRow', 'WO_MAT', WOMatKey, WOMatRec, True$, False$, True$)
//pause before putting second cassette on hold
WOMLParms = LogFile:@RM
WOMLParms := LogDTM:@RM
WOMLParms := Action:@RM
WOMLParms := WhCd:@RM
WOMLParms := LocCd:@RM
WOMLParms := WONo:@RM
WOMLParms := CassNo:@RM
WOMLParms := UserID:@RM
WOMLParms := Tags:@RM
WOMLParms := ToolID
Set_Status(0)
errCode = ''
obj_WO_Mat_Log('Create',WOMLParms)
If Get_Status(errCode) then
Swap @SVM with CRLF$ in errCode
ErrorMsg = 'Error calling obj_WO_Mat_Log("Create"). Error code: ':errCode
Gosub SendErrorNotification
end
// Place second cassette on hold
WOMatKey = WONo:'*':CassNo
CtrlEntID = False$ ;* Control checked/unchecked
OriginFlag = 'PTO' ;* Flag to indicate a hold initiated from the packaging form
@ -662,7 +752,8 @@ ToggleLotHold:
Hold_Services('ToggleHold', WOMatKey, HoldEntity, HoldEntityID, CtrlEntID, OriginFlag, '', OperatorID)
end
gosub SendPTOMismatchNotification
GoSub SendPTOMismatchNotification
errCode = ''
IF Get_Status(errCode) THEN Error_Services('Add', 'Error code ':errCode:' in ':Service:' service.')
Error_Services('Add', 'Cassette scans did not match! Both cassettes placed on hold - Supervisor, Lead, or Engineering disposition required.')
@ -671,6 +762,7 @@ ToggleLotHold:
return
SendPTOMismatchNotification:
// Send scan mismatch notification

View File

@ -619,18 +619,13 @@ end service
Service GetAvailableMakeupWafers(WorkOrderNo, KeysOnly=BOOLEAN)
AvailableMakeupWafers = ''
If WorkOrderNo NE '' then
WorkOrderNo = WorkOrderNo[1, '*'] ; // This might be formatted as a WO_MAT Key ID, so strip off the Cassette No.
WOLogRow = Database_Services('ReadDataRow', 'WO_LOG', WorkOrderNo)
If Error_Services('NoError') then
WOStepKeys = WOLogRow<WO_LOG_WO_STEP_KEY$>
WOMatKeys = WOLogRow<WO_LOG_WO_MAT_KEY$>
FirstWOMatKey = WOMatKeys<0, 1>
WOMatRow = Database_Services('ReadDataRow', 'WO_MAT', FirstWOMatKey)
If Error_Services('NoError') then
PartNo = WOMatRow<WO_MAT_CUST_PART_NO$>
LastWOStepKey = WOStepKeys[-1, 'B' : @VM]
PartNo = WOLogRow<WO_LOG_EPI_PART_NO$>
WOStepRow = Database_Services('ReadDataRow', 'WO_STEP', LastWOStepKey)
If Error_Services('NoError') then
WOStepPSN = WOStepRow<WO_STEP_PROD_SPEC_ID$>
@ -751,7 +746,6 @@ Service GetAvailableMakeupWafers(WorkOrderNo, KeysOnly=BOOLEAN)
end
end
end
end
end else
Error_Services('Add', 'WorkOrderNo argument was missing from the ' : Service : ' service.')
end
@ -1482,5 +1476,3 @@ ClearCursors:
return

View File

@ -11,6 +11,19 @@ Function Metrology_Services(@Service, @Params)
Notes : The generic parameters should contain all the necessary information to process the services. Often
this will be information like the data Record and Key ID.
Surface Scan Tool Types:
Tencor
SP1
Thickness tool types:
Biorad
Stratus
Resistivity (HgCV) Tool Types:
CDE
4PP
SRP
Parameters :
Service [in] -- Name of the service being requested
Param1-10 [in/out] -- Additional request parameter holders
@ -70,7 +83,7 @@ $Insert RLIST_EQUATES
$Insert WM_OUT_EQUATES
$Insert IQS_VIOL_DATA_EQUATES
Common /MetrologyServices/ MachineType@, RDSNo@
Common /MetrologyServices/ MachineType@, LegacyLotId@
Equ RETRY_ATTEMPTS$ TO 3
Equ MINUTES_UNTIL_RETRY$ TO 3
@ -93,12 +106,12 @@ Equ Comma$ to ','
Declare subroutine SRP_Stopwatch, Error_Services, obj_Tables, Metrology_Services, obj_RDS_Test, SRP_JSON
Declare subroutine RTI_Set_Debugger, Database_Services, Btree.Extract, Set_Status, QA_Services, obj_Notes
Declare subroutine Logging_Services, SRP_Send_Mail, SRP_Run_Command, PM_Services, Httpclient_Services
Declare subroutine Tool_Services, Mona_Services, Reactor_Services
Declare subroutine Tool_Services, Mona_Services, Reactor_Services, Met_Test_Services, Met_Test_Services
Declare function SRP_Sort_Array, Metrology_Services, obj_RDS_Test, obj_Test_Point_Map, Database_Services, UCase
Declare function Work_Order_Services, SRP_JSON, Logging_Services, Environment_Services, SRP_Trim, Min, Max
Declare function QA_Services, SRP_Join_Arrays, Get_Status, Obj_Clean_Insp, Datetime, SRP_Datetime
Declare function Httpclient_Services, PM_Services, Signature_Services, SRP_Array, Math_Services
Declare function Tool_Class_Services, obj_wo_mat
Declare function Tool_Class_Services, obj_Wo_Mat, Met_Test_Services, Lot_Services
Declare function SRP_String
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Metrology'
@ -163,6 +176,12 @@ end
Return Response else ''
//----------------------------------------------------------------------------------------------------------------------
// Service Parameter Options
//----------------------------------------------------------------------------------------------------------------------
Options MACHINE_TYPES = 'Tencor', 'HgCV', 'CDE', 'Biorad', 'Stratus', 'SP1', 'SPV', 'SRP'
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Services
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -364,16 +383,12 @@ Service GetSP1(Handle)
Result<10> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].DcnHazeAvgMean'); // HazeAvg
Result<28> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].RDS'); // RDSKeyID
Result<30> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Session'); // ScanRecipe
IsMisfit = IndexC(Result<30>, 'MISFIT', 1)
IF IsMisfit THEN
Result<3> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].DcnAllMean'); // SoDAvg
Result<2> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].DcnAllMax'); // SoDMax
Result<1> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].DcnAllMin'); // SoDMin
END ELSE
Result<3> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].DcnLpdMean'); // SoDAvg
Result<2> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].DcnLpdMax'); // SoDMax
Result<1> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].DcnLpdMin'); // SoDMin
Result<39> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].DcnAllMean'); // SoDAvg
Result<40> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].DcnAllMax'); // SoDMax
Result<41> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].DcnAllMin'); // SoDMin
END
Result<43> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].MesEntity'); // ScanTool
Result<44> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].DcnAreaMean'); // DCNMM2
END
@ -387,7 +402,7 @@ end service
//
// Looks for available Metrology files that are ready to be imported into the MES system.
//----------------------------------------------------------------------------------------------------------------------
Service ImportMetrologyFiles(Machine)
Service ImportMetrologyFiles(Machine=MACHINE_TYPES)
If Machine NE '' then
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
@ -408,13 +423,13 @@ Service ImportMetrologyFiles(Machine)
SearchPattern = '*.pdsf';
DataPath = Environment_Services('GetApplicationRootPath') : '\Metrology\MET08RESIMAPCDE\Source\MET08RESIMAPCDE\'
Case Machine _EQC 'Biorad'
SearchPattern = '*.txt';
SearchPattern = '*.pdsf';
DataPath = Environment_Services('GetApplicationRootPath') : '\Metrology\MET08THFTIRQS408M\Source\MET08THFTIRQS408M\'
Case Machine _EQC 'Stratus'
SearchPattern = '*.txt';
DataPath = Environment_Services('GetApplicationRootPath') : '\Metrology\MET08THFTIRSTRATUS\Source\MET08THFTIRSTRATUS\'
Case Machine _EQC 'SP1'
SearchPattern = '*.txt';
SearchPattern = '*.pdsf';
DataPath = Environment_Services('GetApplicationRootPath') : '\Metrology\MET08DDUPSP1TBI\Source\MET08DDUPSP1TBI\'
Case Machine _EQC 'SPV'
SearchPattern = '*.txt';
@ -662,7 +677,12 @@ Service ImportMetrologyRunData(Machine, DataPath, FileName, RunData)
Begin Case
Case Machine _EQC 'Stratus'
PSN = RunData<9>
QualFile = ( (PSN EQ 'T-Low') or (PSN EQ 'T-Mid') or (PSN EQ 'T-High') or (PSN EQ 'T_LOW') or (PSN EQ 'T_MID') or (PSN EQ 'T_HIGH') )
IF QualFile THEN
Metrology_Services('ImportStratusQualData', RunData, ResourceID, PSN)
END ELSE
Metrology_Services('ImportStratusData', RunData, ResourceID, PSN)
END
MachineType@ = 'Stratus'
Case Machine _EQC 'Biorad'
@ -723,6 +743,43 @@ Service ImportMetrologyRunData(Machine, DataPath, FileName, RunData)
end service
Service ImportStratusQualData(RunData, ResourceID, PSN)
Machine = 'BioRad'
URL = "https://oi-metrology-viewer-prod.mes.infineon.com/api/InfinityQSV3/":ResourceID:"/header"
TimeoutDuration = HTTPClient_Services('GetTimeoutDuration')
If TimeoutDuration NE 30 then Httpclient_Services('SetTimeoutDuration', 30)
Response = Httpclient_Services('SendHTTPRequest', 'GET', URL, '', '', '', '', '', '', '')
If Response NE '' then
objJSON = ''
If SRP_JSON(objJSON, 'Parse', Response) EQ '' then
SumOOS = SRP_JSON(objJSON, 'GetValue', 'Results[1].iq_sum')
ToolID = RunData<7>
TimeStamp = RunData<2>
If SumOOS NE '' then
Swap 'T_LOW' with 'T-Low' in PSN
Swap 'T_MID' with 'T-Mid' in PSN
Swap 'T_HIGH' with 'T-High' in PSN
Pass = (SumOOS EQ 0)
QualResponse = PM_Services('ProcessQual', PSN, ToolID, TimeStamp, Pass)
StatusCode = QualResponse<1>
Message = QualResponse<2>
Metrology_Services('LogResults', PSN, Machine, StatusCode, Service : ' : ' : Message)
end else
LogMessage = 'IQS response missing Results[1].iq_sum. Error message: ':SRP_JSON(objJSON, 'GetValue', 'message')
Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : LogMessage)
end
SRP_JSON(objJSON, 'Release')
end else
Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : 'Failed to parse IQS JSON response')
end
end else
Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : 'Null response from IQS API.')
end
end service
Service ImportStratusData(RunData, ResourceID, PSN)
Machine = 'Stratus'
@ -743,7 +800,7 @@ Service ImportStratusData(RunData, ResourceID, PSN)
ThickAvg = RunData<12>
Positions = ''
DataPoints = ''
ToolClass = Xlate('TOOL', Tool, 'CLASS', 'X')
Loop
Position = Trim(RunData<FieldPos>)
DataPoint = Trim(RunData<FieldPos + Offset>)
@ -767,17 +824,69 @@ Service ImportStratusData(RunData, ResourceID, PSN)
Case RowExists('WM_OUT', Cassette)
WorkOrderNo = Field(Cassette, '*', 1)
CassNo = Field(Cassette, '*', 3)
RDSNo@ = Cassette ; // This is used for logging purposes.
IsEpiPro = true$
LegacyLotId@ = Cassette
IsEpiPro = True$
LegacyLotType = 'WM_OUT'
Case RowExists('RDS', RDSNo)
WorkOrderNo = Xlate('RDS', RDSNo, 'WO', 'X')
CassNo = Xlate('RDS', RDSNo, 'CASS_NO', 'X')
RDSNo@ = RDSNo ; // This is used for logging purposes.
LegacyLotId@ = RDSNo
LegacyLotType = 'RDS'
Case Otherwise$
Error_Services('Add', 'Unrecognized cassette ID ':Cassette:'.')
End Case
If Error_Services('NoError') then
LotId = Lot_Services('GetLotIdByLegacyLotIdAndType', LegacyLotId@, LegacyLotType)
If LotId NE '' then
If DCount(LotId, @VM) EQ 1 then
// Import into new metrology data structures
If Datapoints NE '' then
Done = False$
For each DataPoint in DataPoints using @VM setting vPos
Slot = Positions<0, vPos>
MetTestId = Met_Test_Services('CreateMetTest', LotId, LegacyLotId@, ToolClass, Recipe)
If Error_Services('NoError') then
Met_Test_Services('SetPropsAndLimits', MetTestId)
If Error_Services('HasError') then
// Failed to set property names and limits based on input data from metrology file. Log this and continue importing data.
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
Error_Services('Clear')
end
Met_Test_Services('SetMetTestTool', MetTestId, Tool)
If Error_Services('NoError') then
Met_Test_Services('SetMetTestDtm', MetTestId, TimeStamp)
If Error_Services('NoError') then
Met_Test_Services('SetMetTestSlot', MetTestId, Slot)
If Error_Services('NoError') then
Met_Test_Services('AddMetTestData', MetTestId, '', DataPoint)
If Error_Services('HasError') then
Done = True$
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end else
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end else
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end else
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end else
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
Next DataPoint
end else
ErrorMsg = 'Error in ':Service:' service. No DataPoints to import.'
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : ErrorMsg)
end
end else
Swap @VM with ',' in LotId
ErrorMsg = 'Error in ':Service:' service. Number of lot ids returned does not equal 1. Lot ids: ':LotId
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : ErrorMsg)
end
end
// Update WO_MAT record
StdDev = ''
@ -804,15 +913,15 @@ Service ImportStratusData(RunData, ResourceID, PSN)
end
Database_Services('WriteDataRow', 'WO_MAT', WOMatKey, WOMatRec, True$, False$, True$)
If Error_Services('HasError') then
Metrology_Services('LogResults', RDSNo@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end else
Metrology_Services('LogResults', RDSNo@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
// Update the WM_OUT record for EpiPro
If IsEpiPro then
NumVals = 0
WMORec = Database_Services('ReadDataRow', 'WM_OUT', RDSNo@)
WMORec = Database_Services('ReadDataRow', 'WM_OUT', LegacyLotId@)
For each Wafer in Positions using @VM setting dPos
If Wafer NE '' then
WMORec<WM_OUT_MU_WAFER_THK_RESULT$, Wafer> = DataPoints<0, dPos>
@ -830,7 +939,7 @@ Service ImportStratusData(RunData, ResourceID, PSN)
StdDev = Math_Services('GetStdDev', Vals, StdDevType)
StdDev = OConv(IConv(StdDev, 'MD3'), 'MD3')
end
Database_Services('WriteDataRow', 'WM_OUT', RDSNo@, WMORec, True$, False$, True$)
Database_Services('WriteDataRow', 'WM_OUT', LegacyLotId@, WMORec, True$, False$, True$)
end
// Update WO_MAT_QA record
@ -882,15 +991,15 @@ Service ImportStratusData(RunData, ResourceID, PSN)
Next Profile
Database_Services('WriteDataRow', 'WO_MAT_QA', WOMatQAID, WOMatQARec, True$, False$, True$)
If Error_Services('NoError') then
Metrology_Services('LogResults', RDSNo@, Machine, 'UID000', Service : ' : Success.')
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID000', Service : ' : Success.')
end else
Metrology_Services('LogResults', RDSNo@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end else
Metrology_Services('LogResults', RDSNo@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end else
Metrology_Services('LogResults', RDSNo@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end service
@ -1037,6 +1146,56 @@ Service ImportBioRadData(RunData, ResourceID, IsViewerFile, PSN, FileName)
Swap ' AM' with 'AM' in Timestamp
Swap ' PM' with 'PM' in Timestamp
Timestamp = IConv(Timestamp,'DT')
LotId = Lot_Services('GetLotIdByLegacyLotIdAndType', RDSKeyID, 'RDS')
If LotId NE '' then
If DCount(LotId, @VM) EQ 1 then
// Import into new metrology data structures
ToolId = Field(Filename, ' ', 2, 1)
ToolClass = Xlate('TOOL', ToolId, 'CLASS', 'X')
MetTestId = Met_Test_Services('CreateMetTest', LotId, RDSKeyID, ToolClass, ScanRecipe, '', RunDataLayer, RunDataZone, '')
If Error_Services('NoError') then
Met_Test_Services('SetPropsAndLimits', MetTestId)
If Error_Services('HasError') then
// Failed to set property names and limits based on input data from metrology file. Log this and continue importing data.
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
Error_Services('Clear')
end
Met_Test_Services('SetMetTestTool', MetTestId, ToolId)
If Error_Services('NoError') then
Met_Test_Services('SetMetTestDtm', MetTestId, TimeStamp)
If Error_Services('NoError') then
If RawDataPoints NE '' then
Done = False$
For each DataPoint in RawDataPoints using @VM setting vPos
Position = Positions<0, vPos>
Met_Test_Services('AddMetTestData', MetTestId, Position, DataPoint)
If Error_Services('HasError') then
Done = True$
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
Until Done
Next DataPoint
end else
ErrorMsg = 'Error in ':Service:' service. No DataPoints to import.'
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : ErrorMsg)
end
end else
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end else
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end else
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end else
Swap @VM with ',' in LotId
ErrorMsg = 'Error in ':Service:' service. Number of lot ids returned does not equal 1. Lot ids: ':LotId
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : ErrorMsg)
end
end
RDSLayerKeyID = RDSKeyID : '*' : RunDataLayer
NumDataPoints = DCount(DataPoints, @VM)
RDSLayerRec = Database_Services('ReadDataRow', 'RDS_LAYER', RDSLayerKeyID)
@ -1255,11 +1414,9 @@ Service ImportBioRadData(RunData, ResourceID, IsViewerFile, PSN, FileName)
end service
Service ImportCDEQualData(RunData, ResourceID, PSN)
Machine = 'CDE'
ResourceID = Field(FileName, ' ', 1, 1)
URL = "https://oi-metrology-viewer-prod.mes.infineon.com/api/InfinityQSV3/":ResourceID:"/header"
TimeoutDuration = HTTPClient_Services('GetTimeoutDuration')
If TimeoutDuration NE 30 then Httpclient_Services('SetTimeoutDuration', 30)
@ -1289,7 +1446,6 @@ Service ImportCDEQualData(RunData, ResourceID, PSN)
end service
Service ImportCDEData(RunData, ResourceID, IsViewerFile, PSN)
Machine = 'CDE'
@ -1382,6 +1538,57 @@ Service ImportCDEData(RunData, ResourceID, IsViewerFile, PSN)
Swap ' PM' with 'PM' in Timestamp
Timestamp = IConv(Timestamp,'DT')
LotId = Lot_Services('GetLotIdByLegacyLotIdAndType', RDSKeyID, 'RDS')
If LotId NE '' then
If DCount(LotId, @VM) EQ 1 then
// Import into new metrology data structures
ToolRecipe = Trim(Field(ScanRecipe, '\', 1, 1))
ToolPattern = Trim(Field(ScanRecipe, '\', 2, 1))
ToolClass = Xlate('TOOL', ToolId, 'CLASS', 'X')
MetTestId = Met_Test_Services('CreateMetTest', LotId, RDSKeyID, ToolClass, ToolRecipe, ToolPattern, RunDataLayer, RunDataZone)
If Error_Services('NoError') then
Met_Test_Services('SetPropsAndLimits', MetTestId)
If Error_Services('HasError') then
// Failed to set property names and limits based on input data from metrology file. Log this and continue importing data.
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
Error_Services('Clear')
end
Met_Test_Services('SetMetTestTool', MetTestId, ToolId)
If Error_Services('NoError') then
Met_Test_Services('SetMetTestDtm', MetTestId, TimeStamp)
If Error_Services('NoError') then
If RawDatapoints NE '' then
Done = False$
TempDataPoints = OConv(IConv(RawDatapoints, 'MD':Decimals), 'MD':Decimals)
For each DataPoint in TempDataPoints using @VM setting vPos
Position = Positions<0, vPos>
Met_Test_Services('AddMetTestData', MetTestId, Position, DataPoint)
If Error_Services('HasError') then
Done = True$
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
Until Done
Next DataPoint
end else
ErrorMsg = 'Error in ':Service:' service. No DataPoints to import.'
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : ErrorMsg)
end
end else
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end else
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end else
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end else
Swap @VM with ',' in LotId
ErrorMsg = 'Error in ':Service:' service. Number of lot ids returned does not equal 1. Lot ids: ':LotId
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : ErrorMsg)
end
end
RDSLayerKeyID = RDSKeyID : '*' : RunDataLayer
NumDataPoints = DCount(DataPoints, @VM)
RDSLayerRec = Database_Services('ReadDataRow', 'RDS_LAYER', RDSLayerKeyID)
@ -1550,7 +1757,7 @@ Service ImportHgCVData(RunData, ResourceID, IsViewerFile, PSN)
DataIndex = RDS_TEST_READ_HGCV1_RES$
DTMIndex = RDS_TEST_TEST_RUN_HGCV_DTM$
Metrology_Services('LogResults', RDSKeyID, Machine, 'UID000', Service : ' : ' : 'Beginning ImportHgCVData')
RDSNo@ = RDSKeyID
LegacyLotId@ = RDSKeyID
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKeyID)
If Error_Services('NoError') then
WorkOrderNo = RDSRec<RDS_WO$>
@ -1607,23 +1814,83 @@ Service ImportHgCVData(RunData, ResourceID, IsViewerFile, PSN)
Positions = ''
DataPoints = ''
HgCVDataPoints = ''
PhaseDataPoints = ''
Loop
Position = Trim(RunData<FieldPos>)
HgCVDataPoint = Trim(RunData<FieldPos + Offset>)
PhaseDataPoint = Trim(RunData<FieldPos + PhaseOffset>)
Until Position EQ ''
Positions := Position : @VM
HgCVDataPoints := HgCVDataPoint : @VM
PhaseDataPoints := PhaseDataPoint : @VM
FieldPos += FieldPosIncrement
Repeat
Positions[-1, 1] = '' ; // Strip final @VM
HgCVDataPoints[-1, 1] = '' ; // Strip final @VM
PhaseDataPoints[-1, 1] = '' ; // Strip final @VM
RawDataPoints = HgCVDataPoints
RawPhaseDataPoints = PhaseDataPoints
HgCVDataPoints = Iconv(HgCVDataPoints, 'MD' : Decimals)
PhaseDataPoints = Iconv(PhaseDataPoints, 'MD' : Decimals)
Swap ' AM' with 'AM' in Timestamp
Swap ' PM' with 'PM' in Timestamp
Timestamp = IConv(Timestamp,'DT')
// Recipe field 21
// Pattern field 24
LotId = Lot_Services('GetLotIdByLegacyLotIdAndType', RDSKeyID, 'RDS')
If LotId NE '' then
If DCount(LotId, @VM) EQ 1 then
// Import into new metrology data structures
ToolId = RunData<2>
ToolRecipe = RunData<21>
ToolPattern = RunData<24>
ToolClass = Xlate('TOOL', ToolId, 'CLASS', 'X')
MetTestId = Met_Test_Services('CreateMetTest', LotId, RDSKeyID, ToolClass, ToolRecipe, ToolPattern, RunDataLayer, RunDataZone)
If Error_Services('NoError') then
Met_Test_Services('SetPropsAndLimits', MetTestId)
If Error_Services('HasError') then
// Failed to set property names and limits based on input data from metrology file. Log this and continue importing data.
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
Error_Services('Clear')
end
Met_Test_Services('SetMetTestTool', MetTestId, ToolId)
If Error_Services('NoError') then
Met_Test_Services('SetMetTestDtm', MetTestId, TimeStamp)
If Error_Services('NoError') then
If RawDataPoints NE '' then
Done = False$
For each DataPoint in RawDataPoints using @VM setting vPos
Position = Positions<0, vPos>
PhaseDataPoint = RawPhaseDataPoints<0, vPos>
Met_Test_Services('AddMetTestData', MetTestId, Position, DataPoint, PhaseDataPoint)
If Error_Services('HasError') then
Done = True$
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
Until Done
Next DataPoint
end else
ErrorMsg = 'Error in ':Service:' service. No DataPoints to import.'
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : ErrorMsg)
end
end else
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end else
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end else
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end else
Swap @VM with ',' in LotId
ErrorMsg = 'Error in ':Service:' service. Number of lot ids returned does not equal 1. Lot ids: ':LotId
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : ErrorMsg)
end
end
RDSLayerKeyID = RDSKeyID : '*' : RunDataLayer
NumDataPoints = DCount(HgCVDataPoints, @VM)
RDSLayerRec = Database_Services('ReadDataRow', 'RDS_LAYER', RDSLayerKeyID)
@ -1674,7 +1941,6 @@ Service ImportHgCVData(RunData, ResourceID, IsViewerFile, PSN)
PhaseDataPoints[-1, 1] = '' ; // Strip final @VM
PhaseDataPoints = Iconv(PhaseDataPoints, 'MD' : Decimals)
DataPoints = HgCVDataPoints
* GoSub CalculateQAData
Response = QA_Services('CalculateHgCVData', Datapoints)
HgCVMin = Response<0, 2>
HgCVMax = Response<0, 3>
@ -1688,23 +1954,12 @@ Service ImportHgCVData(RunData, ResourceID, IsViewerFile, PSN)
DataPoints = PhaseDataPoints
Response = QA_Services('CalculateHgCVData', Datapoints)
* GoSub CalculateQAData
PhaseMin = Response<0, 2>
PhaseMax = Response<0, 3>
PhaseAvg = Response<0, 1>
PhaseEdgeMean = Response<0, 4>
PhaseRangePct = Response<0, 5>
// Format data. Round to significant digits.
* HgCVAvg = Oconv(Iconv(Oconv(HgCVAvg, 'MD3L'), 'MD3L'), 'MD3L')
* PhaseAvg = Oconv(Iconv(Oconv(PhaseAvg, 'MD3L'), 'MD3L'), 'MD3L')
* HgCVMin = Oconv(Iconv(Oconv(HgCVMin, 'MD3L'), 'MD3L'), 'MD3L')
* HgCVMax = Oconv(Iconv(Oconv(HgCVMax, 'MD3L'), 'MD3L'), 'MD3L')
* PhaseMin = Oconv(Iconv(Oconv(PhaseMin, 'MD3L'), 'MD3L'), 'MD3L')
* PhaseMax = Oconv(Iconv(Oconv(PhaseMax, 'MD3L'), 'MD3L'), 'MD3L')
* HgCVEdgeMean = OConv(IConv(HgCVEdgeMean, 'MD3L'), 'MD3L')
* PhaseEdgeMean = Oconv(IConv(PhaseEdgeMean, 'MD3L'), 'MD3L')
* HgCVRangePct = Oconv(Iconv(HgCVRangePct, 'MD3L'), 'MD3L')
* PhaseRangePct = Oconv(Iconv(PhaseRangePct, 'MD3L'), 'MD3L')
WOMatQARec<WO_MAT_QA_RESULT$, vPos> = HgCVAvg : @SVM : PhaseAvg
WOMatQARec<WO_MAT_QA_MIN_RESULT$, vPos> = HgCVMin : @SVM : PhaseMin
WOMatQARec<WO_MAT_QA_MAX_RESULT$, vPos> = HgCVMax : @SVM : PhaseMax
@ -1854,13 +2109,98 @@ Service ImportTencorData(RunData)
SoDMin = RunData<41>
ScanTool = RunData<43>
Swap '%' with ' ' in ScanTool
RDSNo@ = RDSKeyID
LegacyLotId@ = RDSKeyID
Convert @Lower_Case to @Upper_Case in ScanTool
Swap ' AM' with 'AM' in Timestamp
Swap ' PM' with 'PM' in Timestamp
Timestamp = IConv(Timestamp,'DT')
SODWaferArray = ''
WaferNos = ''
SODVals = ''
SortVals = ''
SODStartTime = Time()
SODWaferArray = QA_Services('GetSODPerWafer', RDSKeyID, ScanRecipe, Timestamp)
SODStopTime = Time()
TimeTaken = SODStopTime - SODStartTime
LogData = ''
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
LogData<2> = MachineType@
LogData<3> = LegacyLotId@
LogData<4> = 'Time taken to import SOD data: ':TimeTaken:' seconds.'
Logging_Services('AppendLog', objSODPerfLog, LogData, @RM, @FM)
If SODWaferArray NE '' then
WaferNos = SODWaferArray<1>
SODVals = SODWaferArray<2>
SortVals = SODWaferArray<3>
For each WaferNo in WaferNos using @VM
If WaferNo NE '' then QA_Services('PostWaferImageRequest', RDSKeyID, WaferNo, ScanRecipe)
Next Wafer
end
LotId = Lot_Services('GetLotIdByLegacyLotIdAndType', RDSKeyID, 'RDS')
If LotId NE '' then
If DCount(LotId, @VM) EQ 1 then
// Import into new metrology data structures
MetTestId = Met_Test_Services('CreateMetTest', LotId, RDSKeyID, '', ScanRecipe)
If Error_Services('NoError') then
Met_Test_Services('SetPropsAndLimits', MetTestId)
If Error_Services('HasError') then
// Failed to set property names and limits based on input data from metrology file. Log this and continue importing data.
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
Error_Services('Clear')
end
Met_Test_Services('SetMetTestTool', MetTestId, ScanTool)
If Error_Services('NoError') then
Met_Test_Services('SetMetTestDtm', MetTestId, TimeStamp)
If Error_Services('NoError') then
// Add SORT property to Tencor surfscan MET_TEST - 'PASS' or 'FAIL' - no min or max
//Met_Test_Services('AddProperty', MetTestId, 'SURFACE_SCAN_SORT')
If Error_Services('NoError') then
// Prop 1: SURFACE_SCAN_SUM_OF_DEFECTS_MIN
// Prop 2: SURFACE_SCAN_SUM_OF_DEFECTS_MAX
// Prop 3: SURFACE_SCAN_SUM_OF_DEFECTS_AVG
// Prop 4: SURFACE_SCAN_SUM_OF_DEFECTS (per wafer)
// Prop 5: SURFACE_SCAN_HAZE_AVG
// Prop 6: SURFACE_SCAN_SORT (per wafer)
Met_Test_Services('AddProperty', MetTestId, 'SURFACE_SCAN_SUM_OF_DEFECTS_MIN')
Met_Test_Services('AddProperty', MetTestId, 'SURFACE_SCAN_SUM_OF_DEFECTS_MAX')
Met_Test_Services('AddProperty', MetTestId, 'SURFACE_SCAN_SUM_OF_DEFECTS_AVG')
Met_Test_Services('AddProperty', MetTestId, 'SURFACE_SCAN_SUM_OF_DEFECTS')
Met_Test_Services('AddProperty', MetTestId, 'SURFACE_SCAN_HAZE_AVG')
Met_Test_Services('AddProperty', MetTestId, 'SURFACE_SCAN_SORT')
Met_Test_Services('AddMetTestData', MetTestId, '', SoDMin, SoDMax, SoDAvg, '', HazeAvg)
If Error_Services('HasError') then
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
For each WaferNo in WaferNos using @VM setting vPos
If WaferNo NE '' then
Met_Test_Services('AddMetTestData', MetTestId, WaferNo, '', '', '', SODVals<0, vPos>, '', SortVals<0, vPos>)
If Error_Services('HasError') then
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end
Next WaferNo
end else
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end else
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end else
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end else
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end else
Swap @VM with ',' in LotId
ErrorMsg = 'Error in ':Service:' service. Number of lot ids returned does not equal 1. Lot ids: ':LotId
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : ErrorMsg)
end
end
If RowExists('RDS', RDSKeyID) then
// Try to read the CleanInsp datarow. Use this to identify the RDSKeyID.
ReactRunRec = Database_Services('ReadDataRow', 'REACT_RUN', RDSKeyID)
@ -1894,30 +2234,11 @@ Service ImportTencorData(RunData)
NumWfrs = 0
Locate ScanRecipe In SpecRecipeList Using @VM Setting RecipeIndex then
// Recipe found in spec list
SpecSampleQty = CleanInspRec<CLEAN_INSP_SPEC_SS_SAMP_QTY$, RecipeIndex>
SODWaferArray = ''
SODStartTime = Time()
SODWaferArray = QA_Services('GetSODPerWafer', RDSKeyID, ScanRecipe, Timestamp)
SODStopTime = Time()
TimeTaken = SODStopTime - SODStartTime
LogData = ''
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
LogData<2> = MachineType@
LogData<3> = RDSNo@
LogData<4> = 'Time taken to import SOD data: ':TimeTaken:' seconds.'
Logging_Services('AppendLog', objSODPerfLog, LogData, @RM, @FM)
If SODWaferArray NE '' then
WaferNos = SODWaferArray<1>
SODVals = SODWaferArray<2>
SortVals = SODWaferArray<3>
For each Wfr in SODVals using @VM setting vPos
NumWfrs += (Wfr NE '')
Next Wfr
For each WaferNo in WaferNos using @VM
If WaferNo NE '' then
CleanInspRec<CLEAN_INSP_SCAN_SOD_PER_WAFER$, ScanIndex, WaferNo> = SODVals<1,WaferNo>
CleanInspRec<CLEAN_INSP_SCAN_SORT_PER_WAFER$, ScanIndex, WaferNo> = SortVals<1,WaferNo>
QA_Services('PostWaferImageRequest', RDSKeyID, WaferNo, ScanRecipe)
end
Next Wafer
end
@ -1970,7 +2291,7 @@ Service ImportTencorData(RunData)
// If statement to gate from production below
PostStartTime = Time()
if Indexc(ScanRecipe, 'POST', 1) then
//Locate 'POST' in ScanRecipe Using "" setting pPos then
// Locate 'POST' in ScanRecipe Using "" setting pPos then
ReactRunRec = Xlate('REACT_RUN',RDSKeyID, '', 'X')
WONo = ReactRunRec<REACT_RUN_WO_NO$>;//WONo
WOStep = ReactRunRec<REACT_RUN_WO_STEP$>;//WOStep
@ -1979,19 +2300,19 @@ Service ImportTencorData(RunData)
PSNo = XLATE('RDS',RDSKeyID,RDS_PROD_SPEC_ID$,'X');//PSNo
DefectSpec = Xlate('PRS_STAGE', PSNo : '*LWI', PRS_STAGE_SURF_DEFECTS$, 'X');//Since there is no set spec for a non-existent stage we need to take one from the unloading step.
HazeSpec = Xlate('PRS_STAGE', PSNo : '*LWI', PRS_STAGE_SURF_HAZE$, 'X');//Since there is no set spec for a non-existent stage we need to take one from the unloading step.
//Check if CI was created already(usually during cleans) JRO-9-28
// Check if CI was created already(usually during cleans) JRO-9-28
CIStages = ReactRunRec<REACT_RUN_CI_STAGE$>
Locate 'POST' in CIStages using @VM setting sPos then
//Existing POST CI record found, fetch it.
// Existing POST CI record found, fetch it.
CINo = ReactRunRec<REACT_RUN_CI_NO$,sPos>
CleanInspRec = Xlate('CLEAN_INSP', CINo,'','X')
IF CleanInspRec<CLEAN_INSP_SCAN_SOD_PER_WAFER$> NE '' THEN
//Append a value mark to the end of the field so that we can add another set of data
// Append a value mark to the end of the field so that we can add another set of data
CleanInspRec<CLEAN_INSP_SCAN_SOD_PER_WAFER$> = CleanInspRec<CLEAN_INSP_SCAN_SOD_PER_WAFER$> : @VM
END
exists = True$
end else
//No Exisiting POST CI record found, Create new CI record
// No Exisiting POST CI record found, Create new CI record
exists = False$
oCIParms = ''
oCIParms = WONo:@RM
@ -2020,28 +2341,18 @@ Service ImportTencorData(RunData)
CleanInspRec = Insert(CleanInspRec, CLEAN_INSP_INSP_TEST_RUN_DTM$, -1, 0, Timestamp)
CleanInspRec = Insert(CleanInspRec, CLEAN_INSP_SPEC_SURFSCAN_RECIPE$, -1, 0, ScanRecipe)
CleanInspRec = Insert(CleanInspRec, CLEAN_INSP_SPEC_SURF_DEFECTS$, -1, 0, DefectSpec)
//Here I am attempting to create the scan details.
SODWaferArray = ''
SODWaferArray = QA_Services('GetSODPerWafer', RDSKeyID, ScanRecipe, Timestamp)
// Here I am attempting to create the scan details.
If SODWaferArray NE '' then
WaferNos = SODWaferArray<1>
SODVals = SODWaferArray<2>
SortVals = SODWaferArray<3>
NumRecipes = DCount(CleanInspRec<CLEAN_INSP_SCAN_RECIPE$>, @VM)
NumWfrs = ''
For each Wfr in SODVals using @VM setting vPos
NumWfrs += (Wfr NE '')
Next Wfr
For each WaferNo in WaferNos using @VM
If WaferNo NE '' then
CleanInspRec<CLEAN_INSP_SCAN_SOD_PER_WAFER$, NumRecipes, WaferNo> = SODVals<1,WaferNo>
CleanInspRec<CLEAN_INSP_SCAN_SORT_PER_WAFER$, NumRecipes, WaferNo> = SortVals<1,WaferNo>
QA_Services('PostWaferImageRequest', RDSKeyID, WaferNo, ScanRecipe)
end
Next Wafer
end
if exists Eq False$ then
If exists EQ False$ then
oCIParms := CleanInspRec ;
CINo = obj_Clean_Insp('Create',oCIParms)
If Error_Services('NoError') then
@ -2054,7 +2365,7 @@ Service ImportTencorData(RunData)
LogData = ''
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
LogData<2> = MachineType@
LogData<3> = RDSNo@
LogData<3> = LegacyLotId@
LogData<4> = 'Time taken to import POST data: ':TimeTaken:' seconds.'
Logging_Services('AppendLog', objPOSTPerfLog, LogData, @RM, @FM)
end else
@ -2063,7 +2374,7 @@ Service ImportTencorData(RunData)
ErrorMessage = 'Failed to create CLEAN_INSP record. Error UID002.'
end
end else
//write to existing CI rec.
// Write to existing CI rec.
obj_Tables('WriteRec','CLEAN_INSP':@RM:CINo:@RM:@RM:CleanInspRec)
end
end else
@ -2118,17 +2429,64 @@ Service ImportSP1Data(RunData)
end
ScanTool = RunData<43>
DCNMM2 = RunData<44>
* Swap '%' with ' ' in ScanTool
// The 4th character can be 0 or %, but needs to be ' ' in OpenInsight
ScanTool[4,1] = ' '
Convert @Lower_Case to @Upper_Case in ScanTool
Convert @Lower_Case to @Upper_Case in CompareScanRecipe
* Convert ' ' to '' in CompareScanRecipe
Swap ' AM' with 'AM' in Timestamp
Swap ' PM' with 'PM' in Timestamp
Timestamp = IConv(Timestamp,'DT')
RDSNo@ = RDSKeyID
LotId = Lot_Services('GetLotIdByLegacyLotIdAndType', RDSKeyID, 'RDS')
If LotId NE '' then
If DCount(LotId, @VM) EQ 1 then
// Import into new metrology data structures
MetTestId = Met_Test_Services('CreateMetTest', LotId, RDSKeyID, '', ScanRecipe)
If Error_Services('NoError') then
Met_Test_Services('SetPropsAndLimits', MetTestId)
If Error_Services('HasError') then
// Failed to set property names and limits based on input data from metrology file. Log this and continue importing data.
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
Error_Services('Clear')
end
Met_Test_Services('SetMetTestTool', MetTestId, ScanTool)
If Error_Services('NoError') then
Met_Test_Services('SetMetTestDtm', MetTestId, TimeStamp)
If Error_Services('NoError') then
// Prop 1: SURFACE_SCAN_SUM_OF_DEFECTS_MIN
// Prop 2: SURFACE_SCAN_SUM_OF_DEFECTS_MAX
// Prop 3: SURFACE_SCAN_SUM_OF_DEFECTS_AVG
// Prop 4: SURFACE_SCAN_SUM_OF_DEFECTS (per wafer) - Currently not captured for SP1
// Prop 5: SURFACE_SCAN_HAZE_AVG
Met_Test_Services('RemoveProperty', MetTestId, 'SURFACE_SCAN_SUM_OF_DEFECTS')
If Error_Services('NoError') then
// Set SOD min, SOD max, SOD avg, and Haze Avg
Met_Test_Services('AddMetTestData', MetTestId, '', SoDMin, SoDMax, SoDAvg, '', HazeAvg)
If Error_Services('HasError') then
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end else
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end else
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end else
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end else
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end else
Swap @VM with ',' in LotId
ErrorMsg = 'Error in ':Service:' service. Number of lot ids returned does not equal 1. Lot ids: ':LotId
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : ErrorMsg)
end
end
LegacyLotId@ = RDSKeyID
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKeyID)
If Error_Services('NoError') then
WorkOrderNo = RDSRec<RDS_WO$>
@ -2520,7 +2878,7 @@ The service does the following actions:
5. Determines the spec slot by reading the WO_MAT_QA record -> SLOT field
6. If the detected RunDataSlot matches the spec slot, writes the datapoint to the WO_MAT_QA record - > RESULT field in the same @VM that the iterator is currently set to.
*/
Service ImportBioRadEPPFQAData(RunData, FileName)
Service ImportBioRadEPPFQAData(RunData, Filename)
Timestamp = RunData<2>
WMOKeyID = RunData<6>
@ -2553,15 +2911,66 @@ Service ImportBioRadEPPFQAData(RunData, FileName)
Positions[-1, 1] = '' ; // Strip final @VM
DataPoints[-1, 1] = '' ; // Strip final @VM
LotId = Lot_Services('GetLotIdByLegacyLotIdAndType', WMOKeyID, 'WM_OUT')
If LotId NE '' then
If DCount(LotId, @VM) EQ 1 then
// Import into new metrology data structures
ToolId = Field(Filename, ' ', 2, 1)
ToolClass = Xlate('TOOL', ToolId, 'CLASS', 'X')
If DataPoints NE '' then
For each DataPoint in DataPoints using @VM setting vPos
Slot = Positions<0, vPos>
MetTestId = Met_Test_Services('CreateMetTest', LotId, WMOKeyID, ToolClass, ScanRecipe, '', RunDataLayer)
If Error_Services('NoError') then
Met_Test_Services('SetPropsAndLimits', MetTestId)
If Error_Services('HasError') then
// Failed to set property names and limits based on input data from metrology file. Log this and continue importing data.
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
Error_Services('Clear')
end
Met_Test_Services('SetMetTestTool', MetTestId, ToolId)
If Error_Services('NoError') then
Met_Test_Services('SetMetTestDtm', MetTestId, TimeStamp)
If Error_Services('NoError') then
Met_Test_Services('SetMetTestSlot', MetTestId, Slot)
If Error_Services('NoError') then
Met_Test_Services('AddMetTestData', MetTestId, '', DataPoint)
If Error_Services('HasError') then
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end else
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end else
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end else
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end else
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
Next DataPoint
end else
ErrorMsg = 'Error in ':Service:' service. No DataPoints to import.'
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : ErrorMsg)
end
end else
Swap @VM with ',' in LotId
ErrorMsg = 'Error in ':Service:' service. Number of lot ids returned does not equal 1. Lot ids: ':LotId
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : ErrorMsg)
end
end
If Error_Services('NoError') then
If Error_Services('HasError') then
Metrology_Services('LogResults', RDSNo@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
//Update the WM_OUT record for EpiPro
WMORec<WM_OUT_MU_WAFER_THK_RESULT$, DataSlotId> = DataPoints
Database_Services('WriteDataRow', 'WM_OUT', WMOKeyID, WMORec, True$, False$, True$)
end else
Metrology_Services('LogResults', RDSNo@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
// Update WO_MAT_QA record
WOMatQAID = Field(WMOKeyID, '*', 1) : '*' : Field(WMOKeyID, '*', 3)
@ -2604,12 +3013,12 @@ Service ImportBioRadEPPFQAData(RunData, FileName)
Next Profile
Database_Services('WriteDataRow', 'WO_MAT_QA', WOMatQAID, WOMatQARec, True$, False$, True$)
If Error_Services('NoError') then
Metrology_Services('LogResults', RDSNo@, Machine, 'UID000', Service : ' : Success.')
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID000', Service : ' : Success.')
end else
Metrology_Services('LogResults', RDSNo@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end else
Metrology_Services('LogResults', RDSNo@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
Metrology_Services('LogResults', LegacyLotId@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end service
@ -2735,9 +3144,9 @@ Service GetIQSViolations()
Database_Services('WriteDataRow', 'CONFIG', 'IQS_VIOL_DATA', ParsedIQSData, True$, False$, True$)
//Send status of last write time
If SRP_Datetime('MinuteSpan', LastWriteTime, SRP_Datetime('Now')) GT 10 then
Mona_Services('SendBufferedStatus', 'IQS_VIOLATION_DATA', 'LastDataTimestamp', 'CRITICAL')
Mona_Services('PostStatus', 'IQS_VIOLATION_DATA', 'LastDataTimestamp', 'CRITICAL')
end else
Mona_Services('SendBufferedStatus', 'IQS_VIOLATION_DATA', 'LastDataTimestamp', 'OK')
Mona_Services('PostStatus', 'IQS_VIOLATION_DATA', 'LastDataTimestamp', 'OK')
end
Reactor_Services('UpdateReactorIQSViolations')
@ -3272,4 +3681,3 @@ LoadRunDataToDatabase:
end
return

View File

@ -0,0 +1,98 @@
Function Mettests_API(@API)
/***********************************************************************************************************************
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
permission from SRP Computer Solutions, Inc.
Name : Mettests_API
Description : API logic for the Mettests resource.
Notes : All web APIs should include the API_SETUP insert. This will provide several useful variables:
HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.)
APIURL - The URL for the API entry point (e.g., api.mysite.com/v1).
FullEndpointURL - The URL submitted by the client, including query params.
FullEndpointURLNoQuery - The URL submitted by the client, excluding query params.
EndpointSegment - The URL endpoint segment.
ParentURL - The URL path preceeding the current endpoint.
CurrentAPI - The name of this stored procedure.
Parameters :
API [in] -- Web API to process. Format is [APIPattern].[HTTPMethod]:
- APIPattern must follow this structure Mettests[.ID.[<Property>]]
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
Examples:
- Mettests.POST
- Mettests.ID.PUT
- Mettests.ID.firstName.GET
Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API
services do not rely upon anything being returned in the response. This is what the
various services like SetResponseBody and SetResponseStatus services are for. A response
value is only helpful if the developers want to use it for debug purposes.
History : (Date, Initials, Notes)
05/20/25 xxx Original programmer.
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
$insert APP_INSERTS
$insert API_SETUP
$insert HTTP_INSERTS
Declare function Met_Test_Services
GoToAPI else
// The specific resource endpoint doesn't have a API handler yet.
HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.')
end
Return Response OR ''
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Endpoint Handlers
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
API mettests.ID.HEAD
API mettests.ID.GET
// Return JSON payload containing RDS record details
StatusCode = 200
GoSub CreateHALItem
end api
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------------------------
// CreateHALItem
//
// Creates a HAL+JSON object based on the OpenInsight data row representation of the scan.
//----------------------------------------------------------------------------------------------------------------------
CreateHALItem:
MetTestId = EndpointSegment
MetTestJSON = Met_Test_Services('ConvertRecordToJSON', MetTestId, '', FullEndpointURL)
If Error_Services('NoError') then
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
HTTP_Services('SetResponseBody', MetTestJSON, False$, 'application/hal+json')
If Assigned(Message) then
HTTP_Services('SetResponseStatus', StatusCode, Message)
end else
HTTP_Services('SetResponseStatus', StatusCode)
end
end else
Message = Error_Services('GetMessage')
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
end
return

View File

@ -0,0 +1,257 @@
Function MET_TEST_Actions(Action, CalcColName, FSList, Handle, Name, FMC, Record, Status, OrigRecord, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)
/***********************************************************************************************************************
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
permission from Infineon.
Name : Met_Test_Actions
Description : Handles calculated columns and MFS calls for the current table.
Notes : This function uses @ID, @RECORD, and @DICT to make sure {ColumnName} references work correctly.
If called from outside of a calculated column these will need to be set and restored.
Parameters :
Action [in] -- Name of the action to be taken
CalcColName [in] -- Name of the calculated column that needs to be processed. Normally this should only be
populated when the CalcField action is being used.
FSList [in] -- The list of MFSs and the BFS name for the current file or volume. This is an @SVM
delimited array, with the current MFS name as the first value in the array, and the BFS
name as the last value. Normally set by a calling MFS.
Handle [in] -- The file handle of the file or media map being accessed. Note, this does contain the
entire handle structure that the Basic+ Open statement would provide. Normally set by a
calling MFS.
Name [in] -- The name (key) of the record or file being accessed. Normally set by a calling MFS.
FMC [in] -- Various functions. Normally set by a calling MFS.
Record [in] -- The entire record (for record-oriented functions) or a newly-created handle (for
"get handle" functions). Normally set by a calling MFS.
Status [in/out] -- Indicator of the success or failure of an action. Normally set by the calling MFS but
for some actions can be set by the action handler to indicate failure.
OrigRecord [in] -- Original content of the record being processed by the current action. This is
automatically being assigned by the WRITE_RECORD and DELETE_RECORD actions within
BASE_MFS.
Param1-10 [in/out] -- Additional request parameter holders
ActionFlow [out] -- Used to control the action chain (see the ACTION_SETUP insert for more information.)
Can also be used to return a special value, such as the results of the CalcField
method.
History : (Date, Initials, Notes)
05/14/25 djs Original programmer.
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
$Insert FILE.SYSTEM.EQUATES
$Insert ACTION_SETUP
$Insert APP_INSERTS
$Insert MET_TEST_EQUATES
$Insert MET_TEST_DATA_EQUATES
$Insert MET_TEST_INSERTS
$Insert DICT_EQUATES
Declare function Database_Services, SRP_Array, Read_Column
Declare subroutine Database_Services, RTI_Xlate_Controller
If KeyID then GoSub Initialize_System_Variables
Begin Case
Case Action _EQC 'CalculateColumn' ; GoSub CalculateColumn
Case Action _EQC 'READ_RECORD_PRE' ; GoSub READ_RECORD_PRE
Case Action _EQC 'READ_RECORD' ; GoSub READ_RECORD
Case Action _EQC 'READONLY_RECORD_PRE' ; GoSub READONLY_RECORD_PRE
Case Action _EQC 'READONLY_RECORD' ; GoSub READONLY_RECORD
Case Action _EQC 'WRITE_RECORD_PRE' ; GoSub WRITE_RECORD_PRE
Case Action _EQC 'WRITE_RECORD' ; GoSub WRITE_RECORD
Case Action _EQC 'DELETE_RECORD_PRE' ; GoSub DELETE_RECORD_PRE
Case Action _EQC 'DELETE_RECORD' ; GoSub DELETE_RECORD
Case Otherwise$ ; Status = 'Invalid Action'
End Case
If KeyID then GoSub Restore_System_Variables
If Assigned(ActionFlow) else ActionFlow = ACTION_CONTINUE$
Return ActionFlow
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Calculated Columns
//
// The typical structure of a calculated column will look like this:
//
// Declare function Database_Services
//
// @ANS = Database_Services('CalculateColumn')
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CalculateColumn:
// Make sure the ActionFlow return variable is cleared in case nothing is calculated.
ActionFlow = ''
return
// ----- MFS calls -----------------------------------------------------------------------------------------------------
READ_RECORD_PRE:
// In order to stop a record from being read in this action these lines of code must be used:
//
// OrigFileError = 100 : @FM : KeyID
// Status = 0
// Record = ''
// ActionFlow = ACTION_STOP$
return
READ_RECORD:
// In order to stop a record from being read in this action these lines of code must be used:
//
// OrigFileError = 100 : @FM : KeyID
// Status = 0
// Record = ''
return
READONLY_RECORD_PRE:
// In order to stop a record from being read in this action these lines of code must be used:
//
// OrigFileError = 100 : @FM : KeyID
// Status = 0
// Record = ''
// ActionFlow = ACTION_STOP$
return
READONLY_RECORD:
// In order to stop a record from being read in this action these lines of code must be used:
//
// OrigFileError = 100 : @FM : KeyID
// Status = 0
// Record = ''
return
WRITE_RECORD_PRE:
MetTestDataIds = {MET_TEST_DATA_IDS}
If MetTestDataIds NE '' then
// Evaluate if MET_TEST is out of spec
RTI_Xlate_Controller('DisableCache')
For PropertyIndex = 1 to NUM_PROPERTIES$
MetTestOutofSpec = (Sum(Xlate('MET_TEST_DATA', MetTestDataIds, "PROPERTY_":PropertyIndex:'_OUT_OF_SPEC', 'X')) GT 0)
Until MetTestOutofSpec
Next PropertyIndex
Record<MET_TEST.OUT_OF_SPEC$> = MetTestOutofSpec
// Evaluate if MET_TEST is complete (all required data has been recorded)
// If Sample Size set, then each defined property should have that number of related data points (MET_TEST_DATA) records.
// If Sample Size is not set, then each defined property should have at least one related data point (MET_TEST_DATA) record.
MetComplete = True$
SampleSize = {SAMPLE_SIZE}
If SampleSize EQ '' then SampleSize = 1
For PropertyIndex = 1 to NUM_PROPERTIES$
PropColNo = Xlate('DICT.MET_TEST', 'PROPERTY_':PropertyIndex, DICT_COLUMN_NO$, 'X')
If (Record<PropColNo> NE '') then
// Property is defined, check if number of data points matches SAMPLE_SIZE
PropVals = Xlate('MET_TEST_DATA', MetTestDataIds, 'PROPERTY_':PropertyIndex:'_VALUE', 'X')
PropVals = SRP_Array('Clean', PropVals, 'Trim')
MetComplete = (DCount(PropVals, @VM) GE SampleSize)
end
Until Not(MetComplete)
Next PropertyIndex
Record<MET_TEST.COMPLETE$> = MetComplete
RTI_Xlate_Controller('EnableCache')
end else
Record<MET_TEST.OUT_OF_SPEC$> = False$
Record<MET_TEST.COMPLETE$> = False$
end
SaveRecord = Record
return
WRITE_RECORD:
return
DELETE_RECORD_PRE:
return
DELETE_RECORD:
return
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ClearCursors:
For counter = 0 to 8
ClearSelect counter
Next counter
return
Initialize_System_Variables:
// Save these for restoration later
SaveDict = @DICT
SaveID = @ID
SaveRecord = @RECORD
OrigFileError = @FILE.ERROR
// Now make sure @DICT, ID, and @RECORD are populated
CurrentDictName = ''
If @DICT then
DictHandle = @DICT<1, 2>
Locate DictHandle in @TABLES(5) Using @FM Setting fPos then
CurrentDictName = Field(@TABLES(0), @FM, fPos, 1)
end
end
If CurrentDictName NE DictName then
Open DictName to @DICT else Status = 'Unable to initialize @DICT'
end
@ID = KeyID
If Record else
// Record might not have been passed in. Read the record from the database table just to make sure.
@FILE.ERROR = ''
Open TableName to hTable then
FullFSList = hTable[1, 'F' : @VM]
BFS = FullFSList[-1, 'B' : @SVM]
LastHandle = hTable[-1, 'B' : \0D\]
FileHandle = \0D\ : LastHandle[1, @VM]
Call @BFS(READO.RECORD, BFS, FileHandle, KeyID, FMC, Record, ReadOStatus)
end
end
@RECORD = Record
return
Restore_System_Variables:
Transfer SaveDict to @DICT
Transfer SaveID to @ID
Transfer SaveRecord to @RECORD
@FILE.ERROR = OrigFileError
return

View File

@ -0,0 +1,276 @@
Function MET_TEST_DATA_Actions(Action, CalcColName, FSList, Handle, Name, FMC, Record, Status, OrigRecord, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)
/***********************************************************************************************************************
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
permission from Infineon.
Name : Met_Test_Data_Actions
Description : Handles calculated columns and MFS calls for the current table.
Notes : This function uses @ID, @RECORD, and @DICT to make sure {ColumnName} references work correctly.
If called from outside of a calculated column these will need to be set and restored.
Parameters :
Action [in] -- Name of the action to be taken
CalcColName [in] -- Name of the calculated column that needs to be processed. Normally this should only be
populated when the CalcField action is being used.
FSList [in] -- The list of MFSs and the BFS name for the current file or volume. This is an @SVM
delimited array, with the current MFS name as the first value in the array, and the BFS
name as the last value. Normally set by a calling MFS.
Handle [in] -- The file handle of the file or media map being accessed. Note, this does contain the
entire handle structure that the Basic+ Open statement would provide. Normally set by a
calling MFS.
Name [in] -- The name (key) of the record or file being accessed. Normally set by a calling MFS.
FMC [in] -- Various functions. Normally set by a calling MFS.
Record [in] -- The entire record (for record-oriented functions) or a newly-created handle (for
"get handle" functions). Normally set by a calling MFS.
Status [in/out] -- Indicator of the success or failure of an action. Normally set by the calling MFS but
for some actions can be set by the action handler to indicate failure.
OrigRecord [in] -- Original content of the record being processed by the current action. This is
automatically being assigned by the WRITE_RECORD and DELETE_RECORD actions within
BASE_MFS.
Param1-10 [in/out] -- Additional request parameter holders
ActionFlow [out] -- Used to control the action chain (see the ACTION_SETUP insert for more information.)
Can also be used to return a special value, such as the results of the CalcField
method.
History : (Date, Initials, Notes)
05/14/25 djs Original programmer.
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
$Insert FILE.SYSTEM.EQUATES
$Insert ACTION_SETUP
$Insert APP_INSERTS
$Insert MET_TEST_EQUATES
$Insert MET_TEST_DATA_EQUATES
$Insert MET_TEST_INSERTS
$Insert DICT_EQUATES
Declare function Database_Services
Declare subroutine Database_Services
If KeyID then GoSub Initialize_System_Variables
Begin Case
Case Action _EQC 'CalculateColumn' ; GoSub CalculateColumn
Case Action _EQC 'READ_RECORD_PRE' ; GoSub READ_RECORD_PRE
Case Action _EQC 'READ_RECORD' ; GoSub READ_RECORD
Case Action _EQC 'READONLY_RECORD_PRE' ; GoSub READONLY_RECORD_PRE
Case Action _EQC 'READONLY_RECORD' ; GoSub READONLY_RECORD
Case Action _EQC 'WRITE_RECORD_PRE' ; GoSub WRITE_RECORD_PRE
Case Action _EQC 'WRITE_RECORD' ; GoSub WRITE_RECORD
Case Action _EQC 'DELETE_RECORD_PRE' ; GoSub DELETE_RECORD_PRE
Case Action _EQC 'DELETE_RECORD' ; GoSub DELETE_RECORD
Case Otherwise$ ; Status = 'Invalid Action'
End Case
If KeyID then GoSub Restore_System_Variables
If Assigned(ActionFlow) else ActionFlow = ACTION_CONTINUE$
Return ActionFlow
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Calculated Columns
//
// The typical structure of a calculated column will look like this:
//
// Declare function Database_Services
//
// @ANS = Database_Services('CalculateColumn')
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CalculateColumn:
// Make sure the ActionFlow return variable is cleared in case nothing is calculated.
ActionFlow = ''
return
// ----- MFS calls -----------------------------------------------------------------------------------------------------
READ_RECORD_PRE:
// In order to stop a record from being read in this action these lines of code must be used:
//
// OrigFileError = 100 : @FM : KeyID
// Status = 0
// Record = ''
// ActionFlow = ACTION_STOP$
return
READ_RECORD:
// In order to stop a record from being read in this action these lines of code must be used:
//
// OrigFileError = 100 : @FM : KeyID
// Status = 0
// Record = ''
return
READONLY_RECORD_PRE:
// In order to stop a record from being read in this action these lines of code must be used:
//
// OrigFileError = 100 : @FM : KeyID
// Status = 0
// Record = ''
// ActionFlow = ACTION_STOP$
return
READONLY_RECORD:
// In order to stop a record from being read in this action these lines of code must be used:
//
// OrigFileError = 100 : @FM : KeyID
// Status = 0
// Record = ''
return
WRITE_RECORD_PRE:
// Validate Property Values against specs defined in MET_TEST parent record
MetTestId = {MET_TEST_ID}
If MetTestId NE '' then
MetTestRec = Database_Services('ReadDataRow', 'MET_TEST', MetTestId)
If Error_Services('NoError') then
MetTestOutofSpecOrig = MetTestRec<MET_TEST.OUT_OF_SPEC$>
MetTestOutofSpec = False$
For PropertyIndex = 1 to NUM_PROPERTIES$
PropOutofSpec = False$
Prop = Xlate('MET_TEST', MetTestId, 'PROPERTY_':PropertyIndex, 'X')
If Prop NE '' then
PropMin = Xlate('MET_TEST', MetTestId, 'PROPERTY_':PropertyIndex:'_SPEC_MIN', 'X')
PropMax = Xlate('MET_TEST', MetTestId, 'PROPERTY_':PropertyIndex:'_SPEC_MAX', 'X')
PropValColNo = Xlate('DICT.MET_TEST_DATA', 'PROPERTY_':PropertyIndex:'_VALUE', DICT_COLUMN_NO$, 'X')
PropVal = Record<PropValColNo>
Begin Case
Case (PropVal EQ '')
PropOutofSpec = False$
Case ( (PropMin NE '') and (PropMax NE '') )
PropOutofSpec = ( (PropVal LT PropMin) or (PropVal GT PropMax) )
Case (PropMin NE '')
PropOutofSpec = (PropVal LT PropMin)
Case (PropMax NE '')
PropOutofSpec = (PropVal GT PropMax)
Case (Prop EQ 'SURFACE_SCAN_SORT')
PropOutofSpec = Not((PropVal _EQC 'PASS'))
Case Otherwise$
Null
End Case
PropOOSColNo = Xlate('DICT.MET_TEST_DATA', 'PROPERTY_':PropertyIndex:'_OUT_OF_SPEC', DICT_COLUMN_NO$, 'X')
Record<PropOOSColNo> = PropOutofSpec
end
If PropOutofSpec then MetTestOutofSpec = True$
Next PropertyIndex
SaveRecord = Record
end
end
return
WRITE_RECORD:
// Trigger MET_TEST_ACTIONS to re-evaluate if the entire MET_TEST record is in spec and comlete
MetTestRec = Database_Services('ReadDataRow', 'MET_TEST', {MET_TEST_ID})
If Error_Services('NoError') then
Database_Services('WriteDataRow', 'MET_TEST', {MET_TEST_ID}, MetTestRec, True$, False$, False$)
end
return
DELETE_RECORD_PRE:
return
DELETE_RECORD:
return
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ClearCursors:
For counter = 0 to 8
ClearSelect counter
Next counter
return
Initialize_System_Variables:
// Save these for restoration later
SaveDict = @DICT
SaveID = @ID
SaveRecord = @RECORD
OrigFileError = @FILE.ERROR
// Now make sure @DICT, ID, and @RECORD are populated
CurrentDictName = ''
If @DICT then
DictHandle = @DICT<1, 2>
Locate DictHandle in @TABLES(5) Using @FM Setting fPos then
CurrentDictName = Field(@TABLES(0), @FM, fPos, 1)
end
end
If CurrentDictName NE DictName then
Open DictName to @DICT else Status = 'Unable to initialize @DICT'
end
@ID = KeyID
If Record else
// Record might not have been passed in. Read the record from the database table just to make sure.
@FILE.ERROR = ''
Open TableName to hTable then
FullFSList = hTable[1, 'F' : @VM]
BFS = FullFSList[-1, 'B' : @SVM]
LastHandle = hTable[-1, 'B' : \0D\]
FileHandle = \0D\ : LastHandle[1, @VM]
Call @BFS(READO.RECORD, BFS, FileHandle, KeyID, FMC, Record, ReadOStatus)
end
end
@RECORD = Record
return
Restore_System_Variables:
Transfer SaveDict to @DICT
Transfer SaveID to @ID
Transfer SaveRecord to @RECORD
@FILE.ERROR = OrigFileError
return

File diff suppressed because it is too large Load Diff

View File

@ -135,4 +135,3 @@ API monaengines.ID.GET
end
end api

View File

@ -61,4 +61,3 @@ API mona.GET
HTTP_Resource_Services('LoremIpsum')
end api

View File

@ -1,7 +1,5 @@
Compile subroutine MONA_MONITORS(@Service, @Params)
#pragma precomp SRP_PreCompiler
/*****************************************************************************\
This is a utility function. It is a container for auditing general OI metrics
and then reporting them into MonA directly.
@ -37,16 +35,34 @@ Service RunMonitors()
Lock hSysLists, ServiceKeyID then
Query = 'SELECT SQL_BACKLOG'
Rlist(Query, Target_ActiveList$, '', '', '')
RList(Query, TARGET_ACTIVELIST$, '', '', '')
QueueCount = @RecCount
GoSub ClearCursors
Mona_Services('SendMetric', 'SQL_BACKLOG', 'SQL_BACKLOG', QueueCount)
Mona_Services('PostAverageMetric', 'SQL_BACKLOG', 'SQL_BACKLOG', QueueCount)
Query = 'SELECT SQL_PENDING'
Rlist(Query, Target_ActiveList$, '', '', '')
RList(Query, TARGET_ACTIVELIST$, '', '', '')
QueueCount = @RecCount
GoSub ClearCursors
Mona_Services('SendMetric', 'SQL_PENDING', 'SQL_PENDING', QueueCount)
Mona_Services('PostAverageMetric', 'SQL_PENDING', 'SQL_PENDING', QueueCount)
Query = 'SELECT PROC_QUEUE2'
RList(Query, TARGET_ACTIVELIST$, '', '', '')
QueueCount = @RecCount
GoSub ClearCursors
Mona_Services('PostAverageMetric', 'GRP_OPENINSIGHT_MES_OP_FE_SERVICE_MANAGER', 'PROC_QUEUE', QueueCount)
Query = 'SELECT TRANSACTION_QUEUE'
RList(Query, TARGET_ACTIVELIST$, '', '', '')
QueueCount = @RecCount
GoSub ClearCursors
Mona_Services('PostAverageMetric', 'GRP_OPENINSIGHT_MES_OP_FE_SERVICE_MANAGER', 'TRANSACTION_QUEUE', QueueCount)
Query = 'SELECT MONA_QUEUE'
RList(Query, TARGET_ACTIVELIST$, '', '', '')
QueueCount = @RecCount
GoSub ClearCursors
Mona_Services('PostAverageMetric', 'GRP_OPENINSIGHT_MES_OP_FE_SERVICE_MANAGER', 'MONA_QUEUE', QueueCount)
GoSub SAPHeartbeat
GoSub MonitorMetrologyDirs
@ -61,21 +77,24 @@ end service
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
SAPHeartbeat:
SAPHeartbeatDTM = Database_Services('ReadDataRow', 'APP_INFO', 'SAP_HEARTBEAT_DTM')
CurrDTM = SRP_Datetime('Now')
If SAPHeartbeatDTM NE '' then
If SRP_Datetime('MinuteSpan', SAPHeartbeatDTM, CurrDTM) LT 5 then
Mona_Services('SendStatus', 'GRP_OPENINSIGHT_MES_OP_FE_SAP', 'Heartbeat', 'OK')
Mona_Services('PostStatus', 'GRP_OPENINSIGHT_MES_OP_FE_SAP', 'Heartbeat', 'OK')
end else
Mona_Services('SendStatus', 'GRP_OPENINSIGHT_MES_OP_FE_SAP', 'Heartbeat', 'CRITICAL')
Mona_Services('PostStatus', 'GRP_OPENINSIGHT_MES_OP_FE_SAP', 'Heartbeat', 'CRITICAL')
end
end else
Mona_Services('SendStatus', 'GRP_OPENINSIGHT_MES_OP_FE_SAP', 'Heartbeat', 'WARNING')
Mona_Services('PostStatus', 'GRP_OPENINSIGHT_MES_OP_FE_SAP', 'Heartbeat', 'WARNING')
end
return
MonitorMetrologyDirs:
CurrDTM = SRP_Datetime('Now')
//Tencor
TencorInstanceName = 'MET08DDUPSFS6420'
@ -87,8 +106,8 @@ MonitorMetrologyDirs:
end else
TencorOldestFileAgeMinute = SRP_Datetime('MinuteSpan', TencorOldestFileDTM, CurrDTM)
end
Mona_Services('SendMetric', 'EXPORT_TO_OI_FILE_COUNT', TencorInstanceName, TencorFileCount)
Mona_Services('SendMetric', 'EXPORT_TO_OI_FILE_AGE', TencorInstanceName, TencorOldestFileAgeMinute)
Mona_Services('PostAverageMetric', 'EXPORT_TO_OI_FILE_COUNT', TencorInstanceName, TencorFileCount)
Mona_Services('PostAverageMetric', 'EXPORT_TO_OI_FILE_AGE', TencorInstanceName, TencorOldestFileAgeMinute)
//HGCV
HGCVInstanceName = 'MET08RESIHGCV'
@ -100,8 +119,8 @@ MonitorMetrologyDirs:
end else
HGCVOldestFileAgeMinute = SRP_Datetime('MinuteSpan', HGCVOldestFileDTM, CurrDTM)
end
Mona_Services('SendMetric', 'EXPORT_TO_OI_FILE_COUNT', HGCVInstanceName, HGCVFileCount)
Mona_Services('SendMetric', 'EXPORT_TO_OI_FILE_AGE', HGCVInstanceName, HGCVOldestFileAgeMinute)
Mona_Services('PostAverageMetric', 'EXPORT_TO_OI_FILE_COUNT', HGCVInstanceName, HGCVFileCount)
Mona_Services('PostAverageMetric', 'EXPORT_TO_OI_FILE_AGE', HGCVInstanceName, HGCVOldestFileAgeMinute)
//CDE
CDEInstanceName = 'MET08RESIMAPCDE'
@ -113,8 +132,8 @@ MonitorMetrologyDirs:
end else
CDEOldestFileAgeMinute = SRP_Datetime('MinuteSpan', CDEOldestFileDTM, CurrDTM)
end
Mona_Services('SendMetric', 'EXPORT_TO_OI_FILE_COUNT', CDEInstanceName, CDEFileCount)
Mona_Services('SendMetric', 'EXPORT_TO_OI_FILE_AGE', CDEInstanceName, CDEOldestFileAgeMinute)
Mona_Services('PostAverageMetric', 'EXPORT_TO_OI_FILE_COUNT', CDEInstanceName, CDEFileCount)
Mona_Services('PostAverageMetric', 'EXPORT_TO_OI_FILE_AGE', CDEInstanceName, CDEOldestFileAgeMinute)
//BioRad
BioRadInstanceName = 'MET08THFTIRQS408M'
@ -126,8 +145,8 @@ MonitorMetrologyDirs:
end else
BioRadOldestFileAgeMinute = SRP_Datetime('MinuteSpan', BioRadOldestFileDTM, CurrDTM)
end
Mona_Services('SendMetric', 'EXPORT_TO_OI_FILE_COUNT', BioRadInstanceName, BioRadFileCount)
Mona_Services('SendMetric', 'EXPORT_TO_OI_FILE_AGE', BioRadInstanceName, BioRadOldestFileAgeMinute)
Mona_Services('PostAverageMetric', 'EXPORT_TO_OI_FILE_COUNT', BioRadInstanceName, BioRadFileCount)
Mona_Services('PostAverageMetric', 'EXPORT_TO_OI_FILE_AGE', BioRadInstanceName, BioRadOldestFileAgeMinute)
//Stratus
StratusInstanceName = 'MET08THFTIRSTRATUS'
@ -139,8 +158,8 @@ MonitorMetrologyDirs:
end else
StratusOldestFileAgeMinute = SRP_Datetime('MinuteSpan', StratusOldestFileDTM, CurrDTM)
end
Mona_Services('SendMetric', 'EXPORT_TO_OI_FILE_COUNT', StratusInstanceName, StratusFileCount)
Mona_Services('SendMetric', 'EXPORT_TO_OI_FILE_AGE', StratusInstanceName, StratusOldestFileAgeMinute)
Mona_Services('PostAverageMetric', 'EXPORT_TO_OI_FILE_COUNT', StratusInstanceName, StratusFileCount)
Mona_Services('PostAverageMetric', 'EXPORT_TO_OI_FILE_AGE', StratusInstanceName, StratusOldestFileAgeMinute)
//SP1
SP1InstanceName = 'MET08DDUPSP1TBI'
@ -152,8 +171,8 @@ MonitorMetrologyDirs:
end else
SP1OldestFileAgeMinute = SRP_Datetime('MinuteSpan', SP1OldestFileDTM, CurrDTM)
end
Mona_Services('SendMetric', 'EXPORT_TO_OI_FILE_COUNT', SP1InstanceName, SP1FileCount)
Mona_Services('SendMetric', 'EXPORT_TO_OI_FILE_AGE', SP1InstanceName, SP1OldestFileAgeMinute)
Mona_Services('PostAverageMetric', 'EXPORT_TO_OI_FILE_COUNT', SP1InstanceName, SP1FileCount)
Mona_Services('PostAverageMetric', 'EXPORT_TO_OI_FILE_AGE', SP1InstanceName, SP1OldestFileAgeMinute)
//SPV
SPVInstanceName = 'MET08RESISRP2100'
@ -165,8 +184,8 @@ MonitorMetrologyDirs:
end else
SPVOldestFileAgeMinute = SRP_Datetime('MinuteSpan', SPVOldestFileDTM, CurrDTM)
end
Mona_Services('SendMetric', 'EXPORT_TO_OI_FILE_COUNT', SPVInstanceName, SPVFileCount)
Mona_Services('SendMetric', 'EXPORT_TO_OI_FILE_AGE', SPVInstanceName, SPVOldestFileAgeMinute)
Mona_Services('PostAverageMetric', 'EXPORT_TO_OI_FILE_COUNT', SPVInstanceName, SPVFileCount)
Mona_Services('PostAverageMetric', 'EXPORT_TO_OI_FILE_AGE', SPVInstanceName, SPVOldestFileAgeMinute)
//SRP
SRPInstanceName = 'MET08ANLYSDIFAAST230'
@ -178,17 +197,17 @@ MonitorMetrologyDirs:
end else
SRPOldestFileAgeMinute = SRP_Datetime('MinuteSpan', SRPOldestFileDTM, CurrDTM)
end
Mona_Services('SendMetric', 'EXPORT_TO_OI_FILE_COUNT', SRPInstanceName, SRPFileCount)
Mona_Services('SendMetric', 'EXPORT_TO_OI_FILE_AGE', SRPInstanceName, SRPOldestFileAgeMinute)
Mona_Services('PostAverageMetric', 'EXPORT_TO_OI_FILE_COUNT', SRPInstanceName, SRPFileCount)
Mona_Services('PostAverageMetric', 'EXPORT_TO_OI_FILE_AGE', SRPInstanceName, SRPOldestFileAgeMinute)
return
ClearCursors:
For counter = 0 to 8
ClearSelect counter
Next counter
return

View File

@ -1,5 +1,5 @@
Compile subroutine MONA_SERVICES(@Service, @Params)
/***************************************************************
/***********************************************************************************************************************
This subroutine is used to send messages to MonA directly from
within OpenInsight. It utilizes a C# DotNet DLL MonAOIApi.dll
which contains two classes, one for sending status updates, and
@ -16,258 +16,569 @@ Parm2:
Parm3:
-For status updates this represents the state of the object you are sending(Ok, Warning, Critical)
-For Metric updates this represents the numeric data that you wish to send.
***************************************************************/
Declare Subroutine Errmsg, Error_Services, Delay, Mona_Services, Service_Services
Declare function Get_Status, SRP_Datetime, Environment_Services, Httpclient_Services
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
$Insert LOGICAL
$Insert APP_INSERTS
$Insert SERVICE_SETUP
$Insert REVDOTNETEQUATES
$Insert MONA_QUEUE_EQUATES
Equ MAX_REQUESTS$ to 2000
Equ COMMA$ to ','
Declare Subroutine Errmsg, Error_Services, Delay, Mona_Services, Service_Services, Database_Services, Logging_Services
Declare subroutine SRP_Json, obj_Notes
Declare function Get_Status, SRP_Datetime, Environment_Services, Httpclient_Services, Datetime, RTI_CreateGuid
Declare function Database_Services, Logging_Services, SRP_Json, Mona_Services
GoToService else
Error_Services('Add', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
end
return
return Response else ''
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Service Parameter Options
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Options MONITORS = 'SQL_BACKLOG', 'SQL_BACKLOG_WO_MAT', 'SQL_BACKLOG_WO_LOG'
Options STATES = 'OK', 'WARNING', 'CRITICAL'
Options REQUEST_TYPE = 'status', 'average', 'count', 'status/bulk', 'average/bulk', 'count/bulk'
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Services
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Service SendStatus(MonitorName=MONITORS, StatusName, CurrentState=STATES)
Mona_Services("PostStatus", MonitorName, StatusName, CurrentState)
end service
Service PostStatus(MonitorName, StatusName, CurrentState=STATES)
Service_Services('PostProcedure', 'MONA_SERVICES', 'SendBufferedStatus':@VM:MonitorName:@VM:StatusName:@VM:CurrentState)
MonaQId = RTI_CreateGuid()
MonaQRec = ''
MonaQRec<MONA_QUEUE.REQUEST_DTM$> = Datetime()
MonaQRec<MONA_QUEUE.MONITOR_NAME$> = MonitorName
MonaQRec<MONA_QUEUE.STATUS_NAME$> = StatusName
MonaQRec<MONA_QUEUE.STATUS_STATE$> = CurrentState
Database_Services('WriteDataRow', 'MONA_QUEUE', MonaQId, MonaQRec)
end service
Service SendMetric(MonitorName=MONITORS, MetricName, Number)
Mona_Services("PostAverageMetric", MonitorName, MetricName, Number)
end Service
Service PostAverageMetric(MonitorName, MetricName, Number)
Service_Services('PostProcedure', 'MONA_SERVICES', 'SendBufferedAverageMetric':@VM:MonitorName:@VM:MetricName:@VM:Number)
MonaQId = RTI_CreateGuid()
MonaQRec = ''
MonaQRec<MONA_QUEUE.REQUEST_DTM$> = Datetime()
MonaQRec<MONA_QUEUE.MONITOR_NAME$> = MonitorName
MonaQRec<MONA_QUEUE.METRIC_NAME$> = MetricName
MonaQRec<MONA_QUEUE.METRIC_NUMBER$> = Number
MonaQRec<MONA_QUEUE.METRIC_TYPE$> = 'AVERAGE'
Database_Services('WriteDataRow', 'MONA_QUEUE', MonaQId, MonaQRec)
end service
Service SendCountMetric(MonitorName=MONITORS, MetricName, Number)
Mona_Services("PostCountMetric", MonitorName, MetricName, Number)
end Service
Service PostCountMetric(MonitorName, MetricName, Number)
Service_Services('PostProcedure', 'MONA_SERVICES', 'SendBufferedCountMetric':@VM:MonitorName:@VM:MetricName:@VM:Number)
end service
Service SendBufferedStatus(MonaResource, StatusName, StatusValue)
If MonaResource EQ '' then
MonaResource = Environment_Services("GetMonaResource")
end
Prod = Environment_Services('IsProd')
If Not(Prod) then GoSub SwapResourceNames
DateTime = SRP_DateTime('Now')
Year = SRP_Datetime("Year", DateTime)
Month = SRP_Datetime("Month", DateTime)
If Len(Month) EQ 1 then
Month = '0':Month
end
Day = SRP_Datetime("Day", DateTime)
If Len(Day) EQ 1 then
Day = '0':Day
end
Hour = SRP_Datetime("Hour", DateTime)
If Len(Hour) EQ 1 then
Hour = '0':Hour
end
Minute = SRP_Datetime("Minute", DateTime)
If Len(Minute) EQ 1 then
Minute = '0':Minute
end
Second = SRP_Datetime("Second", DateTime)
If Len(Second) EQ 1 then
Second = '0':Second
end
RequestBodyJson = '{ "resource": "':MonaResource:'"'
RequestBodyJson = RequestBodyJson:', "dateTime": "':Year:'-':Month:'-':Day:'T':Hour:':':Minute:':':Second:'Z"'
RequestBodyJson = RequestBodyJson:', "statusName": "':StatusName:'"'
RequestBodyJson = RequestBodyJson:', "statusValue": "':StatusValue:'" }'
ApiUrl = Environment_Services("GetMonInBufferedWorkerApiUrl"):'/status'
retries = 3
backoffSeconds = 1
isSuccessful = False$
Loop
while (isSuccessful EQ False$ and retries GT 0)
waitSeconds = (3 - retries) * backoffSeconds
Delay(waitSeconds)
retries = retries - 1
response = Httpclient_Services('SendHTTPRequest', 'POST', ApiUrl, 'Content-Type':@VM:'application/json':@FM:'Accept':@VM:'*/*', RequestBodyJson, '', '', False$, False$, '')
If response EQ '"Request queued for processing"' then
isSuccessful = True$
end
Repeat
MonaQId = RTI_CreateGuid()
MonaQRec = ''
MonaQRec<MONA_QUEUE.REQUEST_DTM$> = Datetime()
MonaQRec<MONA_QUEUE.MONITOR_NAME$> = MonitorName
MonaQRec<MONA_QUEUE.METRIC_NAME$> = MetricName
MonaQRec<MONA_QUEUE.METRIC_NUMBER$> = Number
MonaQRec<MONA_QUEUE.METRIC_TYPE$> = 'COUNT'
Database_Services('WriteDataRow', 'MONA_QUEUE', MonaQId, MonaQRec)
end service
Service SendBufferedAverageMetric(MonaResource, MetricName, MetricValue)
If MonaResource EQ '' then
MonaResource = Environment_Services("GetMonaResource")
end
DateTime = SRP_DateTime('Now')
Year = SRP_Datetime("Year", DateTime)
Month = SRP_Datetime("Month", DateTime)
If Len(Month) EQ 1 then
Month = '0':Month
end
Day = SRP_Datetime("Day", DateTime)
If Len(Day) EQ 1 then
Day = '0':Day
end
Hour = SRP_Datetime("Hour", DateTime)
If Len(Hour) EQ 1 then
Hour = '0':Hour
end
Minute = SRP_Datetime("Minute", DateTime)
If Len(Minute) EQ 1 then
Minute = '0':Minute
end
Second = SRP_Datetime("Second", DateTime)
If Len(Second) EQ 1 then
Second = '0':Second
end
RequestBodyJson = '{ "resource": "':MonaResource:'"'
RequestBodyJson = RequestBodyJson:', "dateTime": "':Year:'-':Month:'-':Day:'T':Hour:':':Minute:':':Second:'Z"'
RequestBodyJson = RequestBodyJson:', "metricName": "':MetricName:'"'
RequestBodyJson = RequestBodyJson:', "metricValue": "':MetricValue:'" }'
ApiUrl = Environment_Services("GetMonInBufferedWorkerApiUrl"):'/average'
retries = 3
backoffSeconds = 1
isSuccessful = False$
Loop
while (isSuccessful EQ False$ and retries GT 0)
waitSeconds = (3 - retries) * backoffSeconds
Delay(waitSeconds)
retries = retries - 1
response = Httpclient_Services('SendHTTPRequest', 'POST', ApiUrl, 'Content-Type':@VM:'application/json':@FM:'Accept':@VM:'*/*', RequestBodyJson, '', '', False$, False$, '')
If response EQ '"Request queued for processing"' then
isSuccessful = True$
end
Repeat
end service
Service SendBufferedCountMetric(MonaResource, MetricName, MetricValue)
If MonaResource EQ '' then
MonaResource = Environment_Services("GetMonaResource")
end
DateTime = SRP_DateTime('Now')
Year = SRP_Datetime("Year", DateTime)
Month = SRP_Datetime("Month", DateTime)
If Len(Month) EQ 1 then
Month = '0':Month
end
Day = SRP_Datetime("Day", DateTime)
If Len(Day) EQ 1 then
Day = '0':Day
end
Hour = SRP_Datetime("Hour", DateTime)
If Len(Hour) EQ 1 then
Hour = '0':Hour
end
Minute = SRP_Datetime("Minute", DateTime)
If Len(Minute) EQ 1 then
Minute = '0':Minute
end
Second = SRP_Datetime("Second", DateTime)
If Len(Second) EQ 1 then
Second = '0':Second
end
RequestBodyJson = '{ "resource": "':MonaResource:'"'
RequestBodyJson = RequestBodyJson:', "dateTime": "':Year:'-':Month:'-':Day:'T':Hour:':':Minute:':':Second:'Z"'
RequestBodyJson = RequestBodyJson:', "metricName": "':MetricName:'"'
RequestBodyJson = RequestBodyJson:', "metricValue": "':MetricValue:'" }'
ApiUrl = Environment_Services("GetMonInBufferedWorkerApiUrl"):'/count'
retries = 3
backoffSeconds = 1
isSuccessful = False$
Loop
while (isSuccessful EQ False$ and retries GT 0)
waitSeconds = (3 - retries) * backoffSeconds
Delay(waitSeconds)
retries = retries - 1
response = Httpclient_Services('SendHTTPRequest', 'POST', ApiUrl, 'Content-Type':@VM:'application/json':@FM:'Accept':@VM:'*/*', RequestBodyJson, '', '', False$, False$, '')
If response EQ '"Request queued for processing"' then
isSuccessful = True$
end
Repeat
end service
Service QueueLatencyAndCountMetrics(MonaResource, MetricName, StartTick, EndTick)
Diff = EndTick - StartTick
Mona_Services('SendMetric', MonaResource, MetricName:'_LATENCY', Diff)
Mona_Services('SendCountMetric', MonaResource, MetricName:'_COUNT', 1)
Mona_Services('PostAverageMetric', MonaResource, MetricName:'_LATENCY', Diff)
Mona_Services('PostCountMetric', MonaResource, MetricName:'_COUNT', 1)
end service
SwapResourceNames:
// Swap out prod resource name with dev resource name
Service ProcessMonaQueue(NumRequests)
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
Lock hSysLists, ServiceKeyID then
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\MonA'
LogDate = Oconv(Date(), 'D4/')
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' MonA Queue Log.csv'
Headers = 'Logging DTM':@FM:'Log Data'
objMonaQueueLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, COMMA$, Headers, '', False$, False$)
LogData = ''
LogData<1> = OConv(Datetime(), 'DT/^S')
LogData<2> = 'Begin ProcessMonaQueue'
Logging_Services('AppendLog', objMonaQueueLog, LogData, @RM, @FM)
ErrorMsg = ''
If NumRequests NE '' then
If Num(NumRequests) then
NumRequests = Abs(Int(NumRequests))
If NumRequests GT MAX_REQUESTS$ then
LogData<1> = OConv(Datetime(), 'DT/^S')
LogData<2> = 'Requested NumRequests ':NumRequests:' is above predefined limit. Overriding NumRequests and setting to ':MAX_REQUESTS$:'.'
NumRequests = MAX_REQUESTS$
Logging_Services('AppendLog', objMonaQueueLog, LogData, @RM, @FM)
end
LogData<1> = OConv(Datetime(), 'DT/^S')
LogData<2> = 'Attempting to process up to ':NumRequests:' MONA_QUEUE requests.'
Logging_Services('AppendLog', objMonaQueueLog, LogData, @RM, @FM)
Open 'MONA_QUEUE' to hMonaQueue then
objMonaStatusJsonArray = ''
MonaStatusJson = ''
objMonaMetricAvgJsonArray = ''
MonaMetricAvgJson = ''
objMonaMetricCountJsonArray = ''
MonaMetricCountJson = ''
If SRP_Json(objMonaStatusJsonArray, 'New', 'Array') then
If SRP_Json(objMonaMetricAvgJsonArray, 'New', 'Array') then
If SRP_Json(objMonaMetricCountJsonArray, 'New', 'Array') then
DefaultMonitorName = Environment_Services("GetMonaResource")
EOF = False$
RequestCount = 0
InvalidRequests = ''
StatusRequests = ''
AverageRequests = ''
CountRequests = ''
GoSub ClearCursors
Select hMonaQueue
Loop
Readnext MonaQueueId else EOF = True$
Until (EOF or (RequestCount GE NumRequests) or (ErrorMsg NE '') )
RequestCount += 1
Read MonaQueueRec from hMonaQueue, MonaQueueId then
Begin Case
Case ( (MonaResource EQ 'GRP_OPENINSIGHT_MES_OP_FE_SAP_OUTBOUND') and (StatusName EQ 'SFTP-Interface-Outbound') )
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_SAP_OUTBOUND'
StatusName = 'SFTP-Interface-Outbound-Dev'
Case ( (MonaResource EQ 'GRP_OPENINSIGHT_MES_OP_FE_SAP_INBOUND') and (StatusName EQ 'SetSAPBatchQueue') )
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_SAP_INBOUND'
StatusName = 'SetSAPBatchQueue-Dev'
Case ( (MonaResource EQ 'GRP_OPENINSIGHT_MES_OP_FE_SAP_INBOUND') and (StatusName EQ 'SFTP-Interface-Inbound') )
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_SAP_INBOUND'
StatusName = 'SFTP-Interface-Inbound-Dev'
Case (MonaResource EQ 'GRP_OPENINSIGHT_MES_OP_FE_NICAINTEGRATIONSERVICE')
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_NICAINTEGRATIONSERVICE_DEV'
Case ( (MonaQueueRec<MONA_QUEUE.STATUS_NAME$> NE '') and (MonaQueueRec<MONA_QUEUE.STATUS_STATE$> NE '') )
// Add status object
objStatus = ''
StatusJson = Mona_Services('ConvertRecordToJson', MonaQueueId)
If Error_Services('NoError') then
If (SRP_Json(objStatus, 'Parse', StatusJson) EQ '') then
SRP_Json(objMonaStatusJsonArray, 'Add', objStatus)
SRP_Json(objStatus, 'Release')
StatusRequests<-1> = MonaQueueId
LogData<1> = OConv(Datetime(), 'DT/^S')
LogData<2> = 'Successfully added MONA_QUEUE ':MonaQueueId:' to objMonaStatusJsonArray.'
Logging_Services('AppendLog', objMonaQueueLog, LogData, @RM, @FM)
end else
ErrorMsg = 'Error in ':Service:' service. Error parsing StatusJson json.'
end
end else
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
end
Case ( (MonaQueueRec<MONA_QUEUE.METRIC_NAME$> NE '') and (MonaQueueRec<MONA_QUEUE.METRIC_NUMBER$> NE '') and (MonaQueueRec<MONA_QUEUE.METRIC_TYPE$> EQ 'AVERAGE') )
// Add average metric object
objAverage = ''
AverageJson = Mona_Services('ConvertRecordToJson', MonaQueueId)
If Error_Services('NoError') then
If (SRP_Json(objAverage, 'Parse', AverageJson) EQ '') then
SRP_Json(objMonaMetricAvgJsonArray, 'Add', objAverage)
SRP_Json(objAverage, 'Release')
AverageRequests<-1> = MonaQueueId
LogData<1> = OConv(Datetime(), 'DT/^S')
LogData<2> = 'Successfully added MONA_QUEUE ':MonaQueueId:' to objMonaMetricAvgJsonArray.'
Logging_Services('AppendLog', objMonaQueueLog, LogData, @RM, @FM)
end else
ErrorMsg = 'Error in ':Service:' service. Error parsing AverageJson json.'
end
end else
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
end
Case ( (MonaQueueRec<MONA_QUEUE.METRIC_NAME$> NE '') and (MonaQueueRec<MONA_QUEUE.METRIC_NUMBER$> NE '') and (MonaQueueRec<MONA_QUEUE.METRIC_TYPE$> EQ 'COUNT') )
// Add count metric object
objCount = ''
CountJson = Mona_Services('ConvertRecordToJson', MonaQueueId)
If Error_Services('NoError') then
If (SRP_Json(objCount, 'Parse', CountJson) EQ '') then
SRP_Json(objMonaMetricCountJsonArray, 'Add', objCount)
SRP_Json(objCount, 'Release')
CountRequests<-1> = MonaQueueId
LogData<1> = OConv(Datetime(), 'DT/^S')
LogData<2> = 'Successfully added MONA_QUEUE ':MonaQueueId:' to objMonaMetricCountJsonArray.'
Logging_Services('AppendLog', objMonaQueueLog, LogData, @RM, @FM)
end else
ErrorMsg = 'Error in ':Service:' service. Error parsing CountJson json.'
end
end else
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
end
Case Otherwise$
// Invalid request
InvalidRequests<-1> = MonaQueueId
LogData<1> = OConv(Datetime(), 'DT/^S')
LogData<2> = 'Encountered invalid MONA_QUEUE ':MonaQueueId:' request. Marking request for deletion.'
Logging_Services('AppendLog', objMonaQueueLog, LogData, @RM, @FM)
End Case
end else
ErrorMsg = 'Error in ':Service:' service. Error reading MONA_QUEUE ':MonaQueueId:'.'
LogData<1> = OConv(Datetime(), 'DT/^S')
LogData<2> = 'Error reading MONA_QUEUE ':MonaQueueId:' request.'
Logging_Services('AppendLog', objMonaQueueLog, LogData, @RM, @FM)
end
Repeat
GoSub ClearCursors
// Send requests and remove them from the queue
If ErrorMsg EQ '' then
StatusArraySize = SRP_Json(objMonaStatusJsonArray, "GetCount")
If StatusArraySize GT 0 then
// Send bulk status request
MonaStatusJson = SRP_Json(objMonaStatusJsonArray, 'Stringify', 'Fast')
LogData<1> = OConv(Datetime(), 'DT/^S')
LogData<2> = 'Attempting to send bulk status request to MonInBufferedWorker API.'
Logging_Services('AppendLog', objMonaQueueLog, LogData, @RM, @FM)
Mona_Services('SendMonaHttpRequest', 'status/bulk', MonaStatusJson)
If Error_Services('NoError') then
LogData<1> = OConv(Datetime(), 'DT/^S')
LogData<2> = 'Successfully sent bulk status request to MonInBufferedWorker API.'
Logging_Services('AppendLog', objMonaQueueLog, LogData, @RM, @FM)
// Delete status requests from queue
For each MonaStatusQueueId in StatusRequests using @FM
Delete hMonaQueue, MonaStatusQueueId then
LogData<1> = OConv(Datetime(), 'DT/^S')
LogData<2> = 'Successfully deleted MONA_QUEUE ':MonaStatusQueueId:' request.'
Logging_Services('AppendLog', objMonaQueueLog, LogData, @RM, @FM)
end else
LogData<1> = OConv(Datetime(), 'DT/^S')
LogData<2> = 'Error in ':Service:' service. Error deleting MONA_QUEUE ':MonaStatusQueueId:'.'
Logging_Services('AppendLog', objMonaQueueLog, LogData, @RM, @FM)
end
Next MonaStatusQueueId
end else
ErrorMsg = Error_Services('GetMessage')
LogData<1> = OConv(Datetime(), 'DT/^S')
LogData<2> = 'Failed to send bulk status request to MonInBufferedWorker API. Error message: ':ErrorMsg
Logging_Services('AppendLog', objMonaQueueLog, LogData, @RM, @FM)
end
end else
LogData<1> = OConv(Datetime(), 'DT/^S')
LogData<2> = 'No status requests to send to MonInBufferedWorker API.'
Logging_Services('AppendLog', objMonaQueueLog, LogData, @RM, @FM)
end
AverageArraySize = SRP_Json(objMonaMetricAvgJsonArray, "GetCount")
If AverageArraySize GT 0 then
// Send bulk average request
MonaMetricAvgJson = SRP_Json(objMonaMetricAvgJsonArray, 'Stringify', 'Fast')
LogData<1> = OConv(Datetime(), 'DT/^S')
LogData<2> = 'Attempting to send bulk average request to MonInBufferedWorker API.'
Logging_Services('AppendLog', objMonaQueueLog, LogData, @RM, @FM)
Mona_Services('SendMonaHttpRequest', 'average/bulk', MonaMetricAvgJson)
If Error_Services('NoError') then
LogData<1> = OConv(Datetime(), 'DT/^S')
LogData<2> = 'Successfully sent bulk average request to MonInBufferedWorker API.'
Logging_Services('AppendLog', objMonaQueueLog, LogData, @RM, @FM)
// Delete average requests from queue
For each MonaAverageQueueId in AverageRequests using @FM
Delete hMonaQueue, MonaAverageQueueId then
LogData<1> = OConv(Datetime(), 'DT/^S')
LogData<2> = 'Successfully deleted MONA_QUEUE ':MonaAverageQueueId:' request.'
Logging_Services('AppendLog', objMonaQueueLog, LogData, @RM, @FM)
end else
LogData<1> = OConv(Datetime(), 'DT/^S')
LogData<2> = 'Error in ':Service:' service. Error deleting MONA_QUEUE ':MonaAverageQueueId:'.'
Logging_Services('AppendLog', objMonaQueueLog, LogData, @RM, @FM)
end
Next MonaAverageQueueId
end else
ErrorMsg = Error_Services('GetMessage')
LogData<1> = OConv(Datetime(), 'DT/^S')
LogData<2> = 'Failed to send bulk average request to MonInBufferedWorker API. Error message: ':ErrorMsg
Logging_Services('AppendLog', objMonaQueueLog, LogData, @RM, @FM)
end
end else
LogData<1> = OConv(Datetime(), 'DT/^S')
LogData<2> = 'No average requests to send to MonInBufferedWorker API.'
Logging_Services('AppendLog', objMonaQueueLog, LogData, @RM, @FM)
end
CountArraySize = SRP_Json(objMonaMetricCountJsonArray, "GetCount")
If CountArraySize GT 0 then
// Send bulk count request
MonaMetricCountJson = SRP_Json(objMonaMetricCountJsonArray, 'Stringify', 'Fast')
LogData<1> = OConv(Datetime(), 'DT/^S')
LogData<2> = 'Attempting to send bulk count request to MonInBufferedWorker API.'
Logging_Services('AppendLog', objMonaQueueLog, LogData, @RM, @FM)
Mona_Services('SendMonaHttpRequest', 'count/bulk', MonaMetricCountJson)
If Error_Services('NoError') then
LogData<1> = OConv(Datetime(), 'DT/^S')
LogData<2> = 'Successfully sent bulk count request to MonInBufferedWorker API.'
Logging_Services('AppendLog', objMonaQueueLog, LogData, @RM, @FM)
// Delete count requests from queue
For each MonaCountQueueId in CountRequests using @FM
Delete hMonaQueue, MonaCountQueueId then
LogData<1> = OConv(Datetime(), 'DT/^S')
LogData<2> = 'Successfully deleted MONA_QUEUE ':MonaCountQueueId:' request.'
Logging_Services('AppendLog', objMonaQueueLog, LogData, @RM, @FM)
end else
LogData<1> = OConv(Datetime(), 'DT/^S')
LogData<2> = 'Error in ':Service:' service. Error deleting MONA_QUEUE ':MonaCountQueueId:'.'
Logging_Services('AppendLog', objMonaQueueLog, LogData, @RM, @FM)
end
Next MonaCountQueueId
end else
ErrorMsg = Error_Services('GetMessage')
LogData<1> = OConv(Datetime(), 'DT/^S')
LogData<2> = 'Failed to send bulk count request to MonInBufferedWorker API. Error message: ':ErrorMsg
Logging_Services('AppendLog', objMonaQueueLog, LogData, @RM, @FM)
end
end else
LogData<1> = OConv(Datetime(), 'DT/^S')
LogData<2> = 'No count requests to send to MonInBufferedWorker API.'
Logging_Services('AppendLog', objMonaQueueLog, LogData, @RM, @FM)
end
If InvalidRequests NE '' then
For each InvalidRequestQueueId in InvalidRequests using @FM
Delete hMonaQueue, InvalidRequestQueueId then
LogData<1> = OConv(Datetime(), 'DT/^S')
LogData<2> = 'Successfully deleted invalid MONA_QUEUE ':InvalidRequestQueueId:' request.'
Logging_Services('AppendLog', objMonaQueueLog, LogData, @RM, @FM)
end else
LogData<1> = OConv(Datetime(), 'DT/^S')
LogData<2> = 'Error in ':Service:' service. Error deleting invalid MONA_QUEUE ':InvalidRequestQueueId:' request.'
Logging_Services('AppendLog', objMonaQueueLog, LogData, @RM, @FM)
end
Next InvalidRequestQueueId
end
LogData = ''
LogData<1> = OConv(Datetime(), 'DT/^S')
LogData<2> = 'Successfully processed ':DCount(StatusRequests, @FM): ' status requests'
Logging_Services('AppendLog', objMonaQueueLog, LogData, @RM, @FM)
LogData = ''
LogData<1> = OConv(Datetime(), 'DT/^S')
LogData<2> = 'Successfully processed ':DCount(AverageRequests, @FM): ' average requests'
Logging_Services('AppendLog', objMonaQueueLog, LogData, @RM, @FM)
LogData = ''
LogData<1> = OConv(Datetime(), 'DT/^S')
LogData<2> = 'Successfully processed ':DCount(CountRequests, @FM): ' count requests'
Logging_Services('AppendLog', objMonaQueueLog, LogData, @RM, @FM)
end
end else
ErrorMsg = 'Error in ':Service:' service. Error initializing objMonaMetricCountJsonArray'
end
end else
ErrorMsg = 'Error in ':Service:' service. Error intializing objMonaMetricAvgJsonArray.'
end
end else
ErrorMsg = 'Error in ':Service:' service. Error initializing objMonaStatusJsonArray'
end
If (objMonaStatusJsonArray NE '') then SRP_Json(objMonaStatusJsonArray, 'Release')
If (objMonaMetricAvgJsonArray NE '') then SRP_Json(objMonaMetricAvgJsonArray, 'Release')
If (objMonaMetricCountJsonArray NE '') then SRP_Json(objMonaMetricCountJsonArray, 'Release')
end else
ErrorMsg = 'Error in ':Service:' service. Error opening MONA_QUEUE table.'
end
end else
ErrorMsg = 'Error in ':Service:' service. NumRequests ':NumRequests:' is not a number.'
end
end else
ErrorMsg = 'Error in ':Service:' service. Null NumRequests passed into service.'
end
If ErrorMsg NE '' then
// Notify OI_SYSADMIN group
Recipients = ''
SentFrom = 'SYSTEM'
Subject = Service:' Error'
Message = OConv(Datetime(), 'DT/^S')
Server = Environment_Services('GetServer')
Message<2> = 'Error on server ':Server
Message<3> = 'Error message: ':ErrorMsg
AttachWindow = ''
AttachKey = ''
SendToGroup = 'OI_SYSADMIN'
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
obj_Notes('Create',Parms)
Error_Services('Add', ErrorMsg)
end
LogData = ''
LogData<1> = OConv(Datetime(), 'DT/^S')
LogData<2> = 'End ProcessMonaQueue'
Logging_Services('AppendLog', objMonaQueueLog, LogData, @RM, @FM)
Unlock hSysLists, ServiceKeyID else Null
end
end service
Service GetMonaDatetimeFormat(InternalDtm)
ErrorMsg = ''
MonaDtm = ''
If (InternalDtm NE '') then
If Num(InternalDtm) then
Year = SRP_Datetime("Year", InternalDtm)
Month = Fmt(SRP_Datetime("Month", InternalDtm), 'R(0)#2')
Day = Fmt(SRP_Datetime("Day", InternalDtm), 'R(0)#2')
Hour = Fmt(SRP_Datetime("Hour", InternalDtm), 'R(0)#2')
Minute = Fmt(SRP_Datetime("Minute", InternalDtm), 'R(0)#2')
Second = Fmt(SRP_Datetime("Second", InternalDtm), 'R(0)#2')
MonaDtm = Year:'-':Month:'-':Day:'T':Hour:':':Minute:':':Second:'Z'
end else
ErrorMsg = 'Error in ':Service:' service. InternalDtm is not a number.'
end
end else
ErrorMsg = 'Error in ':Service:' service. Null InternalDtm passed into service.'
end
If ErrorMsg EQ '' then
Response = MonaDtm
end else
Error_Services('Add', ErrorMsg)
end
end service
Service SendMonaHttpRequest(RequestType=REQUEST_TYPES, RequestBodyJson)
ErrorMsg = ''
If RequestType NE '' then
If RequestBodyJson NE '' then
ApiUrl = Environment_Services("GetMonInBufferedWorkerApiUrl"):'/':RequestType
Retries = 3
BackoffSeconds = 1
IsSuccessful = False$
Loop
While (IsSuccessful EQ False$ and Retries GT 0)
WaitSeconds = (3 - Retries) * BackoffSeconds
Delay(WaitSeconds)
Retries = Retries - 1
Response = Httpclient_Services('SendHTTPRequest', 'POST', ApiUrl, 'Content-Type':@VM:'application/json':@FM:'Accept':@VM:'*/*', RequestBodyJson, '', '', False$, False$, '')
If ( (Response EQ '"Request queued for processing"') or (Response EQ '"Requests queued for processing"' ) ) then IsSuccessful = True$
Repeat
If (IsSuccessful EQ False$) then ErrorMsg = 'Error in ':Service:' service. Error sending HTTP request.'
end else
ErrorMsg = 'Error in ':Service:' service. Null RequestBodyJson passed into service'
end
end else
ErrorMsg = 'Error in ':Service:' service. Null RequestType passed into service'
end
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
end service
Service ConvertRecordToJson(MonaQueueId)
ErrorMsg = ''
MonaQueueJson = ''
If MonaQueueId NE '' then
If RowExists('MONA_QUEUE', MonaQueueId) then
MonaQueueRec = Database_Services('ReadDataRow', 'MONA_QUEUE', MonaQueueId)
If Error_Services('NoError') then
Begin Case
Case ( (MonaQueueRec<MONA_QUEUE.STATUS_NAME$> NE '') and (MonaQueueRec<MONA_QUEUE.STATUS_STATE$> NE '') )
objStatus = ''
If SRP_Json(objStatus, 'New', 'Object') then
RequestDtm = MonaQueueRec<MONA_QUEUE.REQUEST_DTM$>
RequestDtmMonaFmt = Mona_Services('GetMonaDatetimeFormat', RequestDtm)
If Error_Services('NoError') then
If MonaQueueRec<MONA_QUEUE.MONITOR_NAME$> NE '' then
MonitorName = MonaQueueRec<MONA_QUEUE.MONITOR_NAME$>
end else
MonitorName = DefaultMonitorName
end
StatusName = MonaQueueRec<MONA_QUEUE.STATUS_NAME$>
StatusState = MonaQueueRec<MONA_QUEUE.STATUS_STATE$>
SRP_Json(objStatus, 'SetValue', 'resource', MonitorName)
SRP_Json(objStatus, 'SetValue', 'dateTime', RequestDtmMonaFmt)
SRP_Json(objStatus, 'SetValue', 'statusName', StatusName)
SRP_Json(objStatus, 'SetValue', 'statusValue', StatusState)
MonaQueueJson = SRP_Json(objStatus, 'Stringify', 'Fast')
end else
ErrorMsg = Error_Services('GetMessage')
end
SRP_Json(objStatus, 'Release')
end
Case ( (MonaQueueRec<MONA_QUEUE.METRIC_NAME$> NE '') and (MonaQueueRec<MONA_QUEUE.METRIC_NUMBER$> NE '') and (MonaQueueRec<MONA_QUEUE.METRIC_TYPE$> EQ 'AVERAGE') )
objAverage = ''
If SRP_Json(objAverage, 'New', 'Object') then
RequestDtm = MonaQueueRec<MONA_QUEUE.REQUEST_DTM$>
RequestDtmMonaFmt = Mona_Services('GetMonaDatetimeFormat', RequestDtm)
If Error_Services('NoError') then
If MonaQueueRec<MONA_QUEUE.MONITOR_NAME$> NE '' then
MonitorName = MonaQueueRec<MONA_QUEUE.MONITOR_NAME$>
end else
MonitorName = DefaultMonitorName
end
MetricName = MonaQueueRec<MONA_QUEUE.METRIC_NAME$>
MetricValue = MonaQueueRec<MONA_QUEUE.METRIC_NUMBER$>
SRP_Json(objAverage, 'SetValue', 'resource', MonitorName)
SRP_Json(objAverage, 'SetValue', 'dateTime', RequestDtmMonaFmt)
SRP_Json(objAverage, 'SetValue', 'metricName', MetricName)
SRP_Json(objAverage, 'SetValue', 'metricValue', MetricValue)
MonaQueueJson = SRP_Json(objAverage, 'Stringify', 'Fast')
end else
ErrorMsg = Error_Services('GetMessage')
end
SRP_Json(objAverage, 'Release')
end
Case ( (MonaQueueRec<MONA_QUEUE.METRIC_NAME$> NE '') and (MonaQueueRec<MONA_QUEUE.METRIC_NUMBER$> NE '') and (MonaQueueRec<MONA_QUEUE.METRIC_TYPE$> EQ 'COUNT') )
objCount = ''
If SRP_Json(objCount, 'New', 'Object') then
RequestDtm = MonaQueueRec<MONA_QUEUE.REQUEST_DTM$>
RequestDtmMonaFmt = Mona_Services('GetMonaDatetimeFormat', RequestDtm)
If Error_Services('NoError') then
If MonaQueueRec<MONA_QUEUE.MONITOR_NAME$> NE '' then
MonitorName = MonaQueueRec<MONA_QUEUE.MONITOR_NAME$>
end else
MonitorName = DefaultMonitorName
end
MetricName = MonaQueueRec<MONA_QUEUE.METRIC_NAME$>
MetricValue = MonaQueueRec<MONA_QUEUE.METRIC_NUMBER$>
SRP_Json(objCount, 'SetValue', 'resource', MonitorName)
SRP_Json(objCount, 'SetValue', 'dateTime', RequestDtmMonaFmt)
SRP_Json(objCount, 'SetValue', 'metricName', MetricName)
SRP_Json(objCount, 'SetValue', 'metricValue', MetricValue)
MonaQueueJson = SRP_Json(objCount, 'Stringify', 'Fast')
end else
ErrorMsg = Error_Services('GetMessage')
end
SRP_Json(objCount, 'Release')
end
Case Otherwise$
ErrorMsg = 'Error in ':Service:' service. MONA_QUEUE ':MonaQueueId:' is not a valid request.'
End Case
end else
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
end
end else
ErrorMsg = 'Error in ':Service:' service. MONA_QUEUE ':MonaQueueId:' does not exist.'
end
end else
ErrorMsg = 'Error in ':Service:' service. Null MonaQueueId passed into service.'
end
If ErrorMsg EQ '' then
Response = MonaQueueJson
end else
Error_Services('Add', ErrorMsg)
end
end service
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ClearCursors:
For counter = 0 to 8
ClearSelect counter
Next counter
return

View File

@ -58,6 +58,7 @@ $insert WM_OUT_EQUATES
$insert WM_IN_EQUATES
$insert WO_MAT_EQUATES
$insert NCR_EQUATES
$insert IFX_EQUATES
EQU CRLF$ TO \0D0A\
EQU Comma$ TO ','
@ -77,7 +78,7 @@ Declare function Database_Services, obj_NCR, obj_SAP, Environment_Services, L
Declare function obj_WO_Mat, obj_RDS, Error_Services, MemberOf, SRP_Array
Declare subroutine Error_Services, Database_Services, obj_NCR, obj_SAP, Material_Services, Work_Order_Services
Declare subroutine Logging_Services, Set_Status, obj_WO_Mat, obj_WO_Mat_Log, Schedule_Services, obj_Tables
Declare subroutine obj_RDS, SAP_Services, Pass_To_SQL, NCR_Services
Declare subroutine obj_RDS, SAP_Services, Pass_To_SQL, NCR_Services, Service_Services
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\NCR'
LogDate = Oconv(Date(), 'D4/')
@ -261,15 +262,22 @@ return
WRITE_RECORD:
// NCR quantity may have changed, so update RDS data in SCRAPE.
NCRNo = @ID
NewQty = Sum(obj_NCR('RejQty',NCRNo:@RM:Record))
OrgQty = Sum(obj_NCR('RejQty',NCRNo:@RM:OrigRecord))
WorkOrderNo = {WO_NO}
// NCR quantity may have changed, so update RDS data in SCRAPE DB as well as the total scrap qty in the work order.
RDSNos = {RDS_ID}
For each RDSNo in RDSNos using @VM setting vPos
Pass_To_SQL('WRITE', 'RDS', RDSNo)
Next RDSNo
If (OrgQty NE NewQty) then
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'UpdateScrappedQty':SD$:WorkOrderNo)
end
// On the write of the record, read then write associated WM_IN and WM_OUT records to trigger the WM_MFS.
// This will update their current status within the associated WO_MAT record.
WorkOrderNo = {WO_NO}
ReactorType = XLATE('WO_LOG', WorkOrderNo, 'REACT_TYPE', 'X')
ReactorType = Field(ReactorType, @VM, 1)
CassNo = {WO_MAT_CASS_NO}
@ -302,14 +310,10 @@ WRITE_RECORD:
CassStatus = Xlate('RDS', RDSNo, 'CURR_STATUS', 'X')
END
// add SAP transaction
NCRNo = @ID
NewQty = Sum(obj_NCR('RejQty',NCRNo:@RM:Record))
// Add SAP transaction
IF OrigRecord = '' THEN
TransQty = NewQty
END ELSE
OrgQty = Sum(obj_NCR('RejQty',NCRNo:@RM:OrigRecord))
TransQty = NewQty - OrgQty
END
IF TransQty NE 0 THEN
@ -662,7 +666,6 @@ WRITE_RECORD:
end
end
end
return
DELETE_RECORD_PRE:
@ -743,6 +746,8 @@ DELETE_RECORD:
Pass_To_SQL('WRITE', 'RDS', RDSNo)
Next RDSNo
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'UpdateScrappedQty':SD$:WorkOrderNo)
return

View File

@ -3,7 +3,7 @@ Compile function NDW_ADJUST_LOT_QTY_EVENTS(CtrlEntId, Event, @PARAMS)
#window NDW_ADJUST_LOT_QTY
Declare function MemberOf, Database_Services, Error_Services, Datetime
Declare subroutine PlaceDialog, Database_Services, Lot_Services, Lot_Event_Services
Declare subroutine PlaceDialog, Database_Services, Lot_Services, Lot_Event_Services, Test_Run_Services
$Insert App_Inserts
$Insert Lot_Equates
@ -107,12 +107,14 @@ Event PUB_SEARCH_LOT.CLICK()
end event
Event PUB_SUBMIT.CLICK()
LotId = Get_Property(@Window : '.EDL_LOT_NO', 'TEXT')
NewWfrQty = Get_Property(@Window : '.EDL_NEW_LOT_WFR_QTY', 'TEXT')
LotType = Database_Services('ReadDataColumn', 'LOT', LotId, LOT_TYPE$, True$, 0, False$)
CurrWfrQty = Database_Services('ReadDataColumn', 'LOT', LotId, LOT_WAFER_QTY$, True$, 0, False$)
AmountToDecrease = 0
AmountToIncrease = 0
If RowExists('LOT', LotId) then
If NewWfrQty NE '' then
if Num(NewWfrQty) then
@ -125,7 +127,8 @@ Event PUB_SUBMIT.CLICK()
Begin Case
Case NewWfrQty LT CurrWfrQty
AmountToDecrease = CurrWfrQty - NewWfrQty
Lot_Services('ReduceLotWaferCount', LotId, AmountToDecrease, @User4)
PSNNo = Xlate('RDS', LotID, 'PROD_SPEC_ID', 'X')
Test_Run_Services('CreateTestRunRecord', 13, '', '', PSNNo, '', @User4, LotID, AmountToDecrease, True$)
If Error_Services('NoError') then
Lot_Event_Services('CreateLotEvent', LotId, Datetime(), 'COMMENT', 'Manual Lot Qty decrease performed.', '', @User4, '' , '')
end
@ -137,10 +140,14 @@ Event PUB_SUBMIT.CLICK()
end
End Case
If Error_Services('NoError') then
Set_Property(@Window : '.EDL_CURR_WFR_QTY', 'TEXT', '')
Set_Property(@Window : '.EDL_NEW_LOT_WFR_QTY', 'TEXT', '')
Set_Property(@Window : '.EDL_LOT_NO', 'TEXT', '')
Set_Property(@Window : '.PUB_SUBMIT', 'ENABLED', False$)
msg(@Window, 'Wafer quantity adjusted successfully!')
Result = ''
Result<1> = True$
End_Dialog(@Window, Result)
* End_Dialog(@Window, Result)
end else
ErrorMessage = Error_Services('GetMessage')
msg(@Window, 'Error Adjusting wafer quantity, ' : ErrorMessage)
@ -156,6 +163,7 @@ Event PUB_SUBMIT.CLICK()
end else
msg(@Window, 'Lot # ' : LotId : ' not found!')
end
end event
Event PUB_CANCEL.CLICK()
@ -182,4 +190,3 @@ return

View File

@ -48,8 +48,6 @@ Declare subroutine Obj_Wo_Mat_Log, Errmsg, Utility, SRP_Show_Window, Material_Mo
Declare function Get_Property, Send_Message, SendMessage, Material_Movement_Services, Error_Services,
Declare function Popup, obj_WO_Mat, Database_Services, Utility, Rds_Services, Message_Box
*Subclass = @Window : '.OLE_SUBCLASS'
// 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
@ -69,7 +67,6 @@ end
Return EventFlow or 1
*global
ScanField = ''
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -78,27 +75,18 @@ ScanField = ''
Event WINDOW.CREATE(CreateParam)
* CurrVer = Xlate('APP_INFO', 'LSL2_VERSION', '', 'X')
* UserVer = Xlate('LSL_USERS', @User4, 'LSL2_VERSION', 'X')
* If UserVer NE CurrVer then
* // Error message and close form
* ErrMsg = 'OpenInsight Version Error':@FM:'You are running an outdated version of OpenInsight and cannot release material until you restart your session.'
* Msg(@Window, '', 'OK', '', ErrMsg)
* Post_Event(@Window, 'CLOSE')
* end else
GoSub SetupOLEControls
GoSub ResetForm
SRP_Show_Window(@Window, '', 'C', 'C', 1, '', False$, False$, FormSize)
MsgStruct = ''
MsgStruct<MTEXTWIDTH$> = MSG_WIDTH$
* end
end event
Event OLE_BTN_CLEAR.OnClick(Point, Button, Shift, Ctrl)
*get count of unprocessed records
*get count of unprocessed records
allCompleted = True$
resp = ''
Data = Get_Property(EditTable$, "OLE.ARRAY")
@ -120,10 +108,12 @@ Event OLE_BTN_CLEAR.OnClick(Point, Button, Shift, Ctrl)
GoSub ResetForm
end
end
end event
Event OLE_BTN_SAVE.OnClick(Point, Button, Shift, Ctrl)
*check for unfinished scan
F1 = Get_Property(Cassette1$, 'TEXT')
F2 = Get_Property(Cassette2$, 'TEXT')
@ -137,17 +127,22 @@ Event OLE_BTN_SAVE.OnClick(Point, Button, Shift, Ctrl)
Location = 'PTI'
Gosub SaveRecords
end
end event
Event EDL_CASSETTE1_SCAN.LOSTFOCUS(Flag, FocusID)
ScanField = 'Cassette1'
If Flag EQ 1 then
ScanData = Get_Property(CtrlEntID, 'TEXT')
If ScanData NE '' then
ScanData = Material_Movement_Services('ProcessFQAScanData', ScanData, 'CASSETTE1')
If Error_Services('NoError') then
Set_Property(CtrlEntID, 'TEXT', ScanData)
RDSNo = ScanData<1>
SeqNo = ScanData<2>
Set_Property(Cassette1$, '@SEQNO', SeqNo)
Set_Property(CtrlEntID, 'TEXT', RDSNo)
Set_Property(Cassette2$, 'ENABLED', True$)
Set_Property(Cassette2$, 'FOCUS', True$)
Set_Property(CtrlEntID, 'ENABLED', False$)
@ -159,23 +154,25 @@ Event EDL_CASSETTE1_SCAN.LOSTFOCUS(Flag, FocusID)
end
end
end
end event
Event EDL_CASSETTE2_SCAN.LOSTFOCUS(Flag, FocusID)
ScanField = 'Cassette2'
If Flag EQ 1 then
ScanData = Get_Property(CtrlEntID, 'TEXT')
Cass1 = Get_Property(Cassette1$, 'TEXT')
Seq1No = Get_Property(Cassette1$, '@SEQNO')
retVal = Set_Property(@window, '@IsEpp', False$)
If ScanData[1,1] = 'O' OR ScanData[1,3] = '1TO' then
If Index(ScanData, '.', 1) then
retVal = Set_Property(@window, '@IsEpp', True$)
end
If ScanData NE '' then
ScanData = Material_Movement_Services('ProcessFQAScanData', ScanData, 'CASSETTE2', Cass1)
ScanData = Material_Movement_Services('ProcessFQAScanData', ScanData, 'CASSETTE2', Cass1, Seq1No)
If Error_Services('NoError') then
* IF EPP, prepopulate lot and just validate
If Get_Property(@window, '@IsEpp') EQ True$ then
Set_Property(CtrlEntID, 'TEXT', ScanData)
Set_Property(Supplier$, 'TEXT', 'EpiPRO')
@ -198,10 +195,12 @@ Event EDL_CASSETTE2_SCAN.LOSTFOCUS(Flag, FocusID)
end
end
end
end event
Event EDL_SUPPLIER_SCAN.LOSTFOCUS(Flag, FocusID)
ScanField = 'Lot'
If Flag EQ 1 then
Cassette1 = Get_Property(Cassette1$, 'TEXT')
@ -219,6 +218,7 @@ Event EDL_SUPPLIER_SCAN.LOSTFOCUS(Flag, FocusID)
end
end
end
end event
@ -227,6 +227,7 @@ end event
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
SaveRecords:
*iterate thround all records in the grid, saving them and updating the status and location
Data = Get_Property(EditTable$, "OLE.ARRAY")
cnt = count(Data<1>, @VM) + (Data<1># '')
@ -274,6 +275,7 @@ return
ValidateGrid:
F1 = Get_Property(Cassette1$, 'TEXT')
F2 = Get_Property(Cassette2$, 'TEXT')
F3 = Get_Property(Supplier$, 'TEXT')
@ -285,11 +287,6 @@ ValidateGrid:
result = 1
end
end
* if ScanField = 'Lot' then ; * do not look for duplicates
* result = 0
* end else
* result = InList(Data, ScanData, @VM) OR InList(Data, ScanData, @FM)
* end
If INDEX(F1,'.',2) then
RDSType = 'EPP'
@ -346,12 +343,14 @@ return
DisableFormControls:
Set_Property(@Window:'.EDL_CASSETTE1_SCAN', 'TEXT', '')
Set_Property(@Window:'.EDL_CASSETTE2_SCAN', 'TEXT', '')
Set_Property(@Window:'.EDL_SUPPLIER_SCAN', 'TEXT', '')
Set_Property(@Window:'.EDL_CASSETTE1_SCAN', 'ENABLED', False$)
Set_Property(@Window:'.EDL_CASSETTE2_SCAN', 'ENABLED', False$)
Set_Property(@Window:'.EDL_SUPPLIER_SCAN', 'ENABLED', False$)
return
@ -396,6 +395,8 @@ SetupOLEControls:
SelStyleArray = 'Black' : @VM : OI_HOT_BLUE$ : ' L=70' : @FM : 'Black' : @VM : OI_HOT_BLUE$
Set_Property(EditTable$, 'OLE.SelectionStyle', SelStyleArray) ; // Automatically highlight the current row with one color and highlight the current row with another color.
Set_Property(@Window:'.OLE_BTN_CLEAR', 'OLE.Style', 'STD')
return
@ -414,5 +415,7 @@ ResetForm:
cnt = count(Data<1>, @VM) + (Data<1># '')
Set_Property(@Window:'.OLE_BTN_SAVE', 'ENABLED', cnt GE 1)
Set_Property(EditTable$, 'OLE.CellColors[ALL;All]', 'Auto':@FM:'Auto')
Set_Property(Cassette1$, '@SEQNO', '')
return

View File

@ -29,7 +29,6 @@ Function NDW_Makeup_Wafers_Events(CtrlEntId, Event, @PARAMS)
04/13/18 dmb Created initial commuter module.
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
#Window NDW_MAKEUP_WAFERS
@ -50,11 +49,11 @@ If Event EQ 'OLE' then
Transfer Param1 to Event
Transfer Param2 to Param1
Transfer Param3 to Param2
* Transfer Param4 to Param3
* Transfer Param5 to Param4
* Transfer Param6 to Param5
* Transfer Param7 to Param6
* Transfer Param8 to Param7
Transfer Param4 to Param3
Transfer Param5 to Param4
Transfer Param6 to Param5
Transfer Param7 to Param6
Transfer Param8 to Param7
end
GoToEvent Event for CtrlEntID
@ -445,6 +444,3 @@ Setup_OLE_Controls:
return

View File

@ -300,3 +300,5 @@ SetDelay:
return

View File

@ -48,8 +48,6 @@ Declare subroutine Obj_Wo_Mat_Log, Errmsg, Utility, SRP_Show_Window, Material_Mo
Declare function Get_Property, Send_Message, SendMessage, Material_Movement_Services, Error_Services,
Declare function Popup, obj_WO_Mat, Database_Services, Utility, Rds_Services, Message_Box
*Subclass = @Window : '.OLE_SUBCLASS'
// 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
@ -69,7 +67,6 @@ end
Return EventFlow or 1
*global
ScanField = ''
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -151,7 +148,10 @@ Event EDL_CASSETTE1_SCAN.LOSTFOCUS(Flag, FocusID)
If ScanData NE '' then
ScanData = Material_Movement_Services('ProcessPTIScanData', ScanData, 'CASSETTE1')
If Error_Services('NoError') then
Set_Property(CtrlEntID, 'TEXT', ScanData)
RDSNo = ScanData<1>
SeqNo = ScanData<2>
Set_Property(Cassette1$, '@SEQNO', SeqNo)
Set_Property(CtrlEntID, 'TEXT', RDSNo)
Set_Property(Cassette2$, 'ENABLED', True$)
Set_Property(Cassette2$, 'FOCUS', True$)
Set_Property(CtrlEntID, 'ENABLED', False$)
@ -174,8 +174,9 @@ Event EDL_CASSETTE2_SCAN.LOSTFOCUS(Flag, FocusID)
If Flag EQ 1 then
ScanData = Get_Property(CtrlEntID, 'TEXT')
Cass1 = Get_Property(Cassette1$, 'TEXT')
Seq1No = Get_Property(Cassette1$, '@SEQNO')
If ScanData NE '' then
ScanData = Material_Movement_Services('ProcessPTIScanData', ScanData, 'CASSETTE2', Cass1)
ScanData = Material_Movement_Services('ProcessPTIScanData', ScanData, 'CASSETTE2', Cass1, Seq1No)
If Error_Services('NoError') then
Set_Property(CtrlEntID, 'TEXT', ScanData)
Gosub ValidateGrid
@ -379,6 +380,9 @@ SetupOLEControls:
SelStyleArray = 'Black' : @VM : OI_HOT_BLUE$ : ' L=70' : @FM : 'Black' : @VM : OI_HOT_BLUE$
Set_Property(EditTable$, 'OLE.SelectionStyle', SelStyleArray) ; // Automatically highlight the current row with one color and highlight the current row with another color.
Set_Property(@Window:'.OLE_BTN_CLEAR', 'OLE.Style', 'STD')
Set_Property(@Window:'.OLE_BTN_SAVE', 'OLE.Style', 'STD')
return

View File

@ -167,7 +167,9 @@ end event
Event PUB_ENG_OPTIONS.CLICK()
SelOpt = Popup(@Window, '', 'ENG_OPTIONS')
PopupRec = Xlate('SYSREPOSPOPUPS', 'LSL2**ENG_OPTIONS', '', 'X')
PopupRec<3> = 1
SelOpt = Popup(@Window, PopupRec)
If SelOpt NE '' then
@ -187,22 +189,40 @@ Event PUB_ENG_OPTIONS.CLICK()
Begin Case
Case SelOpt EQ 'CLEAN_INSP'
Caption = "Updating Clean & Insp specs for selected RDS cassettes..."
ServiceModules = 'CLEAN_INSP_SERVICES'
Services = 'UpdateAllCleanInsp'
Case SelOpt EQ 'QA_MET'
Caption = "Updating QA Metrology specs for selected RDS cassettes..."
ServiceModules = 'WO_MAT_QA_SERVICES'
Services = 'UpdateQAMet'
Case SelOpt EQ 'UPDATE_RDS_LAYER'
Caption = "Updating RDS Layer specs for selected RDS cassettes..."
ServiceModules = 'RDS_LAYER_SERVICES'
Services = 'UpdateRDSLayerSpecs'
Case SelOpt EQ 'CLEAN_INSP':@VM:'QA_MET'
Caption = "Updating Clean & Insp and QA Metrology specs for selected RDS cassettes..."
ServiceModules = 'CLEAN_INSP_SERVICES':@VM:'WO_MAT_QA_SERVICES'
Services = 'UpdateAllCleanInsp':@VM:'UpdateQAMet'
Case SelOpt EQ 'QA_MET':@VM:'UPDATE_RDS_LAYER'
Caption = "Updating RDS Layer and QA Metrology specs for selected RDS cassettes..."
ServiceModules = 'WO_MAT_QA_SERVICES':@VM:'RDS_LAYER_SERVICES'
Services = 'UpdateQAMet':@VM:'UpdateRDSLayerSpecs'
Case SelOpt EQ 'CLEAN_INSP':@VM: 'UPDATE_RDS_LAYER'
Caption = "Updating RDS Layer and Clean & Insp specs for selected RDS cassettes..."
ServiceModules = 'CLEAN_INSP_SERVICES':@VM:'RDS_LAYER_SERVICES'
Services = 'UpdateAllCleanInsp':@VM:'UpdateRDSLayerSpecs'
Case SelOpt EQ 'CLEAN_INSP':@VM:'QA_MET':@VM: 'UPDATE_RDS_LAYER'
Caption = "Updating Clean & Insp, QA Metrology, and RDS Layer specs for selected RDS cassettes..."
ServiceModules = 'CLEAN_INSP_SERVICES':@VM:'WO_MAT_QA_SERVICES' :@VM: 'RDS_LAYER_SERVICES'
Services = 'UpdateAllCleanInsp':@VM:'UpdateQAMet' :@VM: 'UpdateRDSLayerSpecs'
End Case
If ServiceModules NE '' then
@ -216,7 +236,12 @@ Event PUB_ENG_OPTIONS.CLICK()
Running = Msg(@WINDOW, MsgUp, vPos, MSGINSTUPDATE$) ;* Update gas guage
For each ServiceModule in ServiceModules using @VM setting sPos
Service = Services<0, sPos>
If Service = 'UpdateRDSLayerSpecs' then
RDSKey = SelRDSList<4, vPos>
Ans = Function(@ServiceModule(Service, RDSKey))
end else
Ans = Function(@ServiceModule(Service, WOMatKey))
end
If Error_Services('HasError') then
Error_Services('DisplayError')
end
@ -652,3 +677,6 @@ CheckSelectedForHolds:
return

Some files were not shown because too many files have changed in this diff Show More