こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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を入力出来ないようにしたいことなのですが。
この様な場合、どの様にデータベースとして、リレーションシップはどの様にして、主キーもどの様にするのが正しいやり方なのでしょうか?

リレーションシップも良く理解出来ていない状態ですが、宜しくお願いいたします。

投稿日時 - 2010-05-15 22:03:22

QNo.5897613

困ってます

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

サブのフィールドを下記のように変更します。
尚、得意先、商品等のテーブルも作成することになりますので
区別できるフィールド名にします。

メイン               サブ
                  注文明細ID(オートNo)主キー
注文ID(オートNo)主キー…注文ID(長整数)
注文書No             連番
注文者名              品名
日付                 金額

メインテーブルのメインIDとリレーションシップの設定をします。
フォーム作成はフォームウィザードを使います。
 ウィザードで最初の画面でメイン、サブの主キーを除いた項目を選択したフィールドに配置します
 あとはウィザードに答えていきます。
出来あがったフォームの文字のポイント、配置等にデザインモードで手を加えます。


>メインIDもサブIDも意味が無いと思っていますが。
!!!もったいないことを
注文No.も主キーに出来ますが、これを主キーにすると注文No.の変更ができなくなります
主キーはオートナンバーにしておくとシステムが採番してくれます。
フォーム、レポートの項目には必要ありません

>注文書Noの2度打ちの可能性はあります。
テーブル設計時 注文No.のインデックスを重複なしの設定にします

投稿日時 - 2010-05-16 02:00:38

補足

ありがとうございます。
メインの注文書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を入力しています
のようなメッセージに変えることはできますでしょうか?

追加で申し訳ありませんが、お願いいたします。

投稿日時 - 2010-05-16 10:20:11

このQ&Aは役に立ちましたか?

8人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

もし、行き詰っているのならしてなくても良いです。
余裕あれば・・・。

注文書単位のキー
「注文書No」+”0”固定値
注文書明細単位のキー
「注文書No」+「連番」”1”~”3”
こうすれば、全体でも重なることないし意味ある主キーになります。

PS.
テーブル項目が提示しているものだけなら
メイン、サブとテーブル2つにしなくてもなんとかなるのでは、と思います。
チェック仕掛けもより簡単になります。
(メイン、サブ)としていることの方が説明・回答ややこしくしている感じです。

投稿日時 - 2010-05-18 20:53:15

ANo.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の領域でしょうが 渡来してみましたが判りません

補足
[ファイル]→[印刷]でフォームはそのまま印刷できます
(うまくデザインすれば注文書になるかも)
各ボックスのプロパティーの書式書式タグの表示対象で
画面/印刷、画面のみ、印刷のみの設定が出来ます

投稿日時 - 2010-05-17 04:41:57

ANo.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」「テクニック」とかでいろいろ検索しています。
最初は結果を聞くと同時に、事例、解説をみるのも理解早くなります。
大きな書店で「テクニック集」とか探すと良いです。

いろいろあります。

投稿日時 - 2010-05-16 21:50:14

ANo.1

正しく動くやり方はいろいろあるので、
無駄があればそれが正しくないやり方といえます。
同じ項目があちこちに散らばらないこと、正規化することが理想でしょう・・・・。

メインテーブルとサブテーブルの決め方、考え方はどうしましたか?。

1次元的なやり方、参考)
注文書No*
注文者名コード*
└-----注文者名
日付                      
連番*
品コード
└-----品名
金額

作るなら、
これが格となるテーブルで、*が主キー。注文者名や品名は別テーブル。
画面には
メインフォームに注文書No、注文者名、日付
サブフォームに連番項目以下を表示、
注文書Noと連番が親子連結フィールド。
(1つのテーブルでもクエリ使えばメインとサブに表示できたはず)

入力できないようにする=>存在するか確認する、でクエリを使います。
「入力注文書No」がテーブルに存在するか。
「入力注文書No&入力連番」がテーブルに存在するか。
「連番は、1、2、3」となっているか。
さらに
「注文書Noの最大値」を求めるクエリを作っておくこと。
空き連番を見つけるなら
縦軸に注文書No、横軸に連番としたクロス集計クエリ

事例で
あとから
「注文書No1-連番2」での追加や修正はあるのか無いのか????。
たぶんしてはいけないと思いますが・・・。

投稿日時 - 2010-05-16 01:14:07

あなたにオススメの質問