よろしくお願いします。
ADOでSQLにてレコードセットを開こうとしています。
テーブル「tbl請求_合算Sub」(フィールドが多いので関連するフィールドのみ表示)
合算請求書番号(主キー)
SubID(主キー)
請求単価
合算請求書特殊行
消費税率
コード
Dim cn As New ADODB.Connection
Dim rs_sub_total As New ADODB.Recordset
Dim Num As String
cn.Open 省略
rs_sub_total.CursorLocation = adUseClient
rs_subtotal.Open "TRANSFORM SUM(請求単価) AS 請求金額 " &
"SELECT 消費税率, SUM(請求単価) AS 請求金額 " & _
"FROM tbl請求合算Sub " &
"WHERE 合算請求書番号 = '" & Num & "' AND 消費税率 IS NOT NULL " &
"GROUP BY 消費税率 " &
"ORDER BY 消費税率 " &
"PIVOT 合算請求書特殊行;",
cn, adOpenKeyset, adLockOptimistic
請求単価付近に不適切な構文があります、とエラーになります。
構文は間違ってなさそうなので、よくわかりませんでした。
実行できないのでなんともいえませんが、下記リンク先の内容から考えるに、SELECT下の「SUM(請求単価) AS 請求金額」必要ないのかな、と思えます。
https://qiita.com/fuk101/items/731379d12cd7f5559fb2
1行目のクロス集計と
TRANSFORM SUM(請求単価) AS 請求金額
2行目の行集計
SUM(請求単価) AS 請求金額
のフィールド名が重複しているのがエラーの原因でしょう。
どちらかフィールド名を変更すればいいでしょう。
すずやん様
hatena様
ありがとうございます。
試してみましたが、
SELECT下の「SUM(請求単価) AS 請求金額」を削除しましたが、ダメでした。
一方のフィールド名を変えてみましたが、ダメでした。
構文エラーですね。
コードを下記に修正してみてください。
1つのコマンド文を改行して記述するときは、行末に 「 _」 (半角スペース+アンダーバー)が必要です。
あと、変数名も途中から間違ってますね。
hatena様
再度、ありがとうございます。
「 _」は全箇所に既に入っております。なぜかサイトの投稿では消えてしまっています。
それと、フィールド名を「クロス請求金額」、「請求金額」にも変更しましたが、同じエラーが出てしまいます。
コードを貼り付けさせていただきました。
ただ、"FROM tbl請求合算Sub " & を
"FROM tbl請求_合算Sub " & に変更しました。(_は実際は半角です。なぜか投稿するとなくなってしまうので全角にしました。)
それでもエラーが出てしまいます。
ADOではクロス集計は出来ないのでしょうか?
まずは、
クエリのデザインビューでご希望の結果になるものを作成して、SQLビューにして、
それとVBAに記述したSQL文に違いがないか確認してみてください。
それで解決しない場合は、
コード文はマークダウン記法のコードブロック内にいれてください。
詳細は下記のページを参照ください。
Microsoft Access 掲示板 の使い方 Microsoft Access 掲示板 - zawazawa
コードをコードブロック内に入れたものを投稿してください。
そのエラーメッセージを正確に提示してください。
「合算請求書番号」フィールドのデータ型も提示してください。
クエリのSQLビューにて確認しました。
SELECT文のところで、「SUM(請求単価) AS 請求金額」が不要だったので削除しましたが、同じエラーが出ます。
cnの省略も省略せずに載せます。
エラーメッセージは、
実行時エラー '-2147217900(80040e14)':
'請求単価' 付近に不適切な構文があります。
合算請求書番号のデータ型は「短いテキスト」です。SQLサーバーリンクで、サーバーの方の型は「nvarchar(255)」です。
よろしくお願いします。
たぶんですが、SQL Serevrでは「TRANSFORM」を使ったクロス集計ができないと思われます(間違っていたらすみません)
ネットで検索してもSQL Serevrを使用した例が出てきません。
SQL Serevrの場合は下記のような手法で行うのではないでしょうか。
https://style.potepan.com/articles/25072.html
すずやん様
調べていただき、ありがとうございます。
SQL Serverでは出来ないのですかね。
ADOでSQL Serverを直接見に行っているので、それをAccessのリンクテーブルを見に行くように変更すればできるか試してみます。
ちなみに、ご提示いただいたリンク先のコード記述をVBAで出来るのでしょうか?
hatena様
すずやん様
出来ました!
Accessリンクテーブル参照のADO接続で出来ました。
やはりSQL Server参照のADO接続ではできませんでした。
大変ありがとうございました。