• 締切済み

Access DB 商品名の扱いについて

(テーブル名):(フィールド名) 商品テーブル:商品名。 単価数量テーブル:商品単価、数量、仕入番号、商品名。 仕入テーブル:仕入番号、仕入日、注文日、手数料、輸送費など。 売上テーブル:売上、販売日付、仕入番号、商品名。 リレーションシップ:一対多 商品テーブル商品名-単価数量テーブル商品名 商品テーブル商品名-売上テーブル商品名 仕入テーブル仕入番号-売上テーブル仕入番号 仕入テーブル仕入番号-単価数量テーブル仕入番号 このように作成しました。 ここで問題なのが、商品名の入力です。 仕入テーブルをメイン、単価数量テーブルをサブフォームにしてフォームを作成しました。 さて、商品名を単価数量テーブル商品名フィールドのサブフォームから入力・・・と思ったら、商品テーブル商品名フィールドに名前がないためエラーが出ます。(参照整合性をしているため) サブフォームの入力フィールドを商品テーブル商品名に変更すれば入力できます。 しかし、重複した商品名を入力できません(重複しないに設定しているため) 何故このようなことをするか?ですが、同じ商品でも購入日が違えば単価が違う場合があります。 ですので単価数量テーブルでは同じ商品名を使用する必要があります。 しかし、商品テーブルでは同じ商品名は必要ありません。 もちろん先に商品テーブルに商品名を入力すれば問題ありませんが、入力効率から言って問題あります。 さてここで質問なのですが、一対多の多から商品名を入力して一側に反映できないでしょうか? 一側にすでに同じ商品名がある場合は反映してはいけません。 ちないにVBAやSQLはコピペぐらいはできますが、書けませんのでご了承を。

みんなの回答

回答No.6

ANo.3です 前の回答は ANo.1への補足を見る前に書き込みました あしからず >そのため商品番号(商品ID)でつなげていません 何を目的としてデータ管理ソフトを使うか次第ですよね 請求書の発行まででよいなら 商品IDをつけなくてもいいのかもしれない (て 言うか[商品テーブル]が必要ない?) あと扱う商品の種類などと 誰がデータを入力するか ですね ご存知のこととは思いますが  "さんま"、"サンマ"、"秋刀魚"、"鰶"は別の物としてコンピュータは扱います かならず"さんま"で統一できるのならありかな? >これが出来ないので困っています え!? どこで行き詰ってますか? メインフォーム、サブフォームは理解されているようですが 「仕入テーブル」と「単価数量テーブル」からそれぞれ「仕入フォーム」、「単価数量フォーム」作っておいて、「仕入フォーム」のデザインビューで ツールボックスからサブフォーム/サブリーポート、ウィザードで「単価数量フォーム」と[仕入番号]で結びつければ とりあえずのものはできませんか?

-_0_-
質問者

お礼

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

-_0_-
質問者

補足

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

回答No.5

補足:一対多の多から商品名を入力して一側に反映できないでしょうか? その手順は、次のようです。 1、仕入伝票の行明細部で商品名を入力。 2、一側に反映する必要があるか否かをチェック。 3、反映する必要があれば1側を更新して商品の主キーを取得。 4、反映する必要がなければ既存の商品主キーを記録。 なお、私は参照整合性は<多から1へ>にしてきました。 この場合、一側に存在しなくてもエラーは発生しません。 ですから、質問者みたいに<エラーがでます!>というクレームは皆無。 <多から1へ>は、ユーザからエラーを隠蔽する上で有効です。 当然に、自前の参照整合性をチェックして告知する仕組みは必要。

-_0_-
質問者

お礼

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

-_0_-
質問者

補足

リレーションシップは参照整合性チャックを外して、 えーっと、更新クエリを作成して、更新ボタン(クエリの実行ボタン)を作るってことですかね? う・・・ん? 違うかな? >当然に、自前の参照整合性をチェックして告知する仕組みは必要。 うん?これもクエリでってことですかね? >なお、私は参照整合性は<多から1へ>にしてきました。 商品テーブル←単価数量テーブル こうすれば単価数量テーブルの商品名(商品ID)に入力は出来ますね。 (あとで商品テーブルに単価数量テーブルの商品名に入力した商品名を更新する必要がありますが。)

回答No.4

>入力するのが一番速いです。 もちろん、アプリケーションはそのように作ります。 メインフォーム 仕入番号:xxxxx 注文:2010年11月15日 仕入:2010年11月20日 サブフォーム <商品名><単価><個数> さんま:200円:10 さば:150円:15 まぐろ:100円:20 こういう入力を実現するには、先に示したテーブル設計が必須。 >そのためわざわざ一個一個同じ日付を入力するのは非効率です。 だから、標題部と行明細部に分けるんですよ。

-_0_-
質問者

補足

えーっと私が製作しているDBと違うので正直それは必要ないかと・・・・ というかそもそも同じような事はしています。 単価数量テーブルが仕入詳細テーブルにあたりますね。 ちなみに輸送料や手数料を単価数量テーブルに入れていないのは、 商品ごとに送料、手数料がかかるわけではないのでそうしています。 注文した商品の全体に対して送料、手数料はかかるので。

回答No.3

>一対多の多から商品名を入力して一側に反映できないでしょうか? 結論から言うと、出来ません(と、思う ^^; ) それを出来なくするための「参照整合性」です Accessのある参考書によると 「参照整合性を設定すると、設定したテーブル間に以下のような規則が出来ます。  (1)主テーブルの主キーに存在しない値をリレーションテーブルの外部キーフィールドに入力することはできません(Null値を入力することは可能ですが、レコードの関連性はないとみなされます)。    以下略 では 参照整合性を設定しなければどうなるか、ですが上の解説のNull値の場合と同様に 商品テーブルに存在しない[商品名フィールド]を持つレコードが単価数量テーブルに入力されるだけです ではどうするか 「商品テーブル」から「商品名入力フォーム」を作り、「『仕入テーブルをメイン、単価数量テーブルをサブフォーム』にして作ったフォーム」に「商品名入力フォーム」を開くコマンドボタンを配置 が一般的かなぁ 質問文の中に"主キー"について何も書かれていませんが どう設定されてますか? 主キーとは (前出の参考書より) 「リレーショナルデータベースでは、テーブルに格納されているデータをより速く検索、抽出することが重要です。そのためには、テーブルに格納されている各レコードを識別できるフィールドが必要になります。この情報(各レコードを識別できるフィールド)のことをテーブルの主キーといいます。」 商品テーブル:商品ID、商品名 単価数量テーブル:商品単価、数量、仕入番号、商品ID とした方がよろしいかと

-_0_-
質問者

補足

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

回答No.2

補足:仕入テーブルの設計について <仕入伝票明細> id・・・・・・・・・・401 仕入伝票_id・・・・・・301 行番号・・・・・・・・1 行区分・・・・・・・・1=通常仕入、2=仕入返品、3=手数料、4=輸送費 商品在庫_id・・・・・・201 仕入単価・・・・・・・\2,000 数量・・・・・・・・・10 仕入、返品、手数料、輸送費等は<行区分>で区別します。 そうして、手数料や輸送費の場合の<商品在庫_id>は空値。 これで、<仕入単価>欄が、複数に発生する不具合が回避できます。 仮に、複数の<仕入単価>欄を用意すると計算は面倒になります。 *ただし、こういう最適化で<より面倒になる>のであれば、質問者流もあり。

回答No.1

<商品マスター> 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> つまり、<商品名>ではなくて<商品マスター>の主キーをリレーションに使います。 仕入伝票は、可能であれば<標題部>と<行明細部>とを分けます。 そうして、商品の入力は<商品在庫>の主キーとします。 なお、仕入単価は<仕入伝票明細>にも保持します。 そうしないで、<商品在庫>からの参照方式とすると実に面倒なことが発生します。 質問の問題点は、多分、テーブル設計の最適化を通じて解決されます。 そういうことで、これでもって回答とします。

-_0_-
質問者

補足

私の持論ですが、データーベースで一番重要なのは、入力をいかに効率よくできるか にかかっていると思います。(入力する数が膨大になるほど)参照効率などはその次です。 さて、そこで私は商品テーブル商品名フィールドを主キーにしわざと繋げました。 問題なのは入力時です。どの番号がどの名前かなんて覚えてられませんし、 ボックスリストなどの選択しきも実に非効率です。入力するのが一番速いです。 そのため商品番号(商品ID)でつなげていません。 私は商品管理などのデーターベースを作った事がありませんし(統計用のものは過去作りましたが)、経理を学んでいないのでその部分でも悩ましいのですが、後々の事を考えて仕入れた数と売れた数は別にフィールドを持ったほうがよさそうですね。 販売した商品の仕入単価は仕入番号で参照すればわかりますが、売上テーブルにあったほうが良いのかどうかよく分りませんが、そこのあたりはまた考えます。 問題となるのは、仕入日(実際に商品が手元に来た日)と注文日(発注した日)をいかに利用するかです。 商品はまとめて色々な商品を発注します。 まとめて発注し、また別の日に商品はまとめて来ます(場合によっては分割されてきますが)、そのためわざわざ一個一個同じ日付を入力するのは非効率です。 例えば メインフォーム 仕入番号:xxxxx 注文:2010年11月15日 仕入:2010年11月20日 サブフォーム <商品名><単価><個数> さんま:200円:10 さば:150円:15 まぐろ:100円:20 このように同じ日に注文、仕入したものをまとめて入力したいわけです。 これが出来ないので困っています。

関連するQ&A