[Access] 全てのフィールドを入力しても「null値を使用できません」エラー

お世話になってます。

レコードをコピーする時にどうしてもこのエラーを回避できず困っています。

■設定

インデックスは主キーのフィールドのみです。

→テーブルのデザインビューにある [デザイン]タブ > 表示/非表示 > インデックス で確認しました。

分割フォーム上での操作です。

[※追記] テーブル上で直接操作(レコードを選択、コピー、新規レコードに貼り付け)する時はエラー無し。

■エラー

レコードの複製自体はできますが、保存する時に次のエラーが発生。

実行時エラー: 3058

インデックスまたは主キーにはnull値を使用できません。

■試行済

● UI上で手動コピー

・フォームのレコードセレクタをクリックしコピー元のレコードを選択状態にする。

・Ctrl + C でコピー。

・新規レコードのレコードセレクタをクリックしレコード選択状態にする。

・Ctrl + V で貼り付け。

・Shift + Enter で保存。   ← ここでエラー

● 既定の埋め込みマクロ

・デザインビューでボタンを作成する時のウィザードでレコードの複製を選択。

・ボタンをクリックしてコピー。

・Shift + Enter で保存。     ← ここでエラー


● VBAで保存 1

    RunCommand acCmdSelectRecord

    RunCommand acCmdCopy
    RunCommand acCmdRecordsGoToNew 
    RunCommand acCmdPasteAppend 

    DoCmd.RunCommand acCmdSaveRecord     ’ ← ここでエラー

● VBAで保存 2

            

Dim Rs As Recordset

Dim subRs As Recordset
Dim i As Long

With Me.Recordset

    Set Rs = Me.RecordsetClone
    Rs.Bookmark = .Bookmark

    .AddNew

    For i = 0 To .Fields.Count - 1

        Select Case .Fields(i).Name
          Case "ID"               '主キー
            .Fields(i) = 123456   '重複していない数字です。(最終的には自動採番します)

         Case "Action"            '複数の値を持つフィールドに対する処理

            Rs(i).Value.MoveLast
            Set subRs = Rs(i).Value
            If subRs.BOF = False Then subRs.Movefirst
          While (Not subRs.EOF)
               With .Fields(i).Value
                .AddNew
                !Value = subRs!Value
                .Update
              End With
                subRs.MoveNext
            Wend

            subRs.Close
            Set subRs = Nothing

          Case Else
            .Fields(i) = Rs(i)

        End Select
    Next

    .Update         '← ここでエラー
    Rs.Close
    Set Rs = Nothing
End With

最後の「VBAで保存 2」の場合、レコードの全てのフィールドに対してコピーを実施しているので

既存のレコードが存在する(Nullエラーにならず保存されている)以上、

インデックスや主キーが仮に他にあったとしてもエラーにはならないハズ、と理解しているので混乱しています。

(既存レコードは手入力です。手入力ならエラーにはなりません。)


既知のバグでもあるのでしょうか。(Windows Updateは最新の状態です)

どなたかお知恵をお貸しください。

【※ 翌日追記】

全レコードで同じかと思っていたら、特定のレコードでエラーが出ずに複製+保存できました。

成功/失敗の差を検証していくと、特定のフィールドに値が設定されている場合は成功、値が無い場合は失敗、でした。

その特定のフィールドは2つの数値型フィールドで、両方ともルックアップが設定されています。

両方とも入力されている場合のみエラーを回避できました。

(このフィールドに連結したコントロールには、以前別件で質問したこのような設定がされています。
 → 値集合ソースの中の特定の値のみをコンボボックスに表示させたい )

しかし同様のフィールドは他にもあります。

他と違ったのは、ルックアップの連結列がテーブル側では「2」、フォーム側では「1」になっていました。

もしやここが不具合を起こしたのかとテーブル、フォーム共に連結列:1 に統一しましたが改善しません。

他に正常なフィールドと異なる点は、(関係あるか分かりませんが)「値リストの編集の許可」が「はい」に

なっている事くらいです。 → 「はい」である必要もないので他に合わせて「いいえ」としました。

原因らしきフィールドは特定できましたが何故原因なのか未だもって不明です。

回答
回答

自力で解決しました。

レコード云々を書きましたが、そもそもRecordsetが正しく処理されているのか、Recordsetには何があるのか確認しました。

Select Case が終わった所(=1つのフィールドへコピーした後)で、都度Updateし、エラーが発生するか見てみました。

    For i = 0 To .Fields.Count - 1

        Select Case .Fields(i).Name

          Case "ID"

             ~

          Case "Action"

             ~

          Case Else
            .Fields(i) = Rs(i)
         End Select

 

      .Update       'ここで都度レコード更新
        If Err.Number = 0 Then
          Debug.Print "OK " & i & ":" & Rs(i).Name & "    ST:" & Rs(i).SourceTable
        Else
          Debug.Print "Er " & i & ":" & Rs(i).Name & "    ST:" & Rs(i).SourceTable
          Err.Clear
        End If
        .Edit

    Next

イミディエイトウィンドウを見てみると、一部のフィールドでエラーが起きていました。

元々このフォームのレコードソースは単にテーブルだったのですが、途中からクエリに変更しました。

その時にテーブル以外の更新できないフィールドがRecordsetに入ってしまっていたのです。

そこをコピーしてUpdateしようとした事がエラーの原因だったようです。

そこで、For ~ Next 文の内側にif文を入れて特定のテーブルをソースとするフィールドのみをコピーする様にしました。

    For ~

      If .Fields(i).SourceTable = "t_Main" Then

        Select Case

          ~

        End Select

      End if

    Next

これでUpdateするとエラー無しです。漸く解決!

時間かかった...。

■ 原因 & 回避策

コピーの対象となるレコードに変更出来ないフィールド(クエリフィールド)が含まれていた。

(対象フィールドはデバッグで特定)

変更出来ないフィールドを除外してコピーするとエラー回避。

以上です。

この回答が役に立ちましたか?

お役に立てず、申し訳ございません。

素晴らしい! フィードバックをありがとうございました。

この回答にどの程度満足ですか?

フィードバックをありがとうございました。おかげで、サイトの改善に役立ちます。

この回答にどの程度満足ですか?

フィードバックをありがとうございました。

 
 

質問情報


最終更新日: 2023年12月21日 表示数 4,118 適用先: