投稿者 さすが  (社会人) 投稿日時 2019/8/13 17:27:23
魔界の仮面弁士様

何度もご回答誠にありがとうございます。

実際にコードを書き込み、疑問点が出てきました。



Ds.Relations.Add("Rel消費税課税", dt2.Columns("Key"), dt1.Columns("消費税課税"), True)

のところでどうしてもエラーが発生します。

Accessファイルから「クエリ1」を生成し、DataSetに格納するのですが、その方法を、

(1)
  Private Function Createクエリ1() As DataTable

    dt1 = New DataTable("クエリ1")

    Cn = New OleDbConnection
    Rs = New ADODB.Recordset

    Dim SQL As OleDbCommand = Cn1.CreateCommand

    SQL.CommandText = (省略)

    Cn.ConnectionString = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source = kanridata.mdb"
    Cn.Open()

    Da = New OleDb.OleDbDataAdapter(SQL_CLTFee1)

    Da.Fill(dt1)
    Ds.Tables.Add(dt1)

    Return dt1

  End Function

というコードでdt1というDataTableを、Fillし、DataSetにAddし、Returnしてやると、

たくさんの文章がイミディエイトウィンドウに現れて、
「親列および子列に型が一致する列が含まれていません。」
というエラーメッセージ」が現れます。

(2)
    Cn = New ADODB.Connection
    Rs = New ADODB.Recordset

    Cn.CursorLocation = ADODB.CursorLocationEnum.adUseClient
    Cn.ConnectionString = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source = kanridata.mdb"
    Cn.Open()

    dt1 = New DataTable
    dt1.TableName = "クエリ1"

    Dim SQL As String

    SQL = (省略)

    Rs.Open(SQL, Cn)

    Da = New OleDb.OleDbDataAdapter()
    Ds = New DataSet()

    Da.Fill(Ds, Rs, dt1.TableName)

というコードで、"クエリ1"という名のDataTableをDataSetにFillしてやると、

「'column' 引数を Null にすることはできません。」

というエラーメッセージが現れます。

("クエリ1"という名のDataTableがあるのであり、dt1というDataTableがあるわけではないので、
 Nullとかいうエラーになるのは当然ではありますが。)

どこを、どのように直せばいいのでしょうか?

②今回の質問の条件下では、質問のタイトルである

「DataTableから新たなDataTableを生成」

する必要は、どうやらなさそうであることが分かりました。

しかし、あまり書きたくなかったのですが、仮にTableAというテーブルがあるとして、フィールドは、

契約ID|担当者名|取引先名|業務完了日|ナンバリング用フィールド|

とあるとします。

このテーブルから、
〇「行見出し」 = 担当者名
〇「列見出し」 = 業務完了日(8/13とか8/31とか)
〇「値」 = 取引先名をすべて結合した文字列
というクロス集計クエリを生成しようとする場合、

Step1 TableAに、1人の担当者が1日に業務完了させた契約にナンバリングを行う。

Step2 
〇「行見出し」 = 担当者名および業務完了日
〇「列見出し」 = ナンバリングした番号
〇「値」 = 取引先名
というクロス集計クエリ1-1を生成する。

Step3 クエリ1-1の取引先名の文字列全てを結合した「文字列集計列」を追加する。
追加するのではなくこれをクエリで行うならば、そのクエリを仮にクエリ1-2と名付ける。

Step4 クエリ1-1もしくはクエリ1-2から
〇「行見出し」 = 担当者名
〇「列見出し」 = 業務完了日
〇「値」 = 取引先名をすべて結合した文字列
というクロス集計クエリ1-3を生成する。

というステップを踏む必要があると思われ、過去に実際にこれをAccessで行ったことがあります。

これをVBで行う場合、

「DataTableから新たなDataTableを生成」

することは避けて通れないと思います。
しかし、ご教示いただいたコードは未だ、
DataTableから新たなクエリを生成するためのコードとなっていないように感じられました。

再度お願いいたします。

こちらがお示しした条件下で
「DataTableから新たなDataTableを生成」する方法を教えてください。