初めまして。AccessのFK値削除に関するエラーと解消策についてお聞きできればと思い投稿いたしました。
〇発生しているエラー
「バリアント型ではない変数にNull値を代入しようとしました。」
〇テーブル等
下記の「T_顧客」および「T_担当者」の2つのテーブルを作成し、「担当者ID」でリレーションを張っています。
クエリ「Q_顧客」を作成して顧客情報と担当者情報を取得、これを元にフォーム「F_顧客」を作成しました。
また簡単なテストデータを入力しています。
〇エラー発生状況
このフォームで、例えば顧客ID=1の佐藤さんの担当者IDの値「1」を消そうとすると、エラー「バリアント型ではない変数にNull値を代入しようとしました。」が発生してしまいます(下記エラー画面ご参照)
(原因は、担当者IDはFKになっている値ですので消してしまうと相手テーブルのデータが見つけられないためだろうと思っています。)
エラーがでるのは仕方ないと思う反面、担当者が未定の場合は空欄にして登録できればと思っています。何か良いお知恵はありませんでしょうか?
(こういった状況は良くあるように思うのですが、皆さまどのように対応されているのでしょうか?Accessの経験は少ないため、取り違い等がありましたら申し訳ありません。)
「T_顧客」の「担当者ID」フィールドのプロパティで「値要求」は「いいえ」になってますか。
「規定値」は空欄になってますか。
クエリのデザインビューで結合線をクリックして、結合プロパティを表示させて、
「
T_顧客
の全レコードと・・・」というオプションを選択してください。上記の点を確認ください。もし、それでも解消しない場合は、そのフォームでVBAが設定されてませんか。設定れていたら、いちどそれを削除してみて試してみてください。(コードはバックアップしておいてください。)
>hatena様
お忙しい中、早々にご返信をありがとうございます。
全て試してみました。フォーム上では同じエラーが出てしまい、ダメでした。(しかしながら「Q_顧客」のデータシートビュー上ではエラーが出なくなりました。)
・「T_顧客」の「担当者ID」フィールドのプロパティで「値要求」は「いいえ」になってますか。
→はい。
・「規定値」は空欄になってますか
→はい。
・「クエリのデザインビューで結合線をクリックして、結合プロパティを表示させて、
「T_顧客の全レコードと・・・」というオプションを選択してください。」
→こちらは少し変化がありました。Q_顧客をデータシートビューで開いて、担当者IDを空欄にしても当該エラーは出なくなりました。しかし、フォーム上で空欄にしますと以前として当該エラーが出てしまいます。
・そのフォームでVBAが設定されてませんか。
→はい、VBAは記述しておりません。(検証用に新規DBも作成しまっさらな状態でテストしています。Accessが勝手に追加したacwwzlib, acwzmain, acwztoolモジュールはあります。)
クエリの結合線プロパティでInner joinからLeft Join等に変更できるのですね。SQLベースで考えるとこれで納得できます。大変勉強になります。ありがとうございます。
あとはフォーム上では何故かまだエラーが出ております。これが解消できれば良いのですが。
フォームの担当者IDと結合したテキストボックスの規定値プロパティの空欄になってますか。
>hatena様
お忙しい中、度々ありがとうございます。
はい。「フォームの担当者IDと結合したテキストボックスの規定値プロパティ」は空欄になっております。
困りました。どこがマズいのか、未だ検討がついておりません。。。
そのようなフォームは普通によく作成しますが、そのような現象にあったことがないので不思議です。
解決策ではなく、別案の提案ですが、下記のようにしてみたらどうでしょうか。
フォームのレコードソースは、T_顧客 にします。
担当者ID のテキストボックスは右クリックして[コントロールの種類の変更]-[コンボボックス]でコンボボックスにします。
このコンボボックスのプロパティを下記のように設定します。
コントロールソース 担当者ID
値集合ソース T_担当者
列数 2
列幅 3cm;0cm
名前 cb担当者ID
「担当者名」のテキストボックスの設定を下記のようにします。
コントロールソース =[cb担当者ID].Column(1)
これで担当者名が表示できます。
これだとレコードソースはテーブルなのでエラーが出ることはないと思われます。
あるいは、下記で紹介しているような方法をつかってみるのもいいかと思います。
コードでも名称でも入力できるコンボボックス - hatena chips
>hatena様
ありがとうございます。
フォームでのエラーの件ですが、解決いたしました。
原因ですが、F_顧客のレコードソースが下記のSQLになっていました。
クエリの結合プロパティを変更したのは良かったのですが、フォームのレコードソースのSQLは以前のまま「INNER JOIN」になっていました。
このSQLの「INNER JOIN」を手動で「RIGHT JOIN」に変更、もしくはレコードレースに「Q_顧客」を設定することで、フォーム上でもエラーが出なくなりました。
当方の単純ミス&確認ミスで度々お手数をお掛けいたしました。
申し訳ありません。
今回の件は本質的には「クエリの結合プロパティの設定」に拠るものと分かりました。
色々と勉強になりました。大変ありがとうございました。御礼申し上げます。
別案「レコードソースにテーブルを設定&コンボボックスの値利用」もありがとうございます。
こちらでも問題なくできました。
状況によって、クエリVerと使い分けできそうです。
hatena chipsの方も時々拝見して勉強させて頂いています。有用な記事を惜しげもなく公開して頂いてとても参考になります。ありがとうございます。
担当者IDをDELETEして更新しようとするとエラーが出る、という事ですが、
クエリの段階でエラーを確認しました。
結合プロパティを変更すると、クエリとフォームでエラーが消失する事を確認しました。
解決策は、ごめんなさい、わかりませんでした。
迂回策ですが、此方、素人でパッと思いつくのは
担当者が未定の場合、空欄にして登録したい→担当者0(未定)を登録するみたいな感じか、
担当者が未定の場合、登録しない方向で、めっちゃ悩む感じか。
以下、駄文ですが
顧客テーブルの変更(顧客ID、顧客名)※担当者IDの削除
新しいテーブルの作成(顧客ID、担当者ID)
担当者テーブル(担当者ID、担当者名)
主キーどうする?、、、重複、ユニーク、、、
不一致クエリ、、、履歴どうする、、、そもそもテーブル設計的にどうなんだ?
りんごさん
こんにちは。コメントをありがとうございます。
また検証もしてくださったのですね。
解決策ですが、りんごさんも書かれていますように(hatenaさんが教えてくださった)
「クエリの結合プロパティを『T_顧客の全レコードと…』に変更する」で良いと思います。
(SQL的には内部結合から、T_顧客をメインとする外部結合に変更することになります。)
これで、担当者IDが空欄でも問題なく登録ができております。
取り違えていましたら申し訳ありませんが、ご返信までいたします。