В настоящее время у меня есть кристальный отчет, встроенный в веб-сайт визуальной студии. Я развертываю веб-сайт и устанавливаю его в 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;
}
}
}