private List <ReportParameterPackage> GetReportParameterPackages(ReportPackage report, XElement reportDef) { var dataSets = report.ReportDataSets; var xmlns = reportDef.GetDefaultNamespace().ToString(); var reportParams = reportDef.Descendants(XName.Get("ReportParameter", xmlns)); var localReportParams = ReportViewer1.LocalReport.GetParameters(); var reportParameterPkgs = new List <ReportParameterPackage>(); foreach (var reportParam in reportParams) { var reportParamName = reportParam.SafeAttributeValue("Name", ""); // Skip internal hidden parameter "EclipseURL" (Used to link documents) if (reportParamName == Constants.REPORTS_ECLIPSE_URL) { continue; } //TODO: Use the report parameter prompt instead of the name var multiValue = reportParam.Element(XName.Get("MultiValue", xmlns)); var hasMultiValues = false; if (multiValue != null) { Boolean.TryParse(multiValue.Value, out hasMultiValues); } var allowBlank = reportParam.Element(XName.Get("AllowBlank", xmlns)); var hasAllowBlank = false; if (allowBlank != null) { Boolean.TryParse(allowBlank.Value, out hasAllowBlank); } var validValues = reportParam.Descendants(XName.Get("ValidValues", xmlns)); var paramValidValues = new List <ParameterValidValue>(); var hasValidValues = false; String lrpLabel = String.Empty; String lrpValue = String.Empty; var rpPkg = new ReportParameterPackage { Name = reportParamName }; foreach (var validValue in validValues) { hasValidValues = true; var paramValue = validValue.Descendants(XName.Get("ParameterValue", xmlns)); foreach (var param in paramValue) { var vvLabel = param.Element(XName.Get("Label", xmlns)); var vvValue = param.Element(XName.Get("Value", xmlns)); var lblVal = vvLabel == null ? null : vvLabel.Value; GetReportParameters(localReportParams, reportParamName, lblVal, out lrpLabel, out lrpValue); paramValidValues.Add(new ParameterValidValue { Name = reportParamName, Label = lrpLabel, Value = lrpValue }); } } rpPkg.ValidValues = paramValidValues.ToArray(); var defaultValues = reportParam.Descendants(XName.Get("DefaultValue", xmlns)); var paramDefaultValues = new List <String>(); foreach (var defaultValue in defaultValues) { var defParamValues = defaultValue.Descendants(XName.Get("Values", xmlns)); foreach (var defParamValue in defParamValues) { var dvValue = defParamValue.Element(XName.Get("Value", xmlns)); var val = dvValue == null ? null : dvValue.Value; GetReportParameters(localReportParams, reportParamName, val, out lrpLabel, out lrpValue); paramDefaultValues.Add(lrpValue); } } rpPkg.DefaultValues = paramDefaultValues.ToArray(); if (hasValidValues) { var dataSetRefs = reportParam.Descendants(XName.Get("DataSetReference", xmlns)); foreach (var dataSetRef in dataSetRefs) { var fieldValue = dataSetRef.Element(XName.Get("ValueField", xmlns)).Value; var fieldLabel = dataSetRef.Element(XName.Get("LabelField", xmlns)).Value; var dataSetName = dataSetRef.Element(XName.Get("DataSetName", xmlns)).Value; // Obtain the dataset from the reports data sets, matched on name int idx; var dataSetsLen = dataSets.SafeLength(); for (idx = 0; idx < dataSetsLen; idx++) { var queryParams = new Dictionary <String, String>(); if (dataSets[idx].Name == dataSetName) { var sqlQuery = DLUtility.Deserialize <SQLQuery>(dataSets[idx].QueryDefinition); if (sqlQuery.Params.Count == 0) { var args = new GetReportDataArgs { QueryDefinition = dataSets[idx].QueryDefinition }; _sb.SendTimeout = TimeSpan.FromMinutes(30); var dlSvc = _sb.DataLinkV2(); var rdSR = dlSvc.GetReportData(args); ExceptionsML.Check(rdSR.Error); var colLen = rdSR.Result.Columns[fieldLabel].SafeLength(); for (int colIdx = 0; colIdx < colLen; colIdx++) { paramValidValues.Add(new ParameterValidValue { Name = reportParamName, Label = rdSR.Result.Columns[fieldLabel][colIdx], Value = rdSR.Result.Columns[fieldValue][colIdx] ?? String.Empty }); } rpPkg.ValidValues = paramValidValues.ToArray(); } else { rpPkg.Name = reportParamName; rpPkg.ValidValues = new ParameterValidValue[0]; rpPkg.IsTypeAhead = true; rpPkg.DataSetId = dataSets[idx].Id; } } } } rpPkg.IsMultiValued = hasMultiValues; rpPkg.AllowBlank = hasAllowBlank; } else { var type = reportParam.Descendants(XName.Get("DataType", xmlns)); var values = reportParam.Descendants(XName.Get("Value", xmlns)); var vals = GetStandardReportParameters(localReportParams, reportParamName); rpPkg.Values = vals; rpPkg.Type = reportParam.Element(XName.Get("DataType", xmlns)).Value; } rpPkg.ValidValues.Sort <ParameterValidValue>((a, b) => a.Label.CompareTo(b.Label)); reportParameterPkgs.Add(rpPkg); } return(reportParameterPkgs); }
private void LoadReportData(ReportPackage report, Dictionary <String, String> parameters, XElement reportDef, ServiceBuilder sb) { try { var reportParams = ReportViewer1.LocalReport.GetParameters(); sb.SendTimeout = TimeSpan.FromMinutes(30); var dlSvc = sb.DataLinkV2(); var newParams = new Dictionary <String, String>(); var xmlns = reportDef.GetDefaultNamespace().ToString(); var rd = reportDef.GetNamespaceOfPrefix("rd").ToString(); var dataSets = reportDef.Descendants(XName.Get("DataSet", xmlns)); if (dataSets == null) { throw new Exception("DataSet not found in report"); //We control writing this, so we should never see this occur. } foreach (var dataSet in dataSets) { var dsName = dataSet.SafeAttributeValue <String>("Name", Constants.ECLIPSE_DATASOURCE); var rds = report.ReportDataSets.FirstOrDefault(r => r.Name == dsName); var dlSR = dlSvc.GetReportData(new GetReportDataArgs { Parameters = parameters, QueryDefinition = rds.QueryDefinition }); ExceptionsML.Check(dlSR.Error); newParams.AddRange(dlSR.Result.Parameters); var dt = new DataTable(dsName); var fields = dataSet.Descendants(XName.Get("Field", xmlns)); if (fields != null) { foreach (var field in fields) { var fieldName = field.Element(XName.Get("DataField", xmlns)).Value; var fieldType = field.Element(XName.Get("TypeName", rd)).Value; dt.Columns.Add(new DataColumn(fieldName, Converter.GetType(fieldType))); } if (dlSR.Result != null) { dlSR.Result.FillDataTable(dt); } } var rptData = new ReportDataSource(dsName, dt); ReportViewer1.LocalReport.DataSources.Add(rptData); } // Set the parameters for the report var length = reportParams == null ? 0 : reportParams.Count; var setParams = new ReportParameter[length]; var eclipseURL = String.Format("{0}://{1}:{2}{3}", Request.IsSecureConnection ? "https" : "http", Request.ServerVariables["SERVER_NAME"], Request.ServerVariables["SERVER_PORT"], Request.ApplicationPath); var idx = 0; foreach (var param in reportParams) { // Add a hardcoded EclipseURL parameter so the report can use it to navigate documents var name = param.Name; var newParamsName = "@" + name; if (name == Constants.REPORTS_ECLIPSE_URL) { setParams[idx] = new ReportParameter(name, eclipseURL); } else if (newParams.ContainsKey(newParamsName)) // newParams names begin with "@", where as name does not { setParams[idx] = new ReportParameter(name, newParams[newParamsName]); } else { setParams[idx] = new ReportParameter(name); } idx++; } setParams = setParams.RemoveNulls(); // Prevents setting null parameters (ones' that have been deleted) ReportViewer1.LocalReport.SetParameters(setParams); } catch (LocalProcessingException lex) { ErrorHandler(lex.InnerMost()); } catch (Exception ex) { ErrorHandler(ex); } }