- 締切済み
Accessで困ってます
はじめまして。わたしはAccess2003で簡単なデータの管理をするように会社で指示を受けてAccessと格闘しています。でも、どうしてもわからないので、ご指導いただきたいのです。 Access2003のテーブルで No(オートナンバー) 日付(yyyy/mm/dd) 担当者(テキスト) 商品コード(テキスト) 受注数(整数) というテーブルがあります。 このテーブルで、「当日」に「同一の担当者」が「異なった商品」を「複数受注した場合」に「当日一番最初に受注した商品だけ」は「受注数」に「10」加算する。 といったクエリ?マクロ?を作りたいのです。 クエリでできるのか?どうかもわからない初心者ですが、何卒ご指導をお願いいたします。 助けてください。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
多分、条件は、<相方IDより最小IDが小さい場合>でもOK。 のミス!
Access のDLookup関数、DMin関数で列[加算受注数]を生成する方法を・・・。 ID__日付________担当者____商品コード__受注数 _1__2008/06/17__鈴木 一郎_A______________100 _2__2008/06/17__鈴木 一郎_A______________200 _3__2008/06/18__鈴木 一郎_A______________100 _4__2008/06/18__鈴木 一郎_B______________200 クエリ1: 相方ID__最小ID__ID__日付_______担当者____商品コード__受注数 _____0_______1___1__2008/06/17_鈴木 一郎_A______________100 _____0_______2___2__2008/06/17_鈴木 一郎_A______________200 _____4_______3___3__2008/06/18_鈴木 一郎_A______________100 _____3_______3___4__2008/06/18_鈴木 一郎_B______________200 SELECT DBLookup("ID","受注履歴", "日付=#" & [日付] & "# AND 担当者='" & [担当者] & "' AND 商品コード<>'" & [商品コード] & "'",0) AS 相方ID, DBMin("ID","受注履歴","日付=#" & [日付] & "# AND 担当者='" & [担当者] & "'") AS 最小ID, * FROM 受注履歴; 先ず、相方となる[ID]と最初の[ID]を求めるとやり方が見えてくると思います。 ここまでは、Access のDLookup関数、DMin関数でもOKかと思います。 ただ、ADOでDBLookup関数、DBMin関数を自作すると高速化します。 クエリ2: ID__日付________担当者_____商品コード__受注数__加算受注数 _1__2008/06/17__鈴木 一郎__A______________100___________0 _2__2008/06/17__鈴木 一郎__A______________200___________0 _3__2008/06/18__鈴木 一郎__A______________100__________10 _4__2008/06/18__鈴木 一郎__B______________200___________0 SELECT ID, 日付, 担当者, 商品コード, 受注数, ABS(相方ID>最小ID)*10 AS 加算受注数 FROM クエリ1; 多分、条件は、<相方IDが存在し自らが最小IDである場合>とするのが確実。 多分、条件は、<相方IDが最小IDより小さい場合>でもOK。 ID__日付________担当者_____商品コード__受注数__加算受注数 _1__2008/06/17__鈴木 一郎__A______________100___________0 _2__2008/06/17__鈴木 一郎__A______________200___________0 _3__2008/06/18__鈴木 一郎__A______________100__________10 _4__2008/06/18__鈴木 一郎__B______________200___________0 _5__2008/06/18__鈴木 一郎__C______________300___________0
- ogohnohito
- ベストアンサー率35% (5/14)
No.1です。 > 同じ日に2種類以上の商品を売ると、ボーナスとして売上成績を水増しできるんですよね? なるほど! > 真の受注数と区別するために、『ボーナス』フィールド(整数型)を用意することにします。 大賛成です。そうすべきですね。 受注数に10を加算してしまうと、どんどん増えるし(たぶん)、真の受注数が判らなくなってしまい‥‥架空取引になってしまう可能性があります。
おそらく、同じ日に2種類以上の商品を売ると、ボーナスとして売上成績を水増しできるんですよね? その前提で、ちょっと考えてみましょう。 真の受注数と区別するために、『ボーナス』フィールド(整数型)を用意することにします。 後の説明の為に、このテーブルをtbl01という名前だということにします。 以下クエリをいくつか紹介しますが、クエリビルダの画面をここでお見せできないので、SQLで書きます。 クエリのデザインヴュー(あるいはデータシートヴュー)の画面で、左上のボタンで『SQLヴュー』というのがありますので、ここにコピーペーストしてください。 デザインヴューに代えると、おなじみの画面で私のお見せしたいクエリが表示されます。 まず第一のクエリ。仮に、名前を qry01SalseToday としておきます。 このクエリは本日の売上の、担当者別、商品コード別の一覧表になります。 『Noの最小』は後で使うためのものです。 SELECT Min([No]) AS Noの最小, 商品コード, 担当者 FROM tbl01 WHERE (日付)=Date() GROUP BY 商品コード, 担当者; 次にこのクエリをもとに、第二のクエリ qry02PrizeToday を作ります。 このクエリで、本日2種類以上の商品を売った担当者と、その担当者のその日一番最初に売った商品のレコードを抽出しています。 SELECT Min(Noの最小) AS Noの最小の最小, Count(商品コード) AS 商品コードのカウント, 担当者 FROM qry01SalseToday GROUP BY 担当者 HAVING (Count(商品コード))>1; オートナンバー型のNoフィールドの一番若いものを、その日の最初の売上としていますが、多分あまりうまいやり方ではありません。でも、ちょっと情報不足ですので、これで行くことにします。 これがきちんと機能するのは、売り上げた順に入力した場合だけです。順不同で入力した場合は、一番最初に入力した商品にボーナスがつきます。 つぎに qry04AddPrizeTo を作ってください。 SELECT Noの最小の最小, ボーナス INTO tbl02PrizeToday FROM tbl01 INNER JOIN qry02PrizeToday ON tbl01.No = qry02PrizeToday.Noの最小の最小 WHERE (ボーナス)=0; このクエリーを実行させると tbl02PrizeToday というテーブルが作成されます。ボーナスが加算されるべきレコードのリストです。 で、最後のクエリ qry05AddPrize UPDATE tbl01 INNER JOIN tbl02PrizeToday ON tbl01.[No] = tbl02PrizeToday.Noの最小の最小 SET tbl01.ボーナス = 10; これで、ボーナス分が加算されているはずです。 毎日、みんながその日の売上を入力した後、qry04AddPrizeTo と qry05AddPrize を順に実行させます。 ただし、データを読み出すときには qry06SalesPrize SELECT No, 日付, 商品コード,担当者,受注数+ボーナス AS 売上成績 FROM tbl01; を使ってください。 ただ、アクセスに慣れてきたら、ぜひVBAを使って、もっとかっこよくこの機能を実現してください。 その方が、多分、早く動作するはずです。
- ogohnohito
- ベストアンサー率35% (5/14)
確認です。 ・ 「当日」とは何ですか? 「同じ日付」ですか? ・ 「当日一番最初に受注した商品」とは、No が小さい商品ということですか? ・ この処理を何回も行うと、「一番最初に受注した商品」の受注数がどんどん増えますが‥‥ 入力したデータを「変える」のは問題があるのではないかと思います。こうする目的は何なのでしょうか?