ご無沙汰しています。また詰まったのでお邪魔しました。
以前の掲示板で復習しようとしましたが観られないとのことで、
改めてこちらで質問させていただきます。
●『本棚』ファイル構成 (※画像「T_本棚」)
テーブル「T_本棚」
(フィールド構成:データ型)
登録番号:オートナンバー型(主キー、長整数型、重複なし)
タイトル:短いテキスト
ジャンル:短いテキスト
※本の追加はこちらで行います。
●『読者原本』ファイル構成 (※画像「T_読者」)
テーブル「T_読者」
(フィールド構成:データ型)
登録番号:数値型(主キー、長整数型、重複なし)
未読:チェックボックス(Yes/No型・規定値true)
※会員がどの本を読んだのかを記録していきます。
1、『読者原本』ファイルに『本棚』ファイルのテーブル「T_本棚」を
リンクテーブルとして取り込みました。
2、クエリ「Q_抽出」を作成し、コミックを抽出条件にしました。 (※画像「Q_抽出」)
3、クエリ「Q_抽出」を元データとしてフォーム「F_表示」を作成しました。 (※画像「F_表示)
【やりたいこと】
チェックボックス「未読」の nullをtrueにしたい
『本棚』ファイルで新しく本(コミック)を追加すると、
フォーム「F_表示」では Null 状態です。(※画像「F_表示)
(規定値の設定は true にしています)
後からの操作でON/OFFは出来ます。しかし今後のレポート出力で
抽出条件を「未読がtrue」としたいのですが、このままだと
Null が抽出に含まれません。
【失敗1】
フォーム「F_表示」を開いた時に次のコードを試しましたが駄目でした。
If Me.未読 = Null Then
Me.未読 = True
Else
Me.未読 = False
End If
【失敗2】
また更新クエリ「Q_Null更新」で抽出条件を「Is Null」とし、
レコードの更新を「True」としましたが、駄目でした。
(「入力規則違反が発生した」と出ました) (※画像「Q_Null更新」)
ご教示よろしくお願いします。
鉄血さん、こんばんは。
T_本棚とT_読者ですが、主キー同士(登録番号)で結合されています。
このような場合は、2つのテーブルの関係は一対一関係といいます。
一対一関係のデータは、テーブルを分けないで一つにするのがデータベース設計のセオリーです。(下記リンクを参照してください。)
一対一関係のテーブル設計 - hatena chips
つまり、T_本棚に未読フィールドを追加すればいいだけです。
そうすれば、何も悩むことなく、本を新規追加すれば、未読は自動で規定値のTrue(チェック入り)になります。
年度末にも関わらず、早速のお返事ありがとうございます。
>一対一関係のデータは、テーブルを分けないで一つにするのがデータベース設計のセオリーです。
>つまり、T_本棚に未読フィールドを追加すればいいだけです。
はい、サンプルをダウンロードさせていただき参考にしながら作成しました。
それはできたのですが、作成過程で……
「読者のファイルをひとつ原本として作成しておき、
読者が増えるごと『読者原本』ファイルをコピーして
個人ファイルを作成すれば、管理・対応が楽になるのでは。
読者が減ればその個人ファイルを削除するだけで良いし、
本棚の登録には影響がない」
……と考えた次第です。T_本棚に未読フィールドを追加する場合、
共通項目となるために読者は1人専用の状態になりますから。
そこで『読者原本』ファイル側(「T_読者」テーブル)に未読フィールドを作ってやってみたのですが、
やはりセオリーから外れているから駄目なのですね……。
別の試しに「T_読者」テーブルに「管理ID」フィールドを追加して主キーとし、
一対多にしてみましたが、やはり同様でした。
ひとつのファイル内にテーブルをまとめる形(基本)に戻って再設計していきます。
いつも的確なアドバイスありがとうございます。
拙いレベルながら、職場での業務改善に貢献できる機会が増えました。
今後も精進します!!
読者は複数なのですね。
ならば、
ある本を読んだ読者は複数、
ある読者が読んだ本は複数、
となりますので、
本と読者は多対多の関係になります。
この場合、データベース設計としては、
T_本、T_読者 さらに両者を結びつける中間テーブルを作成します。
T_本
T_読者
T_本_読者
読者毎に管理したいなら、下記のような設計にするといいでしょう。
T_本をレコードソースとするフォームをメインフォームにして、
T_本_読者 と T_読者 を結合させたクエリをレコードソースとするフォームを、サブフォームとして埋め込む。
とてもわかりやすい解説をありがとうございます!!
多対多の関係は初めてです。早速トライします。
うまくいったら改めてご報告にあがります!!
メイン/サブフォーム形式の設計については、事前にリレーションシップを設定しておくと、フォームウィザードで簡単に作成できます。
下記が参考にしてください。
Accessのフォームのメイン/サブフォームとは | できるネット
こんにちは。アドバイスを見ながらトライしてみましたが、
うまく機能してくれません。
各テーブルとクエリとリレーションシップは画像の通りです。
イメージとしては「フォーム(表示)」のように、
読者ごとに登録されている本のリストが表示され、
「未読」のチェックボックスをON・OFFできる、というものです。
やはり「未読」が Null で出てしまいます。
私のリレーションがどこか間違っているとは思いますが、
あれこれ試しながらも行き詰ってしまいました。
再度のアドバイスよろしくお願いします。
クエリの設計が間違ってますね。
クエリには、T_本_読者のフィールドをすべて表示させて、T_本からは、タイトル、ジャンルを表示させます。
T_本はマスターテーブルなので、そのテーブルの主キーを変更してはいけません。マスターテーブルからは、主キー以外のフィールドを表示させるようにします。
あと、結合の向きが逆です。下記の画像を参考にして作り直してください。
サブフォームのレコードソースを作り直したクエリにします。
サブフォーム上の タイトル、ジャンル のテキストボックスは「編集ロック」「はい」にしておいてください。
マスターのデータを不用意に更新されないようにするために不可欠です。
これで、サブフォームで 本ID を入力すると 既読 には自動でチェックが入ります。
後は、本ID のテキストボックスをコンボボックスにして、ドロップダウンリストから選択できるようにしておくと使いやすいものになります。
うまくいきました!!
ただ、私の説明不足が露呈しました。すみません。
仕上がりのイメージとしましては次の通りでした。
①本の登録は別に登録用フォームを作成し、そちらから数を追加する。
※なお、読者の登録も同様にする予定です。
②サブフォームには登録されている本の全てを表示する。
③読み終えたら「既読」チェック ON(OFF)をする。
今回の仕上がりはサブフォームで読者ごとに本の登録をしていく形です。
前回の「クエリをいじりすぎた」のは登録本をすべて表示したくて
色々といじった結果とも言えます。
しかし私の希望する形だと、読者の人数分×本の登録数が常に
テーブルに保存されるので、上策とは言えなさそうです……。
今回の課題は教えていただいた方法でいかせていただきます。
いつも丁寧なアドバイスをありがとうございます。
不器用ながら、更に精進します!!
下記が参考になるでしょう。
検索から見落としてました!この形だと思います。
次のお休みでじっくり勉強させていただきます。また報告します!
こちらの状況に合わせてアレンジさせていただき、
この形で仕上げることができました。理想的です!
後は誰でも使えるように、読者や本の追加・削除などの
インターフェイスを追加していきます。
また欲が出てきましたので、hatenaさんのchipsを教科書に
しつつトライしていきます。
ありがとうございました!