Microsoft Access 掲示板

YesNo型で、Yesのものを羅列したい

6 コメント
views
4 フォロー

お世話になっております。

T_履歴というテーブルに、「機種_A」から「機種_Z」までの26種類のフィールドがあるとします。
いずれのフィールドもYesNo型で、既定値はNoです。
T_履歴をレコードソースとした「F_詳細」というフォームに「txb_機種」というテキストボックスを配置しています。
レコードの「機種_A」「機種_B」「機種_C」「機種_Z」がYesでその他はNoの時、txb_機種に「A・B・C・Z」と表示させるにはどうすればよいでしょうか?

NoName
作成: 2024/07/24 (水) 15:51:28
通報 ...
1
NoName 2024/07/24 (水) 15:58:48 f3f60@44ebd

画像1

Excelで申し訳ありませんが、イメージです

2

T_履歴というテーブルに、「機種_A」から「機種_Z」までの26種類のフィールドがあるとします。

発想がデータベース的ではないですね。
データベースではデータを横方向に展開する(フィールドが増える)ような設計はしません。
このような設計ではデータベースとして使い物になりません。

そのような設計にしたいのならエクセルで作成することをお勧めします。


提示されている情報だけではテーブルデータの全体像が分かりませんので、具体的にどのようなテーブル設計にすべきかは提示できません。
とりあえず、「テーブル 正規化」をキーワードにWEB検索してみて、データベースの基本を学習されることをお勧めします。

3
NoName 2024/07/24 (水) 17:36:05 修正 f3f60@44ebd >> 2

機種マスタ

機種ID(主キー)機種名
1A
2B
3C
4D
26Z

こんな感じのマスターテーブルを作って、T_履歴には機種フィールドにマスタの機種IDをいれればいいのでしょうか?でもそれだと機種を複数選択できません。

今のT_履歴のテーブル構成は、詳細省いてますがこんな感じです。


履歴ID(オートナンバー)受注№(主キー・数値)担当者コード(数値)得意先コード(数値)受注日(日付)品名(短いテキスト)納期(日付)機種_A~Z(YesNo)加工_1~10(YesNo)特記事項_1~3(YesNo)包装_ゴム止め個数(数値)包装_ケース個数(数値)包装_紙帯個数(数値)

①T_入力という上記フィールド(受注№以外)を持つテーブルをレコードソースにした、F_入力というフォームで入力を行う(T_履歴には登録ボタンを押して、確定した情報しかレコードして残したくないため)
②F_入力の登録ボタンを押すと、T_入力の内容を追加クエリでT_履歴に追加(この際に受注№を取得)
③F_前回受注№入力というフォームのtxb_受注№(非連結)というテキストボックスに受注№を入力して反映ボタンを押すと、追加クエリでF_入力にその受注№のレコードを追加し、前回入力した内容がF_入力に反映された状態で入力を開始できる

以上のようなことをやりたいのです。
フィールドを横並びにしておけば、追加クエリとかが少なくて済むかなと思ってこのようなテーブルにしました。

きちんと正規化するとT_履歴_機種、T_履歴_加工とかのテーブルも作らないといけないですよね?

4

画像1

正規化調べましたが、T_入力をどうしたらいいかわかりません。
ここからどのようにすればよいでしょうか。

5
hiroton 2024/07/25 (木) 11:09:23 6ac35@f966d

まず、目的をはっきりさせましょう。提示されなければ質問者以外にはわかりません
どのような作業(仕事)をするためのシステム(ツール・道具)を作りたいんでしょうか?

それとも、ACCESS(データベース)を学習すること自体が目的のサンプルシステムなんでしょうか?


>> 3にある①②③は手段ですね
目的(どのような結果が欲しいのか)が不明なので、どのような手法を勧めるべきかに至っていません。当然、具体的な手段の話にもなりません。どのようなテーブルを用意すべきか?も具体的な検討に至れません

6

ご認識の通り正規化するど、T_履歴_機種、T_履歴_加工のテーブルも必要になりますね。
データの集計や検索などのデータ操作を効率よく行うには必須の設計になります。

T_履歴 と T_履歴_機種、T_履歴_加工 の関係は「一対多の関係」といいますが、このような場合、入力フォームの設計はAccessではメイン/サブフォーム形式のフォームを使用するのが一般的です。
検索すればサンプルが多数見つかりので、参照してみてください。

①T_入力という上記フィールド(受注№以外)を持つテーブルをレコードソースにした、F_入力というフォームで入力を行う(T_履歴には登録ボタンを押して、確定した情報しかレコードして残したくないため)

このようなことを実現するには、下記の2つの方法が考えられます。

T_履歴、T_履歴_機種、T_履歴_加工 と同じフィールド構成の一時テーブルを作成して、それをソースとするメイン/サブフォームを作成して、入力フォームとする。

あるいは、現状の入力フォームを非連結にして、登録ボタンでVBAで T_履歴、T_履歴_機種、T_履歴_加工 にデータ追記する。
コントロール名を規則的なものにしておけば、ループ処理でシンプルなコードで実現できると思います。

コントロール名(チェックボックス)が 「機種_1」「機種_2」「機種_3」・・「機種_26」として下記のような感じです。

Dim rs_履歴_機種 As DAO.Recordset
Set rs_履歴_機種 = CurrentDB.OpenRecordset("T_履歴_機種")

Dim i As Long
For i = 1 to 26
    If Me.Controls("機種_" & 1).Value = True Then
        rs_履歴_機種.AddNew
        rs_履歴_機種!機種ID = Me.受注№.Value
        rs_履歴_機種!機種ID = i
        rs_履歴_機種s.Update
    End If
Next

T_履歴_機種 に登録する部分のコードの考え方です。これを参考にコード作成してみてください。
ほかの部分も同様にできると思います。
登録する順番は先にメインテーブル(T_履歴)のほうからしてください。