Access (一般機能)

Accessの一般機能に関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
フォームに共通部品を利用する
投稿日時: 17/12/11 11:41:11
投稿者: カープくん

お世話になります。
説明が至らないと思いますが、よろしくお願いします。
 
下記の様な事は実現可能でしょうか?
また、実現可能な場合、技術的な名称もご教授いただけますでしょうか?
 
@フォームAとフォームBがある。
AフォームAとフォームBの両方に、共通の入力フィールド(例えば、住所入力欄など)を両者に配置したい。
BAの共通の入力フィールドを、「共通部品」として作成しておき、フォームAとフォームBに配置したい。
Cなお、Bの「共通部品」の修正を行った場合(例えば、ボタンやフィールドを1つ増やしたなど)、フォームAとフォームBにも反映される。
 
よろしくお願いいたします。
 

回答
投稿日時: 17/12/11 14:12:15
投稿者: sk

引用:
@フォームAとフォームBがある。

・ここでの[フォームA]と[フォームB]の違いが不明。
 
引用:
AフォームAとフォームBの両方に、共通の入力フィールド
 (例えば、住所入力欄など)を両者に配置したい。

引用:
BAの共通の入力フィールドを、「共通部品」として作成しておき、
 フォームAとフォームBに配置したい

引用:
Cなお、Bの「共通部品」の修正を行った場合
 (例えば、ボタンやフィールドを1つ増やしたなど)、
 フォームAとフォームBにも反映される。

・それぞれのフォームのデザインは
 あくまでそのフォーム固有のものであり、
 仮にフォームのデザインに何らかの変更を加えたとしても、
 他のフォームのデザインには何ら影響を及ぼさない。
 (他のフォームのサブフォームとして埋め込まれた
 フォームについては、そのフォーム自身に対する
 デザインの変更のみ影響する)
 
・あるフォームのインスタンスを複数個生成したいのならば、
 VBA でそういうコードを実行すればよい。

投稿日時: 17/12/11 14:57:48
投稿者: カープくん

skさん、ご回答ありがとうございます。
 

引用:
・ここでの[フォームA]と[フォームB]の違いが不明。

下記の様なイメージです。
 ・フォームA・・・国内顧客用入力フォーム
 ・フォームB・・・海外顧客用入力フォーム
住所入力欄はフォームABで共通だが、住所入力欄以外はフォームABでまったく異なるため、
フォームを2つに分けることにした。
 
引用:
・あるフォームのインスタンスを複数個生成したいのならば、
  VBA でそういうコードを実行すればよい。

色々な実現方法があると思いますが、下記の様な実現方法でやりたいと思っています。
 ・フォームA(国内顧客用)
 ・フォームB(海外顧客用)
 ・フォームC(住所入力欄) ←フォーム? サブフォーム? 部品?
※フォームCは、フォームAとフォームBでまったく同じ入力フォームなので、1回のみ作成しておいて、フォームAとフォームBで呼び出したいです。
※また、この呼び出し方法をAccessでは一般的に何と言いますか?
 
見当違いなコメントでしたら、ご指摘ください。
よろしくお願いいたします。

回答
投稿日時: 17/12/11 15:36:12
投稿者: sk

引用:
下記の様なイメージです。
 ・フォームA・・・国内顧客用入力フォーム
 ・フォームB・・・海外顧客用入力フォーム
住所入力欄はフォームABで共通だが、住所入力欄以外はフォームABでまったく異なるため、
フォームを2つに分けることにした。

[フォームA]と[フォームB]はそれぞれ、
連結フォームと非連結フォームのどちらなのでしょうか。
 
仮に両者ともに連結フォームである場合、
それぞれのレコードソースとなるテーブルは
同じテーブルなのか、それとも異なるテーブルなのか
どちらでしょうか。
 
引用:
色々な実現方法があると思いますが、下記の様な実現方法でやりたいと思っています。
 ・フォームA(国内顧客用)
 ・フォームB(海外顧客用)
 ・フォームC(住所入力欄) ←フォーム? サブフォーム? 部品?
※フォームCは、フォームAとフォームBでまったく同じ入力フォームなので、
1回のみ作成しておいて、フォームAとフォームBで呼び出したいです。

仮に[フォームC]を[フォームA], [フォームB]共通の
サブフォームとして埋め込むとして、[フォームC]の
レコードソースはどのテーブルになるのでしょうか。
 
例えば、[フォームA]のレコードソースと
[フォームB]のレコードソースがそれぞれ
別のテーブルであるとして、その両方共に
住所関連の(同名の)フィールドが定義されていたり
するのでしょうか。

投稿日時: 17/12/11 16:00:02
投稿者: カープくん

skさん、ご回答ありがとうございます。
 

引用:
[フォームA]と[フォームB]はそれぞれ、
 連結フォームと非連結フォームのどちらなのでしょうか。
  
仮に両者ともに連結フォームである場合、
それぞれのレコードソースとなるテーブルは
同じテーブルなのか、それとも異なるテーブルなのか
 どちらでしょうか。

上記の返答になっていない場合は、大変申し訳ありません。
連結フォームや非連結フォームは、どちらでも構いません。
※連結フォームでなければ実現不可の場合は、連結フォームを前提とします。
ただし、入力フォームの共通部分(住所入力欄など)を1回作成しておき、
複数フォーム(国内顧客用・海外顧客用・得意先国内顧客用など・・・)を作成する際に、共通部分を呼び出す事は可能か不可能かを知りたかったのです。
不可能であれば、不可能で問題ありません。(Accessではこういった事はしない・できない・する必要がない等)
検討違いな質問かもしれませんが、ご教授いただけたらと思います。
 
引用:
仮に[フォームC]を[フォームA], [フォームB]共通の
 サブフォームとして埋め込むとして、[フォームC]の
 レコードソースはどのテーブルになるのでしょうか。
  
例えば、[フォームA]のレコードソースと
[フォームB]のレコードソースがそれぞれ
別のテーブルであるとして、その両方共に
住所関連の(同名の)フィールドが定義されていたり
 するのでしょうか。

別テーブルで、両者のテーブルに住所録関連の(同名の)フィールドが定義されている事を
前提として問題ありません。

回答
投稿日時: 17/12/11 18:42:29
投稿者: sk

引用:
連結フォームや非連結フォームは、どちらでも構いません。
連結フォームでなければ実現不可の場合は、連結フォームを前提とします。

引用:
複数フォーム(国内顧客用・海外顧客用・得意先国内顧客用など・・・)を作成する際に、
共通部分を呼び出す事は可能か不可能かを知りたかったのです。

「そういうふうに見せかけたい」程度の話であれば、
連結フォームには連結フォームなりの、
非連結フォームには非連結フォームなりの
やり方がいくつかは考えられるでしょう。
(ほとんどの場合、VBA が必須となるはずですが)
 
ただ、実際に可能か不可能か、具体的にどのような手法によって
それを実現すればよいのか、といった問題は、
具体的にどんなテーブルがあるの? 
 それぞれどういう構造になってんの?
という部分を抜きにしては語れません。
 
Access で作成されるフォームの多くは
「データベース上のテーブルのレコードを
 表示、編集するためのフォーム」であり、
使用するテーブルの構造に関する説明なしには、
フォームの作りようがないからです。
 
またテーブルの設計の段階で何らかの問題があれば、
それらを用いたクエリ/フォーム/レポートのデザインにも
悪影響を及ぼしかねません。
 
引用:
複数フォーム(国内顧客用・海外顧客用・得意先国内顧客用など・・・)を
作成する際に、共通部分を呼び出す

例えば「国内顧客」と「海外顧客」と「得意先国内顧客」とで
具体的に何が違うのか(わざわざテーブルを分ける理由とは何か)、
というのもその一つです。
 
これらの顧客区分に共通しているのはどのフィールドであるか、
(逆にそれぞれの顧客区分に固有のフィールドはどれか)、
共通する/しないフィールドの数がどれだけあるか、
(全体のうちのどれぐらいの割合を占めているか)といったことが
今のところ定かではありませんが、
 
・全ての(顧客区分の)顧客の情報を
 1 つのテーブルで一元的に管理する。
 
・各レコードのフィールド[顧客区分]の値によって、
 その顧客の種類(国内, 海外, 得意先国内)を
 区別するようにする。
 
・上記のテーブルをレコードソースとする
 1 つの連結フォームを作成する。
 
・そのフォームの詳細セクション上に
 タブコントロールを配置し、
 顧客区分ごとのページを挿入して
 顧客区分固有のフィールド(連結コントロール)を
 各ページに適宜配置する。
 
・全ての顧客区分に共通するフィールド(連結コントロール)は、
 フォームの詳細セクション上に直接配置するか、
 タブコントロールに[基本情報ページ]や[住所情報ページ]を挿入して
 そのページ上に配置するようにする。
 
・選択された顧客区分によって、タブコントロールの
 各ページの可視状態や編集モードを制御するようにする。
 ([基本情報ページ]や[住所情報ページ]は
 常に編集可能な状態とする)
 
といったテーブル/フォームを設計すれば(それが可能なテーブル設計なら)、
わざわざ似たようなフォームを 2 個も 3 個も作る必要はありません。
 
引用:
・フォームA(国内顧客用)
・フォームB(海外顧客用)
・フォームC(住所入力欄)

上記のフォーム群で言えば、[フォームC]をメインフォームとし、
そのサブフォームとして[フォームA]と[フォームB]のいずれかを
表示させるようにする、という形が近いでしょうか。
 
つまり「共通しないフィールド」をメインに据えるのではなく、
あくまで拡張項目として扱う、というコンセプトです。
 
引用:
別テーブルで、両者のテーブルに住所録関連の
(同名の)フィールドが定義されている事を
前提として問題ありません。

「顧客の種類によってテーブルが分かれている」状態では、
前述のような仕組みは成り立ちません。
 
もし「複数のテーブル間で共通しているフィールド」を
メインフォーム側に埋め込むならばメインフォームのレコードソースを、
サブフォーム側に埋め込むならばサブフォームのレコードソースを、
何らかの条件に応じて動的に変更する仕組み
作り込むことが必要となります。
 
引用:
Accessではこういった事はしない・できない・する必要がない等

「共通しているフィールド」を一元的に管理したいなら、
まずそれに即した形でテーブルの定義を行なうことが
肝心でしょう。
 
少なくとも「国内顧客」と「得意先国内顧客」とで
編集項目にそれほど大きな違いがあるとは思えませんし、
「ある顧客の扱いが『国内顧客』から『得意先国内顧客』に変更される」
(またはその逆)というケースだってあり得るのではないでしょうか。
 
その時に編集対象となるテーブルが分かれてしまっていては、
両者のテーブルに格納されているそれぞれのレコードが
同一の顧客を示しているかどうか、どちらのレコードが
その顧客の現在/過去の情報を示しているのか、といった判別作業を
難しくする恐れがあります。
 
どうしても別個のテーブルとして定義する必要があるのであれば、
それ相応のフォームデザインを行なわざるを得ないでしょう。

投稿日時: 17/12/12 10:21:47
投稿者: カープくん

skさん、ご回答ありがとうございます。
私からわかり辛い質問をしてしまい、大変失礼いたしました。
skさんからの詳細なご回答をいただきまして、分かり易く勉強になりました。
大変感謝いたします。
 
大変済みませんが、
再度、私の疑問点を纏めましたので改めて質問をさせてください。
 
下記のDにあります、「共通部品」に関して、Accessの世界ではどういう名称で呼ぶのでしょうか?
それとも特に決まった名称はないのでしょうか?
※たとえば、要件定義書やシステム導入提案書を作成しようとした場合、まずはAccessの世界での名称を使いたいが、無いのであれば「共通部品」と記載しても意味は通じるか?
 
@前提として、私はAccess以外の開発は経験していますが、Accessでの開発経験はない。
Aこの度、Accessの新規開発をする予定である。
BAccess以外での開発経験を基に、開発ルールを設けようと決めた。
Cいくつかの開発ルールの中の1つとして、「入力フォーム」について定義することにした。
D定義内容として、入力フォームを開発する際、共通の入力フィールド(フィールド数が多い場合。
 例:フィールドが20個以上の場合)については各フォーム毎にフィールを配置するのではなく、
 共通の入力フィールド群を、「共通部品」として作成しておき、各フォームに配置することにした。
E連結フォームと非連結フォームの選択や、テーブル定義なども、矛盾がない様に最適なものを検討し
 選択することにした。
F「共通部品」化することの目的は、都度ある改修要望に備えてメンテナンスをし易くし、
 コスト軽減することである。
GAccessはデータベースを基盤としているので、入力フォーム基準で開発を進めてしまうのは危険で
 あるが上記Eで充分に検討するものとする。
 
以上、よろしくお願いいたします。

回答
投稿日時: 17/12/14 17:21:44
投稿者: sk

引用:
下記のDにあります、「共通部品」に関して、
Accessの世界ではどういう名称で呼ぶのでしょうか?
それとも特に決まった名称はないのでしょうか?

おっしゃっている意味での「共通部品」に当たる
公式的な、あるいはスタンダードな呼称は
今のところ存在しないに等しいと思います。
 
・Access におけるサブフォームの主な用途は、
 1対多(または 1対1 )の親子関係にある
 2 つのテーブルを任意のキー同士でリンクさせ、
 それらのテーブルのレコードを 1 つのフォームウィンドウ上に
 同時に表示、編集出来るようにすることであり、
 「 UI 部品の共通化(クラス化、共有、再利用)」は主眼に置かれていない
 
・上記の用途とは異なるサブフォームの作り方/使い方を
 するのは、勿論それぞれの自由である。
 ただ「そういう作り方も出来る」というだけの話であって、
 「 Access におけるフォームデザインの代表的な技法」
 として広く体系化されているわけではない。
 (わざわざ名前をつけるほど大それてもいない)
 
・同じような技法を編み出したどこかの誰かが、何らかの
 非公式な名称を考案して個人的に/便宜的に使用している
 可能性までは否定できないが、ローカルルールや方言の域を
 出ない限り「 Access の世界での名称」とは言い難い。
 
人によって「共通」なり「汎用」なりの類義語を
適当に用いているのではないですかね、たぶん。
 
「部品」に関しては、
 
・テーブル/クエリ/フォーム/レポート/マクロ/モジュールを
 総称して「オブジェクト」と呼ぶ。
 
・テキストボックス/ラベル/コンボボックス/リストボックス/
 コマンドボタン/オプションボタン/トグルボタン/オプショングループ/
 タブコントロール/ページコントロール/サブフォームコントロール
 などの、フォーム/レポートの UI 部品を総称して「コントロール」と呼ぶ。
 
というのが「 Access の専門用語」での表現である、とは言えますが。
 
引用:
※たとえば、要件定義書やシステム導入提案書を作成しようとした場合、
まずはAccessの世界での名称を使いたいが、無いのであれば
「共通部品」と記載しても意味は通じるか?

(特に「 Access の世界での名称」に拘る必要もないとは思いますが)
その「部品」として具体的にどのオブジェクト/コントロールを
用いられたか次第ではないでしょうか。
 
例えば「共通しているフィールド」のみを配置したフォームがあるとして、
そのフォームをサブフォームとして埋め込んでいるフォームが複数あるならば
「共通サブフォーム」とでも呼べばよいのではないでしょうか。

投稿日時: 17/12/15 14:38:00
投稿者: カープくん

skさん、ご回答いただき大変ありがとうございます。
 
下記とすることにしました。
 
@「共通部品」の技術的な解決は、サブフォームを使用する。
 →ただし、Accessでのサブフォームの位置づけとして、「 UI 部品の共通化(クラス化、共有、再利用)」は主眼に置かれていないことに注意すること。
 
A「共通部品」の名称としては、「共通サブフォーム」を使用する。
 →サブフォームコントロールを使用するので、「共通サブフォーム」とする。
 
とても丁寧に回答していただきまして、大変ありがとうございました。