電子書籍の厳選無料作品が豊富!

(テーブル名):(フィールド名)
商品テーブル:商品名。
単価数量テーブル:商品単価、数量、仕入番号、商品名。
仕入テーブル:仕入番号、仕入日、注文日、手数料、輸送費など。
売上テーブル:売上、販売日付、仕入番号、商品名。

リレーションシップ:一対多
商品テーブル商品名-単価数量テーブル商品名
商品テーブル商品名-売上テーブル商品名
仕入テーブル仕入番号-売上テーブル仕入番号
仕入テーブル仕入番号-単価数量テーブル仕入番号

このように作成しました。
ここで問題なのが、商品名の入力です。
仕入テーブルをメイン、単価数量テーブルをサブフォームにしてフォームを作成しました。
さて、商品名を単価数量テーブル商品名フィールドのサブフォームから入力・・・と思ったら、商品テーブル商品名フィールドに名前がないためエラーが出ます。(参照整合性をしているため)
サブフォームの入力フィールドを商品テーブル商品名に変更すれば入力できます。
しかし、重複した商品名を入力できません(重複しないに設定しているため)

何故このようなことをするか?ですが、同じ商品でも購入日が違えば単価が違う場合があります。
ですので単価数量テーブルでは同じ商品名を使用する必要があります。
しかし、商品テーブルでは同じ商品名は必要ありません。
もちろん先に商品テーブルに商品名を入力すれば問題ありませんが、入力効率から言って問題あります。

さてここで質問なのですが、一対多の多から商品名を入力して一側に反映できないでしょうか?
一側にすでに同じ商品名がある場合は反映してはいけません。

ちないにVBAやSQLはコピペぐらいはできますが、書けませんのでご了承を。

A 回答 (6件)

ANo.3です


前の回答は ANo.1への補足を見る前に書き込みました あしからず

>そのため商品番号(商品ID)でつなげていません
何を目的としてデータ管理ソフトを使うか次第ですよね
請求書の発行まででよいなら 商品IDをつけなくてもいいのかもしれない
(て 言うか[商品テーブル]が必要ない?)

あと扱う商品の種類などと 誰がデータを入力するか ですね
ご存知のこととは思いますが 
"さんま"、"サンマ"、"秋刀魚"、"鰶"は別の物としてコンピュータは扱います
かならず"さんま"で統一できるのならありかな?


>これが出来ないので困っています
え!?
どこで行き詰ってますか?
メインフォーム、サブフォームは理解されているようですが
「仕入テーブル」と「単価数量テーブル」からそれぞれ「仕入フォーム」、「単価数量フォーム」作っておいて、「仕入フォーム」のデザインビューで ツールボックスからサブフォーム/サブリーポート、ウィザードで「単価数量フォーム」と[仕入番号]で結びつければ とりあえずのものはできませんか?

この回答への補足

(て 言うか[商品テーブル]が必要ない?)
これに関しては私も考えましたが、あとで例えばメーカー名などを追加する場合
あったほうが簡単に追加できるので必要ないわけではないです。

>"さんま"、"サンマ"、"秋刀魚"、"鰶"は別の物としてコンピュータは扱います
>かならず"さんま"で統一できるのならありかな?
私しか使う予定がないので問題ないかと思います。
記憶が薄いので正確ではないかもしれませんが、商品テーブルにすでに入力
されている商品名は表示できたと思いますしコンボボックス?、間違えそうなものは入力禁止にします。
>どこで行き詰ってますか?
それは商品名を入力できない(商品テーブルに反映できない)という意味で。
フォームは出来ていますよ。
更新ボタンをつけるのが一番よさそうです。

補足日時:2011/10/30 23:59
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
色々考慮していただきありがたく思います。

お礼日時:2011/10/31 22:57

補足:一対多の多から商品名を入力して一側に反映できないでしょうか?



その手順は、次のようです。

1、仕入伝票の行明細部で商品名を入力。
2、一側に反映する必要があるか否かをチェック。
3、反映する必要があれば1側を更新して商品の主キーを取得。
4、反映する必要がなければ既存の商品主キーを記録。

なお、私は参照整合性は<多から1へ>にしてきました。
この場合、一側に存在しなくてもエラーは発生しません。
ですから、質問者みたいに<エラーがでます!>というクレームは皆無。
<多から1へ>は、ユーザからエラーを隠蔽する上で有効です。
当然に、自前の参照整合性をチェックして告知する仕組みは必要。

この回答への補足

リレーションシップは参照整合性チャックを外して、
えーっと、更新クエリを作成して、更新ボタン(クエリの実行ボタン)を作るってことですかね?
う・・・ん? 違うかな?

>当然に、自前の参照整合性をチェックして告知する仕組みは必要。
うん?これもクエリでってことですかね?

>なお、私は参照整合性は<多から1へ>にしてきました。
商品テーブル←単価数量テーブル

こうすれば単価数量テーブルの商品名(商品ID)に入力は出来ますね。
(あとで商品テーブルに単価数量テーブルの商品名に入力した商品名を更新する必要がありますが。)

補足日時:2011/10/30 23:38
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
ご意見を参考にデータベース作成にかかりたいとおもいます。

お礼日時:2011/10/31 22:56

>入力するのが一番速いです。



もちろん、アプリケーションはそのように作ります。

メインフォーム
仕入番号:xxxxx
注文:2010年11月15日
仕入:2010年11月20日

サブフォーム
<商品名><単価><個数>
さんま:200円:10
さば:150円:15
まぐろ:100円:20

こういう入力を実現するには、先に示したテーブル設計が必須。

>そのためわざわざ一個一個同じ日付を入力するのは非効率です。

だから、標題部と行明細部に分けるんですよ。

この回答への補足

えーっと私が製作しているDBと違うので正直それは必要ないかと・・・・
というかそもそも同じような事はしています。

単価数量テーブルが仕入詳細テーブルにあたりますね。

ちなみに輸送料や手数料を単価数量テーブルに入れていないのは、
商品ごとに送料、手数料がかかるわけではないのでそうしています。

注文した商品の全体に対して送料、手数料はかかるので。

補足日時:2011/10/30 23:42
    • good
    • 0

>一対多の多から商品名を入力して一側に反映できないでしょうか?


結論から言うと、出来ません(と、思う ^^; )
それを出来なくするための「参照整合性」です

Accessのある参考書によると
「参照整合性を設定すると、設定したテーブル間に以下のような規則が出来ます。
 (1)主テーブルの主キーに存在しない値をリレーションテーブルの外部キーフィールドに入力することはできません(Null値を入力することは可能ですが、レコードの関連性はないとみなされます)。
   以下略

では 参照整合性を設定しなければどうなるか、ですが上の解説のNull値の場合と同様に 商品テーブルに存在しない[商品名フィールド]を持つレコードが単価数量テーブルに入力されるだけです

ではどうするか
「商品テーブル」から「商品名入力フォーム」を作り、「『仕入テーブルをメイン、単価数量テーブルをサブフォーム』にして作ったフォーム」に「商品名入力フォーム」を開くコマンドボタンを配置
が一般的かなぁ

質問文の中に"主キー"について何も書かれていませんが どう設定されてますか?
主キーとは (前出の参考書より)
「リレーショナルデータベースでは、テーブルに格納されているデータをより速く検索、抽出することが重要です。そのためには、テーブルに格納されている各レコードを識別できるフィールドが必要になります。この情報(各レコードを識別できるフィールド)のことをテーブルの主キーといいます。」
商品テーブル:商品ID、商品名
単価数量テーブル:商品単価、数量、仕入番号、商品ID
とした方がよろしいかと

この回答への補足

なるほど・・・出来そうにありませんか。
いわれるやり方もありますね。
主キーは適当にテーブルに設定しています。
質問に書きそびれましたが、商品テーブルにも商品番号フィールドがあり、そのフィールドに主キーを設定しています。

補足日時:2011/10/30 22:53
    • good
    • 0

補足:仕入テーブルの設計について



<仕入伝票明細>

id・・・・・・・・・・401
仕入伝票_id・・・・・・301
行番号・・・・・・・・1
行区分・・・・・・・・1=通常仕入、2=仕入返品、3=手数料、4=輸送費
商品在庫_id・・・・・・201
仕入単価・・・・・・・\2,000
数量・・・・・・・・・10

仕入、返品、手数料、輸送費等は<行区分>で区別します。
そうして、手数料や輸送費の場合の<商品在庫_id>は空値。
これで、<仕入単価>欄が、複数に発生する不具合が回避できます。
仮に、複数の<仕入単価>欄を用意すると計算は面倒になります。

*ただし、こういう最適化で<より面倒になる>のであれば、質問者流もあり。
    • good
    • 0

<商品マスター>



id・・・・・・101
名称・・・・・パソコン

<商品在庫>

id・・・・・・・・・201
商品マスター_id・・・101
単価・・・・・・・・\2,000
期首在庫数・・・・・0
純仕入数・・・・・・10
純出庫数・・・・・・5

<仕入伝票>

id・・・・・・・・・・301
伝票番号・・・・・・・10001
日付・・・・・・・・・2011/10/30

<仕入伝票明細>

id・・・・・・・・・・401
仕入伝票_id・・・・・・301
行番号・・・・・・・・1
商品在庫_id・・・・・・201
仕入単価・・・・・・・\2,000
数量・・・・・・・・・10

質問者の設計は実に素晴らしい!
質問者が考えられたように、<商品マスター>と<商品在庫>とを分離するのが基本。
ただし、リレーションのやり方には、もう一工夫される必要がありそうですね。

<商品マスター.id>-<商品在庫.商品マスター_id>

つまり、<商品名>ではなくて<商品マスター>の主キーをリレーションに使います。

仕入伝票は、可能であれば<標題部>と<行明細部>とを分けます。
そうして、商品の入力は<商品在庫>の主キーとします。
なお、仕入単価は<仕入伝票明細>にも保持します。
そうしないで、<商品在庫>からの参照方式とすると実に面倒なことが発生します。

質問の問題点は、多分、テーブル設計の最適化を通じて解決されます。
そういうことで、これでもって回答とします。

この回答への補足

私の持論ですが、データーベースで一番重要なのは、入力をいかに効率よくできるか
にかかっていると思います。(入力する数が膨大になるほど)参照効率などはその次です。

さて、そこで私は商品テーブル商品名フィールドを主キーにしわざと繋げました。
問題なのは入力時です。どの番号がどの名前かなんて覚えてられませんし、
ボックスリストなどの選択しきも実に非効率です。入力するのが一番速いです。
そのため商品番号(商品ID)でつなげていません。

私は商品管理などのデーターベースを作った事がありませんし(統計用のものは過去作りましたが)、経理を学んでいないのでその部分でも悩ましいのですが、後々の事を考えて仕入れた数と売れた数は別にフィールドを持ったほうがよさそうですね。
販売した商品の仕入単価は仕入番号で参照すればわかりますが、売上テーブルにあったほうが良いのかどうかよく分りませんが、そこのあたりはまた考えます。

問題となるのは、仕入日(実際に商品が手元に来た日)と注文日(発注した日)をいかに利用するかです。
商品はまとめて色々な商品を発注します。
まとめて発注し、また別の日に商品はまとめて来ます(場合によっては分割されてきますが)、そのためわざわざ一個一個同じ日付を入力するのは非効率です。

例えば
メインフォーム
仕入番号:xxxxx
注文:2010年11月15日
仕入:2010年11月20日
サブフォーム
<商品名><単価><個数>
さんま:200円:10
さば:150円:15
まぐろ:100円:20

このように同じ日に注文、仕入したものをまとめて入力したいわけです。
これが出来ないので困っています。

補足日時:2011/10/30 18:38
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!