Microsoft Access 掲示板

チェックボックスの nullをtrueにしたい

11 コメント
views
4 フォロー

ご無沙汰しています。また詰まったのでお邪魔しました。

以前の掲示板で復習しようとしましたが観られないとのことで、
改めてこちらで質問させていただきます。


●『本棚』ファイル構成 (※画像「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更新」)


ご教示よろしくお願いします。

画像1
画像2

鉄血
作成: 2019/03/06 (水) 22:30:02
通報 ...
1

鉄血さん、こんばんは。

T_本棚T_読者ですが、主キー同士(登録番号)で結合されています。
このような場合は、2つのテーブルの関係は一対一関係といいます。
一対一関係のデータは、テーブルを分けないで一つにするのがデータベース設計のセオリーです。(下記リンクを参照してください。)

一対一関係のテーブル設計 - hatena chips

つまり、T_本棚未読フィールドを追加すればいいだけです。
そうすれば、何も悩むことなく、本を新規追加すれば、未読は自動で規定値のTrue(チェック入り)になります。

2
鉄血【解決済】 2019/03/07 (木) 09:37:31 fca6d@e7bab

年度末にも関わらず、早速のお返事ありがとうございます。

>一対一関係のデータは、テーブルを分けないで一つにするのがデータベース設計のセオリーです。
>つまり、T_本棚に未読フィールドを追加すればいいだけです。

はい、サンプルをダウンロードさせていただき参考にしながら作成しました。
それはできたのですが、作成過程で……

「読者のファイルをひとつ原本として作成しておき、
 読者が増えるごと『読者原本』ファイルをコピーして
 個人ファイルを作成すれば、管理・対応が楽になるのでは。
 読者が減ればその個人ファイルを削除するだけで良いし、
 本棚の登録には影響がない」

……と考えた次第です。T_本棚に未読フィールドを追加する場合、
共通項目となるために読者は1人専用の状態になりますから。

そこで『読者原本』ファイル側(「T_読者」テーブル)に未読フィールドを作ってやってみたのですが、
やはりセオリーから外れているから駄目なのですね……。

別の試しに「T_読者」テーブルに「管理ID」フィールドを追加して主キーとし、
一対多にしてみましたが、やはり同様でした。
ひとつのファイル内にテーブルをまとめる形(基本)に戻って再設計していきます。

いつも的確なアドバイスありがとうございます。
拙いレベルながら、職場での業務改善に貢献できる機会が増えました。
今後も精進します!!

3

読者は複数なのですね。

ならば、
ある本を読んだ読者は複数、
ある読者が読んだ本は複数、
となりますので、
本と読者は多対多の関係になります。

この場合、データベース設計としては、
T_本、T_読者 さらに両者を結びつける中間テーブルを作成します。


T_本

主キーフィールド名データ型
本IDオートナンバー型
タイトル短いテキスト
ジャンル短いテキスト

T_読者

主キーフィールド名データ型
読者IDオートナンバー型
氏名短いテキスト
性別Yes/No型

T_本_読者

主キーフィールド名データ型既定値
読者ID数値型
本ID数値型
既読Yes/No型True
---
フォーム設計としては、
読者毎に管理したいなら、下記のような設計にするといいでしょう。
T_読者をレコードソースとするフォームをメインフォームにして、
T_本_読者T_本 を結合させたクエリをレコードソースとするフォームを、サブフォームとして埋め込む。

読者毎に管理したいなら、下記のような設計にするといいでしょう。
T_本をレコードソースとするフォームをメインフォームにして、
T_本_読者T_読者 を結合させたクエリをレコードソースとするフォームを、サブフォームとして埋め込む。

4
鉄血 2019/03/07 (木) 12:22:37 fca6d@e7bab

とてもわかりやすい解説をありがとうございます!!
多対多の関係は初めてです。早速トライします。

うまくいったら改めてご報告にあがります!!

5
hatena19 2019/03/07 (木) 13:44:52

メイン/サブフォーム形式の設計については、事前にリレーションシップを設定しておくと、フォームウィザードで簡単に作成できます。
下記が参考にしてください。

Accessのフォームのメイン/サブフォームとは | できるネット

6
鉄血 2019/03/08 (金) 10:59:12 fca6d@e7bab

こんにちは。アドバイスを見ながらトライしてみましたが、
うまく機能してくれません。

各テーブルとクエリとリレーションシップは画像の通りです。

イメージとしては「フォーム(表示)」のように、
読者ごとに登録されている本のリストが表示され、
「未読」のチェックボックスをON・OFFできる、というものです。

やはり「未読」が Null で出てしまいます。
私のリレーションがどこか間違っているとは思いますが、
あれこれ試しながらも行き詰ってしまいました。

再度のアドバイスよろしくお願いします。

画像1
画像2
画像3
画像4

7

クエリの設計が間違ってますね。
クエリには、T_本_読者のフィールドをすべて表示させて、T_本からは、タイトル、ジャンルを表示させます。
T_本はマスターテーブルなので、そのテーブルの主キーを変更してはいけません。マスターテーブルからは、主キー以外のフィールドを表示させるようにします。

あと、結合の向きが逆です。下記の画像を参考にして作り直してください。
画像1

サブフォームのレコードソースを作り直したクエリにします。
サブフォーム上の タイトル、ジャンル のテキストボックスは「編集ロック」「はい」にしておいてください。
マスターのデータを不用意に更新されないようにするために不可欠です。

これで、サブフォームで 本ID を入力すると 既読 には自動でチェックが入ります。

後は、本ID のテキストボックスをコンボボックスにして、ドロップダウンリストから選択できるようにしておくと使いやすいものになります。

8
鉄血 2019/03/08 (金) 22:38:28 fca6d@e7bab

うまくいきました!!
ただ、私の説明不足が露呈しました。すみません。

仕上がりのイメージとしましては次の通りでした。

①本の登録は別に登録用フォームを作成し、そちらから数を追加する。
 ※なお、読者の登録も同様にする予定です。
②サブフォームには登録されている本の全てを表示する。
③読み終えたら「既読」チェック ON(OFF)をする。

今回の仕上がりはサブフォームで読者ごとに本の登録をしていく形です。
前回の「クエリをいじりすぎた」のは登録本をすべて表示したくて
色々といじった結果とも言えます。

しかし私の希望する形だと、読者の人数分×本の登録数が常に
テーブルに保存されるので、上策とは言えなさそうです……。

今回の課題は教えていただいた方法でいかせていただきます。
いつも丁寧なアドバイスをありがとうございます。
不器用ながら、更に精進します!!

画像1

9

②サブフォームには登録されている本の全てを表示する。
③読み終えたら「既読」チェック ON(OFF)をする。

下記が参考になるでしょう。

帳票フォームで項目(行)を固定表示する
帳票フォーム、とくにメイン/サブフォーム形式の帳票フォームで、事前にすべての項目分のレコードを表示しておいて、データを入力したいという要求がたまにあります。 例えば、扱う商品が決まっていて、その商品名をすべて表示させておいて数量のみ入力するとか、1ヶ月分の日付を表示させておいて対応するデータを入力する、などという場合です。 商品仕入を例にしますと、通常のメイン/サブフォーム形式の設計ですと、下記のよ...
fc2

10
鉄血 2019/03/09 (土) 08:36:59 c6f57@e7bab

検索から見落としてました!この形だと思います。
次のお休みでじっくり勉強させていただきます。また報告します!

11
鉄血 2019/03/16 (土) 09:15:03 fca6d@e7bab

こちらの状況に合わせてアレンジさせていただき、
この形で仕上げることができました。理想的です!

画像1

後は誰でも使えるように、読者や本の追加・削除などの
インターフェイスを追加していきます。

また欲が出てきましたので、hatenaさんのchipsを教科書に
しつつトライしていきます。
ありがとうございました!