Hi Ahmad,

These functions do not exist in MDX, please see the MDX function documentation here: https://docs.intersystems.com/iris20221/csp/docbook/Doc.View.cls?KEY=D2R...

You likely want to use the %OR function: https://docs.intersystems.com/iris20221/csp/docbook/DocBook.UI.Page.cls?...

Using %OR would allow you to reference multiple members, for example:

Hi Virat,

Here is a good resource for getting started with InterSystems IRIS BI (DeepSee):

If you are interested in creating dashboards and exploring your data, IRIS BI is a good choice.

If you are interested in traditional reporting, you may want to consider InterSystems Reports:

When executing a query, DeepSee will store intermediate and final results in the cache globals. As the engine was trying to create a new session, it looks like it could not access the database in e:\hs-db\tfoms\. Either this database is mounted read only (in this case you will need to create some DeepSee mappings) or the user executing the query does not have r/w permissions on this database.

I just tested and it worked OK for me. I used the following:


 Class DC.TestImport Extends %Persistent
Property TS As %TimeStamp; 
Property Bool As %Boolean; 


2021-05-27 17:43:15,0
2021-05-27 17:51:13,0
2021-05-27 17:53:11,1

Import Settings:

File Name:
<Device Default>
Columns are delimited by:
Special Character: ,
First row contains column headers?
String quote:
Date format:
Time format:
TimeStamp format:
ODBC Format
Disable validation?
Defer Index Building with %SortBegin/%SortEnd:

We also have a sample that uses %InjectFact() inside of the %OnBuildCube() Method. Documentation here.

This injects the cities "Cambridge", "Chelsea", and "Somerville" into the HoleFoods cube. These city members will exist in the dimension table, but there is no associated data (there could be, but in this example there isn't). When using the City level on rows and the default NONEMPTY, we see the following:

When we turn "Show Empty" on:

We now see these members with no data:

Hi Evgenii,

I noticed this question has not been answered yet, is there a specific reason why you are looking into using a Data Connector? Typically before recommending a Data Connector, we would recommend that a new class is created and populated from a similar query that your Data Connector would have used. This allows for a lot more standard cube usage. Standard options like synchronization and detail listings would be available without needing to implement custom code to modify the SQL and they wouldn't require you to worry about using $$$RESTRICT

By default, changing the display of the Week members is not available. However, you can create a custom time level by extending %DeepSee.Time.WeekYear and overriding a couple methods. Then you can change your timeFunction value in your cube definition. Here is a sample I put together that was MINIMALLY tested on a newer version than the version you noted here:

 Class CustomTime.WeekRange Extends %DeepSee.Time.WeekYear
{ /// Return the user-visible name of this level.
ClassMethod %GetName() As %String
Quit "WeekRange"
} /// Convert a level key value to a display value.
ClassMethod %KeyToValue(pKey As %Integer, pFormat As %String = "", pOffset As %String = "") As %String
Set tValue = "" Set tSC=..%KeyToBaseRange(pKey,.tStart,.tEnd,pOffset)
Set tValue=$zd(tStart)_"-"_$zd(tEnd-1)
Quit tValue
} /// Convert a $H value to the logical value used for this level.
/// This is used within the computed field logic for properties
/// within a fact table based on this level.<br/>.
/// In this case, we convert $H to an ISO Week: YYYYWnn
ClassMethod %Convert(pTime As %DeepSee.Datatype.dateTime, pTimeOffset As %String = "") As %Integer [ CodeMode = expression ]
} }

You need to make sure "found" is being updated when the recursive call exits. This can either be done by reference (passing in .found) or simply as a return value (set found instead of do). It is always going through the full loop and never exiting early because once the value is found, it is never passed back up as being found. This means that the loop just continues on. Here are two examples of these solutions

if $isObject(value) {
             do ..JSONIterator(value,newPath,.SearchKey,.SearchVal,.found)

if $isObject(value) {
             set found= ..JSONIterator(value,newPath,.SearchKey,.SearchVal,found)

Based on the documentation, it seems like this may be expected since $GET is expecting a variable, not a value returned from a method call. The main purpose is to protect against undefined references which a method call should never return since an empty string is different than undefined. Since the documentation mentions it accepts multidimensional object properties, it seems like it is assuming this is what the passed in reference is.

Documentation on expected values here.

Hi Michel,

I am not exactly sure which type of stream you are using, but different types appear to override the Read methods.

For example:
%Stream.FileCharacter does not implement a Read method, but it extends %Stream.FileBinary. In %Stream.FileBinary, the Read method is defined as:

Method Read(ByRef len As %Integer = 32000, ByRef sc As %Status) As %RawString

Hi David,

I see you used the "VSCode" tag. The couple of times I have done this in VSCode, I typically just import the XML classes into my system and then once they are loaded, I use the VSCode ObjectScript Explorer and export my classes from there into my project. I've only done it once or twice, so I don't know if there is a better way of doing it.

If you are interested, these are some methods for doing it manually as well that could be scripted to do all your files:

USER>do $system.OBJ.Load("C:\Users\psteiwer\Desktop\Class.xml")
Load started on 03/10/2020 17:40:03
Loading file C:\Users\psteiwer\Desktop\Class.xml as xml
Imported class: PivotSubscriptions.Utils
Load finished successfully.
USER>do $system.OBJ.ExportUDL("PivotSubscriptions.Utils.CLS","C:\Users\psteiwer\Desktop\Class.cls")