Dmaxに複数条件をつけるコツはAndでつないだ文字列を意識すること。美容室向け顧客管理システム 開発日記11日目

Accessでアプリを作っています。昨日はDmax関数をつかって、お客様の最終来店日を表示できるようにしましたが、なんだか変なことに気が付きました。

最終来店日を表示させる目的は、その名のとおり前にいつお店に来てくれたかを把握することです。美容院ならば前回からどのくらい経過しているかって重要な情報の一つですよね。

最終来店日は「DAT_売上」テーブルの「売上日」の一番大きい数字(最近の日付)を条件に沿って取得するものです。前日はクエリにこんな感じに関数をせっていしました。

最終来店日: DMax("売上日","DAT_売上","お客様ID = " & [お客様ID])

でも、これだと予約登録を入れたときに、「DAT_売上」テーブルの最新日付が当日に更新されてしまうので、せっかくの最終更新日が今日の日付になってしまいます。

DmaxはクエリのFrom句に指定していないテーブルに条件設定をできる便利な関数ですが、上記の例では条件を1つしか設定していません。複数の条件をDmax関数に設定できないのでしょうか?ヒントはYahoo!知恵袋にありました。

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1289875727

Dmaxは3番目の引数に複数の条件をAnd句でつなげることで複数条件指定することができました。ただし、このYahoo!知恵袋にもあるように条件の書き方のポイントをつかんでいないと変数が大混雑してうまくいきません。

Dmax関数のポイントは、3つの引数をすべて""で囲んで文字列とすることでした。つまり、3番目の条件に当たる部分も And区切りの文字列になるよう意識しないといけないのです。

そこで、条件を

  1. お客様IDが、今表示されているお客様のIDと一致すること
  2. 売上日が、明日以降であること

にしてやると、Dmax関数は以下のようになります。

最終来店日: DMax("売上日","DAT_売上","お客様ID = " & [お客様ID] & "And 売上日 < #" & DATE() &"#" )

やたらと"で区切りながら&でつないでいるので難しいように見えます。「&」は文字と変数をつないでいて、アルファベットの「And」は条件と条件をつなぐ句です。カンマは2つあります。つまり関数の引数は3つです。3つめは"お客様ID~ 始まるので、この部分だけを実際の文字列に直すと以下のようになります。

"お客様ID = 33 And 売上日 < #2020/03/25#"

こうしてみるととてもシンプルです。先に手書きで仮の条件を書いてから「" & 変数 & " 」に置き換えていくほうがわかりやすいかもしれません。

3つ目の条件も加えてみる

「DAT_売上」マスターには、NoShowというBooleanのフラグを設定していました。つまり、予約はしたけれど、結局来店しなかったレコードにつけるフラグです。来店していないので、このレコードは最終来店日の検索からは除く必要があるでしょう。つまり、条件は以下のとおりになります。

  1. お客様IDが、今表示されているお客様のIDと一致すること
  2. 売上日が、明日以降であること
  3. NoShowフラグはFalseであること

以上の3つの条件をもとにDmax関数をつくると以下のようになります。

最終来店日: DMax("売上日","DAT_売上","お客様ID = " & [お客様ID] & "And NoShow = False And 売上日 < #" & Date() & "#")

今日の予約と前回のNoShowは無視された

上記のDmax関数をクエリに組み込んだ結果は上のようになりました。今日は3月25日です。24日に予約がされましたが、来店されなかったのでNoShowにチェックが入っています。その前は3月13日に来店して武将カットで売上が上がっています。

お客様一覧を開いてみると、最終来店日はちゃんと3月13日になっています。実際に前回秀吉さんにカットを行った日付です。これで役に立つ情報になりました。