none
データテーブルの登録の仕方につきまして RRS feed

  • 質問

  •  
    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) 

    2013年4月2日 4:18

回答

  • 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
    2013年4月3日 0:46
    モデレータ

すべての返信

  • 逆にお聞きしたいのですが、そこまで出来ているのでしたら、なぜ複数のデータテーブルに取得する方法がわからないのでしょうか? 得意先コードを変えながら、保存するデータテーブルを変えていくだけだと思うのですが・・・。 つまずかれているところを具体的に教えていただければ、解決が早いと思います。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2013年4月2日 4:49
    モデレータ
  • trapemiyaさん ありがとうございます。  Adapter.Fill(dt) をどう変更するのかが分かりません。まとめて登録する方法から取引先コードを変更しながら、データテーブルを作成していく方法が分かりません。

    2013年4月2日 5:01
  • パラメータが@取引先コードですから、複数の取引先があった場合、上記に掲載されたコードを、その取引先数分の回数、実行されていると思います。例えば、取引先が3つでしたら、上記の掲載されたコードを取引先コードを変えながら3回実行していると思います。
    Adapter.Fill(dt) 
    は、データテーブルに追加という動作しかしませんから、その3回分の累積がdtに格納されていることになります。

    ここまで理解されたのであれば、dtをそれぞれの取引先専用に用意すれば良いことになります。取引先の数は不定だと思いますので、Fillする度に動的にdtのインスタンスを作成し、それをList(Of T)といったコレクションや、配列に入れて管理すれば良いでしょう。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2013年4月2日 5:49
    モデレータ
  • trapemiyaさん

    回答頂きましてありがとうございます。

    Fillする度に動的にdtのインスタンスを作成し、それをList(Of T)といったコレクションや、配列に入れて管理 とあります。参考になるサイトやサンプル等ありましたら、ご教授ください。

    宜しくお願いします

    2013年4月2日 13:16
  • 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
    2013年4月3日 0:46
    モデレータ
  • 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
    2013年4月3日 4:48
  • bttn_宛名データ作成テスト_Clickでやっていることはあくまでテストです。テストとして、IDが1と2と3の取引先についてデータテーブルを作成しています。

    宛名データテーブル一覧でやっていることは、上記で正しく3つのデータテーブルが作成されたかの確認です。

    本質は、宛名データテーブル一覧におけるコードであり、bttn_宛名データ作成テスト_Click、および宛名データテーブル一覧で行っていることは、宛名データテーブル一覧が正しく動いているかのテストを行っているに過ぎません。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2013年4月3日 5:03
    モデレータ
  • 初歩的な事ですみませんが、宛名データ抽出(ID:=1) を行うと、宣言されていないと表示されます。

    dim で定義する必要がありますか?


    • 編集済み qk_p 2013年4月3日 5:25
    2013年4月3日 5:24
  • 何が宣言されていないと表示されますか? その「何」がコード上、どこにも無いのです。

    宛名データ抽出(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/

    2013年4月3日 6:06
    モデレータ
  • コードを見直したら正確に記述していませんでした。すみませんでした。また質問をさせていただく際に宜しくお願いします。

    2013年4月3日 6:31