トップ回答者
データテーブルの登録の仕方につきまして

質問
-
VS2010PROを用いて、宛名印刷プログラムを作っています。
フォームで取引先情報をアクセスから検索し、データテーブルにしています。
印刷する取引先が単数(1社)でも複数(2社以上)でも、1つのデータテーブルにしていますが、
複数(2社以上)の取引先を印刷する場合に関して、複数のデータテーブルとして登録することは出来るのでしょうか?
(現在のコードですと、印刷する得意先が単数でも複数でも、1つのデータテーブルに登録されます)たとえば、3社の取引先を印刷する場合、異なる取引先を3件登録し、印刷枚数も異なる枚数にして、
それを1つのデータテーブル(DT)にしていますが、DT1、DT2、DT3と言ったように登録したく思いますが
可能でしょうか?
DT1と2と3ですが、それぞれ異なる得意先で、それぞれ印刷枚数も異なります。
ご教授ください。宜しくお願いします 。
Dim Cn As New OleDbConnection
Dim Command As OleDbCommand = New OleDbCommand
Dim OLEDBCon As OleDb.OleDbConnection = _
New OleDb.OleDbConnection
OLEDBCon.ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Form3.TextBox4.Text & ";" & _
"Persist Security Info=False"
Command.Connection = OLEDBCon
Command.CommandText = "select 郵便,住所①,住所②,取引先コード,取引先名,0 as 枚数 from 取引先T where 取引先コード = @取引先コード "
Command.Parameters.AddWithValue("@取引先コード", TextBox1.Text)
Dim Adapter As OleDbDataAdapter = New OleDbDataAdapter
Adapter.SelectCommand = Command
Adapter.Fill(dt)
回答
-
Listではなく、Dictionaryを使ってサンプルを書きました。
(参考)
Dictionaryを利用@VB.Net
http://www.cocoaliz.com/vb.net/index/51/'データテーブルを格納するDictonaryを定義。 Dim dict宛名DT As New Dictionary(Of Integer, DataTable) Private Sub bttn_宛名データ作成テスト_Click(sender As System.Object, e As System.EventArgs) Handles bttn_宛名データ作成.Click 'ID = 1を抽出 宛名データ抽出(ID:=1) 'ID = 2を抽出 宛名データ抽出(ID:=2) 'ID = 3を抽出 宛名データ抽出(ID:=3) End Sub Private Sub 宛名データ抽出(ID As Integer) Using cnn As New OleDbConnection Using cmd As New OleDbCommand Using adapter As New OleDbDataAdapter cnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\db1.mdb;Persist Security Info=Fals" cmd.Connection = cnn 'データテーブルに印刷枚数を保持する列 cmd.CommandText = "select ID, 氏名, '様' as 敬称, 住所 from 名簿 where ID = @ID" cmd.Parameters.AddWithValue("@ID", ID) adapter.SelectCommand = cmd 'データテーブルを新しく作成し、それをDictionaryに格納。格納したデータテーブルを識別するキー値はIDとする。 dict宛名DT.Add(ID, New DataTable) '上記で作成したデータテーブルにFillする。 adapter.Fill(dict宛名DT(ID)) End Using End Using End Using End Sub Private Sub bttn_宛名データテーブル一覧_Click(sender As System.Object, e As System.EventArgs) Handles bttn_宛名データテーブル一覧.Click 'Keyと値の取り出し For Each keyValue As KeyValuePair(Of Integer, DataTable) In dict宛名DT System.Diagnostics.Debug.WriteLine("取引先のID : {0}", keyValue.Key) For Each row As DataRow In keyValue.Value.Rows System.Diagnostics.Debug.WriteLine("氏名 : {0}", row("氏名")) Next Next End Sub
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
- 回答としてマーク qk_p 2013年4月3日 6:32
すべての返信
-
パラメータが@取引先コードですから、複数の取引先があった場合、上記に掲載されたコードを、その取引先数分の回数、実行されていると思います。例えば、取引先が3つでしたら、上記の掲載されたコードを取引先コードを変えながら3回実行していると思います。
Adapter.Fill(dt)
は、データテーブルに追加という動作しかしませんから、その3回分の累積がdtに格納されていることになります。ここまで理解されたのであれば、dtをそれぞれの取引先専用に用意すれば良いことになります。取引先の数は不定だと思いますので、Fillする度に動的にdtのインスタンスを作成し、それをList(Of T)といったコレクションや、配列に入れて管理すれば良いでしょう。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
-
Listではなく、Dictionaryを使ってサンプルを書きました。
(参考)
Dictionaryを利用@VB.Net
http://www.cocoaliz.com/vb.net/index/51/'データテーブルを格納するDictonaryを定義。 Dim dict宛名DT As New Dictionary(Of Integer, DataTable) Private Sub bttn_宛名データ作成テスト_Click(sender As System.Object, e As System.EventArgs) Handles bttn_宛名データ作成.Click 'ID = 1を抽出 宛名データ抽出(ID:=1) 'ID = 2を抽出 宛名データ抽出(ID:=2) 'ID = 3を抽出 宛名データ抽出(ID:=3) End Sub Private Sub 宛名データ抽出(ID As Integer) Using cnn As New OleDbConnection Using cmd As New OleDbCommand Using adapter As New OleDbDataAdapter cnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\db1.mdb;Persist Security Info=Fals" cmd.Connection = cnn 'データテーブルに印刷枚数を保持する列 cmd.CommandText = "select ID, 氏名, '様' as 敬称, 住所 from 名簿 where ID = @ID" cmd.Parameters.AddWithValue("@ID", ID) adapter.SelectCommand = cmd 'データテーブルを新しく作成し、それをDictionaryに格納。格納したデータテーブルを識別するキー値はIDとする。 dict宛名DT.Add(ID, New DataTable) '上記で作成したデータテーブルにFillする。 adapter.Fill(dict宛名DT(ID)) End Using End Using End Using End Sub Private Sub bttn_宛名データテーブル一覧_Click(sender As System.Object, e As System.EventArgs) Handles bttn_宛名データテーブル一覧.Click 'Keyと値の取り出し For Each keyValue As KeyValuePair(Of Integer, DataTable) In dict宛名DT System.Diagnostics.Debug.WriteLine("取引先のID : {0}", keyValue.Key) For Each row As DataRow In keyValue.Value.Rows System.Diagnostics.Debug.WriteLine("氏名 : {0}", row("氏名")) Next Next End Sub
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
- 回答としてマーク qk_p 2013年4月3日 6:32
-
trapemiyaさん
ありがとうございます。質問がございます。
Private Sub bttn_宛名データ作成テスト_Click(sender As System.Object, e As System.EventArgs) Handles bttn_宛名データ作成.Click 'ID = 1を抽出
宛名データ抽出(ID:=1)
'ID = 2を抽出
宛名データ抽出(ID:=2)
'ID = 3を抽出
宛名データ抽出(ID:=3)
End Subご教授ください
→上記は何の為にやっているのでしょうか?Private Sub bttn_宛名データテーブル一覧_Click(sender As System.Object, e As System.EventArgs) Handles bttn_宛名データテーブル一覧.Click
'Keyと値の取り出し
For Each keyValue As KeyValuePair(Of Integer, DataTable) In dict宛名DT
System.Diagnostics.Debug.WriteLine("取引先のID : {0}", keyValue.Key)
For Each row As DataRow In keyValue.Value.Rows
System.Diagnostics.Debug.WriteLine("氏名 : {0}", row("氏名"))
Next
Next
End Sub→上記は何の為にやっているのでしょうか?
ご教授ください。
- 編集済み qk_p 2013年4月3日 4:49
-
bttn_宛名データ作成テスト_Clickでやっていることはあくまでテストです。テストとして、IDが1と2と3の取引先についてデータテーブルを作成しています。
宛名データテーブル一覧でやっていることは、上記で正しく3つのデータテーブルが作成されたかの確認です。
本質は、宛名データテーブル一覧におけるコードであり、bttn_宛名データ作成テスト_Click、および宛名データテーブル一覧で行っていることは、宛名データテーブル一覧が正しく動いているかのテストを行っているに過ぎません。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
-
何が宣言されていないと表示されますか? その「何」がコード上、どこにも無いのです。
宛名データ抽出(ID:=1)は、パラメータがはっきりするようにわかりやすく書いたつもりですが、宛名データ抽出(1)でかまいません。
(参考)
位置と名前による引数渡し
http://msdn.microsoft.com/ja-jp/library/vstudio/51wfzyw0(v=vs.90).aspxところで、
Private Sub 宛名データ抽出(ID As Integer)
という、関数は正しく記述されていますか?初歩的な事と認識されているようですが、さすがにここは基本的なことですのでもう少し考えてみて下さい。申し訳ないですが、このレベルでやり取りを行うと、やり取が異常に長くなってしまいます。
基本的なことはフォーラムでご質問される前に、書籍やネットの記事で調べることができるはずです。
厳しいことを言って申し訳ありませんが、よろしくお願いいたします。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/