none
クリスタルレポートの式フィールドの構文について RRS feed

  • 質問

  • クリスタルレポートのレイアウトでご教授下さい
    VS2010PROとバンドル版を使っています

    mdbファイルのテーブルにはない項目をクリスタルレポートに取り込もうと思っております
    クリスタルレポート内で、式フィールドの名前をABCとして、BASIC構文で作成したいと思います

    内容は以下になります
    フォームのラジオボタン1をチェックしたら、クリスタルレポートのフィールド内にラジオボタン1のテキスト名を表示させる
    ラジオボタン1がチェックされていなければ以下を行います
    フォームのラジオボタン2をチェックしたら、クリスタルレポートのフィールド内にラジオボタン2のテキスト名を表示させる
    ラジオボタン2がチェックされていなければ以下を行います
    フォームのラジオボタン3をチェックしたら、クリスタルレポートのフィールド内にラジオボタン3のテキスト名を表示させる

    If RadioButton1.Checked = True Then
    {ABC} = RadioButton1.Text

    ElseIf RadioButton2.Checked = True Then
    {ABC} = RadioButton2.Text

    ElseIf RadioButton3.Checked = True Then
    {ABC} = RadioButton3.Text

    End If

    保存しようとした所RadioButton1の所で止まり、
    ここには数値、通貨記号、論理値、日付、時刻、日時、文字列が入りますと表示され、保存できません。

    ご教授の程宜しくお願い致します


    • 編集済み kix7 2013年1月17日 1:13
    2013年1月17日 1:10

回答

  • Hoshinaです
    こんにちは

    私の名前がでてきましたので,大急ぎで投稿します。
    私がこの作業を担当するとした場合,レコードのフィールドに印刷枚数を含めるようにはしないと思います。

    つまり,
    ・敬称のデフォルト値を '様' As Keisyou としたselect文を用意し,
    ・検索後に「様」を変更したいレコードだけ,別の文字に変更する
    ・枚数は必要な数だけ同じレコードのコピーをDataTableに追加する

    このようにすると思います。

    これは,こうした方が帳票設計が簡単になると考えるからです。

    概念的な説明にとどめています。
    できるだけ試行錯誤されたほうが,間違いなく身に付きますよ。

    それでは


    • 編集済み Hoshina 2013年1月18日 1:51 「てにをは」を修正
    • 回答としてマーク kix7 2013年1月19日 7:36
    2013年1月18日 1:50

すべての返信

  • クリスタルレポートからWindowsフォームのコントロールを参照することはできません。オブジェクトが他のオブジェクトを参照するには、何らかの結びつきが必要になります(staticなクラスは別ですが・・・)。この辺りはオブジェクト指向プログラミングとして基本的な感覚として持っていただきたいと思います。

    さて、ではどうすれば良いかといいますと、ラジオボタンそのものはクリスタルレポートに渡せませんので、ラジオボタンのTextプロパティを、パラメータとしてクリスタルレポートに渡してあげれば良いでしょう。
    クリスタルレポートにパラメータを渡し、それをパラメータフィールドとして利用する方法はご存知ですか?


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2013年1月17日 1:22
    モデレータ
  • trapemiya様

    ご回答ありがとうございます。

    >ラジオボタンのTextプロパティを、パラメータとしてクリスタルレポートに渡してあげれば良いでしょう。クリスタルレポートにパラメータを渡し、それをパラメータフィールドとして利用する方法はご存知ですか?

    申し訳ありません。良くわかっておりません。

    2013年1月17日 1:51
  • 以下などを参考にしてみて下さい。

    [C#,VS2010]CrystalReportsで帳票レイアウト側にパラメータを渡す
    http://nanoappli.com/blog/archives/1768

    Crystal Reports クリスタルレポートへコンボボックスから値を渡す
    http://d.hatena.ne.jp/oira3ryu/20120115/1326628963


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2013年1月17日 2:25
    モデレータ
  • trapemiya様 

    ありがとうございます。パラメータを設定する際に{テーブル名.フィールド名}={パラメータ名}で式を設定しますが

    mdbファイルのテーブルにはない項目をクリスタルレポートに引き渡す事になるのですが、テーブル名とフィールド名は

    どのようにすればよいでしょうか?mdbファイルのテーブルに追加する事が出来ないのです

    また選択されたラジオボタン1から3のいずれかのテキスト名を渡すにはどうすればよいでしょうか?

    ご教授の程宜しくお願いします

    2013年1月17日 3:46
  • パラメータの意味を取り違えらえれているように思います。私が言っているのはパラメータフィールドで、クリスタルレポートで印字されるフィールドのことを言っています。
    上記のリンク先にあるように、クリスタルレポートにおいてパラメータフィールドを新たに作成してレポートに配置し、そのパラメータフィールドに外部から値を与えれば、その値を印刷することができます。パラメータフィールドに値を与えるのは先に示したリンク先が参考になると思いますが、以下のようになります。

    var rpt = new レポート名();
    rpt.SetDataSource(データテーブル名);
    rpt.SetParameterValue("パラメータフィールド名", "クリスタルレポートに渡す値");
    this.crystalReportViewer1.ReportSource = rpt;

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/


    2013年1月17日 5:18
    モデレータ
  • trapemiya様

    ありがとうございます。以下の様にしました

             'report定義

            Dim report As ReportClass = Form4.CrystalReportViewer1.ReportSource
             report.SetDataSource(dt)
            report.SetParameterValue("param", "テスト")

    二点質問があります。

    1.実施すると COMExceptionはハンドルされませんでした。インデックスが無効です。 (HRESULT からの例外: 0x8002000B (DISP_E_BADINDEX)) と表示されます

    2.クリスタルレポートに渡す値ですが、選択されたラジオボタン1から3のいずれかのテキスト名の入力方法は

    どうすればよいでしょうか?

    初歩的な質問で恐縮ですが、宜しくお願いします。



    • 編集済み kix7 2013年1月17日 6:32
    2013年1月17日 6:29
  • 1.については、パラメーターフィールドの名前がparamになっているか確かめてみて下さい。

    2.については、難しく考えられることはなく、

    report.SetParameterValue("param", "テスト")

    "テスト"のところに、択されたラジオボタン1から3のいずれかのテキスト名をセットするだけですが、どこら辺りでつまづかれているのでしょうか?

    とりあえず、今回のパターンは全レコードに同じ選択されたラジオボタン1から3のいずれかのテキスト名が入るようになっていますが、クリスタルレポートのパラメータに慣れるために、一度それで試されるとよいと思います。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2013年1月17日 10:13
    モデレータ
  • trapemiya様

    回答ありがとうございます

    パラメータ名はparamになっています

    テストの所に、ラジオボタンのテキスト名である 殿 を入れています。

    デバッグすると、COMExceptionはハンドルされませんでした。インデックスが無効です。 (HRESULT からの例外: 0x8002000B (DISP_E_BADINDEX)) と表示されます 。

    初歩的な質問で恐縮ですが、宜しくお願いします

    2013年1月18日 0:32
  • Hoshinaです
    こんにちは

    横から口をはさむことになりますが,SQL文のselectでデフォルト値をもつフィールドを作ってしまう方が統一感があるかもしれません。

    画面上の枚数 As TotalPages, ’画面上の敬称’ As Keisyou

    このような部分をselect文に追加して,データ検索の結果に含めてしまうという方法です。
    TotalPagesフィールドには枚数が格納されており,Keisyouフィールドには敬称用の文字列が格納されているものとして,帳票の設計を行います。

    この方法ですと,枚数や敬称がそれぞればらばらの場合にも対応できると思います。

    方向違いでしたら,ごめんなさい

    2013年1月18日 0:34
  • 以前のスレッドの続きだと思います。

    ところで、敬称は、すべてのあて先で同じなのでしょうか。それとも、宛先ごとに変えるのでしょうか。

    すべての宛先で同じであれば、trapemiyaさんの書かれている方法でいいと思います。しかし、以前のスレッドでは、ラベルに印刷する回数を、宛先ごとに変えたいように思われます。同じように、宛先ごとに敬称を変えるのであれば、この方法では難儀します。

    CrystalReports に mdb を参照させているということですが、CrystalReports が直接 mdb ファイルを操作しているとは思えません。いったん VB のコードで DataSet、DataTable に受けて、それを設定しているはずです。trapemiyaさんのコードでは、「rpt.SetDataSource(データテーブル名);」のところです。この「データテーブル名」がさしているデータテーブルを編集し、敬称の列を追加、ラジオボタンで選択した内容に変更します。回数は、その回数だけデータを複製します。


    Jitta@わんくま同盟

    2013年1月18日 0:39
  • Jitta様

    回答ありがとうございます。

    宛先ごとに敬称を変更する必要があります。その場合ですと、どのようにすればよいでしょうか?


    2013年1月18日 1:08
  • Jitta様

    回答ありがとうございます。

    宛先ごとに敬称を変更する必要があります。その場合ですと、どのようにすればよいでしょうか?


    オフトピ:私は「様」で呼ばれるの、いやなんですよね。私は、「いつか一緒に働くことになるかもしれない」と思って、そのときに自分が楽をできるように、知っていることを伝えたり、調べたりしています。同僚のように考えています。まぁ、「教えてやっているんだ」と考えている人もいるので、難しいんですけどね。

    閑話休題

     Hoshinaさんが書かれているようにします。そう思いながら明確に書いていないのは、「クリスタルレポートに mdb を指定しています」という書き方です。クリスタルレポート&データベースを触っていたのは2005年位までなので忘れてしまっていますが、ビジュアル エディタで指定できるんですよね、確か。で、そのようにして実装していると思います。そのときにどうやってやるんだったか、思い出せないからです。申し訳ない。


    Jitta@わんくま同盟

    2013年1月18日 1:38
  • Hoshinaです
    こんにちは

    私の名前がでてきましたので,大急ぎで投稿します。
    私がこの作業を担当するとした場合,レコードのフィールドに印刷枚数を含めるようにはしないと思います。

    つまり,
    ・敬称のデフォルト値を '様' As Keisyou としたselect文を用意し,
    ・検索後に「様」を変更したいレコードだけ,別の文字に変更する
    ・枚数は必要な数だけ同じレコードのコピーをDataTableに追加する

    このようにすると思います。

    これは,こうした方が帳票設計が簡単になると考えるからです。

    概念的な説明にとどめています。
    できるだけ試行錯誤されたほうが,間違いなく身に付きますよ。

    それでは


    • 編集済み Hoshina 2013年1月18日 1:51 「てにをは」を修正
    • 回答としてマーク kix7 2013年1月19日 7:36
    2013年1月18日 1:50
  • Hoshina様

    ありがとうございます。返信遅れてすみません。select文で構成しています。                              印刷枚数と敬称区分についてはmdbファイルのテーブルにありませんので、以下のように構成しています

    'データテーブルに印刷枚数を保持する列
      Command.CommandText = "select 郵便番号,住所1,住所2,得意先コード,得意先名,0 as 印刷枚数 from 得意先T where 得意先コード = @得意先コード "

    '敬称区分
            Dim b As DataColumn = dt.Columns.Item("敬称区分")
            If b Is Nothing Then
                dt.Columns.Add("敬称区分", GetType(String))
            End If

    データテーブルに含めて、それをデータグリッドビューで表示しています。宛先ごとに異なる敬称が表示され、印刷枚数も異なります。

    ご教授の程お願い致します

    2013年1月18日 1:55
  • jittaさん

    大変失礼しました。今後は さん とします。

    回答頂く際に気を付けます。丁寧で的確な回答ありがとうございました

    2013年1月18日 1:58
  • 基本的に以下と同じだと思うのですが、どこでつまずかれていますか? 以下の内容に沿えば、クリスタルレポート側では何もすることはありません。ただ、与えられたデータを印刷するだけになります。

    テキストボックスの値をデータテーブルに取り込みたい
    http://social.msdn.microsoft.com/Forums/ja-JP/vbgeneralja/thread/d99c7289-a4f1-4abb-a268-c694130b27df/#d99c7289-a4f1-4abb-a268-c694130b27df

    #スレッドタイトルと内容が異なって来ていますので、問題を整理して、つまずかれているところをスレッドタイトルとし新たにスレッドを立てることをお勧めします。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2013年1月18日 5:36
    モデレータ
  • Hoshinaです
    こんにちは

    二つ前の私の投稿をごらんください。

    ただし,何点か注意を。
    ・私は途中から口出ししたもので,trapemiyaさんの方法とはずれがあると思います
    ・異なる印刷枚数,異なる敬称を使用することは,私が投稿した方法でも可能と思います
    ・印刷枚数をレコードに含めないのは,そのような便利な機能がCrystal Reportsにあるかどうか知らないためです

    それでは,十分な検討の上,ご健闘ください

    最後に:jittaさんにならって,私も「さん」でお願いします

    2013年1月18日 5:43
  • Jittaさん

    回答ありがとうございます。現時点で印刷枚数について抽出したレコードを枚数分データテーブルに追加できていません。また敬称についてもどの方法が良いのか模索中です

    回答を頂く機会がありましたら、宜しくお願い申し上げます

    2013年1月19日 7:36