Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
105 commits
Select commit Hold shift + click to select a range
4f6b0b9
ADD: new method to execute KPI
Frisle Apr 5, 2023
9bbf3aa
Merge pull request #100 from Frisle/master
eduard93 Apr 5, 2023
352f321
auto bump version
bot Apr 5, 2023
c8282a1
ADD: New method to get dimension data type
Frisle Apr 13, 2023
f33435b
Update Dashboard.cls
Frisle Apr 17, 2023
b2fa8a9
Update Dashboard.cls
Frisle Apr 18, 2023
c7370f9
Merge pull request #101 from Frisle/patch-1
eduard93 Apr 18, 2023
ea106f2
auto bump version
bot Apr 18, 2023
79c8286
Update Dashboard.cls
Frisle Apr 20, 2023
f7f2f62
Merge pull request #102 from Frisle/patch-2
eduard93 Apr 21, 2023
4616b03
auto bump version
bot Apr 21, 2023
aeb1180
Update Utils.cls
Frisle Apr 25, 2023
eab95ba
Update Dashboard.cls
Frisle Apr 25, 2023
83b51c1
Merge pull request #104 from Frisle/patch-4
eduard93 Apr 26, 2023
0d32fa9
auto bump version
bot Apr 26, 2023
c027f35
Update Utils.cls
Frisle Apr 28, 2023
8f13cca
Merge pull request #103 from Frisle/patch-3
eduard93 Apr 29, 2023
391b827
auto bump version
bot Apr 29, 2023
dedbf9c
Update ResultSet.cls
Frisle May 5, 2023
34d27b3
Merge pull request #105 from Frisle/patch-5
eduard93 May 5, 2023
1703843
auto bump version
bot May 5, 2023
ef8bd84
Update REST.cls
Frisle May 11, 2023
24a4451
Update REST.cls
Frisle May 11, 2023
60b0aa9
Merge pull request #107 from Frisle/patch-6
eduard93 May 11, 2023
d7f9b4f
auto bump version
bot May 11, 2023
7599790
Update REST.cls
Frisle May 11, 2023
98544c4
Merge pull request #108 from Frisle/patch-7
eduard93 May 12, 2023
65be5d3
auto bump version
bot May 12, 2023
66abef4
FIX: issue when DataSource request is empty
Frisle May 16, 2023
1cdae29
ADD: new features: install and edit widgets in DSW
Frisle May 19, 2023
9748312
FIX: change return mode
Frisle May 19, 2023
95e54a8
Merge pull request #109 from Frisle/patch-8
eduard93 May 19, 2023
39bfc8c
auto bump version
bot May 19, 2023
3de3939
Merge pull request #110 from Frisle/master
eduard93 May 19, 2023
8244eb9
auto bump version
bot May 19, 2023
53801bb
FIX: remove breaking return statement
Frisle May 20, 2023
cea3174
Merge pull request #111 from Frisle/patch-9
eduard93 May 20, 2023
929634b
auto bump version
bot May 20, 2023
3e275b8
FIX: edited AddWidget method, remove redundant Http500 method. ADD: n…
Frisle May 22, 2023
d9d6393
ADD: new parameters
Frisle May 22, 2023
5673d9c
Merge branch 'master' into master
Frisle May 22, 2023
8711218
Merge pull request #112 from Frisle/master
eduard93 May 22, 2023
04519fd
auto bump version
bot May 22, 2023
740c0e2
FIX: replace wrong parameter name
Frisle May 22, 2023
8dd9897
Merge pull request #113 from Frisle/patch-10
eduard93 May 22, 2023
694b312
auto bump version
bot May 22, 2023
73ccdfc
ADD: new method DeleteWidget, new endpoint, dataSource check
Frisle May 23, 2023
20cdbe0
Merge pull request #114 from Frisle/master
eduard93 May 23, 2023
9787697
auto bump version
bot May 23, 2023
4174f0b
FIX: not documented issue. Crash when accessed to specific global
Frisle May 23, 2023
ee69344
Merge pull request #115 from Frisle/patch-11
eduard93 May 23, 2023
ace7c55
auto bump version
bot May 23, 2023
0a7bdcb
FIX: dataSource error
Frisle May 29, 2023
999196e
ADD: commentary
Frisle May 29, 2023
e7258f0
FIX: add logic to filter DataType
Frisle May 29, 2023
09048aa
FIX: add check for error in GetCubeMeasuresDataType
Frisle May 29, 2023
84419c2
Merge pull request #116 from Frisle/master
eduard93 Jun 13, 2023
a3d0e4c
auto bump version
bot Jun 13, 2023
16c2efa
FIX: Add support for compound calculation
Frisle Sep 25, 2023
c447d36
Merge pull request #117 from Frisle/patch-12
eduard93 Sep 25, 2023
54a730b
auto bump version
bot Sep 25, 2023
48071f7
Update REST.cls
jakcpto Oct 11, 2023
f049ef7
Merge pull request #119 from teccod/Develop
eduard93 Oct 13, 2023
17765cf
auto bump version
bot Oct 13, 2023
a8ba607
Update REST.cls
eduard93 Oct 13, 2023
a78a060
auto bump version
bot Oct 13, 2023
02253db
2.3.36
eduard93 Oct 13, 2023
130b8cd
auto bump version
bot Oct 13, 2023
767de6a
Set version to 2.3.38
eduard93 Oct 13, 2023
fde7909
auto bump version
bot Oct 13, 2023
3658268
FIX: hot fix for AbstractREST method
Frisle Nov 21, 2023
74e625b
FIX: hot fix. method without return
Frisle Nov 21, 2023
cbd5e3b
Merge pull request #120 from Frisle/patch-14
eduard93 Nov 21, 2023
bbd9ebb
auto bump version
bot Nov 21, 2023
7b5cfb8
REFACTOR: changed case of the parameter Filter
Frisle Apr 23, 2024
a59b8b7
REFACTOR: added logic in case of different letter case
Frisle Apr 24, 2024
5cc6300
Merge pull request #123 from Frisle/patch-15
eduard93 Apr 24, 2024
3564bd0
auto bump version
bot Apr 24, 2024
19ace35
FEAT: add audit system
Frisle Jul 9, 2024
281d8df
FEAT: added globals check to corresponding methods
Frisle Jul 11, 2024
87840c0
FEAT: add audit callback and global audit globals
Frisle Jul 12, 2024
c377292
Merge pull request #126 from Frisle/master
eduard93 Jul 12, 2024
cf70593
auto bump version
bot Jul 12, 2024
9564f84
add prefix to Addons
jakcpto Jun 6, 2025
55523da
CurrentApp for Debugging print
Jun 6, 2025
79254da
Prefix Support for Addons and Themes
Jun 9, 2025
1c93e96
Merge pull request #129 from jakcpto/master
evshvarov Jun 10, 2025
3b9aab1
auto bump version
bot Jun 10, 2025
6f4bdaf
FIX: fixed issue when series were procesed even they filtered out
Frisle Jul 5, 2025
e69bd49
Merge pull request #130 from Frisle/master
eduard93 Jul 7, 2025
830c9ce
auto bump version
bot Jul 7, 2025
bba3c1d
Update module.xml
eduard93 Jul 7, 2025
f7b5bc9
auto bump version
bot Jul 7, 2025
459d70c
FIX: new round of fixing. this time the new version were tested on a …
Frisle Jul 9, 2025
2ec8718
Merge pull request #132 from Frisle/master
eduard93 Jul 9, 2025
546c31f
auto bump version
bot Jul 9, 2025
eb6c186
FIX: rollback to the state of 3.2.23 version
Frisle Sep 8, 2025
89d536a
Merge pull request #133 from Frisle/master
eduard93 Sep 8, 2025
d03566b
auto bump version
bot Sep 8, 2025
6625964
FIX: when axis with "agg" type received a children object
Frisle Oct 8, 2025
e5d7196
Merge pull request #136 from Frisle/patch-1
eduard93 Oct 8, 2025
e2e895a
auto bump version
bot Oct 8, 2025
8ae5f4e
REFACTOR: rework drillthrough processing
Frisle Feb 13, 2026
ab8ca73
Merge pull request #137 from Frisle/patch-2
MakarovS96 Feb 13, 2026
79d5775
auto bump version
bot Feb 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
sc-list.txt
.vscode/settings.json
22 changes: 3 additions & 19 deletions MDX2JSON/AbstractREST.cls
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ ClassMethod OnPreDispatch(pUrl As %String, pMethod As %String, ByRef pContinue A

Set st = ..ConvertRequestBody()
If $$$ISERR(st) {
Do ..Http500(st)
#; Do ..Http500(st)
Set pContinue = $$$NO
Quit st
}
Expand All @@ -37,9 +37,9 @@ ClassMethod OnPreDispatch(pUrl As %String, pMethod As %String, ByRef pContinue A
Set Namespace = %request.Get("Namespace", $namespace)
Set st = ..CheckNamespace(.Namespace)
If $$$ISERR(st) {
Do ..Http500(st)
#; Do ..Http500(st)
Set pContinue = $$$NO
Quit
Quit st
}

#; Dispatch
Expand Down Expand Up @@ -114,22 +114,6 @@ ClassMethod Login(skipheader As %Boolean = 1) As %Status
Return $$$OK
}

/// Issue an '500' error and give some indication as to what occurred.<br>
/// <b>pStatus</b> - %status, not %Exception.AbstractException.
ClassMethod Http500(pStatus As %Exception.AbstractException) As %Status
{
// we are expecting status
#; Set the response Http status
Set %response.Status="500 Internal Server Error"

#; Skip duplicate calls
Quit:$isObject(pStatus) $$$OK

#; Return a helpful error string
Write "{""Error"":"_$$$ZENJSSTR($System.Status.GetErrorText(pStatus,%session.Language))_"}"

Quit $$$OK
}

/// Returns info about MDX2JSON package mapping
ClassMethod GetMappings() As %ArrayOfObjects
Expand Down
46 changes: 45 additions & 1 deletion MDX2JSON/Dashboard.cls
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,42 @@ ClassMethod WidgetsToProxyObject(Dashboard As %DeepSee.Dashboard.Definition, Out
return st
}


/// A very specific method of displaying the data type for cube measures.
/// Serves for the convenience of front-end development of the filter widget.
/// The return is something like this <b>%DeepSee.Time.DayMonthYear</b>
ClassMethod GetCubeMeasuresDataType(Widget, Number, CubeName, Output DataType As %String) As %Status
{

set st = $$$OK
set dataSource = $piece(Widget.dataSource, ".", *) // get dataSource type
try{
if ((dataSource '= "kpi") && (dataSource '= "")){
if ($FIND(Widget.controls.GetAt(Number).targetProperty, "[") && $FIND(Widget.controls.GetAt(Number).targetProperty, ".")){
set tMeasure = $TRANSLATE(Widget.controls.GetAt(Number).targetProperty, "[]", "")

set st = ##class(%DeepSee.Utils).%GetDimensionInfo(CubeName,tMeasure,.pDimNo,.pHierNo,.pLevelNo) // get positional info about dimension

Set tMbrInfo = $G($$$DeepSeeMetaGLVN("cubes",$$$UPPER(CubeName),"mbr#",pDimNo,pHierNo,pLevelNo))
set DataType = $LG(tMbrInfo,6) // get data type
if '($FIND(DataType, "%")){ // if DataType return cube fact search for dataType in "star"
Set tMbrInfo = $G($$$DeepSeeMetaGLVN("cubes", $$$UPPER(CubeName), "star", DataType, "prop", $LG(tMbrInfo,7), "type"))
set DataType = tMbrInfo
}
}else{

set DataType = ""
}
}else{

set DataType = ""
}
}catch ex {
set st = ex.AsStatus()
}
return st
}

/// Converts relevant parts of %DeepSee.Dashboard.Widget object into %ZEN.proxyObject.
ClassMethod WidgetToProxyObject(Widget As %DeepSee.Dashboard.Widget, CubeName As %String) As %ZEN.proxyObject [ Internal ]
{
Expand All @@ -108,13 +144,14 @@ ClassMethod WidgetToProxyObject(Widget As %DeepSee.Dashboard.Widget, CubeName As
// Linked widgets processing
set mdx = ""
set basemdx = ""
set obj.Link = Widget.dataLink
set obj.dataLink = Widget.dataLink
}

// datasource is a kpi
if $piece(Widget.dataSource, ".", *) = "kpi" {
set kpiClass = ##class(%DeepSee.Utils).%GetKPIClass(Widget.dataSource)
set obj.kpitype = $classmethod(kpiClass, "%GetSourceType")
set obj.kpiclass = kpiClass // showing kpi class for implementing context menu button for kpi

}

Expand Down Expand Up @@ -253,6 +290,13 @@ ClassMethod WidgetControlToProxyObject(Widget As %DeepSee.Dashboard.Widget, Numb
set obj.label = ##class(%DeepSee.UserPortal.Utils).%ResolveText(obj.label)
set obj.source = Widget.name

set st = ..GetCubeMeasuresDataType(Widget,Number,CubeName,.fDataType)

if (st = $$$OK)
{
set obj.targetPropertyDataType = fDataType
}

set:(obj.target="") obj.target = Widget.name

if ($e(obj.value)="@") {
Expand Down
125 changes: 119 additions & 6 deletions MDX2JSON/REST.cls
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ XData UrlMap
<Route Url="/MDX2JSONP" Method="POST" Call="WriteJSONPfromMDX"/>
<Route Url="/MDXDrillthrough" Method="POST" Call="WriteDrillthroughJSON" />
<Route Url="/MDX2XMLA" Method="POST" Call="WriteXMLAfromMDX" />
<Route Url="/KPI" Method="POST" Call="KPIExecute"/>

<!-- Get info about availible filters and their values -->
<Route Url="/Filters" Method="POST" Call="WriteFiltersForDataSource"/>
Expand All @@ -60,11 +61,16 @@ XData UrlMap
<Route Url="/Widgets" Method="POST" Call="GetWidgetsList" />
<Route Url="/Action/:Cube/:Action" Method="POST" Call="ExecuteAction"/>

<!-- Send dashboard JSON -->
<Route Url="/saveWidget" Method="POST" Call="saveWidget"/>
<Route Url="/deleteWidget" Method="POST" Call="deleteWidget"/>

<!-- Get info about system format and locale-->
<Route Url="/Format" Method="GET" Call="GetFormat"/>

<!-- Get info about pivot-->
<Route Url="/DataSource" Method="POST" Call="GetDataSource" />
<Route Url="/DataSourceList/:type" Method="POST" Call="GetListDataSources" />

<!-- Get info about pivot-->
<Route Url="/TermList" Method="POST" Call="GetTermList" />
Expand All @@ -85,7 +91,6 @@ XData UrlMap
<Route Url="/MDX/:query" Method="GET" Call="WriteJSONfromMDXURL"/>
<Route Url="/MDXfilters/:query" Method="GET" Call="WriteFiltersForMDX"/>

<Route Url="/KPI" Method="POST" Call="WriteJSONfromKPI"/>

<!-- Test methods-->
<Route Url="/Test" Method="GET" Call="Test"/>
Expand Down Expand Up @@ -114,7 +119,7 @@ ClassMethod Test() As %Status
set obj.Status = "OK"
set obj.Embed = $g(^MDX2JSON.Embed, $g(^%MDX2JSON.Embed, ""))
set obj.User = $Username
set obj.Version = "3.2.5"
set obj.Version = "3.2.38"
set obj.Parent = ##class(MDX2JSON.Tests).#LastCommit
set obj.ParentTS = ##class(MDX2JSON.Tests).#LastCommitTS
set obj.DefaultApp = $System.CSP.GetDefaultApp($Namespace)
Expand All @@ -132,6 +137,63 @@ ClassMethod Test() As %Status
return $$$OK
}

ClassMethod deleteWidget() As %Status
{
set name = $$$R("key")
set dashboardData = $$$R("Dashboard")

return ##class(MDX2JSON.Utils).DeleteWidget(name,dashboardData)
}

ClassMethod saveWidget() As %Status
{
set key = $$$R("key")
set widgetData= $$$R("WidgetData")
set dashboardData = $$$R("Dashboard")

return ##class(MDX2JSON.Utils).AddWidget(widgetData,dashboardData,key)
}


/// Get all data sources including "pivot", "kpi", "worksheets","metrics"
ClassMethod GetListDataSources(Source) As %Status
{

set Source = $ZCONVERT($ZCONVERT(Source ,"I","URL") ,"I","UTF8")

if (Source = "pivot")
{
Set tSC = ##class(%DeepSee.Utils).%GetPivotListArray(.tParms,.pMetaData,.pData)

}
elseif (Source = "kpi")
{
Set tSC = ##class(%DeepSee.Utils).%GetKPIListArray(.tParms,.pMetaData,.pData)

}
elseif (Source = "worksheets")
{
Set tSC = ##class(%DeepSee.Utils).%GetWorksheetListArray(.tParms,.pMetaData,.pData)

}
elseif (Source = "metrics")
{
Set tSC = ##class(%DeepSee.Utils).%GetMetricListArray(.tParms,.pMetaData,.pData)

}

quit:$$$ISERR(tSC) tSC

Set tSC = ##class(%DeepSee.REST.v1.DataServer).%CreateObjectFromArray(.pData,pMetaData,.tSourceObj)

quit:$$$ISERR(tSC) tSC

do tSourceObj.%ToJSON()

quit tSC
}


ClassMethod GetDataSource() As %Status
{
return ##class(MDX2JSON.Utils).GetDataSource($$$R("DataSource"))
Expand Down Expand Up @@ -220,6 +282,41 @@ ClassMethod WriteFiltersForDataSource() As %Status
return st
}

///Execute requests from kpi
ClassMethod KPIExecute() As %Status
{
try{
set KPI = $$$R("KPI")
set Drillthrough = $$$R("Drillthrough")


if (Drillthrough = 1){
set SortOrder = $$$R("SortOrder")

if %request.Content.FILTERS
{
set Filters = $$$R("FILTERS")

}else{
set Filters = $$$R("Filters")
}

set SortColumn = $$$R("SortColumn")
set pSelection = SortColumn _ "," _ SortOrder

set st = ##class(MDX2JSON.Utils).WriteDrillthroughJSONKPI(KPI, Filters, pSelection)
}
else {
set st = ##class(%DeepSee.REST.v1.DataServer).WriteJSONfromKPI(KPI)
}

}catch ex {
set st=ex.AsStatus()
}

return st
}

/// Wrapper for ##class(MDX2JSON.Utils).WriteJSONPfromMDX(pMDX)<br>
/// Converts incoming request object and calls abovementioned method.
ClassMethod WriteJSONfromMDX() As %Status
Expand Down Expand Up @@ -324,12 +421,20 @@ ClassMethod WritePivotVariablesForCube(Cube As %String) As %Status
ClassMethod WriteAddons() As %Status
{
#dim sc As %Status = $$$OK

set app = "/dsw"

set currentApp = $ZConvert($Get(%request.CgiEnvs("SCRIPT_NAME"), ""), "L")
set prefix = $piece(currentApp, "/mdx2json", 1)
set app = prefix _ "/dsw"
set path = $system.CSP.GetFileName(app _ "/")
set path = ##class(%File).NormalizeDirectory(path)
set path = ##class(%File).SubDirectoryName(path, "addons", $$$YES)
set url = app _ "/addons/"

// Check if path exists
if '##class(%File).Exists(path) {
set sc = $$$ERROR($$$GeneralError, "Addons directory does not exist: "_path_". Probably different prefixes for MDX2JSON and DSW applications.")
quit sc
}

#dim rs As %SQL.ClassQueryResultSet = ##class(%File).FileSetFunc(path, "*.js")

Expand All @@ -350,12 +455,20 @@ ClassMethod WriteThemes() As %Status
{
#dim sc As %Status = $$$OK

set app = "/dsw"
set currentApp = $ZConvert($Get(%request.CgiEnvs("SCRIPT_NAME"), ""), "L")
set prefix = $piece(currentApp, "/mdx2json", 1)
set app = prefix _ "/dsw"
set path = $system.CSP.GetFileName(app _ "/")
set path = ##class(%File).NormalizeDirectory(path)
set path = ##class(%File).SubDirectoryName(path, "themes", $$$YES)
set url = app _ "/themes/"

// Check if path exists
if '##class(%File).Exists(path) {
set sc = $$$ERROR($$$GeneralError, "Themes directory does not exist: "_path_". Probably different prefixes for MDX2JSON and DSW applications.")
quit sc
}

#dim rs As %SQL.ClassQueryResultSet = ##class(%File).FileSetFunc(path, "*.css")

set list = $$$NewDynDTList
Expand All @@ -377,4 +490,4 @@ ClassMethod WriteJSONfromKPI() As %Status [ CodeMode = objectgenerator ]
do %code.Write(base)
}

}
}
18 changes: 9 additions & 9 deletions MDX2JSON/ResultSet.cls
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ Method ToProxyObject(Output pStatus As %Status) As %ZEN.proxyObject
try {
set obj.Info = ..InfoToProxyObject() // basic info about cube and query
quit:obj.Info.percentDone<100

set obj.Cols = ..AxesToListOfObjects() // all axes
set obj.Data = ..DataToListOfDataTypes() // array of all cells, left-to-right, up-to-down
} catch ex {
Expand Down Expand Up @@ -79,7 +79,7 @@ Method InfoToProxyObject() As %ZEN.proxyObject
set info.numericGroupSeparator = ##class(%SYS.NLS.Format).GetFormatItem("NumericGroupSeparator")
set info.numericGroupSize = ##class(%SYS.NLS.Format).GetFormatItem("NumericGroupSize")
set info.decimalSeparator = ##class(%SYS.NLS.Format).GetFormatItem("DecimalSeparator")

return info
}

Expand Down Expand Up @@ -130,7 +130,7 @@ Method ProcessOneAxisCell(CubeIndex, AxisKey, CubeName, QueryKey, AxisNumber, No
set cell.vis = $LG(tNode,2) // visibility helper - does not help (apperently it shows if the cell is the lowest level)

// now we process cell children, if any exist
if ($D($$$DeepSeeAxisGLVN(CubeIndex, AxisKey, "axes", Node, "ch")) = 10) {
if ($D($$$DeepSeeAxisGLVN(CubeIndex, AxisKey, "axes", Node, "ch")) = 10) && ($LG(tNode, 1)'="agg") {
set cell.children = $$$NewDynObjList
set key = $O($$$DeepSeeAxisGLVN(CubeIndex, AxisKey, "axes", Node, "ch", ""))
while (key'="") {
Expand All @@ -154,23 +154,23 @@ Method ProcessOneAxisCell(CubeIndex, AxisKey, CubeName, QueryKey, AxisNumber, No
if (..IsCellNull(cell, AxisNumber, Node)=1) {
return cell.children
}

try {
set cell.path = ##class(%DeepSee.Query.Engine).%GetSpecForAxisNode(CubeName, QueryKey, AxisNumber, Node) // MDX cell path
set:$e(cell.path)="(" cell.path = $e(cell.path, 2, *-1) // removing redundant parentheses
} catch ex {
set cell.path = "path too long"
}

set cell.format = $LG(tNode,12) // format for numbers, eg: $## ###.##
set cell.total = $LG(tNode,8) //COUNT,AVG function
set cell.type = $LG(tNode,1) // mbr,cmbr,lit,exp
set cell.valueID = $LG(tNode,6) // id in mdx dimension for mbr, path for cmbr
set cell.title = $LG(tNode,23)

set cell.headerStyle = $LG(tNode,19)
set cell.cellStyle = $LG(tNode,18)

set info = $LG(tNode,18)
if info'="" { // extract aggregation information, leave the rest as css
set summaryposition = $f(info,"summary")
Expand All @@ -181,7 +181,7 @@ Method ProcessOneAxisCell(CubeIndex, AxisKey, CubeName, QueryKey, AxisNumber, No
}
set cell.style = info // css
}

set tDimNo = $LG(tNode,9)
set tHierNo = $LG(tNode,10)
set tLevelNo = $LG(tNode,11)
Expand All @@ -190,7 +190,7 @@ Method ProcessOneAxisCell(CubeIndex, AxisKey, CubeName, QueryKey, AxisNumber, No
do ##class(%DeepSee.Utils).%GetDimensionCaption(CubeName,tDimNo, tHierNo,tLevelNo, .tAxisCaption)
set cell.dimension = tCaption // cube dimension taken from the name of the axes.
if (cell.dimension = "") {set cell.dimension = tCaption} // hack for assigne dimension property in case of empty dimension


set:$$$Debug cell.visible = '..IsCellNull(cell,AxisNumber,Node)
set:$$$Debug cell.node = Node
Expand Down
Loading