* フィールドの値から、別テーブルの値を参照 [#za1c2749]
|RIGHT:|LEFT:|c
|~ページ|[[OpenOffice.org FAQの登録ページ]]|
|~投稿者|kimura|
|~分類|#listbox3(Q&A,faq03,class)|
|~優先順位|#listbox3(普通,faq03,priority)|
|~状態|#listbox3(完了,faq03,state)|
|~カテゴリー|#listbox3(Base データベース,faq03,category)|
|~投稿日|2009-09-07 10:26:22 (月)|
|~OS|Windows Vista|
|~依存するページ||
|~バージョン|#listbox3(3.1.0,faq03,version)|

** メッセージ [#a0bb5345]
|LEFT:|c
|回答ページでは行末に「~」を付加する必要はありません|
open officeもaccessも超初心者です。

顧客売上データベースを作成しています。
現在、3つのテーブルがあり、含まれるフィールドは下記のようになっています。

テーブル1:顧客コード、顧客名~
テーブル2:商品コード、商品科目、商品名~
テーブル3:顧客コード、顧客名、住所、担当者、商品コード、商品科目、商品名、個数……~



※テーブル3が売上管理するためのメインテーブルとなっており、データ入力はフォームから行いたいと思っています。


.董璽屮3(フォームから)の顧客コードフィールドに顧客コードを入力すると、
テーブル1からそれに対応する顧客名を読み出し、
自動的にテーブル3の顧客名フィールドに表示されるようにしたい。

▲董璽屮3(フォームから)の商品コードフィールドに商品コードを入力すると、
テーブル1からそれに対応する商品科目と商品名を読み出し、
自動的にテーブル3の商品科目フィールドと商品名フィールドに表示されるようにしたい。


現在、テーブル3のフォーム上に、リストボックスを作って解決出来るかと試みていましたが、
その場合、他のテーブルのデータを参照はできても、1つのフィールドに対し1つのフィールドしか表示できません。


できればリストボックスなどを使わずに、上記の2点を実行できるよう設定したいのですが、どうすればいいのか分からず途方にくれています。

どのような方法があるのかアドバイスをお願いいたします。
よろしくお願いいたします。

----
***テーブル設計について [#m63f3078]
>M.Kamataki (2009-09-07 11:29:34 (月))~
~
まず、テーブル設計の見直しが必要だと思います。~
~
書かれた内容からわかりやすいのは、テーブル1とテーブル3の関係です。せっかくテーブル1で「顧客コード」と「顧客名」が対応付けされているのですから、テーブル3には「顧客名」フィールドは不要です。リストボックスを使っての入力フォームなら、テーブル3を基に「顧客コード」のテキストボックスをリストボックスに変更し、テーブル1から「顧客名」をリストにして、テーブル3の「顧客コード」フィールドにテーブル1を参照したコード番号が入力されるようにすれば良いのではないでしょうか。~
~
わたしは、テーブル3には、住所、担当者も不要だと思いました。むしろ、住所、担当者は、テーブル1に従属するものではないでしょうか。また、テーブル3ですが、売上コードのようなフィールドを用意して、それをプライマリキー(主キー)にしたほうが良いですよ。~
~
>.董璽屮3(フォームから)の顧客コードフィールドに顧客コードを入力すると、テーブル1からそれに対応する顧客名を読み出し、自動的にテーブル3の顧客名フィールドに表示されるようにしたい。~
~
考え方としては、まったく逆でテーブル1の「顧客名」を選ぶと、テーブル3の「顧客コード」フィールドに顧客のコード番号が入力されるわけです。~

//
***テーブル2の目的はなんでしょう [#wdfaa261]
>M.Kamataki (2009-09-07 11:40:38 (月))~
~
さて、△任后テーブル2の目的がわからないので間違っているかもしれませんが、もし商品科目で商品名を分類するものなら、faq/5/10「内容が変化するリストボックスの設置方法」が参考になるのではと思います。~
~
また、テーブル2との関係から、テーブル3には、「商品科目」「商品名」フィールドは不要かもしれないと思います。~

//
***入力フォームは3つ必要 [#i198e7ec]
>M.Kamataki (2009-09-07 11:56:21 (月))~
~
「顧客売上データベース」という名称から、顧客管理も売上管理も1つのフォームで行おうとされているのではないでしょうか。~
~
ご質問の内容なら、わたしなら3つフォームを用意します。商品入力フォーム、顧客入力フォーム、売上入力フォームです。商品入力フォームは扱い商品が増えたとき、顧客入力フォームは新しい顧客を獲得したとき、売上入力フォームは売上のあったときで、売上入力フォームはほぼ毎日使われるもの。顧客入力フォーム、商品入力フォームの順に利用頻度は少なくなっていくかもしれません。新しい商品がめったに増えないのであれば、商品入力はフォームを作成しないでも良いかもしれません。~

//
***ご回答ありがとうございます。データベースとは… [#hc0588bb]
>kimura (2009-09-07 14:02:09 (月))~
~
ご回答ありがとうございます。~
~
今回のデータベースを作ろうとしている目的として、社内で、添付ファイル(あくまでイメージですので実際の項目はもっとたくさんありますが)のように、一画面を一目で見て、顧客コード、顧客名、商品コード、商品名、購入個数~
などがわかるようにしたいと声が出たことから始まりました。~
~
ちなみにテーブル2の目的は、現在商品が、大区分、中区分、小区分でカテゴリ分けしているので、それらもどのようにジャンル分けされているのか、一目で分かるようにしたいとの声から、フィールドを作りました。~
(例:大区分→文房具 中区分→ペン類 小区分→ボールペン(赤)のような感じです)~
でも、これであれば、お教えいただいたfaq/5/10「内容が変化するリストボックスの設置方法」が確かに有効だなと思いました。~
~
~
>「顧客売上データベース」という名称から、顧客管理も売上管理も1つのフォームで行おうとされているのではないでしょうか。~
~
~
はい。たしかにそうです。最初、テーブル3にて、顧客コードフィールド下にリストボックスを作り、リストボックスにてテーブル1の「顧客名」を選べるようにし、テーブル3の「顧客コード」フィールドに顧客のコード番号が入力されるように設定して作っていたのですが、上司から、それだとフォームで見た時はリストボックスで顧客名や商品名が出ているので分かるが、テーブルで見たときに顧客名がわからなくなり、「人が、コードから顧客名をリストで探して把握しなくてはいけないので駄目だ」と言われてしましました。~
~
そして、今思ったのですが、そもそも、情報を集約させてまとめのデータを見ようとする際、フォームで見ようとしているのが間違いなのでしょうか?~
社内にaccessやOpenOfficeを分かっている人がおらず、accessならデータベースっていうのが作れるんでしょ、だからaccessのフリーソフトのOpenOfficeを使おう的な発想から着手することになり、わたしも、accessも超初心者とい~
いますか、昔、ほんの少しだけ、出来あいのデータベースに入力したことしかなかったため、根本的に間違ったイメージを持っているのかもしれません。~
~
お教えいただいたよう、商品入力フォーム、顧客入力フォーム、売上入力フォームを作り、クエリ―というものでのみ集約させるべきなのでしょうか。~
私の知識が浅く、お手数をおかけして本当に申し訳ありませんが、引き続きアドバイスお願いいたします。~

//
***添付しわすれました。 [#ie17b38f]
>kimura (2009-09-07 14:05:23 (月))~
~
申し訳ありません。さきほどの投稿で添付ファイルを忘れました。~
データベースのイメージはこちらです。~
&ref(sample.jpg,,60%);

//
***Re: ご回答ありがとうございます。データベースとは… [#xb38407b]
>M.Kamataki (2009-09-07 15:29:59 (月))~
~
Access=データベースと思われていると、OpenOffice.org Baseも理解できないかもしれません。まず、いずれも本来はフォーム、レポートなどのフロントエンド機能を提供するアプリケーションだということを理解しておくべきだと思います。どちらかといえばクライアント側のアプリケーションですね。一方、データベース自体は本来、テーブルと、クエリーという問い合わせに応えるサーバー側の機能です。~
~
そこでOpenOffice.org Baseに関する一般的な情報を得るために以下のページに置いてあるわたしのセミナー資料に目を通してください。ここでOpenOffice.org Baseの入門的な情報、Accessとの違いなどを頭に入れておいてください。~
~
Baseセミナー ドキュメントアーカイブ~
http://openoffice-docj.sourceforge.jp/wiki/Documentation/Base_Seminar~

//
***サブフォーム [#fb5bc742]
>M.Kamataki (2009-09-07 15:56:34 (月))~
~
>情報を集約させてまとめのデータを見ようとする際、フォームで見ようとしているのが間違いなのでしょうか?~
~
テーブルが以下のような設計であれば、サブフォームで実現できるのではと思います。~
~
テーブル1:顧客コード、顧客名、住所、担当者~
テーブル2:商品コード、商品科目、商品名~
テーブル3:ID、顧客コード、商品コード、個数……~
~
メインフォームはテーブル3、サブフォームはテーブル1とテーブル2です。サブフォームは1つまでなら、フォームウィザードで作成できるので、2つ目は編集で追加します。上記テーブル構成の場合は、メインフォームが売上管理のための入力フォームになるので、顧客関係、商品関係のテーブルはあくまでも参照用として用意しておくことになると思います。~
~
サブフォームの作成方法は、過去のご質問faq/3/98「BASEでふたつのサブフォームをメインフォームに挿入したい。」を参考にしてください。ここのサンプルでは、サブフォーム側でも入力可能ですが、オペレーションミスが起きそうなフォーム構成になるのでサブフォーム部分は読み取り専用にしておくのが無難だと思います。~
~
"上司から、それだとフォームで見た時はリストボックスで顧客名や商品名が出ているので分かるが、テーブルで見たときに顧客名がわからなくなり、「人が、コードから顧客名をリストで探して把握しなくてはいけないので駄目だ」"というご発言ですが、上記のようなサブフォームも1つの回答です。しかし、より作成が簡単なクエリーでも良いと思いますよ。クエリーを作成しておけば、売上管理のフォームからボタンでクエリーを基にした一覧用フォームを表示したり、クエリーを基にしたレポートを表示したりできますから。~
~
kimuraさんがやりたいことは、まぁBaseでもできます。Accessほど、簡単ではないかもしれませんが。~

//
***ありがとうございます。 [#tccfe04a]
>kimura (2009-09-07 16:12:09 (月))~
~
丁寧なご回答ありがとうございます。~
まずは、お教えいただいたセミナー資料を読んで、OpenOffice.org Baseの入門的情報とAccessとの違いを勉強しようと思います。~
~
その後、続きで教えていただいたサブフォームとクエリーの方法を試そうかと思います。~
今の時点では、「売上管理のフォームからボタンでクエリーを基にした一覧用フォーム」というのが自分の身の丈にあっているような気がするので、~
そちらをまず上司とも相談して進めていきたいと思います。~
~
本当にありがとうございました。~

//
#article