[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2007/07/25(Wed) 17:11
投稿者名:3時間放置のポテチ
Eメール:
URL :
タイトル:
プレビュー印刷後に印刷したいのですが
コマンドボタンで印刷の設定をしたくてクリスタルレポートで調べていたのですが
自分の使っているVB6.0にはクリスタルレポートが入っていませんでした。
仕方ないのでデータレポートを使ってプレビュー後に印刷するつもりでしたが、まだVBを始めて2週間経ってませんので印刷のコードをどのように書けばいいのかわかりません。
自分の要望としましては、
 
   登録No・人の名前・読み仮名

というデータをデータベースからSQLで引っ張ってきて全部データを印刷したいのです。
どなたかデータレポートをDataEnvironmentを使わずにデータベースの情報を印刷する方法を伝授してください。

使用VB 6.0
使用DB SQLサーバー

投稿時間:2007/07/25(Wed) 17:21
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: プレビュー印刷後に印刷したいのですが
> 自分の使っているVB6.0にはクリスタルレポートが入っていませんでした。
VB6 のエディションは何ですか?

Learning Edition には含まれていませんが、それ以外の
 Professional Edition
 Enterprise Edition
 RISC Edition for alpha
のいずれかであれば、CD 内に 英語版/日本語版 2種類の
クリスタルレポート(crystl32.exe)が同梱されているはずですよ。

http://support.microsoft.com/kb/193336/ja

投稿時間:2007/07/25(Wed) 17:37
投稿者名:3時間放置のポテチ
Eメール:
URL :
タイトル:
Re^2: プレビュー印刷後に印刷したいのですが
クリスタルレポートが入ってないということなのでLearning Editionだと思うのですが・・・

投稿時間:2007/07/26(Thu) 09:22
投稿者名:3時間放置のポテチ
Eメール:
URL :
タイトル:
Re^3: プレビュー印刷後に印刷したいのですが
>クリスタルレポートが入ってないということなのでLearning Editionだと思うのですが・・・
先輩に確認してみたところ自分のパソコンに入れたのはEnterprise Editionで、ただ単に見つけきれてないだけでした。

でもやっぱりDataReportで印刷することには変わりありませんのでそのまま質問を続けたいと思います。

投稿時間:2007/07/26(Thu) 12:55
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^4: プレビュー印刷後に印刷したいのですが
> どなたかデータレポートをDataEnvironmentを使わずに
> データベースの情報を印刷する方法を伝授してください。

DataEnvironment の存在までは知っておられるようなので、
 (1) SQL Server からデータを取得する手順までは把握している。
 (2) DataEnviroment 経由で印刷する方法も把握している。
という前提で回答したいのですが、それで良いでしょうか?


もし、(1)が良く分からないというのであれば、印刷処理より前の問題となりますので、
まずは ADO によるデータベース処理について、調査しておいてください。
もし、その時点で躓くようであれば、別途、スレッドを分けて質問をお願いします。


次に (2) ですが、DataEnvironment 無しの DataReport 印刷は、DataEnvironment 有りの
時よりも難易度が上がります。帳票のデザイン方法など、DataReport ツールの基本的な利用法を
覚えるためにも、(2) の件も事前に把握しておいてください。
もし、その (2) で躓いているようであれば、VB6のヘルプ(MSDN)に、具体例を交えた
DataReport のチュートリアルが掲載されていますので、そちらを参考にされると良いでしょう。


---
さて、本題。

通常、DataReport には DataEnviroment を割り当てますが、それ以外にも
実行時に ADODB.Recordset を Set することも可能です。
(DataSource をデザイン時に設定したいなら、DataEnviroment を使うしかありません)

今回の場合、その Recordset には、SQL Server から得たデータが取得されていることに
なるわけですが、ここで注意点があります。

DataReport 側でグループ化の機能を使っていなければ、そのまま
    Set DataReport1.DataSource = rs
    DataReport1.DataMember = ""
    DataReport1.Show vbModal, Me
だけでプレビューできるのですが、グループ化の機能を必要としている場合、
通常の Recordset では期待動作しません。


グループ化された印刷が必要な場合は、「階層型レコードセット」といって、
 Set rs2 = rs1.Fields("x").Value
のように、「子 Recordset を返す列」を持つ、階層構造的な Recordset を使うことになります。

これは、普段使っているSQL Server 用プロバイダ(Provider=SQLOLEDB)ではなく、
データシェイプ プロバイダ(Provider=MSDataShape)を使うことになります。
また、発行する SQL も、「SHAPE コマンド」という MSDataShape 専用の構文となります。

# ちなみに DataEnvironment の「子コマンドの追加」機能は、これらの SHAPE コマンドを
# 自動生成するためのデザイナツールでもあります。

「SHAPE コマンド」の例などは、ADO のヘルプ(MSDN/MDAC SDK)に掲載されていますので、
そちらをご覧ください。



以上、概要までに。

より詳細な説明が必要であれば、具体的にどの部分で躓いているのかを明示していただければ、
わかる範囲で回答しますよ。

投稿時間:2007/07/26(Thu) 14:28
投稿者名:3時間放置のポテチ
Eメール:
URL :
タイトル:
Re^5: プレビュー印刷後に印刷したいのですが
魔界の仮面弁士様レスポンスありがとうございいます。

> > どなたかデータレポートをDataEnvironmentを使わずに
> > データベースの情報を印刷する方法を伝授してください。
>
> DataEnvironment の存在までは知っておられるようなので、
>  (1) SQL Server からデータを取得する手順までは把握している。
>  (2) DataEnviroment 経由で印刷する方法も把握している。
> という前提で回答したいのですが、それで良いでしょうか?

はい、おそらく大丈夫だと思います。

えっと、この質問の意味は、DataReportのフィールドで構造の取得をした後、
DataReportのプロパティでDataSourceをDataEnvironmentに設定、
DataMemberを登録者マスタに設定、DataReportの各Textにデータベースの各データを表示する。
という作業をやったのですが、この設定では自分の勉強にならないと思いプロパティを使わないで表示したいという意味を込めて質問しました。
#プロパティを使わないと無理なら少々妥協してもかまわないかも

> 次に (2) ですが、DataEnvironment 無しの DataReport 印刷は、DataEnvironment 有りの
> 時よりも難易度が上がります。帳票のデザイン方法など、DataReport ツールの基本的な利用法を
> 覚えるためにも、(2) の件も事前に把握しておいてください。
> もし、その (2) で躓いているようであれば、VB6のヘルプ(MSDN)に、具体例を交えた
> DataReport のチュートリアルが掲載されていますので、そちらを参考にされると良いでしょう。

もし(2)がプロパティ経由ではないとしたら多分ここで躓いてますね。

> ---
> さて、本題。
>
> 通常、DataReport には DataEnviroment を割り当てますが、それ以外にも
> 実行時に ADODB.Recordset を Set することも可能です。
> (DataSource をデザイン時に設定したいなら、DataEnviroment を使うしかありません)

> 今回の場合、その Recordset には、SQL Server から得たデータが取得されていることに
> なるわけですが、ここで注意点があります。
>
> DataReport 側でグループ化の機能を使っていなければ、そのまま
>     Set DataReport1.DataSource = rs
>     DataReport1.DataMember = ""
>     DataReport1.Show vbModal, Me
> だけでプレビューできるのですが、グループ化の機能を必要としている場合、
> 通常の Recordset では期待動作しません。
このコードの場合DataReport1.DataMenber = "" の""部分を "登録者マスタ"
と書き換えればいいわけですね?

#ついでに使うか分かりませんがSQL構文を
#       mysql = "SELECT * From 登録者マスタ" & " Where 登録No = " & txtNo
#       Set rs = Conn.Execute(mysql)
#もし使うのであればこのコードをどこに入れればいいのでしょうか?

今回はグループ化の機能は必要ないので魔界の仮面弁士さんのコードを参考いたします。
少々疑問に思ったのですが、この場合印刷プレビュー後に一度操作画面に戻りデータ変更をした時、
印刷プレビューと印刷物は変更されたデータベース通りに出てきますか?

投稿時間:2007/07/26(Thu) 15:54
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^6: プレビュー印刷後に印刷したいのですが
> #プロパティを使わないと無理なら少々妥協してもかまわないかも

どのプロパティの話なのかを読み取れませんでした。。。
(設計時であれ実行時であれ、何らかのプロパティは使うことになるはず)


RptLabel の Caption プロパティを実行時に指定したい、という意味なら、
  '==== DataReport1
  Option Explicit
  Private Sub DataReport_Initialize()
    'ヘッダ セクションの Label1 に、今日の日付を表示
    Me.Sections("Section2").Controls("Label1").Caption = FormatDateTime(Now)
  End Sub
などのように書けます。


> このコードの場合DataReport1.DataMenber = "" の""部分を "登録者マスタ"
> と書き換えればいいわけですね?
# DataMenber → DataMember ですね。

DataSource に DataEnvironment を渡す場合は、DataMember にコマンド名を指定します。
DataSource に Recordset を渡す場合は、DataMember を 空にしておきます。
(これらは、実行時に設定するのでも、デザイン時に設定しておくのでも構いません)

また、グループヘッダ・グループフッタ等を含む、グループ化されている帳票の場合は、
DataReport1.DataMember だけでなく、RptTextBox 等の DataMember に、
子コマンド名(チャプタ名)を指定する必要があります。


> #ついでに使うか分かりませんがSQL構文を
> #       mysql = "SELECT * From 登録者マスタ" & " Where 登録No = " & txtNo
> #       Set rs = Conn.Execute(mysql)
> #もし使うのであればこのコードをどこに入れればいいのでしょうか?

呼び出し側(たとえば フォームのボタンクリック時)などにおいて、
 Set DataEnvironment1.DataSource = rs
 DataEnvironment1.Show
などとすれば、任意の Recordset を渡すことができます。


また、データベースに接続しない、オンメモリのレコードセットを指定する事もできます。
(下記は非階層の例ですが、オンメモリの階層レコードセットも使えます)


'=== Form1 にボタンを貼り、以下の記述を行います。
' また、DateReport1 に RptTextBox を 2 つ 貼り、DataSource に「列1」「列2」を指定しておいてください。
Option Explicit

Private Sub Command1_Click()
    Dim rs As ADODB.Recordset
    
    Set rs = New ADODB.Recordset
    rs.Fields.Append "列1", adInteger
    rs.Fields.Append "列2", adVarWChar, 30
    rs.Open
    rs.AddNew Array("列1", "列2"), Array(123, "あああ")
    rs.AddNew Array("列1", "列2"), Array(234, "いいい")
    rs.AddNew Array("列1", "列2"), Array(345, "ううう")
    rs.AddNew Array("列1", "列2"), Array(456, "えええ")

    With New DataReport1
        Set .DataSource = rs
        .Show vbModal, Me
    End With
End Sub


> 少々疑問に思ったのですが、この場合印刷プレビュー後に一度操作画面に戻りデータ変更をした時、
> 印刷プレビューと印刷物は変更されたデータベース通りに出てきますか?

それは、試してみればわかりますね。

投稿時間:2007/07/26(Thu) 17:05
投稿者名:3時間放置のポテチ
Eメール:
URL :
タイトル:
Re^7: プレビュー印刷後に印刷したいのですが
> どのプロパティの話なのかを読み取れませんでした。。。
えっと、私の言っているプロパティはデザイン時のプロパティウィンドウです。
#メニューバーの表示→プロパティウィンドウ(F4)

> # DataMenber → DataMember ですね。
スペルミス恥ずかしいです(>Д<;)

> 呼び出し側(たとえば フォームのボタンクリック時)などにおいて、
>  Set DataEnvironment1.DataSource = rs
>  DataEnvironment1.Show
> などとすれば、任意の Recordset を渡すことができます。
そんなこともできるんですね。勉強になります。

> > 少々疑問に思ったのですが、この場合印刷プレビュー後に一度操作画面に戻りデータ変更をした時、
> > 印刷プレビューと印刷物は変更されたデータベース通りに出てきますか?
>
> それは、試してみればわかりますね。
ごもっともです。

魔界の仮面弁士さんご指導ありがとうございます