データレポートに変数を送り、それを表示するには?

解決


TAKE  2003-06-26 13:50:24  No: 78449

set rs = db.Execute(strSQL)
set rptReport.DataSource = rs

と、すれば、データレポートにデータベースのデータを送ることができ、それを正常に表示することはできたのですが、

strTest = "Hello!"

のような変数をデータレポートに渡して表示することはできないのでしょうか?

もし、それを可能にする方法があれば、ご教授お願いいたします。

実は、データベースの1つのテーブルのデータを Where Name = 'AAA' のようにまとめて、データレポートのページヘッダー 部に Name: AAA のように表示したかったのですが、2日間方法がわからず、個別の変数に移して表示をする方法はないものか?と考えたわけです。

よろしくお願いします。


TAKE  2003-06-26 14:07:28  No: 78450

環境情報です。

なんと呼べばいいのかわからないけど、ADOを利用しています。
データベースはMS Access 2000
レポートは Data Report

まだVBをはじめて間もないので、文章に適切な表現がされておらず、わかりにくいかとは思いますがどうかよろしくお願いします。


TAKE  2003-06-26 14:10:23  No: 78451

あ、あと、VBは6.0ってのと、Data Environment ←英語のVBですので日本語では「データ環境」?なのでしょうか?は使わずに上記のことを行いたいというのを書いておくの忘れていました。


岡田 之仁  2003-06-26 17:58:47  No: 78452

SQL文で、変数に値を代入する方法がありますが、それを応用する
ようなことで実現できませんか?
実際にどのようなコードになっているのか解らないので、実現には、
適切な方法かどうか解りません。

SELECT @変数 = 値

と書けます。SQL Serverとかがあれば、Transact-SQL ヘルプで文法
が確認できるのですが・・・

以上。


TAKE  2003-06-27 08:04:18  No: 78453

あれから、またいろいろと試してみたのですが、どうもうまくやりたいことが行えません。

ソースを以下に貼り付けて起きますので、もし、なにかいい方法が見つかるようでしたらお願いします。

Dim cn As Object
Dim rs As Object

Private Sub cmdGO_Click()

    Dim strSQL As String
    
    'Create Connection
    Set cn = CreateObject("ADODB.Connection")
    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source=C:\Documents and Settings\Administrator\Desktop\New Folder\Biblio.mdb"
    
   'Make SQL Statement
    strSQL = "SELECT PubID,Name,City FROM Publishers where city = 'New York'"
    
    'Get recordset
    Set rs = cn.Execute(strSQL)
    
    'Get information from recordset
    Set rptSample.DataSource = rs
    
    'Display Data Report
    rptSample.Show
    
End Sub

データレポートではCityの部分はすべてNew Yorkになってしまうので
ページのヘッダーあたりにCity: New Yorkと一度だけ
表示したいわけです。


魔界の仮面弁士  2003-06-27 10:49:28  No: 78454

> strTest = "Hello!"
> のような変数をデータレポートに渡して表示することはできないのでしょうか?

可能です。ラベルなどに、データを実行に表示させたい場合には、
    .Sections("Section1").Controls("Label1").Caption = "あああ"
などのようなコードを記述してやればOKです。

例えば、レポート側にコールバック用のイベントを定義して、
  Option Explicit
  Public Event RequireData(ByVal Ctrl As Object)
  Public Sub ShowEx()
    RaiseEvent RequireData(Sections("Section2").Controls("Label1"))
    RaiseEvent RequireData(Sections("Section2").Controls("Label2"))
       :
    Me.Show
  End Sub
などと書いておき、フォーム側では、
  Private WithEvents DR As rptSample
  Private Sub cmdGO_Click()
       :
    Set DR = rptSample
    Set rptSample.DataSource = rs
    rptSample.ShowEx
  End Sub
  Private Sub DR_RequireData(ByVal Ctrl As Object)
    Select Case Ctrl.Name
     Case "Label1": Ctrl.Caption = "あああ"
     Case "Label2": Ctrl.Caption = "いいい"
       :
    End Select
  End Sub
などと書く事ができます。

もしも渡すべきデータがさほど多く無い場合は、もっと単純に書けます。
例えば、DataReport側に、
  Public Sub ShowEx(ByVal Text As String)
    Sections("Section2").Controls("Label1").Caption = Text
    Me.Show
  End Sub
のようなメソッドを定義しておき、呼び出し側では
  Set rptSample.DataSource = rs
  rptSample.ShowEx "あああ"
などと書く事ができます。

ちなみに、
> 個別の変数に移して表示をする方法はないものか
が主目的なのではなく、本来は、
> データを Where Name = 'AAA' のようにまとめて、データレポートの
> ページヘッダー 部に Name: AAA のように表示したかった
という事なのであれば、「データシェイプ」を使えばOKです。


魔界の仮面弁士  2003-06-27 11:26:47  No: 78455

DataReportでグループ化した出力を行うためには、『階層型レコードセット』を作成する必要があります。

階層型レコードセットとは、「RS.Fields(X).Value」がRecordsetを返すような構造になっていて、
これは、データシェイププロバイダ(Provider=MSDataShape)によって作成する事ができます。

以下、サンプルです。先のTAKEさんのコードと同様、BIBLIO.MDBで作ってみますね。

----
1. DataReportを右クリックし、ポップアップメニューにて、レポートヘッダ/フッタと
   ページヘッダ/フッタを外します。(これらは、今回のサンプルでは使いません)

2. さらに、グループヘッダ/フッタを挿入しておきます。

3. テキストボックスを、グループヘッダに1つ、詳細セクションに2つ配置します。

4. 詳細セクションの2つのテキストボックスに対し、それぞれのDataFieldプロパティに
   「PubID」「Name」と指定します。

5. さらに、その2つのテキストボックスの DataMemberに、「ChildData」と指定します。

6. グループヘッダのテキストボックスに対し、DataFieldを「City」にします。
   なお、こちらのDataMemberは空のままにします。

7. グループヘッダのForcePageBreakプロパティを、rptPageBreakBeforeにします。

8. 以下のコードを、フォーム側に記述します。

Private Sub cmdGO_Click()
    Set cn = CreateObject("ADODB.Connection")
    cn.Open "Provider=MSDataShape;" _
          & "Data Provider=Microsoft.Jet.OLEDB.4.0;" _
          & "Data Source=" & BIBLIO_MDB_PATH

    Set rs = CreateObject("ADODB.Recordset")
    rs.Open "SHAPE {SELECT PubID,Name,City FROM Publishers WHERE City = 'New York'} AS ChildData" _
          & " COMPUTE ChildData BY City", cn
    Set rptSample.DataSource = rs
    rptSample.Show
End Sub

----

これで、求める結果になると思います。

さらに「WHERE City <> 'New York'」で実行してみれば、都市名ごとに改ページされた
帳票を出力する事ができます。あるいは、他のSHAPEコマンド(SHAPE APPEND等)を併用して、
さらにグループ化させていく事もできます。


TAKE  2003-06-27 14:57:40  No: 78456

魔界の仮面弁士さん、

大変わかりやすい説明とサンプルプログラムをありがとうございました。

上記の2種類のプログラムを両方とも試してみました。
両方ともばっちり僕がやりたいことを達成させてくれました。

結果としては、これからのプログラムの便を考えて、データシェイププロバイダを利用しようと思いますが、ラベルの方はまさに僕が「できればいいなぁ」と思っていたことでした。これも後ほど何かの役に立つことだろうと思います。

本当にありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加