- PR -

Module部における DataSet 扱いについて

投稿者投稿内容
One.net
大ベテラン
会議室デビュー日: 2008/03/01
投稿数: 202
投稿日時: 2008-04-22 09:55
WindowsXP VB2005EEでDbはAccess2003を使ってWindowsアプリケーションを作っています。
印刷のPrintString部を何回も使用することになり、「Module1.vb」に記述して使おうとしています。
ところが、次のようにPrintString部で販売テーブルのDataSetを使っています。

引用:

Private Sub PrintString(ByVal e As System.Drawing.Printing.PrintPageEventArgs)
・・・・・・・・・・・
Dim dr As DataRow
For Each dr In DataSet1.販売.Rows
・・・・・・
Next
・・・・・・・・・
End Sub



普段はフォームのLoad時に、データソースから販売テーブルをドラック&ドロップして次のように
DataSetを自動生成していますが、「Module1.vb」ではどのように記載すればよいのか教えてください。
Me.販売TableAdapter.Fill(DataSet1.販売)

もしかするとModuleではDataSetを扱えないのでしょうか
よろしくご指導をお願いいたします。

[ メッセージ編集済み 編集者: One.net 編集日時 2008-04-22 10:09 ]
テッテ
ベテラン
会議室デビュー日: 2008/03/16
投稿数: 91
投稿日時: 2008-04-22 10:16
TableAdapter も 〜DataSet もローカル変数として宣言して同様に使うことは可能です。

フォームにドラッグ&ドロップすると、
TableAdapter を作成し、データセットに読み込むコードが自動生成されますので、
覗いてみると仕組みがよくわかると思います。
(まだチェックがついていなければ)ソリューションエクスプローラの
「すべてのファイルを表示」をチェックして、
データセットを使っているフォームのモジュールの横の+マークで展開して、
フォーム名.designer.vb という名前のファイルの中を覗いて
フォームの中で「販売TableAdapter」と「DataSet1」がどういう風に生成されているかを
調べてみてください。
One.net
大ベテラン
会議室デビュー日: 2008/03/01
投稿数: 202
投稿日時: 2008-04-22 11:45
テッテさん、いつもありがとうございます。
早速フォーム名.designer.vb の中身を見てみました。ものすごい数のコードが記載されていますね。
これだけのコードを自動生成ではなく自分で記述することを考えますとうんざりさせられます。
以下関係してそうな行を以下に貼りつけました。
引用:

Me.販売TableAdapter = New hanbai DataSet1TableAdapters.販売TableAdapter
Me.DataSet1 = New hanbai.DataSet1


このコードを「Module1.vb」のどの部分に、どのように記述すればよいのでしょうか。
お手数ですがよろしくお願いいたします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-04-22 11:57
そもそも、モジュールを使おうとした理由が間違っているのですよ。
オブジェクト指向、インスタンスについて、もう一度調べてみて下さい。




貴方は、目の前の問題を解決したいかもしれない。
私は、貴方が今後質問投稿をしなくてもすむ方法を教えてあげたい。

どっちがいいです?
テッテ
ベテラン
会議室デビュー日: 2008/03/16
投稿数: 91
投稿日時: 2008-04-22 12:40
引用:

One.netさんの書き込み (2008-04-22 11:45) より:
テッテさん、いつもありがとうございます。
早速フォーム名.designer.vb の中身を見てみました。ものすごい数のコードが記載されていますね。
これだけのコードを自動生成ではなく自分で記述することを考えますとうんざりさせられます。
以下関係してそうな行を以下に貼りつけました。
引用:

Me.販売TableAdapter = New hanbai DataSet1TableAdapters.販売TableAdapter
Me.DataSet1 = New hanbai.DataSet1


このコードを「Module1.vb」のどの部分に、どのように記述すればよいのでしょうか。
お手数ですがよろしくお願いいたします。



このコードをそのまま貼り付けてエラーになるのは当たり前です。
それがわからないのであれば、基本的な知識が不足していると言わざるを得ません。
前のレスに書いた通り「ローカル変数として宣言して」ください。

Jitta さんの発言に対しては、私も全く同意です。
私も前のレスをつけるときに Jitta さんが書いていらっしゃるようなことを
書こうかとも思ったのですが、とりあえず「目の前の問題を解決」する方法を提示しました。
できれば、オブジェクト指向についてもう少ししっかり勉強されることを
私もお勧めしておきます。
でないと、これからもわからないことだらけだと思います。
One.net
大ベテラン
会議室デビュー日: 2008/03/01
投稿数: 202
投稿日時: 2008-04-22 20:39
Jittaさん、テッテさん、
早速の回答いただきながら昼から外出しておりまして返事が遅くなり大変失礼いたしました。ご回答いただきました内容につきましては明日十分検討いたしましてその結果を報告いたしますが、大変さびしい思いをいたしておりますのが正直な感想です。
取り急ぎお礼を申し上げます。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-04-23 20:23
引用:

One.netさんの書き込み (2008-04-22 20:39) より:
ご回答いただきました内容につきましては明日十分検討いたしましてその結果を報告いたしますが、大変さびしい思いをいたしておりますのが正直な感想です。


 「大変さびしい思い」とは、どういうことでしょう?「なぜ教えてくれないのだろう?」と言うことでしょうか。もしそうでしたら、私もさびしいです。「なぜ自分で解決しようと努力をしないのだろう?」

 少なくともここは、質問をして答えをもらうところではありません。情報交換の場です。「これこれこうするとうまく動かない」という情報に対して、「これこれこうすると動くようになるんじゃない?」という情報を提供する場です。

 このように、情報交換という意味で。
 私はOne.netさんの質問から、「One.net」というハンドルを使っていらっしゃる方にはオブジェクト指向や、特にインスタンスについての知識が足りていないという情報を得ました。この情報に対して「インスタンスについて調べ直してみて」という情報を提供します。
 別な言い方をすると、One.netさんが提供してくださった情報の価値に見合う、「インスタンスについて勉強してください」という情報を提供します。

 私はこれが正当な情報の対価だと思っているのですが、ご不満なようなので、情報量を増しましょう。

 まず、今回のご質問に至った「印刷のPrintString部を何回も使用する」というところ。このように、質問に至った理由が書いてあるのは、非常によいことです。これにより、直接答えられなくても、回避方法を提供することができます。しかし、今回は残念ながら、この意味がよくわかりませんでした。「何回も使用する」というのは、誰が使用するのでしょう?ユーザは、何回も使用するはずです。つまり、印刷という作業を、1回だけしかしないということはないでしょう。しかし、それはモジュールを利用するという理由になり得ません。
 では、使うのは開発者なのでしょう。「何回も使用する」というのは、「同じようなコードを何回も書くことになる」という意味なのでしょう。あるいは、「様々な箇所から同一のメソッドをコールしたい」ということでしょう。しかし、これでもやはり、モジュールを使用する理由にはなり得ません。
 このように、この一文から、VB を使用してプログラミングを行うために必要な知識が欠けていると判断しました。この知識を補うことで、これ以降に書かれている問題は解決すると判断します。

 ではどうしましょうか。1つは、単一のインスタンスをアプリケーション内で共有することです。1つは、クラス メソッドを作成することです。どちらもモジュールを使う必要はありません。


 ところで、22日の10時頃に質問されて、1日経っても解決できていないようです。掲示板で質問をするというのは、そういうものです。
 しかし、自分で解決できるようになる、少なくともこのケースの場合だと、ローカル変数について調べていれば、おそらく1時間ほどで解決していたと思います。「今後質問投稿をしなくてもすむ方法」というのは、そういうことです。
 もう一度伺いますが、あなたにとって、どちらが好ましいですか?あなたがこの問題を解決するために使う1時間にかかるお金は、あなたの時給の数倍あるはずです。そのことを念頭に、考え、選んでください。その選択を尊重しましょう。
 しかし、選択する前に考えてください。選択は自由です。しかし、選択の結果を選ぶことはできません。前者、目の前の問題が解決できればいい、を選ぶと、今後も質問を繰り返し、時間を浪費することになるでしょう。後者、質問をしなくてもよくなる方法を選べば、今後質問をする回数は減り、時間を浪費することはなくなるでしょう。

 さて、どちらを選ばれますか?
テッテ
ベテラン
会議室デビュー日: 2008/03/16
投稿数: 91
投稿日時: 2008-04-24 12:33
標準モジュールを使うべきかについては、Jitta さんが説明してくださっているので、
私から、今回の本題の部分について補足しておきます。

Visual Studio の IDE は非常に便利で、
サーバ・エクスプローラからテーブルをフォーム デザイナにドラッグ&ドロップするだけで
型付のデータセットや、TableAdapter、BindingSource、BindingNavigator、
入力コントロールなどを自動的に作成してくれます。
これはこれで良い機能だとは思うのですが、この機能は
仕組みがわかっていない人でもプログラムを作れるというようなものではありません。
確かに単純な入力処理だけなら誰でも作れるかも知れませんが、
少し特殊な処理を入れようとすると、仕組みを理解していないと全くわからなくなります。
この機能はそうではなくて、仕組みわかっている人が使う機能で、
手でコードを書く手間を軽減してくれるというものだと、私は思っています。
ですからどういう仕組みで動いているのかは非常に重要です。
そしてその鍵は、One.net さんが既に確認されたように
「フォーム名.designer.vb」に自動生成されたソースにあります。


さて、今回の質問は以下のような意味だと捉えました。

「フォームだとドラッグ&ドロップができるから TableAdapter を使ったデータの取得が
 できるけど、標準モジュールだとドラッグ&ドロップができないから、
 TableAdapter を使ったデータの取得ができない。」

こういう質問が来たので、私は
One.net さんは仕組みを理解されていないのだと思いました。
そこで、フォーム名.designer.vb ファイルを覗いてくださいというアドバイスをしました。
すぐに使えるサンプルコードを提示することも、もちろん可能でしたが、
私がそういう回答をしていたら、One.net さんは フォーム名.designer.vb を見ることはなかったでしょうし、
仕組みがわからないまま、進んでしまっていましたよね。

今なら理解していただけると思いますが、仕組みを理解している人から見れば
標準モジュールだから(あるいはドラッグ&ドロップができないから)
TableAdapter を使ったデータの取得ができないというのはナンセンスです。
フォームにはドラッグ&ドロップにより、
Visual Studio が自動的にコードを生成してくれる機能がありますが、
標準モジュールにはその機能がないだけです。
ということは、標準モジュールで同じことをやろうと思ったら、
Visual Studio が生成したコードに相当するコードを、手で書いてやればいいということになります。


また、2つ目の返信

引用:

このコードを「Module1.vb」のどの部分に、どのように記述すればよいのでしょうか。
お手数ですがよろしくお願いいたします。


つまりこの部分に対する返信でも同じです。
サンプルコードを提示することも可能でしたが、私はあえてそうしませんでした。
「ローカル変数として宣言して」というヒントのみを提供しました。
そこから先は自分で調べた方が良いと思ったからです。


One.net さんが何を「さびしい」と感じておられるのかはわかりませんが、
私が具体的な回答を避けたのは、こういった理由からです。
ヒントだけでは伝えにくいようなケースでは、
サンプルコードを示したり、具体的なアドバイスを行うこともありますが、
何でもかんでも具体的な回答をすればよいというものではないと、私は思っています。

One.net さんが、私の出したヒントを元に、
自分で調べて学習することによってこの問題を解決することで、
ステップアップしてくだされば、回答者としてとても嬉しく思います。

スキルアップ/キャリアアップ(JOB@IT)