質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.47%

  • VBA

    1861questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

  • Access

    457questions

    Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

【ACCESS】DoCmd.RunSQLの結果がエラーになる。

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 782

tera_taro

score 36

 前提・実現したいこと

テーブルにSQL実行の結果を保存したい。

チェックボックスを追加する前はエラーにはならなかった。
(CHK_ZEI 非課税選択)

 発生している問題・エラーメッセージ

イメージ説明

 該当のフォーム

frm_derail_trntbl_kobai
イメージ説明
クエリ(サブフォームである明細情報のデータシートのレコードソース)
sub_trntbl_meisai
イメージ説明
a.WORKTBL_KOBAI_MEISAI 
b.MSTTBL_KOBAIHIN

 該当のテーブル

TRNTBL_KOBAI_MEISAI(登録用)
イメージ説明
WORKTBL_KOBAI_MEISAI(入力用)
イメージ説明
MSTTBL_KOBAIHIN(仕様書番号から品名を取得する為使用)
イメージ説明

 該当のソースコード

'標準モジュール
'■購買明細
Public Type TRNTBL_KOBAI_MEISAI
    KANRI_NO                       As String    ' 管理番号
    EDA                            As Long      ' 枝番
    SHIYO_NO                       As String    ' 仕様書番号
    HINMEI                         As String    ' 品名
    TANKA                          As Long      ' 単価
    SURYO                          As Long      ' 数量
    TANI                           As String    ' 単位
    KINGAKU                        As Long      ' 金額
    NOHIN_DATE                     As String    ' 納品日
    BIKO                           As String    ' 備考
    CHK_ZEI                        As Boolean   ' 非課税選択
End Type

'以下サブフォーム Form_sub_trntbl_meisai内の処理

' フォーム:更新前処理
Private Sub Form_BeforeUpdate(Cancel As Integer)
On Error GoTo Err_Proc

    ' 枝番設定
    If (Me.NewRecord) Then
        Me.txt_EDA = Me.CurrentRecord
    End If

Exit_Proc:

    Exit Sub

Err_Proc:
    MsgBox (Err.Number & ", " & Err.Description)
    Resume Exit_Proc
End Sub

' 新規登録処理
Public Function InsertData_Meisai(ByVal i_kanri_no As String) As Boolean
On Error GoTo Err_Proc

    Dim type_KOBAI_MEISAI         As TRNTBL_KOBAI_MEISAI
    Dim strSQL                            As String

    With Me.Recordset

        If Me.Recordset.RecordCount = 0 Then
            MsgBox "「明細情報」が未入力です。", vbExclamation, "必須項目未入力エラー"
            InsertData_Meisai = False
            GoTo Exit_Proc
        End If

        ' 先頭レコードへ
        .MoveFirst

        Do Until Me.Form.Recordset.EOF
            ' 初期化処理
            strSQL = ""

            type_KOBAI_MEISAI.SHIYO_NO = ""
            type_KOBAI_MEISAI.HINMEI = ""
            type_KOBAI_MEISAI.TANKA = 0
            type_KOBAI_MEISAI.SURYO = 0
            type_KOBAI_MEISAI.TANI = ""
            type_KOBAI_MEISAI.KINGAKU = 0
            type_KOBAI_MEISAI.NOHIN_DATE = ""
            type_KOBAI_MEISAI.BIKO = ""
            type_KOBAI_MEISAI.CHK_ZEI = 0

            '===============================================
            ' 保存値設定
            '===============================================
            type_KOBAI_MEISAI.SHIYO_NO = Nz(!SHIYO_NO, "")
            type_KOBAI_MEISAI.HINMEI = Nz(!HINMEI, "")
            type_KOBAI_MEISAI.TANKA = Nz(!TANKA, 0)
            type_KOBAI_MEISAI.SURYO = Nz(!SURYO, 0)
            type_KOBAI_MEISAI.TANI = Nz(!TANI, "")
            type_KOBAI_MEISAI.KINGAKU = Nz(!KINGAKU, 0)
            type_KOBAI_MEISAI.NOHIN_DATE = Nz(!NOHIN_DATE, "")
            type_KOBAI_MEISAI.BIKO = Nz(!BIKO, "")
            type_KOBAI_MEISAI.CHK_ZEI = Nz(!CHK_ZEI, 0)

            '===============================================
            ' SQL文字列生成
            '===============================================
            strSQL = "INSERT INTO TRNTBL_KOBAI_MEISAI ("
            strSQL = strSQL & " KANRI_NO,"
            strSQL = strSQL & " EDA,"
            strSQL = strSQL & " SHIYO_NO,"
            strSQL = strSQL & " HINMEI,"
            strSQL = strSQL & " TANKA,"
            strSQL = strSQL & " SURYO,"
            strSQL = strSQL & " TANI,"
            strSQL = strSQL & " KINGAKU,"
            strSQL = strSQL & " NOHIN_DATE,"
            strSQL = strSQL & " BIKO,"
            strSQL = strSQL & " CHK_ZEI"
            strSQL = strSQL & " )"
            strSQL = strSQL & " VALUES ("
            strSQL = strSQL & "'" & i_kanri_no & "',"
            strSQL = strSQL & Me.CurrentRecord & ","
            strSQL = strSQL & "'" & type_KOBAI_MEISAI.SHIYO_NO & "',"
            strSQL = strSQL & "'" & type_KOBAI_MEISAI.HINMEI & "',"
            strSQL = strSQL & type_KOBAI_MEISAI.TANKA & ","
            strSQL = strSQL & type_KOBAI_MEISAI.SURYO & ","
            strSQL = strSQL & "'" & type_KOBAI_MEISAI.TANI & "',"
            strSQL = strSQL & type_KOBAI_MEISAI.KINGAKU & ","
            strSQL = strSQL & "'" & type_KOBAI_MEISAI.NOHIN_DATE & "',"
            strSQL = strSQL & "'" & type_KOBAI_MEISAI.BIKO & "',"
            strSQL = strSQL & type_KOBAI_MEISAI.CHK_ZEI & ""
            strSQL = strSQL & ")"

            'SQL実行
            DoCmd.RunSQL strSQL

            ' 次レコードへ
            .MoveNext
        Loop

    End With

    InsertData_Meisai = True

Exit_Proc:
   Exit Function
Err_Proc:
    MsgBox (Err.Number & ", " & Err.Description)
    Resume Exit_Proc
End Function

'以下フォーム Form_detail_trntbl_kobai内の処理(上の処理を呼び出す呼び出し元)

'//////////////////////////////////////////////////////////
'
' データ追加処理
'
'//////////////////////////////////////////////////////////
Private Function InsertData() As Boolean
On Error GoTo Err_Proc

    Dim type_KOBAI                               As TRNTBL_KOBAI
    Dim strSQL                                       As String

    '===============================================
    ' 保存値セット
    '===============================================
    Call SetEntryData(type_KOBAI)

    '===============================================
    ' SQL文字列生成
    '===============================================
    strSQL = "INSERT INTO TRNTBL_KOBAI ("
    strSQL = strSQL & " KANRI_NO,"
    strSQL = strSQL & " BUSHO_CD,"
   '文字制限の為省略
    strSQL = strSQL & " HATYU_DATE"
    strSQL = strSQL & " )"
    strSQL = strSQL & " VALUES ("
    strSQL = strSQL & "'" & type_KOBAI.KANRI_NO & "',"
    strSQL = strSQL & "'" & type_KOBAI.BUSHO_CD & "',"
    '文字制限の為省略
    strSQL = strSQL & "'" & type_KOBAI.HATYU_DATE & "'"
    strSQL = strSQL & ")"

    '===============================================
    ' 明細登録
    '===============================================
    ' ■■■■■■■■■■■■■■■■■■■■■■■■
    ' 1)編集明細登録
    ' ■■■■■■■■■■■■■■■■■■■■■■■■
    If (Me.sub_trntbl_meisai.Form.InsertData_Meisai(type_KOBAI.KANRI_NO) = False) Then
        InsertData = False
        GoTo Exit_Proc
    End If

    '===============================================
    ' 更新処理実行
    '===============================================
    'SQL実行
    DoCmd.RunSQL strSQL

    '戻り値セット
    InsertData = True

Exit_Proc:
    Exit Function

Err_Proc:
    MsgBox (Err.Description & ", " & Err.Number)
    InsertData = False
    Resume Exit_Proc
End Function

'////////////////////////////////////////////////////////////////////////////////
'
' データ更新処理
'
'////////////////////////////////////////////////////////////////////////////////
Private Function UpdateData(ByVal i_kanri_no As String) As Boolean

On Error GoTo Err_Proc

    Dim type_KANRI                               As TRNTBL_KOBAI
    Dim strSQL                                       As String

    '===============================================
    ' 保存値セット
    '===============================================
    Call SetEntryData(type_KANRI)

    '================================================
    '
    ' SQL生成
    '
    '================================================
    strSQL = "UPDATE TRNTBL_KOBAI"
    strSQL = strSQL & " SET    BUSHO_CD         = '" & type_KANRI.BUSHO_CD & "',"
    '文字制限の為省略
    strSQL = strSQL & "        HATYU_DATE       = '" & type_KANRI.HATYU_DATE & "'"
    strSQL = strSQL & " WHERE KANRI_NO = '" & i_kanri_no & "'"

    '================================================
    '
    'SQL実行セクション
    '
    '================================================
    'SQL実行
    DoCmd.RunSQL strSQL

    '===============================================
    ' 明細登録
    '===============================================
    ' ■■■■■■■■■■■■■■■■■■■■■■■■
    ' 1)既登録明細削除
    ' ■■■■■■■■■■■■■■■■■■■■■■■■
    Dim strWhere    As String

    ' 抽出条件設定
    strWhere = " WHERE KANRI_NO = '" & m_kanri_no & "'"

    ' 削除処理
    If (DeleteData("TRNTBL_KOBAI_MEISAI", strWhere) = False) Then
        MsgBox "削除処理(経費仕様計画書の明細)でエラーが発生しました。", vbCritical, "更新処理"
        UpdateData = False
        GoTo Exit_Proc
    End If

    ' ■■■■■■■■■■■■■■■■■■■■■■■■
    ' 2)編集明細登録
    ' ■■■■■■■■■■■■■■■■■■■■■■■■
    If (Me.sub_trntbl_meisai.Form.InsertData_Meisai(m_kanri_no) = False) Then
        UpdateData = False
        GoTo Exit_Proc
    End If

    '戻り値セット
    UpdateData = True

Exit_Proc:
    Exit Function

Err_Proc:
    MsgBox (Err.Description & ", " & Err.Number)
    UpdateData = False
    Resume Exit_Proc

End Function

 試したこと

新規登録処理にてSQLの構文に抜かりはないか、
,が正しく使われているか、データ型が正しく使われているか
ブレークポイントを使い試しましたが、どこが間違っているか
分かりませんでした。
イメージ説明

 補足情報(FW/ツールのバージョンなど)

Windows10 ACCESS2016

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

EDAの値が取得できていないのでは?
CurrentRecord はデータの値ではありません。
Form.CurrentRecord プロパティ (Access)

このプロパティの値は、フォームの左下のレコード番号ボックスに表示される値に対応します。

            strSQL = strSQL & Me.CurrentRecord & ","
'↑参照方法が誤ってませんか? ↓こっちでは?
            strSQL = strSQL & Me.Recordset!EDA & ","


以下のようにしておくと、エラー発生時のSQLの内容がイミディエイトウインドウで確認できます。

            Debug.Print strSQL
            'SQL実行
            DoCmd.RunSQL strSQL

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/17 09:30

    >EDAの値が取得できていないのでは?
    同じエラーが出ます。

    >以下のようにしておくと、エラー発生時のSQLの内容がイミディエイトウインドウで確認できます。
    参考になりました。ありがとうございます。

    キャンセル

  • 2018/05/17 09:42

    >同じエラーが出ます。
    InsertData_Meisai()はどのような場合に呼び出されていますか?
    既に登録済みの場合は、削除して追加もしくは更新とする必要がありますが、行っていますか?

    キャンセル

  • 2018/05/17 09:52

    CurrentRecordの値は、表示されている順番での連番です。
    データの値ではありません。
    ※試しにEDAの降順で画面が表示されるようにしてみれば分かると思います。

    キャンセル

  • 2018/05/17 09:59

    InsertData_Meisai()は新規登録、更新登録の時呼び出しています。
    既に登録済みの場合はおっしゃる通り、削除して登録しています。
    該当のソースコードに追加しておきます。

    キャンセル

  • 2018/05/17 10:02

    更新登録時はupdateでなければなりませんから、更新時にinsertすればキー重複になりますけど。

    キャンセル

  • 2018/05/17 10:30

    一旦バックアップを取り、エラーを無視して「はい」を実行したら
    連番も取れていて動くようになりました。

    キャンセル

  • 2018/05/17 11:27

    結局修正はしていないってことですか?

    キャンセル

  • 2018/05/17 12:13

    修正と言っていいか分かりませんが、
    strSQL = strSQL & Me.Recordset!EDA & ","
    と修正してエラーを無視して「はい」以降
    新規登録、更新登録を数回試しましたがエラーが出ることなく、
    思った結果で登録されているのでこれで大丈夫なのだと思っています。

    キャンセル

  • 2018/05/17 13:26 編集

    削除して追加なので、同じループ内でEDAとして同じ値が追加されていたということでしょうから、結果からはループ内でのMe.CurrentRecordでは意図した値が取得できていなかったということになりますね。

    キャンセル

+1

エラーは、キー違反と出てるので、
SQLの内容を見て、登録用のテーブルに既存の複合キーが無いか
確認するのが先決ですね。

あと、気になった点を少しばかり。

1.下記のように各値をクリアしてる下記の箇所ですが、
type_KOBAI_MEISAI.HINMEI = ""
type_KOBAI_MEISAI.TANKA = 0
 
↓のようにクリアすることができます。
Dim type_Empty As TRNTBL_KOBAI_MEISAI
type_KOBAI_MEISAI = type_Empty ’type_Emptyは触らない前提 

2.Nz の処理で、
type_KOBAI_MEISAI.SHIYO_NO = Nz(!SHIYO_NO, "")
としてますが、
type_KOBAI_MEISAI.SHIYO_NO = Nz(!SHIYO_NO, type_KOBAI_MEISAI.SHIYO_NO)
とした方が、間違いにくいのでは、と思います。

3.Type では、CHK_ZEI As Boolean   ' 非課税選択
と定義されてますが、コード上では、
type_KOBAI_MEISAI.CHK_ZEI = Nz(!CHK_ZEI, 0)
等と、Boolean型を、数値として処理されてます。
現時点がテスト段階なのでしょうけども、
処理として不自然さがあります。

以上、ご参考まで。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/17 11:18

    1.2.で言われていること勉強になりました。
    3.で言われている事なのですが、CHK_ZEIはテーブルではYes/No型で
    データ型として書くならどう書けばいいのか悩んだ結果Boolean型に
    なりました。
    その際に数値として判定されるのか文字型として判定されるのか
    分からず、文字型だと認識されなかったので数値にした結果、動作確認
    できたのでそのままにしているのですが何が不自然なのでしょうか?
    type_KOBAI_MEISAI.CHK_ZEI = Nz(!CHK_ZEI, False)
    のような感じにした方が自然ということなのでしょうか?

    キャンセル

  • 2018/05/17 12:49

    そうですね。Boolean型の変数には、True/Falseで処置すべきですよね。

    ただ、テーブルの値が実際にはどうなっているか知らないので、Variant型の変数に格納してみると、実際に保持されている型が分かるかもしれません。
    テーブル内でも、True/Falseで保持されているなら検証不要でしょうし、そうでなくても、Boolean型で処理可能であれば、そう扱う方が可読性があがりますよね。

    キャンセル

0

エラーメッセージを調べましたか?
表示されているエラーは構文エラーではありません。データを追加すると
主キー重複やインデックス一意を違反してしまうのできませんという内容です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/16 15:53

    エラーメッセージが出ている通りに主キーやデータ型が違反している
    というエラーメッセージは、主キーでもないチェックボックスを追加してから出始めたエラーなので、その辺りに原因があると考えSQLが
    誤っていないか調べていました。

    そこで、チェックボックスを追加する前のデータを試した所、そこでも同じエラーが出るようになりなぜこのエラーが出るのかが分からないのです。

    張ってあるVBA自体は問題ない感じで良いのでしょうか?

    キャンセル

  • 2018/05/17 00:45

    エラーメッセージが必ず正しいのでとは言いませんが、まずはエラーメッセージの意味を理解するのが先決だと思います。
    VBAが間違いないかどうかはわかりません、間違っているからエラーが出ると言えますし間違っていないからインデックスのエラーが出るとも言えます。
    そもそもロジック的にEDAをCurrentRecordで取得するというロジックは削除を行うと容易に重複してしまうのでその辺りから大丈夫なのか気になります。
    「チェックボックスを追加してから出始めたエラー」に見えても「チェックボックスを追加した」ことと
    「その後にエラーが起きた」ことに関連性はあるのでしょうか?
    偶然そのタイミングで起きただけという可能性もあるかと思います。

    sazi氏のおっしゃる通り、strSQLの中身が思った内容かどうかを確認されては?

    キャンセル

関連した質問

同じタグがついた質問を見る

  • VBA

    1861questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

  • Access

    457questions

    Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。