SQL Reporting Services报告仅在第二次单击时加载

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL Reporting Services报告仅在第二次单击时加载相关的知识,希望对你有一定的参考价值。

我有一个本地的.rdlc报告,可以点击按钮显示,但由于某种原因,报告只显示第二个按钮点击事件。我不知道为什么报告没有显示在第一个按钮单击...这是我调用按钮的单击事件的功能。

private void ShowReport(string accountingCompanyId, string companyId, string approvalUnitId, DateTime startDate, DateTime finishDate, string supplierId,
                    string documentNumber, string documentType, string documentState, string costCenterId, string chargingKeyId,
                    string dim1Value, string dim1Description, string dim1Id, string dim2Value, string dim2Description, string dim2Id,
                    string dim3Value, string dim3Description, string dim3Id, bool showDetails) {

        //this.ReportViewer1.Reset();

        //Set report mode for local processing.
        this.ReportViewer1.ProcessingMode = ProcessingMode.Local;

        ISettingsReader settingsReader = SettingsReaderFactory.Instance.CreateSettingsReader();
        this.ReportViewer1.LocalReport.ReportPath = settingsReader.GetSetting("ReportViewer", "FinancialReportPath" + (showDetails ? "" : "Small"), true, null);

        ReportsBL reports = new ReportsBL();

        // Clear out any previous datasources.
        this.ReportViewer1.LocalReport.DataSources.Clear();

        // Load the company dataSource.
        DataTable company = reports.GetCompanyDataSet(accountingCompanyId).Tables[0];
        ReportDataSource dataSourceCompany = new ReportDataSource(company.TableName, company);
        this.ReportViewer1.LocalReport.DataSources.Add(dataSourceCompany);

        // Load the dataSource.
        DataTable report = reports.GetReportFinanceiroSmallDataSet(companyId, startDate, finishDate, chargingKeyId, costCenterId, documentNumber, documentType, dim1Value, dim2Value, dim3Value, dim1Id, dim2Id, dim3Id, supplierId, approvalUnitId, documentState, accountingCompanyId).Tables[0];
        ReportDataSource dataSourceReport = new ReportDataSource(report.TableName, report);
        this.ReportViewer1.LocalReport.DataSources.Add(dataSourceReport);

        this.ReportViewer1.LocalReport.Refresh();

        this.pnlReport.Visible = true;
    }

奇怪的是,如果我取消注释this.ReportViewer.Reset();然后,无论我生成的点击次数如何,报告都不会显示...有人知道这是否正常?如何解决这个问题呢?提前致谢,

答案

我想问题可能是在呈现页面后触发了click事件。尝试在Page_Load事件中调用该方法。

protected void Page_Load(object sender, EventArgs e)
{
    if (IsCallback)
    {
        ShowReport(
            // params
        );
    }
}

如果可行,您知道它与执行顺序有关。

另一答案

我从来没有调用过ReportViewer.DataBind();以下是我通常做的事情:

IEnumerable<ReportClass> ds = DataTranslator.GetReportData(Int64.Parse(<someId>));
report.LocalReport.ReportPath = "<some_path_to_report.rdlc>";
report.LocalReport.DataSources.Add(new ReportDataSource("DataSet", ds));
report.Visible = true;
report.LocalReport.Refresh();
另一答案

经过大量的反复试验,我通过在pageload事件上调用databind()方法来实现它。页面加载数据绑定(没有设置数据源)后,后续按钮单击开始按预期工作。

我包含了代码以防其他人遇到此错误。 (很想知道为什么我需要在页面加载中进行数据绑定...)

更新2

我终于找到了问题...原来.rdlc是从旧的2005.rdl报告中迁移出来的,并且新的.rdlc包含旧的报告参数+ sql,它在某种程度上搞乱了报告的加载。我删除了未使用的报告参数+ sql后,一切都开始正常工作......我已经更新了下面的代码,以反映我现在在项目中使用的内容......

protected void Page_Load(object sender, System.EventArgs e) {

}

protected void btGenStats_Click(object sender, System.EventArgs e) {

    ...

    this.ShowReport(accountingCompanyId, companyId, approvalUnitId, startDate, finishDate, supplierId, documentNumber, documentType, documentState,
                    costCenterId, chargingKeyId, dim1, dim1Desc, dim1Id, dim2, dim2Desc, dim2Id, dim3, dim3Desc, dim3Id, showDetails);
}

private void ShowReport(string accountingCompanyId, string companyId, string approvalUnitId, DateTime startDate, DateTime finishDate, string supplierId, string documentNumber, string documentType, string documentState, string costCenterId, string chargingKeyId, string dim1Value, string dim1Description, string dim1Id, string dim2Value, string dim2Description, string dim2Id, string dim3Value, string dim3Description, string dim3Id, bool showDetails) {

    this.ReportViewer1.Reset();

    //Set report mode for local processing.
    this.ReportViewer1.ProcessingMode = ProcessingMode.Local;

    ISettingsReader settingsReader = SettingsReaderFactory.Instance.CreateSettingsReader();
    string reportPath = settingsReader.GetSetting("ReportViewer", "FinancialReportPath"+( showDetails? "" : "Small" ), true, null);
    this.ReportViewer1.LocalReport.ReportPath = Server.MapPath(reportPath);

    ReportsBL reports = new ReportsBL();

    // Clear out any previous datasources.
    this.ReportViewer1.LocalReport.DataSources.Clear();

    // Load the company dataSource.
    DataTable company = reports.GetCompanyDataSet(accountingCompanyId).Tables[0];
    ReportDataSource dataSourceCompany = new ReportDataSource(company.TableName, company);
    this.ReportViewer1.LocalReport.DataSources.Add(dataSourceCompany);

    if (showDetails)
    {
        // Load the dataSource.
        DataTable report = reports.GetReportFinanceiroDataSet(companyId, approvalUnitId, startDate, finishDate, chargingKeyId, costCenterId, documentNumber, documentType, dim1Value, dim2Value, dim3Value, dim1Id, dim2Id, dim3Id, supplierId, documentState, accountingCompanyId).Tables[0];
        ReportDataSource dataSourceReport = new ReportDataSource(report.TableName, report);
        this.ReportViewer1.LocalReport.DataSources.Add(dataSourceReport);
    }
    else
    {
        // Load the dataSource.
        DataTable report = reports.GetReportFinanceiroSmallDataSet(companyId, approvalUnitId, startDate, finishDate, chargingKeyId, costCenterId, documentNumber, documentType, dim1Value, dim2Value, dim3Value, dim1Id, dim2Id, dim3Id, supplierId, documentState, accountingCompanyId).Tables[0];
        ReportDataSource dataSourceReport = new ReportDataSource(report.TableName, report);
        this.ReportViewer1.LocalReport.DataSources.Add(dataSourceReport);
    }

    this.pnlReport.Visible = true;
}
另一答案

试试这段代码:

  protected void btnSubmit_Click(object sender, EventArgs e)
        {
            string pstrType;
            pstrType = Request.QueryString["Type"];           
            LoadReport();
        }

        public class CustomReportCredentials : Microsoft.Reporting.WebForms.IReportServerCredentials
        {
            // local variable for network credential.
            private string _UserName;
            private string _PassWord;
            private string _DomainName;
            public CustomReportCredentials(string UserName, string PassWord, string DomainName)
            {
                _UserName = UserName;
                _PassWord = PassWord;
                _DomainName = DomainName;
            }
            public System.Security.Principal.WindowsIdentity ImpersonationUser
            {
                get
                {
                    return null;  // not use ImpersonationUser
                }
            }
            public System.Net.ICredentials NetworkCredentials
            {
                get
                {
                    // use NetworkCredentials
                    return new NetworkCredential(_UserName, _PassWord, _DomainName);
                }
            }
            public bool GetFormsCredentials(out Cookie authCookie, out string user, out string password, out string authority)
            {
                // not use FormsCredentials unless you have implements a custom autentication.
                authCookie = null;
                user = password = authority = null;
                return false;
            }
        }

        void LoadReport()
        {
            string strCompanyName = objSession.SelCompanyName;
            string strHeading = "";
            string strBranchName = objSession.SelBranchName;
            rptvwMain.ProcessingMode = ProcessingMode.Remote;
            rptvwMain.ServerReport.ReportServerCredentials = new CustomReportCredentials(AppConfig.ReportServerUserName, AppConfig.ReportServerPassword, AppConfig.ReportServerDomain);
            string strReportServerUrl = AppConfig.ReportServerUrl + AppConfig.ReportServerFolder;
            rptvwMain.ServerReport.ReportServerUrl = new Uri(strReportServerUrl);
            List<ReportParameter> parameters = new List<ReportParameter>();
    if (pstrType == "OB")
            {
                strHeading = "Ledger Opening Balance";
                rptvwMain.ServerReport.ReportPath = "/Account/OpeningBalance";
            }


            parameters.Add(new ReportParameter("FyId", Convert.ToInt16(objSession.FyId).ToString()));
            parameters.Add(new ReportParameter("AccountGroupId", cmbAccountGroup.SelectedValue));
            parameters.Add(new ReportParameter("LedgerId", cmbLedgerId.SelectedValue));
            parameters.Add(new ReportParameter("BranchId", Convert.ToInt64(objSession.BranchId).ToString()));
            parameters.Add(new ReportParameter("StDate", Convert.ToDateTime(RadDtpFromDate.SelectedDate).ToString()));
            parameters.Add(new ReportParameter("EnDate", Convert.ToDateTime(RadDtpToDate.SelectedDate).ToString()));
            parameters.Add(new ReportParameter("CompanyName", strCompanyName.ToString()));
            parameters.Add(new ReportParameter("BranchName", strBranchName.ToString()));
            parameters.Add(new ReportParameter("Heading",strHeading.ToString()));
            rptvwMain.ServerReport.SetParameters(parameters);

            rptvwMain.ServerReport.SetDataSourceCredentials(new[] { new DataSourceCredentials() { Name =AppConfig.ReportServerDataSource , UserId = AppConfig.ReportServerDSUserName, Password = AppConfig.ReportServerDSPassword } });
            rptvwMain.ShowZoomControl = true;
            rptvwMain.ServerReport.Refresh();
        }
    }

以上是关于SQL Reporting Services报告仅在第二次单击时加载的主要内容,如果未能解决你的问题,请参考以下文章

在生产箱上部署 Sql Server Reporting Services 报告

SQL Server Reporting Services 报告在使用 IP 地址时提示我输入凭据

解密数据以用于 SQL Reporting Services 2008

Reporting Services SQL Server 2005 文件共享错误

如何在 SQL Server Reporting Services 2008 中复制报表

在 SQL / Reporting Services 中使用参数限制用户访问