Compare commits
137 Commits
06-16-a
...
722bc63bdb
Author | SHA1 | Date | |
---|---|---|---|
722bc63bdb | |||
1f2777cd18 | |||
10bf8bf878 | |||
1a572a31b2 | |||
098f740585 | |||
89bb3e479b | |||
60522d74c1 | |||
3561b41a7b | |||
a636198128 | |||
adc247fd4c | |||
a094971d7d | |||
47b54f6a16 | |||
804258a167 | |||
6d552ab824 | |||
2fbf41d528 | |||
ba2faa8c9f | |||
0a2d53d173 | |||
844de71599 | |||
494988d394 | |||
e1c7544fac | |||
6d5c9c0ab7 | |||
a8dff61cfa | |||
09d2d13e63 | |||
14331fcf49 | |||
667831a003 | |||
82b74f0b96 | |||
f4f63c28e3 | |||
1f2b73797b | |||
54eaf15598 | |||
fffadaa1c3 | |||
a6da80dc3c | |||
3125225639 | |||
f54331eb0e | |||
847483f603 | |||
88281fff05 | |||
8499d03ef8 | |||
3186ec1ad6 | |||
898f21b73d | |||
f7ee12a78d | |||
475df5ba54 | |||
28a8a10ba2 | |||
6934799e92 | |||
03f42dedea | |||
033e3baee8 | |||
4bfae8e7b7 | |||
0f0c735023 | |||
4eee1b0f0a | |||
e2e8731316 | |||
a21f41fd29 | |||
2bbc5c065d | |||
9e54865e1e | |||
c7f1f86249 | |||
c89bb6b3d4 | |||
71daf317f0 | |||
a48f47ddc9 | |||
6396264e64 | |||
8f233705a2 | |||
b159e1aa27 | |||
de2e6af5f7 | |||
84da66ccd5 | |||
49e77a769f | |||
490bfe21d4 | |||
2aaed8944e | |||
ef104f889c | |||
ea156489f1 | |||
e1a44a7687 | |||
c890a25d46 | |||
836b8c47a9 | |||
aabd4c3a91 | |||
b607432be4 | |||
3debdce91e | |||
4689b861d7 | |||
350116fddc | |||
59aed72156 | |||
e97162dc1e | |||
2a6c0afddf | |||
b53e805929 | |||
804b590773 | |||
cd64511871 | |||
2226f3112b | |||
184d2c2cba | |||
5830705c7d | |||
1d32ec4fbb | |||
eb85afaf35 | |||
269e5f9bd4 | |||
d4ce96337b | |||
af6cd757de | |||
ce252bf885 | |||
28d5b81b30 | |||
563871008e | |||
272b2ce7d8 | |||
14c77d9edf | |||
d15cd38daf | |||
e3dbea2b7a | |||
01fa3f8202 | |||
98ac420462 | |||
5ca3778719 | |||
5d27afcd68 | |||
c786fce37b | |||
b796060529 | |||
ff0036d4c2 | |||
fd55fe06a9 | |||
653ba1619f | |||
8f25d78fe6 | |||
521c35af8f | |||
d021ab64b9 | |||
df5b217fe7 | |||
8415e99055 | |||
da208b2908 | |||
7b7f501145 | |||
03e85359d1 | |||
401c03d752 | |||
a878c9bb2e | |||
60b5386f27 | |||
46f070e9cc | |||
2180ba3fb4 | |||
c6910c14c2 | |||
38e7b6e276 | |||
e523f2085d | |||
7b386fe856 | |||
bcdfbe0534 | |||
52499b7616 | |||
1db89a3d3f | |||
de67e45c9a | |||
3becd9cf4d | |||
d570e3cfef | |||
49f6cf505a | |||
17e320923f | |||
c4a3edece2 | |||
273b7f67a6 | |||
5cb17c6d52 | |||
0c7a1d55e2 | |||
b2c9e500f8 | |||
2f6b376ece | |||
357b7ede64 | |||
60493b3413 | |||
76327e9dbc |
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,3 +1,4 @@
|
||||
LSL2/STPROC/TEST_DANIEL*.txt
|
||||
LSL2/STPROC/TEST_DAKOTA.txt
|
||||
LSL2/STPROC/JONATHAN_SERVICES.txt
|
||||
LSL2/STPROC/CHASE_SERVICES.txt
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
@ -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
@ -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
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -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
@ -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
@ -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>": ""
|
||||
}
|
||||
}
|
||||
}
|
@ -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>": ""
|
||||
}
|
||||
}
|
||||
}
|
@ -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>": ""
|
||||
}
|
||||
}
|
||||
}
|
@ -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>": ""
|
||||
}
|
||||
}
|
||||
}
|
@ -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>": ""
|
||||
}
|
||||
}
|
||||
}
|
@ -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>": ""
|
||||
}
|
||||
}
|
||||
}
|
@ -149,4 +149,3 @@ end api
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
@ -67,19 +67,16 @@ END
|
||||
RETURN Result
|
||||
|
||||
|
||||
|
||||
* * * * * * *
|
||||
Create:
|
||||
* * * * * * *
|
||||
|
||||
|
||||
IF MemberOf(@USER4,'CALIBRATION') ELSE
|
||||
ErrMsg('Only authorized personnel may update the Calibration List.')
|
||||
End_Window(@WINDOW)
|
||||
RETURN
|
||||
END
|
||||
|
||||
|
||||
obj_Appwindow('Create',@WINDOW)
|
||||
|
||||
Set_List_Box_Data( @WINDOW )
|
||||
@ -141,13 +138,9 @@ FOR I = 1 TO COUNT(ETCtrls,@VM) + (ETCtrls NE '')
|
||||
NEXT Line
|
||||
NEXT I
|
||||
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
* * * * * * *
|
||||
Read:
|
||||
* * * * * * *
|
||||
@ -158,7 +151,6 @@ 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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -210,7 +194,6 @@ IF CLNo = '' THEN
|
||||
obj_Appwindow('LoadFormKeys',@WINDOW:@RM:NextCLNo)
|
||||
END
|
||||
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
@ -233,11 +216,9 @@ END ELSE
|
||||
obj_Appwindow('LoadFormKeys',@WINDOW:@RM:CLKeys)
|
||||
END
|
||||
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
* * * * * * *
|
||||
LUCalibItemType:
|
||||
* * * * * * *
|
||||
@ -268,13 +249,10 @@ END
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
* * * * * *
|
||||
Close:
|
||||
* * * * * *
|
||||
|
||||
|
||||
obj_Notes('Inbox',@USER4) ;* Checks for any new messages
|
||||
|
||||
Send_Event('MASTER_CALIB_LIST','CREATE')
|
||||
@ -314,7 +292,6 @@ IF CLNo NE '' AND CalDt NE '' THEN
|
||||
|
||||
obj_Appwindow('ViewNewDetail', oaParms)
|
||||
|
||||
|
||||
END
|
||||
|
||||
RETURN
|
||||
@ -350,6 +327,7 @@ END
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
*********************
|
||||
PrintMostRecentLabel:
|
||||
*********************
|
||||
@ -369,6 +347,3 @@ end
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -136,4 +136,3 @@ CreateHALCollection:
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
|
258
LSL2/STPROC/CLEAN_API.txt
Normal file
258
LSL2/STPROC/CLEAN_API.txt
Normal 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
|
@ -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
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
217
LSL2/STPROC/CLEAN_SERVICES.txt
Normal file
217
LSL2/STPROC/CLEAN_SERVICES.txt
Normal 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
|
@ -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,11 +66,8 @@ RETURN Result
|
||||
Create:
|
||||
* * * * * * *
|
||||
|
||||
|
||||
obj_AppWindow('Create')
|
||||
|
||||
Set_Property(@WINDOW,'STATUSLINE',@WINDOW:'.STATUSLINE_FIX')
|
||||
|
||||
GOSUB Refresh
|
||||
|
||||
RETURN
|
||||
@ -81,8 +78,7 @@ 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
|
||||
stat = Send_Message(@WINDOW:'.CUST_INFO','COLOR_BY_POS',COL$CUST_NAME,0,GREEN$)
|
||||
|
||||
RETURN
|
||||
|
||||
@ -92,19 +88,13 @@ 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
|
||||
|
||||
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,'','')
|
||||
@ -119,13 +109,10 @@ 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
|
||||
Set_Property(CtrlName,'CELLPOS',XLATE('COMPANY',CustNo,4,'X'),COL$CUST_NAME:@FM:CurrRow)
|
||||
@ -139,13 +126,10 @@ 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
|
||||
@ -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
|
||||
ErrMsg('DoubleClick on the first empty Cust No field to view a popup of all Customers')
|
||||
END
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
@ -176,78 +159,51 @@ SubPNDC:
|
||||
* * * * * * *
|
||||
|
||||
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
|
||||
CustNos[COL1(),99] = ''
|
||||
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)
|
||||
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:
|
||||
* * * * * * *
|
||||
|
||||
|
||||
LotNos = ''
|
||||
WOKeys = ''
|
||||
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)
|
||||
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 := 'LOT_NO':@VM:'#':@FM
|
||||
|
||||
Btree.Extract(SearchString, 'WO_LOG', DictVar, WOKeys, '', Flag)
|
||||
IF Get_Status(errCode) THEN
|
||||
Msg(@WINDOW,MsgUp)
|
||||
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)
|
||||
RETURN
|
||||
END
|
||||
|
||||
end
|
||||
IF WOKeys NE '' THEN
|
||||
RawLotNos = XLATE('WO_LOG',WOKeys,'LOT_NO','X') ;* Calculated field
|
||||
IF Get_Status(errCode) THEN DEBUG
|
||||
LotNos = ''
|
||||
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)
|
||||
END
|
||||
|
||||
|
||||
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_WO_LOG_FIND.')
|
||||
ErrMsg('Unable to open DICT.WO_LOG in COMM_DIALOG_CASS_MET_EXPORT.')
|
||||
END
|
||||
|
||||
|
||||
end
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
* * * * * * *
|
||||
PSNoDC:
|
||||
* * * * * * *
|
||||
|
||||
|
||||
WOKeys = ''
|
||||
PSNs = ''
|
||||
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)
|
||||
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 := 'PS_NO':@VM:'#':@FM
|
||||
|
||||
Btree.Extract(SearchString, 'WO_LOG', DictVar, WOKeys, '', Flag)
|
||||
IF Get_Status(errCode) THEN
|
||||
Msg(@WINDOW,MsgUp)
|
||||
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)
|
||||
|
||||
RETURN
|
||||
END
|
||||
|
||||
end
|
||||
IF WOKeys NE '' THEN
|
||||
PSNs = ''
|
||||
|
||||
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
|
||||
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
|
||||
|
||||
RETURN
|
||||
|
||||
@ -431,28 +359,27 @@ WONoDC:
|
||||
* * * * * * *
|
||||
|
||||
WOKeys = Collect.IXVals('WM_OUT', 'WO_NO')
|
||||
|
||||
CONVERT @FM TO @VM IN WOKeys
|
||||
|
||||
IF Get_Status(errCode) THEN ErrMsg(ErrCode)
|
||||
|
||||
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 else
|
||||
ErrMsg(errCode)
|
||||
end
|
||||
END
|
||||
RETURN
|
||||
end else
|
||||
ErrMsg(ErrCode)
|
||||
end
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
* * * * * * *
|
||||
@ -460,35 +387,14 @@ 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)
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
IF RetVal NE '' THEN obj_Appwindow('LUValReturn',RetVal:@RM:ReturnCtrl)
|
||||
|
||||
RETURN
|
||||
|
||||
@ -565,89 +456,36 @@ Cancel:
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
* * * * * * *
|
||||
PerformQuery:
|
||||
* * * * * * *
|
||||
|
||||
* Customer numbers *
|
||||
|
||||
SearchString = 'MAKEUP_BOX':@VM:'0':@VM:'':@FM
|
||||
|
||||
CustNos = Get_Property(@WINDOW:'.CUST_INFO','ARRAY')<COL$CUST_NO>
|
||||
|
||||
LOOP
|
||||
LastVar = CustNos[-1,'B':@VM]
|
||||
UNTIL LastVar NE '' OR CustNos = ''
|
||||
CustNos[COL1(),99] = '' ;* Trim trailing blanks
|
||||
REPEAT
|
||||
|
||||
CustNos = SRP_Array('Clean', CustNos, 'TrimAndMakeUnique', @VM)
|
||||
IF CustNos NE '' THEN SearchString := 'CUST_NO':@VM:CustNos:@FM
|
||||
|
||||
* LotNumbers *
|
||||
|
||||
LotNos = Get_Property(@WINDOW:'.LOT_NO','ARRAY')<1>
|
||||
|
||||
LOOP
|
||||
LastVal = LotNos[-1,'B':@VM]
|
||||
UNTIL LastVal NE '' OR LotNos = ''
|
||||
LotNos[COL1(),99] = '' ;* Trim trailing blanks
|
||||
REPEAT
|
||||
|
||||
LotNos = SRP_Array('Clean', LotNos, 'TrimAndMakeUnique', @VM)
|
||||
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
|
||||
|
||||
CustPNs = SRP_Array('Clean', CustPNs, 'TrimAndMakeUnique', @VM)
|
||||
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
|
||||
|
||||
SubPartNos = SRP_Array('Clean', SubPartNos, 'TrimAndMakeUnique', @VM)
|
||||
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
|
||||
|
||||
PS_NOs = SRP_Array('Clean', PS_NOs, 'TrimAndMakeUnique', @VM)
|
||||
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
|
||||
|
||||
WO_NOs = SRP_Array('Clean', WO_NOs, 'TrimAndMakeUnique', @VM)
|
||||
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')
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
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)
|
||||
|
||||
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
|
||||
ErrMsg(errCode)
|
||||
end
|
||||
END ELSE
|
||||
ErrMsg('Unable to open DICT.WO_MAT in routine COMM_DIALOG_CASS_MET_EXPORT')
|
||||
END
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
@ -556,8 +556,6 @@ UnloadProduct:
|
||||
Next CassNo
|
||||
end
|
||||
|
||||
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
@ -639,3 +637,4 @@ SlotOverview:
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
@ -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,7 +70,6 @@ RETURN Result
|
||||
Create:
|
||||
* * * * * * *
|
||||
|
||||
|
||||
obj_AppWindow('Create')
|
||||
|
||||
Set_Property(@WINDOW,'STATUSLINE',@WINDOW:'.STATUSLINE_FIX')
|
||||
@ -94,19 +95,14 @@ 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
|
||||
|
||||
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,'','')
|
||||
@ -121,13 +117,10 @@ 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
|
||||
Set_Property(CtrlName,'CELLPOS',XLATE('COMPANY',CustNo,4,'X'),COL$CUST_NAME:@FM:CurrRow)
|
||||
@ -141,13 +134,10 @@ 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
|
||||
@ -170,6 +160,7 @@ IF CustNo = '' THEN
|
||||
END ELSE
|
||||
ErrMsg('DoubleClick on the first empty Cust No field to view a popup of all Customers')
|
||||
END
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
@ -178,9 +169,7 @@ SubPNDC:
|
||||
* * * * * * *
|
||||
|
||||
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 = ''
|
||||
@ -190,7 +179,6 @@ REPEAT
|
||||
IF CustNos = '' THEN RETURN
|
||||
|
||||
* display the processing message and do the processing
|
||||
|
||||
Def = ""
|
||||
Def<MTEXT$> = "Selecting Substrate Part Numbers..."
|
||||
Def<MTYPE$> = "U"
|
||||
@ -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,21 +220,19 @@ 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
|
||||
ErrMsg('Unable to open DICT.WO_LOG in COMM_DIALOG_WO_LOG_FIND.')
|
||||
END
|
||||
@ -258,7 +244,6 @@ RETURN
|
||||
LotNoDC:
|
||||
* * * * * * *
|
||||
|
||||
|
||||
CustNos = Get_Property(@WINDOW:'.CUST_INFO','ARRAY')<COL$CUST_NO>
|
||||
|
||||
LOOP
|
||||
@ -268,9 +253,7 @@ UNTIL LastCustNo NE '' OR CustNos = ''
|
||||
REPEAT
|
||||
|
||||
IF CustNos = '' THEN RETURN
|
||||
|
||||
* display the processing message and do the processing
|
||||
|
||||
Def = ""
|
||||
Def<MTEXT$> = "Selecting Lot Numbers..."
|
||||
Def<MTYPE$> = "U"
|
||||
@ -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,37 +295,30 @@ 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
|
||||
ErrMsg('Unable to open DICT.WO_LOG in COMM_DIALOG_WO_LOG_FIND.')
|
||||
END
|
||||
|
||||
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
* * * * * * *
|
||||
PSNoDC:
|
||||
* * * * * * *
|
||||
|
||||
|
||||
CustArray = Get_Property(@WINDOW:'.CUST_INFO','ARRAY')
|
||||
|
||||
CustNos = CustArray<COL$CUST_NO>
|
||||
@ -356,7 +332,6 @@ REPEAT
|
||||
IF CustNos = '' THEN RETURN
|
||||
|
||||
* display the processing message and do the processing
|
||||
|
||||
Def = ""
|
||||
Def<MTEXT$> = "Selecting Product Specifications..."
|
||||
Def<MTYPE$> = "U"
|
||||
@ -405,22 +380,20 @@ 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
|
||||
ErrMsg('Unable to open DICT.WO_LOG in COMM_DIALOG_WO_LOG_FIND.')
|
||||
END
|
||||
@ -428,19 +401,15 @@ 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
|
||||
@ -454,26 +423,16 @@ 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
|
||||
ErrMsg('DoubleClick on the first empty Cust No field to view a popup of all Customers')
|
||||
END
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
* * * * * * *
|
||||
CustPNDC:
|
||||
* * * * * * *
|
||||
@ -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,7 +502,7 @@ 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)
|
||||
@ -557,7 +515,6 @@ END
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
* * * * * * *
|
||||
LUDate:
|
||||
* * * * * * *
|
||||
@ -570,11 +527,8 @@ DateSelected = Dialog_Box('POPUP_YEAR',@WINDOW)
|
||||
|
||||
RetVal = OCONV(DateSelected, 'D4/')
|
||||
|
||||
|
||||
obj_Appwindow('LUValReturn',RetVal:@RM:ReturnCtrl)
|
||||
|
||||
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
@ -585,92 +539,29 @@ Cancel:
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
* * * * * * *
|
||||
PerformQuery:
|
||||
* * * * * * *
|
||||
|
||||
* Customer numbers *
|
||||
|
||||
SearchString = ''
|
||||
|
||||
CustNos = Get_Property(@WINDOW:'.CUST_INFO','ARRAY')<COL$CUST_NO>
|
||||
|
||||
LOOP
|
||||
LastVar = CustNos[-1,'B':@VM]
|
||||
UNTIL LastVar NE '' OR CustNos = ''
|
||||
CustNos[COL1(),99] = '' ;* Trim trailing blanks
|
||||
REPEAT
|
||||
CustNos = SRP_Array('Clean', CustNos, 'TrimAndMakeUnique', @VM)
|
||||
|
||||
IF CustNos NE '' THEN SearchString := 'CUST_NO':@VM:CustNos:@FM
|
||||
|
||||
* LotNumbers *
|
||||
|
||||
LotNos = Get_Property(@WINDOW:'.LOT_NO','ARRAY')<1>
|
||||
|
||||
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
|
||||
|
||||
CustPNs = SRP_Array('Clean', CustPNs, 'TrimAndMakeUnique', @VM)
|
||||
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 * * * * *
|
||||
SubPartNos = SRP_Array('Clean', SubPartNos, 'TrimAndMakeUnique', @VM)
|
||||
IF SubPartNos NE '' THEN SearchString := 'ORD_SUB_PART_NO':@VM:SubPartNos:@FM
|
||||
|
||||
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
|
||||
|
||||
ReactTypes = SRP_Array('Clean', ReactTypes, 'TrimAndMakeUnique', @VM)
|
||||
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')
|
||||
|
||||
@ -682,38 +573,18 @@ 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
|
||||
|
||||
|
||||
* RX Dates *
|
||||
|
||||
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
|
||||
@ -724,31 +595,112 @@ IF OrdStatus NE 'I' THEN
|
||||
END
|
||||
END
|
||||
|
||||
WONos = ''
|
||||
|
||||
If SearchString NE '' then
|
||||
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)
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
|
||||
|
||||
|
@ -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
|
||||
@ -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
|
||||
|
||||
@ -137,6 +143,7 @@ END
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
* * * * * * *
|
||||
LQP:
|
||||
* * * * * * *
|
||||
@ -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')
|
||||
@ -546,8 +569,15 @@ 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
|
||||
|
||||
|
||||
|
@ -858,3 +858,4 @@ Result = ReturnData
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
@ -9,7 +9,7 @@ COMPILE FUNCTION Comm_PRS_Stage(EntID,Event,Parm1,Parm2,Parm3,Parm4,Parm5)
|
||||
DECLARE SUBROUTINE Set_Property, Set_Status, ErrMsg, Set_Property, obj_AppWindow, Send_Event, Security_Err_Msg
|
||||
DECLARE SUBROUTINE Send_Message, Btree.Extract, Comm_Prod_Spec, Forward_Event, Post_Event
|
||||
DECLARE FUNCTION Get_Property, Get_Status, Popup, Send_Message, Msg, Start_Window, MemberOf, Security_Check
|
||||
DECLARE FUNCTION Comm_Prod_Spec
|
||||
DECLARE FUNCTION Comm_Prod_Spec, obj_Popup
|
||||
|
||||
|
||||
$INSERT POPUP_EQUATES
|
||||
@ -192,7 +192,6 @@ NEXT I
|
||||
|
||||
Send_Message(@WINDOW:'.MET_TEST','COLFORMAT',COL$MET_PROP,PropCodes)
|
||||
|
||||
|
||||
* Class Tools is set in the POSCHANGED event for the edit table.
|
||||
|
||||
/*
|
||||
@ -235,6 +234,23 @@ Read:
|
||||
|
||||
GOSUB Refresh
|
||||
|
||||
* Met Property Descriptions *
|
||||
|
||||
PSNo = Get_Property(@WINDOW : '.PS_NO', 'TEXT')
|
||||
Stage = Get_Property(@WINDOW:'.STAGE','DEFPROP')
|
||||
|
||||
Props = Xlate('PRS_STAGE', PSNo:'*':Stage, PRS_STAGE_MET_PROP$, 'X')
|
||||
|
||||
PropDescs = obj_Popup('CodeDesc','MET_PROPERTY':@RM:Props)
|
||||
|
||||
CtrlEntID = @WINDOW:'.MET_TEST'
|
||||
DescCount = DCount(PropDescs, @VM)
|
||||
FOR Row = 1 to DescCount
|
||||
PropDesc = PropDescs<1, Row>
|
||||
|
||||
Set_Property(CtrlEntId,"CELLPOS",PropDesc,COL$MET_PROP_DESC:@FM:Row)
|
||||
Next Row
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
@ -764,6 +780,12 @@ BEGIN CASE
|
||||
|
||||
RETURN
|
||||
|
||||
CASE CurrCol = COL$MET_PROP_DESC
|
||||
|
||||
PropCode = CurrLine<1,COL$MET_PROP>
|
||||
|
||||
DefProp = obj_Popup('CodeDesc','MET_PROPERTY':@RM:PropCode)
|
||||
|
||||
|
||||
CASE CurrCol = COL$MET_MIN AND CurrLine<1,COL$MET_MIN> = ''
|
||||
MetTest = CurrLine<1,COL$MET_TEST>
|
||||
@ -1229,3 +1251,4 @@ return
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -2015,7 +2015,7 @@ HoldClick:
|
||||
HoldData = Dialog_Box('DIALOG_HOLD',@WINDOW,Transition:@FM:@FM:HoldType:@FM:Stage:@FM:Interrupted)
|
||||
|
||||
If HoldData NE 'Cancel' then
|
||||
Hold_Services('ToggleHold', WOMatKey, HoldEntity, HoldEntityID, CtrlEnt, '', HoldData, '')
|
||||
Hold_Services('ToggleHold', WOMatKey, HoldEntity, HoldEntityID, CtrlEnt, '', HoldData, @User4)
|
||||
IF Error_Services("HasError") THEN
|
||||
ErrCode = Error_Services("GetMessage")
|
||||
ErrMsg(errCode)
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -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
|
||||
|
@ -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
|
||||
@ -1214,3 +1235,5 @@ return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -8,10 +8,11 @@ COMPILE FUNCTION Comm_WO_Rec(Instruction, Parm1,Parm2)
|
||||
|
||||
DECLARE SUBROUTINE Set_Property, Set_Status, ErrMsg, Set_Property, obj_AppWindow, obj_Notes, Print_RX_Voucher, obj_Tables
|
||||
DECLARE SUBROUTINE Btree.Extract, Send_Event, Security_Err_Msg, Forward_Event, End_Window, obj_WO_Log, obj_WO_Mat
|
||||
DECLARE SUBROUTINE Logging_Services, Post_Event, Work_Order_Services
|
||||
DECLARE SUBROUTINE Logging_Services, Post_Event, Work_Order_Services, Error_Services, Database_Services, Service_Services
|
||||
DECLARE FUNCTION Get_Property, Get_Status, Popup, Send_Message, Msg, Security_Check, Dialog_Box, RowExists, obj_Prod_Spec
|
||||
DECLARE FUNCTION obj_Schedule, Dialog_Box, obj_WO_Log, obj_Order_Det, FindWindow,ShowWindow, obj_Tables, obj_WO_Mat, MemberOf
|
||||
DECLARE FUNCTION Logging_Services, Environment_Services
|
||||
DECLARE FUNCTION Logging_Services, Environment_Services, Work_Order_Services, Error_Services, Service_Services
|
||||
DECLARE FUNCTION SRP_Array, GetTickCount, Datetime, Wo_Mat_Services
|
||||
|
||||
$INSERT POPUP_EQUATES
|
||||
$INSERT LOGICAL
|
||||
@ -32,7 +33,8 @@ $INSERT NOTIFICATION_EQU
|
||||
$INSERT PROD_VER_EQUATES
|
||||
$INSERT EPI_PART_EQUATES
|
||||
$INSERT CUST_EPI_PART_EQUATES
|
||||
|
||||
$Insert IFX_EQUATES
|
||||
$Insert PROC_QUEUE2_EQUATES
|
||||
|
||||
EQU CRLF$ TO \0D0A\
|
||||
|
||||
@ -64,6 +66,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\WO_LOG'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
@ -115,6 +119,10 @@ IF NOT(Security_Check('WO Log',READ$)) THEN
|
||||
RETURN
|
||||
END
|
||||
|
||||
IOOptions = Get_Property(@Window, 'IOOPTIONS')
|
||||
IOOptions<2> = 2 ; // Database bound form - Do not lock the record
|
||||
Set_Property(@Window, 'IOOPTIONS', IOOptions)
|
||||
|
||||
obj_Appwindow('Create',@WINDOW)
|
||||
|
||||
GOSUB Refresh
|
||||
@ -165,7 +173,29 @@ IF RxBy = '' THEN
|
||||
Set_Property(@WINDOW:'.RX_DTM','TEXT',CurrDTM)
|
||||
END
|
||||
|
||||
|
||||
Def = ""
|
||||
Def<MTEXT$> = "Loading cassette data..."
|
||||
Def<MTYPE$> = "U"
|
||||
MsgUp = Msg(@window, Def)
|
||||
Columns = 'CASS_NO':@VM:'LOT_NO':@VM:'WAFER_QTY':@VM:'CUST_PART_NO':@VM:'SUB_PART_NO':@VM:'SUB_VEND_CD':@VM:'RX_DTM':@VM:'RX_BY':@VM:'ORDER_ITEM'
|
||||
WOMatKeys = Wo_Mat_Services('GetWOMatKeys', WONo)
|
||||
If Error_Services('NoError') then
|
||||
If (WOMatKeys NE '') then
|
||||
CassData = WO_Mat_Services('GetWOMatData', WOMatKeys, Columns)
|
||||
If Error_Services('NoError') then
|
||||
Set_Property(@Window:'.CASS_NO', 'ARRAY', CassData)
|
||||
Msg(@window, MsgUp)
|
||||
end else
|
||||
Msg(@window, MsgUp)
|
||||
Msg(@Window, '', 'OK', '', 'Process Error':@FM:Error_Services('GetMessage'))
|
||||
end
|
||||
end else
|
||||
Msg(@window, MsgUp)
|
||||
end
|
||||
end else
|
||||
Msg(@window, MsgUp)
|
||||
Msg(@Window, '', 'OK', '', 'Process Error':@FM:Error_Services('GetMessage'))
|
||||
end
|
||||
|
||||
GOSUB Refresh
|
||||
|
||||
@ -296,7 +326,6 @@ FOR I = 1 TO COUNT(ETCtrls,@VM) + (ETCtrls NE '')
|
||||
END
|
||||
NEXT I
|
||||
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
@ -312,7 +341,7 @@ MsgUp = Msg(@WINDOW,'','SELECT_OPEN_WO')
|
||||
|
||||
WOKeys = ''
|
||||
|
||||
SelectStatement = 'CURR_STATUS':@VM:'ASN':@VM:'AWM':@VM:'RTP':@FM
|
||||
SelectStatement = 'CURR_STATUS_STATIC':@VM:'ASN':@VM:'AWM':@VM:'RTP':@FM
|
||||
|
||||
Btree.Extract(SelectStatement,'WO_LOG',DictWOLogTable,WOKeys,'','')
|
||||
|
||||
@ -336,8 +365,6 @@ END
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
* * * * * * *
|
||||
LUWONo:
|
||||
* * * * * * *
|
||||
@ -384,22 +411,17 @@ obj_Appwindow('LoadFormKeys',@WINDOW:@RM:WONo)
|
||||
|
||||
Set_Property('SYSTEM','FOCUS','VSPRINTER')
|
||||
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
* * * * * * *
|
||||
Scan:
|
||||
* * * * * * *
|
||||
|
||||
WONo = Get_Property(@WINDOW:'.WO_NO','TEXT')
|
||||
|
||||
CtrlEntID = @WINDOW:'.CASS_NO'
|
||||
|
||||
CassList = Get_Property(CtrlEntID,'LIST')
|
||||
CassArray = Get_Property(CtrlEntID,'DEFPROP')
|
||||
|
||||
CassListCnt = COUNT(CassList,@FM)
|
||||
|
||||
CassPointer = 1
|
||||
@ -414,25 +436,18 @@ UNTIL CassList<CassPointer> = ''
|
||||
REPEAT
|
||||
|
||||
ExistCassCnt = COUNT(CassList,@FM) + (CassList NE '')
|
||||
|
||||
WORec = XLATE('WO_LOG',WONo,'','X')
|
||||
|
||||
WOMatKeys = WORec<WO_LOG_WO_MAT_KEY$> ;* List of WO_MAT Keys associated with this WO_LOG Record * * * * * * *
|
||||
OpenQty = ICONV(Get_Property(@WINDOW:'.OPEN_QTY','DEFPROP'),'MD0') ;* Scan button is disabled if there isn't anything to receive
|
||||
|
||||
EPIPartNo = WORec<WO_LOG_EPI_PART_NO$>
|
||||
|
||||
EPIPartRec = XLATE('EPI_PART',EpiPartNo,'','X')
|
||||
|
||||
SubSuppBy = EPIPartRec<EPI_PART_SUB_SUPP_BY$> ;* L - EpiSvcs supplied, C - Customer Supplied
|
||||
SAPMaterial = EPIPartRec<EPI_PART_SAP_MATERIAL$> ;* 0 =
|
||||
|
||||
OrderNo = Get_Property(@WINDOW:'.ORDER_NO','TEXT')
|
||||
|
||||
IF OrderNo = '' THEN
|
||||
|
||||
ProdVerNo = WORec<WO_LOG_PROD_VER_NO$>
|
||||
|
||||
ProdVerRec = XLATE('PROD_VER',ProdVerNo,'','X')
|
||||
SubPartNo = ProdVerRec<PROD_VER_SUB_PART_NO$>
|
||||
ProdVerStepPSNs = ProdVerRec<PROD_VER_PROC_STEP_PSN$> ;* Added 6/24/2016 JCH - GaN receipt
|
||||
@ -440,7 +455,6 @@ IF OrderNo = '' THEN
|
||||
Vendor = WORec<WO_LOG_EXP_VEND_CD$> ;* Added 4/14/2014
|
||||
IF LEN(Vendor) NE 2 THEN Vendor = ''
|
||||
|
||||
|
||||
IF SubSuppBy = 'L' THEN
|
||||
VendorDef = Vendor
|
||||
END ELSE
|
||||
@ -477,7 +491,6 @@ END ELSE
|
||||
OrderDetailList = DELETE(OrderDetailList,I,0,0) ;* Strip blank lines from control data
|
||||
NEXT I
|
||||
|
||||
|
||||
CheckArray = ''
|
||||
CALine = 1
|
||||
FOR I = 1 TO COUNT(OrderDetailList,@FM) + (OrderDetailList NE '')
|
||||
@ -530,12 +543,9 @@ END ELSE
|
||||
|
||||
NEXT I
|
||||
|
||||
|
||||
FOR I = 1 TO COUNT(CassList,@FM) + (CassList NE '')
|
||||
|
||||
CassLotNo = CassList<I,COL$CASS_LOT_NO>
|
||||
CassQty = CassList<I,COL$CASS_QTY>
|
||||
|
||||
LOCATE CassLotNo IN CheckArray<CA$LOT_NO> USING @VM SETTING Pos THEN
|
||||
CheckArray<CA$LOT_QTY,Pos> = CheckArray<CA$LOT_QTY,Pos> - CassQty ;* Back out lot qtys already scanned
|
||||
END
|
||||
@ -545,291 +555,110 @@ END ELSE
|
||||
|
||||
END ;* End of check for Order Number present ***********************************
|
||||
|
||||
ScanResults = Dialog_Box('DIALOG_WO_SCAN', @WINDOW, CheckArray) ;* Returns a line for each cassette scanned, checked, filled in or override data
|
||||
IF ScanResults = 'Cancel' THEN RETURN
|
||||
NewCassetteCnt = 0
|
||||
CheckArray<CA$WO_NO> = WONo
|
||||
CheckArray<CA$REC_DTM> = Datetime()
|
||||
ProcIds = Dialog_Box('DIALOG_WO_SCAN', @WINDOW, CheckArray)
|
||||
|
||||
WOMatCreateStartTime = Time()
|
||||
* * * * * * New 3/9/2011 * * * * * *
|
||||
|
||||
ProdOrderNo = WORec<WO_LOG_PROD_ORD_NO$>
|
||||
Done = False$
|
||||
IF ( (ProcIds NE 'Cancel') and (ProcIds NE '') ) THEN
|
||||
|
||||
ProdVerNo = WORec<WO_LOG_PROD_VER_NO$>
|
||||
CustNo = WORec<WO_LOG_CUST_NO$>
|
||||
|
||||
|
||||
ProdVerRec = XLATE('PROD_VER',ProdVerNo,'','X')
|
||||
|
||||
ProcStepPSNs = ProdVerRec<PROD_VER_PROC_STEP_PSN$>
|
||||
ReactType = ProdVerRec<PROD_VER_REACT_TYPE$> ;* This is in 3 letter code version
|
||||
|
||||
|
||||
SpecType = XLATE('PROD_SPEC',ProcStepPSNs[-1,'B':@VM],'SPEC_TYPE','X') ;* Shipping PSN Spec Type
|
||||
|
||||
CustEpiPartRec = XLATE('CUST_EPI_PART',CustNo:'*':EpiPartNo,'','X') ;* Added 7/31/2012 JCH
|
||||
|
||||
MUWaferFlag = CustEpiPartRec<CUST_EPI_PART_MAKEUP_WAFERS$> ;* Added 7/31/2012 JCH
|
||||
RetRejects = CustEpiPartRec<CUST_EPI_PART_RET_REJECTS$> ;* Added 7/31/2012 JCH
|
||||
|
||||
|
||||
IF SpecType = 'Q' THEN
|
||||
CassShipQty = '' ;* If Spec is in Qual Mode then no Quantity is used
|
||||
END ELSE
|
||||
CassShipQty = CustEpiPartRec<CUST_EPI_PART_CASS_SHIP_QTY$>
|
||||
END
|
||||
|
||||
MinCassShipQty = CustEpiPartRec<CUST_EPI_PART_MIN_CASS_SHIP_QTY$>
|
||||
|
||||
|
||||
ShipShort = CustEpiPartRec<CUST_EPI_PART_EPI_PRO_SHIP_SHORT$> ;* Added 7/31/2012 JCH
|
||||
Reprocessed = '' ;* Added 12/16/2009 JCH to match parms passed to obj_WO_Mat('Create
|
||||
|
||||
RelStamps = Get_Property(@WINDOW:'.REL_STAMP','ARRAY')
|
||||
|
||||
Released = ''
|
||||
IF RelStamps[-1,'B*'] = '' THEN Released = 0 ELSE Released = 1
|
||||
|
||||
|
||||
IF ReactType = 'GAN' THEN GOTO RecGaN ;* * * * * * * * * * *
|
||||
|
||||
|
||||
IF ExistCassCnt >= 1 THEN
|
||||
|
||||
IF Released THEN
|
||||
Resp = 1 ;* 12/13/20007 - JCH added to limit replace function to unreleased WO's
|
||||
END ELSE
|
||||
|
||||
TypeOver = ''
|
||||
TypeOver<MCAPTION$> = 'Add or Replace Work Order Cassette Information'
|
||||
TypeOver<MTEXT$> = 'Do you wish to Add To or Replace the existing cassette information?'
|
||||
TypeOver<MTYPE$> = 'B&Add,&Replace,&Cancel'
|
||||
Resp = Msg(@WINDOW,TypeOver)
|
||||
|
||||
END
|
||||
|
||||
IF Resp = 3 THEN RETURN ;* Canceled
|
||||
IF Resp = 1 THEN
|
||||
|
||||
* Add to Existing
|
||||
|
||||
NewCassetteCnt = COUNT(ScanResults<COL$CASS_NO>,@VM) + (ScanResults<COL$CASS_NO> NE '')
|
||||
Timeout = 180000
|
||||
|
||||
NumProcIds = DCount(ProcIds, @FM)
|
||||
Def = ''
|
||||
Def<MCAPTION$> = 'Receiving Cassettes...'
|
||||
Def<MCAPTION$> = 'Receiving and Releasing Cassettes...'
|
||||
Def<MTYPE$> = 'G'
|
||||
Def<MEXTENT$> = NewCassetteCnt
|
||||
Def<MEXTENT$> = NumProcIds
|
||||
Def<MTEXTWIDTH$> = 600
|
||||
MsgUp = Msg(@WINDOW,Def)
|
||||
|
||||
FOR I = 1 TO NewCassetteCnt
|
||||
|
||||
Msg(@WINDOW, MsgUp, I, MSGINSTUPDATE$)
|
||||
|
||||
ScanLotNo = ScanResults<COL$CASS_LOT_NO,I>
|
||||
ScanQty = ScanResults<COL$CASS_QTY,I>
|
||||
ScanPartNo = ScanResults<COL$CASS_CUST_PART_NO,I>
|
||||
ScanOrdItem = ScanResults<COL$CASS_ORDER_ITEM,I>
|
||||
ScanVendor = ScanResults<COL$CASS_SUB_VEND_CD,I> ;* Added 7/14/2011 for SAP project JCH
|
||||
|
||||
IF ScanLotNo NE '' AND ScanQty NE '' AND ScanPartNo NE '' AND ScanOrdItem NE '' THEN
|
||||
|
||||
CassNo = ExistCassCnt + 1
|
||||
|
||||
|
||||
Parms = WONo:@RM
|
||||
Parms := CassNo:@RM
|
||||
Parms := ProdVerNo:@RM
|
||||
Parms := ScanResults<COL$CASS_LOT_NO,I>:@RM
|
||||
Parms := ScanResults<COL$CASS_QTY,I>:@RM
|
||||
Parms := ScanResults<COL$CASS_CUST_PART_NO,I>:@RM ;* This is the CUSTOMER part No
|
||||
Parms := ScanResults<COL$CASS_ORDER_ITEM,I>:@RM
|
||||
Parms := ReactType:@RM ;* 3 character Reactor Type Code
|
||||
Parms := ScanResults<COL$CASS_SUB_PART_NO,I>:@RM
|
||||
Parms := 'SR':@RM ;* Warehouse = 'SR' - Shipping/Receiving Area
|
||||
Parms := 'RB':@RM ;* Location = 'RB' - Receiving Bench
|
||||
Parms := ScanResults<COL$CASS_TIME_STAMP,I>:@RM
|
||||
Parms := ScanResults<COL$CASS_SCAN_BY,I>:@RM
|
||||
Parms := SubSuppBy:@RM
|
||||
Parms := MUWaferFlag:@RM
|
||||
Parms := RetRejects :@RM ;* Added 8/18/2009 JCH
|
||||
Parms := Reprocessed:@RM ;* Added 12/16/2009 JCH
|
||||
Parms := CassShipQty:@RM ;* Added 11/4/2009 JCH
|
||||
Parms := ShipShort:@RM ;* Added 05/14/2010 JCH
|
||||
Parms := ScanVendor:@RM ;* Added 07/14/2011 for SAP Project JCH
|
||||
Parms := MinCassShipQty ; // Added 02/01/2018 dmb
|
||||
|
||||
|
||||
obj_WO_Mat('Create',Parms) ;* Added 10/18/2006 JCH - New Work Order material subsystem.
|
||||
|
||||
ExistCassCnt += 1
|
||||
|
||||
WOMatKey = WONo:'*':CassNo
|
||||
|
||||
LOCATE WOMatKey IN WOMatKeys BY 'AR' USING @VM SETTING NewPos ELSE
|
||||
WOMatKeys = INSERT(WOMatKeys,1,NewPos,0,WOMatKey)
|
||||
END
|
||||
END
|
||||
|
||||
NEXT I
|
||||
|
||||
Msg(@WINDOW,MsgUp)
|
||||
|
||||
ScanResults = CassArray
|
||||
|
||||
Scheduled = XLATE('WO_LOG',WONo,'SCHEDULED','X')
|
||||
|
||||
IF Scheduled THEN
|
||||
|
||||
* Message to production about change in Work Order Size
|
||||
|
||||
Recipients = XLATE('NOTIFICATION','MAST_SCHED_BEG',NOTIFICATION_USER_ID$,'X') ;* Added 10/03/2005 JCH - J.C. Henry & Co., Inc
|
||||
OtherRecipients = XLATE('NOTIFICATION','MAST_SCHED_END',NOTIFICATION_USER_ID$,'X') ;* Added 10/03/2005 JCH - J.C. Henry & Co., Inc
|
||||
|
||||
FOR N = 1 TO COUNT(OtherRecipients,@VM) + (OtherRecipients NE '')
|
||||
OtherRecip = OtherRecipients<1,N>
|
||||
LOCATE OtherRecip IN Recipients USING @VM SETTING Pos ELSE
|
||||
Recipients = INSERT(Recipients,1,Pos,0,OtherRecip)
|
||||
END
|
||||
NEXT N
|
||||
|
||||
SentFrom = @USER4
|
||||
Subject = 'Cassettes Added to Work Order'
|
||||
Message = NewCassetteCnt:" Cassettes have been added to Scheduled Work Order ":WONo
|
||||
AttachWindow = 'WO_PROD'
|
||||
AttachKey = WONo
|
||||
SendToGroup = ''
|
||||
|
||||
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
|
||||
*obj_Notes('Create',Parms)
|
||||
|
||||
END
|
||||
|
||||
END
|
||||
END ELSE
|
||||
|
||||
* Loop through ScanResults and call obj_WO_Mat('Create')
|
||||
|
||||
NewCassetteCnt = COUNT(ScanResults<COL$CASS_NO>,@VM) + (ScanResults<COL$CASS_NO> NE '')
|
||||
|
||||
Def = ''
|
||||
Def<MCAPTION$> = 'Receiving Cassettes...'
|
||||
Def<MTYPE$> = 'G'
|
||||
Def<MEXTENT$> = NewCassetteCnt
|
||||
Def<MTEXTWIDTH$> = 600
|
||||
MsgUp = Msg(@WINDOW,Def)
|
||||
|
||||
|
||||
|
||||
FOR I = 1 TO NewCassetteCnt
|
||||
|
||||
Msg(@WINDOW, MsgUp, I, MSGINSTUPDATE$)
|
||||
|
||||
CassNo = I
|
||||
|
||||
Parms = WONo:@RM
|
||||
Parms := CassNo:@RM
|
||||
Parms := ProdVerNo:@RM
|
||||
Parms := ScanResults<COL$CASS_LOT_NO,I>:@RM
|
||||
Parms := ScanResults<COL$CASS_QTY,I>:@RM
|
||||
Parms := ScanResults<COL$CASS_CUST_PART_NO,I>:@RM
|
||||
Parms := ScanResults<COL$CASS_ORDER_ITEM,I>:@RM
|
||||
Parms := ReactType:@RM
|
||||
Parms := ScanResults<COL$CASS_SUB_PART_NO,I>:@RM
|
||||
Parms := 'SR':@RM ;* Warehouse = 'SR' - Shipping/Receiving Area
|
||||
Parms := 'RB':@RM ;* Location = 'RB' - Receiving Bench
|
||||
Parms := ScanResults<COL$CASS_TIME_STAMP,I>:@RM
|
||||
Parms := ScanResults<COL$CASS_SCAN_BY,I>:@RM
|
||||
Parms := SubSuppBy:@RM
|
||||
Parms := MUWaferFlag:@RM
|
||||
Parms := RetRejects:@RM ;* Added 8/18/2009 JCH
|
||||
Parms := Reprocessed:@RM ;* Added 12/16/2009 JCH
|
||||
Parms := CassShipQty:@RM ;* Added 11/4/2009 JCH
|
||||
Parms := ShipShort:@RM ;* Added 05/14/2010 JCH
|
||||
Parms := ScanResults<COL$CASS_SUB_VEND_CD,I>:@RM ;* Added 07/14/2011 for SAP project JCH
|
||||
Parms := MinCassShipQty ; // Added 02/01/2018 dmb
|
||||
|
||||
obj_WO_Mat('Create',Parms) ;* Added 10/18/2006 JCH - New Work Order material subsystem.
|
||||
|
||||
ExistCassCnt += 1
|
||||
|
||||
WOMatKey = WONo:'*':CassNo
|
||||
|
||||
LOCATE WOMatKey IN WOMatKeys BY 'AR' USING @VM SETTING NewPos ELSE
|
||||
WOMatKeys = INSERT(WOMatKeys,1,NewPos,0,WOMatKey)
|
||||
END
|
||||
|
||||
NEXT I
|
||||
|
||||
Msg(@WINDOW,MsgUp)
|
||||
END
|
||||
|
||||
|
||||
|
||||
Set_Property(CtrlEntID,'DEFPROP',ScanResults)
|
||||
|
||||
IF ScanResults NE '' THEN
|
||||
Recipients = XLATE('NOTIFICATION','MATERIAL_RECEIPT',NOTIFICATION_USER_ID$,'X') ;* Added 10/04/2005 JCH - J.C. Henry & Co., Inc
|
||||
SentFrom = @USER4
|
||||
Subject = 'Cassettes Received for Work Order'
|
||||
Message = "Cassettes have been received for Work Order ":WONo
|
||||
NewForm = Xlate('APP_INFO', 'NEW_WO_FORM', '', 'X')
|
||||
If NewForm then
|
||||
AttachWindow = 'NDW_WO_LOG'
|
||||
end else
|
||||
AttachWindow = 'WO_LOG2'
|
||||
Start = GetTickCount()
|
||||
Done = False$
|
||||
NumCompleteProcs = 0
|
||||
Loop
|
||||
RemainingProcs = DCount(ProcIds, @FM)
|
||||
CompletedProcIds = ''
|
||||
For ProcIndex = 1 to RemainingProcs
|
||||
ProcId = ProcIds<ProcIndex>
|
||||
If RowExists('PROC_QUEUE2', ProcId) then
|
||||
// Proc is still processing. Check if error recorded.
|
||||
ErrorMsg = Xlate('PROC_QUEUE2', ProcId, PROC_QUEUE2.ERROR$, 'X')
|
||||
If ErrorMsg NE '' then
|
||||
Msg(@Window, '', 'OK', '', 'Process Error':@FM:ErrorMsg)
|
||||
Database_Services('DeleteDataRow', 'PROC_QUEUE2', ProcId, True$, False$)
|
||||
end
|
||||
AttachKey = WONo
|
||||
SendToGroup = ''
|
||||
end else
|
||||
// Proc is done or failed
|
||||
CompletedProcIds<-1> = ProcId
|
||||
end
|
||||
Next ProcIndex
|
||||
If CompletedProcIds NE '' then
|
||||
NumCompleteProcs += DCount(CompletedProcIds, @FM)
|
||||
ProcIds = SRP_Array('Join', ProcIds, CompletedProcIds, 'XOR', @FM)
|
||||
end
|
||||
Now = GetTickCount()
|
||||
Runtime = Now - Start
|
||||
Msg(@WINDOW, MsgUp, NumCompleteProcs, MSGINSTUPDATE$)
|
||||
Until (ProcIds EQ '') or (Runtime GT Timeout)
|
||||
Repeat
|
||||
|
||||
// Take down gas guage
|
||||
Msg(@window, MsgUp)
|
||||
|
||||
If (Runtime GT Timeout) then
|
||||
// Notify OI_SYSADMIN group
|
||||
Recipients = ''
|
||||
SentFrom = 'SYSTEM'
|
||||
Subject = 'Receiving and Releasing Error for Work Order ':WONo
|
||||
Message = OConv(Datetime(), 'DT/^S')
|
||||
Swap @FM with CRLF$ in CompletedProcIds
|
||||
Swap @FM with CRLF$ in ProcIds
|
||||
Message<2> = 'Completed ProcIds: ':CompletedProcIds
|
||||
Message<3> = 'Incomplete ProcIds: ':ProcIds
|
||||
AttachWindow = ''
|
||||
AttachKey = ''
|
||||
SendToGroup = 'OI_SYSADMIN'
|
||||
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
|
||||
obj_Notes('Create',Parms)
|
||||
END
|
||||
|
||||
Set_Property(@WINDOW:'.RX_BY','DEFPROP',OCONV(@USER4,'[XLATE_CONV,LSL_USERS*FIRST_LAST]')) ;* Current user
|
||||
Set_Property(@WINDOW:'.RX_DTM','DEFPROP',OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS') ) ;* Current timestamp
|
||||
Set_Property(@WINDOW:'.WO_MAT_KEY','DEFPROP',WOMatKeys)
|
||||
|
||||
Send_Event(@WINDOW,'WRITE')
|
||||
ErrorMsg = 'The server is taking longer than expected to process the receive / ':CRLF$:'release requests. FI has been alerted to the issue.'
|
||||
Msg(@Window, '', 'OK', '', 'Process Error':@FM:ErrorMsg)
|
||||
end
|
||||
|
||||
WOMatCreateStopTime = Time()
|
||||
FormRefreshStartTime = Time()
|
||||
|
||||
// Update RX_QTY_STATIC
|
||||
Work_Order_Services('UpdateReceivedQty', WONo)
|
||||
|
||||
obj_AppWindow('LoadFormKeys','WO_REC':@RM:WONo)
|
||||
|
||||
FormRefreshStopTime = Time()
|
||||
|
||||
WOMatCreateDuration = WOMatCreateStopTime - WOMatCreateStartTime
|
||||
FormRefreshDuration = FormRefreshStopTime - FormRefreshStartTime
|
||||
TotalDuration = WOMatCreateDuration + FormRefreshDuration
|
||||
|
||||
If Unassigned(NewCassetteCnt) then
|
||||
NewCassetteCnt = NewCassetteCnt = COUNT(ScanResults<COL$CASS_NO>,@VM) + (ScanResults<COL$CASS_NO> NE '')
|
||||
end
|
||||
|
||||
NumCass = NewCassetteCnt
|
||||
|
||||
LogData = ''
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
|
||||
LogData<2> = WONo
|
||||
LogData<3> = @User4
|
||||
LogData<4> = NumCass
|
||||
LogData<4> = NewCassetteCnt
|
||||
LogData<5> = WOMatCreateDuration
|
||||
LogData<6> = FormRefreshDuration
|
||||
LogData<7> = TotalDuration
|
||||
|
||||
If NumCass GT 0 then
|
||||
LogData<8> = TotalDuration / NumCass
|
||||
If (NewCassetteCnt GT 0) then
|
||||
LogData<8> = TotalDuration / NewCassetteCnt
|
||||
end else
|
||||
LogData<8> = 'N/A'
|
||||
end
|
||||
|
||||
Logging_Services('AppendLog', objReceiveLog, LogData, @RM, @FM)
|
||||
|
||||
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'UpdateWorkOrderData':SD$:WONo)
|
||||
|
||||
Post_Event(@Window, 'READ')
|
||||
end
|
||||
|
||||
RETURN
|
||||
|
||||
***********************************************************************************************************************************************************
|
||||
|
||||
* * * * * * *
|
||||
RecGaN:
|
||||
* * * * * * *
|
||||
@ -890,6 +719,7 @@ FOR I = 1 TO WOMatReq
|
||||
WOMatKeys = INSERT(WOMatKeys,1,NewPos,0,WOMatKey)
|
||||
END
|
||||
|
||||
ErrorMsg = ''
|
||||
|
||||
IF ScanResults<1,I> NE '' THEN
|
||||
|
||||
@ -897,9 +727,7 @@ FOR I = 1 TO WOMatReq
|
||||
|
||||
WOMatRec = obj_Tables('ReadRec',otParms) ;* WOMat record may be an outbound on
|
||||
|
||||
IF Get_Status(errCode) THEN
|
||||
DEBUG
|
||||
END
|
||||
IF Get_Status(errCode) THEN ErrorMsg = 'Error in COMM_WO_REC("RecGaN"). Error message: ':errCode
|
||||
|
||||
IF WOMatRec NE '' THEN WOMatExists = 1
|
||||
|
||||
@ -948,9 +776,7 @@ FOR I = 1 TO WOMatReq
|
||||
otParms = FIELDSTORE(otParms,@RM,4,0,WOMatRec)
|
||||
obj_Tables('WriteRec',otParms)
|
||||
|
||||
IF Get_Status(errCode) THEN
|
||||
DEBUG
|
||||
END
|
||||
IF Get_Status(errCode) THEN ErrorMsg = 'Error in COMM_WO_REC("RecGaN"). Error message: ':errCode
|
||||
|
||||
END ELSE
|
||||
|
||||
@ -978,18 +804,12 @@ FOR I = 1 TO WOMatReq
|
||||
|
||||
WOMatRec<WO_MAT_PROD_VER_NO$> = ProdVerNo
|
||||
WOMatRec<WO_MAT_SUB_SUPPL_BY$> = SubSuppBy
|
||||
WOMatRec<WO_MAT_MU_WAFER_FLAG$> = MUWaferFlag
|
||||
WOMatRec<WO_MAT_RET_REJECTS$> = RetRejects
|
||||
WOMatRec<WO_MAT_CASS_SHIP_QTY$> = CassShipQty
|
||||
WOMatRec<WO_MAT_MIN_CASS_SHIP_QTY$> = MinCassShipQty
|
||||
WOMatRec<WO_MAT_SHIP_SHORT$> = ShipShort
|
||||
WOMatRec<WO_MAT_SIG_PROFILE$> = obj_WO_Mat('CassSigProfile',WOMatKey) ;*******************
|
||||
|
||||
|
||||
WaferCnt = WOMatRec<WO_MAT_WAFER_QTY$> ;* Changed to add slots for both EpiPRO and standard reactor types 8/13/2010 JCH
|
||||
ShipCnt = WOMatRec<WO_MAT_CASS_SHIP_QTY$>
|
||||
|
||||
|
||||
BEGIN CASE
|
||||
CASE ShipCnt = '' ; SlotCnt = WaferCnt
|
||||
CASE WaferCnt > ShipCnt ; SlotCnt = WaferCnt
|
||||
@ -1004,9 +824,7 @@ FOR I = 1 TO WOMatReq
|
||||
otParms = FIELDSTORE(otParms,@RM,4,0,WOMatRec)
|
||||
obj_Tables('WriteRec',otParms)
|
||||
|
||||
IF Get_Status(errCode) THEN
|
||||
DEBUG
|
||||
END
|
||||
IF Get_Status(errCode) THEN ErrorMsg = 'Error in COMM_WO_REC("RecGaN"). Error message: ':errCode
|
||||
|
||||
END ;* End of check for existing WO_MAT record
|
||||
|
||||
@ -1024,14 +842,9 @@ FOR I = 1 TO WOMatReq
|
||||
|
||||
WOMatRec<WO_MAT_PROD_VER_NO$> = ProdVerNo
|
||||
WOMatRec<WO_MAT_SUB_SUPPL_BY$> = SubSuppBy
|
||||
WOMatRec<WO_MAT_MU_WAFER_FLAG$> = MUWaferFlag
|
||||
WOMatRec<WO_MAT_RET_REJECTS$> = RetRejects
|
||||
WOMatRec<WO_MAT_CASS_SHIP_QTY$> = CassShipQty
|
||||
WOMatRec<WO_MAT_MIN_CASS_SHIP_QTY$> = MinCassShipQty
|
||||
WOMatRec<WO_MAT_SHIP_SHORT$> = ShipShort
|
||||
WOMatRec<WO_MAT_SIG_PROFILE$> = obj_WO_Mat('CassSigProfile',WOMatKey)
|
||||
|
||||
|
||||
SlotCnt = WOMatRec<WO_MAT_CASS_SHIP_QTY$>
|
||||
|
||||
FOR S = 1 TO SlotCnt
|
||||
@ -1041,9 +854,7 @@ FOR I = 1 TO WOMatReq
|
||||
otParms = 'WO_MAT':@RM:WOMatKey:@RM:@RM:WOMatRec
|
||||
obj_Tables('WriteRec',otParms)
|
||||
|
||||
IF Get_Status(errCode) THEN
|
||||
DEBUG
|
||||
END
|
||||
IF Get_Status(errCode) THEN ErrorMsg = 'Error in COMM_WO_REC("RecGaN"). Error message: ':errCode
|
||||
|
||||
NextOutCassNo += 1
|
||||
|
||||
@ -1051,9 +862,9 @@ FOR I = 1 TO WOMatReq
|
||||
|
||||
NEXT I
|
||||
|
||||
|
||||
Msg(@WINDOW,MsgUp) ;* Take down processing message
|
||||
|
||||
If ErrorMsg NE '' then Msg(@Window, '', 'OK', '', 'Process Error':@FM:ErrorMsg)
|
||||
|
||||
IF LastInCassNo > 0 THEN
|
||||
|
||||
@ -1089,7 +900,6 @@ IF LastInCassNo > 0 THEN
|
||||
|
||||
END ;* End of check for previously received material
|
||||
|
||||
|
||||
Set_Property(CtrlEntID,'DEFPROP',ScanResults)
|
||||
|
||||
IF ScanResults NE '' THEN
|
||||
@ -1118,7 +928,6 @@ Send_Event(@WINDOW,'WRITE')
|
||||
|
||||
obj_AppWindow('LoadFormKeys','WO_REC':@RM:WONo)
|
||||
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
@ -213,4 +213,3 @@ UpdateHALItem:
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
|
@ -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,12 +8,14 @@ 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
|
||||
|
||||
Main:
|
||||
|
||||
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
|
||||
Lock hSysLists, 'Copy_Backlog_Records_To_SQL' then
|
||||
|
||||
@ -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
|
||||
@ -101,4 +102,3 @@ end
|
||||
|
||||
Return
|
||||
|
||||
|
||||
|
47
LSL2/STPROC/COPY_LOT_EVENT_RECORD_TO_SQL.txt
Normal file
47
LSL2/STPROC/COPY_LOT_EVENT_RECORD_TO_SQL.txt
Normal file
@ -0,0 +1,47 @@
|
||||
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"):@FM
|
||||
DataFields := "CHRON_ID" :@VM:SQL_Format(Rec(LOT_EVENT_CHRON_ID$), "INT")
|
||||
|
||||
// Symbolics
|
||||
|
||||
// Write the data to the SQL database
|
||||
Ans = SQL_Write(Connection, "LOT_EVENT", Keys, DataFields);
|
||||
|
||||
//-------------------------------------------------------------------------------------------------
|
||||
// Multi-valued Fields
|
||||
|
||||
Return Ans
|
||||
|
35
LSL2/STPROC/COPY_LOT_EVENT_TYPE_RECORD_TO_SQL.txt
Normal file
35
LSL2/STPROC/COPY_LOT_EVENT_TYPE_RECORD_TO_SQL.txt
Normal 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
|
57
LSL2/STPROC/COPY_LOT_OPERATION_RECORD_TO_SQL.txt
Normal file
57
LSL2/STPROC/COPY_LOT_OPERATION_RECORD_TO_SQL.txt
Normal file
@ -0,0 +1,57 @@
|
||||
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(25)
|
||||
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
|
||||
|
51
LSL2/STPROC/COPY_LOT_RECORD_TO_SQL.txt
Normal file
51
LSL2/STPROC/COPY_LOT_RECORD_TO_SQL.txt
Normal 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
|
||||
|
43
LSL2/STPROC/COPY_OPERATION_RECORD_TO_SQL.txt
Normal file
43
LSL2/STPROC/COPY_OPERATION_RECORD_TO_SQL.txt
Normal 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
|
@ -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,19 +7,25 @@ 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
|
||||
|
||||
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
|
||||
@ -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
|
||||
@ -103,4 +108,3 @@ end
|
||||
|
||||
Return
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
||||
Main:
|
||||
|
||||
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
|
||||
@ -112,8 +122,8 @@ Locate Table in TablesToSkip by "AL" using "," setting ListPos else
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Return Ans
|
||||
|
||||
|
||||
|
||||
|
@ -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
|
||||
@ -57,6 +57,9 @@ DataFields := "PROD_ORD_NO_TMP" :@VM:SQL_Format(Rec(WO_LOG_PROD_ORD_NO_TMP$),
|
||||
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
|
||||
|
||||
|
@ -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
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
30
LSL2/STPROC/DELETE_LOT_EVENT_RECORD_FROM_SQL.txt
Normal file
30
LSL2/STPROC/DELETE_LOT_EVENT_RECORD_FROM_SQL.txt
Normal file
@ -0,0 +1,30 @@
|
||||
Compile function Delete_LOT_EVENT_Record_From_SQL(Connection, Key, Record)
|
||||
|
||||
/*****************************************************************************\
|
||||
Deletes the given LOT_EVENT record from the MSSQL database.
|
||||
|
||||
History
|
||||
-------
|
||||
08/15/2025 DJS Original Programmer
|
||||
\*****************************************************************************/
|
||||
|
||||
Declare function SQL_Delete, SQL_Format
|
||||
Ans = ""
|
||||
|
||||
// List of key names and their values
|
||||
Keys = "LOT_EVENT_ID":@VM:SQL_Format(Key, "STR")
|
||||
|
||||
//-------------------------------------------------------------------------------------------------
|
||||
// Multi-valued Fields
|
||||
|
||||
!! Delete records from MV tables first !!
|
||||
|
||||
// Currently no multi-value (child) tables
|
||||
|
||||
// LOT_EVENT
|
||||
If Ans EQ "" then
|
||||
Ans = SQL_Delete(Connection, "LOT_EVENT", Keys)
|
||||
end
|
||||
|
||||
Return Ans
|
||||
|
30
LSL2/STPROC/DELETE_LOT_EVENT_TYPE_RECORD_FROM_SQL.txt
Normal file
30
LSL2/STPROC/DELETE_LOT_EVENT_TYPE_RECORD_FROM_SQL.txt
Normal file
@ -0,0 +1,30 @@
|
||||
Compile function Delete_LOT_EVENT_TYPE_Record_From_SQL(Connection, Key, Record)
|
||||
|
||||
/*****************************************************************************\
|
||||
Deletes the given LOT_EVENT_TYPE record from the MSSQL database.
|
||||
|
||||
History
|
||||
-------
|
||||
08/15/2025 DJS Original Programmer
|
||||
\*****************************************************************************/
|
||||
|
||||
Declare function SQL_Delete, SQL_Format
|
||||
Ans = ""
|
||||
|
||||
// List of key names and their values
|
||||
Keys = "LOT_EVENT_TYPE_ID":@VM:SQL_Format(Key, "STR")
|
||||
|
||||
//-------------------------------------------------------------------------------------------------
|
||||
// Multi-valued Fields
|
||||
|
||||
!! Delete records from MV tables first !!
|
||||
|
||||
// Currently no multi-value (child) tables
|
||||
|
||||
// LOT_EVENT_TYPE
|
||||
If Ans EQ "" then
|
||||
Ans = SQL_Delete(Connection, "LOT_EVENT_TYPE", Keys)
|
||||
end
|
||||
|
||||
Return Ans
|
||||
|
30
LSL2/STPROC/DELETE_LOT_OPERATION_RECORD_FROM_SQL.txt
Normal file
30
LSL2/STPROC/DELETE_LOT_OPERATION_RECORD_FROM_SQL.txt
Normal file
@ -0,0 +1,30 @@
|
||||
Compile function Delete_LOT_OPERATION_Record_From_SQL(Connection, Key, Record)
|
||||
|
||||
/*****************************************************************************\
|
||||
Deletes the given LOT_OPERATION record from the MSSQL database.
|
||||
|
||||
History
|
||||
-------
|
||||
08/15/2025 DJS Original Programmer
|
||||
\*****************************************************************************/
|
||||
|
||||
Declare function SQL_Delete, SQL_Format
|
||||
Ans = ""
|
||||
|
||||
// List of key names and their values
|
||||
Keys = "LOT_OPERATION_ID":@VM:SQL_Format(Key, "STR")
|
||||
|
||||
//-------------------------------------------------------------------------------------------------
|
||||
// Multi-valued Fields
|
||||
|
||||
!! Delete records from MV tables first !!
|
||||
|
||||
// Currently no multi-value (child) tables
|
||||
|
||||
// LOT_OPERATION
|
||||
If Ans EQ "" then
|
||||
Ans = SQL_Delete(Connection, "LOT_OPERATION", Keys)
|
||||
end
|
||||
|
||||
Return Ans
|
||||
|
30
LSL2/STPROC/DELETE_LOT_RECORD_FROM_SQL.txt
Normal file
30
LSL2/STPROC/DELETE_LOT_RECORD_FROM_SQL.txt
Normal file
@ -0,0 +1,30 @@
|
||||
Compile function Delete_LOT_Record_From_SQL(Connection, Key, Record)
|
||||
|
||||
/*****************************************************************************\
|
||||
Deletes the given LOT record from the MSSQL database.
|
||||
|
||||
History
|
||||
-------
|
||||
08/15/2025 DJS Original Programmer
|
||||
\*****************************************************************************/
|
||||
|
||||
Declare function SQL_Delete, SQL_Format
|
||||
Ans = ""
|
||||
|
||||
// List of key names and their values
|
||||
Keys = "LOT_ID":@VM:SQL_Format(Key, "STR")
|
||||
|
||||
//-------------------------------------------------------------------------------------------------
|
||||
// Multi-valued Fields
|
||||
|
||||
!! Delete records from MV tables first !!
|
||||
|
||||
// Currently no multi-value (child) tables
|
||||
|
||||
// LOT
|
||||
If Ans EQ "" then
|
||||
Ans = SQL_Delete(Connection, "LOT", Keys)
|
||||
end
|
||||
|
||||
Return Ans
|
||||
|
30
LSL2/STPROC/DELETE_OPERATION_RECORD_FROM_SQL.txt
Normal file
30
LSL2/STPROC/DELETE_OPERATION_RECORD_FROM_SQL.txt
Normal file
@ -0,0 +1,30 @@
|
||||
Compile function Delete_OPERATION_Record_From_SQL(Connection, Key, Record)
|
||||
|
||||
/*****************************************************************************\
|
||||
Deletes the given OPERATION record from the MSSQL database.
|
||||
|
||||
History
|
||||
-------
|
||||
08/15/2025 DJS Original Programmer
|
||||
\*****************************************************************************/
|
||||
|
||||
Declare function SQL_Delete, SQL_Format
|
||||
Ans = ""
|
||||
|
||||
// List of key names and their values
|
||||
Keys = "OPERATION_ID":@VM:SQL_Format(Key, "STR")
|
||||
|
||||
//-------------------------------------------------------------------------------------------------
|
||||
// Multi-valued Fields
|
||||
|
||||
!! Delete records from MV tables first !!
|
||||
|
||||
// Currently no multi-value (child) tables
|
||||
|
||||
// OPERATION
|
||||
If Ans EQ "" then
|
||||
Ans = SQL_Delete(Connection, "OPERATION", Keys)
|
||||
end
|
||||
|
||||
Return Ans
|
||||
|
@ -18,18 +18,26 @@ 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
|
||||
|
||||
Main:
|
||||
|
||||
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
|
||||
|
||||
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"
|
||||
|
||||
@ -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
|
||||
@ -78,6 +86,9 @@ end
|
||||
// Always log the result
|
||||
|
||||
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'
|
||||
@ -93,6 +104,9 @@ If Assigned(pKey) then
|
||||
Write Log to hLog, CurrDate
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Return Ans
|
||||
|
||||
|
@ -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"
|
||||
|
||||
|
@ -94,4 +94,3 @@ API engineinfo.ID.GET
|
||||
end
|
||||
|
||||
end api
|
||||
|
||||
|
@ -36,7 +36,7 @@ Function Environment_Services(@Service, @Params)
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$insert LOGICAL
|
||||
$insert APP_INSERTS
|
||||
$insert SERVICE_SETUP
|
||||
$insert SRPMail_Inserts
|
||||
|
||||
@ -84,7 +84,7 @@ Service IsProd()
|
||||
|
||||
Machine = Environment_Services('GetServer')
|
||||
IsProd = False$
|
||||
If Machine _NEC "messa012" and Machine _NEC "mestsa01ec" and Machine _NEC "mestsa09ec" and Machine _NEC "mestsa010ec" and Machine _NEC "mestsa011ec" and Machine _NEC "mestsa012ec" and Machine _NEC "MESTST1010" and Machine _NEC "MESTST1009" then
|
||||
If Machine _NEC "messa012" and Machine _NEC "mestsa01ec" and Machine _NEC "mestsa09ec" and Machine _NEC "mestsa010ec" and Machine _NEC "mestsa011ec" and Machine _NEC "mestsa012ec" and Machine _NEC "mestsa024ec" and Machine _NEC "MESTST1010" and Machine _NEC "MESTST1009" then
|
||||
IsProd = True$
|
||||
end
|
||||
Response = IsProd
|
||||
@ -123,6 +123,7 @@ Service GetApplicationRootIP()
|
||||
Case Machine EQ 'MESTSA010EC' ; ApplicationRootIP = '\\10.95.140.63'
|
||||
Case Machine EQ 'MESTSA011EC' ; ApplicationRootIP = '\\10.95.140.64'
|
||||
Case Machine EQ 'MESTSA012EC' ; ApplicationRootIP = '\\10.95.140.65'
|
||||
Case Machine EQ 'MESTSA024EC' ; ApplicationRootIP = '\\10.95.140.66'
|
||||
Case Machine EQ 'MESSA012' ; ApplicationRootIP = '\\10.95.176.50'
|
||||
Case Machine EQ 'MESST5201' ; ApplicationRootIP = '\\10.95.140.14'
|
||||
Case Machine EQ 'MESST5202' ; ApplicationRootIP = '\\10.95.140.14'
|
||||
@ -325,6 +326,7 @@ Service GetLocalRootPath()
|
||||
Case Machine EQ 'MESTSA010EC' ; LocalRootPath = 'D:'
|
||||
Case Machine EQ 'MESTSA011EC' ; LocalRootPath = 'D:'
|
||||
Case Machine EQ 'MESTSA012EC' ; LocalRootPath = 'D:'
|
||||
Case Machine EQ 'MESTSA024EC' ; LocalRootPath = 'D:'
|
||||
Case Machine EQ 'MESST6501' ; LocalRootPath = 'C:' ; // This is a map to the user's actual C drive.
|
||||
Case Machine EQ 'MESST6502' ; LocalRootPath = 'C:' ; // This is a map to the user's actual C drive.
|
||||
Case Machine EQ 'MESTST1006' ; LocalRootPath = 'C:' ; // This is a map to the user's actual C drive.
|
||||
@ -553,6 +555,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
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
@ -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
@ -69,4 +69,3 @@ API healthinfo.GET
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
|
@ -46,19 +46,19 @@ Compile function Hold_Services(@Service, @Params)
|
||||
|
||||
***********************************************************************************************************************/
|
||||
#pragma precomp SRP_PreCompiler
|
||||
$insert LOGICAL
|
||||
$Insert SERVICE_SETUP
|
||||
|
||||
$Insert APP_INSERTS
|
||||
$Insert SERVICE_SETUP
|
||||
$Insert MSG_EQUATES
|
||||
$Insert DICT_EQUATES
|
||||
$Insert WO_MAT_EQUATES
|
||||
$INSERT NOTIFICATION_EQU
|
||||
|
||||
$Insert NOTIFICATION_EQU
|
||||
|
||||
Declare function Database_Services, Error_Services, Obj_Wm_In, Obj_Wm_Out, Unassigned, Wm_In_Services, Wm_Out_Services
|
||||
Declare function PSN_Services, SRP_Rotate_Array, Datetime, Hold_Services, Memberof, Error_Services, Rds_Services
|
||||
Declare function Environment_Services, Utility, Logging_Services
|
||||
Declare subroutine Database_Services, Error_Services, Obj_notes, Hold_Services, Obj_Wm_In, Obj_Wm_Out, Wm_In_Services
|
||||
Declare subroutine Wm_Out_Services, Rds_Services, Lot_Event_Services
|
||||
Declare subroutine Wm_Out_Services, Rds_Services, Lot_Event_Services, Logging_Services
|
||||
|
||||
GoToService else
|
||||
Error_Services('Add', Service : ' is not a valid service request within the ' : ServiceModule : ' module.')
|
||||
@ -361,29 +361,42 @@ Service OnHold(WOMatKey, HoldEntity, HoldEntityID, HoldType, HoldData, OperatorI
|
||||
If Error_Services("NoError") then
|
||||
Hold_Services("HoldNotification", HoldEntity, HoldEntityID, Reason, True$, HoldType, OperatorID)
|
||||
Hold_Services("CreateComment", HoldEntity, HoldEntityID, Reason, True$, HoldType, OperatorID)
|
||||
//Add in logging lot event
|
||||
If UserId EQ '' then
|
||||
UserId = OperatorId
|
||||
end
|
||||
LotKey = ''
|
||||
Begin Case
|
||||
Case HoldEntity EQ 'WM_IN'
|
||||
WONo = Field(WOMatKey, '*', 1)
|
||||
StepNo = 1
|
||||
CassNo = Field(WOMatKey, '*', 2)
|
||||
WMInKey = WONo : '*' : StepNo : '*' : CassNo
|
||||
Lot_Event_Services('CreateLotEvent', WMInKey, CurrDTM, 'HOLD_ON', 'Lot placed on hold.', '', UserId, True$, 'WM_IN')
|
||||
LotKey = 'I':WMInKey
|
||||
Convert '*' to '.' in LotKey
|
||||
Case HoldEntity EQ 'WM_OUT'
|
||||
WONo = Field(WOMatKey, '*', 1)
|
||||
StepNo = 1
|
||||
CassNo = Field(WOMatKey, '*', 2)
|
||||
WMOutKey = WONo : '*' : StepNo : '*' : CassNo
|
||||
Lot_Event_Services('CreateLotEvent', WMOutKey, CurrDTM, 'HOLD_ON', 'Lot placed on hold.', '', UserId, True$, 'WM_OUT')
|
||||
LotKey = 'O':WMOutKey
|
||||
Convert '*' to '.' in LotKey
|
||||
Case HoldEntity EQ 'RDS'
|
||||
RDSNo = Xlate('WO_MAT', WOMatKey, WO_MAT_RDS_NO$, 'X')
|
||||
Lot_Event_Services('CreateLotEvent', RDSNo, CurrDTM, 'HOLD_ON', 'Lot placed on hold.', '', UserId, True$, 'RDS')
|
||||
LotKey = 'R':RDSNo
|
||||
Convert '*' to '.' in LotKey
|
||||
Case HoldEntity EQ 'WO_MAT'
|
||||
Lot_Event_Services('CreateLotEvent', WOMatKey, CurrDTM, 'HOLD_ON', 'Lot placed on hold.', '', UserId, True$, 'WO_MAT')
|
||||
LotKey = 'W':WOMatKey
|
||||
Convert '*' to '.' in LotKey
|
||||
End Case
|
||||
Machine = Environment_Services('GetServer')
|
||||
Headers = 'Logging DTM' : @FM : 'Machine' : @FM : 'Log'
|
||||
ColumnWidths = 20 : @FM : 15 : @FM : 300
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Lot'
|
||||
makeDirSuccess = Utility("MAKEDIR", LogPath)
|
||||
LogFileName = LotKey:'.csv'
|
||||
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ' ', Headers, ColumnWidths, False$, False$)
|
||||
LogData = ''
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS') ; // Logging DTM
|
||||
LogData<2> = Machine
|
||||
LogData<3> = 'Lot ':LotKey:' of type ':HoldEntity:' placed on hold by user ':OperatorId
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Lot is already on hold.')
|
||||
@ -497,29 +510,43 @@ Service OffHold(WOMatKey, HoldEntity, HoldEntityID, HoldType, HoldData, Operator
|
||||
If Error_Services("NoError") then
|
||||
Hold_Services("HoldNotification", HoldEntity, HoldEntityID, Reason, False$, HoldType, OperatorID)
|
||||
Hold_Services("CreateComment", HoldEntity, HoldEntityID, Reason, False$, HoldType, OperatorID)
|
||||
//Add in logging lot event
|
||||
if UserID EQ '' then
|
||||
UserId = OperatorId
|
||||
end
|
||||
LotKey = ''
|
||||
Begin Case
|
||||
Case HoldEntity EQ 'WM_IN'
|
||||
WONo = Field(WOMatKey, '*', 1)
|
||||
StepNo = 1
|
||||
CassNo = Field(WOMatKey, '*', 2)
|
||||
WMInKey = WONo : '*' : StepNo : '*' : CassNo
|
||||
Lot_Event_Services('CreateLotEvent', WMInKey, CurrDTM, 'HOLD_OFF', 'Lot taken off hold.', '', UserId, True$, 'WM_IN')
|
||||
LotKey = 'I':WMInKey
|
||||
Convert '*' to '.' in LotKey
|
||||
Case HoldEntity EQ 'WM_OUT'
|
||||
WONo = Field(WOMatKey, '*', 1)
|
||||
StepNo = 1
|
||||
CassNo = Field(WOMatKey, '*', 2)
|
||||
WMOutKey = WONo : '*' : StepNo : '*' : CassNo
|
||||
Lot_Event_Services('CreateLotEvent', WMOutKey, CurrDTM, 'HOLD_OFF', 'Lot taken off hold.', '', UserId, True$, 'WM_OUT')
|
||||
LotKey = 'O':WMOutKey
|
||||
Convert '*' to '.' in LotKey
|
||||
Case HoldEntity EQ 'RDS'
|
||||
RDSNo = Xlate('WO_MAT', WOMatKey, WO_MAT_RDS_NO$, 'X')
|
||||
Lot_Event_Services('CreateLotEvent', RDSNo, CurrDTM, 'HOLD_OFF', 'Lot taken off hold.', '', UserId, True$, 'RDS')
|
||||
LotKey = 'R':RDSNo
|
||||
Case HoldEntity EQ 'WO_MAT'
|
||||
Lot_Event_Services('CreateLotEvent', WOMatKey, CurrDTM, 'HOLD_OFF', 'Lot taken off hold.', '', UserId, True$, 'WO_MAT')
|
||||
LotKey = WOMatKey
|
||||
Convert '*' to '.' in LotKey
|
||||
End Case
|
||||
|
||||
Machine = Environment_Services('GetServer')
|
||||
Headers = 'Logging DTM' : @FM : 'Machine' : @FM : 'Log'
|
||||
ColumnWidths = 20 : @FM : 15 : @FM : 300
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Lot'
|
||||
makeDirSuccess = Utility("MAKEDIR", LogPath)
|
||||
LogFileName = LotKey:'.csv'
|
||||
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ' ', Headers, ColumnWidths, False$, False$)
|
||||
|
||||
LogData = ''
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS') ; // Logging DTM
|
||||
LogData<2> = Machine
|
||||
LogData<3> = 'Lot ':LotKey:' of type ':HoldEntity:' taken off hold by user ':OperatorId
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Lot is not on hold.')
|
||||
|
@ -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
|
||||
|
@ -161,7 +161,3 @@ API Lock.HEAD
|
||||
end
|
||||
|
||||
end api
|
||||
|
||||
|
||||
|
||||
|
||||
|
460
LSL2/STPROC/LOTOPERATION_API.txt
Normal file
460
LSL2/STPROC/LOTOPERATION_API.txt
Normal 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
|
@ -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
|
||||
|
||||
|
||||
|
@ -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, NextKey
|
||||
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,9 +68,9 @@ GoToService
|
||||
|
||||
Return Response or ""
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// SERVICES
|
||||
//-----------------------------------------------------------------------------
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// Services
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Service CreateLotEvent(LotId, EventDateTime, EventType=EVENT_TYPES, EventNote, EventEquipmentId, OperatorId, IsLegacyLotId=BOOLEAN, LegacyLotType=LEGACY_LOT_TYPES)
|
||||
|
||||
@ -41,8 +89,11 @@ Service CreateLotEvent(LotId, EventDateTime, EventType=EVENT_TYPES, EventNote, E
|
||||
end
|
||||
end
|
||||
If RowExists('LOT', LotId) then
|
||||
CurrLotOperation = Lot_Services('GetLotCurrOperationId', LotId)
|
||||
NewEventId = RTI_CreateGUID()
|
||||
If NewEventId NE '' then
|
||||
NextEventChronId = NextKey('LOT_EVENT')
|
||||
If NextEventChronId NE 0 then
|
||||
NewEventSequence = Lot_Event_Services('GetLotEventNextSequence', LotId)
|
||||
If Error_Services('NoError') then
|
||||
NewEventRec = ''
|
||||
@ -50,18 +101,24 @@ Service CreateLotEvent(LotId, EventDateTime, EventType=EVENT_TYPES, EventNote, E
|
||||
NewEventRec<LOT_EVENT_LOT_EVENT_TYPE$> = EventType
|
||||
NewEventRec<LOT_EVENT_EVENT_DATETIME$> = EventDatetime
|
||||
NewEventRec<LOT_EVENT_EVENT_NOTE$> = EventNote
|
||||
NewEventRec<LOT_EVENT_EVENT_OPERATION_ID$> = CurrLotOperation
|
||||
NewEventRec<LOT_EVENT_EQUIPMENT_ID$> = EventEquipmentId
|
||||
NewEventRec<LOT_EVENT_EVENT_OPERATOR_ID$> = OperatorId
|
||||
NewEventRec<LOT_EVENT_SEQUENCE$> = NewEventSequence
|
||||
NewEventRec<LOT_EVENT_CHRON_ID$> = NextEventChronId
|
||||
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
|
||||
end else
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMessage = 'Error creating new event. Error calling NextKey("LOT_EVENT") to get LOT_EVENT_CHRON_ID.'
|
||||
end
|
||||
end else
|
||||
ErrorMessage = 'Error creating an event Id.'
|
||||
end
|
||||
@ -89,6 +146,7 @@ Service CreateLotEvent(LotId, EventDateTime, EventType=EVENT_TYPES, EventNote, E
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service GetLotEventNextSequence(LotId)
|
||||
|
||||
ErrorMessage = ''
|
||||
@ -111,10 +169,14 @@ Service GetLotEventNextSequence(LotId)
|
||||
end else
|
||||
Error_Services('Add', ErrorMessage)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
// Returns a @FM delimited list of events in sequence
|
||||
Service GetLotEventsInSequence(LotId)
|
||||
|
||||
ErrorMsg = ''
|
||||
LotEventsUnsorted = ''
|
||||
LotEventsSorted = ''
|
||||
LotEventsToReturn = ''
|
||||
@ -126,11 +188,18 @@ Service GetLotEventsInSequence(LotId)
|
||||
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 +217,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 +239,7 @@ InitEventLog:
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
524
LSL2/STPROC/LOT_OPERATION_SERVICES.txt
Normal file
524
LSL2/STPROC/LOT_OPERATION_SERVICES.txt
Normal 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
@ -132,4 +132,3 @@ CreateHALItem:
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
|
@ -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,42 @@ 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'
|
||||
|
||||
// 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] = ''
|
||||
ValidCassetteID = False$ ; // Assume Cassette ID is not valid for now.
|
||||
DelimCount = DCount(ScanData, '|')
|
||||
Begin Case
|
||||
Case ( (ScanData[1, 2] EQ '1T') or (ScanData[1, 1] EQ 'O') or (ScanData[1, 1] EQ 'I') )
|
||||
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'
|
||||
@ -238,37 +282,82 @@ 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)
|
||||
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, 2] EQ '1T') or (ScanData[1, 1] EQ 'O') or (ScanData[1, 1] EQ 'I') )
|
||||
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 +371,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,7 +383,7 @@ Service ProcessPTOScanData(ScanData, ScanType = SCAN_TYPES_PTO, Param1, Param2)
|
||||
Begin Case
|
||||
|
||||
Case ScanType EQ 'LABEL1'
|
||||
//determine whether regular NEPP or EPP label scan
|
||||
// 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.
|
||||
@ -303,18 +391,16 @@ Service ProcessPTOScanData(ScanData, ScanType = SCAN_TYPES_PTO, Param1, Param2)
|
||||
// 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 +438,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,27 +458,26 @@ 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'
|
||||
@ -403,14 +486,15 @@ Service ProcessPTOScanData(ScanData, ScanType = SCAN_TYPES_PTO, Param1, Param2)
|
||||
// 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 +511,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 +584,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 +651,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 +714,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 +741,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 +751,7 @@ ToggleLotHold:
|
||||
|
||||
return
|
||||
|
||||
|
||||
SendPTOMismatchNotification:
|
||||
|
||||
// Send scan mismatch notification
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
||||
|
@ -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')
|
||||
@ -399,36 +414,27 @@ Service ImportMetrologyFiles(Machine)
|
||||
|
||||
Begin Case
|
||||
Case Machine _EQC 'Tencor'
|
||||
SearchPattern = '*.pdsf';
|
||||
DataPath = Environment_Services('GetApplicationRootPath') : '\Metrology\MET08DDUPSFS6420\Source\MET08DDUPSFS6420\'
|
||||
Case Machine _EQC 'HgCV'
|
||||
SearchPattern = '*.pdsf';
|
||||
DataPath = Environment_Services('GetApplicationRootPath') : '\Metrology\MET08RESIHGCV\Source\MET08RESIHGCV\'
|
||||
Case Machine _EQC 'CDE'
|
||||
SearchPattern = '*.pdsf';
|
||||
DataPath = Environment_Services('GetApplicationRootPath') : '\Metrology\MET08RESIMAPCDE\Source\MET08RESIMAPCDE\'
|
||||
Case Machine _EQC 'Biorad'
|
||||
SearchPattern = '*.txt';
|
||||
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';
|
||||
DataPath = Environment_Services('GetApplicationRootPath') : '\Metrology\MET08DDUPSP1TBI\Source\MET08DDUPSP1TBI\'
|
||||
Case Machine _EQC 'SPV'
|
||||
SearchPattern = '*.txt';
|
||||
DataPath = Environment_Services('GetApplicationRootPath') : '\Metrology\MET08RESISRP2100\Source\MET08RESISRP2100\'
|
||||
Case Machine _EQC 'SRP'
|
||||
SearchPattern = '*.txt';
|
||||
DataPath = Environment_Services('GetApplicationRootPath') : '\Metrology\MET08ANLYSDIFAAST230\Source\MET08ANLYSDIFAAST230\'
|
||||
Case Otherwise$
|
||||
SearchPattern = '*.txt';
|
||||
Error_Services('Add', 'Error in ':Service:' service. Unsupported Machine "':Machine:'" passed into service')
|
||||
End Case
|
||||
|
||||
If Error_Services('NoError') then
|
||||
|
||||
SearchPattern = '*.pdsf';
|
||||
InitDir DataPath:SearchPattern
|
||||
FileList = DirList()
|
||||
FileNames = ''
|
||||
@ -505,7 +511,6 @@ Service ImportMetrologyFiles(Machine)
|
||||
RepoPath = Environment_Services('GetApplicationRootPath') : '\Metrology\Run Data Repository\MET08ANLYSDIFAAST230\Source\MET08ANLYSDIFAAST230\'
|
||||
End Case
|
||||
|
||||
IF SearchPattern = '*.pdsf' THEN
|
||||
OSREAD Text FROM DataPath:FileName THEN
|
||||
json = Metrology_Services('GetJsonFromProcessDataStandardFormat', Text);
|
||||
END ELSE
|
||||
@ -516,31 +521,6 @@ Service ImportMetrologyFiles(Machine)
|
||||
END ELSE
|
||||
Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : 'Failed to get PDSF json');
|
||||
END
|
||||
END ELSE
|
||||
|
||||
OSREAD RunData FROM DataPath:FileName THEN
|
||||
Set_Status(0)
|
||||
OSWrite RunData to RepoPath:FileName
|
||||
status_code = ''
|
||||
If Get_Status(status_code) then
|
||||
ErrorMessage = 'Error writing run data file to repository: status_code = ' : status_code
|
||||
Metrology_Services('LogResults', '', Machine, 'UID001', Service : ' : ' : ErrorMessage)
|
||||
Set_Status(0)
|
||||
end
|
||||
|
||||
SWAP '|' WITH @VM IN RunData
|
||||
SWAP CRLF$ WITH @FM IN RunData
|
||||
|
||||
LOOP
|
||||
LastChar = RunData[-1,1]
|
||||
UNTIL LastChar NE @FM
|
||||
RunData[-1,1] = ''
|
||||
REPEAT
|
||||
Convert Tab$ to @FM in RunData
|
||||
END else
|
||||
Metrology_Services('LogResults', '', Machine, 'UID001', 'Read : ' : FileName : ', Size : ' : FileSize)
|
||||
end
|
||||
END
|
||||
|
||||
*************************
|
||||
* Import metrology data *
|
||||
@ -662,7 +642,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 +708,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 +765,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 +789,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 +878,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 +904,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 +956,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 +1111,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 +1379,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 +1411,6 @@ Service ImportCDEQualData(RunData, ResourceID, PSN)
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service ImportCDEData(RunData, ResourceID, IsViewerFile, PSN)
|
||||
|
||||
Machine = 'CDE'
|
||||
@ -1382,6 +1503,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 +1722,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 +1779,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 +1906,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 +1919,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 +2074,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 +2199,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
|
||||
@ -2020,28 +2306,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 +2330,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 +2339,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 +2394,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 +2843,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 +2876,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 +2978,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 +3109,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 +3646,3 @@ LoadRunDataToDatabase:
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
|
98
LSL2/STPROC/METTESTS_API.txt
Normal file
98
LSL2/STPROC/METTESTS_API.txt
Normal 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
|
257
LSL2/STPROC/MET_TEST_ACTIONS.txt
Normal file
257
LSL2/STPROC/MET_TEST_ACTIONS.txt
Normal 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
|
||||
|
||||
|
||||
|
||||
|
276
LSL2/STPROC/MET_TEST_DATA_ACTIONS.txt
Normal file
276
LSL2/STPROC/MET_TEST_DATA_ACTIONS.txt
Normal 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
|
||||
|
||||
|
||||
|
1280
LSL2/STPROC/MET_TEST_SERVICES.txt
Normal file
1280
LSL2/STPROC/MET_TEST_SERVICES.txt
Normal file
File diff suppressed because it is too large
Load Diff
@ -135,4 +135,3 @@ API monaengines.ID.GET
|
||||
end
|
||||
|
||||
end api
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user