Accessのデータベースの構築方法

このQ&Aのポイント
  • Accessのデータベースの構築方法について詳しく説明します。
  • 注文書データベースの構築について、メインテーブルとサブテーブルの作成方法を解説します。
  • リレーションシップの設定方法や主キーの適切な使い方など、Accessデータベースの構築に関する疑問にお答えします。
回答を見る
  • ベストアンサー

Accessのデータベースの構築の仕方について

Accessのデータベースの構築の仕方について Access初心者です。 1注文書にmax3品目まで記入できる注文書データベースの構築について教えて下さい。 メインテーブルと、サブデータを作っており、 メインテーブルには、注文書Noと注文者名、日付の1注文書内の重複するフィールドを サブテーブルには、連番(max3)、品名(max3)、金額(max3)の重複しないデータとしています。 以下の様な感じです。 メイン→注文書No  1   2   2   3   3   3 サブ →連番      1   1   2   1   2   3 本当は、注文書Noを主キーにして、同じ注文書Noを入力出来ない様にしたいのですが、インデックス、主キー、リレーションシップで値が重複しているのでテーブルを変更できないというエラーメッセージが出ます。 仕方が無いので、現在は諦めて、以下の様に注文書Noでリレーションシップを組んでいます。なので注文書Noの2度打ちの可能性はあります。 メインIDもサブIDも意味が無いと思っていますが。 メイン                    サブ(主キー設定無し) メインID(オートNo)主キー      サブID(オートNo) 注文書No-----------注文書No 注文者名                   連番 日付                      品名                          金額 私のやりたいことは、一つの注文書Noに対し、max3つまで連番で紐づけて、同じ注文書Noを入力出来ないようにしたいことなのですが。 この様な場合、どの様にデータベースとして、リレーションシップはどの様にして、主キーもどの様にするのが正しいやり方なのでしょうか? リレーションシップも良く理解出来ていない状態ですが、宜しくお願いいたします。

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

  • ベストアンサー
  • shinkami
  • ベストアンサー率43% (179/411)
回答No.2

サブのフィールドを下記のように変更します。 尚、得意先、商品等のテーブルも作成することになりますので 区別できるフィールド名にします。 メイン               サブ                   注文明細ID(オートNo)主キー 注文ID(オートNo)主キー…注文ID(長整数) 注文書No             連番 注文者名              品名 日付                 金額 メインテーブルのメインIDとリレーションシップの設定をします。 フォーム作成はフォームウィザードを使います。  ウィザードで最初の画面でメイン、サブの主キーを除いた項目を選択したフィールドに配置します  あとはウィザードに答えていきます。 出来あがったフォームの文字のポイント、配置等にデザインモードで手を加えます。 >メインIDもサブIDも意味が無いと思っていますが。 !!!もったいないことを 注文No.も主キーに出来ますが、これを主キーにすると注文No.の変更ができなくなります 主キーはオートナンバーにしておくとシステムが採番してくれます。 フォーム、レポートの項目には必要ありません >注文書Noの2度打ちの可能性はあります。 テーブル設計時 注文No.のインデックスを重複なしの設定にします

jyurymicke
質問者

補足

ありがとうございます。 メインの注文書Noを重複なしにして、同じ注文書Noは受け付けなくなりました。 再度、相談なのですが サブフォームに注文書Noも表示したいので、 メイン             サブ メインID 主キー      サブID 主キー 注文書No(重複無し)--注文書No(重複あり) 注文者名           連番 日付              品名                  金額 でも構わないでしょうか? でもこれだと注文書Noを変更したとき、サブの変更前のデータがテーブル上に残ってしまうことになり後でテーブルから削除しなければならなくなりますか? shinkamiさんの通りにやればそんな必要もなくなりますでしょうか?   メイン             サブ                  サブID 主キー メインID 主キー   --メインID 注文書No(重複無し)--注文書No(重複あり) 注文者名           連番                  品名                  金額 とメインIDと注文書Noの二つをリレーションすれば サブにも注文書Noを表示できて、メインの注文書Noを変更してもサブの変更前のデータが残ることを防止できますか? 複数の人が使う可能性があるので、サブテーブルから変更前のデータを削除する作業は怖くてしたく無いと思います。 それとサブの連番(max3)を今は手入力していますが、間違う可能性もあるので、サブのレコードと自動で連動入力することはできますか? サブレコード1の時、連番1 サブレコード2の時、連番2の感じです。 それと重複なしにして注文書Noの2度打ちは インデックス、主キー、リレーションが重複しているのでテーブルを変更できませんでした。再定義して下さいのメッセージが出るので防げるようになりましたが、 これを すでにある注文書Noを入力しています のようなメッセージに変えることはできますでしょうか? 追加で申し訳ありませんが、お願いいたします。

その他の回答 (4)

  • layy
  • ベストアンサー率23% (292/1222)
回答No.5

もし、行き詰っているのならしてなくても良いです。 余裕あれば・・・。 注文書単位のキー 「注文書No」+”0”固定値 注文書明細単位のキー 「注文書No」+「連番」”1”~”3” こうすれば、全体でも重なることないし意味ある主キーになります。 PS. テーブル項目が提示しているものだけなら メイン、サブとテーブル2つにしなくてもなんとかなるのでは、と思います。 チェック仕掛けもより簡単になります。 (メイン、サブ)としていることの方が説明・回答ややこしくしている感じです。

  • shinkami
  • ベストアンサー率43% (179/411)
回答No.4

>サブフォームに注文書Noも表示したいので、 >メイン             サブ >メインID 主キー      サブID 主キー >注文書No(重複無し)--注文書No(重複あり) >注文者名           連番 >日付              品名 >                 金額 >でも構わないでしょうか? >でもこれだと注文書Noを変更したとき、サブの変更前のデータがテーブル上に >残ってしまうことになり後でテーブルから削除しな>ければならなくなりますか? メインの注文書No.とサブの注文書No.は別のものならサブに追加してもかまいませんが フィールド名を注文明細No.とでもして後の混乱を回避してください。 ※同じものであれば、サブはメインとセットで使用することになりますので サブには必要ないでしょう >shinkamiさんの通りにやればそんな必要もなくなりますでしょうか?   >メイン             サブ                  サブID 主キー >メインID 主キー   --メインID >注文書No(重複無し)--注文書No(重複あり) >注文者名           連番 >                 品名 >                 金額 >とメインIDと注文書Noの二つをリレーションすれば >サブにも注文書Noを表示できて、メインの注文書Noを変更してもサブの変更前のデータが残ることを防止できますか? >複数の人が使う可能性があるので、サブテーブルから変更前のデータを削除する作業は怖くてしたく無いと思います。 リレーションによりメインとサブに上下関係が生れます 下位のレコードが残っていると上位のレコードは削除できません またテーブル間のリレーションは一つしか受け付けません >それとサブの連番(max3)を今は手入力していますが、間違う可能性もあるので、 >サブのレコードと自動で連動入力することはできますか? >サブレコード1の時、連番1 >サブレコード2の時、連番2の感じです。 オートNo.という手はありますが自働採番はテーブル単位なので メインの注文単位の連番となるとVBAを組み込みます。 自分はやったことはありませんがだいぶ工夫が必要でしょう。 >それと重複なしにして注文書Noの2度打ちは >インデックス、主キー、リレーションが重複しているのでテーブルを変更できませんでした。 >再定義して下さいのメッセージが出るので防げるようになりましたが、 >これを >すでにある注文書Noを入力しています >のようなメッセージに変えることはできますでしょうか? これもVBAの領域でしょうが 渡来してみましたが判りません 補足 [ファイル]→[印刷]でフォームはそのまま印刷できます (うまくデザインすれば注文書になるかも) 各ボックスのプロパティーの書式書式タグの表示対象で 画面/印刷、画面のみ、印刷のみの設定が出来ます

  • layy
  • ベストアンサー率23% (292/1222)
回答No.3

>「注文書Noを変更」? 注文書Noは発生する度に番号が増えていくものでは?。 過去に発行している注文書Noを修正ということは、他の金額とかの項目は そのままで注文書Noのみ付け替えしたもの(他一致)が発生する運用ということでしょうか。 「新レコード追加→他項目は複写して更新→元のレコード削除」でもできますが まだ難しいですよね?。 ------<補足>------------ もし、 回答待ちで時間を持て余しているのであれば、 下記を参考に見るなど参考にしてください。 ほんの一部です。今すぐ使えそうなところ適当に見つけました。 掲示板では言葉だけなので、わからないところあったかと思います。 データ更新前にキーの重複をチェックする方法 http://www.tsware.jp/tips/tips_161.htm マスタの主キーを変更したら対応するデータテーブルのレコードも更新する方法 http://www.tsware.jp/tips/tips_007.htm モーグ/Access一般機能 http://www.moug.net/tech/acopr/ AccessTips 初心者講座 http://www.accessclub.jp/actips/index.html Access Tips http://www.geocities.jp/cbc_vbnet/tips/Tips.html 027 2006/01/13 サブフォームに枝番を自動的に入力する方法 アプリケーション開発に役に立つ小技集です。 http://fk-plaza.jp/ACS/TIPS/waza53.htm 新規登録時に重複レコードがある場合に警告を出すフォーム →画面見にくいですが、メニューバーのすべてを選択したら見えやすいです。 マイクロソフトアクセス特設ページ http://pc-dr.jp/acc/acc-key.htm 「ACCESS」「TIPS」「テクニック」とかでいろいろ検索しています。 最初は結果を聞くと同時に、事例、解説をみるのも理解早くなります。 大きな書店で「テクニック集」とか探すと良いです。 いろいろあります。

  • layy
  • ベストアンサー率23% (292/1222)
回答No.1

正しく動くやり方はいろいろあるので、 無駄があればそれが正しくないやり方といえます。 同じ項目があちこちに散らばらないこと、正規化することが理想でしょう・・・・。 メインテーブルとサブテーブルの決め方、考え方はどうしましたか?。 1次元的なやり方、参考) 注文書No* 注文者名コード* └-----注文者名 日付                       連番* 品コード └-----品名 金額 作るなら、 これが格となるテーブルで、*が主キー。注文者名や品名は別テーブル。 画面には メインフォームに注文書No、注文者名、日付 サブフォームに連番項目以下を表示、 注文書Noと連番が親子連結フィールド。 (1つのテーブルでもクエリ使えばメインとサブに表示できたはず) 入力できないようにする=>存在するか確認する、でクエリを使います。 「入力注文書No」がテーブルに存在するか。 「入力注文書No&入力連番」がテーブルに存在するか。 「連番は、1、2、3」となっているか。 さらに 「注文書Noの最大値」を求めるクエリを作っておくこと。 空き連番を見つけるなら 縦軸に注文書No、横軸に連番としたクロス集計クエリ 事例で あとから 「注文書No1-連番2」での追加や修正はあるのか無いのか????。 たぶんしてはいけないと思いますが・・・。

関連するQ&A

  • 入力時のエラーメッセージ

    入力時のエラーメッセージ Accessでメインフォームとサブフォームを作成しました。 その中でメインの注文書Noとサブフォームの連番の入力をするときに、エラーメッセージが必ず出ます。 OKで消すことで入力自体は出来るのですが、毎回出るので面倒です。 メッセージは[Link Master Fieids/リンク親フィールドプロパティの設定でエラー 名前が適切でありません clickが発生しました]です。 データベースの構築自体がまずいのでしょうか? やっていることは、一つしかない注文書Noと数種類の項目をメインフォームとして、サブフォームは連番(1~最大4まで)とそれぞれの連番の注文内容としています。 一つの注文書が、4品名まで記載出来るようになっており、注文者などの重複する項目をメインとして、重複しない品名などの項目をサブにしています。 データベースの作り方もよく判らないで本を読みながら作ったので、困っています。 宜しくお願いします。

  • access2007 リレーションシップについて

    アクセス初心者です。 テーブルを複数作成しました。 これをリレーションシップをしたいと思うのですが、「主キー」の扱いに悩んでいます。 参考書などは主キーともう1つのテーブルの同じ項目名でかつ主キーでないものを結んでいますが、主キー同志は結んではいけないですか? メインで使うテーブルのIDを支点に、他の複数のテーブルのIDを放射状に結びつけて関連付けたいと考えています。 どのようにして作成していけばできますか? そのようなことができないのでしたら、どのようにしたらできますか?

  • アクセスの連番について

    アクセスでテーブルのkanri_Noという項目に管理番号を振りたいと思っています。 他のテーブルに後でインサートするので、そのテーブルのKanri_NOの最大値をKanri_Maxとして引いてきてそのKanri_Max+連番という風に振りたいのですが、どうSQLを入れればいいのか分かりません。 Kanri_Maxが4000だったら、4001、4002、4003・・・、Kanri_Maxが5000だったら5001、5002、5003とKanri_Noの項目に連番を振りたいのです。 連番を振る前のKanri_Noは空白です。 初心者で申し訳ないのですが教えてください。

  • Access2000でメインサブフォーム

    テーブル1 商品ID 数値型(主キー) 商品名 テキスト型 ------------------ テーブル2 売上ID  数値型(主キー) 商品ID  数値型 月日   日付型 売上個数 数値型 --------------------- 以上のようなテーブルがあり、テーブル1を「メイン」テーブル2を「サブ」のメインサブフォームを作成しました。 しかし、「サブ」のデータが多いため、さらに、サブフォームの日付フィールドを使い、抽出をしたいのですが、方法がわかりません。(例えば、9/1以上9/10以下のような抽出) いろいろやってみは見たのですが、思うようにできません。メインサブフォームでさらにサブフォームのデータを抽出するということは無理なのでしょうか?

  • Access アクセス VBA レコード追加

    Access フォームからのレコードの追加方法を教えてください。 テーブル1 ・ID(主キー) ・窓口 ・コストセンター ---------- テーブル2 ・コストセンター(主キー) ・目的 ---------- リレーションシップ テーブル1のコストセンターとテーブル2のコストセンターを一対多 ---------- メインのフォームに”ID”を入力したときにテーブル1に一致するレコードがない場合、新規登録用のフォームが表示されるようになっています。 新規登録用のフォームにレコードを入力してもテーブルに反映されません。 新規登録用のフォームは下記のように作成しています。 また、フォームに”コストセンター”を入力したときに入力したレコードがテーブル2にあっても自動で”目的”が表示されません。 メインフォームにはサブフォームで各テーブルが表示されています。 フォーム ・ID(初期値•••メインで入力したID) ・窓口 ・コストセンター ・目的 ・コストセンター(非表示) 上から順に ・テーブル1 ・テーブル1 ・テーブル2 ・テーブル2 ・テーブル1

  • Accessのリレーションシップ

    Access初心者です。 Access2010でデータベースを作っていて、行き詰ってしまいました。 テーブル1にフィールドABCDEFがあって、Aに主キーが付いています。(Aはテキスト型でフィールドサイズ10です。) テーブル2にはフィールドAGHがあり、Aに主キーが付いてます。(Aはテーブル1と同じです。) テーブル3にも同じくフィールドAIJがあり、Aに主キーが付いています。(Aはテーブル1と同じです。) テーブル1のフィールドAを主テーブルとし、テーブル2・3のフィールドAにリレーションを組んでいます。 この時のリレーションシップで参照整合性と連鎖更新と連鎖削除にチェックを入れ、種類が一対一になりました。 その後、テーブル1でレコードを追加しようとすると、「テーブル'2'にリレーションシップが設定されたレコードが必要なので、レコードの追加や変更を行うことができません。」と出ます。 これを解決する方法はどうするのか、お教えお願いします。 分かりにくい説明ですいません。

  • Access2003:重複なしでデータを取り出す方法を教えてください

    住所テーブルと注文テーブルを結合させ、ダブらない抽出をしたいと思っています。 (最終的には「最近の注文した顧客の住所ラベル」を作りたいのです) 住所テーブルは ID(オートナンバー型)|*顧客番号(テキスト型)|住所(テキスト型)|郵便番号(テキスト型)  *は主キー 注文テーブルは *注文ID(オートナンバー型)|顧客番号(テキスト型)|注文日(Date型)|商品ID(テキスト型)|注文数(Int型)  *は主キー 注文テーブルの注文日を2007/1/1以降とクエリをかけると、同じ顧客番号が出ます。 つまり、注文日を2007/1/1以降とした住所テーブルと顧客テーブルを結合してクエリをかけると、注文テーブルで重複した顧客のデータも出てしまいます。 これを同じ顧客番号が重複しないように抽出したいのです。 他のQAも拝見しましたが、イマイチ行いたい事柄にヒットしていないと思い、 更には当方がそれらを理解する域まで及ばないと思いまして、新しい質問としてあげさせていただきました。 どなた様か、お分かりの方がおいででしたらご教示くださいますよう、お願い申し上げます。

  • ACCESSで成績管理

    成績管理DBを作っています。わからないことがあるので教えてください。 Aテーブル No(主キー) 名前 住所 TEL 成績 とあります。 「成績」レコードですが、これまでの履歴もちゃんと保存していきたいと考えております。 その場合、もう一つ下記のようなテーブルを作ってみました。 Bテーブル ID(とりあえず主キーを設定するため) No. 国語 数学 理科 社会 AテーブルとBテーブルの「No.」でリレーションシップを設定。 質問なんですが、こんな(変な)やり方でいけるでしょうか?別の効率のよい方法があったら教えてください。 ※テーブルの概念を言葉で伝えるのは本当に難しいですね。補足がありましたら入れてください。

  • Access 分割したテーブルを一対一で結合。新規レコードが作れなくなりました

    過去に同様の質問が無かったようなので質問します。 Access2002です。 これまで顧客名簿を一つのテーブルで管理していたのですが、フィールド数が増えてきたので、 テーブルを5分割しました。 主テーブルに対し副テーブル4つを、主テーブルのID(主キー、オートナンバー型)と副テーブルそれぞれのID(数値型)で一対一結合しています。 下記のようなイメージです。 テーブルA-テーブルB テーブルA-テーブルC テーブルA-テーブルD テーブルA-テーブルE すると、 新規レコードの登録が出来なくなってしまいました。 全部のテーブルを結合させたクエリを作って、そのクエリを基にフォームを作ったり、 主テーブルのフォームに副テーブルのサブフォームを4つ設置したり、 幾つか方法を試みたのですが、どれも同じエラーメッセージが出ます。 ↓ 「インデックス、主キー、またはリレーションシップで値が重複しているので、テーブルを変更できませんでした。重複する値のあるフィールドの値を変更するか、インデックスを削除してください。または重複する値を使用できるように再定義してください。」 非常に基本的な質問なのかも知れませんが、お手上げです。 どなたかご教授くだされば幸いです・・・。

  • 未定義になるのは主キーじゃないのが原因?

    二つのテーブルを一対多のリレーションシップで繋ぐとき、 一になる方は主キーじゃないと、一対多にならなかったり参照整合性はできないのでしょうか? 主キーではないテーブル1のフィールド(一)と、(多)のテーブル2のフィールドでリレーションを組もうと思ってるのですが、 リレーションシップの種類が未定義になってしまいます。 これは、1になる方のテーブル1が主キーじゃないのが原因なのでしょうか? テーブル1のこのフィールドは、重複することはありませんが、空白も入る為、主キーにできないし、 主キーはほかのフィールドで使っています。

専門家に質問してみよう