none
デバッグでCrystalReportsのデータが表示されないのですが RRS feed

  • 質問

  • 今回もよろしくお願いします。

    開発環境は、VB2005、Access2003、Crystalrepotsは2005に付属しているのを使っています。

    メインにForm1があり、メニューからForm2を呼び出し、必要項目を入力し、ボタンを押したら、Crystalrepotsのプレビューが見れるようにしてあります。

    デバッグで、Form2を実行してプレビューしたらちゃんとCrystalrepotsにパラメータを渡したデータが表示され問題ないのですが、同じくデバッグでメインのForm1を実行して、Form2を呼び出し、同じ操作をするとパラメータの入力フォームが表示され、パラメータを入力してもCrystalrepotsにデータが真っ白(罫線やテキストの文字は出てます)でプレビューされてしまいます。

    パラメータが渡ってない&データがバインドされてない?のかと思ったので色々試したのですが、Form2を実行したら普通に表示できるのに、Form1から実行するとだめな原因がわかりません。解決法がわからずこちらに書かせていただきました。

    どのような原因があるのでしょうか?

     

    2006年11月17日 0:42

回答

  • 以下のスレッドに、TH01さんのMy.Formsに関する記述がありますので、読んでみてください。ポイントはForm2のインスタンスがどのように生成されているかです。

    親フォームを比較するSelect Caseについて
    http://forums.microsoft.com/msdn-ja/ShowPost.aspx?PostID=593630&SiteID=7

    このMy.Formsの機能は、かえってオブジェクト指向をわかりにくくしてるような気がするんですけどね。

    #ちょっとじゃんぬさん、厳しすぎじゃ・・・(^^;

    2006年11月18日 4:24
    モデレータ
  •  trapemiya さんからの引用
    このMy.Formsの機能は、かえってオブジェクト指向をわかりにくくしてるような気がするんですけどね。

    まあ、My.Forms の正体は、いわゆる 「Form の既定のインスタンス」 なのですが、
    OOP にとっては、あまり良いものではないというのは結構言われていることです。

    ぜひとも、柔軟に対応できるように、禁止するオプションを儲けるための投票をお願いしたいです。

    Form の 「既定のインスタンス」 を禁止できるオプションが欲しい

    #ちょっとじゃんぬさん、厳しすぎじゃ・・・(^^;

    いえ、不明点があってそれを明らかにすればお答えしますよ。
    何でもかんでも自分で調べなさいと言っているわけではないです。

    2006年11月18日 8:03

すべての返信

  • momo-yo さん、こんにちは。

     momo-yo さんからの引用
    パラメータが渡ってない&データがバインドされてない?のかと思ったので色々試したのですが、Form2を実行したら普通に表示できるのに、Form1から実行するとだめな原因がわかりません。

    Form2 のインスタンスが同一でないことが考えられます。
    まずは、最低限のコードを提示しないと、CrystalReports 大好きな私でも流石にアドバイスできないです。

    2006年11月17日 1:44
  • じゃんぬねっとさま、こんにちは。返信ありがとうございました。

    どのあたりのコードを書けばよいのかわからないので、一応、掲載します。見当違いな部分を掲載していたらすみません。再度ご指摘ください。

    Form1  これでForm2を呼び出しています。

     Private Sub 照会表KToolStripMenuItem_Click _
        (ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 照会表KToolStripMenuItem.Click
            '編集を終了
            Call CheckEdit()

            '照会を表示
            Dim Form2 As New Form2
            Form2.ShowDialog()

        End Sub

     

    Form2 

    ボタンを配置して、DataGridViewに選択範囲を表示させています。

     Private Sub Button1_Click _
        (ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            '日付範囲と得意先で検索
           

            Try
                Me.管制TableAdapter.日付範囲と得意先 _
                (Me.Test1DataSet.管制, New System.Nullable(Of Date) _
                (CType(TextBox2.Text, Date)), New System.Nullable(Of Date) _
                (CType(TextBox3.Text, Date)), ComboBox1.Text)
            Catch ex As System.Exception
                System.Windows.Forms.MessageBox.Show("日付範囲を確認してください。", "エラー")
            End Try

              End Sub

    印刷用ボタンを押したら 、プレビューができるように設定

    Private Sub Button3_Click _
        (ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
            '日付範囲と取引先名を印刷
            Using frm = New 印刷プレビュー   'ボタンが押されたときの値を設定
                frm.ButtonNo = (3)
                frm.ShowDialog()
            End Using
        End Sub

     

    印刷プレビューForm

    Imports CrystalDecisions.Shared     '印刷用 名前空間
    Public Class 印刷プレビュー

     Public Property ButtonNo() As Integer   ’Form2、Form3の印刷ボタンに値を設定するためのプロパティ
            Get
                Return intButtonNo
            End Get
            Set(ByVal value As Integer)
                intButtonNo = value
            End Set
        End Property

     

    Private Sub 印刷プレビュー_Load _
        (ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

      ElseIf intButtonNo = 3 Then       'Form2の取引先&期間の印刷ボタンが押されたとき
                ' 管制TableAdapter.Fill(Test1DataSet.管制)
                Dim rv As New ParameterRangeValue '     抽出する値
                rv.StartValue = Form2.TextBox2.Text      '期間開始日の取得
                rv.EndValue = Form2.TextBox3.Text      '期間終了日の取得 

                Dim rx As New ParameterDiscreteValue
                rx.Value = Form2.ComboBox1.Text    '取引先名の取得

                Dim pf As New ParameterField    'パラメータフィールドの作成
                pf.Name = "期間"       '期間
                pf.CurrentValues.Add(rv)

                Dim ps As New ParameterField   'パラメータフィールドの作成
                ps.Name = "取引先"     '取引先
                ps.CurrentValues.Add(rx)

                Dim pfs As New ParameterFields    'パラメータフィールドコレクションに追加
                pfs.Add(pf)
                pfs.Add(ps)

                Dim rp As New 取引期間  '        レポート「取引期間.rpt」とデータセットを連結
                rp.SetDataSource(管制.Test1DataSet)

           CrystalReportViewer1.ParameterFieldInfo = pfs 'レポートにパラメータを渡す

                CrystalReportViewer1.ReportSource = rp 'プレビューを表示

     

    長々とすみません。これで検証できますでしょうか?Formの名前はそのままだと恥ずかしいのでForm1,Form2とさせていただきました。よろしくお願いします。

     

    2006年11月17日 2:55
  • momo-yo さん、お疲れ様です。

    印刷プレビュー_Load のところですが、ここにブレーク ポイントを設定し、
    意図した値がパラメータに代入されるかどうか、確認してみてください。

    2006年11月17日 2:58
  • じゃんぬねっとさま、返信ありがとうございました。

    指定のところにブレークポイントを設定してみました。パラメータが渡っていないようです。

    あと、

     Private Sub Button3_Click _
        (ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
            '日付範囲と取引先名を印刷
            Using frm = New 印刷プレビュー 'ボタンが押されたときの値を設定
                frm.ButtonNo = (3)
                frm.ShowDialog()   ←この部分
            End Using
        End Sub

     

    上記のこの部分で、エラーが発生しました。frm.まで入力したら、入力候補にShowとかShowDialogが表示されず、Equalsとか(よくわかってなくてすみません)の候補が出ます。

    2006年11月17日 4:41
  •  momo-yo さんからの引用
    指定のところにブレークポイントを設定してみました。パラメータが渡っていないようです。

    なぜ、渡っていないか考えてみましたか?
    これからも同じところで躓く可能性がありますので、インスタンスについて学ぶことをお勧めします。

    上記のこの部分で、エラーが発生しました。frm.まで入力したら、入力候補にShowとかShowDialogが表示されず、Equalsとか(よくわかってなくてすみません)の候補が出ます。

    これは、また別の問題でしょうね。

    2006年11月17日 5:46
  • 返信ありがとうございました。

    なぜ、渡っていないか考えてみましたか?
    これからも同じところで躓く可能性がありますので、インスタンスについて学ぶことをお勧めします。

    インスタンスというキーワードで参考書を見てみました。読んだのですが、抽象的でいまいち理解できていないので、ネットで検索して調べてみます。なぜ渡っていないかは沢山考えて色々やってみたんですが、Form2からできて、Form1→Form2→×となるのがなぜなのかわからないです

    自分では変数の宣言や、Newに何かヒントがあるかも?と思っているので引き続き検証してみます。ありがとうございました。

     

     

     

    2006年11月17日 15:03
  • 以下のスレッドに、TH01さんのMy.Formsに関する記述がありますので、読んでみてください。ポイントはForm2のインスタンスがどのように生成されているかです。

    親フォームを比較するSelect Caseについて
    http://forums.microsoft.com/msdn-ja/ShowPost.aspx?PostID=593630&SiteID=7

    このMy.Formsの機能は、かえってオブジェクト指向をわかりにくくしてるような気がするんですけどね。

    #ちょっとじゃんぬさん、厳しすぎじゃ・・・(^^;

    2006年11月18日 4:24
    モデレータ
  •  trapemiya さんからの引用
    このMy.Formsの機能は、かえってオブジェクト指向をわかりにくくしてるような気がするんですけどね。

    まあ、My.Forms の正体は、いわゆる 「Form の既定のインスタンス」 なのですが、
    OOP にとっては、あまり良いものではないというのは結構言われていることです。

    ぜひとも、柔軟に対応できるように、禁止するオプションを儲けるための投票をお願いしたいです。

    Form の 「既定のインスタンス」 を禁止できるオプションが欲しい

    #ちょっとじゃんぬさん、厳しすぎじゃ・・・(^^;

    いえ、不明点があってそれを明らかにすればお答えしますよ。
    何でもかんでも自分で調べなさいと言っているわけではないです。

    2006年11月18日 8:03
  • 今頃voteしときました。じゃんぬさんのブログで読んでたんだけど、voteするの忘れてました。(^^;

    クラスやインスタンスというのは、初心者の方にはとっつきにくいものです。ましてや既定のインスタンスとなると、なかなかわかりづらいでしょうね。C#だと一発でコンパイルエラーになるんで、むしろ初心者にはやさしいんじゃないかと思えるんですが。
    VB6のようにしたかったけど、残念ながらVB6ではなかったところに、こういう悲劇が生まれるんでしょうね。

    2006年11月18日 14:37
    モデレータ
  • trapemiyaさま、返信ありがとうございました。

    サイト内の参考スレッドの表示をしていただいてありがとうございます。おかげさまで、無事にForm1からForm2→印刷プレビューを表示することができました。

    CrystalRepotsのパラメータの渡し方の問題だとばかり思っていたので、こちらに投稿させていただいてよかったです。まさか、自分の思わぬところで「インスタンスが別」になってたなんて考えもしなかったです。初心者の私には「既定のインスタンス」という存在さえわからなかったです。便利なんですけど、気をつけなければならないですね。でも、今回このトラブルのせいで、かなり勉強できました。(時間はかかりましたけど)VB2005のしくみについてもっともっと勉強しなければ、と改めて実感しました。

    まだわかっていないことが多くて別の問題が発生しそうでで怖いですけど、頑張ります。また質問したときにはどうぞよろしくお願いします。今回もアドバイスを沢山していただきまして本当にありがとうございました。

    2006年11月20日 1:00
  • じゃんぬねっとさま、返信ありがとうございました。

    おかげさまで無事に解決することができました。「既定のインスタンス」の存在を知らなかったので、とても混乱してしまい、なにがいけないのかさっぱりわからない状態でした。表題のCrystalrepotsとはかけはなれたところに問題があったようで、質問自体がかなりズレていたこと、反省しております。

    私のように混乱してしまう人(特に初心者)や、慣れている人にも使い勝手がよくなると思いますので「禁止オプションを設ける」に、投票してきました。

    まだわからないことが山積みでまたまた質問をすると思いますが、見かけた際にはどうぞよろしくお願いします。今回も本当にありがとうございました。

    2006年11月20日 1:12