twb 4.9.3 → 5.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/tfl/Flow.rb +311 -0
- data/lib/twb.rb +3 -2
- data/lib/twb/analysis/calculatedfields/calculatedfieldsanalyzer.rb +101 -122
- data/lib/twb/analysis/calculatedfields/dotanalyzer.rb +139 -0
- data/lib/twb/analysis/calculatedfields/markdownemitter.rb +2 -2
- data/lib/twb/analysis/calculatedfields/t.rb +6 -0
- data/lib/twb/analysis/datasources/datasourcefilesanalyzer.rb +7 -4
- data/lib/twb/analysis/sheets/dashboardsummarizer.rb +94 -0
- data/lib/twb/analysis/workbooksummaryanalyzer.rb +2 -1
- data/lib/twb/calculatedfield.rb +4 -4
- data/lib/twb/columnfield.rb +2 -2
- data/lib/twb/datasource.rb +49 -37
- data/lib/twb/fieldcalculation.rb +171 -98
- data/lib/twb/util/cypher.rb +11 -4
- data/lib/twb/util/gml.rb +1 -1
- data/lib/twb/util/graphnode.rb +1 -1
- data/test/testFieldCalculation.rb +10 -6
- metadata +6 -2
@@ -0,0 +1,139 @@
|
|
1
|
+
# dotanalyzer.rb - this Ruby script Copyright 2017, 2018 Christopher Gerrard
|
2
|
+
#
|
3
|
+
# This program is free software: you can redistribute it and/or modify
|
4
|
+
# it under the terms of the GNU General Public License as published by
|
5
|
+
# the Free Software Foundation, either version 3 of the License, or
|
6
|
+
# (at your option) any later version.
|
7
|
+
#
|
8
|
+
# This program is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
11
|
+
# GNU General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU General Public License
|
14
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
15
|
+
|
16
|
+
|
17
|
+
module Twb
|
18
|
+
module Analysis
|
19
|
+
module CalculatedFields
|
20
|
+
|
21
|
+
class DotAnalyzer
|
22
|
+
include TabTool
|
23
|
+
|
24
|
+
attr_reader :docFileName
|
25
|
+
|
26
|
+
@@gvDotLocation = 'C:\\tech\\graphviz\\Graphviz2.38\\bin\\dot.exe'
|
27
|
+
@@imageTypes = ['pdf', 'png', 'svg']
|
28
|
+
|
29
|
+
def initialize(**args)
|
30
|
+
@args = args
|
31
|
+
init
|
32
|
+
@funcdoc = {:class=>self.class, :blurb=>'Create Dot files documenting Calculated Fields', :description=>'Analyze Calculated Fields - create Dot files' }
|
33
|
+
@metrics = {}
|
34
|
+
@imageFiles = Array.new
|
35
|
+
end
|
36
|
+
|
37
|
+
def processTWB twb
|
38
|
+
# twb = File.basename(twb)
|
39
|
+
@twb = twb #Twb::Workbook.new twb
|
40
|
+
addDocFile @dotFile, @dotFileName, "Dot file of Calculated fields for Workbook '#{@twb.name}'"
|
41
|
+
@twb.datasources.each do |ds|
|
42
|
+
unless ds.calculatedFields.empty?
|
43
|
+
initDotFile ds.uiname
|
44
|
+
# @dotFile.puts "\n ## #{ds.uiname} \n "
|
45
|
+
# @dotFile.puts "__has #{ds.calculatedFields.length} calculated fields__\n "
|
46
|
+
@cfCnt = 0
|
47
|
+
calcFields = Set.new
|
48
|
+
refFields = Set.new
|
49
|
+
edges = Set.new
|
50
|
+
ds.calculatedFields.each do |cf|
|
51
|
+
@cfCnt += 1
|
52
|
+
calcFields << cf.uiname
|
53
|
+
edges << " \"#{ds.uiname}\" -> \"#{cf.uiname}\" [tailport=e, headport=w] "
|
54
|
+
cf.referencedFields.each do |rf|
|
55
|
+
refFields << rf.uiname
|
56
|
+
edges << " \"#{cf.uiname}\" -> \"#{rf.uiname}\" [tailport=e, headport=w] "
|
57
|
+
end
|
58
|
+
end # ds.calculatedFields.each
|
59
|
+
# "federated.17h7owt0rsacke17cql8o0w2ittk" -> "New AO Actuals Query in PP+ (AO Variance Data)::vs Prior Year [YTD]"
|
60
|
+
# "federated.01s5lca037ted31gxs9sg0t9mnnt" [label="Controls" ]
|
61
|
+
edges.each do |edge|
|
62
|
+
@dotFile.puts "\t #{edge.strip}"
|
63
|
+
end
|
64
|
+
@dotFile.puts " "
|
65
|
+
allFields = calcFields + refFields
|
66
|
+
allFields.each do |f|
|
67
|
+
@dotFile.puts "\t \"#{f}\" [label=\"#{f}\"]"
|
68
|
+
end
|
69
|
+
endPointFields = allFields - calcFields
|
70
|
+
rankSame(endPointFields) unless endPointFields.nil? || endPointFields.empty?
|
71
|
+
closeDotFile
|
72
|
+
@@imageTypes.each do |type|
|
73
|
+
renderDot type
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end # twb.datasources.each
|
77
|
+
finis
|
78
|
+
end # def processTwb twb
|
79
|
+
|
80
|
+
private
|
81
|
+
|
82
|
+
def initDotFile dsName
|
83
|
+
@dotFileName = './ttdoc/' + @twb.name + '.' + dsName + '.CalculatedFields.dot'
|
84
|
+
@dotFile = File.open(@dotFileName,'w')
|
85
|
+
# @dotFile.puts @@dotHeader
|
86
|
+
@dotFile.puts ' digraph g {'
|
87
|
+
@dotFile.puts ' graph [rankdir="LR" splines=line];'
|
88
|
+
@dotFile.puts ' node [shape="box" width="2"];'
|
89
|
+
@dotFile.puts ' '
|
90
|
+
@dotFile.puts ' subgraph cluster_0 {'
|
91
|
+
end
|
92
|
+
|
93
|
+
def closeDotFile
|
94
|
+
# @dotFile.puts "\n # counted #{@cfCnt} calculated fields\n "
|
95
|
+
# @dotFile.puts "\n }"
|
96
|
+
@dotFile.puts ' }'
|
97
|
+
@dotFile.puts ' '
|
98
|
+
@dotFile.puts '// -------------------------------------------------------------'
|
99
|
+
@dotFile.puts ' '
|
100
|
+
@dotFile.puts ' subgraph cluster_1 {'
|
101
|
+
#@dotFile.puts ' color=white;'
|
102
|
+
@dotFile.puts ' style=invis;'
|
103
|
+
#@dotFile.puts ' border=0;'
|
104
|
+
@dotFile.puts ' node [border=blue];'
|
105
|
+
@dotFile.puts ' '
|
106
|
+
@dotFile.puts ' "" [style=invis]'
|
107
|
+
@dotFile.puts " \"Tableau Tools\\nCalculated Fields Map\\nWorkbook '#{@twb.name}'\\n#{Time.new.ctime}\" [penwidth=0]"
|
108
|
+
#@dotFile.puts " \"Tableau Tools Workbook Calculated Fields Map\\n#{Time.new.ctime}\" -> \"\" [style=invis]"
|
109
|
+
@dotFile.puts ' '
|
110
|
+
@dotFile.puts ' }'
|
111
|
+
@dotFile.puts ' '
|
112
|
+
@dotFile.puts '}'
|
113
|
+
@dotFile.close
|
114
|
+
end
|
115
|
+
|
116
|
+
def rankSame fields
|
117
|
+
@dotFile.puts "\n {rank=same "
|
118
|
+
fields.each do |f|
|
119
|
+
@dotFile.puts "\t \"#{f}\" "
|
120
|
+
end
|
121
|
+
@dotFile.puts " } "
|
122
|
+
end
|
123
|
+
|
124
|
+
def renderDot format
|
125
|
+
imageType = '-T' + format
|
126
|
+
imageFile = @dotFileName + '.Graph.' + format
|
127
|
+
imageParam = '-o"' + imageFile + '"'
|
128
|
+
emit "system #{@@gvDotLocation} #{imageType} #{imageParam} \"#{@dotFileName}\""
|
129
|
+
system "#{@@gvDotLocation} #{imageType} #{imageParam} \"#{@dotFileName}\""
|
130
|
+
# emit " - #{imageFile}"
|
131
|
+
@imageFiles << imageFile
|
132
|
+
return imageFile
|
133
|
+
end
|
134
|
+
|
135
|
+
end # class DotAnalyzer
|
136
|
+
|
137
|
+
end # nodule CalculatedFields
|
138
|
+
end # module Analysis
|
139
|
+
end # module Twb
|
@@ -52,10 +52,10 @@ module CalculatedFields
|
|
52
52
|
@docFile.puts "#{l.gsub('<<','[').gsub('>>',']')}"
|
53
53
|
end
|
54
54
|
@docFile.puts "```"
|
55
|
-
if cf.
|
55
|
+
if cf.referencedFields.length > 0
|
56
56
|
fieldsRefOrder = []
|
57
57
|
fieldsSortSet = SortedSet.new
|
58
|
-
cf.
|
58
|
+
cf.referencedFields.each do |field|
|
59
59
|
fieldsRefOrder.push field.uiname
|
60
60
|
fieldsSortSet << field.uiname
|
61
61
|
end
|
@@ -14,6 +14,7 @@
|
|
14
14
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
15
15
|
|
16
16
|
require 'csv'
|
17
|
+
require 'pry'
|
17
18
|
|
18
19
|
module Twb
|
19
20
|
module Analysis
|
@@ -32,6 +33,7 @@ module DataSources
|
|
32
33
|
'Data Source',
|
33
34
|
'File Name',
|
34
35
|
'File Dir',
|
36
|
+
'File Exists?',
|
35
37
|
'File Modified',
|
36
38
|
'File Size'
|
37
39
|
]
|
@@ -55,7 +57,7 @@ module DataSources
|
|
55
57
|
|
56
58
|
def processTWB twb
|
57
59
|
@twbName = twb.name
|
58
|
-
@
|
60
|
+
@twbDir = twb.dir
|
59
61
|
twb.datasources.each do |ds|
|
60
62
|
processFiles ds
|
61
63
|
end
|
@@ -69,9 +71,10 @@ module DataSources
|
|
69
71
|
fqFileName = twbFileDir.nil? ? twbFileName : twbFileDir + '/' + twbFileName
|
70
72
|
fileName = File.basename fqFileName
|
71
73
|
fileDir = File.dirname fqFileName
|
72
|
-
|
73
|
-
|
74
|
-
|
74
|
+
exists = File.exist? fqFileName
|
75
|
+
modtime = exists ? File.mtime(fqFileName) : nil
|
76
|
+
size = exists ? File.size(fqFileName) : nil
|
77
|
+
data = [@recNum+=1, @twbName, @twbDir, ds.uiname, fileName, fileDir, exists, modtime, size]
|
75
78
|
@csvFile << data
|
76
79
|
end
|
77
80
|
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
# sheetfieldsanalyzer.rb Copyright (C) 2018 Chris Gerrard
|
2
|
+
#
|
3
|
+
# This program is free software: you can redistribute it and/or modify
|
4
|
+
# it under the terms of the GNU General Public License as published by
|
5
|
+
# the Free Software Foundation, either version 3 of the License, or
|
6
|
+
# (at your option) any later version.
|
7
|
+
#
|
8
|
+
# This program is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
11
|
+
# GNU General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU General Public License
|
14
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
15
|
+
|
16
|
+
require 'twb'
|
17
|
+
require 'csv'
|
18
|
+
|
19
|
+
module Twb
|
20
|
+
module Analysis
|
21
|
+
|
22
|
+
class DashboardsSummarizer
|
23
|
+
|
24
|
+
include TabTool
|
25
|
+
|
26
|
+
attr_accessor :localEmit
|
27
|
+
|
28
|
+
def initialize(**args)
|
29
|
+
@args = args
|
30
|
+
@recordDir = !@args.nil? && @args[:recordDir] == true
|
31
|
+
@ttdocdir = @args[:ttdocdir]
|
32
|
+
@csvAdd = !@args.nil? && args[:csvMode] == :add
|
33
|
+
@csvMode = @csvAdd ? 'a' : 'w'
|
34
|
+
init
|
35
|
+
@funcdoc = {:class=>self.class, :blurb=>'Analyze Dashboard Worksheets', :description=>'Identifies the Worksheets present in Dashboards.',}
|
36
|
+
#--
|
37
|
+
docFileName = docFile('DashboardSummaries.csv')
|
38
|
+
@dashboardsCSV = CSV.open(docFileName,@csvMode)
|
39
|
+
unless @csvAdd
|
40
|
+
if @recordDir
|
41
|
+
@dashboardsCSV << ['Rec #','Workbook','Dashboard','# Worksheets','Workbook Dir']
|
42
|
+
else
|
43
|
+
@dashboardsCSV << ['Rec #','Workbook','Dashboard','# Worksheets' ]
|
44
|
+
end
|
45
|
+
end
|
46
|
+
addDocFile @dashboardsCSV, docFileName, "Workbooks and their Dashboards' summaries"
|
47
|
+
#--
|
48
|
+
@twbCount = 0
|
49
|
+
@dashCount = 0
|
50
|
+
@recNum = 0
|
51
|
+
end
|
52
|
+
|
53
|
+
def metrics
|
54
|
+
{
|
55
|
+
# '# of Workbooks' => @twbCount,
|
56
|
+
'# of Dashboards' => @dashCount,
|
57
|
+
}
|
58
|
+
end
|
59
|
+
|
60
|
+
def processTWB twb
|
61
|
+
@twb = twb
|
62
|
+
@twbName = @twb.name
|
63
|
+
@twbDir = @twb.dir
|
64
|
+
@modTime = @twb.modtime
|
65
|
+
emit " -- #{@twbName}"
|
66
|
+
@twbCount += 1
|
67
|
+
parseDashes
|
68
|
+
finis
|
69
|
+
end
|
70
|
+
|
71
|
+
def parseDashes
|
72
|
+
@dashboards = @twb.dashboards
|
73
|
+
@dashboards.each do |dash|
|
74
|
+
emit "DASH:: #{dash.name}"
|
75
|
+
@dashCount += 1
|
76
|
+
recordCSV [@twbName, dash.name, dash.worksheets.length]
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
private
|
81
|
+
|
82
|
+
def recordCSV record
|
83
|
+
numberedRec = [@recNum+=1] + record
|
84
|
+
if @recordDir
|
85
|
+
@dashboardsCSV << numberedRec.push(@twbDir)
|
86
|
+
else
|
87
|
+
@dashboardsCSV << numberedRec
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
end #class SheetFieldsAnalyzer
|
92
|
+
|
93
|
+
end # module Analysis
|
94
|
+
end # module Twb
|
@@ -37,7 +37,7 @@ module Analysis
|
|
37
37
|
docFileName = docFile('WorkbookSummary.csv')
|
38
38
|
@csvFile = CSV.open(docFileName,@csvMode)
|
39
39
|
unless @csvAdd
|
40
|
-
csvHeader = ['Rec #', 'Workbook','Type','Version','Build','Platform','Modified','# Data Sources','# Dashboards','# Worksheets']
|
40
|
+
csvHeader = ['Rec #', 'Workbook','Directory','Type','Version','Build','Platform','Modified','# Data Sources','# Dashboards','# Worksheets']
|
41
41
|
if @recordDir
|
42
42
|
csvHeader.push('Workbook Directory')
|
43
43
|
end
|
@@ -65,6 +65,7 @@ module Analysis
|
|
65
65
|
@twb = twb
|
66
66
|
emit " -- #{@twbName}"
|
67
67
|
recordCSV [ @twb.name,
|
68
|
+
@twb.dir,
|
68
69
|
@twb.type,
|
69
70
|
@twb.version,
|
70
71
|
@twb.build,
|
data/lib/twb/calculatedfield.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (C) 2014, 2015,
|
1
|
+
# Copyright (C) 2014, 2015, 2020 Chris Gerrard
|
2
2
|
#
|
3
3
|
# This program is free software: you can redistribute it and/or modify
|
4
4
|
# it under the terms of the GNU General Public License as published by
|
@@ -26,7 +26,7 @@ module Twb
|
|
26
26
|
attr_reader :node, :properties
|
27
27
|
attr_reader :caption, :name, :uiname
|
28
28
|
attr_reader :datatype, :role, :propType
|
29
|
-
attr_reader :calculation, :
|
29
|
+
attr_reader :calculation, :referencedFields
|
30
30
|
attr_reader :isGroup, :groupMembers
|
31
31
|
attr_reader :hidden
|
32
32
|
|
@@ -52,8 +52,8 @@ module Twb
|
|
52
52
|
@properties ||= loadProperties
|
53
53
|
end
|
54
54
|
|
55
|
-
def
|
56
|
-
@calculation.
|
55
|
+
def referencedFields
|
56
|
+
@calculation.referencedFields
|
57
57
|
end
|
58
58
|
|
59
59
|
def formulaLines
|
data/lib/twb/columnfield.rb
CHANGED
@@ -14,6 +14,7 @@
|
|
14
14
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
15
15
|
|
16
16
|
require 'nokogiri'
|
17
|
+
require 'pry'
|
17
18
|
|
18
19
|
module Twb
|
19
20
|
|
@@ -85,7 +86,6 @@ module Twb
|
|
85
86
|
@aggregation = load 'aggregation'
|
86
87
|
@autoColumn = load 'auto-column'
|
87
88
|
@datatypeCustomized = load 'datatype-customized'
|
88
|
-
# @calcField = loadCalcField
|
89
89
|
end
|
90
90
|
|
91
91
|
def id
|
@@ -94,7 +94,7 @@ module Twb
|
|
94
94
|
|
95
95
|
def load nodeName
|
96
96
|
attr = @node.attribute(nodeName)
|
97
|
-
val = attr.nil? ? nil : attr.text.strip
|
97
|
+
val = attr.nil? ? nil : attr.text.strip
|
98
98
|
return val
|
99
99
|
end
|
100
100
|
|
data/lib/twb/datasource.rb
CHANGED
@@ -56,7 +56,7 @@ module Twb
|
|
56
56
|
attr_reader :tableFieldsMap
|
57
57
|
attr_reader :fieldUINames
|
58
58
|
attr_reader :aliases
|
59
|
-
attr_reader :calculatedFields, :
|
59
|
+
attr_reader :calculatedFields, :calculatedFieldsMap, :calculatedFieldNames, :calculatedField
|
60
60
|
attr_reader :allFields
|
61
61
|
attr_reader :groups
|
62
62
|
attr_reader :filters
|
@@ -391,40 +391,6 @@ module Twb
|
|
391
391
|
return @fieldUINames
|
392
392
|
end
|
393
393
|
|
394
|
-
def loadFieldUINames
|
395
|
-
# puts 'loadFieldUINames'
|
396
|
-
@fieldUINames = {}
|
397
|
-
# puts 'metadataFields'
|
398
|
-
metadataFields.each do |fld|
|
399
|
-
# puts " - name:%-45s | uiname:%-45s | localName:%-45s " % [ "'#{fld.name}'", "'#{fld.uiname}'", "'#{fld.localName}'"]
|
400
|
-
@fieldUINames[fld.uiname] = fld.uiname
|
401
|
-
@fieldUINames[fld.localName] = fld.uiname unless fld.localName.nil?
|
402
|
-
@fieldUINames[fld.name] = fld.uiname unless fld.name.nil?
|
403
|
-
end
|
404
|
-
# puts 'calculatedFields'
|
405
|
-
calculatedFields.each do |fld|
|
406
|
-
# puts " - name:%-45s | uiname:%-45s " % [ "'#{fld.name}'", "'#{fld.uiname}'"]
|
407
|
-
@fieldUINames[fld.name] = fld.uiname
|
408
|
-
@fieldUINames[fld.uiname] = fld.uiname
|
409
|
-
end
|
410
|
-
# puts 'localFields'
|
411
|
-
localFields.each do |fld|
|
412
|
-
# puts " - name:%-45s | uiname:%-45s " % [ "'#{fld.name}'", "'#{fld.uiname}'"]
|
413
|
-
@fieldUINames[fld.name] = fld.uiname
|
414
|
-
@fieldUINames[fld.uiname] = fld.uiname
|
415
|
-
end
|
416
|
-
# puts "columnFields: #{columnFields.length}"
|
417
|
-
columnFields.each do |fld|
|
418
|
-
@fieldUINames[fld.name] = fld.uiname
|
419
|
-
@fieldUINames[fld.uiname] = fld.uiname
|
420
|
-
end
|
421
|
-
groups.each do |fld|
|
422
|
-
@fieldUINames[fld.name] = fld.uiname
|
423
|
-
@fieldUINames[fld.uiname] = fld.uiname
|
424
|
-
end
|
425
|
-
return @fieldUINames
|
426
|
-
end
|
427
|
-
|
428
394
|
def tableFields
|
429
395
|
@tableFieldsMap.values
|
430
396
|
end
|
@@ -482,8 +448,7 @@ module Twb
|
|
482
448
|
|
483
449
|
def loadAllFields
|
484
450
|
@allFields = SortedSet.new
|
485
|
-
|
486
|
-
@allFields << dbf
|
451
|
+
@allFields << dbFields
|
487
452
|
@allFields << calculatedFieldNames
|
488
453
|
end
|
489
454
|
|
@@ -532,6 +497,53 @@ module Twb
|
|
532
497
|
|
533
498
|
private
|
534
499
|
|
500
|
+
def loadFieldUINames
|
501
|
+
@fieldUINames = {}
|
502
|
+
# puts"metadataFields: #{metadataFields.length}"
|
503
|
+
metadataFields.each do |fld|
|
504
|
+
# puts" - name:%-45s | caption:%-45s | uiname:%-45s " % [ "'#{fld.name}'", "'#{fld.caption}'", "'#{fld.uiname}'"]
|
505
|
+
unless fld.name.nil?
|
506
|
+
@fieldUINames[fld.uiname] = fld.uiname
|
507
|
+
@fieldUINames[fld.localName] = fld.uiname unless fld.localName.nil?
|
508
|
+
@fieldUINames[fld.name] = fld.uiname
|
509
|
+
end
|
510
|
+
end
|
511
|
+
# puts"localFields: #{localFields.length}"
|
512
|
+
localFields.each do |fld|
|
513
|
+
# puts" - name:%-45s | caption:%-45s | uiname:%-45s " % [ "'#{fld.name}'", "'#{fld.caption}'", "'#{fld.uiname}'"]
|
514
|
+
unless fld.caption.nil?
|
515
|
+
@fieldUINames[fld.name] = fld.caption
|
516
|
+
@fieldUINames[fld.uiname] = fld.caption
|
517
|
+
end
|
518
|
+
end
|
519
|
+
# puts"groups: #{groups.length}"
|
520
|
+
groups.each do |fld|
|
521
|
+
# puts" - name:%-45s | caption:%-45s | uiname:%-45s " % [ "'#{fld.name}'", "'#{fld.caption}'", "'#{fld.uiname}'"]
|
522
|
+
unless fld.caption.nil?
|
523
|
+
@fieldUINames[fld.name] = fld.caption
|
524
|
+
@fieldUINames[fld.uiname] = fld.caption
|
525
|
+
end
|
526
|
+
end
|
527
|
+
# puts"calculatedFields: #{calculatedFields.length}"
|
528
|
+
calculatedFields.each do |fld|
|
529
|
+
# puts" - name:%-45s | caption:%-45s | uiname:%-45s " % [ "'#{fld.name}'", "'#{fld.caption}'", "'#{fld.uiname}'"]
|
530
|
+
unless fld.caption.nil?
|
531
|
+
@fieldUINames[fld.name] = fld.caption
|
532
|
+
@fieldUINames[fld.uiname] = fld.caption
|
533
|
+
end
|
534
|
+
end
|
535
|
+
# puts"columnFields: #{columnFields.length}"
|
536
|
+
columnFields.each do |fld|
|
537
|
+
# puts" - name:%-45s | caption:%-45s | uiname:%-45s " % [ "'#{fld.name}'", "'#{fld.caption}'", "'#{fld.uiname}'"]
|
538
|
+
unless fld.caption.nil?
|
539
|
+
# @fieldUINames[fld.name] = fld.caption
|
540
|
+
@fieldUINames[fld.name.gsub(/^[\[]|[\]]$/,'')] = fld.caption
|
541
|
+
@fieldUINames[fld.uiname] = fld.caption
|
542
|
+
end
|
543
|
+
end
|
544
|
+
return @fieldUINames
|
545
|
+
end
|
546
|
+
|
535
547
|
def loadGroups
|
536
548
|
@groups = []
|
537
549
|
groupNodes = @node.xpath('.//group')
|