• ベストアンサー

Accessのテーブル構造で悩み中…(*_*)

こんにちは。Windows NTでAccess2000を使っています。 製造業の伝票情報を整理するためAccessと格闘しているのですが 以下の3つのテーブルの構造と結合で悩んでいます。 T_伝票:伝票番号を始め、得意先名や担当営業名など     別のデータベースから情報を引っ張る(ゆえに入力不要) T_商品:その仕事の仕様等、商品の詳細情報を入力。 T_発送:その商品の発送日・納品日などの納期情報 T_伝票とT_商品の伝票番号は重複なしで設定できますが T_発送は1つの商品を何回かに分けて送るときが多々あるため重複ありです。 3つのテーブルはそれぞれ入力する人が違う(T_商品は複数人)ことも要注意です。 クエリでT_伝票とT_商品の伝票番号をつないでフォームで伝票番号を入力したとき T_伝票の得意先名や営業名が自動表示されるようにしたいのですが、 両方ともインデックスを重複なしにすると不可能でした。 (特に一対一のリレーションシップは設定していません。) そこでT_商品の伝票番号インデックスを重複ありにするとクリアできました。 その後で1つの仕事に対して発送情報が複数のレコードになることが判明した為 始めはT_商品と一緒に収めていた発送情報を別テーブルにしなければならなくなりました。 しかしそうすると、どうT_商品とT_発送をつないでよいのかわからなくなりました。 T_商品から追加クエリでT_発送に同じ伝票番号を持たせることを思いつきましたが T_発送の伝票番号は重複ありでなければならないため 追加のたびに過去のレコードが重複してしまいます。 かといって追加のたびにT_発送を削除していたら 送りが複数にわたる場合の情報が消えてしまうことになります。 (しかも複数人入力の為削除のタイミングも難しいため合理的でない) どこをどうすればうまく回避できるのか打開策が尽きてしまいました。 どうかよい知恵があればご教授くださいm(_ _)m

質問者が選んだベストアンサー

  • ベストアンサー
  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.3

>T_発送に・・でもこれだとT_商品との結合は不可能・・ T_伝票とT_商品は伝票番号でリレーションをとっているのならT_商品のフィールド で伝票番号と商品IDなどありますよね。T_発送は独自の主キーを使うとして処理の 際にT_商品の伝票番号と商品IDを保存するフィールドを作ってリレーションする 場合はT_商品の伝票番号とT_発送の伝票番号・T_商品の商品IDとT_発送の商品ID 間で繋ぐようにすれば問題ないと思うのですが。 T_発送の独自の主キーは単にT_発送に保存しるレコードのIDとしてのみ使う。 >T_伝票とT_商品での一対一のリレーションシップ T_伝票の伝票番号は主キー(重複なし)でT_商品の伝票番号はインデックスのみで (重複あり)にしリレーションはT_伝票とT_商品が一対多のリレーション設定に すれば良いのではないですか。

その他の回答 (2)

  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.2

お力に添えますかどうかわかりませんが >どうT_商品とT_発送をつないでよいのか・・・ 通常はT_商品の伝票番号とT_発送の伝票番号をリレーションするのではなく T_発送は独自のIDなどを使うのが一般的と思うのですが・・。 例えば発送の際の出荷伝票番号とかです。(あくまで例ですが) T_発送のテーブル内に発送IDと伝票番号を持たせる。主キーは発送IDで伝票番号は 重複ありのインデックスでOK。 T_商品とT_発送を切り離して考える方が解決方法を見つける近道だと思います。 発送の処理は独自の発送IDで処理するがそのレコード内に伝票番号のフィールドも あるという考え方であればT_発送で該当する伝票番号の検索等もできT_商品との リレーションもT_商品の伝票番号とT_発送の伝票番号のフィールドで行えます。 もしくはT_商品の伝票番号+商品IDとT_発送の伝票番号+商品IDで。 >T_発送は1つの商品を何回かに分けて送るときが多々あるため・・ T_商品のレコードに発送チェック用のYes/No型のフィールドを作っておき発送され た商品はT_発送に発送レコードを保存する際にT_商品の発送チェックにYesを更新 し発送処理をするレコードは発送チェックがNoのレコードのみ表示できるように しておけば良いのではないでしょうか。 発送処理後T_発送にレコードを追加する際も発送チェックがYesのレコードのみ保存 するようにすれば商品のレコードが重複保存されることがなくなると思います。 質問を一読したところではこんな感じで良いと思うのですが希望する回答でない時 は再度ご連絡をお願いします。

Sheep17
質問者

補足

返信ありがとうございましたm(_ _)m T_発送に独自のIDを持たせるという件ですが、特に発送独自のナンバーというのがないのでオートナンバーで対処するしかなさそうです。でもこれだとT_商品との結合は不可能ではないでしょうか? 書き忘れましたが操作の手順としては伝票の情報(T_商品+T_発送)は 全て工務を担当する人間が入力し、この発送情報をもとに発送が複数に分かれる場合は コピー+貼付けで発送日を変更して発送が終わったら済のチェックを入れる…という風にする予定です。 ふと思ったのですが、T_伝票とT_商品での一対一のリレーションシップにおいて 得意先名や営業名の更新がきちんとできないのはなぜなのでしょうか? T_伝票の伝票番号にキーを持たせているのがまずいとか?? T_商品の伝票番号のインデックスを重複なしにできれば 少しはやりやすくなりそうな気がするのですが…素人意見ですみませんm(_ _)m

  • nobunojo
  • ベストアンサー率29% (122/407)
回答No.1

一つの伝票番号に多くの発送情報を対応付けなくてはならないのなら、 T_発送に、伝票番号のフィールドのほか、その伝票番号の中で発送情報を 管理するような子番号(あるいは入力日時とか)のフィールドを別途設けて、 二つのフィールドを組み合わせてキーなりインデックスににすれば よいのではないでしょうか。 そうすれば、T_発送で伝票番号一括の検索もできますし、 発送情報を個別に識別することもできます。

関連するQ&A

  • ACCESS2000のテーブル構造

    ACCESS2000のテーブルの作り方について質問します。 伝票フォームを作り「取引先コード」「商品区分コード」「商品コード」3項目を入力したら単価が表示されるようにしたいのですが、うまくいきません。 (同じ商品でも取引先により単価が違うので、3つの情報がそろったときにはこの単価になるという形にしたいのです) 現状は「商品区分テーブルの区分コード」と「商品マスターテーブルの区分コード」  「商品マスターテーブルの商品コード」と「単価テーブルの商品コード」をそれぞれ1対多リレーションし、 そして「単価テーブルの単価コード.商品コード取引先コード,単価」で選択クエリを作り、それを伝票のサブフォームにしてみたのですが、商品コードが入力できませんでした・・・ 何冊か本を参考にして作ってみたのですがうまく出来ませんでした お分かりになる方がいらっしゃいましたら教えてくださいよろしくお願いいたします。

  • ACCESSクエリーについて

    ACCESSクエリーについてですが、複数列、行が ある顧客テーブルがあり、そのデータテーブルには、 伝票番号がレコード毎にふられています。 このレコードはお客様によっては、 複数行となることもあります。 その場合は、お客様に同じ伝票番号が 複数行にわたってふられるケースも あります。 目的はクエリーで伝票番号の先頭の 行だけを引っ張りたい、です。 単に伝票番号だけを引っ張るだけであれば、 簡単にプロパティの固定値をはいに変えるだけ でできますが、伝票番号が複数存在することが ありえるなかで、伝票番号の先頭のみの 行のみ抽出させることは可能でしょうか。

  • 2つのテーブルで重複する値のレコードを削除したい

    削除クエリ?重複クエリ?について教えてください。 テーブル1 フィールド"番号"には 1 2 3 テーブル2 フィールド"番号"には 3 4 5 があるとします。 「テーブル2と重複しているテーブル1のレコードを削除する」 (この場合「3」が重複しているのでテーブル1の3が入力されているレコードを削除) としたいのですがどいゆうSQL文を書けばいいのかわかりません。 ご教授よろしくお願いします。

  • Accessでのテーブル構造の作り方

    MS Access 365版について質問です。 知識は、先週末に入門書(Accessのデータベースのツボとコツがゼッタイにわかる本)を一冊読んだだけで初めての実務というレベルです。(非ITエンジニアなので専門用語は避けていただけるとありがたいです) 用途は、自部署内のデータ管理です。 質問1 今、あるテーブルT1があったとして、そこにフィールドT1_F1~T1_F10があったとします。 この時、主キーにするID(T1_F1)以外のT1_F2~T1_F10はすべてドロップダウンで入力したかったとします。 T1_F2のドロップダウンを表示するときの参照するマスタとなるテーブルとしてMT2があったとして、フィールドがMT2_F1~MT2_F5まであったとします。 MT2の主キーをMT2_F1として連番が振られているものとして、MT2_F2にはそのレコードの概要(そのレコードの全体像が把握できる日本語名称)が格納されていて、MT2_F2~MT2_F5までは各種のパラメータが格納されています。 また、T1_F3以降も同様のマスタとなるテーブルMT3~MT10を参照していたとします。 このときに、T1のレコードを入力するとしたら、T1_F2のドロップダウンにはMT2の主キーであるMT2_F1(連番)を選択することになると思います。 しかし、連番ではユーザーが直感的な選択ができないため、連番を選ぶ際に、同時にMT2_F2(日本語の説明)が見れると便利だと思います。 このようなことは実現できるでしょうか? できるとしたら、どのような方法になりますでしょうか? T1へのレコード入力のクエリと、MT2~MT10への選択クエリを同じ画面に表示させるなどができるなら、それが王道でしょうか? 質問2 次に、T1_F3のドロップダウンはMT3の主キーを表示することになります。 しかし、MT3はフィールドが1つだけで構成されており、内容も「パターンA」「パターンB」~「パターンF」のような日本語を主キーに設定すれば事足りるパラメータだったとします。 (ようは、T1_F3のレコードに入力可能な日本語は何パターン化に規制したいだけで、「パターンA」などに紐づくそれ以上の情報は存在しない状態です) この場合、T1側で入力規制をすることは可能でしょうか? これだけの目的でも、マスタ(MT3)をつくるのが正攻法でしょうか? 実は、この例ではT1のフィールド数は10としましたが、実際にはもっと多く、T1_F4が参照するMT4の各フィールドがさらに、そのマスタとなるテーブルを参照しに行かなければならないという状態で、おそらく、全体で少なくとも3層~5層程度の構造になりそうで、マスタとなるテーブル数も数十くらいになりそうです。 これをつくるのがやや手間になりそうなので、1層だけでも手抜いてテーブル数を少なくできるならそうしたいという目的です。 ただ、メンテナンス性などもろもろを考えると、マスタテーブルを用意するのが正攻法ということなら、手間はかけてもテーブルを作りたいと思っています。 お手数ですが、よろしくお願いいたします。

  • Access アクセスについて

    Accessでデータベースを作っています。 テーブル、クエリは下記のようになっており、リレーションシップで紐付けしてあります。 クエリからフォームを作成し、商品番号を入力することでマスタテーブルに登録されていれば自動で商品名等の情報が表示されるようになっています。(フォーム1) 商品番号を入力しカーソルが移動した時、マスタテーブルに該当する項目がなかった場合、マスタテーブルから作成した新規追加用のフォームが表示されるようになっています。(サブフォームではありません) 新規追加用フォームに商品名を入力し、閉じてもフォーム1の商品名の欄に反映されません。新規追加用フォームを閉じる時にVBAで”Requery”,”Refresh”もやってみましたがダメでした。商品番号を入力し直すと表示されます。 どうすれば自動で商品名が表示されるようになるか教えてください。 テーブル1(入力用) 1.ID(主キー) 2.商品番号 3.etc. テーブル2(マスタテーブル) 1.商品番号(主キー) 2.商品名 3.etc. クエリ 1.ID(テーブル1) 2.商品番号(テーブル1) 3.商品名(テーブル2) 4.etc.(テーブル2) 5.etc.(テーブル1)

  • アクセスで値を参照したい

    Win2000,Access2000を使用しています。 AB二つのテーブルに「仮番号」というフィールドがあり、同じ「仮番号」のレコードに同じ「伝票番号」をつけたいんです。 Aテーブル(お客様情報) Bテーブル(注文履歴) Aテーブルの「伝票番号」フィールドに番号を入力したら、BテーブルのAと同じ「仮番号」のレコードの「伝票番号」フィールドに番号が入力されるようにしたいのですが、どのようにVBまたは、フォーム上のテキストボックスのプロパティで組んだらよいのかわかりません。 Bテーブルには、過去の注文データもあるのですでに入力されているレコードには過去に受注した時の伝票番号入力されています。 新規入力したレコードに対してだけAと同じ伝票番号をつけたいのです。 Bテーブルで、         |商品名|価格  |伝票番号| 過去の受注データ|電卓 |¥500|1000  | 今回の受注データ|名刺 |¥800|2500  | と、こんな感じにしたいんですが うまく説明できず申し訳ありませんが、どうぞよろしくお願い致します。

  • フォームで入力した内容をクエリに反映させる方法

    Accessについて教えていただければと思います。 会社のシステムのデータベースにリンクし、Accessのツールを作っています。 複数のテーブルでクエリを作り、フォームに条件指定し表示させるところまで進んでいます。(DLookUpを使っています。) このフォームに、非連結のテキストボックスを追加し、条件入力で表示された内容に、テキストボックスで入力した内容を合わせ、テーブルもしくは、クエリに保存しておきたいのですが、うまくいきません。 構成は、 Aテーブル:伝票番号、得意先 Bテーブル:伝票番号、枝番、数量 ABクエリ:伝票番号、枝番、数量、得意先 Cフォーム:伝票番号+枝番を入力し、数量、得意先を表示      配送個口数をテキストボックスに入力 Cフォームのすべての項目をのちに呼び出せるように保存しておきたいのです。 配送個口数を入力すると、枝番に関係なく、同じ伝票番号〈複数〉に登録。という形は(一時)できたのですが、枝番で絞り込めず困っています。 VBAもあまり得意ではないので、わかりやすくご指導いただければと思います。 どれだけの情報が必要かも分からないので、とりあえず、この状態で投稿いたします。 長くなりましたが、よろしくお願いいたします。

  • Access マスターテーブル

    Accessについて。 テーブル1がID(主キー)、注文日、商品番号、納期など入力欄の項目で、テーブル2が商品番号(主キー)、商品名で商品のマスターテーブルになっています。 商品番号を入力すれば商品名が表示されるようにクエリを作成し、そのクエリからフォームを作っています。 ここまでは良いのですが、新しい商品番号を入力したときに限りフォームから商品名も入力する事でマスターテーブルに登録されるようにしたいのですが、どうすれば良いでしょうか?

  • Accessでクエリに規則性の無い重複データが

    Accessに二つのテーブルを作りました。 Tユーザー情報 ・ユーザーID ・郵便番号 ・性別 T都道府県 ・都道府県名 ・郵便 Tユーザー情報には都道府県のデータがないため、 T都道府県とひもづけたいのです。 続いてクエリを作成しました。 ・ユーザーID(Tユーザー情報) ・性別(Tユーザー情報) ・郵便番号(Tユーザー情報)→リレーションシップ:郵便(T都道府県) ※結合プロパティで「両方のテーブルの結合フィールドが同じ行だけを含める。」 ※無効な〒番号のユーザーは省きたいため ・都道府県(T都道府県) 結果、Tユーザー情報の件数よりも、クエリのレコードの件数が多くなってしまいました。 ユーザーIDを見ると、全く同じレコードが数行混ざっていました。 重複レコードはそれぞれ件数が違い、規則性も見つかりません。 全体で10万件のうち8千件くらいの重複データができてしまいます。 googleで調べると、もともと重複データのあるレコードを削除する方法は あるようですが難しく、そもそも重複データを作らない方法が見つかりません。 クエリの作り方が間違っているのでしょうか… どうぞよろしくお願い致します。

  • Access2010でテーブルの内容で検索

    現在Accessの勉強をしています。 Aテーブル、Bテーブルとあり、 AテーブルはID(オートナンバー)、番号(数字)、名前(文字列)が入っています。 この番号は重複ありで、複数レコードあるとします。 Bテーブルも同じようなID、番号、名前が入っていて、ここの番号は重複していません。 いわばマスタテーブルのようなものです。 (IDと番号を別ける必要があるのかなど、細かいことはこの際気にしないでください。) Aテーブルの全てのレコードの番号を検索し、Bテーブルにない情報だけを表示したいと思います。 この場合どのようにすればよいでしょうか? まだAccessを勉強したてで、よくわかっていないのですが、シンプルな方法はどのようにすれば良いのか思案中です。 よろしくお願いします。