Compare commits
138 Commits
06-16-a
...
extra-file
Author | SHA1 | Date | |
---|---|---|---|
51da9ef7c2 | |||
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
|
16
.vscode/.http
vendored
Normal file
16
.vscode/.http
vendored
Normal file
@ -0,0 +1,16 @@
|
||||
###
|
||||
|
||||
GET https://messa020ec.infineon.com/api/oiWizard/reactors
|
||||
Accept: application/json
|
||||
|
||||
###
|
||||
|
||||
GET https://messa020ec.infineon.com/api/oiWizard/materials/rds/1000416
|
||||
Accept: application/json
|
||||
|
||||
###
|
||||
|
||||
GET https://oi-metrology-viewer-prod.mes.infineon.com/api/InfinityQSV3/1750770474/header
|
||||
Accept: application/json
|
||||
|
||||
###
|
29
.vscode/.hurl
vendored
Normal file
29
.vscode/.hurl
vendored
Normal file
@ -0,0 +1,29 @@
|
||||
###
|
||||
|
||||
GET https://messa020ec.infineon.com/api/oiWizard/reactors
|
||||
Accept: application/json
|
||||
|
||||
HTTP 200
|
||||
[Asserts]
|
||||
header "Content-Type" == "application/hal+json"
|
||||
|
||||
###
|
||||
|
||||
GET https://messa020ec.infineon.com/api/oiWizard/materials/rds/1000416
|
||||
Accept: application/json
|
||||
|
||||
HTTP 200
|
||||
[Asserts]
|
||||
header "Content-Type" == "application/hal+json"
|
||||
|
||||
###
|
||||
|
||||
GET https://oi-metrology-viewer-prod.mes.infineon.com/api/InfinityQSV3/1750770474/header
|
||||
Accept: application/json
|
||||
|
||||
HTTP 200
|
||||
[Asserts]
|
||||
header "Content-Type" == "application/json; charset=utf-8"
|
||||
jsonpath "$.TotalRows" == 1
|
||||
|
||||
###
|
234
.vscode/.txt
vendored
Normal file
234
.vscode/.txt
vendored
Normal file
@ -0,0 +1,234 @@
|
||||
|
||||
// T:\met08resisrp2100\06_SourceCode\met08resisrp2100\Adaptation\FileHandlers\OpenInsight\FileRead.cs
|
||||
// x.Date // 001
|
||||
// x.Employee // 002
|
||||
// x.Recipe // 003
|
||||
// x.Reactor // 004
|
||||
// x.RDS // 005
|
||||
// x.PSN // 006
|
||||
// x.Layer // 007
|
||||
// x.Zone // 008
|
||||
|
||||
// T:\met08anlysdifaast230\06_SourceCode\met08anlysdifaast230\Adaptation\FileHandlers\OpenInsight\FileRead.cs
|
||||
// x.PSN // 001
|
||||
// x.Reactor // 002
|
||||
// logistics.MesEntity // 003
|
||||
// x.RDS // 004
|
||||
// x.Recipe // 005
|
||||
// x.Employee // 006
|
||||
// x.SlotNumber // 007
|
||||
|
||||
// T:\met08thftirstratus\06_SourceCode\met08thftirstratus\Adaptation\FileHandlers\OpenInsight\FileRead.cs
|
||||
// "Stratus_" // 001
|
||||
// x.Date // 002
|
||||
// logistics.JobID // 003
|
||||
// "FQA Thickness" // 004
|
||||
// x.Employee // 005
|
||||
// x.Recipe // 006
|
||||
// x.Reactor // 007
|
||||
// x.RDS // 008
|
||||
// x.PSN // 009
|
||||
// x.Lot // 010
|
||||
// x.Cassette // 011
|
||||
// x.MeanThickness // 012
|
||||
// descriptions[i].Slot // 013
|
||||
// descriptions[i].Mean // 014
|
||||
|
||||
// T:\met08thftirqs408m\06_SourceCode\met08thftirqs408m\Adaptation\FileHandlers\OpenInsight\FileRead.cs
|
||||
// Bio-Rad UniqueId // 001
|
||||
// Date // 002
|
||||
// ThicknessFourteenCriticalPointsAverage // 003
|
||||
// Recipe // 004
|
||||
// Reactor // 005
|
||||
// RDS // 006
|
||||
// PSN // 007
|
||||
// Layer // 008
|
||||
// Zone // 009
|
||||
// Cassette // 010
|
||||
// Wafer // 011
|
||||
// RVThickness // 012
|
||||
// Position // 013
|
||||
// Thickness // 014
|
||||
|
||||
// T:\met08resimapcde\06_SourceCode\met08resimapcde\Adaptation\FileHandlers\OpenInsight\FileRead.cs
|
||||
// x.UniqueId // 001
|
||||
// x.Run // 002
|
||||
// x.Date // 003
|
||||
// x.Lot // 004
|
||||
// x.Recipe // 005
|
||||
// x.Reactor // 006
|
||||
// x.RDS // 007
|
||||
// x.PSN // 008
|
||||
// x.Layer // 009
|
||||
// x.Zone // 010
|
||||
// logistics.MesEntity // 011
|
||||
// x.Employee // 012
|
||||
// x.Engineer // 013
|
||||
// x.DLRatio // 014
|
||||
// x.Temp // 015
|
||||
// x.AutoOptimizeGain // 016
|
||||
// x.AutoProbeHeightSet // 017
|
||||
// x.DataReject // 018
|
||||
// x.FileName // 019
|
||||
// x.Avg // 020
|
||||
// x.StdDev // 021
|
||||
// x.SemiRadial // 022
|
||||
// description.Pt // 023
|
||||
// description.R // 024
|
||||
// description.T // 025
|
||||
// description.Rs // 026
|
||||
// description.Merit // 027
|
||||
|
||||
// T:\met08resihgcv\06_SourceCode\met08resihgcv\Adaptation\FileHandlers\OpenInsight\FileRead.cs
|
||||
// x.UniqueId // 001
|
||||
// logistics.MesEntity // 002
|
||||
// x.Reactor // 003
|
||||
// x.RDS // 004
|
||||
// x.PSN // 005
|
||||
// x.Layer // 006
|
||||
// x.Zone // 007
|
||||
// x.Wafer // 008
|
||||
// x.Lot // 009
|
||||
// x.Plan // 010
|
||||
// x.Date // 011
|
||||
// x.WaferSize // 012
|
||||
// x.Ccomp // 013
|
||||
// x.Area // 014
|
||||
// x.CondType // 015
|
||||
// x.Model // 016
|
||||
// x.StartVoltage // 017
|
||||
// x.StopVoltage // 018
|
||||
// x.RampRate // 019
|
||||
// x.GLimit // 020
|
||||
// x.SetupFile // 021
|
||||
// x.SetupFile // 022
|
||||
// x.Folder // 023
|
||||
// x.Pattern // 024
|
||||
// x.RhoMethod // 025
|
||||
// x.NAvgMean // 026
|
||||
// x.NAvgStdDev // 027
|
||||
// x.NAvgRadialGradient // 028
|
||||
// x.NslMean // 029
|
||||
// x.NslStdDev // 030
|
||||
// x.NslRadialGradient // 031
|
||||
// x.VdMean // 032
|
||||
// x.VdStdDev // 033
|
||||
// x.VdRadialGradient // 034
|
||||
// x.FlatZMean // 035
|
||||
// x.FlatZStdDev // 036
|
||||
// x.FlatZRadialGradient // 037
|
||||
// x.RhoAvgMean // 038
|
||||
// x.RhoAvgStdDev // 039
|
||||
// x.RhoAvgRadialGradient // 040
|
||||
// x.RhoslMean // 041
|
||||
// x.RhoslStdDev // 042
|
||||
// x.RhoslRadialGradient // 043
|
||||
// x.PhaseMean // 044
|
||||
// x.PhaseStdDev // 045
|
||||
// x.PhaseRadialGradient // 046
|
||||
// x.GradeMean // 047
|
||||
// x.GradeStdDev // 048
|
||||
// x.GradeRadialGradient // 049
|
||||
// x.RsMean // 050
|
||||
// x.RsStdDev // 051
|
||||
// x.RsRadialGradient // 052
|
||||
// description.Index // 053
|
||||
// description.NAvg // 054
|
||||
// description.Nsl // 055
|
||||
// description.Vd // 056
|
||||
// description.FlatZ // 057
|
||||
// description.RhoAvg // 058
|
||||
// description.Rhosl // 059
|
||||
// description.Phase // 060
|
||||
// description.Grade // 061
|
||||
|
||||
// T:\met08ddupsfs6420\06_SourceCode\met08ddupsfs6420\Adaptation\FileHandlers\OpenInsight\FileRead.cs
|
||||
// x.AreaCountAvg // 001 - AreaCountAvg
|
||||
// x.AreaCountMax // 002 - AreaCountMax
|
||||
// x.AreaCountMin // 003 - AreaCountMin
|
||||
// x.AreaCountStdDev // 004 - AreaCountStdDev
|
||||
// x.AreaTotalAvg // 005 - AreaTotalAvg
|
||||
// x.AreaTotalMax // 006 - AreaTotalMax
|
||||
// x.AreaTotalMin // 007 - AreaTotalMin
|
||||
// x.AreaTotalStdDev // 008 - AreaTotalStdDev
|
||||
// x.Date // 009 -
|
||||
// x.HazeAverageAvg // 010 - Haze Average
|
||||
// x.HazeAverageMax // 011 -
|
||||
// x.HazeAverageMin // 012 -
|
||||
// x.HazeAverageStdDev // 013 -
|
||||
// x.HazeRegionAvg // 014 -
|
||||
// x.HazeRegionMax // 015 -
|
||||
// x.HazeRegionMin // 016 -
|
||||
// x.HazeRegionStdDev // 017 -
|
||||
// x.Lot // 018 -
|
||||
// x.LPDCM2Avg // 019 -
|
||||
// x.LPDCM2Max // 020 -
|
||||
// x.LPDCM2Min // 021 -
|
||||
// x.LPDCM2StdDev // 022 -
|
||||
// x.LPDCountAvg // 023 -
|
||||
// x.LPDCountMax // 024 -
|
||||
// x.LPDCM2Min // 025 -
|
||||
// x.LPDCountStdDev // 026 -
|
||||
// x.Employee // 027 -
|
||||
// x.RDS // 028 - Lot
|
||||
// x.Reactor // 029 - Process
|
||||
// x.Recipe // 030 - Part
|
||||
// x.ScratchCountAvg // 031 - Scratch Count
|
||||
// x.ScratchCountMax // 032 -
|
||||
// x.ScratchCountMin // 033 -
|
||||
// x.ScratchTotalStdDev // 034 -
|
||||
// x.ScratchTotalAvg // 035 - Scratch Length
|
||||
// x.ScratchTotalMax // 036 -
|
||||
// x.ScratchTotalMin // 037 -
|
||||
// x.ScratchTotalStdDev // 038 -
|
||||
// x.SumOfDefectsAvg // 039 - Average Sum of Defects
|
||||
// x.SumOfDefectsMax // 040 - Max Sum of Defects
|
||||
// x.SumOfDefectsMin // 041 - Min Sum of Defects
|
||||
// x.SumOfDefectsStdDev // 042 - SumOfDefectsStdDev
|
||||
// logistics.MesEntity // 043 -
|
||||
|
||||
// T:\met08ddupsp1tbi\06_SourceCode\met08ddupsp1tbi\Adaptation\FileHandlers\OpenInsight\FileRead.cs
|
||||
// x.DcnLpdMin // 001 -
|
||||
// x.DcnLpdMax // 002 -
|
||||
// x.DcnLpdMean // 003 - DCN LPD
|
||||
// x.DcnAreaCountMin // 004 -
|
||||
// x.DcnAreaCountMax // 005 -
|
||||
// x.DcnAreaCountMean // 006 - DCN Area
|
||||
// x.DcnAreaMin // 007 -
|
||||
// x.DcnAreaMax // 008 -
|
||||
// x.Date // 009 -
|
||||
// x.DcnHazeAvgMean // 010 - Haze Average
|
||||
// string.Empty // 011 -
|
||||
// string.Empty // 012 -
|
||||
// string.Empty // 013 -
|
||||
// string.Empty // 014 -
|
||||
// string.Empty // 015 -
|
||||
// string.Empty // 016 -
|
||||
// string.Empty // 017 -
|
||||
// string.Empty // 018 -
|
||||
// string.Empty // 019 -
|
||||
// string.Empty // 020 -
|
||||
// string.Empty // 021 -
|
||||
// string.Empty // 022 -
|
||||
// string.Empty // 023 -
|
||||
// string.Empty // 024 -
|
||||
// string.Empty // 025 -
|
||||
// string.Empty // 026 -
|
||||
// string.Empty // 027 -
|
||||
// x.RDS // 028 - Lot
|
||||
// x.Reactor // 029 - Process
|
||||
// x.Recipe // 030 - Part
|
||||
// x.DcnScrMean // 031 - Scratch Count
|
||||
// string.Empty // 032 -
|
||||
// string.Empty // 033 -
|
||||
// string.Empty // 034 -
|
||||
// x.DcnMicroScrMean // 035 - Scratch Length
|
||||
// string.Empty // 036 -
|
||||
// string.Empty // 037 -
|
||||
// string.Empty // 038 -
|
||||
// x.DcnAllMean // 039 - Average Sum of Defects
|
||||
// x.DcnAllMax // 040 - Max Sum of defects
|
||||
// x.DcnAllMin // 041 - Min Sum of Defects
|
||||
// string.Empty // 042 -
|
||||
// logistics.MesEntity // 043 -
|
||||
// x.DcnAreaMean // 044 - DCN MM2
|
6
.vscode/settings.json
vendored
Normal file
6
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"files.associations": {
|
||||
"*.txt": "vb",
|
||||
},
|
||||
"cSpell.words": []
|
||||
}
|
@ -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>": ""
|
||||
}
|
||||
}
|
||||
}
|
@ -1,152 +1,151 @@
|
||||
Function Authentication_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 : Authentication_API
|
||||
|
||||
Description : API logic for the Authentication 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 Authentication[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Authentication.POST
|
||||
- Authentication.ID.PUT
|
||||
- Authentication.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)
|
||||
07/17/24 djs Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert API_SETUP
|
||||
$insert HTTP_INSERTS
|
||||
$insert LSL_USERS_EQUATES
|
||||
|
||||
Equ USERNAME$ To 1
|
||||
Equ GROUP$ To 2
|
||||
Equ PASSWORD$ To 3
|
||||
Equ CONTEXT$ To 4
|
||||
|
||||
Declare function Database_Services, MemberOf
|
||||
|
||||
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 authentication.POST
|
||||
|
||||
Body = HTTP_Services('GetHTTPPostString')
|
||||
If Body NE '' then
|
||||
// The POST string will have been encoded so use percent (URL) decoding
|
||||
AuthJson = HTTP_Services('DecodePercentString', Body)
|
||||
hAuthJson = ''
|
||||
ParseResponse = SRP_JSON(hAuthJson, 'PARSE', AuthJson)
|
||||
If (ParseResponse EQ '') then
|
||||
Username = SRP_JSON(hAuthJson, 'GetValue', 'Username')
|
||||
Password = SRP_JSON(hAuthJson, 'GetValue', 'Password')
|
||||
Groups = ''
|
||||
hGroups = SRP_JSON(hAuthJson, 'get', 'Groups')
|
||||
If hGroups then
|
||||
ElementHandles = SRP_JSON(hGroups, 'GetElements', @VM)
|
||||
If ElementHandles NE '' then
|
||||
For each ElementHandle in ElementHandles using @VM
|
||||
Groups<0, -1> = SRP_JSON(ElementHandle, 'GetValue')
|
||||
SRP_JSON(ElementHandle, 'Release')
|
||||
Next ElementHandle
|
||||
end
|
||||
SRP_JSON(hGroups, 'Release')
|
||||
end
|
||||
SRP_JSON(hAuthJson, 'Release')
|
||||
// Validate Credentials
|
||||
UserRec = Database_Services('ReadDataRow', 'LSL_USERS', Username)
|
||||
If Error_Services('NoError') then
|
||||
Credentials = ''
|
||||
Credentials<USERNAME$> = Username
|
||||
Credentials<PASSWORD$> = UserRec<LSL_USERS_PASSWORD$>
|
||||
Credentials<GROUP$> = UserRec<LSL_USERS_GROUPS$>
|
||||
|
||||
Member = False$
|
||||
Group = ''
|
||||
If Groups NE '' then
|
||||
For each Group in Groups using @VM
|
||||
Member = MemberOf(Credentials<USERNAME$>, Group)
|
||||
Until Member EQ True$
|
||||
Next Group
|
||||
end else
|
||||
Member = True$
|
||||
end
|
||||
|
||||
Begin Case
|
||||
|
||||
Case (Password EQ Credentials<PASSWORD$>) AND (Member EQ True$)
|
||||
// Return 200, authentication successful
|
||||
StatusCode = 200
|
||||
Message = 'Authentication successful'
|
||||
HTTP_Services('SetResponseStatus', 200, Message)
|
||||
Case (Password EQ Credentials<PASSWORD$>) AND (Member EQ False$)
|
||||
// Return 401, not a member of required groups
|
||||
NumGroups = DCount(Groups, @VM)
|
||||
If NumGroups GT 1 then
|
||||
Swap @VM with ' or ' in Groups
|
||||
Message = 'User is not a member of the ' : Groups : ' groups.'
|
||||
end else
|
||||
Message = 'User is not a member of the ' : Group : ' group.'
|
||||
end
|
||||
HTTP_Services('SetResponseStatus', 401, 'Authentication failed. ':Message)
|
||||
|
||||
Case Password NE Credentials<PASSWORD$>
|
||||
// Return 401, unable to validate password
|
||||
Message = 'Unable to validate username. Please re-enter.'
|
||||
HTTP_Services('SetResponseStatus', 401, 'Authentication failed. ':Message)
|
||||
Case Otherwise$
|
||||
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Unhandled case.')
|
||||
End Case
|
||||
end else
|
||||
// Error reading user record
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': ErrorMsg)
|
||||
end
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 400, 'Error in the ' : CurrentAPI : ' API. Error parsing JSON.')
|
||||
end
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 400, 'Error in the ' : CurrentAPI : ' API. Empty request.')
|
||||
end
|
||||
|
||||
end api
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Function Authentication_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 : Authentication_API
|
||||
|
||||
Description : API logic for the Authentication 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 Authentication[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Authentication.POST
|
||||
- Authentication.ID.PUT
|
||||
- Authentication.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)
|
||||
07/17/24 djs Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert API_SETUP
|
||||
$insert HTTP_INSERTS
|
||||
$insert LSL_USERS_EQUATES
|
||||
|
||||
Equ USERNAME$ To 1
|
||||
Equ GROUP$ To 2
|
||||
Equ PASSWORD$ To 3
|
||||
Equ CONTEXT$ To 4
|
||||
|
||||
Declare function Database_Services, MemberOf
|
||||
|
||||
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 authentication.POST
|
||||
|
||||
Body = HTTP_Services('GetHTTPPostString')
|
||||
If Body NE '' then
|
||||
// The POST string will have been encoded so use percent (URL) decoding
|
||||
AuthJson = HTTP_Services('DecodePercentString', Body)
|
||||
hAuthJson = ''
|
||||
ParseResponse = SRP_JSON(hAuthJson, 'PARSE', AuthJson)
|
||||
If (ParseResponse EQ '') then
|
||||
Username = SRP_JSON(hAuthJson, 'GetValue', 'Username')
|
||||
Password = SRP_JSON(hAuthJson, 'GetValue', 'Password')
|
||||
Groups = ''
|
||||
hGroups = SRP_JSON(hAuthJson, 'get', 'Groups')
|
||||
If hGroups then
|
||||
ElementHandles = SRP_JSON(hGroups, 'GetElements', @VM)
|
||||
If ElementHandles NE '' then
|
||||
For each ElementHandle in ElementHandles using @VM
|
||||
Groups<0, -1> = SRP_JSON(ElementHandle, 'GetValue')
|
||||
SRP_JSON(ElementHandle, 'Release')
|
||||
Next ElementHandle
|
||||
end
|
||||
SRP_JSON(hGroups, 'Release')
|
||||
end
|
||||
SRP_JSON(hAuthJson, 'Release')
|
||||
// Validate Credentials
|
||||
UserRec = Database_Services('ReadDataRow', 'LSL_USERS', Username)
|
||||
If Error_Services('NoError') then
|
||||
Credentials = ''
|
||||
Credentials<USERNAME$> = Username
|
||||
Credentials<PASSWORD$> = UserRec<LSL_USERS_PASSWORD$>
|
||||
Credentials<GROUP$> = UserRec<LSL_USERS_GROUPS$>
|
||||
|
||||
Member = False$
|
||||
Group = ''
|
||||
If Groups NE '' then
|
||||
For each Group in Groups using @VM
|
||||
Member = MemberOf(Credentials<USERNAME$>, Group)
|
||||
Until Member EQ True$
|
||||
Next Group
|
||||
end else
|
||||
Member = True$
|
||||
end
|
||||
|
||||
Begin Case
|
||||
|
||||
Case (Password EQ Credentials<PASSWORD$>) AND (Member EQ True$)
|
||||
// Return 200, authentication successful
|
||||
StatusCode = 200
|
||||
Message = 'Authentication successful'
|
||||
HTTP_Services('SetResponseStatus', 200, Message)
|
||||
Case (Password EQ Credentials<PASSWORD$>) AND (Member EQ False$)
|
||||
// Return 401, not a member of required groups
|
||||
NumGroups = DCount(Groups, @VM)
|
||||
If NumGroups GT 1 then
|
||||
Swap @VM with ' or ' in Groups
|
||||
Message = 'User is not a member of the ' : Groups : ' groups.'
|
||||
end else
|
||||
Message = 'User is not a member of the ' : Group : ' group.'
|
||||
end
|
||||
HTTP_Services('SetResponseStatus', 401, 'Authentication failed. ':Message)
|
||||
|
||||
Case Password NE Credentials<PASSWORD$>
|
||||
// Return 401, unable to validate password
|
||||
Message = 'Unable to validate username. Please re-enter.'
|
||||
HTTP_Services('SetResponseStatus', 401, 'Authentication failed. ':Message)
|
||||
Case Otherwise$
|
||||
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Unhandled case.')
|
||||
End Case
|
||||
end else
|
||||
// Error reading user record
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': ErrorMsg)
|
||||
end
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 400, 'Error in the ' : CurrentAPI : ' API. Error parsing JSON.')
|
||||
end
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 400, 'Error in the ' : CurrentAPI : ' API. Empty request.')
|
||||
end
|
||||
|
||||
end api
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -67,25 +67,22 @@ END
|
||||
RETURN Result
|
||||
|
||||
|
||||
|
||||
* * * * * * *
|
||||
Create:
|
||||
* * * * * * *
|
||||
|
||||
IF MemberOf(@USER4,'CALIBRATION') ELSE
|
||||
ErrMsg('Only authorized personnel may update the Calibration List.')
|
||||
End_Window(@WINDOW)
|
||||
RETURN
|
||||
END
|
||||
|
||||
IF MemberOf(@USER4,'CALIBRATION') ELSE
|
||||
ErrMsg('Only authorized personnel may update the Calibration List.')
|
||||
End_Window(@WINDOW)
|
||||
RETURN
|
||||
END
|
||||
obj_Appwindow('Create',@WINDOW)
|
||||
|
||||
|
||||
obj_Appwindow('Create',@WINDOW)
|
||||
|
||||
Set_List_Box_Data( @WINDOW )
|
||||
// Use to determine whether or not the New Calibration label was just clicked
|
||||
Set_Property(@Window : '.CALIBRATIONS', '@PrintLabel', False$)
|
||||
GOSUB Refresh
|
||||
Set_List_Box_Data( @WINDOW )
|
||||
// Use to determine whether or not the New Calibration label was just clicked
|
||||
Set_Property(@Window : '.CALIBRATIONS', '@PrintLabel', False$)
|
||||
GOSUB Refresh
|
||||
|
||||
RETURN
|
||||
|
||||
@ -95,81 +92,76 @@ Clear:
|
||||
* * * * * * *
|
||||
|
||||
|
||||
IF Get_Property(@WINDOW,'@READONLY') THEN
|
||||
obj_AppWindow('ReadOnly',@RM:1) ;* Reenables data bound controls
|
||||
Set_Property(@WINDOW,'@READONLY',0) ;* Clear flag on window
|
||||
END
|
||||
IF Get_Property(@WINDOW,'@READONLY') THEN
|
||||
obj_AppWindow('ReadOnly',@RM:1) ;* Reenables data bound controls
|
||||
Set_Property(@WINDOW,'@READONLY',0) ;* Clear flag on window
|
||||
END
|
||||
|
||||
|
||||
* * * * * * *
|
||||
Refresh:
|
||||
* * * * * * *
|
||||
|
||||
* QBF buttons
|
||||
* QBF buttons
|
||||
|
||||
Ctrls = @WINDOW:'.QBF_FIRST_FIX':@RM ; Props = 'ENABLED':@RM
|
||||
Ctrls := @WINDOW:'.QBF_PREV_FIX':@RM ; Props := 'ENABLED':@RM
|
||||
Ctrls := @WINDOW:'.QBF_ABS_FIX':@RM ; Props := 'ENABLED':@RM
|
||||
Ctrls := @WINDOW:'.QBF_NEXT_FIX':@RM ; Props := 'ENABLED':@RM
|
||||
Ctrls := @WINDOW:'.QBF_LAST_FIX':@RM ; Props := 'ENABLED':@RM
|
||||
Ctrls := @WINDOW:'.QBF_STOP_FIX' ; Props := 'ENABLED'
|
||||
Ctrls = @WINDOW:'.QBF_FIRST_FIX':@RM ; Props = 'ENABLED':@RM
|
||||
Ctrls := @WINDOW:'.QBF_PREV_FIX':@RM ; Props := 'ENABLED':@RM
|
||||
Ctrls := @WINDOW:'.QBF_ABS_FIX':@RM ; Props := 'ENABLED':@RM
|
||||
Ctrls := @WINDOW:'.QBF_NEXT_FIX':@RM ; Props := 'ENABLED':@RM
|
||||
Ctrls := @WINDOW:'.QBF_LAST_FIX':@RM ; Props := 'ENABLED':@RM
|
||||
Ctrls := @WINDOW:'.QBF_STOP_FIX' ; Props := 'ENABLED'
|
||||
|
||||
IF Get_Property(@WINDOW,'QBFLIST') = '' THEN
|
||||
Vals = 0:@RM:0:@RM:0:@RM:0:@RM:0:@RM:0
|
||||
END ELSE
|
||||
Vals = 1:@RM:1:@RM:1:@RM:1:@RM:1:@RM:1
|
||||
END
|
||||
IF Get_Property(@WINDOW,'QBFLIST') = '' THEN
|
||||
Vals = 0:@RM:0:@RM:0:@RM:0:@RM:0:@RM:0
|
||||
END ELSE
|
||||
Vals = 1:@RM:1:@RM:1:@RM:1:@RM:1:@RM:1
|
||||
END
|
||||
|
||||
Set_Property(Ctrls,Props,Vals)
|
||||
Set_Property(Ctrls,Props,Vals)
|
||||
|
||||
* Turn edit table symbolic column backgrounds to green
|
||||
* Turn edit table symbolic column backgrounds to green
|
||||
|
||||
ETSymbolics = Get_Property(@WINDOW,'@ET_SYMBOLICS') ;* Loaded during 'Create' in obj_Appwindow
|
||||
ETSymbolics = Get_Property(@WINDOW,'@ET_SYMBOLICS') ;* Loaded during 'Create' in obj_Appwindow
|
||||
|
||||
ETCtrls = ETSymbolics<1>
|
||||
ETCols = ETSymbolics<2>
|
||||
|
||||
FOR I = 1 TO COUNT(ETCtrls,@VM) + (ETCtrls NE '')
|
||||
ETCtrl = ETCtrls<1,I>
|
||||
ETList = Get_Property(ETCtrl,'LIST')
|
||||
FOR Line = 1 TO COUNT(ETList,@FM) + (ETList NE '')
|
||||
IF ETList<Line,1> NE '' THEN
|
||||
FOR N = 1 TO COUNT(ETCols<1,Line>,@SVM) + (ETCols<1,Line> NE '')
|
||||
stat = Send_Message(ETCtrl,'COLOR_BY_POS',ETCols<1,Line,N>,Line,GREEN$)
|
||||
NEXT N
|
||||
END
|
||||
NEXT Line
|
||||
NEXT I
|
||||
ETCtrls = ETSymbolics<1>
|
||||
ETCols = ETSymbolics<2>
|
||||
|
||||
FOR I = 1 TO COUNT(ETCtrls,@VM) + (ETCtrls NE '')
|
||||
ETCtrl = ETCtrls<1,I>
|
||||
ETList = Get_Property(ETCtrl,'LIST')
|
||||
FOR Line = 1 TO COUNT(ETList,@FM) + (ETList NE '')
|
||||
IF ETList<Line,1> NE '' THEN
|
||||
FOR N = 1 TO COUNT(ETCols<1,Line>,@SVM) + (ETCols<1,Line> NE '')
|
||||
stat = Send_Message(ETCtrl,'COLOR_BY_POS',ETCols<1,Line,N>,Line,GREEN$)
|
||||
NEXT N
|
||||
END
|
||||
NEXT Line
|
||||
NEXT I
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
* * * * * * *
|
||||
Read:
|
||||
* * * * * * *
|
||||
|
||||
CLNo = Get_Property(@WINDOW:'.CL_NO','DEFPROP')
|
||||
CLNo = Get_Property(@WINDOW:'.CL_NO','DEFPROP')
|
||||
|
||||
IF RowExists('CALIB_LIST',CLNo) ELSE
|
||||
IF Get_Property(@WINDOW:'.ENTER_DTM','DEFPROP') = '' THEN
|
||||
CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTH')
|
||||
Set_Property(@WINDOW:'.ENTER_DTM','DEFPROP',CurrDTM)
|
||||
|
||||
IF RowExists('CALIB_LIST',CLNo) ELSE
|
||||
IF Get_Property(@WINDOW:'.ENTER_DTM','DEFPROP') = '' THEN
|
||||
CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTH')
|
||||
Set_Property(@WINDOW:'.ENTER_DTM','DEFPROP',CurrDTM)
|
||||
END
|
||||
END
|
||||
END
|
||||
|
||||
GOSUB Refresh
|
||||
// Use to determine whether or not the New Calibration button was just clicked and print if it was
|
||||
PrintCheck = Get_Property(@Window : '.CALIBRATIONS', '@PrintLabel')
|
||||
If PrintCheck EQ True$ then
|
||||
Gosub PrintMostRecentLabel
|
||||
end
|
||||
// Reset flag after read regardless
|
||||
Set_Property(@Window : '.CALIBRATIONS', '@PrintLabel', False$)
|
||||
GOSUB Refresh
|
||||
// Use to determine whether or not the New Calibration button was just clicked and print if it was
|
||||
PrintCheck = Get_Property(@Window : '.CALIBRATIONS', '@PrintLabel')
|
||||
If PrintCheck EQ True$ then
|
||||
Gosub PrintMostRecentLabel
|
||||
end
|
||||
// Reset flag after read regardless
|
||||
Set_Property(@Window : '.CALIBRATIONS', '@PrintLabel', False$)
|
||||
|
||||
RETURN
|
||||
|
||||
@ -187,14 +179,6 @@ RETURN
|
||||
Delete:
|
||||
* * * * * * *
|
||||
|
||||
/*
|
||||
IF Security_Check('Order',Delete$) THEN
|
||||
Result = 1 ;* Proceed with delete
|
||||
END ELSE
|
||||
Security_Err_Msg('Order',Delete$)
|
||||
Result = 0 ;* Stop event chain
|
||||
END
|
||||
*/
|
||||
|
||||
RETURN
|
||||
|
||||
@ -203,13 +187,12 @@ RETURN
|
||||
NewItem:
|
||||
* * * * * * *
|
||||
|
||||
CLNo = Get_Property(@WINDOW:'.CL_NO','DEFPROP')
|
||||
|
||||
IF CLNo = '' THEN
|
||||
NextCLNo = NextKey('CALIB_LIST')
|
||||
obj_Appwindow('LoadFormKeys',@WINDOW:@RM:NextCLNo)
|
||||
END
|
||||
CLNo = Get_Property(@WINDOW:'.CL_NO','DEFPROP')
|
||||
|
||||
IF CLNo = '' THEN
|
||||
NextCLNo = NextKey('CALIB_LIST')
|
||||
obj_Appwindow('LoadFormKeys',@WINDOW:@RM:NextCLNo)
|
||||
END
|
||||
|
||||
RETURN
|
||||
|
||||
@ -218,37 +201,35 @@ RETURN
|
||||
LUCalibItem:
|
||||
* * * * * * *
|
||||
|
||||
CLKeys = Popup(@WINDOW,'','CALIB_LIST')
|
||||
CLKeys = Popup(@WINDOW,'','CALIB_LIST')
|
||||
|
||||
IF Get_Status(errCode) THEN ErrMsg(ErrCode)
|
||||
IF Get_Status(errCode) THEN ErrMsg(ErrCode)
|
||||
|
||||
CONVERT @VM TO @FM IN CLKeys
|
||||
|
||||
IF INDEX(CLKeys,@FM,1) THEN
|
||||
Send_Event(@WINDOW,'QBFINIT')
|
||||
Set_Property(@WINDOW,'QBFLIST',CLKeys)
|
||||
GOSUB Refresh
|
||||
Send_Event(@WINDOW,'QBFIRST')
|
||||
END ELSE
|
||||
obj_Appwindow('LoadFormKeys',@WINDOW:@RM:CLKeys)
|
||||
END
|
||||
CONVERT @VM TO @FM IN CLKeys
|
||||
|
||||
IF INDEX(CLKeys,@FM,1) THEN
|
||||
Send_Event(@WINDOW,'QBFINIT')
|
||||
Set_Property(@WINDOW,'QBFLIST',CLKeys)
|
||||
GOSUB Refresh
|
||||
Send_Event(@WINDOW,'QBFIRST')
|
||||
END ELSE
|
||||
obj_Appwindow('LoadFormKeys',@WINDOW:@RM:CLKeys)
|
||||
END
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
* * * * * * *
|
||||
LUCalibItemType:
|
||||
* * * * * * *
|
||||
|
||||
CLItemType = Popup(@WINDOW,'','CALIB_LIST_TYPE')
|
||||
CLItemType = Popup(@WINDOW,'','CALIB_LIST_TYPE')
|
||||
|
||||
IF Get_Status(errCode) THEN ErrMsg(ErrCode)
|
||||
IF Get_Status(errCode) THEN ErrMsg(ErrCode)
|
||||
|
||||
IF CLItemType NE '' THEN
|
||||
obj_AppWindow('LUValReturn',CLItemType:@RM:@WINDOW:'.CL_TYPE')
|
||||
END
|
||||
IF CLItemType NE '' THEN
|
||||
obj_AppWindow('LUValReturn',CLItemType:@RM:@WINDOW:'.CL_TYPE')
|
||||
END
|
||||
|
||||
RETURN
|
||||
|
||||
@ -257,27 +238,24 @@ RETURN
|
||||
LUCalibItemLoc:
|
||||
* * * * * * *
|
||||
|
||||
CLItemLoc = Popup(@WINDOW,'','CALIB_LIST_LOC')
|
||||
CLItemLoc = Popup(@WINDOW,'','CALIB_LIST_LOC')
|
||||
|
||||
IF Get_Status(errCode) THEN ErrMsg(ErrCode)
|
||||
IF Get_Status(errCode) THEN ErrMsg(ErrCode)
|
||||
|
||||
IF CLItemLoc NE '' THEN
|
||||
obj_AppWindow('LUValReturn',CLItemLoc:@RM:@WINDOW:'.CAL_LOC')
|
||||
END
|
||||
IF CLItemLoc NE '' THEN
|
||||
obj_AppWindow('LUValReturn',CLItemLoc:@RM:@WINDOW:'.CAL_LOC')
|
||||
END
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
* * * * * *
|
||||
Close:
|
||||
* * * * * *
|
||||
|
||||
obj_Notes('Inbox',@USER4) ;* Checks for any new messages
|
||||
|
||||
obj_Notes('Inbox',@USER4) ;* Checks for any new messages
|
||||
|
||||
Send_Event('MASTER_CALIB_LIST','CREATE')
|
||||
Send_Event('MASTER_CALIB_LIST','CREATE')
|
||||
|
||||
RETURN
|
||||
|
||||
@ -287,35 +265,34 @@ RETURN
|
||||
CalibrationsDC:
|
||||
* * * * * * *
|
||||
|
||||
CtrlEntID = @WINDOW:'.CALIBRATIONS'
|
||||
CtrlEntID = @WINDOW:'.CALIBRATIONS'
|
||||
|
||||
CurrPos = Get_Property(CtrlEntID,'SELPOS')
|
||||
CurrCol = CurrPos<1>
|
||||
CurrRow = CurrPos<2>
|
||||
CurrPos = Get_Property(CtrlEntID,'SELPOS')
|
||||
CurrCol = CurrPos<1>
|
||||
CurrRow = CurrPos<2>
|
||||
|
||||
CalDt = Get_Property(CtrlEntID,'CELLPOS',COL$CAL_DT:@FM:CurrRow)
|
||||
CalDt = Get_Property(CtrlEntID,'CELLPOS',COL$CAL_DT:@FM:CurrRow)
|
||||
|
||||
CalDt = ICONV(CalDt,'D')
|
||||
CLNo = Get_Property(@WINDOW:'.CL_NO','DEFPROP')
|
||||
CalDt = ICONV(CalDt,'D')
|
||||
CLNo = Get_Property(@WINDOW:'.CL_NO','DEFPROP')
|
||||
|
||||
IF CLNo NE '' AND CalDt NE '' THEN
|
||||
|
||||
IF Get_Property(@WINDOW,'QBFLIST') = '' THEN
|
||||
Send_Event(@WINDOW,'WRITE')
|
||||
END
|
||||
|
||||
oaParms = 'CALIBRATION':@RM
|
||||
oaParms := CLNo:'*':CalDt:@RM
|
||||
oaParms := '':@RM ;* Default Record
|
||||
oaParms := CLNo:@RM
|
||||
oaParms := @RM
|
||||
oaParms := CtrlEntID:@RM
|
||||
oaParms := CurrPos
|
||||
|
||||
obj_Appwindow('ViewNewDetail', oaParms)
|
||||
|
||||
IF CLNo NE '' AND CalDt NE '' THEN
|
||||
|
||||
IF Get_Property(@WINDOW,'QBFLIST') = '' THEN
|
||||
Send_Event(@WINDOW,'WRITE')
|
||||
END
|
||||
|
||||
oaParms = 'CALIBRATION':@RM
|
||||
oaParms := CLNo:'*':CalDt:@RM
|
||||
oaParms := '':@RM ;* Default Record
|
||||
oaParms := CLNo:@RM
|
||||
oaParms := @RM
|
||||
oaParms := CtrlEntID:@RM
|
||||
oaParms := CurrPos
|
||||
|
||||
obj_Appwindow('ViewNewDetail', oaParms)
|
||||
|
||||
|
||||
END
|
||||
|
||||
RETURN
|
||||
|
||||
@ -324,51 +301,49 @@ RETURN
|
||||
NewCalibClick:
|
||||
* * * * * * *
|
||||
|
||||
CtrlEntID = @WINDOW:'.CALIBRATIONS'
|
||||
CtrlEntID = @WINDOW:'.CALIBRATIONS'
|
||||
|
||||
CLNo = Get_Property(@WINDOW:'.CL_NO','DEFPROP')
|
||||
CLNo = Get_Property(@WINDOW:'.CL_NO','DEFPROP')
|
||||
|
||||
IF CLNo NE '' THEN
|
||||
|
||||
IF Get_Property(@WINDOW,'QBFLIST') = '' THEN
|
||||
Send_Event(@WINDOW,'WRITE')
|
||||
IF CLNo NE '' THEN
|
||||
|
||||
IF Get_Property(@WINDOW,'QBFLIST') = '' THEN
|
||||
Send_Event(@WINDOW,'WRITE')
|
||||
END
|
||||
|
||||
oaParms = 'CALIBRATION':@RM
|
||||
oaParms := CLNo:@RM
|
||||
oaParms := '':@RM ;* Default Record
|
||||
oaParms := CLNo:@RM
|
||||
oaParms := @RM
|
||||
oaParms := CtrlEntID:@RM
|
||||
oaParms := 1:@FM:1
|
||||
|
||||
obj_Appwindow('ViewNewDetail', oaParms)
|
||||
// New Calibration label was just clicked, set to true
|
||||
Set_Property(@Window : '.CALIBRATIONS', '@PrintLabel', True$)
|
||||
|
||||
END
|
||||
|
||||
oaParms = 'CALIBRATION':@RM
|
||||
oaParms := CLNo:@RM
|
||||
oaParms := '':@RM ;* Default Record
|
||||
oaParms := CLNo:@RM
|
||||
oaParms := @RM
|
||||
oaParms := CtrlEntID:@RM
|
||||
oaParms := 1:@FM:1
|
||||
|
||||
obj_Appwindow('ViewNewDetail', oaParms)
|
||||
// New Calibration label was just clicked, set to true
|
||||
Set_Property(@Window : '.CALIBRATIONS', '@PrintLabel', True$)
|
||||
|
||||
END
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
*********************
|
||||
PrintMostRecentLabel:
|
||||
*********************
|
||||
|
||||
CLNo = Get_Property(@WINDOW:'.CL_NO','DEFPROP')
|
||||
CLNo = Get_Property(@WINDOW:'.CL_NO','DEFPROP')
|
||||
|
||||
IF CLNo NE '' THEN
|
||||
TableList = Get_Property(@WINDOW:'.CALIBRATIONS', 'LIST')
|
||||
EquipmentID = Get_Property(@WINDOW:'.EQ_DESC', 'TEXT')
|
||||
LastCalibration = Get_Property(@WINDOW:'.LAST_CAL_DT', 'TEXT')
|
||||
FrequencyVal = Get_Property(@WINDOW:'.CAL_INTERVAL', 'TEXT')
|
||||
FrequencyUnit = 'Months'
|
||||
NextCalibration = Get_Property(@WINDOW:'.NEXT_CAL_DT', 'TEXT')
|
||||
CalibratedBy = TableList<1,2>
|
||||
Labeling_Services('PrintCalibrationLabel', EquipmentID, LastCalibration, NextCalibration, CalibratedBy, FrequencyVal, FrequencyUnit, '')
|
||||
end
|
||||
IF CLNo NE '' THEN
|
||||
TableList = Get_Property(@WINDOW:'.CALIBRATIONS', 'LIST')
|
||||
EquipmentID = Get_Property(@WINDOW:'.EQ_DESC', 'TEXT')
|
||||
LastCalibration = Get_Property(@WINDOW:'.LAST_CAL_DT', 'TEXT')
|
||||
FrequencyVal = Get_Property(@WINDOW:'.CAL_INTERVAL', 'TEXT')
|
||||
FrequencyUnit = 'Months'
|
||||
NextCalibration = Get_Property(@WINDOW:'.NEXT_CAL_DT', 'TEXT')
|
||||
CalibratedBy = TableList<1,2>
|
||||
Labeling_Services('PrintCalibrationLabel', EquipmentID, LastCalibration, NextCalibration, CalibratedBy, FrequencyVal, FrequencyUnit, '')
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,139 +1,138 @@
|
||||
Function Changelog_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 : Changelog_API
|
||||
|
||||
Description : API logic for the Changelog 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 Changelog[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Changelog.POST
|
||||
- Changelog.ID.PUT
|
||||
- Changelog.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)
|
||||
07/24/24 xxx Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
Declare function Datetime, SRP_Datetime, Change_Log_Services, Environment_Services, Logging_Services
|
||||
Declare subroutine Logging_Services
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert API_SETUP
|
||||
$insert HTTP_INSERTS
|
||||
EQU Comma$ to ','
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\API\Admin\ChangeLog'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
LogTime = Oconv(Time(), 'MTS')
|
||||
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ChangeLogArchiveService.csv'
|
||||
Headers = 'Logging DTM' : @FM : 'From IP Address' : @FM : 'Message'
|
||||
objLogChangeLogAPI = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
|
||||
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
||||
RequesterIPAddr = HTTP_Services('GetHTTPRemoteAddr')
|
||||
|
||||
GoToAPI else
|
||||
// The specific resource endpoint doesn't have a API handler yet.
|
||||
HTTP_Services('SetResponseStatus', 200, 'This is a valid endpoint but a web API handler has not yet been created.')
|
||||
end
|
||||
|
||||
Return Response OR ''
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Endpoint Handlers
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
API changelog.HEAD
|
||||
API changelog.GET
|
||||
StartDtm = Http_Services('GetQueryField', 'FromDatetime')
|
||||
ToDtm = Http_Services('GetQueryField', 'ToDatetime')
|
||||
|
||||
StartDtm = IConv(StartDtm, 'DT')
|
||||
ToDtm = IConv(ToDtm, 'DT')
|
||||
|
||||
If StartDtm EQ '' then
|
||||
StartDtm = SRP_Datetime('AddDays', Datetime(), -60)
|
||||
end
|
||||
If ToDtm EQ '' then
|
||||
ToDtm = Datetime()
|
||||
end
|
||||
|
||||
EntityName = Http_Services('GetQueryField', 'EntityName')
|
||||
UserId = Http_Services('GetQueryField', 'UserID')
|
||||
|
||||
ChangeLogIDs = Change_Log_Services('GetChangeLogRecIDs', EntityName, StartDtm, ToDtm, UserId)
|
||||
If Error_Services('NoError') then
|
||||
GoSub CreateHALCollection
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = RequesterIPAddr
|
||||
LogData<3> = ErrorMsg
|
||||
Logging_Services('AppendLog', objLogChangeLogAPI, LogData, @RM, @FM)
|
||||
HTTP_Services('SetResponseStatus', 500, 'Error Getting change log records from change_log table.')
|
||||
end
|
||||
|
||||
end api
|
||||
|
||||
CreateHALCollection:
|
||||
hJsonCollection = ''
|
||||
hChangeLogArray = ''
|
||||
hChangeLogObj = ''
|
||||
hChangeLog = ''
|
||||
hChangeLogJson = ''
|
||||
Abort = False$
|
||||
If SRP_JSON(hJSONCollection, 'New', 'Object') then
|
||||
If SRP_JSON(hChangeLogArray, 'New', 'Array') then
|
||||
For each ChangeLogID in ChangeLogIDs using @VM setting fPos
|
||||
//rdsJSON = Rds_Services('ConvertRecordToJSON', rds, '' ,FullEndpointURL:'/':rds)
|
||||
ChangeLogJson = Change_Log_Services('ConvertRecordToJSON', ChangeLogID)
|
||||
If Error_Services('NoError') then
|
||||
If (SRP_JSON(hChangeLog, 'Parse', ChangeLogJson) EQ '') then
|
||||
SRP_JSON(hChangeLogArray, 'Add', hChangeLog)
|
||||
SRP_JSON(hChangeLog, 'Release')
|
||||
end
|
||||
end else
|
||||
Abort = True$
|
||||
end
|
||||
Until Abort
|
||||
Next rds
|
||||
If Abort EQ False$ then
|
||||
SRP_JSON(hJSONCollection, 'Set', 'ChangeLogRecords', hChangeLogArray)
|
||||
end
|
||||
SRP_JSON(hChangeLogArray, 'Release')
|
||||
end
|
||||
JSONCollection = SRP_JSON(hJSONCollection, 'Stringify', 'Styled')
|
||||
SRP_JSON(hJSONCollection, 'Release')
|
||||
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||
HTTP_Services('SetResponseBody', JSONCollection, False$, 'application/hal+json')
|
||||
HTTP_Services('SetResponseStatus', 200)
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
Function Changelog_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 : Changelog_API
|
||||
|
||||
Description : API logic for the Changelog 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 Changelog[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Changelog.POST
|
||||
- Changelog.ID.PUT
|
||||
- Changelog.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)
|
||||
07/24/24 xxx Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
Declare function Datetime, SRP_Datetime, Change_Log_Services, Environment_Services, Logging_Services
|
||||
Declare subroutine Logging_Services
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert API_SETUP
|
||||
$insert HTTP_INSERTS
|
||||
EQU Comma$ to ','
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\API\Admin\ChangeLog'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
LogTime = Oconv(Time(), 'MTS')
|
||||
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ChangeLogArchiveService.csv'
|
||||
Headers = 'Logging DTM' : @FM : 'From IP Address' : @FM : 'Message'
|
||||
objLogChangeLogAPI = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
|
||||
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
||||
RequesterIPAddr = HTTP_Services('GetHTTPRemoteAddr')
|
||||
|
||||
GoToAPI else
|
||||
// The specific resource endpoint doesn't have a API handler yet.
|
||||
HTTP_Services('SetResponseStatus', 200, 'This is a valid endpoint but a web API handler has not yet been created.')
|
||||
end
|
||||
|
||||
Return Response OR ''
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Endpoint Handlers
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
API changelog.HEAD
|
||||
API changelog.GET
|
||||
StartDtm = Http_Services('GetQueryField', 'FromDatetime')
|
||||
ToDtm = Http_Services('GetQueryField', 'ToDatetime')
|
||||
|
||||
StartDtm = IConv(StartDtm, 'DT')
|
||||
ToDtm = IConv(ToDtm, 'DT')
|
||||
|
||||
If StartDtm EQ '' then
|
||||
StartDtm = SRP_Datetime('AddDays', Datetime(), -60)
|
||||
end
|
||||
If ToDtm EQ '' then
|
||||
ToDtm = Datetime()
|
||||
end
|
||||
|
||||
EntityName = Http_Services('GetQueryField', 'EntityName')
|
||||
UserId = Http_Services('GetQueryField', 'UserID')
|
||||
|
||||
ChangeLogIDs = Change_Log_Services('GetChangeLogRecIDs', EntityName, StartDtm, ToDtm, UserId)
|
||||
If Error_Services('NoError') then
|
||||
GoSub CreateHALCollection
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = RequesterIPAddr
|
||||
LogData<3> = ErrorMsg
|
||||
Logging_Services('AppendLog', objLogChangeLogAPI, LogData, @RM, @FM)
|
||||
HTTP_Services('SetResponseStatus', 500, 'Error Getting change log records from change_log table.')
|
||||
end
|
||||
|
||||
end api
|
||||
|
||||
CreateHALCollection:
|
||||
hJsonCollection = ''
|
||||
hChangeLogArray = ''
|
||||
hChangeLogObj = ''
|
||||
hChangeLog = ''
|
||||
hChangeLogJson = ''
|
||||
Abort = False$
|
||||
If SRP_JSON(hJSONCollection, 'New', 'Object') then
|
||||
If SRP_JSON(hChangeLogArray, 'New', 'Array') then
|
||||
For each ChangeLogID in ChangeLogIDs using @VM setting fPos
|
||||
//rdsJSON = Rds_Services('ConvertRecordToJSON', rds, '' ,FullEndpointURL:'/':rds)
|
||||
ChangeLogJson = Change_Log_Services('ConvertRecordToJSON', ChangeLogID)
|
||||
If Error_Services('NoError') then
|
||||
If (SRP_JSON(hChangeLog, 'Parse', ChangeLogJson) EQ '') then
|
||||
SRP_JSON(hChangeLogArray, 'Add', hChangeLog)
|
||||
SRP_JSON(hChangeLog, 'Release')
|
||||
end
|
||||
end else
|
||||
Abort = True$
|
||||
end
|
||||
Until Abort
|
||||
Next rds
|
||||
If Abort EQ False$ then
|
||||
SRP_JSON(hJSONCollection, 'Set', 'ChangeLogRecords', hChangeLogArray)
|
||||
end
|
||||
SRP_JSON(hChangeLogArray, 'Release')
|
||||
end
|
||||
JSONCollection = SRP_JSON(hJSONCollection, 'Stringify', 'Styled')
|
||||
SRP_JSON(hJSONCollection, 'Release')
|
||||
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||
HTTP_Services('SetResponseBody', JSONCollection, False$, 'application/hal+json')
|
||||
HTTP_Services('SetResponseStatus', 200)
|
||||
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
|
||||
end
|
||||
Next RecipeIndex
|
||||
Database_Services('WriteDataRow', 'CLEAN_INSP', PostCIKey, PostCIRec, True$, False$, True$)
|
||||
end
|
||||
end
|
||||
end
|
||||
Service_Services('PostProcedure', 'CLEAN_INSP_SERVICES', 'UpdatePostCISampleQty':SD$:Name)
|
||||
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
|
File diff suppressed because it is too large
Load Diff
@ -556,8 +556,6 @@ UnloadProduct:
|
||||
Next CassNo
|
||||
end
|
||||
|
||||
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
@ -639,3 +637,4 @@ SlotOverview:
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -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\
|
||||
|
||||
@ -23,14 +24,16 @@ EQU COL$LQP_QTY TO 2
|
||||
EQU COL$LQP_PART TO 3 ;* This is either Cust Part No OR Substrate Part Number depending on which control is visible
|
||||
EQU COL$LQP_VENDOR TO 4 ;* Vendor code on the Substrate screen 7/14/2011 JCH for SAP
|
||||
|
||||
EQU CA$ITEM_NO TO 1 ;* Equates for Checking Array passed to Scan routine
|
||||
EQU CA$LOT_NO TO 2
|
||||
EQU CA$LOT_QTY TO 3
|
||||
EQU CA$CUST_PART_NO TO 4
|
||||
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$ITEM_NO TO 1 ;* Equates for Checking Array passed to Scan routine
|
||||
EQU CA$LOT_NO TO 2
|
||||
EQU CA$LOT_QTY TO 3
|
||||
EQU CA$CUST_PART_NO TO 4
|
||||
EQU CA$SUB_PART_NO TO 5
|
||||
EQU CA$SCANNED_LOT_QTY TO 6
|
||||
EQU CA$VERIFY_PART_NO TO 7
|
||||
EQU CA$SUB_SUPP_BY TO 8
|
||||
EQU CA$WO_NO TO 9
|
||||
EQU CA$REC_DTM TO 10
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Receiving'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
@ -48,7 +51,6 @@ Result = ''
|
||||
BEGIN CASE
|
||||
CASE Method = 'Create' ; GOSUB Create
|
||||
CASE Method = 'OK' ; GOSUB OK
|
||||
CASE Method = 'Cancel' ; GOSUB Cancel
|
||||
CASE Method = 'FieldClick' ; GOSUB FieldClick
|
||||
CASE Method = 'LQP' ; GOSUB LQP
|
||||
CASE 1
|
||||
@ -61,47 +63,47 @@ RETURN Result
|
||||
Create:
|
||||
* * * * * * *
|
||||
|
||||
VendorDef = Parm1[1,@FM]
|
||||
VendorDef = Parm1[1,@FM]
|
||||
|
||||
CheckArray = FIELD(Parm1,@FM,2,999)
|
||||
CheckArray = FIELD(Parm1,@FM,2,999)
|
||||
|
||||
Set_Property(@WINDOW,'@VENDOR_DEF',VendorDef)
|
||||
Set_Property(@WINDOW,'@VENDOR_DEF',VendorDef)
|
||||
|
||||
OpenQty = CheckArray<CA$LOT_QTY>
|
||||
Set_Property(@WINDOW:'.OPEN_QTY','TEXT',OCONV(OpenQty,'MD0,')) ;* 12/6/2011 JCH
|
||||
OpenQty = CheckArray<CA$LOT_QTY>
|
||||
Set_Property(@WINDOW:'.OPEN_QTY','TEXT',OCONV(OpenQty,'MD0,')) ;* 12/6/2011 JCH
|
||||
|
||||
Set_Property(@WINDOW,'@CHECK_ARRAY',CheckArray)
|
||||
obj_AppWindow('Create')
|
||||
Set_Property(@WINDOW,'@CHECK_ARRAY',CheckArray)
|
||||
obj_AppWindow('Create')
|
||||
|
||||
TimeStamp = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS')
|
||||
Set_Property(@WINDOW:'.RX_DTM','DEFPROP',TimeStamp)
|
||||
Set_Property(@WINDOW,'FOCUS',@WINDOW:'.RX_DTM')
|
||||
Set_Property(@WINDOW:'.RX_DTM','SELECTION',1:@FM:65534)
|
||||
TimeStamp = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS')
|
||||
Set_Property(@WINDOW:'.RX_DTM','DEFPROP',TimeStamp)
|
||||
Set_Property(@WINDOW,'FOCUS',@WINDOW:'.RX_DTM')
|
||||
Set_Property(@WINDOW:'.RX_DTM','SELECTION',1:@FM:65534)
|
||||
|
||||
GOSUB Refresh
|
||||
GOSUB Refresh
|
||||
|
||||
|
||||
* * * * * * *
|
||||
FieldClick:
|
||||
* * * * * * *
|
||||
|
||||
CtrlEntID = @WINDOW:'.FIELD_RADIO'
|
||||
CtrlEntID = @WINDOW:'.FIELD_RADIO'
|
||||
|
||||
ControlSelection = Get_Property(CtrlEntID,'VALUE')
|
||||
ControlSelection = Get_Property(CtrlEntID,'VALUE')
|
||||
|
||||
Ctrls = @WINDOW:'.LOT_QTY':@RM ; Props = 'VISIBLE':@RM
|
||||
Ctrls := @WINDOW:'.LOT_QTY_PART':@RM ; Props := 'VISIBLE':@RM
|
||||
Ctrls := @WINDOW:'.LOT_QTY_SUB_PART':@RM ; Props := 'VISIBLE':@RM
|
||||
Ctrls := @WINDOW:'.WINDOW_LABEL_FIX' ; Props := 'TEXT'
|
||||
Ctrls = @WINDOW:'.LOT_QTY':@RM ; Props = 'VISIBLE':@RM
|
||||
Ctrls := @WINDOW:'.LOT_QTY_PART':@RM ; Props := 'VISIBLE':@RM
|
||||
Ctrls := @WINDOW:'.LOT_QTY_SUB_PART':@RM ; Props := 'VISIBLE':@RM
|
||||
Ctrls := @WINDOW:'.WINDOW_LABEL_FIX' ; Props := 'TEXT'
|
||||
|
||||
|
||||
BEGIN CASE
|
||||
CASE ControlSelection = 'LQ' ; Vals = '1':@RM:'0':@RM:'0':@RM:'Customer Wafers'
|
||||
CASE ControlSelection = 'LQP' ; Vals = '0':@RM:'1':@RM:'0':@RM:'Customer Wafers'
|
||||
CASE ControlSelection = 'LQSP' ; Vals = '0':@RM:'0':@RM:'1':@RM:'Substrates'
|
||||
END CASE
|
||||
BEGIN CASE
|
||||
CASE ControlSelection = 'LQ' ; Vals = '1':@RM:'0':@RM:'0':@RM:'Customer Wafers'
|
||||
CASE ControlSelection = 'LQP' ; Vals = '0':@RM:'1':@RM:'0':@RM:'Customer Wafers'
|
||||
CASE ControlSelection = 'LQSP' ; Vals = '0':@RM:'0':@RM:'1':@RM:'Substrates'
|
||||
END CASE
|
||||
|
||||
Set_Property(Ctrls,Props,Vals)
|
||||
Set_Property(Ctrls,Props,Vals)
|
||||
|
||||
RETURN
|
||||
|
||||
@ -109,11 +111,15 @@ RETURN
|
||||
Close:
|
||||
* * * * * * *
|
||||
|
||||
* * * * * * *
|
||||
Cancel:
|
||||
* * * * * * *
|
||||
ProcIds = Get_Property(@Window, '@PROC_IDS')
|
||||
|
||||
End_Dialog(@WINDOW,'Cancel')
|
||||
If ProcIds NE '' then
|
||||
Response = ProcIds
|
||||
end else
|
||||
Response = 'Cancel'
|
||||
end
|
||||
|
||||
End_Dialog(@WINDOW,Response)
|
||||
|
||||
RETURN
|
||||
|
||||
@ -122,271 +128,288 @@ RETURN
|
||||
Refresh:
|
||||
* * * * * * *
|
||||
|
||||
ListArray = Get_Property(CtrlEntId,'ARRAY')
|
||||
CheckArray = Get_Property(@WINDOW,'@CHECK_ARRAY')
|
||||
TotalScannedQty = SUM(ListArray<COL$LQP_QTY>)
|
||||
OpenQty = CheckArray<CA$LOT_QTY>
|
||||
ListArray = Get_Property(CtrlEntId,'ARRAY')
|
||||
CheckArray = Get_Property(@WINDOW,'@CHECK_ARRAY')
|
||||
TotalScannedQty = SUM(ListArray<COL$LQP_QTY>)
|
||||
OpenQty = CheckArray<CA$LOT_QTY>
|
||||
|
||||
Set_Property(@WINDOW:'.SCANNED_QTY','TEXT',OCONV(TotalScannedQty,'MD0,'))
|
||||
Set_Property(@WINDOW:'.SCANNED_QTY','TEXT',OCONV(TotalScannedQty,'MD0,'))
|
||||
|
||||
IF TotalScannedQty < OpenQty THEN
|
||||
Set_Property(@WINDOW:'.SCANNED_QTY','BACKCOLOR',GREEN$)
|
||||
END ELSE
|
||||
Set_Property(@WINDOW:'.SCANNED_QTY','BACKCOLOR',RED$)
|
||||
END
|
||||
IF TotalScannedQty < OpenQty THEN
|
||||
Set_Property(@WINDOW:'.SCANNED_QTY','BACKCOLOR',GREEN$)
|
||||
END ELSE
|
||||
Set_Property(@WINDOW:'.SCANNED_QTY','BACKCOLOR',RED$)
|
||||
END
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
* * * * * * *
|
||||
LQP:
|
||||
* * * * * * *
|
||||
|
||||
CtrlEntID = Get_Property(@WINDOW,'FOCUS')
|
||||
StripANSI = Get_Property(@WINDOW:'.STRIP_ANSI','CHECK')
|
||||
SkipSubANSI = Get_Property(@WINDOW:'.SKIP_SUBSTRATE_ANSI','CHECK')
|
||||
CtrlEntID = Get_Property(@WINDOW,'FOCUS')
|
||||
StripANSI = Get_Property(@WINDOW:'.STRIP_ANSI','CHECK')
|
||||
SkipSubANSI = Get_Property(@WINDOW:'.SKIP_SUBSTRATE_ANSI','CHECK')
|
||||
|
||||
CheckArray = Get_Property(@WINDOW,'@CHECK_ARRAY')
|
||||
CheckArray = Get_Property(@WINDOW,'@CHECK_ARRAY')
|
||||
|
||||
BEGIN CASE
|
||||
CASE CtrlEntID = @WINDOW:'.LOT_QTY' ; ColCnt = 2
|
||||
CASE CtrlEntID = @WINDOW:'.LOT_QTY_PART' ; ColCnt = 3
|
||||
CASE CtrlEntID = @WINDOW:'.LOT_QTY_SUB_PART' ; ColCnt = 4
|
||||
END CASE
|
||||
BEGIN CASE
|
||||
CASE CtrlEntID = @WINDOW:'.LOT_QTY' ; ColCnt = 2
|
||||
CASE CtrlEntID = @WINDOW:'.LOT_QTY_PART' ; ColCnt = 3
|
||||
CASE CtrlEntID = @WINDOW:'.LOT_QTY_SUB_PART' ; ColCnt = 4
|
||||
END CASE
|
||||
|
||||
PrevSelPos = Get_Property(CtrlEntId,"PREVSELPOS")
|
||||
PrevCol = PrevSelPos<1>
|
||||
PrevRow = PrevSelPos<2>
|
||||
CurrPos = Get_Property(CtrlEntId,'SELPOS')
|
||||
CurrCol = CurrPos<1>
|
||||
CurrRow = CurrPos<2>
|
||||
ListData = Get_Property(CtrlEntId,'LIST')
|
||||
PrevSelPos = Get_Property(CtrlEntId,"PREVSELPOS")
|
||||
PrevCol = PrevSelPos<1>
|
||||
PrevRow = PrevSelPos<2>
|
||||
CurrPos = Get_Property(CtrlEntId,'SELPOS')
|
||||
CurrCol = CurrPos<1>
|
||||
CurrRow = CurrPos<2>
|
||||
ListData = Get_Property(CtrlEntId,'LIST')
|
||||
|
||||
IF ListData<CurrRow,CurrCol> = '' THEN
|
||||
ColPointer = CurrCol
|
||||
LinePointer = CurrRow
|
||||
|
||||
* Find the first non-empty cell
|
||||
LOOP
|
||||
Test = ListData<LinePointer,(ColPointer) >
|
||||
UNTIL Test NE '' OR (LinePointer = 0 AND ColPointer = 1)
|
||||
ColPointer -= 1
|
||||
IF ColPointer = 0 THEN
|
||||
ColPointer = ColCnt
|
||||
LinePointer -= 1
|
||||
END
|
||||
REPEAT
|
||||
* Move one past the non empty cell
|
||||
BEGIN CASE
|
||||
CASE LinePointer = 0
|
||||
* Empty Table
|
||||
LinePointer = 1
|
||||
CoilPointer = 1
|
||||
CASE ColPointer = ColCnt
|
||||
LinePointer += 1
|
||||
ColPointer = 1
|
||||
CASE 1
|
||||
ColPointer += 1
|
||||
END CASE
|
||||
Set_Property(CtrlEntId,"SELPOS",ColPointer:@FM:LinePointer)
|
||||
END
|
||||
|
||||
// Global scan validation check. Only alpha-numeric, dashes, spaces, and periods permitted.
|
||||
ValidationScan = Trim(ListData<PrevRow,PrevCol>)
|
||||
Convert @Lower_Case to @Upper_Case in ValidationScan
|
||||
Convert 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789- ./' to '' in ValidationScan
|
||||
//DPC 2/18/20 - changed validation to allow foward slash per supplier lot naming (Global Wafer)
|
||||
//FYI - conversion would only work when separated from above line
|
||||
Convert '/' to '' in ValidationScan
|
||||
If ValidationScan NE '' then
|
||||
Error_Services('Set', 'Scanned code ' : Quote(Trim(ListData<PrevRow,PrevCol>)) : ' contains an invalid character. Please re-scan.')
|
||||
end
|
||||
|
||||
If Error_Services('NoError') then
|
||||
IF ListData<PrevRow,PrevCol> NE '' THEN
|
||||
IF ListData<CurrRow,CurrCol> = '' THEN
|
||||
ColPointer = CurrCol
|
||||
LinePointer = CurrRow
|
||||
|
||||
* Find the first non-empty cell
|
||||
LOOP
|
||||
Test = ListData<LinePointer,(ColPointer) >
|
||||
UNTIL Test NE '' OR (LinePointer = 0 AND ColPointer = 1)
|
||||
ColPointer -= 1
|
||||
IF ColPointer = 0 THEN
|
||||
ColPointer = ColCnt
|
||||
LinePointer -= 1
|
||||
END
|
||||
REPEAT
|
||||
* Move one past the non empty cell
|
||||
BEGIN CASE
|
||||
CASE PrevCol = COL$LQP_LOT
|
||||
|
||||
IF StripANSI THEN
|
||||
RawLot = TRIM(ListData<PrevRow,PrevCol>)
|
||||
IF RawLot[1,2] = '1T' OR RawLot[1,2] = '2T' THEN
|
||||
LotNo = RawLot[3,99]
|
||||
END ELSE
|
||||
Msg(@Window, '', 'OK', '', 'Scan Error':@FM:'Scanned Code ':QUOTE(RawLot):' is not an ANSI Lot No.')
|
||||
Set_Property(CtrlEntId,"SELPOS",PrevSelPos)
|
||||
Set_Property(CtrlEntID,'INVALUE','',PrevSelPos)
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
RETURN
|
||||
END
|
||||
END ELSE
|
||||
LotNo = TRIM(ListData<PrevRow,PrevCol>)
|
||||
END
|
||||
|
||||
IF CtrlEntID NE @WINDOW:'.LOT_QTY_SUB_PART' THEN
|
||||
|
||||
* Don't check Customer Lot Numbers if scanning substrates
|
||||
|
||||
LOCATE LotNo IN CheckArray<CA$LOT_NO> USING @VM SETTING Pos ELSE
|
||||
* Accept or Rescan message
|
||||
Resp = Msg(@Window, '', 'OK', '', 'Scan Error':@FM:'Lot No ':QUOTE(LotNo):' not found in':@TM:'Order Item Lot Numbers!')
|
||||
LotNo = '' ;* Clear entered field for a rescan
|
||||
Set_Property(CtrlEntId,"SELPOS",PrevSelPos) ;* Cursor to Lot No for a rescan
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
END
|
||||
END
|
||||
|
||||
Set_Property(CtrlEntID,'INVALUE',LotNo,PrevSelPos)
|
||||
|
||||
CASE PrevCol = COL$LQP_QTY
|
||||
|
||||
IF StripANSI THEN
|
||||
RawLotQty = ListData<PrevRow,PrevCol>
|
||||
IF RawLotQty[1,1] = 'Q' THEN
|
||||
LotQty = RawLotQty[2,99]
|
||||
END ELSE
|
||||
Msg(@Window, '', 'OK', '', 'Scan Error':@FM:'Scanned Code ':QUOTE(RawLotQty):' is not an ANSI Quantity')
|
||||
Set_Property(CtrlEntId,"SELPOS",PrevSelPos)
|
||||
Set_Property(CtrlEntID,'INVALUE','',PrevSelPos)
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
RETURN
|
||||
END
|
||||
END ELSE
|
||||
LotQty = ListData<PrevRow,PrevCol>
|
||||
END
|
||||
|
||||
IF NOT(NUM(LotQty)) THEN
|
||||
* Accept or Rescan message
|
||||
Resp = Msg(@Window, '', 'OK', '', 'Scan Error':@FM:'Lot Qty ':QUOTE(LotQty):' is not a number!')
|
||||
LotNo = '' ;* Clear entered field for a rescan
|
||||
Set_Property(CtrlEntId,"SELPOS",PrevSelPos) ;* Cursor to Lot No for a rescan
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
END
|
||||
|
||||
Set_Property(CtrlEntID,'INVALUE',LotQty,PrevSelPos)
|
||||
|
||||
|
||||
CASE PrevCol = COL$LQP_PART
|
||||
// Check scanned part number for 5 segments. If there are 5 segments then use segments 3 and 4
|
||||
// to make the actual part number.
|
||||
ScannedPartNo = Trim(ListData<PrevRow, PrevCol>)
|
||||
If DCount(ScannedPartNo, '-') EQ 5 then
|
||||
RawPartNo = ''
|
||||
If ScannedPartNo[1, 1] _EQC 'P' then RawPartNo := 'P'
|
||||
If ScannedPartNo[1, 1] _EQC 'S' then RawPartNo := 'S'
|
||||
RawPartNo := Field(ScannedPartNo, '-', 3, 2)
|
||||
ListData<PrevRow, PrevCol> = RawPartNo
|
||||
end
|
||||
RawPartNo = TRIM(ListData<PrevRow,PrevCol>)
|
||||
IF StripANSI AND NOT(SkipSubAnsi) THEN ;***************************************
|
||||
RawPartNo = TRIM(ListData<PrevRow,PrevCol>)
|
||||
IF RawPartNo[1,1] _EQC 'P' OR RawPartNo[1,1] _EQC 'S' THEN
|
||||
PartNo = RawPartNo[2,99]
|
||||
END ELSE
|
||||
Msg(@Window, '', 'OK', '', 'Scan Error':@FM:'Scanned Code ':QUOTE(RawPartNo):' is not an ANSI Part No')
|
||||
Set_Property(CtrlEntId,"SELPOS",PrevSelPos)
|
||||
Set_Property(CtrlEntID,'INVALUE','',PrevSelPos)
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
RETURN
|
||||
END
|
||||
END ELSE
|
||||
PartNo = ListData<PrevRow,PrevCol>
|
||||
END
|
||||
|
||||
IF CtrlEntID = @WINDOW:'.LOT_QTY_PART' THEN
|
||||
* Check Customer Part Numbers
|
||||
LOCATE PartNo IN CheckArray<CA$VERIFY_PART_NO> USING @VM SETTING Pos THEN
|
||||
PartNo = CheckArray<CA$CUST_PART_NO,Pos>
|
||||
END ELSE
|
||||
* Accept or Rescan message
|
||||
Resp = Msg(@Window, '', 'OK', '', 'Scan Error':@FM:'Part No ':QUOTE(PartNo):' not found in':@TM:'Order Customer Part Numbers!')
|
||||
PartNo = '' ;* Clear entered field for a rescan
|
||||
Set_Property(CtrlEntId,"SELPOS",PrevSelPos) ;* Cursor to Lot No for a rescan
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
END
|
||||
|
||||
END ELSE
|
||||
* Check Substrate Part Numbers
|
||||
LOCATE PartNo IN CheckArray<CA$SUB_PART_NO> USING @VM SETTING Pos ELSE
|
||||
* Accept or Rescan message
|
||||
Resp = Msg(@Window, '', 'OK', '', 'Scan Error':@FM:'Part No ':QUOTE(PartNo):' not found in':@TM:'Order Substrate Part Numbers!')
|
||||
PartNo = '' ;* Clear entered field for a rescan
|
||||
Set_Property(CtrlEntId,"SELPOS",PrevSelPos) ;* Cursor to Lot No for a rescan
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
END
|
||||
END ;* End of check for Customer supplied or Inventory substrate part number
|
||||
|
||||
Set_Property(CtrlEntID,'INVALUE',PartNo,PrevSelPos)
|
||||
|
||||
CASE PrevCol = COL$LQP_VENDOR
|
||||
|
||||
SubSuppBy = CheckArray<CA$SUB_SUPP_BY>
|
||||
VendCode = ''
|
||||
IF StripANSI AND NOT(SkipSubAnsi) THEN
|
||||
RawVendCode = TRIM(ListData<PrevRow,PrevCol>)
|
||||
IF RawVendCode[1,2] = '1V' THEN
|
||||
VendCode = RawVendCode[3,99]
|
||||
END ELSE
|
||||
TypeOver = ''
|
||||
TypeOver<MTYPE$> = 'B&Rescan'
|
||||
TypeOver<MTEXT$> = 'Scanned Code ':QUOTE(RawVendCode):' is not an ANSI Vendor Code'
|
||||
Resp = Msg(@WINDOW, '','OK', '', 'Scan Error':@FM:'Scanned Code ':QUOTE(RawVendCode):' is not an ANSI Vendor Code')
|
||||
Set_Property(CtrlEntID,"SELPOS",PrevSelPos)
|
||||
Set_Property(CtrlEntID,'INVALUE','',PrevSelPos)
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
RETURN
|
||||
END
|
||||
END ELSE
|
||||
VendCode = ListData<PrevRow,PrevCol>
|
||||
END
|
||||
|
||||
IF RowExists('SEMI_VEND_CODE', VendCode) OR SubSuppBy = 'C' ELSE
|
||||
* Accept or Rescan message
|
||||
If VendCode EQ '' then VendCode = RawVendCode
|
||||
Resp = Msg(@WINDOW, '','OK', '', 'Scan Error':@FM:'Vendor Code ':QUOTE(VendCode):' not found in':@TM:'Vendor Codes on file!')
|
||||
VendCode = '' ;* Clear entered field for a rescan
|
||||
Set_Property(CtrlEntId,"SELPOS",PrevSelPos) ;* Cursor to Lot No for a rescan
|
||||
Set_Property(CtrlEntID,'INVALUE','',PrevSelPos)
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
RETURN
|
||||
END
|
||||
|
||||
Set_Property(CtrlEntID,'INVALUE',VendCode,PrevSelPos)
|
||||
|
||||
ExpectedCode = Get_Property(@WINDOW,'@VENDOR_DEF')
|
||||
|
||||
IF VendCode NE ExpectedCode AND ExpectedCode NE '' THEN
|
||||
void = Msg(@WINDOW,'','EXPECTED_VENDOR_CODE','',ExpectedCode:@FM:VendCode)
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
END
|
||||
|
||||
ListArray = Get_Property(CtrlEntId,'ARRAY')
|
||||
CheckArray = Get_Property(@WINDOW,'@CHECK_ARRAY')
|
||||
|
||||
TotalScannedQty = SUM(ListArray<COL$LQP_QTY>)
|
||||
OpenQty = CheckArray<CA$LOT_QTY>
|
||||
|
||||
IF TotalScannedQty >= OpenQty THEN
|
||||
|
||||
Resp = Msg(@WINDOW,'','WO_REC_COMPLETE')
|
||||
|
||||
GOTO OK
|
||||
END
|
||||
|
||||
CASE LinePointer = 0
|
||||
* Empty Table
|
||||
LinePointer = 1
|
||||
CoilPointer = 1
|
||||
CASE ColPointer = ColCnt
|
||||
LinePointer += 1
|
||||
ColPointer = 1
|
||||
CASE 1
|
||||
ColPointer += 1
|
||||
END CASE
|
||||
END
|
||||
end
|
||||
Set_Property(CtrlEntId,"SELPOS",ColPointer:@FM:LinePointer)
|
||||
END
|
||||
|
||||
If Error_Services('HasError') then
|
||||
TypeOver = ''
|
||||
TypeOver<MTYPE$> = 'B&Rescan'
|
||||
Message = Error_Services('GetMessage')
|
||||
TypeOver<MTEXT$> = Message
|
||||
Msg(@Window, TypeOver, 'LABEL_DATA_ERROR')
|
||||
Set_Property(CtrlEntId, 'SELPOS', PrevSelPos)
|
||||
Set_Property(CtrlEntID, 'INVALUE', '', PrevSelPos)
|
||||
Error_Services('Clear')
|
||||
end else
|
||||
GOSUB Refresh
|
||||
end
|
||||
// Global scan validation check. Only alpha-numeric, dashes, spaces, and periods permitted.
|
||||
ValidationScan = Trim(ListData<PrevRow,PrevCol>)
|
||||
Convert @Lower_Case to @Upper_Case in ValidationScan
|
||||
Convert 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789- ./' to '' in ValidationScan
|
||||
//DPC 2/18/20 - changed validation to allow foward slash per supplier lot naming (Global Wafer)
|
||||
//FYI - conversion would only work when separated from above line
|
||||
Convert '/' to '' in ValidationScan
|
||||
If ValidationScan NE '' then
|
||||
Error_Services('Set', 'Scanned code ' : Quote(Trim(ListData<PrevRow,PrevCol>)) : ' contains an invalid character. Please re-scan.')
|
||||
end
|
||||
|
||||
If Error_Services('NoError') then
|
||||
IF ListData<PrevRow,PrevCol> NE '' THEN
|
||||
BEGIN CASE
|
||||
CASE PrevCol = COL$LQP_LOT
|
||||
|
||||
IF StripANSI THEN
|
||||
RawLot = TRIM(ListData<PrevRow,PrevCol>)
|
||||
IF RawLot[1,2] = '1T' OR RawLot[1,2] = '2T' THEN
|
||||
LotNo = RawLot[3,99]
|
||||
END ELSE
|
||||
Msg(@Window, '', 'OK', '', 'Scan Error':@FM:'Scanned Code ':QUOTE(RawLot):' is not an ANSI Lot No.')
|
||||
Set_Property(CtrlEntId,"SELPOS",PrevSelPos)
|
||||
Set_Property(CtrlEntID,'INVALUE','',PrevSelPos)
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
RETURN
|
||||
END
|
||||
END ELSE
|
||||
LotNo = TRIM(ListData<PrevRow,PrevCol>)
|
||||
END
|
||||
|
||||
IF CtrlEntID NE @WINDOW:'.LOT_QTY_SUB_PART' THEN
|
||||
|
||||
* Don't check Customer Lot Numbers if scanning substrates
|
||||
|
||||
LOCATE LotNo IN CheckArray<CA$LOT_NO> USING @VM SETTING Pos ELSE
|
||||
* Accept or Rescan message
|
||||
Resp = Msg(@Window, '', 'OK', '', 'Scan Error':@FM:'Lot No ':QUOTE(LotNo):' not found in':@TM:'Order Item Lot Numbers!')
|
||||
LotNo = '' ;* Clear entered field for a rescan
|
||||
Set_Property(CtrlEntId,"SELPOS",PrevSelPos) ;* Cursor to Lot No for a rescan
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
END
|
||||
END
|
||||
|
||||
Set_Property(CtrlEntID,'INVALUE',LotNo,PrevSelPos)
|
||||
|
||||
CASE PrevCol = COL$LQP_QTY
|
||||
|
||||
IF StripANSI THEN
|
||||
RawLotQty = ListData<PrevRow,PrevCol>
|
||||
IF RawLotQty[1,1] = 'Q' THEN
|
||||
LotQty = RawLotQty[2,99]
|
||||
END ELSE
|
||||
Msg(@Window, '', 'OK', '', 'Scan Error':@FM:'Scanned Code ':QUOTE(RawLotQty):' is not an ANSI Quantity')
|
||||
Set_Property(CtrlEntId,"SELPOS",PrevSelPos)
|
||||
Set_Property(CtrlEntID,'INVALUE','',PrevSelPos)
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
RETURN
|
||||
END
|
||||
END ELSE
|
||||
LotQty = ListData<PrevRow,PrevCol>
|
||||
END
|
||||
|
||||
IF NOT(NUM(LotQty)) THEN
|
||||
* Accept or Rescan message
|
||||
Resp = Msg(@Window, '', 'OK', '', 'Scan Error':@FM:'Lot Qty ':QUOTE(LotQty):' is not a number!')
|
||||
LotNo = '' ;* Clear entered field for a rescan
|
||||
Set_Property(CtrlEntId,"SELPOS",PrevSelPos) ;* Cursor to Lot No for a rescan
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
END
|
||||
|
||||
Set_Property(CtrlEntID,'INVALUE',LotQty,PrevSelPos)
|
||||
|
||||
|
||||
CASE PrevCol = COL$LQP_PART
|
||||
// Check scanned part number for 5 segments. If there are 5 segments then use segments 3 and 4
|
||||
// to make the actual part number.
|
||||
ScannedPartNo = Trim(ListData<PrevRow, PrevCol>)
|
||||
If DCount(ScannedPartNo, '-') EQ 5 then
|
||||
RawPartNo = ''
|
||||
If ScannedPartNo[1, 1] _EQC 'P' then RawPartNo := 'P'
|
||||
If ScannedPartNo[1, 1] _EQC 'S' then RawPartNo := 'S'
|
||||
RawPartNo := Field(ScannedPartNo, '-', 3, 2)
|
||||
ListData<PrevRow, PrevCol> = RawPartNo
|
||||
end
|
||||
RawPartNo = TRIM(ListData<PrevRow,PrevCol>)
|
||||
IF StripANSI AND NOT(SkipSubAnsi) THEN ;***************************************
|
||||
RawPartNo = TRIM(ListData<PrevRow,PrevCol>)
|
||||
IF RawPartNo[1,1] _EQC 'P' OR RawPartNo[1,1] _EQC 'S' THEN
|
||||
PartNo = RawPartNo[2,99]
|
||||
END ELSE
|
||||
Msg(@Window, '', 'OK', '', 'Scan Error':@FM:'Scanned Code ':QUOTE(RawPartNo):' is not an ANSI Part No')
|
||||
Set_Property(CtrlEntId,"SELPOS",PrevSelPos)
|
||||
Set_Property(CtrlEntID,'INVALUE','',PrevSelPos)
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
RETURN
|
||||
END
|
||||
END ELSE
|
||||
PartNo = ListData<PrevRow,PrevCol>
|
||||
END
|
||||
|
||||
IF CtrlEntID = @WINDOW:'.LOT_QTY_PART' THEN
|
||||
* Check Customer Part Numbers
|
||||
LOCATE PartNo IN CheckArray<CA$VERIFY_PART_NO> USING @VM SETTING Pos THEN
|
||||
PartNo = CheckArray<CA$CUST_PART_NO,Pos>
|
||||
END ELSE
|
||||
* Accept or Rescan message
|
||||
Resp = Msg(@Window, '', 'OK', '', 'Scan Error':@FM:'Part No ':QUOTE(PartNo):' not found in':@TM:'Order Customer Part Numbers!')
|
||||
PartNo = '' ;* Clear entered field for a rescan
|
||||
Set_Property(CtrlEntId,"SELPOS",PrevSelPos) ;* Cursor to Lot No for a rescan
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
END
|
||||
|
||||
END ELSE
|
||||
* Check Substrate Part Numbers
|
||||
LOCATE PartNo IN CheckArray<CA$SUB_PART_NO> USING @VM SETTING Pos ELSE
|
||||
* Accept or Rescan message
|
||||
Resp = Msg(@Window, '', 'OK', '', 'Scan Error':@FM:'Part No ':QUOTE(PartNo):' not found in':@TM:'Order Substrate Part Numbers!')
|
||||
PartNo = '' ;* Clear entered field for a rescan
|
||||
Set_Property(CtrlEntId,"SELPOS",PrevSelPos) ;* Cursor to Lot No for a rescan
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
END
|
||||
END ;* End of check for Customer supplied or Inventory substrate part number
|
||||
|
||||
Set_Property(CtrlEntID,'INVALUE',PartNo,PrevSelPos)
|
||||
|
||||
CASE PrevCol = COL$LQP_VENDOR
|
||||
|
||||
SubSuppBy = CheckArray<CA$SUB_SUPP_BY>
|
||||
VendCode = ''
|
||||
IF StripANSI AND NOT(SkipSubAnsi) THEN
|
||||
RawVendCode = TRIM(ListData<PrevRow,PrevCol>)
|
||||
IF RawVendCode[1,2] = '1V' THEN
|
||||
VendCode = RawVendCode[3,99]
|
||||
END ELSE
|
||||
TypeOver = ''
|
||||
TypeOver<MTYPE$> = 'B&Rescan'
|
||||
TypeOver<MTEXT$> = 'Scanned Code ':QUOTE(RawVendCode):' is not an ANSI Vendor Code'
|
||||
Resp = Msg(@WINDOW, '','OK', '', 'Scan Error':@FM:'Scanned Code ':QUOTE(RawVendCode):' is not an ANSI Vendor Code')
|
||||
Set_Property(CtrlEntID,"SELPOS",PrevSelPos)
|
||||
Set_Property(CtrlEntID,'INVALUE','',PrevSelPos)
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
RETURN
|
||||
END
|
||||
END ELSE
|
||||
VendCode = ListData<PrevRow,PrevCol>
|
||||
END
|
||||
|
||||
IF RowExists('SEMI_VEND_CODE', VendCode) OR SubSuppBy = 'C' ELSE
|
||||
* Accept or Rescan message
|
||||
If VendCode EQ '' then VendCode = RawVendCode
|
||||
Resp = Msg(@WINDOW, '','OK', '', 'Scan Error':@FM:'Vendor Code ':QUOTE(VendCode):' not found in':@TM:'Vendor Codes on file!')
|
||||
VendCode = '' ;* Clear entered field for a rescan
|
||||
Set_Property(CtrlEntId,"SELPOS",PrevSelPos) ;* Cursor to Lot No for a rescan
|
||||
Set_Property(CtrlEntID,'INVALUE','',PrevSelPos)
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
RETURN
|
||||
END
|
||||
|
||||
Set_Property(CtrlEntID,'INVALUE',VendCode,PrevSelPos)
|
||||
|
||||
ExpectedCode = Get_Property(@WINDOW,'@VENDOR_DEF')
|
||||
|
||||
IF VendCode NE ExpectedCode AND ExpectedCode NE '' THEN
|
||||
void = Msg(@WINDOW,'','EXPECTED_VENDOR_CODE','',ExpectedCode:@FM:VendCode)
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
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')
|
||||
|
||||
TotalScannedQty = SUM(ListArray<COL$LQP_QTY>)
|
||||
OpenQty = CheckArray<CA$LOT_QTY>
|
||||
|
||||
IF TotalScannedQty >= OpenQty THEN
|
||||
|
||||
Resp = Msg(@WINDOW,'','WO_REC_COMPLETE')
|
||||
|
||||
GOTO OK
|
||||
END
|
||||
|
||||
END CASE
|
||||
END
|
||||
end
|
||||
|
||||
If Error_Services('HasError') then
|
||||
TypeOver = ''
|
||||
TypeOver<MTYPE$> = 'B&Rescan'
|
||||
Message = Error_Services('GetMessage')
|
||||
TypeOver<MTEXT$> = Message
|
||||
Msg(@Window, TypeOver, 'LABEL_DATA_ERROR')
|
||||
Set_Property(CtrlEntId, 'SELPOS', PrevSelPos)
|
||||
Set_Property(CtrlEntID, 'INVALUE', '', PrevSelPos)
|
||||
Error_Services('Clear')
|
||||
end else
|
||||
GOSUB Refresh
|
||||
end
|
||||
|
||||
RETURN
|
||||
|
||||
@ -395,159 +418,166 @@ RETURN
|
||||
OK:
|
||||
* * * * * * *
|
||||
|
||||
CtrlEntID = @WINDOW:'.FIELD_RADIO'
|
||||
CheckArray = Get_Property(@WINDOW,'@CHECK_ARRAY')
|
||||
CtrlEntID = @WINDOW:'.FIELD_RADIO'
|
||||
CheckArray = Get_Property(@WINDOW,'@CHECK_ARRAY')
|
||||
|
||||
ControlSelection = Get_Property(CtrlEntID,'VALUE')
|
||||
ControlSelection = Get_Property(CtrlEntID,'VALUE')
|
||||
|
||||
Ctrls = @WINDOW:'.LOT_QTY':@RM ; Props = 'VISIBLE':@RM
|
||||
Ctrls := @WINDOW:'.LOT_QTY_PART':@RM ; Props := 'VISIBLE':@RM
|
||||
Ctrls := @WINDOW:'.LOT_QTY_SUB_PART' ; Props := 'VISIBLE'
|
||||
Ctrls = @WINDOW:'.LOT_QTY':@RM ; Props = 'VISIBLE':@RM
|
||||
Ctrls := @WINDOW:'.LOT_QTY_PART':@RM ; Props := 'VISIBLE':@RM
|
||||
Ctrls := @WINDOW:'.LOT_QTY_SUB_PART' ; Props := 'VISIBLE'
|
||||
|
||||
BEGIN CASE
|
||||
CASE ControlSelection = 'LQ' ; Ctrl = @WINDOW:'.LOT_QTY'
|
||||
CASE ControlSelection = 'LQP' ; Ctrl = @WINDOW:'.LOT_QTY_PART'
|
||||
CASE ControlSelection = 'LQSP' ; Ctrl = @WINDOW:'.LOT_QTY_SUB_PART'
|
||||
END CASE
|
||||
BEGIN CASE
|
||||
CASE ControlSelection = 'LQ' ; Ctrl = @WINDOW:'.LOT_QTY'
|
||||
CASE ControlSelection = 'LQP' ; Ctrl = @WINDOW:'.LOT_QTY_PART'
|
||||
CASE ControlSelection = 'LQSP' ; Ctrl = @WINDOW:'.LOT_QTY_SUB_PART'
|
||||
END CASE
|
||||
|
||||
ListData = Get_Property(Ctrl,'LIST')
|
||||
ListData = Get_Property(Ctrl,'LIST')
|
||||
|
||||
TimeStamp = Get_Property(@WINDOW:'.RX_DTM','TEXT')
|
||||
TimeStamp = ICONV(TimeStamp,'DT')
|
||||
IF TimeStamp = '' THEN
|
||||
ErrMsg('Invalid Received DateTime data entered. "mm/dd/yy hh:mm:ss" is the basic format.')
|
||||
RETURN
|
||||
END
|
||||
TimeStamp = Get_Property(@WINDOW:'.RX_DTM','TEXT')
|
||||
TimeStamp = ICONV(TimeStamp,'DT')
|
||||
IF TimeStamp = '' THEN
|
||||
ErrMsg('Invalid Received DateTime data entered. "mm/dd/yy hh:mm:ss" is the basic format.')
|
||||
RETURN
|
||||
END
|
||||
|
||||
CheckArray<CA$SCANNED_LOT_QTY> = '' ;* Clear scanned lot quantities column
|
||||
CheckArray<CA$SCANNED_LOT_QTY> = '' ;* Clear scanned lot quantities column
|
||||
|
||||
LineCnt = 1
|
||||
LOOP
|
||||
TestVal = ListData<LineCnt,1>
|
||||
UNTIL TestVal = ''
|
||||
LotNo = TRIM(ListData<LineCnt,1>)
|
||||
Qty = TRIM(ListData<LineCnt,2>)
|
||||
|
||||
IF ControlSelection = 'LQ' THEN
|
||||
LOCATE LotNo IN CheckArray<CA$LOT_NO> USING @VM SETTING Pos THEN
|
||||
OrderItemNo = CheckArray<CA$ITEM_NO,Pos>
|
||||
CustPartNo = CheckArray<CA$CUST_PART_NO,Pos>
|
||||
SubPartNo = CheckArray<CA$SUB_PART_NO,Pos>
|
||||
CheckArray<CA$SCANNED_LOT_QTY,Pos> = CheckArray<CA$SCANNED_LOT_QTY,Pos> + Qty
|
||||
END ELSE
|
||||
* Accept or Rescan message
|
||||
TypeOver = ''
|
||||
TypeOver<MTYPE$> = 'B&Rescan'
|
||||
TypeOver<MTEXT$> = 'Lot No ':QUOTE(LotNo):' not found in':@TM:'Order Item Lot Numbers!'
|
||||
Resp = Msg(@WINDOW,TypeOver,'LABEL_DATA_ERROR')
|
||||
LotNo = '' ;* Clear entered field for a rescan
|
||||
Set_Property(CtrlEntId,"SELPOS",CA$LOT_NO:@FM:LineCnt) ;* Cursor to Lot No for a rescan
|
||||
RETURN
|
||||
END
|
||||
LineCnt = 1
|
||||
LOOP
|
||||
TestVal = ListData<LineCnt,1>
|
||||
UNTIL TestVal = ''
|
||||
LotNo = TRIM(ListData<LineCnt,1>)
|
||||
Qty = TRIM(ListData<LineCnt,2>)
|
||||
|
||||
IF ControlSelection = 'LQ' THEN
|
||||
LOCATE LotNo IN CheckArray<CA$LOT_NO> USING @VM SETTING Pos THEN
|
||||
OrderItemNo = CheckArray<CA$ITEM_NO,Pos>
|
||||
CustPartNo = CheckArray<CA$CUST_PART_NO,Pos>
|
||||
SubPartNo = CheckArray<CA$SUB_PART_NO,Pos>
|
||||
CheckArray<CA$SCANNED_LOT_QTY,Pos> = CheckArray<CA$SCANNED_LOT_QTY,Pos> + Qty
|
||||
END ELSE
|
||||
* Accept or Rescan message
|
||||
TypeOver = ''
|
||||
TypeOver<MTYPE$> = 'B&Rescan'
|
||||
TypeOver<MTEXT$> = 'Lot No ':QUOTE(LotNo):' not found in':@TM:'Order Item Lot Numbers!'
|
||||
Resp = Msg(@WINDOW,TypeOver,'LABEL_DATA_ERROR')
|
||||
LotNo = '' ;* Clear entered field for a rescan
|
||||
Set_Property(CtrlEntId,"SELPOS",CA$LOT_NO:@FM:LineCnt) ;* Cursor to Lot No for a rescan
|
||||
RETURN
|
||||
END
|
||||
|
||||
END
|
||||
|
||||
IF ControlSelection = 'LQP' THEN
|
||||
CustPartNo = TRIM(ListData<LineCnt,3>)
|
||||
LOCATE LotNo IN CheckArray<CA$LOT_NO> USING @VM SETTING Pos THEN
|
||||
OrderItemNo = CheckArray<CA$ITEM_NO,Pos>
|
||||
SubPartNo = CheckArray<CA$SUB_PART_NO,Pos>
|
||||
CheckArray<CA$SCANNED_LOT_QTY,Pos> = CheckArray<CA$SCANNED_LOT_QTY,Pos> + Qty
|
||||
END ELSE
|
||||
* Accept or Rescan message
|
||||
TypeOver = ''
|
||||
TypeOver<MTYPE$> = 'B&Rescan'
|
||||
TypeOver<MTEXT$> = 'Lot No ':QUOTE(LotNo):' not found in':@TM:'Order Item Lot Numbers!'
|
||||
Resp = Msg(@WINDOW,TypeOver,'LABEL_DATA_ERROR')
|
||||
|
||||
LotNo = '' ;* Clear entered field for a rescan
|
||||
Set_Property(CtrlEntId,"SELPOS",CA$LOT_NO:@FM:LineCnt) ;* Cursor to Lot No for a rescan
|
||||
RETURN
|
||||
END
|
||||
END
|
||||
|
||||
IF ControlSelection = 'LQSP' THEN
|
||||
|
||||
SubPartNo = TRIM(ListData<LineCnt,3>)
|
||||
Vendor = TRIM(ListData<LineCnt,4>) ;* Added 7/14/2011 JCH for SAP
|
||||
OrderItemNo = CheckArray<CA$ITEM_NO,1> ;* Changed 2/8/2010 from ' = 1 ' JCH
|
||||
CustPartNo = CheckArray<CA$CUST_PART_NO,1>
|
||||
|
||||
END ELSE
|
||||
Vendor = ''
|
||||
END
|
||||
END
|
||||
|
||||
IF ControlSelection = 'LQP' THEN
|
||||
CustPartNo = TRIM(ListData<LineCnt,3>)
|
||||
LOCATE LotNo IN CheckArray<CA$LOT_NO> USING @VM SETTING Pos THEN
|
||||
OrderItemNo = CheckArray<CA$ITEM_NO,Pos>
|
||||
SubPartNo = CheckArray<CA$SUB_PART_NO,Pos>
|
||||
CheckArray<CA$SCANNED_LOT_QTY,Pos> = CheckArray<CA$SCANNED_LOT_QTY,Pos> + Qty
|
||||
END ELSE
|
||||
* Accept or Rescan message
|
||||
TypeOver = ''
|
||||
TypeOver<MTYPE$> = 'B&Rescan'
|
||||
TypeOver<MTEXT$> = 'Lot No ':QUOTE(LotNo):' not found in':@TM:'Order Item Lot Numbers!'
|
||||
Resp = Msg(@WINDOW,TypeOver,'LABEL_DATA_ERROR')
|
||||
|
||||
LotNo = '' ;* Clear entered field for a rescan
|
||||
Set_Property(CtrlEntId,"SELPOS",CA$LOT_NO:@FM:LineCnt) ;* Cursor to Lot No for a rescan
|
||||
RETURN
|
||||
END
|
||||
END
|
||||
|
||||
IF ControlSelection = 'LQSP' THEN
|
||||
|
||||
SubPartNo = TRIM(ListData<LineCnt,3>)
|
||||
Vendor = TRIM(ListData<LineCnt,4>) ;* Added 7/14/2011 JCH for SAP
|
||||
OrderItemNo = CheckArray<CA$ITEM_NO,1> ;* Changed 2/8/2010 from ' = 1 ' JCH
|
||||
CustPartNo = CheckArray<CA$CUST_PART_NO,1>
|
||||
|
||||
END ELSE
|
||||
Vendor = ''
|
||||
END
|
||||
|
||||
Result<1,LineCnt> = LineCnt
|
||||
Result<2,LineCnt> = LotNo ;* Lot No
|
||||
Result<3,LineCnt> = Qty
|
||||
Result<4,LineCnt> = CustPartNo ;* PartNo
|
||||
Result<5,LineCnt> = SubPartNo ;* Substrate Part No
|
||||
Result<6,LineCnt> = Vendor ;* Substrate Vendor Code
|
||||
Result<7,LineCnt> = OCONV(TimeStamp,'DT')
|
||||
Result<8,LineCnt> = @USER4
|
||||
Result<9,LineCnt> = OrderItemNo
|
||||
|
||||
LineCnt += 1
|
||||
REPEAT
|
||||
Result<1,LineCnt> = LineCnt
|
||||
Result<2,LineCnt> = LotNo ;* Lot No
|
||||
Result<3,LineCnt> = Qty
|
||||
Result<4,LineCnt> = CustPartNo ;* PartNo
|
||||
Result<5,LineCnt> = SubPartNo ;* Substrate Part No
|
||||
Result<6,LineCnt> = Vendor ;* Substrate Vendor Code
|
||||
Result<7,LineCnt> = OCONV(TimeStamp,'DT')
|
||||
Result<8,LineCnt> = @USER4
|
||||
Result<9,LineCnt> = OrderItemNo
|
||||
|
||||
LineCnt += 1
|
||||
REPEAT
|
||||
|
||||
IF ControlSelection NE 'LQSP' THEN
|
||||
IF ControlSelection NE 'LQSP' THEN
|
||||
|
||||
* Orders with Epi supplied substrates don't have any lot quantities to check against.
|
||||
|
||||
ProblemQtyLots = ''
|
||||
FOR I = 1 TO COUNT(CheckArray<CA$LOT_NO>,@VM) + (CheckArray<CA$LOT_NO> NE '')
|
||||
IF (CheckArray<CA$SCANNED_LOT_QTY,I> NE '') AND (CheckArray<CA$LOT_QTY,I> NE CheckArray<CA$SCANNED_LOT_QTY,I>) THEN
|
||||
* Lot quantity mismatch
|
||||
ProblemQtyLots<-1> = CheckArray<CA$LOT_NO,I>
|
||||
END
|
||||
NEXT I
|
||||
* Orders with Epi supplied substrates don't have any lot quantities to check against.
|
||||
|
||||
ProblemQtyLots = ''
|
||||
FOR I = 1 TO COUNT(CheckArray<CA$LOT_NO>,@VM) + (CheckArray<CA$LOT_NO> NE '')
|
||||
IF (CheckArray<CA$SCANNED_LOT_QTY,I> NE '') AND (CheckArray<CA$LOT_QTY,I> NE CheckArray<CA$SCANNED_LOT_QTY,I>) THEN
|
||||
* Lot quantity mismatch
|
||||
ProblemQtyLots<-1> = CheckArray<CA$LOT_NO,I>
|
||||
END
|
||||
NEXT I
|
||||
|
||||
IF ProblemQtyLots NE '' THEN
|
||||
LineCnt = 1
|
||||
LOOP
|
||||
TestVal = ListData<LineCnt,1>
|
||||
UNTIL TestVal = ''
|
||||
LotNo = TRIM(ListData<LineCnt,1>)
|
||||
LOCATE LotNo IN ProblemQtyLots USING @FM SETTING Pos THEN
|
||||
stat = Send_Message(Ctrl,'COLOR_BY_POS',0,LineCnt,RED$) ;* Flag all the lines with lot numbers having qty problems
|
||||
END
|
||||
LineCnt += 1
|
||||
REPEAT
|
||||
|
||||
ErrMsg('Lot Quantity(s) Scanned do not match Order Item Lot Quantity(s)!||Review and rescan highlighted items.')
|
||||
RETURN
|
||||
END
|
||||
END ELSE
|
||||
*
|
||||
END
|
||||
IF ProblemQtyLots NE '' THEN
|
||||
LineCnt = 1
|
||||
LOOP
|
||||
TestVal = ListData<LineCnt,1>
|
||||
UNTIL TestVal = ''
|
||||
LotNo = TRIM(ListData<LineCnt,1>)
|
||||
LOCATE LotNo IN ProblemQtyLots USING @FM SETTING Pos THEN
|
||||
stat = Send_Message(Ctrl,'COLOR_BY_POS',0,LineCnt,RED$) ;* Flag all the lines with lot numbers having qty problems
|
||||
END
|
||||
LineCnt += 1
|
||||
REPEAT
|
||||
|
||||
ErrMsg('Lot Quantity(s) Scanned do not match Order Item Lot Quantity(s)!||Review and rescan highlighted items.')
|
||||
RETURN
|
||||
END
|
||||
END ELSE
|
||||
*
|
||||
END
|
||||
|
||||
NumRows = DCount(Result, @FM)
|
||||
NullFound = False$
|
||||
For LineIndex = 1 to NumRows
|
||||
Row = Result<LineIndex>
|
||||
NumVals = DCount(Row, @VM)
|
||||
For ValIndex = 1 to NumVals
|
||||
Val = Row<0, ValIndex>
|
||||
If Val EQ '' then NullFound = True$
|
||||
Next ValIndex
|
||||
Until NullFound
|
||||
Next LineIndex
|
||||
If NullFound EQ True$ then
|
||||
ErrMsg('Missing value found in scanned data! Verify your labels and restart your scan operation.')
|
||||
Result = 'Cancel'
|
||||
end
|
||||
NumRows = DCount(Result, @FM)
|
||||
NullFound = False$
|
||||
For LineIndex = 1 to NumRows
|
||||
Row = Result<LineIndex>
|
||||
NumVals = DCount(Row, @VM)
|
||||
For ValIndex = 1 to NumVals
|
||||
Val = Row<0, ValIndex>
|
||||
If Val EQ '' then NullFound = True$
|
||||
Next ValIndex
|
||||
Until NullFound
|
||||
Next LineIndex
|
||||
If NullFound EQ True$ then
|
||||
ErrMsg('Missing value found in scanned data! Verify your labels and restart your scan operation.')
|
||||
Result = 'Cancel'
|
||||
end
|
||||
|
||||
ScanResult = Result
|
||||
Swap @VM with ' | ' in ScanResult
|
||||
ScanResult = Result
|
||||
Swap @VM with ' | ' in ScanResult
|
||||
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = @User4
|
||||
LogData<3> = ScanResult
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = @User4
|
||||
LogData<3> = ScanResult
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||
|
||||
End_Dialog(@WINDOW,Result)
|
||||
ProcIds = Get_Property(@Window, '@PROC_IDS')
|
||||
|
||||
If ProcIds NE '' then
|
||||
Response = ProcIds
|
||||
end else
|
||||
Response = 'Cancel'
|
||||
end
|
||||
|
||||
End_Dialog(@WINDOW,Response)
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
@ -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
|
||||
@ -143,7 +143,7 @@ obj_Appwindow('Create',@WINDOW)
|
||||
|
||||
**** Set Dropdown columns in .MET_TEST edit table ****
|
||||
|
||||
MetStyles = Send_Message(@WINDOW:'.MET_TEST','COLSTYLE',0,'')
|
||||
MetStyles = Send_Message(@WINDOW:'.MET_TEST','COLSTYLE',0,'')
|
||||
|
||||
MetStyles<COL$MET_TEST> = BitOr(MetStyles<COL$MET_TEST>,DROPDOWN_STYLE$)
|
||||
MetStyles<COL$MET_PROP> = BitOr(MetStyles<COL$MET_PROP>,DROPDOWN_STYLE$)
|
||||
@ -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
|
||||
|
||||
|
||||
@ -722,8 +738,8 @@ CurrLine = Get_Property(CtrlEntID,'LIST')<CurrRow>
|
||||
|
||||
|
||||
DefProp = ''
|
||||
BEGIN CASE
|
||||
|
||||
BEGIN CASE
|
||||
|
||||
CASE CurrCol = COL$MET_TOOL_CLASS
|
||||
|
||||
PropCode = CurrLine<1,COL$MET_PROP>
|
||||
@ -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
|
||||
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
|
||||
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')
|
||||
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,8 +830,18 @@ 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
|
||||
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 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')
|
||||
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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -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,95 +8,97 @@ Compile subroutine Copy_Backlog_Records_To_SQL(VOID)
|
||||
-------
|
||||
08/10/2010 KRF Original Programmer
|
||||
\*****************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
$Insert APP_INSERTS
|
||||
|
||||
Declare subroutine Copy_Record_To_SQL, Delete_Record_From_SQL, SRP_TcpClient, Copy_Pending_Records_To_Sql
|
||||
Declare function GetTickCount, Database_Services, SRP_TcpClient, Datetime, Environment_Services
|
||||
|
||||
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
|
||||
Lock hSysLists, 'Copy_Backlog_Records_To_SQL' then
|
||||
Main:
|
||||
|
||||
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
|
||||
Lock hSysLists, 'Copy_Backlog_Records_To_SQL' then
|
||||
|
||||
Copy_Pending_Records_To_Sql()
|
||||
Copy_Pending_Records_To_Sql()
|
||||
|
||||
CurrDtm = Datetime()
|
||||
TablesToSkip = Database_Services('ReadDataRow', 'APP_INFO', 'SQL_TABLES_TO_SKIP')
|
||||
NonCriticalTables = Database_Services('ReadDataRow', 'APP_INFO', 'NONCRITICAL_SQL_TABLES')
|
||||
|
||||
Open "SQL_PENDING" to pTable then
|
||||
|
||||
Open "SQL_BACKLOG" to hTable then
|
||||
ClearSelect
|
||||
Select hTable
|
||||
Done = 0
|
||||
Loop
|
||||
ReadNext Key else Done = 1
|
||||
Command = ''
|
||||
Skip = False$
|
||||
Until Done
|
||||
Table = Key[1, "*"]
|
||||
Locate Table in TablesToSkip by "AL" using "," setting ListPos then
|
||||
Delete hTable, Key else null
|
||||
end else
|
||||
Locate Table in NonCriticalTables using @FM setting Dummy then
|
||||
ID = Key[Col2() + 1, Len(Key)]
|
||||
|
||||
Read Dummy From pTable, Key then
|
||||
Skip = True$
|
||||
end
|
||||
|
||||
If Skip EQ False$ then
|
||||
Begin Case
|
||||
Case ID[-7, 7] EQ "*DELETE"
|
||||
ID[-7, 7] = ""
|
||||
Command := 'RUN DELETE_RECORD_FROM_SQL ':Quote(Table):', ':Quote(ID):', 1, ':Quote(Key)
|
||||
Write CurrDtm to pTable, Key then Delete hTable, Key
|
||||
Case ID[-6, 6] EQ "*WRITE"
|
||||
ID[-6, 6] = ""
|
||||
Command := 'RUN COPY_RECORD_TO_SQL ':Quote(Table):', ':Quote(ID):', 1, ':Quote(Key)
|
||||
Write CurrDtm to pTable, Key then Delete hTable, Key
|
||||
End Case
|
||||
end else
|
||||
// This record is already being processed and we don't need to process it multiple times.
|
||||
Delete hTable, Key else null
|
||||
end
|
||||
end else
|
||||
TempKey = Key
|
||||
TempKey[1, Len(Table) + 1] = ''
|
||||
TransTime = TempKey[-1, 'B*']
|
||||
TempKey[-1, Neg(Len(TransTime) + 1)] = ''
|
||||
TransDate = TempKey[-1, 'B*']
|
||||
TempKey[-1, Neg(Len(TransDate) + 1)] = ''
|
||||
Process = TempKey[-1, 'B*']
|
||||
TempKey[-1, Neg(Len(Process) + 1)] = ''
|
||||
ID = TempKey
|
||||
If Process EQ 'DELETE' then
|
||||
pKey = Key
|
||||
Command := 'RUN DELETE_RECORD_FROM_SQL ':Quote(Table):', ':Quote(ID):', 1, ':Quote(pKey)
|
||||
Write CurrDtm to pTable, pKey then Delete hTable, Key
|
||||
end else
|
||||
pKey = Key
|
||||
Command := 'RUN COPY_RECORD_TO_SQL ':Quote(Table):', ':Quote(ID):', 1, ':Quote(pKey)
|
||||
Write CurrDtm to pTable, pKey then Delete hTable, Key
|
||||
end
|
||||
end
|
||||
CurrDtm = Datetime()
|
||||
TablesToSkip = Database_Services('ReadDataRow', 'APP_INFO', 'SQL_TABLES_TO_SKIP')
|
||||
NonCriticalTables = Database_Services('ReadDataRow', 'APP_INFO', 'NONCRITICAL_SQL_TABLES')
|
||||
|
||||
Open "SQL_PENDING" to pTable then
|
||||
|
||||
Open "SQL_BACKLOG" to hTable then
|
||||
ClearSelect
|
||||
Select hTable
|
||||
Done = 0
|
||||
Loop
|
||||
ReadNext Key else Done = 1
|
||||
Command = ''
|
||||
Skip = False$
|
||||
Until Done
|
||||
Table = Key[1, "*"]
|
||||
Locate Table in TablesToSkip by "AL" using "," setting ListPos then
|
||||
Delete hTable, Key else null
|
||||
end else
|
||||
Locate Table in NonCriticalTables using @FM setting Dummy then
|
||||
ID = Key[Col2() + 1, Len(Key)]
|
||||
|
||||
Read Dummy From pTable, Key then
|
||||
Skip = True$
|
||||
end
|
||||
|
||||
If Skip EQ False$ then
|
||||
Begin Case
|
||||
Case ID[-7, 7] EQ "*DELETE"
|
||||
ID[-7, 7] = ""
|
||||
Command := 'RUN DELETE_RECORD_FROM_SQL ':Quote(Table):', ':Quote(ID):', 1, ':Quote(Key)
|
||||
Write CurrDtm to pTable, Key then Delete hTable, Key
|
||||
Case ID[-6, 6] EQ "*WRITE"
|
||||
ID[-6, 6] = ""
|
||||
Command := 'RUN COPY_RECORD_TO_SQL ':Quote(Table):', ':Quote(ID):', 1, ':Quote(Key)
|
||||
Write CurrDtm to pTable, Key then Delete hTable, Key
|
||||
End Case
|
||||
end else
|
||||
// This record is already being processed and we don't need to process it multiple times.
|
||||
Delete hTable, Key else null
|
||||
end
|
||||
end else
|
||||
TempKey = Key
|
||||
TempKey[1, Len(Table) + 1] = ''
|
||||
TransTime = TempKey[-1, 'B*']
|
||||
TempKey[-1, Neg(Len(TransTime) + 1)] = ''
|
||||
TransDate = TempKey[-1, 'B*']
|
||||
TempKey[-1, Neg(Len(TransDate) + 1)] = ''
|
||||
Process = TempKey[-1, 'B*']
|
||||
TempKey[-1, Neg(Len(Process) + 1)] = ''
|
||||
ID = TempKey
|
||||
If Process EQ 'DELETE' then
|
||||
pKey = Key
|
||||
Command := 'RUN DELETE_RECORD_FROM_SQL ':Quote(Table):', ':Quote(ID):', 1, ':Quote(pKey)
|
||||
Write CurrDtm to pTable, pKey then Delete hTable, Key
|
||||
end else
|
||||
pKey = Key
|
||||
Command := 'RUN COPY_RECORD_TO_SQL ':Quote(Table):', ':Quote(ID):', 1, ':Quote(pKey)
|
||||
Write CurrDtm to pTable, pKey then Delete hTable, Key
|
||||
end
|
||||
end
|
||||
|
||||
If Skip EQ False$ then
|
||||
TcpClientHandle = 0
|
||||
ServerIP = Environment_Services('GetApplicationRootIP')
|
||||
Convert '\' to '' in ServerIP
|
||||
If SRP_TcpClient(TcpClientHandle, 'CONNECT', ServerIP, '20779') then
|
||||
SRP_TcpClient(TcpClientHandle, 'SEND_SES', Command)
|
||||
SRP_TcpClient(TcpClientHandle, 'CLOSE_SES')
|
||||
end
|
||||
end
|
||||
end
|
||||
Repeat
|
||||
end
|
||||
end
|
||||
Unlock hSysLists, 'Copy_Backlog_Records_To_SQL' else Null
|
||||
end
|
||||
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, ServerPort) then
|
||||
SRP_TcpClient(TcpClientHandle, 'SEND_SES', Command)
|
||||
SRP_TcpClient(TcpClientHandle, 'CLOSE_SES')
|
||||
end
|
||||
end
|
||||
end
|
||||
Repeat
|
||||
end
|
||||
end
|
||||
Unlock hSysLists, 'Copy_Backlog_Records_To_SQL' else Null
|
||||
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,98 +7,104 @@ Compile subroutine Copy_Pending_Records_To_SQL(VOID)
|
||||
-------
|
||||
02/06/2023 DJS Adapted from Copy_Backlog_Records_To_SQL
|
||||
\*****************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
$Insert APP_INSERTS
|
||||
|
||||
EQU FIVE_MINUTES$ to 0.003472
|
||||
EQU SECONDS_PER_DAY$ to 86400
|
||||
EQU THIRTY_MINUTES$ to 1800
|
||||
|
||||
Declare subroutine Copy_Record_To_SQL, Delete_Record_From_SQL, SRP_TcpClient, Database_Services
|
||||
Declare function GetTickCount, Database_Services, SRP_TcpClient, Datetime, Database_Services, Environment_Services
|
||||
|
||||
// This only needs to be called every once in a while (e.g. 5 minutes ~ 0.003472)
|
||||
Run = False$
|
||||
CurrDtm = Datetime()
|
||||
LastRunDtm = Database_Services('ReadDataRow', 'APP_INFO', 'SQL_PENDING_LAST_RUNTIME')
|
||||
If LastRunDtm NE '' then
|
||||
TimeDiff = CurrDtm - LastRunDtm
|
||||
If TimeDiff GT 0.003472 then
|
||||
Run = True$
|
||||
LastRunDtm = CurrDtm
|
||||
end
|
||||
end else
|
||||
Run = True$
|
||||
LastRunDtm = CurrDtm
|
||||
end
|
||||
Main:
|
||||
|
||||
If Run then
|
||||
Database_Services('WriteDataRow', 'APP_INFO', 'SQL_PENDING_LAST_RUNTIME', LastRunDtm)
|
||||
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
|
||||
Lock hSysLists, 'Copy_Pending_Records_To_SQL' then
|
||||
// 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 FIVE_MINUTES$ then
|
||||
Run = True$
|
||||
LastRunDtm = CurrDtm
|
||||
end
|
||||
end else
|
||||
Run = True$
|
||||
LastRunDtm = CurrDtm
|
||||
end
|
||||
|
||||
NonCriticalTables = Database_Services('ReadDataRow', 'APP_INFO', 'NONCRITICAL_SQL_TABLES')
|
||||
Open "SQL_PENDING" to pTable then
|
||||
|
||||
ClearSelect
|
||||
Select pTable
|
||||
Done = False$
|
||||
Loop
|
||||
ReadNext Key else Done = True$
|
||||
Command = ''
|
||||
Until Done
|
||||
|
||||
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)
|
||||
Table = Key[1, "*"]
|
||||
Locate Table in NonCriticalTables using @FM setting Dummy then
|
||||
ID = Key[Col2() + 1, Len(Key)]
|
||||
Begin Case
|
||||
Case ID[-7, 7] EQ "*DELETE"
|
||||
ID[-7, 7] = ""
|
||||
Command := 'RUN DELETE_RECORD_FROM_SQL ':Quote(Table):', ':Quote(ID):', 1, ':Quote(Key)
|
||||
Case ID[-6, 6] EQ "*WRITE"
|
||||
ID[-6, 6] = ""
|
||||
Command := 'RUN COPY_RECORD_TO_SQL ':Quote(Table):', ':Quote(ID):', 1, ':Quote(Key)
|
||||
End Case
|
||||
end else
|
||||
TempKey = Key
|
||||
TempKey[1, Len(Table) + 1] = ''
|
||||
TransTime = TempKey[-1, 'B*']
|
||||
TempKey[-1, Neg(Len(TransTime) + 1)] = ''
|
||||
TransDate = TempKey[-1, 'B*']
|
||||
TempKey[-1, Neg(Len(TransDate) + 1)] = ''
|
||||
Process = TempKey[-1, 'B*']
|
||||
TempKey[-1, Neg(Len(Process) + 1)] = ''
|
||||
ID = TempKey
|
||||
If Process EQ 'DELETE' then
|
||||
Command := 'RUN DELETE_RECORD_FROM_SQL ':Quote(Table):', ':Quote(ID):', 1, ':Quote(Key)
|
||||
end else
|
||||
Command := 'RUN COPY_RECORD_TO_SQL ':Quote(Table):', ':Quote(ID):', 1, ':Quote(Key)
|
||||
end
|
||||
end
|
||||
|
||||
TcpClientHandle = 0
|
||||
ServerIP = Environment_Services('GetApplicationRootIP')
|
||||
Convert '\' to '' in ServerIP
|
||||
|
||||
If SRP_TcpClient(TcpClientHandle, 'CONNECT', ServerIP, '20779') then
|
||||
SRP_TcpClient(TcpClientHandle, 'SEND_SES', Command)
|
||||
SRP_TcpClient(TcpClientHandle, 'CLOSE_SES')
|
||||
end
|
||||
|
||||
end else
|
||||
// This transaction most likely won't replicate due to a schema mapping issue or because
|
||||
// the record no longer exists in OI, so remove this transaction from the pending queue.
|
||||
Delete pTable, Key else null
|
||||
end
|
||||
end
|
||||
If Run then
|
||||
Database_Services('WriteDataRow', 'APP_INFO', 'SQL_PENDING_LAST_RUNTIME', LastRunDtm)
|
||||
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
|
||||
Lock hSysLists, 'Copy_Pending_Records_To_SQL' then
|
||||
|
||||
Repeat
|
||||
end
|
||||
Unlock hSysLists, 'Copy_Pending_Records_To_SQL' else Null
|
||||
end
|
||||
end
|
||||
NonCriticalTables = Database_Services('ReadDataRow', 'APP_INFO', 'NONCRITICAL_SQL_TABLES')
|
||||
Open "SQL_PENDING" to pTable then
|
||||
|
||||
ClearSelect
|
||||
Select pTable
|
||||
Done = False$
|
||||
Loop
|
||||
ReadNext Key else Done = True$
|
||||
Command = ''
|
||||
Until Done
|
||||
|
||||
Read Rec from pTable, Key then
|
||||
TransDtm = Rec<1>
|
||||
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)]
|
||||
Begin Case
|
||||
Case ID[-7, 7] EQ "*DELETE"
|
||||
ID[-7, 7] = ""
|
||||
Command := 'RUN DELETE_RECORD_FROM_SQL ':Quote(Table):', ':Quote(ID):', 1, ':Quote(Key)
|
||||
Case ID[-6, 6] EQ "*WRITE"
|
||||
ID[-6, 6] = ""
|
||||
Command := 'RUN COPY_RECORD_TO_SQL ':Quote(Table):', ':Quote(ID):', 1, ':Quote(Key)
|
||||
End Case
|
||||
end else
|
||||
TempKey = Key
|
||||
TempKey[1, Len(Table) + 1] = ''
|
||||
TransTime = TempKey[-1, 'B*']
|
||||
TempKey[-1, Neg(Len(TransTime) + 1)] = ''
|
||||
TransDate = TempKey[-1, 'B*']
|
||||
TempKey[-1, Neg(Len(TransDate) + 1)] = ''
|
||||
Process = TempKey[-1, 'B*']
|
||||
TempKey[-1, Neg(Len(Process) + 1)] = ''
|
||||
ID = TempKey
|
||||
If Process EQ 'DELETE' then
|
||||
Command := 'RUN DELETE_RECORD_FROM_SQL ':Quote(Table):', ':Quote(ID):', 1, ':Quote(Key)
|
||||
end else
|
||||
Command := 'RUN COPY_RECORD_TO_SQL ':Quote(Table):', ':Quote(ID):', 1, ':Quote(Key)
|
||||
end
|
||||
end
|
||||
|
||||
TcpClientHandle = 0
|
||||
ServerIP = Environment_Services('GetApplicationRootIP')
|
||||
ServerPort = Environment_Services('GetScrapeServerPort')
|
||||
Convert '\' to '' in ServerIP
|
||||
|
||||
If SRP_TcpClient(TcpClientHandle, 'CONNECT', ServerIP, ServerPort) then
|
||||
SRP_TcpClient(TcpClientHandle, 'SEND_SES', Command)
|
||||
SRP_TcpClient(TcpClientHandle, 'CLOSE_SES')
|
||||
end
|
||||
|
||||
end else
|
||||
// This transaction most likely won't replicate due to a schema mapping issue or because
|
||||
// the record no longer exists in OI, so remove this transaction from the pending queue.
|
||||
Delete pTable, Key else null
|
||||
end
|
||||
end
|
||||
|
||||
Repeat
|
||||
end
|
||||
Unlock hSysLists, 'Copy_Pending_Records_To_SQL' else Null
|
||||
end
|
||||
end
|
||||
|
||||
Return
|
||||
|
||||
|
||||
|
@ -22,98 +22,108 @@ Compile function Copy_Record_To_SQL(Table, Key, LogError, pKey)
|
||||
09/23/2010 KRF Added logic to set @DICT, @ID, and @RECORD so handlers
|
||||
can use symbolics
|
||||
\*****************************************************************************/
|
||||
$insert Microsoft_Ado_Equates
|
||||
|
||||
If Assigned(LogError) else LogError = 0
|
||||
$Insert APP_INSERTS
|
||||
$Insert MICROSOFT_ADO_EQUATES
|
||||
|
||||
Declare subroutine SRP_Com, Sql_Services
|
||||
Declare function SRP_Com, Environment_Services, Datetime, Sql_Services, Error_Services, Database_Services
|
||||
Ans = ""
|
||||
Declare function SRP_Com, Environment_Services, Datetime, Sql_Services, Error_Services, Database_Services, Unassigned
|
||||
|
||||
// Make sure table is uppercase
|
||||
Convert @LOWER_CASE to @UPPER_CASE in Table
|
||||
Main:
|
||||
|
||||
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
|
||||
|
||||
// The expected name of the handler
|
||||
Handler = "COPY_":Table:"_RECORD_TO_SQL"
|
||||
|
||||
// Find the stored procedure that handles this table
|
||||
Open "SYSOBJ" to hSysObj then
|
||||
Read ObjCode from hSysObj, "$":Handler:"*LSL2" then
|
||||
// Connect to the ODBC
|
||||
If SRP_Com(Connection, "CREATE", "ADODB.Connection") then
|
||||
ConnectionString = Environment_Services('GetSQLScrapeConnectionString')
|
||||
If SRP_Com(Connection, "CALL", "Open", ConnectionString) EQ "" then
|
||||
// Read the record and call the handler
|
||||
Open Table to hTable then
|
||||
Read @RECORD from hTable, Key then
|
||||
If Key NE "" then
|
||||
Open "DICT.":Table to @DICT then null
|
||||
@ID = Key
|
||||
Ans = Function(@Handler(Connection, Key, @RECORD))
|
||||
If Ans EQ '' then
|
||||
If Assigned(pKey) then
|
||||
If pKey NE '' then
|
||||
Open 'SQL_PENDING' to pTable then
|
||||
Delete pTable, pKey else null
|
||||
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"
|
||||
|
||||
// Find the stored procedure that handles this table
|
||||
Open "SYSOBJ" to hSysObj then
|
||||
Read ObjCode from hSysObj, "$":Handler:"*LSL2" then
|
||||
// Connect to the ODBC
|
||||
If SRP_Com(Connection, "CREATE", "ADODB.Connection") then
|
||||
ConnectionString = Environment_Services('GetSQLScrapeConnectionString')
|
||||
If SRP_Com(Connection, "CALL", "Open", ConnectionString) EQ "" then
|
||||
// Read the record and call the handler
|
||||
Open Table to hTable then
|
||||
Read @RECORD from hTable, Key then
|
||||
If Key NE "" then
|
||||
Open "DICT.":Table to @DICT then null
|
||||
@ID = Key
|
||||
Ans = Function(@Handler(Connection, Key, @RECORD))
|
||||
If (Ans EQ '') then
|
||||
If Assigned(pKey) then
|
||||
If (pKey NE '') then
|
||||
Delete pTable, pKey else Null
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end else
|
||||
Ans = 'Unable to read ':Key:' from ':Table:' table.'
|
||||
end
|
||||
end
|
||||
end else
|
||||
Ans = 'Unable to open connection to SQL server. SQL connection error: ':SRP_Com(Connection, "ERROR")
|
||||
end
|
||||
SRP_Com(Connection, "CALL", "Close")
|
||||
SRP_Com(Connection, "RELEASE")
|
||||
end else
|
||||
Ans = "Unable to create ADO connection."
|
||||
end
|
||||
end
|
||||
|
||||
If LogError and Len(Ans) then
|
||||
Open "SQL_ERROR" to hSqlError then
|
||||
ErrorKey = OConv(Date(), "D4-J")
|
||||
Timestamp = OConv(Datetime(), 'DT')
|
||||
Read Errors from hSqlError, ErrorKey then
|
||||
Errors := @FM:Table:@VM:Key:@VM:Timestamp:@VM:Ans
|
||||
Write Errors to hSqlError, ErrorKey
|
||||
end else
|
||||
Errors = Table:@VM:Key:@VM:Timestamp:@VM:Ans
|
||||
Write Errors to hSqlError, ErrorKey
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
If Assigned(pKey) then
|
||||
If (pKey NE '') then
|
||||
// Always log the result
|
||||
Open 'SQL_LOG' to hLog then
|
||||
If Ans EQ '' then
|
||||
Result = 'PROCESSED'
|
||||
end else
|
||||
Result = Ans
|
||||
end else
|
||||
Ans = 'Unable to read ':Key:' from ':Table:' table.'
|
||||
end
|
||||
end
|
||||
end else
|
||||
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")
|
||||
end else
|
||||
Ans = "Unable to create ADO connection."
|
||||
end
|
||||
end
|
||||
CurrDate = Date()
|
||||
Read Log from hLog, CurrDate then
|
||||
Log := @FM:pKey:@VM:Result
|
||||
end else
|
||||
Log = pKey:@VM:Result
|
||||
|
||||
If LogError and Len(Ans) then
|
||||
Open "SQL_ERROR" to hSqlError then
|
||||
ErrorKey = OConv(Date(), "D4-J")
|
||||
Timestamp = OConv(Datetime(), 'DT')
|
||||
Read Errors from hSqlError, ErrorKey then
|
||||
Errors := @FM:Table:@VM:Key:@VM:Timestamp:@VM:Ans
|
||||
Write Errors to hSqlError, ErrorKey
|
||||
end else
|
||||
Errors = Table:@VM:Key:@VM:Timestamp:@VM:Ans
|
||||
Write Errors to hSqlError, ErrorKey
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
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
|
||||
Result = 'PROCESSED'
|
||||
end else
|
||||
Result = Ans
|
||||
end
|
||||
CurrDate = Date()
|
||||
Read Log from hLog, CurrDate then
|
||||
Log := @FM:pKey:@VM:Result
|
||||
end else
|
||||
Log = pKey:@VM:Result
|
||||
end
|
||||
Write Log to hLog, CurrDate
|
||||
end
|
||||
end
|
||||
end
|
||||
Write Log to hLog, CurrDate
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Return Ans
|
||||
|
||||
|
||||
|
||||
|
@ -14,49 +14,52 @@ 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
|
||||
Keys = "WO":@VM:SQL_Format(Key, "INT")
|
||||
|
||||
// List of data fields and their values
|
||||
DataFields = "ENTRY_ID" :@VM:SQL_Format(Rec(WO_LOG_ENTRY_ID$), "STR"):@FM
|
||||
DataFields := "ENTRY_DATE" :@VM:SQL_Format(Rec(WO_LOG_ENTRY_DATE$), "DATE"):@FM
|
||||
DataFields := "CUST_NO" :@VM:SQL_Format(Rec(WO_LOG_CUST_NO$), "INT"):@FM
|
||||
DataFields := "QTY" :@VM:SQL_Format(Rec(WO_LOG_QTY$), "INT"):@FM
|
||||
DataFields := "PROD_SPEC_ID" :@VM:SQL_Format(Rec(WO_LOG_PROD_SPEC_ID$), "INT"):@FM
|
||||
DataFields := "NOTES" :@VM:SQL_Format(Rec(WO_LOG_NOTES$), "STR", 1):@FM
|
||||
DataFields := "CUST_SHIP_DATE" :@VM:SQL_Format(Rec(WO_LOG_CUST_SHIP_DATE$), "DATE"):@FM
|
||||
DataFields := "STATUS" :@VM:SQL_Format(Rec(WO_LOG_STATUS$), "STR"):@FM
|
||||
DataFields := "ORG_SCHEDULED" :@VM:SQL_Format(Rec(WO_LOG_ORG_SCHEDULED$), "BIT"):@FM
|
||||
DataFields := "RECEIVED_DATE" :@VM:SQL_Format(Rec(WO_LOG_RECEIVED_DATE$), "DATE"):@FM
|
||||
DataFields := "CLOSE_DATE" :@VM:SQL_Format(Rec(WO_LOG_CLOSE_DATE$), "DATE"):@FM
|
||||
DataFields := "RECEIVED_TIME" :@VM:SQL_Format(Rec(WO_LOG_RECEIVED_TIME$), "TIME"):@FM
|
||||
DataFields := "COMMIT_DATE" :@VM:SQL_Format(Rec(WO_LOG_COMMIT_DATE$), "DATE"):@FM
|
||||
DataFields := "CYCLE_TIME" :@VM:SQL_Format(Rec(WO_LOG_CYCLE_TIME$), "STR"):@FM
|
||||
DataFields := "UNIT_PRICE" :@VM:SQL_Format(Rec(WO_LOG_UNIT_PRICE$), "STR"):@FM
|
||||
DataFields := "ORDER_NO" :@VM:SQL_Format(Rec(WO_LOG_ORDER_NO$), "STR"):@FM
|
||||
DataFields := "RX_DTM" :@VM:SQL_Format(Rec(WO_LOG_RX_DTM$), "DATETIME"):@FM
|
||||
DataFields := "OUT_CASS_LOAD_QTY":@VM:SQL_Format(Rec(WO_LOG_OUT_CASS_LOAD_QTY$), "INT"):@FM
|
||||
DataFields := "PART_NO" :@VM:SQL_Format(Rec(WO_LOG_PART_NO$), "STR"):@FM
|
||||
DataFields := "PROD_ORD_NO" :@VM:SQL_Format(Rec(WO_LOG_PROD_ORD_NO$), "STR"):@FM
|
||||
DataFields := "WO_START_DTM" :@VM:SQL_Format(Rec(WO_LOG_WO_START_DTM$), "DATETIME"):@FM
|
||||
DataFields := "WO_STOP_DTM" :@VM:SQL_Format(Rec(WO_LOG_WO_STOP_DTM$), "DATETIME"):@FM
|
||||
DataFields := "WO_HOLD" :@VM:SQL_Format(Rec(WO_LOG_WO_HOLD$), "BIT"):@FM
|
||||
DataFields := "EPI_PART_NO" :@VM:SQL_Format(Rec(WO_LOG_EPI_PART_NO$), "STR"):@FM
|
||||
DataFields := "ORD_SUB_PART_NO" :@VM:SQL_Format(Rec(WO_LOG_ORD_SUB_PART_NO$), "STR"):@FM
|
||||
DataFields := "ORD_SUB_PART_REV" :@VM:SQL_Format(Rec(WO_LOG_ORD_SUB_PART_REV$), "STR"):@FM
|
||||
DataFields := "CUST_PO_NO" :@VM:SQL_Format(Rec(WO_LOG_CUST_PO_NO$), "STR"):@FM
|
||||
DataFields := "SAP_ORD_QTY" :@VM:SQL_Format(Rec(WO_LOG_SAP_ORD_QTY$), "INT"):@FM
|
||||
DataFields := "CUST_PART_NO" :@VM:SQL_Format(Rec(WO_LOG_CUST_PART_NO$), "STR"):@FM
|
||||
DataFields := "CUST_PART_INBOUND":@VM:SQL_Format(Rec(WO_LOG_CUST_PART_INBOUND$), "STR"):@FM
|
||||
DataFields := "CUST_SUB_PART_NO" :@VM:SQL_Format(Rec(WO_LOG_CUST_SUB_PART_NO$), "STR"):@FM
|
||||
DataFields := "CUST_SUB_MFR" :@VM:SQL_Format(Rec(WO_LOG_CUST_SUB_MFR$), "STR"):@FM
|
||||
DataFields := "PROD_ORD_NO_TMP" :@VM:SQL_Format(Rec(WO_LOG_PROD_ORD_NO_TMP$), "STR"):@FM
|
||||
DataFields := "ORIGIN" :@VM:SQL_Format(Rec(WO_LOG_ORIGIN$), "STR"):@FM
|
||||
DataFields := "INCO_CODE" :@VM:SQL_Format(Rec(WO_LOG_INCO_CODE$), "STR"):@FM
|
||||
DataFields := "HOT_FLAG" :@VM:SQL_Format(Rec(WO_LOG_HOT_FLAG$), "BIT"):@FM
|
||||
DataFields = "ENTRY_ID" :@VM:SQL_Format(Rec(WO_LOG_ENTRY_ID$), "STR"):@FM
|
||||
DataFields := "ENTRY_DATE" :@VM:SQL_Format(Rec(WO_LOG_ENTRY_DATE$), "DATE"):@FM
|
||||
DataFields := "CUST_NO" :@VM:SQL_Format(Rec(WO_LOG_CUST_NO$), "INT"):@FM
|
||||
DataFields := "QTY" :@VM:SQL_Format(Rec(WO_LOG_QTY$), "INT"):@FM
|
||||
DataFields := "PROD_SPEC_ID" :@VM:SQL_Format(Rec(WO_LOG_PROD_SPEC_ID$), "INT"):@FM
|
||||
DataFields := "NOTES" :@VM:SQL_Format(Rec(WO_LOG_NOTES$), "STR", 1):@FM
|
||||
DataFields := "CUST_SHIP_DATE" :@VM:SQL_Format(Rec(WO_LOG_CUST_SHIP_DATE$), "DATE"):@FM
|
||||
DataFields := "STATUS" :@VM:SQL_Format(Rec(WO_LOG_STATUS$), "STR"):@FM
|
||||
DataFields := "ORG_SCHEDULED" :@VM:SQL_Format(Rec(WO_LOG_ORG_SCHEDULED$), "BIT"):@FM
|
||||
DataFields := "RECEIVED_DATE" :@VM:SQL_Format(Rec(WO_LOG_RECEIVED_DATE$), "DATE"):@FM
|
||||
DataFields := "CLOSE_DATE" :@VM:SQL_Format(Rec(WO_LOG_CLOSE_DATE$), "DATE"):@FM
|
||||
DataFields := "RECEIVED_TIME" :@VM:SQL_Format(Rec(WO_LOG_RECEIVED_TIME$), "TIME"):@FM
|
||||
DataFields := "COMMIT_DATE" :@VM:SQL_Format(Rec(WO_LOG_COMMIT_DATE$), "DATE"):@FM
|
||||
DataFields := "CYCLE_TIME" :@VM:SQL_Format(Rec(WO_LOG_CYCLE_TIME$), "STR"):@FM
|
||||
DataFields := "UNIT_PRICE" :@VM:SQL_Format(Rec(WO_LOG_UNIT_PRICE$), "STR"):@FM
|
||||
DataFields := "ORDER_NO" :@VM:SQL_Format(Rec(WO_LOG_ORDER_NO$), "STR"):@FM
|
||||
DataFields := "RX_DTM" :@VM:SQL_Format(Rec(WO_LOG_RX_DTM$), "DATETIME"):@FM
|
||||
DataFields := "OUT_CASS_LOAD_QTY" :@VM:SQL_Format(Rec(WO_LOG_OUT_CASS_LOAD_QTY$), "INT"):@FM
|
||||
DataFields := "PART_NO" :@VM:SQL_Format(Rec(WO_LOG_PART_NO$), "STR"):@FM
|
||||
DataFields := "PROD_ORD_NO" :@VM:SQL_Format(Rec(WO_LOG_PROD_ORD_NO$), "STR"):@FM
|
||||
DataFields := "WO_START_DTM" :@VM:SQL_Format(Rec(WO_LOG_WO_START_DTM$), "DATETIME"):@FM
|
||||
DataFields := "WO_STOP_DTM" :@VM:SQL_Format(Rec(WO_LOG_WO_STOP_DTM$), "DATETIME"):@FM
|
||||
DataFields := "WO_HOLD" :@VM:SQL_Format(Rec(WO_LOG_WO_HOLD$), "BIT"):@FM
|
||||
DataFields := "EPI_PART_NO" :@VM:SQL_Format(Rec(WO_LOG_EPI_PART_NO$), "STR"):@FM
|
||||
DataFields := "ORD_SUB_PART_NO" :@VM:SQL_Format(Rec(WO_LOG_ORD_SUB_PART_NO$), "STR"):@FM
|
||||
DataFields := "ORD_SUB_PART_REV" :@VM:SQL_Format(Rec(WO_LOG_ORD_SUB_PART_REV$), "STR"):@FM
|
||||
DataFields := "CUST_PO_NO" :@VM:SQL_Format(Rec(WO_LOG_CUST_PO_NO$), "STR"):@FM
|
||||
DataFields := "SAP_ORD_QTY" :@VM:SQL_Format(Rec(WO_LOG_SAP_ORD_QTY$), "INT"):@FM
|
||||
DataFields := "CUST_PART_NO" :@VM:SQL_Format(Rec(WO_LOG_CUST_PART_NO$), "STR"):@FM
|
||||
DataFields := "CUST_PART_INBOUND" :@VM:SQL_Format(Rec(WO_LOG_CUST_PART_INBOUND$), "STR"):@FM
|
||||
DataFields := "CUST_SUB_PART_NO" :@VM:SQL_Format(Rec(WO_LOG_CUST_SUB_PART_NO$), "STR"):@FM
|
||||
DataFields := "CUST_SUB_MFR" :@VM:SQL_Format(Rec(WO_LOG_CUST_SUB_MFR$), "STR"):@FM
|
||||
DataFields := "PROD_ORD_NO_TMP" :@VM:SQL_Format(Rec(WO_LOG_PROD_ORD_NO_TMP$), "STR"):@FM
|
||||
DataFields := "ORIGIN" :@VM:SQL_Format(Rec(WO_LOG_ORIGIN$), "STR"):@FM
|
||||
DataFields := "INCO_CODE" :@VM:SQL_Format(Rec(WO_LOG_INCO_CODE$), "STR"):@FM
|
||||
DataFields := "HOT_FLAG" :@VM:SQL_Format(Rec(WO_LOG_HOT_FLAG$), "BIT"):@FM
|
||||
DataFields := "CURR_STATUS_STATIC" :@VM:SQL_Format(Rec(WO_LOG_CURR_STATUS_STATIC$), "STR"):@FM
|
||||
DataFields := "REL_QTY" :@VM:SQL_Format(Rec(WO_LOG_REL_QTY_STATIC$), "INT"):@FM
|
||||
DataFields := "UNREL_QTY" :@VM:SQL_Format(Rec(WO_LOG_UNREL_QTY_STATIC$), "INT"):@FM
|
||||
|
||||
// Symbolics
|
||||
DataFields := "START_DT" :@VM:SQL_Format({START_DT}, "DATE"):@FM
|
||||
@ -68,9 +71,7 @@ DataFields := "CYCLE_TIME_WIP" :@VM:SQL_Format({CYCLE_TIME_WIP},
|
||||
DataFields := "CYCLE_TIME_DELTA" :@VM:SQL_Format({CYCLE_TIME_DELTA}, "DEC", 1):@FM
|
||||
DataFields := "CYCLE_TIME_QA_SHIP" :@VM:SQL_Format({CYCLE_TIME_QA_SHIP}, "DEC", 1):@FM
|
||||
DataFields := "CYCLE_TIME_REL_FIRST_VER":@VM:SQL_Format({CYCLE_TIME_REL_FIRST_VER}, "DEC", 1):@FM
|
||||
DataFields := "SAP_TOT_WFR_QTY" :@VM:SQL_Format({SAP_TOT_WFR_QTY}, "STR"):@FM
|
||||
DataFields := "REL_QTY" :@VM:SQL_Format({REL_QTY}, "INT"):@FM
|
||||
DataFields := "UNREL_QTY" :@VM:SQL_Format({UNREL_QTY}, "INT")
|
||||
DataFields := "SAP_TOT_WFR_QTY" :@VM:SQL_Format({SAP_TOT_WFR_QTY}, "STR")
|
||||
|
||||
// Write the data to the SQL database
|
||||
Ans = SQL_Write(Connection, "WO_LOG", Keys, DataFields)
|
||||
@ -349,3 +350,4 @@ If Ans EQ "" AND CassIdSap NE "" then
|
||||
end
|
||||
|
||||
Return Ans
|
||||
|
||||
|
@ -527,7 +527,7 @@ end service
|
||||
// Reads a data column for the indicated Key ID and database table.
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service ReadDataColumn(TableName, KeyID, ColumnNo, NotExpired, ExpirationDuration, IgnoreMFSRoutines)
|
||||
|
||||
|
||||
If NotExpired NE False$ then NotExpired = True$
|
||||
If (ExpirationDuration EQ '') OR (Not(Num(ExpirationDuration))) then ExpirationDuration = 0
|
||||
If IgnoreMFSRoutines NE True$ then IgnoreMFSRoutines = False$
|
||||
@ -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
|
||||
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
|
||||
@ -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,81 +18,95 @@ Compile function Delete_Record_From_SQL(Table, Key, LogError, pKey)
|
||||
-------
|
||||
09/15/2010 KRF Original Programmer
|
||||
\*****************************************************************************/
|
||||
|
||||
$insert Microsoft_Ado_Equates
|
||||
|
||||
If Assigned(LogError) else LogError = 0
|
||||
$Insert APP_INSERTS
|
||||
$insert MICROSOFT_ADO_EQUATES
|
||||
|
||||
Declare subroutine Sql_Services, SRP_COM
|
||||
Declare function Sql_Services, Error_Services, SRP_COM, Environment_Services
|
||||
Ans = ""
|
||||
Declare function Sql_Services, Error_Services, SRP_COM, Environment_Services, Unassigned
|
||||
|
||||
// Make sure table is uppercase
|
||||
Convert @LOWER_CASE to @UPPER_CASE in Table
|
||||
Main:
|
||||
|
||||
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
|
||||
|
||||
// The expected name of the handler
|
||||
Handler = "DELETE_":Table:"_RECORD_FROM_SQL"
|
||||
If pKey NE '' then Lock pTable, pKey else Done = True$
|
||||
|
||||
If Not(Done) then
|
||||
// The expected name of the handler
|
||||
Handler = "DELETE_":Table:"_RECORD_FROM_SQL"
|
||||
|
||||
// Find the stored procedure that handles this table
|
||||
Open "SYSOBJ" to hSysObj then
|
||||
Read ObjCode from hSysObj, "$":Handler:"*LSL2" then
|
||||
// Connect to the ODBC/ADO
|
||||
If SRP_Com(Connection, "CREATE", "ADODB.Connection") then
|
||||
// Connect to the database via ODBC
|
||||
ConnectionString = Environment_Services('GetSQLScrapeConnectionString')
|
||||
If SRP_Com(Connection, "CALL", "Open", ConnectionString) EQ "" then
|
||||
// Read the record and call the handler
|
||||
If Key NE "" then
|
||||
Ans = Function(@Handler(Connection, Key))
|
||||
If Ans EQ '' then
|
||||
If Assigned(pKey) then
|
||||
Open 'SQL_PENDING' to pTable then
|
||||
Delete pTable, pKey else null
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end else
|
||||
Ans = 'Unable to open connection to SQL server. SQL connection error: ':SRP_Com(Connection, "ERROR")
|
||||
end
|
||||
SRP_Com(Connection, "CALL", "Close")
|
||||
SRP_Com(Connection, "RELEASE")
|
||||
end else
|
||||
Ans = "Unable to create ADO connection."
|
||||
end
|
||||
end
|
||||
end
|
||||
// Find the stored procedure that handles this table
|
||||
Open "SYSOBJ" to hSysObj then
|
||||
Read ObjCode from hSysObj, "$":Handler:"*LSL2" then
|
||||
// Connect to the ODBC/ADO
|
||||
If SRP_Com(Connection, "CREATE", "ADODB.Connection") then
|
||||
// Connect to the database via ODBC
|
||||
ConnectionString = Environment_Services('GetSQLScrapeConnectionString')
|
||||
If SRP_Com(Connection, "CALL", "Open", ConnectionString) EQ "" then
|
||||
// Read the record and call the handler
|
||||
If Key NE "" then
|
||||
Ans = Function(@Handler(Connection, Key))
|
||||
If (Ans EQ '') then
|
||||
If Assigned(pKey) then
|
||||
If (pKey NE '') then
|
||||
Delete pTable, pKey else Null
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end else
|
||||
Ans = 'Unable to open connection to SQL server. SQL connection error: ':SRP_Com(Connection, "ERROR")
|
||||
end
|
||||
SRP_Com(Connection, "CALL", "Close")
|
||||
SRP_Com(Connection, "RELEASE")
|
||||
end else
|
||||
Ans = "Unable to create ADO connection."
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
If LogError AND Len(Ans) then
|
||||
Open "SQL_ERROR" to hSqlError then
|
||||
Read Errors from hSqlError, Date() then
|
||||
Errors := @FM:Table:@VM:Key:@VM:Ans
|
||||
Write Errors to hSqlError, Date()
|
||||
end else
|
||||
Errors = Table:@VM:Key:@VM:Ans
|
||||
Write Errors to hSqlError, Date()
|
||||
end
|
||||
end
|
||||
end
|
||||
If LogError AND Len(Ans) then
|
||||
Open "SQL_ERROR" to hSqlError then
|
||||
Read Errors from hSqlError, Date() then
|
||||
Errors := @FM:Table:@VM:Key:@VM:Ans
|
||||
Write Errors to hSqlError, Date()
|
||||
end else
|
||||
Errors = Table:@VM:Key:@VM:Ans
|
||||
Write Errors to hSqlError, Date()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
// Always log the result
|
||||
|
||||
If Assigned(pKey) then
|
||||
Open 'SQL_LOG' to hLog then
|
||||
If Ans EQ '' then
|
||||
Result = 'PROCESSED'
|
||||
end else
|
||||
Result = Ans
|
||||
end
|
||||
CurrDate = Date()
|
||||
Read Log from hLog, CurrDate then
|
||||
Log := @FM:pKey:@VM:Result
|
||||
end else
|
||||
Log = pKey:@VM:Result
|
||||
end
|
||||
Write Log to hLog, CurrDate
|
||||
end
|
||||
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'
|
||||
end else
|
||||
Result = Ans
|
||||
end
|
||||
CurrDate = Date()
|
||||
Read Log from hLog, CurrDate then
|
||||
Log := @FM:pKey:@VM:Result
|
||||
end else
|
||||
Log = pKey:@VM:Result
|
||||
end
|
||||
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"
|
||||
|
||||
|
@ -1,97 +1,96 @@
|
||||
Function Engineinfo_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 : Engineinfo_API
|
||||
|
||||
Description : API logic for the Engineinfo 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 Engineinfo[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Engineinfo.POST
|
||||
- Engineinfo.ID.PUT
|
||||
- Engineinfo.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)
|
||||
07/17/24 xxx Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert API_SETUP
|
||||
$insert HTTP_INSERTS
|
||||
$insert ENGINE_HEALTH_EQUATES
|
||||
|
||||
Declare function System_Healthcheck_Services
|
||||
|
||||
GoToAPI else
|
||||
// The specific resource endpoint doesn't have a API handler yet.
|
||||
HTTP_Services('SetResponseStatus', 200, 'This is a valid endpoint but a web API handler has not yet been created.')
|
||||
end
|
||||
|
||||
Return Response OR ''
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Endpoint Handlers
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
API remotehealthcheck.HEAD
|
||||
API remotehealthcheck.GET
|
||||
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
|
||||
API engineinfo.HEAD
|
||||
API engineinfo.GET
|
||||
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
|
||||
API engineinfo.ID.HEAD
|
||||
API engineinfo.ID.GET
|
||||
|
||||
EngineID = EndpointSegment
|
||||
If RowExists('APP_INFO', EngineID) then
|
||||
EngineHealthInfo = System_Healthcheck_Services('GetEngineHealthInfo', EngineID)
|
||||
If Error_Services('NoError') then
|
||||
EngineJSON = System_Healthcheck_Services('ConvertEngineHealthInfoToJSON', EngineHealthInfo, FullEndpointURL)
|
||||
ResponseCode = 200
|
||||
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||
HTTP_Services('SetResponseBody', EngineJSON, False$, 'application/hal+json')
|
||||
HTTP_Services('SetResponseStatus', ResponseCode)
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 500, Error_Services('GetMessage'))
|
||||
end
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 401, 'Invalid Engine ID.')
|
||||
end
|
||||
|
||||
end api
|
||||
|
||||
Function Engineinfo_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 : Engineinfo_API
|
||||
|
||||
Description : API logic for the Engineinfo 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 Engineinfo[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Engineinfo.POST
|
||||
- Engineinfo.ID.PUT
|
||||
- Engineinfo.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)
|
||||
07/17/24 xxx Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert API_SETUP
|
||||
$insert HTTP_INSERTS
|
||||
$insert ENGINE_HEALTH_EQUATES
|
||||
|
||||
Declare function System_Healthcheck_Services
|
||||
|
||||
GoToAPI else
|
||||
// The specific resource endpoint doesn't have a API handler yet.
|
||||
HTTP_Services('SetResponseStatus', 200, 'This is a valid endpoint but a web API handler has not yet been created.')
|
||||
end
|
||||
|
||||
Return Response OR ''
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Endpoint Handlers
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
API remotehealthcheck.HEAD
|
||||
API remotehealthcheck.GET
|
||||
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
|
||||
API engineinfo.HEAD
|
||||
API engineinfo.GET
|
||||
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
|
||||
API engineinfo.ID.HEAD
|
||||
API engineinfo.ID.GET
|
||||
|
||||
EngineID = EndpointSegment
|
||||
If RowExists('APP_INFO', EngineID) then
|
||||
EngineHealthInfo = System_Healthcheck_Services('GetEngineHealthInfo', EngineID)
|
||||
If Error_Services('NoError') then
|
||||
EngineJSON = System_Healthcheck_Services('ConvertEngineHealthInfoToJSON', EngineHealthInfo, FullEndpointURL)
|
||||
ResponseCode = 200
|
||||
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||
HTTP_Services('SetResponseBody', EngineJSON, False$, 'application/hal+json')
|
||||
HTTP_Services('SetResponseStatus', ResponseCode)
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 500, Error_Services('GetMessage'))
|
||||
end
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 401, 'Invalid Engine ID.')
|
||||
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
|
||||
@ -122,7 +122,8 @@ Service GetApplicationRootIP()
|
||||
Case Machine EQ 'MESTSA09EC' ; ApplicationRootIP = '\\10.95.140.62'
|
||||
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 '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,13 +593,7 @@ 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
|
||||
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
|
||||
end
|
||||
end
|
||||
|
||||
@ -1763,14 +1757,7 @@ 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
|
||||
Logging_Services('AppendLog', objWIPLog, LogData, @RM, @FM, False$)
|
||||
end
|
||||
end else
|
||||
// Cass not in queue that was passed in. Log this information.
|
||||
@ -1781,14 +1768,7 @@ 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
|
||||
Logging_Services('AppendLog', objWIPLog, LogData, @RM, @FM, False$)
|
||||
end
|
||||
end else
|
||||
// WOMatKey is null
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,72 +1,71 @@
|
||||
Function Healthinfo_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 : Healthinfo_API
|
||||
|
||||
Description : API logic for the Healthinfo 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 Healthinfo[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Healthinfo.POST
|
||||
- Healthinfo.ID.PUT
|
||||
- Healthinfo.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)
|
||||
07/17/24 xxx Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert API_SETUP
|
||||
$insert HTTP_INSERTS
|
||||
|
||||
GoToAPI else
|
||||
// The specific resource endpoint doesn't have a API handler yet.
|
||||
HTTP_Services('SetResponseStatus', 200, 'This is a valid endpoint but a web API handler has not yet been created.')
|
||||
end
|
||||
|
||||
Return Response OR ''
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Endpoint Handlers
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
API remotehealthcheck.HEAD
|
||||
API remotehealthcheck.GET
|
||||
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
|
||||
API healthinfo.HEAD
|
||||
API healthinfo.GET
|
||||
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
Function Healthinfo_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 : Healthinfo_API
|
||||
|
||||
Description : API logic for the Healthinfo 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 Healthinfo[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Healthinfo.POST
|
||||
- Healthinfo.ID.PUT
|
||||
- Healthinfo.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)
|
||||
07/17/24 xxx Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert API_SETUP
|
||||
$insert HTTP_INSERTS
|
||||
|
||||
GoToAPI else
|
||||
// The specific resource endpoint doesn't have a API handler yet.
|
||||
HTTP_Services('SetResponseStatus', 200, 'This is a valid endpoint but a web API handler has not yet been created.')
|
||||
end
|
||||
|
||||
Return Response OR ''
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Endpoint Handlers
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
API remotehealthcheck.HEAD
|
||||
API remotehealthcheck.GET
|
||||
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
|
||||
API healthinfo.HEAD
|
||||
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.')
|
||||
@ -268,7 +268,7 @@ end service
|
||||
// Places a lot on hold.
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service OnHold(WOMatKey, HoldEntity, HoldEntityID, HoldType, HoldData, OperatorID, OriginFlag)
|
||||
|
||||
|
||||
IF WOMatKey = '' or HoldEntity = '' or HoldEntityID = '' or HoldType = '' THEN
|
||||
Error_Services('Add', 'Null parameter WOMatKey, HoldEntity, HoldEntityID, or HoldType passed to service.')
|
||||
end else
|
||||
@ -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)
|
||||
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)
|
||||
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')
|
||||
RDSNo = Xlate('WO_MAT', WOMatKey, WO_MAT_RDS_NO$, 'X')
|
||||
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.')
|
||||
@ -406,7 +419,7 @@ End Service
|
||||
// Removes a hold placed on a lot.
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service OffHold(WOMatKey, HoldEntity, HoldEntityID, HoldType, HoldData, OperatorID, OriginFlag)
|
||||
|
||||
|
||||
IF WOMatKey = '' or HoldEntity = '' or HoldEntityID = '' or HoldType = '' THEN
|
||||
Error_Services('Add', 'Null parameter WOMatKey, HoldEntity, HoldEntityID, or HoldType passed to service.')
|
||||
end else
|
||||
@ -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
|
||||
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')
|
||||
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')
|
||||
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')
|
||||
Case HoldEntity EQ 'WO_MAT'
|
||||
Lot_Event_Services('CreateLotEvent', WOMatKey, CurrDTM, 'HOLD_OFF', 'Lot taken off hold.', '', UserId, True$, 'WO_MAT')
|
||||
End Case
|
||||
LotKey = ''
|
||||
Begin Case
|
||||
Case HoldEntity EQ 'WM_IN'
|
||||
WONo = Field(WOMatKey, '*', 1)
|
||||
StepNo = 1
|
||||
CassNo = Field(WOMatKey, '*', 2)
|
||||
WMInKey = WONo : '*' : StepNo : '*' : CassNo
|
||||
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
|
||||
LotKey = 'O':WMOutKey
|
||||
Convert '*' to '.' in LotKey
|
||||
Case HoldEntity EQ 'RDS'
|
||||
RDSNo = Xlate('WO_MAT', WOMatKey, WO_MAT_RDS_NO$, 'X')
|
||||
LotKey = 'R':RDSNo
|
||||
Case HoldEntity EQ '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.')
|
||||
|
@ -137,7 +137,7 @@ end service
|
||||
|
||||
|
||||
Service ReprintHoldLabel(EntityType, LotID)
|
||||
|
||||
|
||||
WOMatKey = ''
|
||||
Begin Case
|
||||
Case EntityType EQ 'RDS'
|
||||
@ -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
|
||||
|
@ -1,167 +1,163 @@
|
||||
Function Lock_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 : Lock_API
|
||||
|
||||
Description : API logic for the Lock 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 Lock[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Lock.POST
|
||||
- Lock.ID.PUT
|
||||
- Lock.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)
|
||||
03/14/24 djm Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert API_SETUP
|
||||
$insert HTTP_INSERTS
|
||||
|
||||
Declare function Database_Services, Oi_Wizard_Services, Memberof, Lock_Services
|
||||
Declare subroutine Lock_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 Lock.HEAD
|
||||
|
||||
|
||||
// GET Method removed until RTI_LH_Info(CMD_LOCKS_INFO$, '') is fixed ////////////////////////////////
|
||||
|
||||
* API Lock.GET
|
||||
*
|
||||
* OIWizardID = ''
|
||||
* Cookies = HTTP_Services('GetHTTPCookie')
|
||||
* For each Cookie in Cookies using ';'
|
||||
* Key = Trim(Field(Cookie, '=', 1))
|
||||
* If Key EQ 'sessionID' then
|
||||
* OIWizardID = Field(Cookie, '=', 2)
|
||||
* end
|
||||
* If Key EQ 'userID' then
|
||||
* CurrUser = Field(Cookie, '=', 2)
|
||||
* end
|
||||
* Next Cookie
|
||||
*
|
||||
* ValidSession = OI_Wizard_Services('ValidateSession', OIWizardID)
|
||||
*
|
||||
* If ValidSession then
|
||||
*
|
||||
* Allowed = Lock_Services("GetLockPermissions", CurrUser)
|
||||
*
|
||||
* If Allowed NE FALSE$ then
|
||||
*
|
||||
* StatusCode = 200
|
||||
* LockJSON = Lock_Services("GetAllowedLocks", CurrUser)
|
||||
*
|
||||
* If Error_Services('NoError') then
|
||||
* HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||
* HTTP_Services('SetResponseBody', LockJSON, 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
|
||||
* End Else
|
||||
* HTTP_Services('SetResponseStatus', 403, 'User is not permitted to access this resource.')
|
||||
* end
|
||||
* End else
|
||||
* HTTP_Services('SetResponseStatus', 401, 'User must be signed in to access this resource.')
|
||||
* end
|
||||
*
|
||||
* end api
|
||||
|
||||
|
||||
API Lock.POST
|
||||
|
||||
OIWizardID = ''
|
||||
Cookies = HTTP_Services('GetHTTPCookie')
|
||||
For each Cookie in Cookies using ';'
|
||||
Key = Trim(Field(Cookie, '=', 1))
|
||||
If Key EQ 'sessionID' then
|
||||
OIWizardID = Field(Cookie, '=', 2)
|
||||
end
|
||||
If Key EQ 'userID' then
|
||||
CurrUser = Field(Cookie, '=', 2)
|
||||
end
|
||||
Next Cookie
|
||||
|
||||
ValidSession = OI_Wizard_Services('ValidateSession', OIWizardID)
|
||||
|
||||
If ValidSession then
|
||||
Allowed = Lock_Services("GetLockPermissions", CurrUser)
|
||||
|
||||
If Allowed NE FALSE$ then
|
||||
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
|
||||
Table = SRP_JSON(objBody, 'GetValue', 'table')
|
||||
Key = SRP_JSON(objBody, 'GetValue', 'key')
|
||||
SRP_JSON(objBody, 'Release')
|
||||
end
|
||||
|
||||
If (Table NE '') AND (Key NE '') then
|
||||
Result = Lock_Services("AttemptUnlock",CurrUser, Table, Key)
|
||||
If Result EQ TRUE$ then
|
||||
HTTP_Services('SetResponseStatus', 200, 'Record successfully unlocked.')
|
||||
Lock_Services("LogUnlockRequest", Table, Key, CurrUser, TRUE$)
|
||||
end else
|
||||
ErrCode = Error_Services('GetMessage')
|
||||
HTTP_Services('SetResponseStatus', 500, ErrCode)
|
||||
Lock_Services("LogUnlockRequest", Table, Key, CurrUser, FALSE$)
|
||||
end
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 400, 'The table or key property is missing.')
|
||||
end
|
||||
End Else
|
||||
HTTP_Services('SetResponseStatus', 403, 'User is not permitted to access this resource.')
|
||||
end
|
||||
End else
|
||||
HTTP_Services('SetResponseStatus', 401, 'User must be signed in to access this resource.')
|
||||
end
|
||||
|
||||
end api
|
||||
|
||||
|
||||
|
||||
|
||||
Function Lock_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 : Lock_API
|
||||
|
||||
Description : API logic for the Lock 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 Lock[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Lock.POST
|
||||
- Lock.ID.PUT
|
||||
- Lock.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)
|
||||
03/14/24 djm Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert API_SETUP
|
||||
$insert HTTP_INSERTS
|
||||
|
||||
Declare function Database_Services, Oi_Wizard_Services, Memberof, Lock_Services
|
||||
Declare subroutine Lock_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 Lock.HEAD
|
||||
|
||||
|
||||
// GET Method removed until RTI_LH_Info(CMD_LOCKS_INFO$, '') is fixed ////////////////////////////////
|
||||
|
||||
* API Lock.GET
|
||||
*
|
||||
* OIWizardID = ''
|
||||
* Cookies = HTTP_Services('GetHTTPCookie')
|
||||
* For each Cookie in Cookies using ';'
|
||||
* Key = Trim(Field(Cookie, '=', 1))
|
||||
* If Key EQ 'sessionID' then
|
||||
* OIWizardID = Field(Cookie, '=', 2)
|
||||
* end
|
||||
* If Key EQ 'userID' then
|
||||
* CurrUser = Field(Cookie, '=', 2)
|
||||
* end
|
||||
* Next Cookie
|
||||
*
|
||||
* ValidSession = OI_Wizard_Services('ValidateSession', OIWizardID)
|
||||
*
|
||||
* If ValidSession then
|
||||
*
|
||||
* Allowed = Lock_Services("GetLockPermissions", CurrUser)
|
||||
*
|
||||
* If Allowed NE FALSE$ then
|
||||
*
|
||||
* StatusCode = 200
|
||||
* LockJSON = Lock_Services("GetAllowedLocks", CurrUser)
|
||||
*
|
||||
* If Error_Services('NoError') then
|
||||
* HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||
* HTTP_Services('SetResponseBody', LockJSON, 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
|
||||
* End Else
|
||||
* HTTP_Services('SetResponseStatus', 403, 'User is not permitted to access this resource.')
|
||||
* end
|
||||
* End else
|
||||
* HTTP_Services('SetResponseStatus', 401, 'User must be signed in to access this resource.')
|
||||
* end
|
||||
*
|
||||
* end api
|
||||
|
||||
|
||||
API Lock.POST
|
||||
|
||||
OIWizardID = ''
|
||||
Cookies = HTTP_Services('GetHTTPCookie')
|
||||
For each Cookie in Cookies using ';'
|
||||
Key = Trim(Field(Cookie, '=', 1))
|
||||
If Key EQ 'sessionID' then
|
||||
OIWizardID = Field(Cookie, '=', 2)
|
||||
end
|
||||
If Key EQ 'userID' then
|
||||
CurrUser = Field(Cookie, '=', 2)
|
||||
end
|
||||
Next Cookie
|
||||
|
||||
ValidSession = OI_Wizard_Services('ValidateSession', OIWizardID)
|
||||
|
||||
If ValidSession then
|
||||
Allowed = Lock_Services("GetLockPermissions", CurrUser)
|
||||
|
||||
If Allowed NE FALSE$ then
|
||||
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
|
||||
Table = SRP_JSON(objBody, 'GetValue', 'table')
|
||||
Key = SRP_JSON(objBody, 'GetValue', 'key')
|
||||
SRP_JSON(objBody, 'Release')
|
||||
end
|
||||
|
||||
If (Table NE '') AND (Key NE '') then
|
||||
Result = Lock_Services("AttemptUnlock",CurrUser, Table, Key)
|
||||
If Result EQ TRUE$ then
|
||||
HTTP_Services('SetResponseStatus', 200, 'Record successfully unlocked.')
|
||||
Lock_Services("LogUnlockRequest", Table, Key, CurrUser, TRUE$)
|
||||
end else
|
||||
ErrCode = Error_Services('GetMessage')
|
||||
HTTP_Services('SetResponseStatus', 500, ErrCode)
|
||||
Lock_Services("LogUnlockRequest", Table, Key, CurrUser, FALSE$)
|
||||
end
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 400, 'The table or key property is missing.')
|
||||
end
|
||||
End Else
|
||||
HTTP_Services('SetResponseStatus', 403, 'User is not permitted to access this resource.')
|
||||
end
|
||||
End else
|
||||
HTTP_Services('SetResponseStatus', 401, 'User must be signed in to access this resource.')
|
||||
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,153 +68,178 @@ GoToService
|
||||
|
||||
Return Response or ""
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// SERVICES
|
||||
//-----------------------------------------------------------------------------
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// Services
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Service CreateLotEvent(LotId, EventDateTime, EventType=EVENT_TYPES, EventNote, EventEquipmentId, OperatorId, IsLegacyLotId=BOOLEAN, LegacyLotType=LEGACY_LOT_TYPES)
|
||||
|
||||
GoSub InitEventLog
|
||||
ErrorMessage = ''
|
||||
//Handle Legacy Lots
|
||||
If IsLegacyLotId then
|
||||
If LegacyLotType NE '' then
|
||||
LegacyLotId = LotId
|
||||
LotId = Lot_Services('GetLotIdByLegacyLotIdAndType', LotId, LegacyLotType)
|
||||
If LotID EQ '' then
|
||||
LotId = Lot_Services('CreateNewLot', LegacyLotType, '', '', '', '', '', OperatorId, '', LegacyLotId)
|
||||
end
|
||||
end else
|
||||
LotId = ''
|
||||
end
|
||||
end
|
||||
If RowExists('LOT', LotId) then
|
||||
NewEventId = RTI_CreateGUID()
|
||||
If NewEventId NE '' then
|
||||
NewEventSequence = Lot_Event_Services('GetLotEventNextSequence', LotId)
|
||||
If Error_Services('NoError') then
|
||||
NewEventRec = ''
|
||||
NewEventRec<LOT_EVENT_LOT_ID$> = LotId
|
||||
NewEventRec<LOT_EVENT_LOT_EVENT_TYPE$> = EventType
|
||||
NewEventRec<LOT_EVENT_EVENT_DATETIME$> = EventDatetime
|
||||
NewEventRec<LOT_EVENT_EVENT_NOTE$> = EventNote
|
||||
NewEventRec<LOT_EVENT_EQUIPMENT_ID$> = EventEquipmentId
|
||||
NewEventRec<LOT_EVENT_EVENT_OPERATOR_ID$> = OperatorId
|
||||
NewEventRec<LOT_EVENT_SEQUENCE$> = NewEventSequence
|
||||
Database_Services('WriteDataRow', 'LOT_EVENT', NewEventId, NewEventRec)
|
||||
|
||||
GoSub InitEventLog
|
||||
ErrorMessage = ''
|
||||
// Handle Legacy Lots
|
||||
If IsLegacyLotId then
|
||||
If LegacyLotType NE '' then
|
||||
LegacyLotId = LotId
|
||||
LotId = Lot_Services('GetLotIdByLegacyLotIdAndType', LotId, LegacyLotType)
|
||||
If LotID EQ '' then
|
||||
LotId = Lot_Services('CreateNewLot', LegacyLotType, '', '', '', '', '', OperatorId, '', LegacyLotId)
|
||||
end
|
||||
end else
|
||||
LotId = ''
|
||||
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
|
||||
Service_Services('PostProcedure', 'LOT_EVENT_SERVICES', 'SetLatestLotEvent':@VM:LotId:@VM:NewEventId, True$)
|
||||
NewEventRec = ''
|
||||
NewEventRec<LOT_EVENT_LOT_ID$> = LotId
|
||||
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
|
||||
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 creating new event : ' : Error_Services('GetMessage')
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
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
|
||||
end else
|
||||
ErrorMessage = 'Error in Create Lot Event routine, Lot id was not found.'
|
||||
end
|
||||
If ErrorMessage EQ '' then
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = LotId
|
||||
LogData<3> = EventType
|
||||
LogData<4> = OperatorId
|
||||
LogData<9> = 'Successfully logged event.'
|
||||
Logging_Services('AppendLog', objLotEventLog, LogData, @RM, @FM, False$)
|
||||
end else
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = LotId
|
||||
LogData<3> = EventType
|
||||
LogData<4> = OperatorId
|
||||
LogData<9> = ErrorMessage
|
||||
Logging_Services('AppendLog', objLotEventLog, LogData, @RM, @FM, False$)
|
||||
Error_Services('Add', ErrorMessage)
|
||||
end
|
||||
|
||||
end else
|
||||
ErrorMessage = 'Error creating an event Id.'
|
||||
end
|
||||
end else
|
||||
ErrorMessage = 'Error in Create Lot Event routine, Lot id was not found.'
|
||||
end
|
||||
If ErrorMessage EQ '' then
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = LotId
|
||||
LogData<3> = EventType
|
||||
LogData<4> = OperatorId
|
||||
LogData<9> = 'Successfully logged event.'
|
||||
Logging_Services('AppendLog', objLotEventLog, LogData, @RM, @FM, False$)
|
||||
end else
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = LotId
|
||||
LogData<3> = EventType
|
||||
LogData<4> = OperatorId
|
||||
LogData<9> = ErrorMessage
|
||||
Logging_Services('AppendLog', objLotEventLog, LogData, @RM, @FM, False$)
|
||||
Error_Services('Add', ErrorMessage)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service GetLotEventNextSequence(LotId)
|
||||
|
||||
ErrorMessage = ''
|
||||
NextSequence = 1
|
||||
If LotID NE '' then
|
||||
If RowExists('LOT', LotId) then
|
||||
LotEvents = XLATE('LOT', LotId, LOT_LOT_EVENTS$, 'X')
|
||||
for each LotEvent in LotEvents using @VM
|
||||
ThisEventSequence = XLATE('LOT_EVENT', LotEvent, LOT_EVENT_SEQUENCE$, 'X')
|
||||
If ThisEventSequence GE NextSequence then NextSequence = ThisEventSequence + 1
|
||||
Next LotEvent
|
||||
end else
|
||||
ErrorMessage = 'Unable to get lot event sequence: Lot ID not found.'
|
||||
end
|
||||
end else
|
||||
ErrorMessage = 'Unable to get lot event sequence: Lot ID was null.'
|
||||
end
|
||||
If ErrorMessage EQ '' then
|
||||
Response = NextSequence
|
||||
end else
|
||||
Error_Services('Add', ErrorMessage)
|
||||
end
|
||||
|
||||
ErrorMessage = ''
|
||||
NextSequence = 1
|
||||
If LotID NE '' then
|
||||
If RowExists('LOT', LotId) then
|
||||
LotEvents = XLATE('LOT', LotId, LOT_LOT_EVENTS$, 'X')
|
||||
for each LotEvent in LotEvents using @VM
|
||||
ThisEventSequence = XLATE('LOT_EVENT', LotEvent, LOT_EVENT_SEQUENCE$, 'X')
|
||||
If ThisEventSequence GE NextSequence then NextSequence = ThisEventSequence + 1
|
||||
Next LotEvent
|
||||
end else
|
||||
ErrorMessage = 'Unable to get lot event sequence: Lot ID not found.'
|
||||
end
|
||||
end else
|
||||
ErrorMessage = 'Unable to get lot event sequence: Lot ID was null.'
|
||||
end
|
||||
If ErrorMessage EQ '' then
|
||||
Response = NextSequence
|
||||
end else
|
||||
Error_Services('Add', ErrorMessage)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
//Returns a @FM delimited list of events in sequence
|
||||
|
||||
// Returns a @FM delimited list of events in sequence
|
||||
Service GetLotEventsInSequence(LotId)
|
||||
LotEventsUnsorted = ''
|
||||
LotEventsSorted = ''
|
||||
LotEventsToReturn = ''
|
||||
If LotID NE '' then
|
||||
//Get Operations
|
||||
LotEvents = Xlate('LOT', LotId, LOT_LOT_EVENTS$, 'X')
|
||||
for each LotEvent in LotEvents using @VM
|
||||
ThisEventSequence = XLATE('LOT_EVENT', LotEvent, LOT_EVENT_SEQUENCE$, 'X')
|
||||
LotEventsToReturn<ThisEventSequence> = LotEvent
|
||||
Next LotOperation
|
||||
end else
|
||||
//error: lot id was null
|
||||
end
|
||||
Response = LotEventsToReturn
|
||||
|
||||
ErrorMsg = ''
|
||||
LotEventsUnsorted = ''
|
||||
LotEventsSorted = ''
|
||||
LotEventsToReturn = ''
|
||||
If LotID NE '' then
|
||||
// Get Operations
|
||||
LotEvents = Xlate('LOT', LotId, LOT_LOT_EVENTS$, 'X')
|
||||
for each LotEvent in LotEvents using @VM
|
||||
ThisEventSequence = XLATE('LOT_EVENT', LotEvent, LOT_EVENT_SEQUENCE$, 'X')
|
||||
LotEventsToReturn<ThisEventSequence> = LotEvent
|
||||
Next LotOperation
|
||||
end else
|
||||
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 = ''
|
||||
If RowExists('LOT', LotId) then
|
||||
If RowExists('LOT_EVENT', LotEventId) then
|
||||
LotRec = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$)
|
||||
LotRec<LOT_MOST_RECENT_LOT_EVENT_ID$> = LotEventId
|
||||
Database_Services('WriteDataRow', 'LOT', LotId, LotRec)
|
||||
If Error_Services('HasError') then
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMessage = 'Lot event ' : LotEventId : ' for lot ' : LotId : ' not found in LOT_EVENT table'
|
||||
end
|
||||
end else
|
||||
ErrorMessage = 'Lot Id ' : LotId : ' not found in LOT table.'
|
||||
end
|
||||
If ErrorMessage NE '' then
|
||||
Error_Services('Add', ErrorMessage)
|
||||
end
|
||||
|
||||
ErrorMessage = ''
|
||||
If RowExists('LOT', LotId) then
|
||||
If RowExists('LOT_EVENT', LotEventId) then
|
||||
LotRec = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$)
|
||||
LotRec<LOT_MOST_RECENT_LOT_EVENT_ID$> = LotEventId
|
||||
Database_Services('WriteDataRow', 'LOT', LotId, LotRec)
|
||||
If Error_Services('HasError') then
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMessage = 'Lot event ' : LotEventId : ' for lot ' : LotId : ' not found in LOT_EVENT table'
|
||||
end
|
||||
end else
|
||||
ErrorMessage = 'Lot Id ' : LotId : ' not found in LOT table.'
|
||||
end
|
||||
If ErrorMessage NE '' then Error_Services('Add', ErrorMessage)
|
||||
|
||||
end service
|
||||
|
||||
/* * * * * * * * * *
|
||||
* INTERNAL GOSUBS
|
||||
* * * * * * * * * */
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// Internal GoSubs
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
InitEventLog:
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Lot'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
LogTime = Oconv(Time(), 'MTS')
|
||||
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
||||
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' LotEvent.csv'
|
||||
Headers = 'Logging DTM' : @FM : 'Lot Id' : @FM : 'Event Type' : @FM : 'Operator' : @FM : 'Begin Wafer Qty' : @FM : 'End Wafer Qty' : @FM : 'Bonus Wafer Qty' : @FM : 'Reduce Wafer Qty' : @FM : 'Message'
|
||||
objLotEventLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
|
||||
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Lot'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
LogTime = Oconv(Time(), 'MTS')
|
||||
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
||||
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' LotEvent.csv'
|
||||
Headers = 'Logging DTM' : @FM : 'Lot Id' : @FM : 'Event Type' : @FM : 'Operator' : @FM : 'Begin Wafer Qty' : @FM : 'End Wafer Qty' : @FM : 'Bonus Wafer Qty' : @FM : 'Reduce Wafer Qty' : @FM : 'Message'
|
||||
objLotEventLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
|
||||
|
||||
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,117 +62,161 @@ 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 = ''
|
||||
|
||||
// Identify the scan data based on the data identifier prefix (if any). Otherwise, assume this is a
|
||||
// type of cassette ID (i.e., RDS or WMO).
|
||||
|
||||
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
|
||||
|
||||
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] = ''
|
||||
end
|
||||
CassetteID = ScanData
|
||||
|
||||
If INDEX(CassetteID,'.',2) then
|
||||
RDSType = 'EPP'
|
||||
WOMatKey = Field(CassetteID, '.', 1):'*':Field(CassetteID, '.', 3)
|
||||
end else
|
||||
RDSType = 'SIC'
|
||||
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 '
|
||||
ColumnIndex = ''
|
||||
ColumnValue = ''
|
||||
|
||||
// Identify the scan data based on the data identifier prefix (if any). Otherwise, assume this is a
|
||||
// type of cassette ID (i.e., RDS or WMO).
|
||||
|
||||
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
|
||||
ErrorMsg = 'Invalid Supplier Lot: ':ScanData
|
||||
end
|
||||
|
||||
If ErrorMsg EQ '' then Response = ScanSubLot
|
||||
|
||||
Case ScanType EQ 'CASSETTE1'
|
||||
|
||||
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
|
||||
|
||||
|
||||
If INDEX(CassetteID,'.',2) then
|
||||
RDSType = 'EPP'
|
||||
WOMatKey = Field(CassetteID, '.', 1):'*':Field(CassetteID, '.', 3)
|
||||
end else
|
||||
RDSType = 'SIC'
|
||||
WOMatKey = Xlate('RDS', CassetteID, 'WO_MAT_KEY', 'X')
|
||||
end
|
||||
|
||||
ValidCassetteID = Rds_Services('IsValidRDS', CassetteID, RDSType )
|
||||
|
||||
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)
|
||||
end
|
||||
|
||||
// Check if FQA is signed
|
||||
FQASigned = ''
|
||||
WorkOrdNo = Field(WOMatKey, '*', 1)
|
||||
ReactorType = XLATE('WO_LOG', WorkOrdNo, 'REACT_TYPE', 'X')
|
||||
QAStage = ''
|
||||
|
||||
Begin Case
|
||||
Case RDSType EQ 'EPP'
|
||||
QAStage = 'MO_QA'
|
||||
Case Otherwise$
|
||||
QAStage = 'QA'
|
||||
End Case
|
||||
If Param1 NE '' AND ScanData NE Param1 then ;*Cassette2 Scan
|
||||
ErrorMsg = 'Lot Label Mismatch: ':CassetteID: ' does not match ': Param1
|
||||
end
|
||||
|
||||
If ErrorMsg EQ '' then
|
||||
// Check if FQA is signed
|
||||
FQASigned = ''
|
||||
WorkOrdNo = Field(WOMatKey, '*', 1)
|
||||
ReactorType = XLATE('WO_LOG', WorkOrdNo, 'REACT_TYPE', 'X')
|
||||
QAStage = ''
|
||||
|
||||
Begin Case
|
||||
Case RDSType EQ 'EPP'
|
||||
QAStage = 'MO_QA'
|
||||
Case Otherwise$
|
||||
QAStage = 'QA'
|
||||
End Case
|
||||
|
||||
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)
|
||||
end
|
||||
|
||||
If Error_Services('NoError') then
|
||||
Response = CassetteID
|
||||
end
|
||||
|
||||
Case ScanType EQ 'CASSETTE2'
|
||||
Response = Material_Movement_Services('ProcessPTIScanData', ScanData, 'CASSETTE1', Param1)
|
||||
Response = ScanData
|
||||
|
||||
End Case
|
||||
|
||||
end
|
||||
FQASigned = Signature_Services('CheckSignature', WOMatKey, QAStage)
|
||||
|
||||
If NOT(FQASigned) then ErrorMsg = 'FQA not signed for ':CassetteID:'!'
|
||||
end
|
||||
|
||||
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'
|
||||
// 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
|
||||
|
||||
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
|
||||
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
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// ProcessPTIScanData
|
||||
//
|
||||
@ -183,92 +227,137 @@ 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 = ''
|
||||
|
||||
// Identify the scan data based on the data identifier prefix (if any). Otherwise, assume this is a
|
||||
// type of cassette ID (i.e., RDS or WMO).
|
||||
|
||||
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 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.
|
||||
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
|
||||
|
||||
If INDEX(CassetteID,'.',2) then
|
||||
RDSType = 'EPP'
|
||||
end else
|
||||
RDSType = 'SIC'
|
||||
end
|
||||
|
||||
ValidCassetteID = Rds_Services('IsValidRDS', CassetteID, RDSType)
|
||||
If ValidCassetteID EQ True$ then
|
||||
If Param1 NE '' AND (ScanData NE Param1) then ;*Cassette2 Scan
|
||||
ErrorMsg = 'Lot Label Mismatch: ':CassetteID: ' does not match ': Param1
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Invalid Cassette Number: ':CassetteID
|
||||
end
|
||||
|
||||
If ErrorMsg EQ '' then
|
||||
Response = ''
|
||||
Response<1> = CassetteID
|
||||
Response<2> = SeqNo
|
||||
end
|
||||
end
|
||||
|
||||
Case ScanType EQ 'CASSETTE2'
|
||||
// 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
|
||||
|
||||
ColumnIndex = ''
|
||||
ColumnValue = ''
|
||||
|
||||
// Identify the scan data based on the data identifier prefix (if any). Otherwise, assume this is a
|
||||
// type of cassette ID (i.e., RDS or WMO).
|
||||
|
||||
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
|
||||
|
||||
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] = ''
|
||||
end
|
||||
CassetteID = ScanData
|
||||
|
||||
If INDEX(CassetteID,'.',2) then
|
||||
RDSType = 'EPP'
|
||||
end else
|
||||
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)
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Invalid RDS Number: ':CassetteID)
|
||||
end
|
||||
|
||||
If Error_Services('NoError') then
|
||||
Response = CassetteID
|
||||
end
|
||||
|
||||
Case ScanType EQ 'CASSETTE2'
|
||||
Response = Material_Movement_Services('ProcessPTIScanData', ScanData, 'CASSETTE1', Param1)
|
||||
Response = ScanData
|
||||
|
||||
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,174 +371,165 @@ 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 = ''
|
||||
Cassette2 = ''
|
||||
|
||||
Begin Case
|
||||
|
||||
Case ScanType EQ 'LABEL1'
|
||||
//determine whether regular NEPP or EPP label scan
|
||||
//NEPP should be data matrix scan and have 7 parts, RDS_No is the 3rd
|
||||
//EPP is 1D scan and will have the WMO number (e.g. 170369*1*48)
|
||||
// This should be a multi-part 2D datamatrix scan, so there should be a long string separated by pipe symbols.
|
||||
// Validate the 1. it is multi-part string and 2. that the RDS number from the string is a) valid RDS number
|
||||
// and b) is currently is the proper state to do PTO transaction.
|
||||
// Strip any standardized prefixes (e.g. '1T', '2T', etc.) as necessary
|
||||
|
||||
// data from Label1 should have 8 parts (no matter type - Si or EPP), we're looking for the 3rd
|
||||
cnt = DCount(ScanData, '|')
|
||||
if cnt NE 8 then
|
||||
Cassette1 = 0
|
||||
Error_Services('Add', 'Invalid Lot Label Scan.')
|
||||
return
|
||||
end else
|
||||
//RDS should be 3rd position
|
||||
Cassette1 = Field(ScanData, '|', 3)
|
||||
end
|
||||
|
||||
//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
|
||||
Cassette1[1,1] = ''
|
||||
end
|
||||
|
||||
WOMatKey = ''
|
||||
RdsRec = ''
|
||||
WONo = ''
|
||||
CassNo = ''
|
||||
ColumnIndex = ''
|
||||
ColumnValue = ''
|
||||
Cassette1 = ''
|
||||
Cassette2 = ''
|
||||
|
||||
Begin Case
|
||||
|
||||
Case ScanType EQ 'LABEL1'
|
||||
// Determine whether regular NEPP or EPP label scan
|
||||
// NEPP should be data matrix scan and have 7 parts, RDS_No is the 3rd
|
||||
// EPP is 1D scan and will have the WMO number (e.g. 170369*1*48)
|
||||
// This should be a multi-part 2D datamatrix scan, so there should be a long string separated by pipe symbols.
|
||||
// Validate the 1. it is multi-part string and 2. that the RDS number from the string is a) valid RDS number
|
||||
// and b) is currently is the proper state to do PTO transaction.
|
||||
// Strip any standardized prefixes (e.g. '1T', '2T', etc.) as necessary
|
||||
|
||||
// Data from Label1 should have 8 parts (no matter type - Si or EPP), we're looking for the 3rd
|
||||
cnt = DCount(ScanData, '|')
|
||||
if cnt NE 8 then
|
||||
ErrorMsg = 'Invalid Lot Label Scan.'
|
||||
end else
|
||||
Cassette1 = Field(ScanData, '|', 3)
|
||||
end
|
||||
|
||||
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
|
||||
Cassette1[1,1] = ''
|
||||
end
|
||||
|
||||
WOMatKey = ''
|
||||
RdsRec = ''
|
||||
WONo = ''
|
||||
CassNo = ''
|
||||
|
||||
If INDEX(Cassette1,'.',2) then
|
||||
RDSType = 'EPP'
|
||||
WMOKey = Cassette1
|
||||
If INDEX(Cassette1,'.',2) then
|
||||
RDSType = 'EPP'
|
||||
WMOKey = Cassette1
|
||||
Convert '.' to '*' in WMOKey
|
||||
If RowExists('WM_OUT', WMOKey) then
|
||||
If RowExists('WM_OUT', WMOKey) then
|
||||
WONo = Field(WMOKey, '*', 1, 1)
|
||||
CassNo = Field(WMOKey, '*', 3, 1)
|
||||
WOMatKey = WONo:'*':CassNo
|
||||
end
|
||||
end else
|
||||
RDSType = 'SIC'
|
||||
WOMatKey = XLATE('RDS', Cassette1, 'WO_MAT_KEY', 'X')
|
||||
RdsRec = Database_Services('ReadDataRow','RDS', Cassette1)
|
||||
WONo = RdsRec<RDS_WO$>
|
||||
CassNo = RdsRec<RDS_CASS_NO$>
|
||||
end
|
||||
end else
|
||||
RDSType = 'SIC'
|
||||
WOMatKey = XLATE('RDS', Cassette1, 'WO_MAT_KEY', 'X')
|
||||
RdsRec = Database_Services('ReadDataRow','RDS', Cassette1)
|
||||
WONo = RdsRec<RDS_WO$>
|
||||
CassNo = RdsRec<RDS_CASS_NO$>
|
||||
end
|
||||
|
||||
ValidCassette1 = False$ ; // Assume Cassette ID is not valid for now.
|
||||
testCass1 = Cassette1
|
||||
ValidCassette1 = False$ ; // Assume Cassette ID is not valid for now.
|
||||
testCass1 = Cassette1
|
||||
|
||||
Convert '*' to '.' in testCass1
|
||||
If Rds_Services('IsValidRDS', Cassette1, RDSType) then
|
||||
If Rds_Services('GetHoldStatus', Cassette1, RDSType) EQ False$ then
|
||||
If Rds_Services('IsPackaged', Cassette1, RDSType) EQ True$ then
|
||||
ValidCassette1 = True$
|
||||
end else
|
||||
Error_Services('Add', RDSType: ' RDS ':testCass1: ' has not completed packaging.')
|
||||
return
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', RDSType: ' RDS ':testCass1: ' is currently on hold.')
|
||||
return
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', RDSType: ' RDS ' : testCass1 : ' is an invalid RDS number.')
|
||||
return
|
||||
end
|
||||
Convert '*' to '.' in testCass1
|
||||
If Rds_Services('IsValidRDS', Cassette1, RDSType) then
|
||||
If Rds_Services('GetHoldStatus', Cassette1, RDSType) EQ False$ then
|
||||
If Rds_Services('IsPackaged', Cassette1, RDSType) EQ True$ then
|
||||
ValidCassette1 = True$
|
||||
end else
|
||||
ErrorMsg = RDSType: ' RDS ':testCass1: ' has not completed packaging.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = RDSType: ' RDS ':testCass1: ' is currently on hold.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = RDSType: ' RDS ' : testCass1 : ' is an invalid RDS number.'
|
||||
end
|
||||
|
||||
LastPTO = obj_WO_Mat('OutofPTO',WOMatKey)
|
||||
StepNo = 1
|
||||
IF LastPTO THEN
|
||||
MsgHead = 'Cassette previously scanned through PTO'
|
||||
MsgText = 'Scanned at ':LastPTO<2>:' by ':LastPTO<1>:CRLF$
|
||||
MsgText := 'Are you sure you wish to rescan and reprint the shipping label?'
|
||||
If ErrorMsg EQ '' then
|
||||
LastPTO = obj_WO_Mat('OutofPTO',WOMatKey)
|
||||
StepNo = 1
|
||||
IF LastPTO THEN
|
||||
MsgHead = 'Cassette previously scanned through PTO'
|
||||
MsgText = 'Scanned at ':LastPTO<2>:' by ':LastPTO<1>:CRLF$
|
||||
MsgText := 'Are you sure you wish to rescan and reprint the shipping label?'
|
||||
|
||||
OK = Msg(@WINDOW, '','YESNO','',MsgHead:@FM:MsgText)
|
||||
OK = Msg(@WINDOW, '','YESNO','',MsgHead:@FM:MsgText)
|
||||
|
||||
IF NOT(OK) THEN
|
||||
Error_Services('Add', 'Scan Cancelled')
|
||||
RETURN
|
||||
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
|
||||
|
||||
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
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Invalid RDS Number: ':Cassette1)
|
||||
return
|
||||
end
|
||||
|
||||
If Error_Services('NoError') then
|
||||
Response = Cassette1
|
||||
end
|
||||
|
||||
Case ScanType EQ 'LABEL2'
|
||||
cnt = DCount(ScanData, ';')
|
||||
if cnt EQ 9 then
|
||||
//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
|
||||
Cassette2 = Field(ScanData, ';', 3)
|
||||
end else
|
||||
Error_Services('Add', 'Invalid Shipping Label Scan.')
|
||||
return
|
||||
end
|
||||
|
||||
//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
|
||||
Cassette2[1,1] = ''
|
||||
end
|
||||
testCass1 = Param3
|
||||
testCass2 = Cassette2
|
||||
convert '*' to '.' in testCass1
|
||||
convert '*' to '.' in testCass2
|
||||
|
||||
If testCass1 NE testCass2 then
|
||||
ErrorMsg = 'Scan Mismatch - RDS values do not match. Both cassettes placed on hold - Supervisor, Lead, or Engineering disposition required.':CRLF$ |
|
||||
IF NOT(OK) THEN
|
||||
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
|
||||
|
||||
If ErrorMsg EQ '' then
|
||||
If ValidCassette1 EQ True$ then
|
||||
If Param1 NE '' AND ScanData NE Param1 then ;*Cassette2 Scan
|
||||
ErrorMsg = 'RDS Mismatch: ':Cassette1: ' does not match ': Param1
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Invalid RDS Number: ':Cassette1
|
||||
end
|
||||
|
||||
If ErrorMsg EQ '' then Response = Cassette1
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Case ScanType EQ 'LABEL2'
|
||||
cnt = DCount(ScanData, ';')
|
||||
if cnt EQ 9 then
|
||||
// Tower is customer and RDS should be 2nd position
|
||||
Cassette2 = Field(ScanData, ';', 2)
|
||||
end else if cnt EQ 10 then
|
||||
// All other customers and RDS should be 3rd position
|
||||
Cassette2 = Field(ScanData, ';', 3)
|
||||
end else
|
||||
ErrorMsg = 'Invalid Shipping Label Scan.'
|
||||
end
|
||||
|
||||
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
|
||||
Cassette2[1,1] = ''
|
||||
end
|
||||
testCass1 = Param3
|
||||
testCass2 = Cassette2
|
||||
convert '*' to '.' in testCass1
|
||||
convert '*' to '.' in testCass2
|
||||
|
||||
If testCass1 NE testCass2 then
|
||||
ErrorMsg = 'Scan Mismatch - RDS values do not match. Both cassettes placed on hold - Supervisor, Lead, or Engineering disposition required.':CRLF$ |
|
||||
: 'RDS Label #1: ':testCass1:CRLF$ |
|
||||
: 'RDS Label #2: ':testCass2:CRLF$
|
||||
|
||||
ScanMismatch = True$
|
||||
gosub ToggleLotHold
|
||||
Error_Services('Add', ErrorMsg)
|
||||
return
|
||||
end
|
||||
|
||||
If Error_Services('NoError') then
|
||||
Response = Cassette2
|
||||
end
|
||||
|
||||
End Case
|
||||
|
||||
end
|
||||
ScanMismatch = True$
|
||||
GoSub ToggleLotHold
|
||||
end
|
||||
|
||||
If ErrorMsg EQ '' then Response = Cassette2
|
||||
end
|
||||
End Case
|
||||
|
||||
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,20 +584,12 @@ 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
|
||||
Gosub SendErrorNotification
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end service
|
||||
@ -525,19 +597,20 @@ end service
|
||||
|
||||
SendErrorNotification:
|
||||
|
||||
Recipients = XLATE('NOTIFICATION','FI_SUPPORT',NOTIFICATION_USER_ID$,'X')
|
||||
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 = ''
|
||||
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 = '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$)
|
||||
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
|
||||
|
||||
//pause before putting second cassette on hold
|
||||
|
||||
// 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,133 +619,127 @@ 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)
|
||||
WOStepKeys = WOLogRow<WO_LOG_WO_STEP_KEY$>
|
||||
LastWOStepKey = WOStepKeys[-1, 'B' : @VM]
|
||||
PartNo = WOLogRow<WO_LOG_EPI_PART_NO$>
|
||||
WOStepRow = Database_Services('ReadDataRow', 'WO_STEP', LastWOStepKey)
|
||||
If Error_Services('NoError') then
|
||||
PartNo = WOMatRow<WO_MAT_CUST_PART_NO$>
|
||||
LastWOStepKey = WOStepKeys[-1, 'B' : @VM]
|
||||
WOStepRow = Database_Services('ReadDataRow', 'WO_STEP', LastWOStepKey)
|
||||
WOStepPSN = WOStepRow<WO_STEP_PROD_SPEC_ID$>
|
||||
WOStepRDSNos = WOStepRow<WO_STEP_RDS_KEY$>
|
||||
WOStepWMOutNos = WOStepRow<WO_STEP_WM_OUT_KEYS$>
|
||||
ProdSpecRow = Database_Services('ReadDataRow', 'PROD_SPEC', WOStepPSN)
|
||||
If Error_Services('NoError') then
|
||||
WOStepPSN = WOStepRow<WO_STEP_PROD_SPEC_ID$>
|
||||
WOStepRDSNos = WOStepRow<WO_STEP_RDS_KEY$>
|
||||
WOStepWMOutNos = WOStepRow<WO_STEP_WM_OUT_KEYS$>
|
||||
ProdSpecRow = Database_Services('ReadDataRow', 'PROD_SPEC', WOStepPSN)
|
||||
ReactorType = ProdSpecRow<PROD_SPEC_REACTOR_TYPE$>
|
||||
SearchString = ''
|
||||
SearchTable = 'MAKEUP_WAFERS'
|
||||
If ReactorType EQ 'EPP' then
|
||||
SearchString := 'EPI_PART_NO' : @VM : PartNo : @FM : 'REACT_TYPE' : @VM : 'EPP' : @FM
|
||||
end else
|
||||
SearchString := 'EPI_PART_NO' : @VM : PartNo : @FM : 'REACT_TYPE' : @VM : '#EPP' : @FM
|
||||
end
|
||||
|
||||
hDictSearchTable = Database_Services('GetTableHandle', 'DICT.' : SearchTable)
|
||||
If Error_Services('NoError') then
|
||||
ReactorType = ProdSpecRow<PROD_SPEC_REACTOR_TYPE$>
|
||||
SearchString = ''
|
||||
SearchTable = 'MAKEUP_WAFERS'
|
||||
If ReactorType EQ 'EPP' then
|
||||
SearchString := 'EPI_PART_NO' : @VM : PartNo : @FM : 'REACT_TYPE' : @VM : 'EPP' : @FM
|
||||
rv = Set_Status(0)
|
||||
MakeupBoxes = ''
|
||||
Flag = ''
|
||||
StatusCode = ''
|
||||
Btree.Extract(SearchString, SearchTable, hDictSearchTable, MakeupBoxes, '', Flag)
|
||||
If Get_Status(StatusCode) then
|
||||
Error_Services('Add', 'Error calling Btree.Extract in the ' : Service : ' service. StatusCode: ' : StatusCode)
|
||||
end else
|
||||
SearchString := 'EPI_PART_NO' : @VM : PartNo : @FM : 'REACT_TYPE' : @VM : '#EPP' : @FM
|
||||
end
|
||||
|
||||
hDictSearchTable = Database_Services('GetTableHandle', 'DICT.' : SearchTable)
|
||||
If Error_Services('NoError') then
|
||||
rv = Set_Status(0)
|
||||
MakeupBoxes = ''
|
||||
Flag = ''
|
||||
StatusCode = ''
|
||||
Btree.Extract(SearchString, SearchTable, hDictSearchTable, MakeupBoxes, '', Flag)
|
||||
If Get_Status(StatusCode) then
|
||||
Error_Services('Add', 'Error calling Btree.Extract in the ' : Service : ' service. StatusCode: ' : StatusCode)
|
||||
end else
|
||||
If MakeupBoxes NE '' then
|
||||
// One or more makeup was found that matches the customer's part and has the status of 'Ready to Use'.
|
||||
// Now loop through to find out which ones have the RDS final signature or not.
|
||||
NumMakeupBoxes = DCount(MakeupBoxes, @VM)
|
||||
For Each MakeupBoxID in MakeupBoxes using @VM
|
||||
WOMatKeyID = MakeupBoxID
|
||||
CurrStatus = Xlate('MAKEUP_WAFERS', MakeupBoxID, 'CURR_STATUS_STATIC', 'X')
|
||||
// DPC 7/21/20 added HOLD as excluded status type
|
||||
Locate CurrStatus in 'MT,VOID,SHIP,REJ,HOLD' using ',' setting cPos else
|
||||
If (ReactorType EQ 'EPP') OR (ReactorType EQ 'P') then
|
||||
CurrWaferCount = obj_WO_Mat('CurrWaferCnt', WOMatKeyID:@RM:'':@RM:True$)
|
||||
If MakeupBoxes NE '' then
|
||||
// One or more makeup was found that matches the customer's part and has the status of 'Ready to Use'.
|
||||
// Now loop through to find out which ones have the RDS final signature or not.
|
||||
NumMakeupBoxes = DCount(MakeupBoxes, @VM)
|
||||
For Each MakeupBoxID in MakeupBoxes using @VM
|
||||
WOMatKeyID = MakeupBoxID
|
||||
CurrStatus = Xlate('MAKEUP_WAFERS', MakeupBoxID, 'CURR_STATUS_STATIC', 'X')
|
||||
// DPC 7/21/20 added HOLD as excluded status type
|
||||
Locate CurrStatus in 'MT,VOID,SHIP,REJ,HOLD' using ',' setting cPos else
|
||||
If (ReactorType EQ 'EPP') OR (ReactorType EQ 'P') then
|
||||
CurrWaferCount = obj_WO_Mat('CurrWaferCnt', WOMatKeyID:@RM:'':@RM:True$)
|
||||
end else
|
||||
CurrWaferCount = obj_WO_Mat('CurrWaferCnt', WOMatKeyID)
|
||||
end
|
||||
If CurrWaferCount GT 0 then
|
||||
WOMatRow = Database_Services('ReadDataRow', 'WO_MAT', WOMatKeyID)
|
||||
RDSKeyIDs = WOMatRow<WO_MAT_RDS_NO$>
|
||||
SAPBatchNo = WOMatRow<WO_MAT_SAP_BATCH_NO$>
|
||||
FirstRDSKeyID = RDSKeyIDs[1, @VM]
|
||||
RDSRow = Database_Services('ReadDataRow', 'RDS', FirstRDSKeyID)
|
||||
WMOKey = WOMatRow<WO_MAT_WMO_KEY$>
|
||||
If WMOKey NE '' then
|
||||
WMOFQASig = Xlate('WM_OUT', WMOKey, 'SUP_VER_SIG', 'X')
|
||||
end else
|
||||
CurrWaferCount = obj_WO_Mat('CurrWaferCnt', WOMatKeyID)
|
||||
WMOFQASig = ''
|
||||
end
|
||||
If CurrWaferCount GT 0 then
|
||||
WOMatRow = Database_Services('ReadDataRow', 'WO_MAT', WOMatKeyID)
|
||||
RDSKeyIDs = WOMatRow<WO_MAT_RDS_NO$>
|
||||
SAPBatchNo = WOMatRow<WO_MAT_SAP_BATCH_NO$>
|
||||
FirstRDSKeyID = RDSKeyIDs[1, @VM]
|
||||
RDSRow = Database_Services('ReadDataRow', 'RDS', FirstRDSKeyID)
|
||||
WMOKey = WOMatRow<WO_MAT_WMO_KEY$>
|
||||
If WMOKey NE '' then
|
||||
WMOFQASig = Xlate('WM_OUT', WMOKey, 'SUP_VER_SIG', 'X')
|
||||
end else
|
||||
WMOFQASig = ''
|
||||
end
|
||||
ThisWorkOrderNo = WOMatKeyID[1, '*']
|
||||
ThisCassetteNo = WOMatKeyID[Col2() + 1, '*']
|
||||
ThisWOLogRow = Database_Services('ReadDataRow', 'WO_LOG', ThisWorkOrderNo)
|
||||
ThisWOStepKeyID = ThisWOLogRow<WO_LOG_WO_STEP_KEY$>[-1, 'B' : @VM]
|
||||
ThisWOStepRow = Database_Services('ReadDataRow', 'WO_STEP', ThisWOStepKeyID)
|
||||
WOStepRDSNos = ThisWoStepRow<WO_STEP_RDS_KEY$>
|
||||
MakeupBoxDet = ThisWorkOrderNo : @SVM
|
||||
MakeupBoxDet := ThisCassetteNo : @SVM
|
||||
MakeupBoxDet := WOMatRow<WO_MAT_SAP_BATCH_NO$> : @SVM
|
||||
MakeupBoxDet := ThisWOStepRow<WO_STEP_PROD_SPEC_ID$> : @SVM
|
||||
MakeupBoxDet := PartNo : @SVM
|
||||
MakeupBoxDet := CurrWaferCount : @SVM
|
||||
MakeupBoxDet := FirstRDSKeyID
|
||||
// JRO Added PROD_SPEC PARAMETERS 5/8/2020
|
||||
If (ReactorType EQ 'EPP') OR (ReactorType EQ 'P') then
|
||||
ProdSpecID = Xlate('RDS', WOStepRDSNos<1, 1>, RDS_PROD_SPEC_ID$, 'X')
|
||||
end else
|
||||
ProdSpecID = Xlate('RDS', RDSKeyIDs, RDS_PROD_SPEC_ID$, 'X')
|
||||
end
|
||||
ActiveStatus = XLATE('PROD_SPEC', ProdSpecID, PROD_SPEC_STATUS$, 'X')
|
||||
LabelCheck = Count(WOMatRow<WO_MAT_INV_ACTION$>, 'LBLCHK')
|
||||
// JRO Added the extra condition for Active Status 5/8/2020
|
||||
If ActiveStatus EQ 'A' then
|
||||
Begin Case
|
||||
ThisWorkOrderNo = WOMatKeyID[1, '*']
|
||||
ThisCassetteNo = WOMatKeyID[Col2() + 1, '*']
|
||||
ThisWOLogRow = Database_Services('ReadDataRow', 'WO_LOG', ThisWorkOrderNo)
|
||||
ThisWOStepKeyID = ThisWOLogRow<WO_LOG_WO_STEP_KEY$>[-1, 'B' : @VM]
|
||||
ThisWOStepRow = Database_Services('ReadDataRow', 'WO_STEP', ThisWOStepKeyID)
|
||||
WOStepRDSNos = ThisWoStepRow<WO_STEP_RDS_KEY$>
|
||||
MakeupBoxDet = ThisWorkOrderNo : @SVM
|
||||
MakeupBoxDet := ThisCassetteNo : @SVM
|
||||
MakeupBoxDet := WOMatRow<WO_MAT_SAP_BATCH_NO$> : @SVM
|
||||
MakeupBoxDet := ThisWOStepRow<WO_STEP_PROD_SPEC_ID$> : @SVM
|
||||
MakeupBoxDet := PartNo : @SVM
|
||||
MakeupBoxDet := CurrWaferCount : @SVM
|
||||
MakeupBoxDet := FirstRDSKeyID
|
||||
// JRO Added PROD_SPEC PARAMETERS 5/8/2020
|
||||
If (ReactorType EQ 'EPP') OR (ReactorType EQ 'P') then
|
||||
ProdSpecID = Xlate('RDS', WOStepRDSNos<1, 1>, RDS_PROD_SPEC_ID$, 'X')
|
||||
end else
|
||||
ProdSpecID = Xlate('RDS', RDSKeyIDs, RDS_PROD_SPEC_ID$, 'X')
|
||||
end
|
||||
ActiveStatus = XLATE('PROD_SPEC', ProdSpecID, PROD_SPEC_STATUS$, 'X')
|
||||
LabelCheck = Count(WOMatRow<WO_MAT_INV_ACTION$>, 'LBLCHK')
|
||||
// JRO Added the extra condition for Active Status 5/8/2020
|
||||
If ActiveStatus EQ 'A' then
|
||||
Begin Case
|
||||
|
||||
Case SAPBatchNo EQ ''
|
||||
// Cassette has not received a batch number from SAP, so it is not yet eligible to be used.
|
||||
FieldPos = 3
|
||||
|
||||
Case SAPBatchNo EQ ''
|
||||
// Cassette has not received a batch number from SAP, so it is not yet eligible to be used.
|
||||
FieldPos = 3
|
||||
|
||||
Case ( (ReactorType NE 'EPP') and (RDSRow<RDS_SUP_VER_SIG$> NE '') and (LabelCheck NE FALSE$) ) OR ( (ReactorType EQ 'EPP') and (WMOFQASig NE '') and (LabelCheck NE FALSE$) )
|
||||
// Cassette has a final signature, so it is eligible to be used.
|
||||
FieldPos = 1
|
||||
|
||||
Case ( (ReactorType NE 'EPP') and (RDSRow<RDS_SUP_VER_SIG$> EQ '') ) OR ( (ReactorType EQ 'EPP') and (WMOFQASig EQ '') )
|
||||
// Cassette does not yet have a final signature, so it is not yet eligible to be used.
|
||||
FieldPos = 2
|
||||
|
||||
Case ( (ReactorType NE 'EPP') and (RDSRow<RDS_SUP_VER_SIG$> NE '') and (LabelCheck EQ False$)) OR ( (ReactorType EQ 'EPP') and (WMOFQASig NE '') and (LabelCheck EQ False$))
|
||||
// Cassette does not yet have a packing label check, so it is not yet eligible to be used.
|
||||
FieldPos = 4
|
||||
|
||||
Case Otherwise$
|
||||
// Log these cassettes as we should never end up here.
|
||||
Null
|
||||
|
||||
End Case
|
||||
|
||||
If KeysOnly EQ True$ then
|
||||
If (ReactorType EQ 'EPP') OR (ReactorType EQ 'P') then
|
||||
WMOFormat = Field(MakeupBoxID, '*', 1):'*1*':Field(MakeupBoxID, '*', 2)
|
||||
AvailableMakeupWafers = Insert(AvailableMakeupWafers, FieldPos, -1, 0, WMOFormat)
|
||||
end else
|
||||
AvailableMakeupWafers = Insert(AvailableMakeupWafers, FieldPos, -1, 0, WOMatKeyID)
|
||||
end
|
||||
Case ( (ReactorType NE 'EPP') and (RDSRow<RDS_SUP_VER_SIG$> NE '') and (LabelCheck NE FALSE$) ) OR ( (ReactorType EQ 'EPP') and (WMOFQASig NE '') and (LabelCheck NE FALSE$) )
|
||||
// Cassette has a final signature, so it is eligible to be used.
|
||||
FieldPos = 1
|
||||
|
||||
Case ( (ReactorType NE 'EPP') and (RDSRow<RDS_SUP_VER_SIG$> EQ '') ) OR ( (ReactorType EQ 'EPP') and (WMOFQASig EQ '') )
|
||||
// Cassette does not yet have a final signature, so it is not yet eligible to be used.
|
||||
FieldPos = 2
|
||||
|
||||
Case ( (ReactorType NE 'EPP') and (RDSRow<RDS_SUP_VER_SIG$> NE '') and (LabelCheck EQ False$)) OR ( (ReactorType EQ 'EPP') and (WMOFQASig NE '') and (LabelCheck EQ False$))
|
||||
// Cassette does not yet have a packing label check, so it is not yet eligible to be used.
|
||||
FieldPos = 4
|
||||
|
||||
Case Otherwise$
|
||||
// Log these cassettes as we should never end up here.
|
||||
Null
|
||||
|
||||
End Case
|
||||
|
||||
If KeysOnly EQ True$ then
|
||||
If (ReactorType EQ 'EPP') OR (ReactorType EQ 'P') then
|
||||
WMOFormat = Field(MakeupBoxID, '*', 1):'*1*':Field(MakeupBoxID, '*', 2)
|
||||
AvailableMakeupWafers = Insert(AvailableMakeupWafers, FieldPos, -1, 0, WMOFormat)
|
||||
end else
|
||||
AvailableMakeupWafers = Insert(AvailableMakeupWafers, FieldPos, -1, 0, MakeupBoxDet)
|
||||
AvailableMakeupWafers = Insert(AvailableMakeupWafers, FieldPos, -1, 0, WOMatKeyID)
|
||||
end
|
||||
|
||||
end else
|
||||
AvailableMakeupWafers = Insert(AvailableMakeupWafers, FieldPos, -1, 0, MakeupBoxDet)
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
Next MakeupBoxID
|
||||
end
|
||||
end
|
||||
Next MakeupBoxID
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1482,5 +1476,3 @@ ClearCursors:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
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
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user