- ベストアンサー
ACCESS2000のテーブル構造
ACCESS2000のテーブルの作り方について質問します。 伝票フォームを作り「取引先コード」「商品区分コード」「商品コード」3項目を入力したら単価が表示されるようにしたいのですが、うまくいきません。 (同じ商品でも取引先により単価が違うので、3つの情報がそろったときにはこの単価になるという形にしたいのです) 現状は「商品区分テーブルの区分コード」と「商品マスターテーブルの区分コード」 「商品マスターテーブルの商品コード」と「単価テーブルの商品コード」をそれぞれ1対多リレーションし、 そして「単価テーブルの単価コード.商品コード取引先コード,単価」で選択クエリを作り、それを伝票のサブフォームにしてみたのですが、商品コードが入力できませんでした・・・ 何冊か本を参考にして作ってみたのですがうまく出来ませんでした お分かりになる方がいらっしゃいましたら教えてくださいよろしくお願いいたします。
- みんなの回答 (10)
- 専門家の回答
質問者が選んだベストアンサー
お世話様です。 >主キーは「商品コード」「取引先コード」の二つに設定すると言う >ことですよね!? そうです。テーブルのデザインビューで2行同時に選択して「主キー」 ボタンを押してください >それぞれ1対多のリレーションテーブルのため、すで に”多”なので これは大丈夫だと思います。リレーションは2つのテーブル同士の関係 性だけなので。[商品区分]→[商品]→[単価]というのもありますし。 >「固有のインデックスがない為、出来ません」と表示されてしまうの >です… 「リレーションシップ」ダイアログで「作成」ボタンを押したときに 表示されるメッセージですよね。 おそらくダイアログ上でのフィールドの指定ミスか、親テーブルの 主キーの設定ミスかとおもわれます。 リレーションを設定する際も、2つのフィールドを一度に設定します。 ダイアログ上ではこのように設定されていますか? テーブル/クエリ リレーションテーブル/クエリ ・単価 ・伝票明細 商品コード 商品コード 取引先コード 取引先コード
その他の回答 (9)
- 11n_kacie
- ベストアンサー率42% (21/50)
お世話様です。 お気遣いの言葉、どうもありがとうございます。 めげずに頑張らせていただきます。 > 商品コードと取引先コードをひとつのキーにするというのは、 > 単価IDのような主キーを別に作るということとは違いますか? 主キーはそれ自身が一意に定まるものであれば別に何でも構いません。 しかしこの単価テーブルの場合は、取引先コードをフォーム上で連携 させる必要があるため、こちらの方が良いでしょう。 これによりサブフォームでは商品コードと数量の入力だけで済みます。 > 2つのフィールドから1つのフィールドへのリレーションの > やり方がわからないです… ここはもう少し詳しく説明するべきでしたね。 2つのフィールドで1つのキーと説明しましたが、リレーションは、 「2つのフィールドから2つのフィールドへ」行って下さい。 伝票明細にも「商品コード」「取引先コード」のフィールドを作成し、 単価テーブルから主キー2つを引っ張ってきてください。 リレーションシップダイアログには複数行表示されると思いますが、 横に並んでいる項目がそれぞれ対応します。 以上です。たぶんあと少しです。頑張りましょう。
お礼
早速のご回答ありがとうございます。 >取引先コードをフォーム上で連携 させる必要があるため、こちらの方が良いでしょう。>これによりサブフォームでは商品コードと数量の入力だけで済みます。 これと言うのは主キーは「商品コード」「取引先コード」の二つに設定すると言うことですよね!? 理解力がなくて申し訳ないです… >伝票明細にも「商品コード」「取引先コード」のフィールドを作成し、 >単価テーブルから主キー2つを引っ張ってきてください。 ここのところなのですが、[単価テーブル]の「商品コード」「取引先コード」はそれぞれ1対多のリレーションテーブルのため、すでに”多”なので[伝票明細テーブル]へリレーションしようとすると、「固有のインデックスがない為、出来ません」と表示されてしまうのです… どうしたら良いのでしょうか… またまた教えてください。
- 11n_kacie
- ベストアンサー率42% (21/50)
お世話様です。 突然なんですが、なんだか私自身混乱してしまいまして、 かなり怪しいことを言ってしまっておりました。 今試してみたのですが、もう明らかに間違っている部分もありました。 未熟なスキルやうろ覚えの知識でものを申してしまい、心より反省している次第です。 大変申し訳ありませんでした。改めてまとめなおします。 ■リレーションに関して [単価]→[伝票明細]リレーションは必要です。 とりあえず以下のようにして下さい。 [商品区分]→[商品]→[単価]←[取引先] ↓ [伝票]→[伝票明細] [取引先]→[伝票]はクエリ上で仮想的に実現します(後述)。 以前、ここの解釈について誤っておりました。申し訳ありません。 ■[単価]→[伝票明細]に関して 単価テーブルに最低限必要なフィールドは以下の通りです。 商品コード・取引先コード・単価 このうち「商品コード・取引先コード」が主キーです。 伝票明細テーブルに最低限必要なフィールドは以下の通りです。 伝票コード・商品コード・取引先コード これらは全て外部キーになります。 [単価]→[伝票明細]リレーションは、商品コード・取引先コードの2つを 1つのキーとして同時にリレーションさせればできるかと思いますが、 上手くいきませんでしょうか。 ■クエリ作成に関して 「クエリ」と表記していますが、要はフォームのレコードソースです。 サブフォームのクエリは以下の通りです。 [商品区分]→[商品]→[単価]←[取引先] ↓ [伝票明細] また、親フォームのクエリは以下の通りです。 [取引先]→[伝票] (これはクエリ上のみでリレーションを作成します) ■フォームに関して 以前「VBAでグローバル変数~~」などと書きましたが、 フォーム/サブフォーム間の連携はVBAを使用しなくても出来るようです。 (たった今、試してみて始めて知りました……) 親フォームをデザインビューで開き、サブフォームを選択、プロパティの 「リンク子フィールド」「リンク親フィールド」で設定できます。 この場合は伝票コードと取引先コードになります。 以上です。 一度間違った指摘をしてしまい混乱させてしまった以上、 もはや完成するまでお付き合いさせていただくつもりです。 補足の必要な箇所がございましたらおっしゃってくださいませ。
お礼
とんでもないです。初心者の私が作るには難しすぎる質問をしてしまいました。(言葉の意味もロクスポわからず、お手間をかけさせてしまい、恐縮です…) でも完成させることが出来たら、すばらしく業務の効率アップが図れます!のでよろしくお願いいたします。 下記のところでで質問なのですが、 [単価]→[伝票明細]リレーションは、商品コード・取引先コードの2つを 1つのキーとして同時にリレーションさせればできるかと思いますが、 商品コードと取引先コードをひとつのキーにするというのは、単価IDのような主キーを別に作るということとは違いますか?2つのフィールドから1つのフィールドへのリレーションのやり方がわからないです…
- 11n_kacie
- ベストアンサー率42% (21/50)
お世話様です。 前回の記述で混乱させてしまったようで、申し訳ありませんでした。 「取引先コードが2つ必要」という記述ですが、これは伝票明細テーブルでの話です。 しかし、伝票明細テーブルに直接取引先コードが書き込まれるとは限りませんでした。 要するに、伝票テーブルから伝票コードを外部キーとしてリレーションさせるわけですが、 この伝票コードには実質的に取引先コードも内包している、ということです。 (伝票コードが定まれば、取引先が一意に定まるので) これと同様のことが単価テーブルからのリレーションでも起こるので、取引先コードが 2つ必要、という表現を致しました。紛らわしくて申し訳ありません。 要点をまとめますと、 1. 取引先テーブルは元のままでよい。 2. 伝票明細テーブルには外部キーとして「伝票コード」と「単価コード」を持つ。 3. 上記2つのコードはどちらも「取引先コード」を内包する(ただし循環はない)。 ということです。そして上記の「3」のことから、この2つの 隠れた取引先コードを連携させる必要が生じるわけです。 それでは、具体的にその連携を実現するため例を挙げます。 (私なりの方法でありあくまで例ですので、最善かどうかは保証できません) A. #6の通りにリレーションを作成 B. 単価テーブルの「単価コード」を廃止(商品コード・取引先コードを主キーに) C. 伝票フォーム内に伝票明細サブフォームを生成 D. VBAのグローバル変数などにより取引先コードを連携 具体的に記述するため、特に連携の実現とは直接関係のない操作もありますが、 このような感じでいけると思います。 長文のため詳細についてはあまり触れておりませんので、 不明な箇所はお尋ねくださればその都度ご返事させていただきます。
お礼
いつも初歩的質問にお付き合いいただき、ありがとうございます。本当に感謝です。 NO.7の通りに作ってみました。 ひとつ質問なのですが「単価テーブル」から「伝票明細テーブル」へのリレーションは無しで良いという事でしょうか? A.B.Cまでは順調にできたのですが、やはりD.でつまづきました… 取引先コードを連携させるためのグローバル変数の書き方を教えていただけないでしょうか? フォームのプロパティ→コードビルダで作成すればよいのでしょうか? でも、前に進んでる感じがして、うれしいです!
- 11n_kacie
- ベストアンサー率42% (21/50)
#4、5です。 前に書いたとおり、ちょっと力技になります。 おそらくいろいろな方法があると思いますので、これがベストかどうかは自信がありませんが。 [商品区分]→[商品]→[単価]←[取引先(1)] ↓ [取引先(2)]→[伝票]→[伝票明細] (ずれると思いますので補足しますが、上下のリレーションは単価→伝票明細です) ここで、取引先テーブルは同一のものです。 テーブルそのものは1つでもリレーションの画面上で複数表示させる事ができます。 ただし伝票明細テーブルには取引先コードが2つ必要になり、これらは連携しないので フォーム上でプログラム的に連携させてやると良いでしょう。
お礼
ご回答ありがとうございます 恥ずかしながら、いろいろな方法があるのだなという事がようやくわかってきた所です… 11nkacieさんの方法をやってみたのですが、取引先テーブルの中に、取引先コード1.2という2つのフィールドを作って、1を単価テーブルへリレーションさせ、2を伝票テーブル→伝票明細テーブルへとリレーションさせるということで良いのでしょうか?
補足
すいません、上記だけではわかりづらいので補足します。 テーブル [商品区分]→[商品] → [単価] ← [取引先] フィールド名 区分コード→区分コード 商品コード→商品コード 取引先コード2←取引先コード2 テーブル [取引先] → [伝票] → [伝票明細] フィールド名 取引先コード1→取引先コード1 伝票コード→伝票コード あと[単価テーブル]から[伝票明細テーブル]へ取引先コード2でリレーションしようとしたのですが、多対多になってしまうためできませんでした… 私がおそらく基本的なことを勘違いしているのだと思うのですが、どこが間違っているのかわかりません… 申し訳ありませんが、詳しく教えていただけないでしょうか?
- 11n_kacie
- ベストアンサー率42% (21/50)
#4です。すいませんでした……思いっきりずれてました。 当方、自宅ではMacなもので。失礼致しました。 [単価]から[伝票明細]へのリレーションです。 これで#4に関しては問題ないと思います。 原則として外部キーは親テーブルの主キーになります。 単価テーブルの主キーが単価コードなら、単価コードを 入力することで商品名や取引先を一意に定まります。 商品コード・得意先コードの入力によって定めるのなら、 単価テーブルの主キーは商品コード・得意先コードにすると 良いでしょう。 で、#4のリレーションの不都合ですが、 伝票テーブルの存在をまったく無視していることなんです。 伝票によくあるリレーションとして、 [取引先]→[伝票]→[伝票明細]←[商品] という形になるんです(トランザクションパターンと言うそうです)。 つまり、これと#4のリレーションをあわせればいいのですが、 そうすると今度はリレーションの循環が発生してしまいます。 (取引先から伝票明細までの経路が2通りに) これを解決するにはちょっとした力技が必要になるのではないかと。 単価テーブルさえなければ問題ないんですが……。
お礼
やはりこのやり方で単価を表示させるのは無理なのでしょうか… となると、どうやったらできるのでしょう? リレーションは循環するとダメなのでしょうか? 本や他のデータベースを見ても循環させているのは見たことがないので、やはり作り方が間違っているのでしょうか。 いろいろとアドバイスありがとうございます
- 11n_kacie
- ベストアンサー率42% (21/50)
とりあえず、こんな感じでいけると思います。 [商品区分]→[商品]→[単価]←[取引先] ↓ [伝票明細] テーブルのリレーションは上図の通り。 伝票明細テーブルの内容は ・伝票明細コード(主キー) ・単価テーブルからの外部キー ・数量 こんな感じになるかとおもいます。 上のリレーションをそのまんまクエリにしてやって、 それをフォームのレコードソースにすればいけるはずです。 ただし、明細だけの伝票なんて普通無いので、 これはこれでわりと不都合が多いような気がします。 単価がある程度パターン化できれば簡単なんですけど。
お礼
伝票のメインの部分はうまくできたのですが、明細部分だけができずに質問させていただきました。 関連のあるので書くべきでした… 上記ですと商品から伝票明細テーブルへリレーションさせているようなので、やってみたのですがうまくいきませんでした… 単価テーブルからの外部キーはテーブルの単価ID等の主キーをリレーションさせれば良いのでしょうか? 選択クエリにはどのフィールドが絶対に必要なのでしょうか?? 現在、伝票明細クエリには 「伝票明細テーブル」から伝票コード(伝票テーブルとリレーションの主キー),単価ID,数量 「商品マスタ」から商品コード,商品名 「区分マスタ」から区分コード,区分名 「単価テーブル」から単価, を選択しました。それをもうひとつの伝票メイン部分のクエリと合わせフォームにしました。 そしたら商品コード部分が入力できないのです… 初歩的なことを間違えているのだと思い、何度か作り直しているのですがうまくいきません よろしくお願いします
- yasinomisenzai
- ベストアンサー率12% (4/31)
マスタテーブルだけでは伝票は作れません。 伝票テーブルが必要です。 マスターテーブルはコンボボックス内のリスト表示に使うといいでしょう。
お礼
説明が足りませんでした… 伝票テーブルは作りました ご回答ありがとうございます!
- vantage
- ベストアンサー率60% (310/514)
テーブルの構造を整理してみましょう <商品区分マスタ> [商品区分コード][商品区分名]…その他 <商品マスタ> [商品区分コード][商品コード][商品名]…その他 <取引先マスタ> [取引先コード][取引先名]…その他 <単価マスタ> [単価コード][取引先コード]([商品区分コード])[商品コード][単価]…その他 この単価マスタテーブルから、フォーム上の[取引先コード][商品区分コード][商品コード]を抽出条件にして選択クエリーを作成すれば[単価]が出てきますよね。 質問でよく分からないのは、 >商品コードが入力できませんでした というのは、フォーム上で抽出条件としての[商品コード]が入力できないって事ですか? コンボボックスでも使っておられて、値集合ソースの抽出が上手く出来ないって事でしょうか? また、文章の前半からは「抽出された1件の単価を表示させる」と読めるのですが、 >伝票のサブフォームにしてみた という処理が、何をやられたいのかよく分からないです。 単価以外にも表示させたいデータがあるのでしょうか? それとも、サブフォーム上でレコードの更新等されたいと言うことでしょうか? 私が、通常こういった処理でイメージするのは、 フォーム上に[取引先コード][商品区分コード][商品コード]各々を選択できるコンボボックスが存在し、3つの選択後に同フォーム上の「単価」テキストボックスに[単価]が表示されるという仕様なのですが… なんかイメージが違っていたらすみません。
補足
イメージ通りです!私の説明が不足だらけですみません…メインフォームに[取引先コード] サブフォームに[商品区分コード][商品コード]があって、それぞれのコンボボックスから選択し終えると単価が表示される。まさにこの通りのものを作成したいのです。 >商品コードが入力できませんでした というのは、フォーム上で抽出条件としての[商品コード]が入力できないって事ですか? はい…。コンボボックスの項目を選択しようとすると「レコードを追加できません。テーブル'商品マスター’の結合キーがレコードセットにありません」と出てしまうのです。 >この単価マスタテーブルから、フォーム上の[取引先コード][商品区分コード][商品コー>ド]を抽出条件にして選択クエリーを作成すれば[単価]が出てきますよね。 この選択クエリの抽出条件のところにはなにか条件を入れるのでしょうか? 初歩的な質問ばかりでごめんなさい
- yubokun
- ベストアンサー率0% (0/10)
順番が違うような気がします。わたしもちゃんと習ったことがないので自己流ですけど表を作ってからリレションを設定しています。だって顧客コードの中に商品こーどがあるんじゃなくて顧客別に商品単価があるんですよね。だからテーブルのリレーションが違うのでは?なんてまだ自分でトライしてないので・・。でも似たようなものできたような気がしますけど・・。 ごめんなさい。たよりないお答えで。もっとちゃんとした回答がほしかったんですよね。でもできます。がんばって。
お礼
そうなんです… 同じ商品で顧客別に単価が違うので、リレーションの仕方がわからなくなってしまったんです。 でもがんばってみます! 早々にご回答いただきありがとうございました
お礼
あぁ~できました!! >リレーションを設定する際も、2つのフィールドを一度に設定します この通りにできました! うれしいです!本当にありがとうございました。 商品コードと取引先コードを入力したら、単価が自動で表示できました。 全て11n kacieさんが根気よくお付き合いしてくださったおかげです。 ありがとうございました!! これから細かいところを付け加えていって、使いやすいものにし、大いに活用します。 本当にありがとうございました。