Access (一般機能)

Accessの一般機能に関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10 Home : Access 2019)
ルックアップフィールドの絞り込み等
投稿日時: 22/09/09 00:20:46
投稿者: たっくんプードル

データの体系は以下の通りで、階層ごとにマスターテーブルを作ろうと思います。
A階層      B階層     C階層
番号・名称   番号・名称   番号・名称   予算額
100・ああ--------5・かかか--------1・ささささ  1000
                         ---------2・しししし  2000
                         ---------3・すすすす  3000
    ---------6・ききき--------1・せせせせ   4000
             --------2・そそそそ  5000
    ---------7・くくく--------1・たたたた   6000
                 2・ちちちち   7000
                 3・つつつつ   8000
 
110・いい---------5・かかか-------1・ささささ  1000
                         ---------2・しししし  2000
                         ---------3・すすすす  3000
    ---------6・ききき--------1・せせせせ   4000
             --------2・そそそそ  5000
    ---------8・けけけ--------1・なななな   3000
                 2・にににに   4000
 
120・うう---------5・かかか-------1・ささささ  1000
                         ---------2・しししし  2000
                         ---------3・すすすす  3000
    ---------6・ききき--------1・せせせせ   4000
             --------2・そそそそ  5000
    ---------9・こここ--------1・はははは   2000
                 2・ひひひひ   2000
                 3・ふふふふ   1000
 
 
Aの親テーブルを作成します。Bのテーブルを子とし、Cの孫テーブルにはBの番号も入力します。
それぞれの金額を管理するDテーブルも作成しますが、ABCの各番号フィールドをもって主キーとします。
A階層、B階層のデータからルックアップフィールドで持ってくることはできますが、C階層のデータをルックアップフィールドとして入力したい場合に、B階層の親データによりC階層の選択肢を絞りたいのですが、テーブルやクエリでは絞り込みはできないのでしょうか。
(フォームを作成して、親子のコンボボックスを2つ作成して絞り込む方法はよく知られていますが)
 
最終的には、それぞれの利用明細を集積し、上記総額から利用明細合計額を差し引いた残額を管理する構想です。
どうかご教示お願いします。

回答
投稿日時: 22/09/09 10:24:17
投稿者: Suzu

引用:
階層ごとにマスターテーブルを作ろうと思います。

引用:
それぞれの金額を管理するDテーブルも作成しますが、ABCの各番号フィールドをもって主キーとします。

引用:
C階層のデータをルックアップフィールドとして入力したい場合に、B階層の親データによりC階層の選択肢を絞りたい

 
最後の
引用:
C階層のデータをルックアップフィールドとして入力したい場合に、B階層の親データによりC階層の選択肢を絞りたい

がある以上、C階層を独立させるより B階層/C階層を 同時に納めるテーブルにしないと
B と C の 関連性を持った形にはできませんよね。
 
そのまま受け取ると
[M_A]
A_ID    A_Name
100    ああ
110    いい
120    うう
 
[M_BC] (IDフィールドは無くても可 ただ、IDがあると、トランザクションには IDだけ登録すれば良い)
ID    B_ID    B_Name    C_ID    C_Name
1    5    かかか    1    ささささ
2    5    かかか    2    しししし
3    5    かかか    3    すすすす
4    6    ききき    1    せせせせ
5    6    ききき    2    そそそそ
6    7    くくく    1    たたたた
7    7    くくく    2    ちちちち
8    7    くくく    3    つつつつ
9    8    けけけ    1    なななな
10    8    けけけ    2    にににに
11    9    こここ    1    はははは
12    9    こここ    2    ひひひひ
13    9    こここ    3    ふふふふ
 
 
ただ、入力に慣れてきたりすると、いちいち三段階のコンボボックスなんて非効率に思えてきます。
それを考慮するなら
 
[M_BC]        
ID    B_Name    C_Name
51    かかか    ささささ
52    かかか    しししし
53    かかか    すすすす
61    ききき    せせせせ
62    ききき    そそそそ
71    くくく    たたたた
72    くくく    ちちちち
73    くくく    つつつつ
81    けけけ    なななな
82    けけけ    にににに
91    こここ    はははは
92    こここ    ひひひひ
93    こここ    ふふふふ
 
の様な持たせ方もあります。

回答
投稿日時: 22/09/09 11:39:56
投稿者: hatena
投稿者のウェブサイトに移動

たっくんプードル さんの引用:

A階層、B階層のデータからルックアップフィールドで持ってくることはできますが、C階層のデータをルックアップフィールドとして入力したい場合に、B階層の親データによりC階層の選択肢を絞りたいのですが、テーブルやクエリでは絞り込みはできないのでしょうか。
(フォームを作成して、親子のコンボボックスを2つ作成して絞り込む方法はよく知られていますが)

テーブルやクエリのルックアップフィールドでは不可能だと思います。
 
そもそも、ユーザーの入力を、制御の効かないテーブルやクエリで行うのは推奨できません。うっかり削除してしまったら元に戻せません。

投稿日時: 22/09/10 22:59:34
投稿者: たっくんプードル

ほぼご指摘のとおりテーブルを作っていました。
ただ、予算額はA_ID、B_ID、C_IDの3フィールドを主キーとすることになり、予算額テーブルを作成入力していく際に、C_IDをB_IDに応じて絞り込めれば思った次第です。
やはり、Name抜きでIDだけで入力していくしかないのか、フォームをわざわざ作るしかないのでしょうか。

投稿日時: 22/09/10 23:01:57
投稿者: たっくんプードル

 
[/quote]
テーブルやクエリのルックアップフィールドでは不可能だと思います。
[/quote]
やはりフォームでしか親子の絞り込みはできないのですね。ありがとうございます。

回答
投稿日時: 22/09/12 10:09:24
投稿者: Suzu

引用:
ただ、予算額はA_ID、B_ID、C_IDの3フィールドを主キーとすることになり、予算額テーブルを作成入力していく際に、C_IDをB_IDに応じて絞り込めれば思った次第です。
やはり、Name抜きでIDだけで入力していくしかないのか、フォームをわざわざ作るしかないのでしょうか。

 
出来なくは無いです。
 
フィールドの値集合ソース に、
SELECT [M_BC].[C_ID], [M_BC].[C_NAME]
FROM [M_BC]
WHERE [M_BC].[B_ID] = [トランザクションテーブル名].[B_ID];
の様に、直前で入力した B_ID の値で、抽出を行います。
 
考え方は フォームの
 
フォームのテキストボックスに入力された値をクエリの抽出条件に設定する
https://www.moug.net/tech/acopr/0040014.html
と、同じです。
 
 
入力中のレコードの フィールドは、それで表示されます
でも、入力済みのレコードにおいて、カレントレコードのレコードと違う B_ID が 入力されていると
カレントレコードの B_ID が抽出条件に適用されますから、
 
C_ID を保存する形にしていると
 
100・ああ--------5・かかか--------1・ささささ  1000
    ---------6・ききき--------1・せせせせ   4000
  ↓
100・ああ--------5・かかか--------1・せせせせ  1000
    ---------6・ききき--------1・せせせせ   4000
の様になってしまいます。
 
 
なので、テーブルではなく、クエリで
 
SELECT
  [T_データ].[ID],
  [T_データ].[A_ID], [M_A].[A_NAME],
  [T_データ].[B_ID], [M_B].[B_NAME],
  [T_データ].[C_ID], [M_C].[C_NAME]
FROM
    (
        ([T_データ] LEFT JOIN [M_A] ON [T_データ].[A_ID]=[M_A].[A_ID])
        LEFT JOIN [M_B] ON [T_データ].[B_ID] = [M_B].[B_ID]
    )
    LEFT JOIN [M_C] ON [T_データ].[C_ID] = [M_C].[C_NAME]
の様にし、
 
[T_データ].[A_ID] [T_データ].[B_ID] [T_データ].[C_ID]
を、ルックアップやコンボで選択させ、その NAME の値は、クエリ側の JOIN で表示させればいけるかと。
 
 
でも、更に今回は難関があって
[M_A].[A_ID]
[M_B].[B_ID]
[M_C].[C_ID]
これらが、ユニークでないとダメ。
今回は、
[B_ID] [C_ID] がそれぞれユニークではありません。
 
更に、JOIN を組み合わせれば 実現は可能ですが、動作は重くなります。
 
確実なのは、番号体系を変える事なのですが
 
 
変更できないのであれば
C_ID 表示ID C_NAME
10051 1 ささささ
10052 2   しししし
10053 3   すすすす
 :
 
の様に、内部用のID と 表示用のID を別に持ってであれば お手軽かと。
 
 
個人的には、この番号体系 で、絞り込み 機能を
テーブルの ルックアップのみで実現は行わないです。

トピックに返信