更新がうまくいかないなら、Me.Recalcを使う。美容室向け顧客管理システム 開発日記3日目

2020/02/14

MSAccessでアプリを作ってます。

お客様情報の編集画面がようやくそれっぽくなってきました。お友達などお客様同士で関係がある方を表示させる「お客様関係性」表示機能。画面下側にはお客様が来店したときの売上を一行として表示させる売上リスト。その右側についている詳細ボタンで、どんなサービスをしたかを入力し、売上合計をトップ画面に表示させるようにしようと思っています。

インスタグラムやTwitter,LINEなど、予約があったときにあらかじめちょっと覗いてみるなんてことができるように、お客様のSNS情報の入力欄を作ってみました。クリックすると開くように作りこみます。

住所は開発2日目に軽く紹介しましたが、郵便番号での入力支援をつけてます。ボタン一つでダイレクトメールの葉書に住所印刷する機能をはあると便利そうですね。今後の宿題。

写真の表示

写真の表示は所定のフォルダに写真を置いたら、そのファイル名を写真の下の枠に入れておくことで表示されるようにしています。とりあえずはこれでもよい気がします。ファイル選択のダイアログもそのうち追加します。

売上明細

売上明細画面はこんな感じ。カテゴリを選び、メニューを選びます。

美容院のホームページでどんなメニューがあるのか参考にさせていただいたんですが、それぞれのメニューのサービス価格は「●●円~」のようになっていることが多かったです。そこで、あらかじめ設定されているメニューを選べば、仮の単価として金額が表示されますが、手で数字を変えられるようにしました。

同様にカテゴリはデータベース上ではIDで管理しているのですが、メニュー名のほうは売上データに文字列として記録するようにしました。これは将来的にメニュー名をマスタで変更することもあるだろうし、ぴったりのものがマスタに登録されていなければ、手入力で適当なメニュー名をつけることも考慮に入れての仕様です。

それぞれのメニューに写真をつけるかどうか・・・・。データベース的にはそのスペースを用意しているのですが、その機能を入れるかどうかは迷うところなので、保留。

今回のポイントと苦労したところ

売上明細のカテゴリを選べば、候補のメニューが出てくるというありふれた処理で、なぜだか別カテゴリの候補が出てきてしまったので、対処法をメモ。

クリックで拡大

集合知ソースはこんな感じになっています。

SELECT MST_メニュー.商品名, MST_メニュー.[カテゴリID] FROM MST_メニュー WHERE (((MST_メニュー.[カテゴリID])=[カテゴリ])); 

あってるはずなのになぁ、というところなのですが、どうやらカテゴリを選択し、すぐにメニューを選択しようとしても、先のカテゴリが変化した状態をメニューのほうのコンボボックスの集合値のWHERE項目で捕まえられないようなのです。

そこで、カテゴリのコンボボックスが変化したときに以下のような処理を突っ込みました。

Private Sub カテゴリ_AfterUpdate()
    Me.Recalc
End Sub

Me.Recalc が肝です。どうやら一回計算させると良いみたい。これでちゃんと動作するようになりました。

フォームをダイアログとして開き値を渡す

もうひとつ、つい忘れてしまうのが、ボタンを押したら別のフォームをダイアログとして開き、値を渡す方法。これにはOpenArgsを使います。売上の詳細ボタンを押すと、売上詳細画面が開きます。

Private Sub btn_売上詳細_Click()
    DoCmd.OpenForm "DAT_売上明細 クエリ", acNormal, , "売上ID=" & [ID], , acDialog, [ID]
End Sub

ポイントは引数の1番目が開くフォーム名、4番目が開かれる側のフォームでフィルタに使う項目、6番目にダイアログで開く指定、7番目が渡す値。

開かれる側では、先ほどの7番目の値をOpenArgsで取得します。フォームを開くときに読み込むようにLoadのイベントに追加しておきます。

Private Sub Form_Load()
    [txt_売上ID] = Me.OpenArgs
End Sub

売上詳細に売上IDを控えておくための非表示のテキストボックスを作ってそこに値を仮置き。売上詳細を新たに追加するときに初期値としてこの[txt_売上ID]を参照するようにしてみました。本当はもっと良い方法があるのかもだけれど。

ちなみにこのOpenArgsで複数の値を引き渡したい場合には、カンマ区切りの一つの文字列にして、受け取ったがわでそれをまた分解するというようなテクニックが使えるようです。このあたりはT’sWareさんのこちらのページを参考にさせていただきました。今度使ってみよう。

今後の開発の宿題

さてここまで作ってみて、つくりながらの今後の予定と課題は以下のような感じ。少しずつ形ができてくると楽しいですね。