プロが教えるわが家の防犯対策術!

 VBからCrystalReportを呼び出し、CrystalReports側でSQL文実行させたいのですが、ヘルプ等を見ても方法がわかりません。

 例えば・・・
1 VBで入力画面を用意し、抽出条件を入れさせる。
2 入力された条件にてSQL文を生成しSQL-Serverから該当行を抽出する。
3 CrystalReportsで作表する。

 VBでSQL文を生成し、例えばMDBに書き出し、それを単純にCrystalReportsで読むということは出来たのですが、中間ファイル(この場合はMDB)を作らずに同様のことができるのでしょうか?
 つまり、VBから制御されたCrystalReportsでDBから条件抽出をかけつつ作表するということが可能か否か、可能であるならばその方法をご教授いただけると幸いです。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

確か、レポートのプロパティで、SQL 文をセットしておけば、その SQL 文に従ってデータが表示されるプロパティがあったと思います。

そのプロパティの名前は忘れてしまいましたが、
(1) VB で SQL 文を生成
(2) VB でレポートのオブジェクトを取得
(3) レポートオブジェクトの SQL のプロパティに SQL 文をセット
(4) 印刷を実行
のような流れで、できたと思います。
    • good
    • 0
この回答へのお礼

お礼が遅くなりまして申し訳ございませんでした。
いろいろ試したのですが、結局別のツールで
実現できそうなので、クリレポはあきらめました。

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

お礼日時:2003/12/10 12:09

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qクリスタルレポート(8.5)の書式設定

お世話になっています。
開発環境 
 VisualStudio6.0
 クリスタルレポート8.5です。
VBプロジェクト内でクリスタルレポートをデザインする方法で開発しています。

フィールドの表示形式の設定方法がわかりません。

1、数値フィールドで日付を持っています。(20040304など)
このフィールドをスラッシュ編集で表示するにはどうしたらいいですか?

式フィールドで
Left(フィールド,4) & "/" & Mid(フィールド,5,2) & "/" & Right(フィールド,2)

と、しようと思ったのですが、結果は"20,0/40/00" となってしまいました
  勝手に数値をカンマ編集、小数2桁表示しているようです。

2、同じく数値フィールドで、数値にゼロを足して表示する方法がわかりません。

例えば、19なら0000019、1なら0000001、110なら0000110 というふうにしたいです。

よろしくお願い致します。

Aベストアンサー

#1です。
私はてっきりVBで持っているデータをクリスタルレポートの式フィールドに渡すものだと思っていたのでFormat関数を利用したらどうかと思ったのですが、MDBの情報をクリスタルレポートで出すということなんですね。

フィールドのプロパティにそういうのってなかったでしょうか…。

ちょっとそれは考えていなかったので調べてみます。
役に立てなくてすみません…。

もしどうしても出来ないのであれば、書式の設定をしたいものだけ(この場合は日付と0フォーマットしたい数字)をデータベースからVBに読み込んで、そこからクリスタルレポートの式フィールドにFormat関数で変換したものを渡したらどうでしょうか。
一応VBにはコンポーネントにクリスタルレポートの操作が出来るものがあるのでそれを利用してみるのもいいのではないかと思います。

本当、お役に立てなくてすみません…

Q★クリスタルレポートの元になるテーブルを途中で変えたい時、どうすれば??

クリスタルレポートを作る時、
元になるデータベースを選んでテーブルを選んで、
必要な項目を画面に貼り付けていくわけですけど、

たくさん画面に式なり項目なりを貼り付けたあとで、
テーブル1 から 全く同じ構造のテーブルである テーブル2に
出力元を変えたいとします。

私は今まで、「データベース」→「データベースからレポートを追加」
でテーブル2を追加し、そのあとで、「データベース」→ 「レポートから
ファイルを削除」でテーブル1を選んで消していました。
すると、項目をそのまま貼り付けてあったものはすべて消えてしまいますが、
式を作ってその中に、[テーブル1.項目1]と書いてあった場合は
そのままで残っています。

その状態で例えば、プレビューボタンを押すとすると、
当然もうテーブル1はないので、エラーとなります。

その式の中のテーブル1をすべて手動でテーブル2に変えるという作業を
していました。

バージョンは問いません。使っているのは、7と8です。

何か一度に変える方法はないのでしょうか?
式の中のものをすべて置き換える方法などないでしょうか?

他の方法でもいいのでどなたか至急教えて下さい。
項目がたくさんある時とても大変です・・・

クリスタルレポートを作る時、
元になるデータベースを選んでテーブルを選んで、
必要な項目を画面に貼り付けていくわけですけど、

たくさん画面に式なり項目なりを貼り付けたあとで、
テーブル1 から 全く同じ構造のテーブルである テーブル2に
出力元を変えたいとします。

私は今まで、「データベース」→「データベースからレポートを追加」
でテーブル2を追加し、そのあとで、「データベース」→ 「レポートから
ファイルを削除」でテーブル1を選んで消していました。
すると、項目をその...続きを読む

Aベストアンサー

記憶が薄いですが、、、

クリスタルレポートは、テーブル名とフィールドを記憶します。
しかしDBの接続先は任意です。

テーブル名が違うなら、全て関連付けずにオブジェクトを配置して、コードで関連付けるしかありません。

クリスタルレポートをインストール時に、サンプルもインストールしませんでしたか?
同様なサンプルを見たような気がします。。。

Qクリスタルレポートでプレビュー表示

VB6とクリスタルレポートを使って、印刷画面を作っているのですが、
VB画面の印刷ボタン押下時に、プレビュー画面を出したいのですが、
出し方がわかりません。
どのようにしたら、プレビュー画面を出すことが出来るのでしょうか。
よろしくお願いします。

Aベストアンサー

クリスタルレポートのバージョンがわかりませんが
印刷の際に「CrystalReport1.Destination = crptToPrinter」としていると
思いますが、プレビューの場合は
「CrystalReport1.Destination = crptToWindow」とすればプレビュー表示
されます。

ちなみに
CrystalReport1.Window~プロパティで画面サイズの設定も行えます。

Qクリスタルレポートで文字列の部分抽出をする方法

クリスタルレポートで式フィールドを挿入する際、
データベースフィールドの文字列を部分的に抽出
することは出来ないでしょうか。
「あるフィールドの○文字目から△文字目までを抽出する」という、VBで言うMID関数を使いたいのですが、
術が見つからなくて困っています。
よろしくお願いします。

Aベストアンサー

添字演算子[]を使えばMID関数のように利用できます。

x[y to z] で、文字列 x から、y ~z までの範囲の文字を取り出せます。
添字は0から始まります、またこの演算子で文字の代入もできます。

{データベースフィールド} [3 to 10] で
データベースフィールド の 3から 10個目の文字列がとれます。

詳しくは、クリスタルレポートのヘルプに記載されています。

QDataGridViewで指定したセルの値を取得

こんにちは。

VB2008のDataGridViewで指定したセルの値を取得をする方法がわかりません。
どなたか教えてください。

Aベストアンサー

こんばんは.

 Dim Data As String
 Data = Me.DataGridView(0, 2).Value
 MsgBox(Data)

みたいな感じで取れないですかね???

QVB6.0の「vbFromUnicode」はVB.NETではどれに相当しますか?

VB6.0で、例:StrConv(Text, vbFromUnicode)とかで使用する、
「vbFromUnicode」(文字列を Unicode からシステムの既定のコードページに変換する)
は、VB.NETでは使用できないようです。(相当する定数はない?)

「vbFromUnicode」と同等の機能を、VB.NETで使用したいのですが、
どうすれば良いでしょうか?

Aベストアンサー

思いっきり、例文に「COM1」と書いてますが、USBに書き換えてくださいね^^;

それとふと思ったのですが
udtReaderWriterModeWithoutEncryption
変数は構造体ですよね?

メンバが
lngPortName
lngBardRate
というのは、型宣言をINTEGERに変換してますよね?

ちょっとばかり不安に思ったので、追記しておきました。

参考URL:http://okweb.jp/kotaeru.php3?q=1257613

Qクリスタルレポートの式フィールドで日付変換。

クリスタルレポート8の式フィールドで日付を表示させようと思っています。

標準では『YYYY/MM/DD』形式なのですがこれを『YYYY-MM-DD』で表示させたいのですがうまくいきません。

式フィールドには

if A ="1" then formula = CurrentDate

と記述しています。
Aの値が"1"ならば日付を表示です。
説明が下手で分かりづらいかもしれませんが、
補足しますのでヨロシクお願いします。

Aベストアンサー

私が使っている .net 2003 のクリレポではカスタム設定で第一区切り、第二区切りの文字が指定できるんで、簡単に実現できますが、クリレポ8だと良くわかりませんねぇ。

formulaは文字列型なんでしょうか?であれば、right, mid, leftでそれぞれ年月日をつなぎ合わせるとか。
もしくは、Year, Month, day関数を使って、
Year(CurrentDate) + "-" + Month(CurrentDate) + "-" + Day(CurrentDate)
にしてみるとか。
すみません、上記のコードは全く検証していません(^^;

QVB.NETのDataGridで、選択行の特定の列の内容を取得したい

タイトルにあるとおり、DataGridを使用している場合、実行時に選択された行の特定の列の内容を取得するにはどのようにすればよいのでしょうか?

DataGridは複雑で、まだよくわかっていません。
よろしくお願いします。

Aベストアンサー

選択している行番号は、dataGrid1.CurrentRowIndexでわかります。
行、列を指定して各セルにアクセスするには、
dataGrid1(行番号,列番号)でいいので
dataGrid1(dataGrid1.CurrentRowIndex,列番号)
で選択されている行の特定の列の内容を取得できます。
註:番号は、0始まり

QDataSetから、DataTableを取得したい。

C♯環境です。

DataSetに格納されている1つのテーブルを、DataTableとして
取得したいと思っています。
VB.NETではたしか出来たと思うのですが…

DataTable Dt= DataSet.Tables(0);

以上のように書くと、「~Tablesはプロパティですがメソッドのように
使用されています」と怒られます。
出来ないのでしょうか…?
誤りをご指摘いただけるとありがたいです。

宜しくお願いします。

Aベストアンサー

VBの配列は()でのアクセスでしたが,C#では[]ですよね。
それと同じで,インデクサへのアクセスは,VBでは()でしたがC#では[]です。

DataTable dt = DataSet.Tables[0];

MSDN: DataSet.Tables プロパティ (System.Data)
http://msdn.microsoft.com/ja-jp/library/system.data.dataset.tables.aspx
MSDN: DataTableCollection.Item プロパティ (Int32) (System.Data)
http://msdn.microsoft.com/ja-jp/library/cfsd7dz4.aspx

QCloseとDisposeの違い

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、タイマーコントロールのイベントに記述していますと、それは実行され続けます。

これを防ぐために、Me.Dispose() を使います。すると、きれいにプロセスは終了し、イベントは発生しない模様です。

そこで、「フォームを閉じる」意味のMe.Close() をすべてMe.Dispose() に変えてしまいました。確実にプロセスを破棄出来ると思ったからです。Webで調べると、違いは「再利用できる、できないの違い」という答えがありましたが、それはきっと、ファイルやオブジェクトのことで、フォームの場合は、再びShowまたはShowDialogで表示させることは可能でしたので、特に問題は感じていませんでした。

ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。Me.Close() に変えるとうまくいきました。

わけわからなくなってきました。。。

ちなみに、その残ったフォームは、スタートアップフォームであり、別のフォームからShowまたはShowDialogメソッドで呼び出したものではありません。

ここで4つの仮説を立ててみました。

1. ShowDialogで呼び出したフォームは、Me.Dispose()、Showで呼び出した、あるいは、スタートアップフォームは、Me.Close() すれば破棄できる

2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

3. 呼び出し方ではなく、別の要因が存在する

4. 併記する必要がある場合がある

Me.Close()
Me.Dispose()

または、

Me.Dispose()
Me.Close()



どれが正しいのでしょうか?どなたがご存じの方がいらっしゃいましたら、ご教授いただけませんでしょうか? どうぞよろしくお願い申し上げます。ありがとうございました。

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、...続きを読む

Aベストアンサー

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。
Me.Close() に変えるとうまくいきました。

通常はどちらでもうまくいきます。

>2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

ShowDialogの場合は、メソッド内部で、ハンドルが破棄されているため、Close()メソッドの際にDispose()メソッドが呼び出されます。

>3. 呼び出し方ではなく、別の要因が存在する

そう思います。

>4. 併記する必要がある場合がある

インスタンスを明示的に破棄したほうがよい場合は多く存在します。
Disposeが使えるメンバはIDisposableをインターフェースとして持っているメンバです。
これらのメンバは、外部とのやり取りを行うものが多くあります。
たとえばSQLClientに含まれるようなメンバです。

外部とのコネクションを確実に破棄を保障してほしいなどという場合がありますよね、このようなときに使用します。

Using構文を使用するのとまったく同じ理由になります。
正確にはUsing構文を使用できるメンバには条件があります、IDisposableをインターフェースとして持っているメンバに限るというものです。

ほかにもガーベージコレクタによるファイナライズを伴うかどうかという違いがあります。
Disposeの場合はファイナライズが同時に行われるため、使用していたメモリ空間を開放することができます。

上記のような理由により、
Me.Close()
Me.Dispose()
は両方書いたほうがよいと思います。

蛇足ですが、
Me.Dispose()
Me.Close()
はエラーになります。
Me.Dispose()により、Me本体(インスタンス)は削除されてしまいます。
存在しないMeに対してCloseメソッドを要求することはできないためです。

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリ...続きを読む


人気Q&Aランキング