set rs = db.Execute(strSQL)
set rptReport.DataSource = rs
と、すれば、データレポートにデータベースのデータを送ることができ、それを正常に表示することはできたのですが、
strTest = "Hello!"
のような変数をデータレポートに渡して表示することはできないのでしょうか?
もし、それを可能にする方法があれば、ご教授お願いいたします。
実は、データベースの1つのテーブルのデータを Where Name = 'AAA' のようにまとめて、データレポートのページヘッダー 部に Name: AAA のように表示したかったのですが、2日間方法がわからず、個別の変数に移して表示をする方法はないものか?と考えたわけです。
よろしくお願いします。
環境情報です。
なんと呼べばいいのかわからないけど、ADOを利用しています。
データベースはMS Access 2000
レポートは Data Report
まだVBをはじめて間もないので、文章に適切な表現がされておらず、わかりにくいかとは思いますがどうかよろしくお願いします。
あ、あと、VBは6.0ってのと、Data Environment ←英語のVBですので日本語では「データ環境」?なのでしょうか?は使わずに上記のことを行いたいというのを書いておくの忘れていました。
SQL文で、変数に値を代入する方法がありますが、それを応用する
ようなことで実現できませんか?
実際にどのようなコードになっているのか解らないので、実現には、
適切な方法かどうか解りません。
SELECT @変数 = 値
と書けます。SQL Serverとかがあれば、Transact-SQL ヘルプで文法
が確認できるのですが・・・
以上。
あれから、またいろいろと試してみたのですが、どうもうまくやりたいことが行えません。
ソースを以下に貼り付けて起きますので、もし、なにかいい方法が見つかるようでしたらお願いします。
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と一度だけ
表示したいわけです。
> 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です。
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等)を併用して、
さらにグループ化させていく事もできます。
魔界の仮面弁士さん、
大変わかりやすい説明とサンプルプログラムをありがとうございました。
上記の2種類のプログラムを両方とも試してみました。
両方ともばっちり僕がやりたいことを達成させてくれました。
結果としては、これからのプログラムの便を考えて、データシェイププロバイダを利用しようと思いますが、ラベルの方はまさに僕が「できればいいなぁ」と思っていたことでした。これも後ほど何かの役に立つことだろうと思います。
本当にありがとうございました。
ツイート | ![]() |