internal OlapReport(decimal ID, User Owner) : base(ID, Owner)
        {
            _schema = new Schema();
            _axes   = new Olap.Axes(this.Schema);

            this.Axes.BeforeChangeItem += new EventHandler(OnBeforeChangeAxesItem);

            if (ID == 0)          //if new
            {
                FI.Common.DataAccess.IOlapReportsDA dacObj = DataAccessFactory.Instance.GetOlapReportsDA();

                string ReportXml    = "<R></R>";
                string OpenNodesXml = "<NODES></NODES>";
                _graphOptions = GraphOptionsEnum.Pivot; // graph pivot option on by default

                _id = dacObj.InsertReport(
                    _owner.ID, 0, 0, "New Report", "", this.IsSelected,
                    (byte)this.GraphType, this.GraphTheme, (int)this.GraphOptions, this.GraphWidth, this.GraphHeight, this.GraphNum1,
                    ReportXml, OpenNodesXml);

                // flags
                _isProxy = false;
                _isDirty = false;
            }
        }
        override protected internal void _Open()
        {
            short  sharing = 0;
            short  maxSubscriberSharing = 0;
            string reportXml            = "";
            string openNodesXml         = "";
            string schemaXml            = "";
            byte   graphType            = 0;
            int    graphOptions         = 0;

            //bool fakeIsSelected=false;

            FI.Common.DataAccess.IOlapReportsDA dacObj = DataAccessFactory.Instance.GetOlapReportsDA();
            dacObj.ReadReport(_owner.ID, this.ID,
                              ref this._parentReportId,
                              ref this._name,
                              ref this._description,
                              ref sharing,
                              ref maxSubscriberSharing,
                              ref this._isSelected,   //ref fakeIsSelected,
                              ref graphType,
                              ref _graphTheme,
                              ref graphOptions,
                              ref _graphWidth,
                              ref _graphHeight,
                              ref _graphNum1,
                              ref Schema.Server,
                              ref Schema.Database,
                              ref Schema.Cube,
                              ref reportXml,
                              ref schemaXml,
                              ref openNodesXml,
                              ref _undoStateCount,
                              ref _redoStateCount);

            this._sharing = (Report.SharingEnum)sharing;
            this._maxSubscriberSharing = (Report.SharingEnum)maxSubscriberSharing;
            this._graphType            = (GraphTypeEnum)graphType;
            this._graphOptions         = (GraphOptionsEnum)graphOptions;

            //dacObj.UpdateReportHeader(_owner.ID , this.ID, this._parentReportId , (byte)this.SharingStatus , this.Name , this.Description , this.IsSelected , 0, "");

            this.Schema.OpenNodesFromXml(openNodesXml);             // before other loads, cause then other loads will fetch members depending on open nodes
            LoadFromXmlSchema(schemaXml);
            LoadFromXml(reportXml);
        }