0

私はまだ C# とレポートに慣れていません。小さな一歩を踏み出すために、1 つのテーブルを使用する Crystal Report から始めました。

最終的に私はそれを理解し、見事に機能しました。

次に、レポートに別のテーブルを追加しました。コードは何も変更していません。2 番目のテーブルのフィールドをレポートに追加すると、レポートが空白になります。

そのフィールドを再度削除すると (2 番目のテーブルの列がレポートに表示されなくなります)、レポートは再びデータを生成します。

ということで、問題はレポート側にあるという印象を受けます。しかし、とにかくコードを含めました:

private void Load_Ord_Rep()
{
    using (MySqlConnection conn = new MySqlConnection(OTW.Properties.Settings.Default.wcdbConnectionString))
    {
        conn.Open();

        String sql = "SELECT * FROM wcdb.order_table, wcdb.mat_table WHERE order_no = '13661' and order_table.mat_code = mat_table.mat_code";

        using (MySqlCommand cmdSel = new MySqlCommand(sql, conn))
        {

            DataSet ds = new DataSet();
            MySqlDataAdapter da = new MySqlDataAdapter(cmdSel);

            da.Fill(ds);

            ReportDocument rpt = new ReportDocument();
            rpt.Load("C:\\Visual Studio 2008\\Projects\\OTW\\OTW\\CrystalReport3.rpt");

            dataView1.Table = ds.Tables[0];
            rpt.SetDataSource(dataView1);


            crystalReportViewer1.ReportSource = rpt;
            crystalReportViewer1.Refresh();
        }
        conn.Close();
    } 
}

さらに調査した結果、問題はコードやリンクではなく、2 番目のテーブルの読み込みにあるという結論に達しました。値が等しいかそれ以上の外部結合を行いました。レポートには、最初のテーブルの結果のみが表示されます。したがって、2 番目のテーブルの値が読み取られないため、2 つのテーブル間で結合を確立できず、レポートにデータがありません。ここで質問です: Crystal Report が 2 番目のテーブルを読み取らないのはなぜですか!?

アップデート

メイン レポートから 2 番目のテーブルを削除し、データを含むサブレポートを追加しました。前と同じ結果。sup レポートに空白が表示されます。sup レポートを単独で (メイン レポートとして) 実行すると、正しく入力されました。MySQL を使用していますが、データベースの問題でしょうか?

アップデート

新しいアプリを作成しました。今回は (ADO.NET ではなく) ODBC を使用してレポートをデータベースに接続しました。そして、それは完璧に機能しました。私のプログラム全体がそれに基づいているため、ADO.Netが機能しない理由を理解する必要があります。

4

2 に答える 2

0

データセット/データビューで行っているコードを実行する必要はありません。レポートがデータを「プル」できるようにすることをお勧めします (現在、データをレポートに「プッシュ」しています)。

データをプルするには、次のもののみが必要です。

ReportDocument rpt = new ReportDocument(); 
rpt.Load("C:\\Visual Studio 2008\\Projects\\OTW\\OTW\\CrystalReport3.rpt"); 

rpt.SetDataBaseLogon("userName", "password", "servername", "database"); 

crystalReportViewer1.ReportSource = rpt; 

これにより、レポートのデザイン中に追加したテーブルにマップする方法がわからないデータビューを渡すことで、レポートを混乱させるリスクが軽減されます。(99.999% 確実に今起こっていることです。)

上記のコードに欠けているのは、設定が必要なパラメータがある場合のパラメータだけです。その注文番号などでフィルタリングしたかったので、データを「プッシュ」しようとしているように見えますか? その場合は、レポート内に「レコード選択式」を追加し、その式の「場所」の側面を Crystal Report パラメータに基づいて、提供したコードに rpt.SetParameter(arguments) 行を追加します。

いいえ、これはライセンスの制約ではありません。私はそれを確信しています。

成功したトラブルシューティング パス:

1) 簡単なコードを使用してレポートをロードしました: * エラーはありませんが、レポートにデータはありません

2) レポートの結合オプションを試してみました: * テーブルが 1 つしかない場合でも、レポートが空白になりました * 2 番目のテーブルがデータを読み取っていないことが懸念されます

3) 行が返されるのを制限/防止する可能性のある「レコード選択式」によるレコードのフィルタリングをチェックしました * この場合、該当しませんでした

4) 結合がどのように行われていたかを分析しました: [「おそらく、あなたが結合している方法です。たとえば、2 番目のテーブルに右外部結合を実行し、データがない場合、最初のテーブルの行でさえ戻ってきません。 "]

  • 「orders」テーブルのプライマリ ID フィールド (mat_code) が、2 番目のテーブル「material」の同じフィールド (mat_code) に結合されました。これは問題ないようでした。
  • リンク タイプが ">=" である左外部結合を試みました。レポートは、データを含む最初のテーブル (注文) を出力しました。しかし、まだ2 番目のテーブルの (マテリアル) データはありません。
  • 新しいレポートを作成しました。今回は最初に「2 番目」のテーブル (材料) を追加し、次に 1 番目 (注文) を追加しました。今回は外部結合で、マテリアル テーブルのみにデータが表示されます。つまり、最初のテーブルまたはプライマリ テーブルのデータをプルするように見え、その後停止します。

5) 2 番目のテーブルのデータをサブレポートに入れ、サブレポートを同じ「mat_code」フィールドにリンクすることで、そのデータを読み込もうとしました。

(役立つチュートリアル: http://vb.net-informations.com/crystal-report/vb.net_crystal_report_subreport.htm )

  • サブレポートにも空白が表示されます。メイン レポートのみが機能します。サブレポートに存在するテーブルはすべて入力されていません。
  • 提案された単純なコードを使用してもデータは表示されず、元のコードでは最初のテーブルのデータが表示されます

6) テーブルの接続と定義、およびレポートに送信または読み込まれる実際のデータ構造/コンテンツとの間の不一致を確認します。特定のテストが提案されました。次の場所に移動します: i) 「データベースの場所の設定」 (レポートのテーブルを管理する場所) ii) XML/DataSet が使用されたか、OLEDB が使用されたかを確認します iii) データベース テーブルの場所を同じテーブル、ただし OLEDB 接続タイプ (すべてのテーブルで繰り返します)

  • 上記を試みたとき、「更新」ボタンがヒットされたとき、画面はほんの一瞬ちらつきましたが、メッセージは表示されませんでした。レポートを再度テストした後も、動作に変化はありません。彼は ADO.NET を使用してデータに接続していました。

7) データ テーブルの定義と接続の種類が非常に疑わしい。次のテストを提案しました: i) 単純なテスト コードのみを使用して、まったく新しい 1 ページのアプリケーションを作成します。ii) 最初からOLEDBを使用して、'orders' テーブルと 'materials' テーブルのみで新しいレポートを作成するiii) メイン テーブルから mat_code フィールドのみをレポートに追加する iv) mat_code にリンクされた 'materials' のサブレポートを追加する v ) サブレポートに mat_code のみを表示する vi) アプリを実行する

データが示す場合、問題は次のいずれかです。

回答 1: データベース定義 (レポートが最初に作成され、ADO.NET 経由でテーブルに接続されたときに読み取られたもの) と、後でレポートをロードしたときに見つかった実際のデータ テーブル/列定義 (つまり、誰かが列の定義やフィールド数などを変更するための「materials」テーブル)

回答 2: ADO.NET データをレポートにプッシュするために必要な Crystal Reports と Windows ドライバーの特定の組み合わせに問題がある可能性があります。OLEDB でプル データ モデルを使用すると、何らかの問題を回避できる可能性があります。これらの問題は、最新の Crystal Reports および/または Windows ドライバー (つまり、ホットフィックスまたは Windows アップデート、ドライバー パックなど) で対処できる場合があります。

  • テストはうまくいきました。サブレポートを作成しなくても。想定どおりにデータが取り込まれました。
于 2012-04-18T03:30:14.213 に答える
0

Crystal レポートで 2 つのテーブル間のリンクを確認します。期待通りですか?

で確認してください

フィールド エクスプローラー > データベース フィールド > (右クリック) データベース エキスパート > (タブを参照) リンク

于 2012-04-17T15:22:02.143 に答える