アクセスでIF関数を使用する際の改良方法について

このQ&Aのポイント
  • アクセスでIF関数を使用して仕入伝票入力を行っていますが、最近不便さを感じています。
  • 特に仕入先ごとに異なる商品CDを探すのが手間です。
  • 改良方法として、商品マスターテーブルに仕入先ごとの商品CD項目を追加し、仕入先CDによって商品CDの参照を変える方法が考えられます。
回答を見る
  • ベストアンサー

アクセスでIF関数

仕入伝票入力をアクセスで行っています。フォームに日付、仕入先CD等の項目、サブフォームに明細で商品CD、数量、価格等です。しかし最近不便に感じてきたので改良したく質問させていただきました。不便というのは仕入先の伝票入力の時、仕入先ごとに商品CDが異なるという点です。これまでは対応表(商品台帳)をプリントアウトして探してしました。そこで、商品マスターテーブルに仕入先ごとの商品CD項目を商品CD1、商品CD2、・・・と追加し、メインフォームの仕入先CDにより、明細サブフォームの商品CDの参照を変える方法。(仕入先CDが1のとき商品名、商品価格は商品CD1を参照し、仕入先CDが2のときは商品名、商品価格は商品CD2を参照するのような感じ) 選択クエリでサブフォームをつくっているのですが、いかがでしょうか? フォームに商品CD1、商品CD2と入力枠を作っておくことも考えたのですが見栄えが悪いので条件で仕分けたいのですが可能でしょうか?可能であれば方法を教えてください。

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

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8522/19371)
回答No.3

今までの「商品マスタ」は ・商品CD ・商品名 ・仕入れ値とかその他 のフィールドで構成されていたはず。   それを ・商品CD ・仕入先CD ・商品名 ・仕入れ値とかその他 に変えましょう。   で、メインフォームの仕入先CDを参照して、それに一致する物だけを抽出するクエリを「商品マスタ2」として作ります。   今まで商品マスタを参照していた入力枠を、商品マスタ2を参照するようにすれば解決します。   ・具体的なテーブルの内容の例   仕入先マスタの「仕入先CD」と「仕入先名」 001 鈴木原料 002 佐藤商事 003 田中物産   商品マスタの「商品CD」「仕入先CD」「商品名」「仕入価格」「商品価格」 00024 001 りんご 100 120 1240B 002 りんご 90 120 55100 003 りんご 105 120 00025 001 みかん 44 50 1240C 002 みかん 42 50 55101 003 みかん 40 50 00026 001 ぶどう 230 250 55102 003 ぶどう 221 250 01054 001 なし 89 105 2120D 002 なし 88 105 80201 003 なし 88 105   上記のような場合、メインフォームの「仕入先CD」を「佐藤商事」にした場合、クエリ「商品マスタ2」は、仕入先CDが「002」のレコードだけ抽出されます。   クエリ「商品マスタ2」の抽出結果 1240B 002 りんご 90 120 1240C 002 みかん 42 50 2120D 002 なし 88 105   あとは、サブフォームの商品CDの入力枠の内容に従って、仕入価格、商品価格を表示するだけです(それは今までと同じ)

tori123
質問者

お礼

ありがとうございます。この方法だと、同じ商品名をコードの数だけ登録しなければいけないかと考え、長い商品名だと大変かと思いましたが、フィールドをつくり、仕入先CDで抽出したクエリで可能ですね。参考させていただきます。

その他の回答 (3)

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

同じ商品の管理が複数になる仕組みはしないこと。 何のための商品マスタか考えてみる。 同じ商品を複数の仕入先からというのはしてないですね?。 機能的にでなくて実作業、あるべき構成に基づいているか見直した方がいいでしょう。

tori123
質問者

お礼

ありがとうございます。同じ商品を複数の仕入先から仕入れています。というか、ここがポイントです。 多く提案意見をいただきありがとうございます。自分の質問に補足する場所がわからないのでこの場をお借りします。 仕入伝票にはその仕入先独自の商品コードにつづいて商品名、単価云々と記載されています。例えば、 A123456  アサヒスーパードライ 350ml缶  24入  1ケース  ¥○○○○ 自分の仕入れデータ入力(アクセスで作った)に上のA123456と入力することで登録。また翌日、別の仕入先から同じ商品を仕入れ例えば    98765    アサヒスーパードライ 350ml缶  24入  1ケース  ¥△△△△ これを入力する時には98765を入力することで同一商品の仕入が登録されるという感じにしたいのです。ちなみに主キーはJANコードです。また、私のオリジナルの自店の商品コードも作成しています。現在は仕入れ伝票のコードでなく商品名、容量から自店のコード番号を探し入力しているのですが時間がかかります。  

  • MRT1452
  • ベストアンサー率42% (1392/3296)
回答No.2

ざっと見る限り、単に商品コードをプライマリキーに出来そうな気がしますが。 何の為にマスタを持つのかよく考えてください。 コードが違うからと無意味にフィールドを増やすのは良くないです。 商品コードをキーに商品情報を持ってくるのですから、それを行うクエリ(SQL)を組めば良いだけのはず。 コード・商品名 001・商品A 002・商品B ABCD・商品1 ZZ・商品c というマスタが会ったとして、コードに対する商品名を取るなら、  Select 商品名 from マスタ Where コード='###' (###は検索するコード) というようなSQLを組んで、マクロ上で###に対象の商品コードをセットするようにしてSQLを発行すれば、 該当の情報は取得できます。  Select 商品名 from マスタ Where コード='ABCD' とすれば、商品名として"商品1"が取得されるので、それを単にフォームにセットしてやるだけ。 ループでぐるぐる回してIF判定するならワザワザデータベースにする必要も無いし。 コード毎にマスタのフィールド追加してたら、商品が膨大になったときテーブル自体が無駄に膨大化することになるし。 データベースを使うならデータを引っ掛けるための検索キーという考え方が基本。 商品コードとかバーコードとか検索キーにするにはうってつけの物なわけで。 コードが商品毎に違うということは、そのコードを指定すれば、その商品であるということを特定できる情報なわけで。 そういう情報がプライマリキー(一意に情報を特定できるキー)となります。 そういった情報を使いこなす事でデータベースは活きてきます。 SQL関係の情報はネットにも書籍にも沢山あるので探してみてください。 アクセスでシステムを構築する場合はクエリとマクロを上手く組み合わせることがコツです。

tori123
質問者

お礼

ありがとうございます。補足をNO4のお礼欄に掲載させていただきました。よろしくお願いします。

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

仕入先毎違いがあってもどんな商品になるかはわかるのでは?。 商品分類を決めて絞り込み、選択画面を用意するのはどうですか。

tori123
質問者

お礼

ありがとうございます。一応コンボボックスで選択もできるようにしてあるのですが、同じ分類の商品が結構多くて選択するのに時間がかかるので、、

関連するQ&A

  • Access2000フォーム/サブフォームにつおて

    Access2000でフォーム/サブフォーム(売上伝票)を作っています。 フォーム(売上伝票メイン)には伝票番号、売上先などを入力・・・ サブフォーム(売上伝票サブ)は商品、数量、金額などを入力します。 そこで質問ですが、サブフォームの商品は商品コード(コンボボックス)を入力すると該当する商品名、単価などを商品台帳から引いてくる、としたいと思い、商品コードの「更新処理後」に以下のコードを記述しました。   Me![商品名] = DLookup("[商品名]", "[商品台帳]","[商品コード]= Forms![売上伝票メイン]![売上伝票サブ]![商品コード]")     サブフォーム上の商品名に商品台帳の商品名を入力するとしたつもりなのですが、何も表示されません。  単価も単位も同様です。  この方法ではだめなのでしょうか?  

  • access2007でのサブフォームへの入力

    仕入入力画面なんですが メインフォーム(仕入伝票テーブル)サブフォーム(仕入伝票明細テーブル) という構成です。 メインフォームで 仕入先をコンボボックスで指定すると サブフォームの 商品を入力するコンボボックスに メインフォームで選択した仕入先で購入できる商品が選べるように したいのですが、どうすればよろしいでしょうか? メインフォームの仕入先コンボボックスを選択する度に サブフォームの商品コンボボックスで選択できる内容を反映させたい です。 仕入先A : 商品1 商品2 仕入先B : 商品3 商品4 商品5 仕入先C : 商品6 商品7 商品8 商品9 メインフォームで仕入先コンボボックスで仕入先Aを選択すると サブフォームで選択できる商品コンボボックスは商品1と商品2 メインフォームで仕入先コンボボックスで仕入先Bを選択すると サブフォームで選択できる商品コンボボックスは商品3と商品4と商品5 というようなイメージで作りたいです。 どうかよろしくお願いします。

  • Access2000 DLookup関数の使い方

    色々試してみたのですがわからないので質問させていただきます。 フォーム/サブフォームを作っています。 サブフォームにある商品コード(コンボボックス)を入力すると、同じサブフォームにある単位、単価に商品台帳テーブルの値(単位、単価)を持ってくるようにしたつもりなのですが・・・。 商品コードの更新処理後に以下のコードを記述したのですが、うまく動きません(エラーは出ない)。 Me![単価] = DLookup("[単価]","商品台帳","[商品コード] = [Forms]![フォーム]![サブフォーム]![商品コード]") どこが悪いか教えていただけないでしょうか?

  • access2003

    2000種ほどの商品を扱っています。商品コードひとつにつき、仕入先・取引先が1箇所ずつ決まっていて、値段の変化もあまりありません。伝票を見ながら、フォームから直接売上入力を行い、請求処理と売上分析に利用したく思います。 ◆親)売上入力フォーム:売上管理番号/日付/取引先/取引先伝票番号/売上合計金額 ◆子)売上明細フォーム:商品コード/商品名/単価/数量/明細金額 ◆売上入力テーブル:売上管理番号/取引先/日付/取引先伝票番号 ◆売上明細テーブル:明細番号/売上管理番号/商品コード/数量/明細単価 入力の効率化を図るため、1部品1取引先であることを利用して、親フォームで取引先を選択することで商品を絞り込み、子フォームの商品選択コンボボックスにはその取引先の商品だけが表示させるようにしたいと思います。どのような方法が考えれるでしょうか? クエリを使うのだと思いますが、いろいろ試しても失敗してしまいます。 また、その上でさらなる絞込みとして、明細の各行で各商品を選択する際に、商品コードの一部を入れたり、仕入先名を入れると部品が絞り込めるようにできないでしょうか? アドバイス、参考資料、なんでもお寄せください! どうぞよろしくお願いいたします。

  • ACCESS2003の質問です

    伝票入力画面(親フォーム、サブフォーム)で、サブフォームに明細を 入力しますが、サブフォームのスクロールバーが常に下の位置に出来 ませんか? 明細行が画面に入りきらないときに、隠れてしまうので、常に最終行が 表示されている状態が望ましいです 宜しくお願いします

  • クエリ抽出条件を動的に変更したい

    Win XP Access2003 顧客情報を入力するメインフォーム1に商品明細を入力するサブフォーム(帳票)のある 伝票作成用のフォームを作っています。 (サブフォームは選択クエリが元になっています) 入力用にはフォーム1を使い、その後確定した伝票はメインフォーム2で扱いたいのです。 商品明細(帳票サブフォーム)の内容は同じなので、クエリの伝票番号(フィールド)の 抽出条件を フォーム1で開いた時に[forms]![フォーム1]![txt伝票番号] フォーム2で開いた時は[forms]![フォーム2]![txt伝票番号] の様に動的に変更したいのですが,よい方法がありましたら宜しくお願い致します。

  • ACCESSの規定値を動的に設定するには

    お世話になります。 仕訳伝票の登録フォームを作りました。 テキスト項目にコンボボックスを5個セットしました。 実際に操作するとマウス操作とキーボード操作の作業が面倒です。 フォームは伝票No.、日付、伝票の目的 のメインフォーム「仕訳伝票入力」 勘定科目、適用、金額のサブフォーム「仕訳伝票入力明細サブ」 メインフォーム上の伝票の目的が決まればサブフォームの勘定科目(借方科目、貸方科目)ほぼ決まります。 そこで伝票の目的テーブルに借方、貸方に勘定科目IDの項目に登録しておき、 これをサブフォームの借方科目、貸方科目の規定値として動的に設定出来ないものかと… この質問は前の http://kikitai.teacup.com/qa4980091.html の補足です。こちらも宜しくお願いします。

  • データグリッドのセルにtextを表示させる方法?

    VB6の初心者ですがお教え下さい。 現在「売上管理」を本を参考に作成しております。ACCESSで売上伝票(メイン)、売上明細(サブ)、商品台帳、、等のテーブルをデータベースとしています。 売上伝票(メイン)のフォーム上に売上明細(サブ)を「売上伝票番号」を元にしてデータグリッドで表示します。 参考本の記載では[価格]は商品台帳からひっぱっていますが、これでは、随時、異なった価格を入力するたび台帳の価格自体が変わってしまうため、私の場合「売上明細」の価格とリンクさせ、随時入力可能としました。 (お客様によって時々売値が変更するので) そこで質問なのですが、その「価格」入力のセルに、商品台帳にある「価格」を一旦表示させる方法はないでしょうか? (商品の定価を全て覚えてはいないので) 以前アクセスで同様のものを作成したときは、親子のフォームでしたので、 forms!txt1.text=[コントロール]みたいな感じでしました。 ちなみに下記はデータグリッドのSQLです。   ( 定価*1 AS 価格と試しましたが変更でき   ず、だめでした。) ヒントとなるような事でも結構ですので宜しくお願いします。 Dim rsSub As New ADODB.Recordset Dim mySQL As String 'SQLステートメント 'SQLステートメント mySQL = "SELECT 売上伝票番号,NO,T売上明細.JAN,商品名,定価,価格,数量 " _ & "FROM T売上明細,T商品台帳 " _ & "WHERE ( 売上伝票番号 = " & txt売上伝票番号.Text & " ) " _ & "AND (T売上明細.JAN=T商品台帳.JAN) "

  • ACCESSのメインフォームとサブフォームについて

    ACCESSで、受注伝票のようなものを作成したいと思っています。受注伝票フォームに受注明細のサブフォームを埋め込んだようなフォームを作ろうとしています。その際、受注伝票と明細に受注コードのフィールドを設け関連づけたいのですが、メインフォームに受注コードを入力したらサブにも同じコードが自動的に振られるようなことはできるのでしょうか。 出来ないのであれば、どのように作ればよいのでしょうか。

  • Access式ビルダでのサブフォーム参照について

    メインフォーム名  「売上明細フォーム」 サブフォーム名 「売上明細サブフォーム」です。 サブフォームのテキストボックスの値をメインフォームに表示させるため、式ビルダから参照させるとき、リストで展開して出てくる項目で以下の2つの違いがわかりません。   ・組み込まれたフォーム  ・すべてのフォーム どっちからでも一緒のことでできそうだと思うのですが、組み込まれたフォームからは参照されずエラーになります。 この2つの違いはなんですか??   

専門家に質問してみよう