Пример #1
0
        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);
        }
Пример #2
0
        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);
            }
        }