Microsoft Access 掲示板

レコードの抽出について

26 コメント
views
4 フォロー

いつもお世話になっております。
”月間請求書履歴”というフォルダから”データ”という請求書を蓄積しているフォルダに保存させるべきVBAを書いたのですがエラーがでてしまいます。
SQLステートメントが正しくありません。'DELETE','INSERT',
'PROCEDURE','SELECT',または'UPDATE'を使用して下さい
と。

Private Sub コマンド25_Click()
          
    Dim cnn As ADODB.Connection
    Dim rs As ADODB.Recordset
    
    Dim cnn1 As ADODB.Connection
    Dim rs1 As ADODB.Recordset
    
    Set cnn = Application.CurrentProject.Connection
    Set rs = New ADODB.Recordset
    
    Set cnn1 = Application.CurrentProject.Connection
    Set rs1 = New ADODB.Recordset
    
    rs.Open "月間請求書履歴", cnn, adOpenKeyset, adLockOptimistic  'テーブルを開く
    rs1.Open "データ", cnn1, adOpenKeyset, adLockOptimistic
    
    rs1.MoveFirst
    Do Until rs1.EOF
    
    rs1.AddNew
    
    rs!請求書NO = rs1!請求書NO
    rs!請求日 = rs1!請求日
    rs!会社名 = rs1!会社名
    rs!氏名 = rs1!氏名
    rs!現場名 = rs1!現場名
    rs!工事名 = rs1!工事名
    rs!請求金額 = rs1!請求金額
    
    rs.Update
    rs.MoveNext
    Loop
    
    rs.Close
    Set rs = Nothing
    
    cnn.Close
    Set cnn = Nothing
    
    rs1.Close
    Set rs1 = Nothing
    
    cnn1.Close
    Set cnn1 = Nothing
    
    DoCmd.OpenForm "請求書履歴"
 End Sub

10行目のこの時点 
rs.Open "月間請求書履歴", cnn, adOpenKeyset, adLockOptimistic
エラーになってしまい進めません。どこでどう間違いが起きているのか正直わかりません
基本的なことなのかもしれませんがよろしくお願いします。

mikami
作成: 2019/10/30 (水) 11:10:21
最終更新: 2019/10/30 (水) 11:10:21
通報 ...
1

 ”月間請求書履歴”というフォルダから”データ”という請求書を蓄積しているフォルダに保存させるべきVBAを書いた

上記のフォルダというのはテーブルのタイプミスですか。
”月間請求書履歴”と"データ"というテーブルがあるということですか。

 rs.Open "月間請求書履歴", cnn, adOpenKeyset, adLockOptimistic
エラーになってしまい進めません。

"月間請求書履歴"というテーブルがないとエラーになりますが、存在しますか。

2
mikami 2019/10/30 (水) 15:48:48 修正 df96b@a036a

返信ありがとうございます。
クエリにはあるのですがテーブルに月間請求書履歴というものはありません。

テーブルには請求書と請求書明細があり、クエリで月間請求書履歴になっています。
’データ’テーブルは単独でどこにも属していません

ちょっとやってみようと思います。

3

"月間請求書履歴"クエリはあるのですね。
ならば、そのクエリは開いてデータをみることができますか。

また"データ"テーブルは存在していますか。

4
mikami 2019/10/31 (木) 08:16:29 修正 df96b@a036a

おはようございます
”データ”テーブルはあります。ただ月間請求書履歴のクエリの中には”データ”テーブルの情報はありません。
フィールド名は統一してありますがあくまでも”月間請求書履歴”の情報を”データ”に蓄積がメインだったもので。
”データ”はリレーションシップも設定しておらず本当に単独テーブルです
画像1

5
hatena 2019/10/31 (木) 09:29:44 修正

"月間請求書履歴"クエリをダブルクリックして開いてデータを見ることはできますか。
これについて回答ください。

あと、
s.Open "月間請求書履歴", cnn, adOpenKeyset, adLockOptimistic
でエラーになって進めないということなんですが、
それ以外の部分で間違っている部分がありますので、
コードを下記に修正してください。

Private Sub コマンド25_Click()
          
    Dim cnn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim rs1 As ADODB.Recordset
    
    'Connectionは一つで共有する
    Set cnn = Application.CurrentProject.Connection
    Set rs = New ADODB.Recordset
    Set rs1 = New ADODB.Recordset
    
    rs.Open "月間請求書履歴", cnn, adOpenKeyset, adLockOptimistic  'テーブルを開く
    rs1.Open "データ", cnn, adOpenKeyset, adLockOptimistic
    
    rs.MoveFirst '"月間請求書履歴"(rs)の先頭レコードへ移動
    Do Until rs.EOF
        '"月間請求書履歴"(rs)のデータを"データ"(rs1)に新規追加
        rs1.AddNew
        rs1!請求書NO = rs!請求書NO
        rs1!請求日 = rs!請求日
        rs1!会社名 = rs!会社名
        rs1!氏名 = rs!氏名
        rs1!現場名 = rs!現場名
        rs1!工事名 = rs!工事名
        rs1!請求金額 = rs!請求金額
        rs1.Update
        '"月間請求書履歴"(rs)を次レコードへ移動
        rs.MoveNext
    Loop
    
    rs.Close
    Set rs = Nothing
    rs1.Close
    Set rs1 = Nothing
    
    cnn.Close
    Set cnn = Nothing
    
    DoCmd.OpenForm "請求書履歴"
 End Sub
6
mikami 2019/10/31 (木) 15:56:59 df96b@a036a

回答ありがとうございます。申し訳ありませんが月間請求書履歴をダブルクリックしてデータというのは”データ”テーブル云々の話ではなく、請求書のデータということで合ってますか?ダブルクリックしたら見れます。
上記のコードを試してみます。

7

エラーメッセージから判断するに "月間請求書履歴" クエリでエラーが発生しているので、このクエリの設計に問題があるか確認するために、まずは、このクエリを開いて正しくデータが表示できるかどうか確かめるのは、最初にすべき確認事項です。
このクエリがパラメータクエリということはないですよね。

8
mikami 2019/10/31 (木) 16:20:17 df96b@a036a

はいそうです。

上記のコードを試してみたところ
 rs1!請求書NO = rs!請求書NO 
で、要求された名前、または序数に対応する項目がコレクションでみつかりませんとでました。
請求書NOがないはずはないのですが・・・

9

rs1!請求書NO = rs!請求書NO 
で、要求された名前、または序数に対応する項目がコレクションでみつかりませんとでました。

ということは、
rs.Open "月間請求書履歴", cnn, adOpenKeyset, adLockOptimistic
の部分はエラーなく通過したということですね。
一歩前進です。

エラーメッセージから"月間請求書履歴"クエリまたは"データ"テーブルに「請求書NO」フィールドがないということしか考えられません。両方に「請求書NO」フィールドが存在するか、もう一度確認してみてください。「請求書NO」とNOが全角になっていてもだめですよ。

どちらにも「請求書NO」が存在するということなら、「月間請求書履歴」クエリのSQL文をコピーしてここに貼り付けてください。

10
mikami 2019/11/01 (金) 10:40:05 df96b@a036a

ご迷惑をおかけします。
月間請求書履歴クエリのSQLです

SELECT 請求書メイン.請求書NO, 請求書メイン.請求日, 宛先マスタ.会社名, 宛先マスタ.部署, 宛先マスタ.氏名, 現場.現場名, 請求書メイン.工事名, 請求書メイン.請求状況CD, 請求書メイン.請求金額
FROM 宛先マスタ INNER JOIN (現場 INNER JOIN 請求書メイン ON 現場.現場ID = 請求書メイン.現場ID) ON 宛先マスタ.宛先ID = 請求書メイン.宛先ID
WHERE (((請求書メイン.請求日)>=#11/1/2019# And (請求書メイン.請求日)<=#11/15/2019#));

12

呈示されている情報だけから原因を特定するのはむずかしそうです。
さしつかえなければ、右のファイル送信フォームから現状のファイルを送信してもらえますか。
エラーの再現できる最低限のテーブルデータとコードのみのファイルをZIPファイルにして、それを添付して送信してください。

13

送信ファイルを確認しました。
質問のコードでは、

    rs.Open "月間請求書履歴", cnn, adOpenKeyset, adLockOptimistic  'テーブルを開く

となってますが、ファイルのコードは、

    rs.Open "月間日報履歴", cnn, adOpenKeyset, adLockOptimistic

となっており、クエリ名が異なってます。"月間日報履歴"クエリには"請求書NO"フィールドはないので当然エラーになります。

"月間日報履歴"を"月間請求書履歴"に変更したらエラーなく実行されました。

14
mikami 2019/11/06 (水) 15:43:31 df96b@a036a

早速見て頂きありがとうございます。
直してみたらできました。
 最初はシンプルなものだったのですが、あれもこれもと機能を足していったら複雑化してました。今回、ファイルを送る時に整理をしてみたら明らかに必要のないファイルも紛れており、見直すいい機会になりました。
本当に助かりました。ありがとうございました。

15
mikami 2020/03/30 (月) 10:17:01 df96b@d54d5

いつもお世話になっております。以前この件でお世話になったものです。
テーブル、クエリ等の名前が紛らわしくこのファイルをコピペして新しいものを作り直したら以下のようにしたら
また同じところでエラーがでてしまいました。上を見直して色々やってみたのですが
”テーブルを開く”と書いてありますがクエリでも大丈夫ということでしたよね。
すみませんがよろしくお願いします。

変更点
月間請求書履歴→Q_月間請求書履歴
データ→T_seikyu
請求書履歴→F_seikyu

Private Sub コマンド25_Click()
 Dim a As String
    a = MsgBox("請求書履歴に登録しますか。はいを押すと請求書履歴に保存されます。", vbOKCancel)
    
    If a = vbCancel Then
    MsgBox ("中止しました")
    Exit Sub
    End If
    
   Dim cnn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim rs1 As ADODB.Recordset
    
    'Connectionは一つで共有する
    Set cnn = Application.CurrentProject.Connection
    Set rs = New ADODB.Recordset
    Set rs1 = New ADODB.Recordset
    
    rs.Open "Q_月間請求書履歴", cnn, adOpenKeyset, adLockOptimistic  'テーブルを開く
    rs1.Open "T_seikyu", cnn, adOpenKeyset, adLockOptimistic
    
    rs.MoveFirst '"月間請求書履歴"(rs)の先頭レコードへ移動
    Do Until rs.EOF
        '"月間請求書履歴"(rs)のデータを"データ"(rs1)に新規追加
        rs1.AddNew
        rs1!請求書NO = rs!請求書NO
        rs1!請求日 = rs!請求日
        rs1!会社名 = rs!会社名
        rs1!氏名 = rs!氏名
        rs1!現場名 = rs!現場名
        rs1!工事名 = rs!工事名
        rs1!請求金額 = rs!請求金額
        rs1.Update
        '"月間請求書履歴"(rs)を次レコードへ移動
        rs.MoveNext
    Loop
    
    rs.Close
    Set rs = Nothing
    rs1.Close
    Set rs1 = Nothing
    
    cnn.Close
    Set cnn = Nothing
    
    DoCmd.OpenForm "F_seikyu"

End Sub



16

どのコードでエラーになりますか。

17
mikami 2020/03/31 (火) 11:03:24 fbb2a@d54d5

おはようございます
下記の部分になります。SQLステートメントが正しくありません。'DELETE,'INSERT',・・・と続きます

rs.Open "Q_月間請求書履歴", cnn, adOpenKeyset, adLockOptimistic  'テーブルを開く
18

「Q_月間請求書履歴」クエリのSQLを提示してもらえますか。

19
mikami 2020/04/01 (水) 08:41:54 fbb2a@d54d5

おはようございます。

SELECT T_請求書メイン.請求書NO, T_請求書メイン.請求日, T_宛先マスタ.会社名, T_宛先マスタ.部署, T_宛先マスタ.氏名, T_現場.現場名, T_請求書メイン.工事名, T_請求書メイン.請求金額, T_請求書メイン.請求状況CD, T_請求状況.内容
FROM T_宛先マスタ INNER JOIN (T_請求状況 INNER JOIN (T_現場 INNER JOIN T_請求書メイン ON T_現場.現場ID = T_請求書メイン.現場ID) ON T_請求状況.請求状況CD = T_請求書メイン.請求状況CD) ON T_宛先マスタ.宛先ID = T_請求書メイン.宛先ID
WHERE (((T_請求書メイン.請求日)>=#3/21/2020# And (T_請求書メイン.請求日)<=#4/30/2020#));

に、なります。よろしくお願いします。

20

「Q_月間請求書履歴」クエリをダブルクリックで開いた場合はエラーなく開けますか。

もし、開けるなら、呈示されている情報だけでは、やはり、原因を特定するのは難しいですね。
前のようにファイルを送信フォームから送ってもらえますか。

21
mikami 2020/04/02 (木) 08:53:02 fbb2a@d54d5

おはようございます。ファイル送信致しました。よろしくお願いします。

22

mikamiさん、まだファイルが届いてません。送信に失敗しているかもしれませんので、もう一度送信してもらえますか。

23
mikami 2020/04/03 (金) 08:39:58 fbb2a@d54d5

おはようございます。送信致しました。今回は届いていると思います。よろしくお願いします。

24

おはようございます。今回は届いていました。
動化確認してみましたら、確かにそのエラーがでますね。クエリも普通に開けるので特に問題はないですね。

ためしに、ADODBの処理をDAOに書き直してみましたら、エラーなく実行できるようになりました。

Private Sub コマンド25_Click()
 Dim a As String
    a = MsgBox("請求書履歴に登録しますか。はいを押すと請求書履歴に保存されます。", vbOKCancel)
    
    If a = vbCancel Then
    MsgBox ("中止しました")
    Exit Sub
    End If
    
   Dim DB As DAO.Database
    Dim rs As DAO.Recordset
    Dim rs1 As DAO.Recordset
    
    'Connectionは一つで共有する
    Set DB = Application.CurrentDb
    Set rs = DB.OpenRecordset("Q_月間請求書履歴", dbOpenForwardOnly, dbReadOnly)
    Set rs1 = DB.OpenRecordset("T_seikyu", dbOpenDynaset, dbAppendOnly)
       
    Do Until rs.EOF
        '"月間請求書履歴"(rs)のデータを"データ"(rs1)に新規追加
        rs1.AddNew
        rs1!請求書NO = rs!請求書NO
        rs1!請求日 = rs!請求日
        rs1!会社名 = rs!会社名
        rs1!氏名 = rs!氏名
        rs1!現場名 = rs!現場名
        rs1!工事名 = rs!工事名
        rs1!請求金額 = rs!請求金額
        rs1.Update
        '"月間請求書履歴"(rs)を次レコードへ移動
        rs.MoveNext
    Loop
    
    rs.Close
    Set rs = Nothing
    rs1.Close
    Set rs1 = Nothing
    
    DB.Close
    Set DB = Nothing
    
    DoCmd.OpenForm "F_seikyu"

End Sub

なぜ、ADODBでは失敗するのかは原因が分かりませんが、DAOの方がAccessのテーブルとは相性がいいと思います。

25
mikami 2020/04/03 (金) 15:13:29 fbb2a@d54d5

できました。本当に助かりました。DAOの方も、少し勉強したいと思います。
ありがとうございました。

26

解決したようなので閉じます。