Как запретить программе просмотра Crystal Report запрашивать учетные данные для входа при открытии подотчета

В настоящее время у меня есть кристальный отчет, встроенный в веб-сайт визуальной студии. Я развертываю веб-сайт и устанавливаю его в IIS, а также предоставляю пользователю ссылку, чтобы он мог получить глобальный доступ и просмотреть этот отчет. Эта система отлично работает.

Однако, когда я внедрил кристаллический отчет, у которого есть подотчет, учетные данные не передаются в подотчет автоматически. Когда я отлаживаю решение, начальный отчет открывается нормально, когда я щелкаю элемент, чтобы открыть вложенный отчет, программа просмотра отчетов Crystal запрашивает учетные данные для входа в базу данных.

Как я могу автоматически передавать эти учетные данные в код, чтобы пользователям не приходилось вводить код при просмотре в средстве просмотра отчетов Crystal.

Ниже приведен код, который я использую на своей странице default.aspx.cs. Он содержит строки подключения.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;

namespace CFIBInventory
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            SqlConnection con = new SqlConnection("Data Source=HPL-WTS;Initial Catalog=Enterprise32;Persist Security Info=True;User ID=sa;Password=********");
            DataSet1 ds = new DataSet1();
            SqlDataAdapter adapter = new SqlDataAdapter("SELECT     dbo.Material.MaterialCode, dbo.Material.CategoryCode, dbo.Material.Description, dbo.MaterialOnHand.LocationCode, dbo.Material.ValuationMethod,                       dbo.MaterialOnHand.Quantity FROM         dbo.Material INNER JOIN                      dbo.MaterialOnHand ON dbo.Material.MaterialCode = dbo.MaterialOnHand.MaterialCode WHERE     (dbo.Material.CategoryCode = 'CFIB3') AND (dbo.Material.ValuationMethod = 1) AND (dbo.Material.InactiveFlag = 0)", con);

            adapter.Fill(ds.cfibInventory);
            CrystalReport1 report = new CrystalReport1();
            report.SetDataSource(ds);
            CrystalReportViewer1.ReportSource = report;

            CrystalReportViewer1.ToolPanelView = CrystalDecisions.Web.ToolPanelViewType.None;
        }
    }
}

Средство просмотра отчетов Crystal встроено в мою страницу .aspx с помощью кода ниже:

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
    CodeBehind="Default.aspx.cs" Inherits="CFIBInventory._Default" %>

<%@ Register assembly="CrystalDecisions.Web, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" namespace="CrystalDecisions.Web" tagprefix="CR" %>

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    <p>
    </p>
    <CR:CrystalReportViewer ID="CrystalReportViewer1" runat="server" 
        AutoDataBind="true" />
</asp:Content>

Запрос для подотчета находится в эксперте базы данных подотчетов.

Между прочим, база данных подключается к машине с Windows Server 2005. Я не верю, что у него есть настройки общего доступа, такие как собственный IIS. Предыдущие отчеты, в которых нет подотчетов, устанавливаются на более новый сервер 2012, поскольку именно там находится база данных. Не уверен, что машина имеет какое-либо отношение к дополнительному приглашению для входа в программу просмотра отчетов Crystal.

Любая помощь будет отличной. Заранее спасибо!


РЕДАКТИРОВАТЬ: после реализации решения от Nimesh

Что ж, я добавил подключенный тип соединения, однако Visual Studio подчеркивает «отчет», говоря: «Невозможно использовать локальную переменную «отчет» до ее объявления.

foreach (CrystalDecisions.CrystalReports.Engine.Table CrTable в отчете.Database.Tables)

и

foreach (подотчет ReportDocument в отчете.Subreports)

Я заметил, что ниже я объявляю отчет как новый crystalreport1. Поэтому я перемещаю это объявление над кодовым блоком Nimesh, и красное подчеркивание для «отчета» исчезает, но затем все 6 экземпляров «crtableLogoninfo» подчеркиваются красным с ошибкой: имя «crtableLogoninfo» не существует в текущем контексте».

Любая дальнейшая помощь будет принята с благодарностью.

Ниже показано, как мой код выглядит сейчас:

 using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Data.SqlClient;
    using CrystalDecisions.Shared;
    using CrystalDecisions.CrystalReports.Engine;

    namespace CFIBInventory
    {
        public partial class _Default : System.Web.UI.Page
        {


            protected void Page_Load(object sender, EventArgs e)
            {



                //Nimesh code
                ConnectionInfo crConnectionInfo = new ConnectionInfo();
                crConnectionInfo.ServerName = "HPL-WTS";
                crConnectionInfo.DatabaseName = "Enterprise32";
                crConnectionInfo.UserID = "sa";
                crConnectionInfo.Password = "*********";

                foreach (CrystalDecisions.CrystalReports.Engine.Table CrTable in report.Database.Tables)
                {
                    crTableLogoninfo = CrTable.LogOnInfo;
                    crtableLogoninfo.ConnectionInfo = crConnectionInfo;
                    CrTable.ApplyLogOnInfo(crtableLogoninfo);
                }
                foreach (ReportDocument subreport in report.Subreports)
                {
                    foreach (CrystalDecisions.CrystalReports.Engine.Table CrTable in subreport.Database.Tables)
                    {
                        crtableLogoninfo = CrTable.LogOnInfo;
                        crtableLogoninfo.ConnectionInfo = crConnectionInfo;
                        CrTable.ApplyLogOnInfo(crtableLogoninfo);
                    }
                } // nimesh code end

                //Old connection string, i assume this shouldnt be here since nimesh code is for connecting
                //SqlConnection con = new SqlConnection("Data Source=HPL-WTS;Initial Catalog=Enterprise32;Persist Security Info=True;User ID=sa;Password=123qwerTy987");

                DataSet1 ds = new DataSet1();
                SqlDataAdapter adapter = new SqlDataAdapter("SELECT     dbo.Material.MaterialCode, dbo.Material.CategoryCode, dbo.Material.Description, dbo.MaterialOnHand.LocationCode, dbo.Material.ValuationMethod,                       dbo.MaterialOnHand.Quantity FROM         dbo.Material INNER JOIN                      dbo.MaterialOnHand ON dbo.Material.MaterialCode = dbo.MaterialOnHand.MaterialCode WHERE     (dbo.Material.CategoryCode = 'CFIB3') AND (dbo.Material.ValuationMethod = 1) AND (dbo.Material.InactiveFlag = 0)", con);

                adapter.Fill(ds.cfibInventory);

                CrystalReport1 report = new CrystalReport1();

                 // OLD CODE
                //report.SetDataSource(ds);
                CrystalReportViewer1.ReportSource = report;

                CrystalReportViewer1.ToolPanelView = CrystalDecisions.Web.ToolPanelViewType.None;
            }
        }
    }

person MythRaven    schedule 11.02.2014    source источник


Ответы (4)


Проблема заключается в информации для входа в Crystal Report. перед отображением отчета вы должны установить информацию для входа во все таблицы, которые включены в основной отчет и их подотчеты. Вы используете метод отображения отчета об отключенном источнике данных. поэтому вам не нужно предоставлять информацию для входа в отчетный документ. твоя проблема здесь.

report.SetDataSource(ds);

когда вы используете метод SetDataSource, необходимо предоставить все таблицы, которые включены в документ Crystal Report. здесь вы передали только одну таблицу в наборе данных. вы должны передать все таблицы, включая таблицы подотчетов.

Я предлагаю вам, если вы используете подотчет, использовать метод подключенного источника данных вместо отключенного источника данных (report.SetDataSource()). в подключенном источнике данных вы должны установить информацию для входа перед отображением отчета.

private void PrintReport()
    {

        ReportDocument report = new ReportDocument();
        report.Load("ReportPath");

        ConnectionInfo crConnectionInfo = new ConnectionInfo();
        crConnectionInfo.ServerName = "HPL-WTS";
        crConnectionInfo.DatabaseName = "Enterprise32";
        crConnectionInfo.UserID = "sa";
        crConnectionInfo.Password = "*********";
        TableLogOnInfo crTableLogoninfo = new TableLogOnInfo();

        foreach (CrystalDecisions.CrystalReports.Engine.Table CrTable in report.Database.Tables)
        {
            crTableLogoninfo = CrTable.LogOnInfo;
            crTableLogoninfo.ConnectionInfo = crConnectionInfo;
            CrTable.ApplyLogOnInfo(crTableLogoninfo);
        }
        foreach (ReportDocument subreport in report.Subreports)
        {
            foreach (CrystalDecisions.CrystalReports.Engine.Table CrTable in subreport.Database.Tables)
            {
                crTableLogoninfo = CrTable.LogOnInfo;
                crTableLogoninfo.ConnectionInfo = crConnectionInfo;
                CrTable.ApplyLogOnInfo(crTableLogoninfo);
            }
        }                         

        CrystalReportViewer1.ReportSource = report;

        CrystalReportViewer1.ToolPanelView = CrystalDecisions.Web.ToolPanelViewType.None;
    }

если вы хотите использовать отключенный источник данных, даже если вы не включили подотчет, вы можете использовать одну команду вместо нескольких таблиц. это упростит и даст лучшую производительность. потому что вам просто нужно передать только одну таблицу в метод SetDataSource. но не забудьте установить имя таблицы в DataTable, иначе отчет не будет отображаться.

person Shell    schedule 12.02.2014
comment
Здравствуйте, спасибо за ваше решение. попробую реализовать. Я удалю: report.SetDataSource(ds); и добавлю код, который вы указали выше, заменив свои учетные данные для входа. - person MythRaven; 12.02.2014
comment
Как я могу добавить таблицу, используемую в подотчете, к моему набору данных? Я построил отчет в кристалле, и у меня есть строка запроса в команде subreport › view. - person MythRaven; 12.02.2014
comment
извините, я забыл объявить TableLogOnInfo crTableLogoninfo = new TableLogOnInfo(); я обновил свой код, пожалуйста, посмотрите. здесь вам не нужно использовать SetDataSource(ds), когда вы устанавливаете информацию для входа во все таблицы отчетов. но вы должны предоставить RecordSelectionFormula, если хотите отображать только отфильтрованные записи. например report.RecordSelectionFormula = {TableName1.Field1}=1 And {TableName1.Field2}=2; - person Shell; 13.02.2014

Попробуйте это
открыть Field Explorer ---> щелкните правой кнопкой мыши Database Field ---> Current Data Source ---> Report Connection ---> Report ---> Property ---> Set Property как ---

Источник данных: .\Databasename.accdb

и код в форме просмотра загружается как

Dim cryRpt As New ReportDocument
Dim Report1 As New rptItemWise
Dim strServerName As String
strServerName = Application.StartupPath
rptItemWise.SetDatabaseLogon("admin", "", strServerName, "dastabasename.accdb", True)
cryRpt.Load(Application.StartupPath + "\rptItemWise.rpt")

Также измените подключение отчета так же, как источник данных. Я думаю, что этот код будет работать для вас.

person Shanti Lal Namchuriya    schedule 10.12.2014

Мое решение заключалось в установке средства подключения клиентского инструмента SQL Server 2012 и компонентах обратного подключения клиента с использованием источника установки SQL Server.

person Mostafa Edris    schedule 08.09.2016

У меня тоже была эта ошибка с подотчетами. Важно: мой дизайнер отчетов использовал только одну таблицу в «основном» отчете и одну (другую) таблицу в подотчете. Мое решение:

Dim ds as DataSet
'... Put your code to fectch data
report.SetDataSource(ds)

Dim ds1 as DataSet
'... Put your code to fetch data
Dim dtb = ds1.Tables(0)
dtb.TableName = "Same_name_used_in_report_designer"
report.Subreports(0).SetDataSource(dtb)

Здесь две важные вещи:

  1. Источник данных отчета должен быть DataSet только с 1 DataTable.
  2. Источник данных вложенного отчета должен быть DataTable, а не полным набором данных.

Я не совсем понимаю основы Crystal Reports, поэтому не могу объяснить, почему, но это решило мою проблему.

person RonaldPaguay    schedule 09.09.2016