public static IReference <SubReportInstance> CreateInstance(ScopeInstance parentInstance, SubReport subReport, OnDemandMetadata odpMetadata) { SubReportInstance subReportInstance = new SubReportInstance(subReport, odpMetadata); IReference <SubReportInstance> reference = odpMetadata.GroupTreeScalabilityCache.AllocateAndPin(subReportInstance, 0); subReportInstance.m_cleanupRef = (IDisposable)reference; parentInstance.AddChildScope((IReference <ScopeInstance>)reference, subReport.IndexInCollection); return(reference); }
private static void TraceSubReportInstance(SubReportInstance instance, int level) { if (instance != null) { Global.Tracer.Trace("{0}SubReport, Status={1}, Error={2}, NoRows={3}, InstanceUniqueName={4}, Culture={5}", GroupTreeTracer.GetEmptyString(level), instance.RetrievalStatus, instance.ProcessedWithError, instance.ProcessedWithError || instance.NoRows, instance.InstanceUniqueName, instance.ThreadCulture); GroupTreeTracer.TraceParameters(instance.Parameters, level); if (instance.SubReportDef.Report != null) { int count = instance.SubReportDef.Report.MappingDataSetIndexToDataSet.Count; } GroupTreeTracer.TraceReportInstance(null, instance.ReportInstance.Value(), instance.SubReportDef.Report, level); } }
public bool FetchSubReportData(AspNetCore.ReportingServices.ReportIntermediateFormat.SubReport subReport, AspNetCore.ReportingServices.ReportIntermediateFormat.SubReportInstance subReportInstance) { AspNetCore.ReportingServices.ReportIntermediateFormat.ReportInstance reportInstance = subReportInstance.ReportInstance.Value(); reportInstance.ResetReportVariables(subReport.OdpContext); bool flag; try { this.FetchData(reportInstance, subReport.MergeTransactions); if (subReport.OdpContext.ReprocessSnapshot && reportInstance.IsMissingExpectedDataChunk(subReport.OdpContext)) { flag = false; } else { if (subReport.OdpContext.ReprocessSnapshot && !subReport.InDataRegion) { Merge.PreProcessTablixes(subReport.Report, subReport.OdpContext, false); } flag = true; } } catch (ProcessingAbortedException) { flag = false; } if (flag) { reportInstance.CalculateAndStoreReportVariables(subReport.OdpContext); } return(flag); }
private bool InitSubReport(AspNetCore.ReportingServices.ReportIntermediateFormat.SubReport subReport, IReference <AspNetCore.ReportingServices.ReportIntermediateFormat.SubReportInstance> subReportInstanceRef) { bool flag = true; AspNetCore.ReportingServices.ReportIntermediateFormat.SubReportInstance subReportInstance = subReportInstanceRef.Value(); if (this.m_odpContext.SnapshotProcessing && subReportInstance.ProcessedWithError) { return(false); } try { if (!this.m_odpContext.SnapshotProcessing) { subReportInstance.RetrievalStatus = subReport.RetrievalStatus; } if (subReportInstance.RetrievalStatus == AspNetCore.ReportingServices.ReportIntermediateFormat.SubReport.Status.DefinitionRetrieveFailed) { subReportInstance.ProcessedWithError = true; return(false); } if (this.m_odpContext.CurrentReportInstance == null && subReport.Report != null) { if (!this.m_odpContext.SnapshotProcessing) { subReport.OdpSubReportInfo.UserSortDataSetGlobalId = this.m_odpContext.ParentContext.UserSortFilterContext.DataSetGlobalId; } this.m_odpContext.UserSortFilterContext.UpdateContextForFirstSubreportInstance(this.m_odpContext.ParentContext.UserSortFilterContext); } if (this.m_odpContext.SnapshotProcessing && !this.m_odpContext.ReprocessSnapshot) { AspNetCore.ReportingServices.ReportIntermediateFormat.ReportInstance reportInstance = subReportInstance.ReportInstance.Value(); this.m_odpContext.CurrentReportInstance = reportInstance; this.m_odpContext.LoadExistingSubReportDataChunkNameModifier(subReportInstance); reportInstance.InitializeFromSnapshot(this.m_odpContext); this.Init(true, false); this.m_odpContext.ThreadCulture = subReportInstance.ThreadCulture; this.SetupReport(reportInstance); this.m_odpContext.SetSubReportContext(subReportInstance, true); this.m_odpContext.ReportRuntime.CustomCodeOnInit(this.m_odpContext.ReportDefinition); this.m_odpContext.OdpMetadata.SetUpdatedVariableValues(this.m_odpContext, reportInstance); return(flag); } AspNetCore.ReportingServices.ReportIntermediateFormat.ReportInstance reportInstance2 = this.PrepareReportInstance(subReportInstance); this.m_odpContext.CurrentReportInstance = reportInstance2; this.Init(true, false); subReportInstance.InstanceUniqueName = this.m_odpContext.CreateUniqueID().ToString(CultureInfo.InvariantCulture); this.m_odpContext.SetSubReportContext(subReportInstance, false); this.SetupReport(reportInstance2); this.m_parameters = OnDemandProcessingContext.EvaluateSubReportParameters(this.m_odpContext.ParentContext, subReport); bool flag2 = default(bool); if (!this.m_odpContext.SnapshotProcessing && !this.m_odpContext.ProcessWithCachedData) { try { this.m_odpContext.ProcessReportParameters = true; this.m_odpContext.ReportObjectModel.ParametersImpl.Clear(); AspNetCore.ReportingServices.ReportProcessing.ReportProcessing.ProcessReportParameters(subReport.Report, this.m_odpContext, this.m_parameters); } finally { this.m_odpContext.ProcessReportParameters = false; } if (!this.m_parameters.ValuesAreValid()) { subReportInstance.RetrievalStatus = AspNetCore.ReportingServices.ReportIntermediateFormat.SubReport.Status.ParametersNotSpecified; throw new ReportProcessingException(ErrorCode.rsParametersNotSpecified); } this.m_odpContext.ReportParameters = this.m_parameters; } else if (!this.m_parameters.ValuesAreValid(out flag2) && flag2) { subReportInstance.RetrievalStatus = AspNetCore.ReportingServices.ReportIntermediateFormat.SubReport.Status.ParametersNotSpecified; throw new ReportProcessingException(ErrorCode.rsParametersNotSpecified); } this.Init(this.m_parameters); subReportInstance.Parameters = new ParametersImpl(this.m_odpContext.ReportObjectModel.ParametersImpl); this.m_odpContext.SetSubReportNameModifierAndParameters(subReportInstance, !this.m_odpContext.SnapshotProcessing); if (this.m_odpContext.ReprocessSnapshot) { reportInstance2.InitializeFromSnapshot(this.m_odpContext); } this.EvaluateReportLanguage(reportInstance2, null); subReportInstance.ThreadCulture = this.m_odpContext.ThreadCulture; if (!this.m_odpContext.SnapshotProcessing || this.m_odpContext.FoundExistingSubReportInstance) { flag = this.FetchSubReportData(subReport, subReportInstance); if (flag) { subReportInstance.RetrievalStatus = AspNetCore.ReportingServices.ReportIntermediateFormat.SubReport.Status.DataRetrieved; } else { subReportInstance.RetrievalStatus = AspNetCore.ReportingServices.ReportIntermediateFormat.SubReport.Status.DataRetrieveFailed; subReportInstance.ProcessedWithError = true; } } else { subReportInstance.RetrievalStatus = AspNetCore.ReportingServices.ReportIntermediateFormat.SubReport.Status.DataNotRetrieved; subReportInstance.ProcessedWithError = true; } this.m_odpContext.ReportParameters = null; return(flag); } catch (AspNetCore.ReportingServices.ReportProcessing.ReportProcessing.DataCacheUnavailableException) { throw; } catch (Exception ex2) { flag = false; subReportInstance.ProcessedWithError = true; if (subReportInstance.ReportInstance != null) { subReportInstance.ReportInstance.Value().NoRows = false; } if (ex2 is RSException) { this.m_odpContext.ErrorContext.Register((RSException)ex2, subReport.ObjectType); return(flag); } return(flag); } }
private void SetupObjectModels(OnDemandMode mode, bool needDeepCopyPath, int moveNextInstanceIndex, string scopeName) { AspNetCore.ReportingServices.ReportIntermediateFormat.DataRegionInstance dataRegionInstance = null; IMemberHierarchy memberHierarchy = null; int num = -1; ScopeInstance scopeInstance = base.m_odpContext.CurrentReportInstance; List <InstancePathItem> lastInstancePath = this.m_lastInstancePath; List <InstancePathItem> list = null; int num2 = 0; AspNetCore.ReportingServices.ReportIntermediateFormat.Report reportDefinition = base.m_odpContext.ReportDefinition; ObjectModelImpl reportObjectModel = base.m_odpContext.ReportObjectModel; bool flag = false; bool flag2 = false; int num3 = 0; try { if (this.m_lastRIFObject.InstancePath != null) { list = this.m_lastRIFObject.InstancePath; num2 = list.Count; } if (mode != OnDemandMode.InScope) { base.m_odpContext.EnsureCultureIsSetOnCurrentThread(); } if (mode != OnDemandMode.InScope || 1 != reportDefinition.DataSetsNotOnlyUsedInParameters || !this.InScopeCompare(reportDefinition.FirstDataSet.Name, scopeName)) { int num4 = 0; if (base.m_odpContext.InSubreport) { num4 = InstancePathItem.GetParentReportIndex(this.m_lastRIFObject.InstancePath, this.m_lastRIFObject.InstancePathItem.Type == InstancePathItemType.SubReport); } bool flag3 = default(bool); int sharedPathIndex = InstancePathItem.GetSharedPathIndex(num4, lastInstancePath, list, reportObjectModel.AllFieldsCleared, out flag3); for (int i = this.m_specialLastGroupingValues.Count; i < num4; i++) { this.m_specialLastGroupingValues.Add(null); } for (int j = num4; j < num2; j++) { InstancePathItem instancePathItem = list[j]; bool flag4 = false; if (mode != OnDemandMode.InScope) { flag4 = (j <= sharedPathIndex); } if (!flag4 && mode == OnDemandMode.FullSetup) { if (this.m_specialLastGroupingValues.Count < num2) { this.m_specialLastGroupingValues.Add(null); } else { this.m_specialLastGroupingValues[j] = null; } } switch (instancePathItem.Type) { case InstancePathItemType.SubReport: if (scopeInstance.SubreportInstances != null && instancePathItem.IndexInCollection < scopeInstance.SubreportInstances.Count) { IReference <AspNetCore.ReportingServices.ReportIntermediateFormat.SubReportInstance> reference = scopeInstance.SubreportInstances[instancePathItem.IndexInCollection]; using (reference.PinValue()) { AspNetCore.ReportingServices.ReportIntermediateFormat.SubReportInstance subReportInstance = reference.Value(); subReportInstance.SubReportDef.CurrentSubReportInstance = reference; if (mode != OnDemandMode.InScope && !subReportInstance.Initialized) { if (base.m_odpContext.IsTablixProcessingMode || base.m_odpContext.IsTopLevelSubReportProcessing) { return; } SubReportInitializer.InitializeSubReport(subReportInstance.SubReportDef); reference.PinValue(); } Global.Tracer.Assert(j == num2 - 1, "SubReport not last in instance path."); } } goto default; case InstancePathItemType.DataRegion: if (scopeInstance is AspNetCore.ReportingServices.ReportIntermediateFormat.ReportInstance && (scopeInstance.DataRegionInstances == null || scopeInstance.DataRegionInstances.Count <= instancePathItem.IndexInCollection || scopeInstance.DataRegionInstances[instancePathItem.IndexInCollection] == null || scopeInstance.DataRegionInstances[instancePathItem.IndexInCollection].Value() == null)) { Global.Tracer.Assert(instancePathItem.IndexInCollection < reportDefinition.TopLevelDataRegions.Count, "(newItem.IndexInCollection < m_reportDefinition.TopLevelDataRegions.Count)"); AspNetCore.ReportingServices.ReportIntermediateFormat.DataRegion dataRegion = reportDefinition.TopLevelDataRegions[instancePathItem.IndexInCollection]; AspNetCore.ReportingServices.ReportIntermediateFormat.DataSet dataSet = dataRegion.GetDataSet(reportDefinition); if (mode == OnDemandMode.InScope && this.InScopeCompare(dataSet.Name, scopeName)) { return; } this.PerformOnDemandTablixProcessing(dataSet); } scopeInstance = scopeInstance.DataRegionInstances[instancePathItem.IndexInCollection].Value(); flag = (this.m_inRecursiveColumnHierarchy = false); flag2 = (this.m_inRecursiveRowHierarchy = false); num = -1; dataRegionInstance = (scopeInstance as AspNetCore.ReportingServices.ReportIntermediateFormat.DataRegionInstance); memberHierarchy = dataRegionInstance; if (mode == OnDemandMode.InScope && this.InScopeCompare(dataRegionInstance.DataRegionDef.Name, scopeName)) { return; } if (dataRegionInstance.DataSetIndexInCollection >= 0 && base.m_odpContext.CurrentDataSetIndex != dataRegionInstance.DataSetIndexInCollection && mode != OnDemandMode.InScope) { if (!flag4) { AspNetCore.ReportingServices.ReportIntermediateFormat.DataSetInstance dataSetInstance = base.m_odpContext.CurrentReportInstance.GetDataSetInstance(dataRegionInstance.DataSetIndexInCollection, base.m_odpContext); if (dataSetInstance != null) { dataSetInstance.SetupEnvironment(base.m_odpContext, true); num3 = 0; } } else { num3 = j + 1; } } if (mode != OnDemandMode.InScope) { if (!flag4) { dataRegionInstance.SetupEnvironment(base.m_odpContext); num3 = 0; if (!dataRegionInstance.NoRows) { dataRegionInstance.DataRegionDef.NoRows = false; goto default; } dataRegionInstance.DataRegionDef.NoRows = true; dataRegionInstance.DataRegionDef.ResetTopLevelDynamicMemberInstanceCount(); return; } num3 = j + 1; } goto default; case InstancePathItemType.ColumnMemberInstanceIndexTopMost: scopeInstance = dataRegionInstance; goto default; case InstancePathItemType.Cell: { if (-1 == num) { num = 0; } IList <AspNetCore.ReportingServices.ReportIntermediateFormat.DataCellInstance> cellInstances = memberHierarchy.GetCellInstances(num); if (cellInstances == null) { if (flag2 && flag) { reportObjectModel.ResetFieldValues(); } } else if (cellInstances.Count > instancePathItem.IndexInCollection) { AspNetCore.ReportingServices.ReportIntermediateFormat.DataCellInstance dataCellInstance = cellInstances[instancePathItem.IndexInCollection]; if (dataCellInstance != null) { scopeInstance = dataCellInstance; if (!flag4) { dataCellInstance.SetupEnvironment(base.m_odpContext, base.m_odpContext.CurrentDataSetIndex); num3 = 0; } else { num3 = j + 1; } } } goto default; } default: if (instancePathItem.IsDynamicMember) { IList <DataRegionMemberInstance> childMemberInstances = ((IMemberHierarchy)scopeInstance).GetChildMemberInstances(instancePathItem.Type == InstancePathItemType.RowMemberInstanceIndex, instancePathItem.IndexInCollection); if (childMemberInstances == null) { reportObjectModel.ResetFieldValues(); return; } int num5 = (j != num2 - 1 || moveNextInstanceIndex < 0 || moveNextInstanceIndex >= childMemberInstances.Count) ? ((instancePathItem.InstanceIndex >= 0) ? instancePathItem.InstanceIndex : 0) : moveNextInstanceIndex; if (num5 >= childMemberInstances.Count) { instancePathItem.ResetContext(); num5 = 0; } DataRegionMemberInstance dataRegionMemberInstance = childMemberInstances[num5]; if (mode == OnDemandMode.FullSetup) { dataRegionMemberInstance.MemberDef.InstanceCount = childMemberInstances.Count; dataRegionMemberInstance.MemberDef.CurrentMemberIndex = num5; } scopeInstance = dataRegionMemberInstance; this.m_lastRecursiveLevel = dataRegionMemberInstance.RecursiveLevel; AspNetCore.ReportingServices.ReportIntermediateFormat.ReportHierarchyNode memberDef = dataRegionMemberInstance.MemberDef; if (mode == OnDemandMode.InScope && this.InScopeCompare(memberDef.Grouping.Name, scopeName)) { return; } if (instancePathItem.Type == InstancePathItemType.RowMemberInstanceIndex) { memberHierarchy = dataRegionMemberInstance; flag2 = true; } else { num = dataRegionMemberInstance.MemberInstanceIndexWithinScopeLevel; flag = true; } if (mode == OnDemandMode.FullSetup && !flag4) { dataRegionMemberInstance.SetupEnvironment(base.m_odpContext, base.m_odpContext.CurrentDataSetIndex); num3 = 0; AspNetCore.ReportingServices.ReportIntermediateFormat.Grouping grouping = memberDef.Grouping; if (grouping.Parent != null) { if (memberDef.IsColumn) { this.m_inRecursiveColumnHierarchy = true; } else { this.m_inRecursiveRowHierarchy = true; } if (memberDef.IsTablixMember) { memberDef.SetMemberInstances(childMemberInstances); memberDef.SetRecursiveParentIndex(dataRegionMemberInstance.RecursiveParentIndex); memberDef.SetInstanceHasRecursiveChildren(dataRegionMemberInstance.HasRecursiveChildren); } } else if (memberDef.IsColumn) { this.m_inRecursiveColumnHierarchy = false; } else { this.m_inRecursiveRowHierarchy = false; } grouping.RecursiveLevel = this.m_lastRecursiveLevel; grouping.SetGroupInstanceExpressionValues(dataRegionMemberInstance.GroupExprValues); if (mode == OnDemandMode.FullSetup && grouping != null && grouping.GroupExpressions != null && grouping.GroupExpressions.Count > 0) { AspNetCore.ReportingServices.ReportIntermediateFormat.ExpressionInfo expressionInfo = grouping.GroupExpressions[0]; if (expressionInfo.Type == AspNetCore.ReportingServices.ReportIntermediateFormat.ExpressionInfo.Types.Field) { AspNetCore.ReportingServices.ReportIntermediateFormat.DataSet dataSet2 = memberDef.DataRegionDef.GetDataSet(reportDefinition); AspNetCore.ReportingServices.ReportIntermediateFormat.Field field = dataSet2.Fields[expressionInfo.IntValue]; if (field.DataField != null) { string dataField = field.DataField; object second = dataRegionMemberInstance.GroupExprValues[0]; PairObj <string, object> pairObj = this.m_specialLastGroupingValues[j]; if (pairObj == null) { pairObj = new PairObj <string, object>(dataField, second); this.m_specialLastGroupingValues[j] = pairObj; } else { pairObj.First = dataField; pairObj.Second = second; } } } } } else { num3 = j + 1; } } break; case InstancePathItemType.None: break; } } if (mode == OnDemandMode.FullSetup && !flag3 && scopeInstance != null && num3 > 0) { while (num3 < this.m_lastInstancePath.Count) { if (!this.m_lastInstancePath[num3].IsScope) { num3++; continue; } scopeInstance.SetupFields(base.m_odpContext, base.m_odpContext.CurrentDataSetIndex); break; } } if (mode == OnDemandMode.FullSetup && !base.m_odpContext.IsTablixProcessingMode && base.m_odpContext.CurrentReportInstance != null && dataRegionInstance == null && reportDefinition.DataSetsNotOnlyUsedInParameters == 1) { AspNetCore.ReportingServices.ReportIntermediateFormat.DataSet firstDataSet = reportDefinition.FirstDataSet; AspNetCore.ReportingServices.ReportIntermediateFormat.DataSetInstance dataSetInstance2 = base.m_odpContext.CurrentReportInstance.GetDataSetInstance(firstDataSet, base.m_odpContext); if (dataSetInstance2 != null) { bool flag5 = true; if (!base.m_odpContext.IsTablixProcessingComplete(firstDataSet.IndexInCollection)) { this.PerformOnDemandTablixProcessing(firstDataSet); flag5 = false; } if (base.m_odpContext.CurrentOdpDataSetInstance == dataSetInstance2) { flag5 = false; } if (flag5) { dataSetInstance2.SetupEnvironment(base.m_odpContext, true); } else if (!dataSetInstance2.NoRows) { dataSetInstance2.SetupFields(base.m_odpContext, dataSetInstance2); } } } } } finally { if (needDeepCopyPath) { InstancePathItem.DeepCopyPath(list, ref this.m_lastInstancePath); } } }
public void RetrieveSubreport() { if (this.m_isNewContext) { if (base.m_isOldSnapshot) { AspNetCore.ReportingServices.ReportRendering.SubReport subReport = (AspNetCore.ReportingServices.ReportRendering.SubReport)base.m_renderReportItem; if (subReport.Report != null) { if (this.m_report == null) { this.m_report = new Report(this, base.m_inSubtotal, subReport, base.m_renderingContext); } else { this.m_report.UpdateSubReportContents(this, subReport); } } this.m_noRows = subReport.NoRows; this.m_processedWithError = subReport.ProcessedWithError; } else { AspNetCore.ReportingServices.ReportIntermediateFormat.SubReport subReport2 = (AspNetCore.ReportingServices.ReportIntermediateFormat.SubReport)base.m_reportItemDef; RenderingContext renderingContext = null; try { if (subReport2.ExceededMaxLevel) { this.m_errorCode = SubReportErrorCodes.ExceededMaxRecursionLevel; this.m_errorMessage = RPRes.rsExceededMaxRecursionLevel(subReport2.Name); this.FinalizeErrorMessageAndThrow(); } else { this.CheckRetrievalStatus(subReport2.RetrievalStatus); } if (base.m_renderingContext.InstanceAccessDisallowed) { renderingContext = this.GetOrCreateRenderingContext(subReport2, null); renderingContext.SubReportHasNoInstance = true; } else { base.m_renderingContext.OdpContext.SetupContext(subReport2, base.Instance.ReportScopeInstance); if (subReport2.CurrentSubReportInstance == null) { renderingContext = this.GetOrCreateRenderingContext(subReport2, null); renderingContext.SubReportHasNoInstance = true; } else { AspNetCore.ReportingServices.ReportIntermediateFormat.SubReportInstance subReportInstance = subReport2.CurrentSubReportInstance.Value(); this.m_noRows = subReportInstance.NoRows; this.m_processedWithError = subReportInstance.ProcessedWithError; if (this.m_processedWithError) { this.CheckRetrievalStatus(subReportInstance.RetrievalStatus); } AspNetCore.ReportingServices.ReportIntermediateFormat.ReportInstance reportInstance = subReportInstance.ReportInstance.Value(); renderingContext = this.GetOrCreateRenderingContext(subReport2, reportInstance); renderingContext.OdpContext.LoadExistingSubReportDataChunkNameModifier(subReportInstance); renderingContext.OdpContext.SetSubReportContext(subReportInstance, true); reportInstance.SetupEnvironment(renderingContext.OdpContext); } } } catch (Exception e) { this.m_processedWithError = true; ErrorContext subReportErrorContext = null; if (subReport2.OdpContext != null) { subReportErrorContext = subReport2.OdpContext.ErrorContext; } if (renderingContext == null && this.m_report != null) { renderingContext = this.m_report.RenderingContext; } AspNetCore.ReportingServices.ReportProcessing.ReportProcessing.HandleSubReportProcessingError(base.m_renderingContext.OdpContext.TopLevelContext.ErrorContext, subReport2, subReport2.UniqueName, subReportErrorContext, e); } if (renderingContext != null) { renderingContext.SubReportProcessedWithError = this.m_processedWithError; } } if (this.m_processedWithError) { this.m_noRows = false; if (this.m_errorCode == SubReportErrorCodes.Success) { this.m_errorCode = SubReportErrorCodes.ProcessingError; this.m_errorMessage = RPRes.rsRenderSubreportError; } } this.m_isNewContext = false; } }