- ベストアンサー
MS-Access2002で条件別(売上数量別)に販売単価を設定する方法
(1)ある特定の商品区分IDに属する商品だけ、(2)商品ID別に、それぞれ売上数量に応じた単価(例:100個以下、100~500個、500個以上)を設定し、(3)その商品区分ID以外の商品については、商品テーブルにある単価(売上数量に関係なくそれぞれ一定)を使用したい。 小生は、(2)についてユーザ定義関数を作成し、VBAの中で(1)の条件内で、このユーザ定義関数を適用し、(3)の条件の時は、商品テーブルを参照するよう考えましたが、具体的にどうすれば良いか、よくわかりませんので、ご教示くだされば幸いです。特にVBAの中で、テーブルのデータを参照する方法が、よくわかりませんのでよろしくご指導ください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
追加です たぶん売上入力フオームで「売上数」を入力すると 思います。そのときに売上の新規レコードが作成される という仮定で説明します *********************************************** それともイベントプロパティでイベントプロシージャを 作成するのでしょうか? *********************************************** イベントプロパティでイベントプロシージャを作成します 売上数を入力したときに動くプログラムですから 売上数のイベントで「更新前処理」のところでイベントプロシージャをつくります SUBのなかで If Me!数量>=1 and Me!数量<100 then me!単価=Dlookup("単価A","T商品","me!商品ID=商品ID") Endif If Me!数量>=100 and Me!数量<500 then me!単価=Dlookup("単価B","T商品","me!商品ID=商品ID") Endif If Me!数量>=500 then me!単価=Dlookup("単価C","T商品","me!商品ID=商品ID") Endif 金額の計算が必要なら me!金額=me!数量 * me!単価 とします 途中での計算、記憶が必要ならそのための一時的な 項目として DIM WK11 AS SINGLE DIM WK21 AS STRING DIM WK31 AS VARIANT などとSUBの中で定義します *********************************************** "me!商品ID=商品ID" は同一キーでT商品を読むための 命令ですが、書き方についてはペルプを見てください 項目の性格がテキストか数値かで " の必要度が異なり ますから注意が必要です "me!商品ID=" & "商品ID" などとしなければならないこともあり、小生もやや自信がありません。。。
その他の回答 (3)
- ryuu001
- ベストアンサー率61% (46/75)
数量別単価テーブルで運用されれば良いと思います。 商品ごとの開始個数は 0個から必ず始める。 商品ごとの終了個数は 9999999個まで必ず設定する。 --数量別単価テーブル-- 商品名 開始個数 終了個数 単価 商品A 0 100 1,000 商品A 101 500 500 商品A 501 9999999 100 商品B 0 9999999 100 商品C 0 500 200 商品C 501 9999999 100 上記テーブル から 単価を拾い出す方法。 但し、 売上数量 の部分は、環境により違います。 ご自分の環境に合わせて変更してください。 SQL文の場合 (SQL文の方が一括で処理するため一般的だと思います。) select A.[単価] from xxテーブル As A where (A.[開始個数] >= 売上数量) AND (A.[開始個数] < 売上数量) Dlookupの場合(dlookupは1レコードづつの処理なので速度に問題あるかも?) Dlookup("[単価]","[xxテーブル]","([開始個数] >= 売上数量) AND ([開始個数] < 売上数量)"
- O_cyan
- ベストアンサー率59% (745/1260)
DLookup関数でテーブル内のデータを参照出来ます。抽出条件も付けられます。 しかし関数を定義しなくてもフォーム上でもできます。 商品テーブルを例えば下記のように作成し 商品区分ID 商品名 単価 単価A 単価B 単価C 特定(Yes/No型) 0001 商品A 100 90 80 70 True 0002 商品B 90 80 70 60 False 0003 商品C 80 70 60 50 True (1)にあたる賞品は[特定]にTrueのフラグを立てる。 (2)の場合は[特定]がTrueのものだけフォーム上の[数量]が100以下なら単価A、100 から500の間であれば単価B、500以上なら単価Cをフォーム上の[単価]に取得する。 (3)の商品は[特定]がFalseのものは[単価]に単価を取得する。 こんな感じでしょうか。 フォーム上でIIf関数をネストして使ってその商品の単価を取得するか、関数を定義 して使うかは作る人によるのでご自分の好きなやり方で良いと思います。
補足
O_cyan様 早速ご教示いただきまして大変ありがとうございました。 実は、O_cyan様のご回答につきまして、補足を投稿したつもりだったのですが、小生の勘違いで、ttk11様あてに補足をだしてしまいました。ttk11様からは、すぐにご回答をいただきまして、大変勉強になりましたが、遅ればせながら、同一の補足質問をさせていただきたいと思いますので、よろしくご教示のほどお願い申し上げます。 小生、Access初心者で恐縮ですが、ご教示の趣旨は、理解できたつもりですが、具体的にどうすればよいのかよくわかりませんので、お願いします。 フォーム上で設定可能、とのことですが、 フォーム:F受注 テーブル:T商品 として、「数量」がF受注にあるとした場合、Dlookup関数をF受注フォームの「単価」に設定することになると思いますが、「単価」のどのプロパティに設定するのでしょうか?コントロールソースプロパティでしょうか? それともイベントプロパティでイベントプロシージャを作成するのでしょうか? また、Dlookup関数の書き方ですが、 Dlookup("単価A","T商品",""&Me!数量&"<100") これは、数量が100個より少ない場合は、単価Aを取得する、という 意味ですが、この書き方でよろしいのでしょうか? 以上、初歩的質問で恐縮ですが、ご教示方よろしくお願い申し上げます。
- ttk11
- ベストアンサー率25% (40/154)
>特にVBAの中で、テーブルのデータを参照する >方法が、よくわかりませんのでよろしくご指導 >ください。 dlookupを使用すればいと思います 各条件の設定は if でします if xxxx="zz" then if xxx<100 then zzz=dlookup(---,---,---,----) if xxx>=100 and xxx<500 then
お礼
ttk11様 早速ていねいなご回答ありがとうございました。 ご教示内容を参考にして、これからやってみたいと思いますので これからもよろしくお願い申し上げます。 また、小生の不手際から、実は、小生の補足内容の前提は、O_cyan様の ご回答を前提に書いたのですが、あて先を勘違いしてttk11様に出してしまいました。このため、ttk11様も少し、内容的に?の部分があったのではないかと思いまして、大変ご迷惑をおかけしてしまったことお詫び申し上げます。 いずれにいたしましても、今回のご教示内容は、大変勉強になりましたので、心から御礼申し上げます。このような事情から、同一内容の補足をO_cyan様にもお伺いしたいと思いますので、あしからずご了解お願い申し上げます。 本当にありがとうございました。
補足
ttkk11様 早速ご教示ありがとうございました。 小生、Access初心者で恐縮ですが、ご教示の趣旨は、理解できたつもりですが、具体的にどうすればよいのかよくわかりませんので、お願いします。 フォーム上で設定可能、とのことですが、 フォーム:F受注 テーブル:T商品 として、「数量」がF受注にあるとした場合、Dlookup関数をF受注フォームの「単価」に設定することになると思いますが、「単価」のどのプロパティに設定するのでしょうか?コントロールソースプロパティでしょうか? それともイベントプロパティでイベントプロシージャを作成するのでしょうか? また、Dlookup関数の書き方ですが、 Dlookup("単価A","T商品",""&Me!数量&"<100") これは、数量が100個より少ない場合は、単価Aを取得する、という 意味ですが、この書き方でよろしいのでしょうか? 以上、初歩的質問で恐縮ですが、ご教示方よろしくお願い申し上げます。
お礼
ryuu001様 早速ご教示いただきまして大変ありがとうございました。 ryuu001様のご教示につきましても、やってみたいと思います。 これからもよろしくお願い申し上げます。