7

現在、ビジュアル スタジオの Web サイトに Crystal レポートが埋め込まれています。Web サイトを展開して IIS にインストールし、ユーザーにリンクを提供して、ユーザーがグローバルにアクセスしてこのレポートを表示できるようにします。このシステムはうまく機能しています。

ただし、サブレポートを持つ Crystal レポートを埋め込んだ場合、認証情報がサブレポートに自動的に渡されません。ソリューションをデバッグすると、最初のレポートが正常に開きます。項目をクリックしてサブレポートを開くと、Crystal Report Viewer がデータベースのログイン資格情報を要求します。

Crystal Report Viewer で表示するときにユーザーがコードを入力する必要がないように、これらの資格情報をコードで自動的に渡すにはどうすればよいですか。

以下は、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 Report Viewer の追加のログイン プロンプトと関係があるかどうかは不明です。

どんな助けでも素晴らしいでしょう。前もって感謝します!


編集: Nimesh のソリューションを実装した後

さて、接続された接続タイプを追加しましたが、ビジュアルスタジオは「レポート」に下線を付けて、宣言する前にローカル変数「レポート」を使用できません。

foreach (レポート.Database.Tables の CrystalDecisions.CrystalReports.Engine.Table CrTable)

foreach (レポート.Subreports 内の ReportDocument サブレポート)

レポートを後で新しいcrystalreport1として宣言していることに気付きました。したがって、その宣言を Nimesh コード ブロックの上に移動すると、「レポート」の赤い下線が消えますが、「crtableLogoninfo」の 6 つのインスタンスすべてに赤い下線が引かれ、「名前 '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;
            }
        }
    }
4

4 に答える 4

6

問題は、Crystal Report のログイン情報にあります。レポートを表示する前に、メイン レポートとそのサブ レポートに含まれるすべてのテーブルにログイン情報を設定する必要があります。切断されたデータソース レポートの表示方法を使用しています。そのため、ドキュメントを報告するためにログイン情報を提供する必要はありません。あなたの問題はここにあります。

report.SetDataSource(ds);

SetDataSource メソッドを使用している場合、Crystal Report ドキュメントに含まれるすべてのテーブルを提供する必要があります。ここでは、データセットで 1 つのテーブルのみを渡しました。サブレポート テーブルを含むすべてのテーブルを渡す必要があります。

サブレポートを使用している場合は、接続されていないデータソース (report.SetDataSource()) の場合は代わりに接続されたデータソース メソッドを使用することをお勧めします。Connected datasource では、レポートを表示する前にログイン情報を設定する必要があります。

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 に tablename を設定することを忘れないでください。そうしないと、レポートが表示されません。

于 2014-02-12T03:39:03.587 に答える
0


これを開いてみてくださいField Explorer---> 右クリックDatabase Field---> Current Data Source---> Report Connection---> Report---> Property---> Set Propertyas ---

データ ソース: .\データベース名.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")

また、データ ソースと同じレポート接続を変更します。そのコードはあなたのために働くと思います。

于 2014-12-10T06:58:22.010 に答える