Accessのフォームで写真をクリックすると大きく表示させる。開発12日目。

MSAccessで日曜開発してる美容院向けCRM。だいぶ形になってきました。お客様の写真を表示できるようにしました。クリックすると写真を大きく表示させたい。思いつくのはクリックのアクションでファイル名取得してビューアーに渡して開く、なんですけれど、リンクをつかった簡単な方法で解決しましたので紹介します。

まず、写真の表示はこのようになっています。イメージオブジェクトを写真を表示させたい場所に配置し、そのコントロールソースに写真のパスとファイル名を組み込むだけです。ピクチャタイプは「リンク」です。

「ご予約」ボタンの下にあるテキストボックスは非常時ですが、ここにが[写真FileName]になってます。Dlookupで取得しているのは、ローカル設定テーブルに記録した写真を保存するフォルダのパスです。

写真をWindowsの規定のビューアで表示する

Accessの開設をしているサイトをいろいろ探したのですが、意外とこの方法は紹介されていませんでした。常識だからなのか、知られてないのか?まさかね。

ともかく方法は簡単で、書式の「ハイパーリンクアドレス」の項目に、さっきのコントロールと同じファイルのパスとファイル名が入るようにしてやればいいだけです。

クリックすると、写真ビューアが起動して開いてくれました。この方法だとGifやPNG,JPGなど拡張子を気にする必要なくファイル名を渡してくれるのでラクチンです。

ドライバーアップデートしたらポインティングデバイス動かせなくなった場合の対応法。

ThinkPadに限らず、同様のトラブルにみまわれた場合に回復する方法を紹介します。マウスポインターが動かなくなっちゃう症状です。

Windows10では頻繁に自動アップデートが行われているおかげで、割と最近の復元ポイントが記録されています。ドライバをインストールする前の状態にもどり、自分で作成したファイルなどには影響を与えないので、おすすめの方法です。

ただし、念のため大切なファイルはUSBメモリなどにバックアップを取って試してくださいね。

回復オプションをつかう

マウスポインターが使えなくなってしまった状態なので、キーボードだけで操作します。ちょっとコツがいります。Windowsキー、Tabキーなどを駆使してたどり着きます。

Windowsキー → Tabキー 下カーソルキーで「設定」にすすみ →Enterキー

開くと検索にカーソルがあるので、「回復オプション」と入力して、出てきた候補をクリックします。

ここからは、スクリーンショットが撮れませんでした。ブラウザも使えないので、スマホでNECさんが公開しているこちらのページを参考にしてください。 https://121ware.com/qasearch/1007/app/servlet/qadoc?QID=018310

「PC起動をカスタマイズする」の項目にある「今すぐ再起動」をクリックします。

再起動が行われると、青い画面表示になります。「トラブルシューティング」を選択します。

つづいて「詳細オプション」を選択します。

つぎに、「システムの復元」を選択します。

ユーザー名が表示されるので選択し、パスワードを入力して「続行」を押します。

影響があるドライバが表示されます。心当たりのある(マウスポインタが動かなくなったきっかけのドライバ)が表示されていれば備後守です。実行しましょう。

正常に復元されるとこのようなメッセージが表示されます。マウスポインターが動けば一安心。お疲れさまでした。

ThinkPadのVANTAGEでインストールで発生。対象なのに?

さて、愛用のPCはLENOVOのThinkPad X1 Carbon 。2013年に発売された初代機です。

ThinkPadには自動的にそのマシンに必要な最新ドライバを表示して選択したうえで更新をかけられるLenovo VANTAGE というアプリが入っています。(WindowsStoreからインストールできます。)

更新の確認をしてみると、Synaptics UltraNav Driver -10[32,64]というのが表示されてました。バージョンは19.0.17.142。

いちおう情報も確認しました。そのなかに以下のような文字がありました。

  • [Important] Removed support for ThinkPad X250 and X1 Carbon (Machine types: 20BS , 20BT). See NOTES.

X250とX1 Carbonの一部がサポート対象から外れているというような記載です。

「型番いくつだっけ? まあ、だいじょうぶっしょ!」

と気軽にアップデート。再起動が終わると、案の定マウスポインターが表示されず、というか表示されてるのかもしれませんがポインティングデバイスで動かせず。というわけで、上記のような復元を行ったわけです。

でも、実際はサポート対象だった。

動かせるようになって一安心したところで、もう一度自分のマシンであるThinkPad X1 Carbonの型番を調べました。だって、対象外ならVANTAGEで表示されたらだめっしょ! という気持ち。ぷんぷん!

型番はVANTAGEで調べられます。「デバイス」を選択するとこんな感じです。

製品番号は3443CTO でした。あれ?

ThinkPad X1, X1 Hybrid, X1 Carbon

って書いてあります。サポート対象外は (Machine types: 20BS , 20BT). なので対象..ですよね。

そこで、VANTAGEをつかわず、LENOVOのサポートHPからダウンロードしてもういちどインストールしてみることにしました。

VANTAGEには対象である型番まで記載がありませんでしたが、ホームページには対象としてちゃんと指定がありました。

こんどは正常に動作しました。なぞですが、ひとまずよかった。というわけで、回復方法をご紹介することになったわけです。

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

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

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

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

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

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

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

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

そこで、条件を

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

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

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

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

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

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

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

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

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

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

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

Dmax関数で他のテーブル条件を加えてクエリに入れ込む。美容室向け顧客管理システム 開発日記10日目

MSAccessでアプリづくり。今日はお客様一覧に最終来店日をつけてみました。

「MST_お客様」テーブルに最終来店日の項目をつくってはいたのですが、お客様一覧に表示させるだけなら、ついでにクエリで最新の売上日を出せばよいだけかも?ということで、クエリをいじりました。

このお客様一覧は、「Q_お客様一覧」というクエリで「MST_お客様」というテーブルを整理して表示させているだけです。一方、最終来店日は「DAT_売上」のテーブルから計算します。つまりテーブルを横断します。

そこで作ったクエリですが、上部にはお客様と担当者のテーブルはありますが、売上に関するテーブルが表示されていません。

ポイントはクエリの左から三番目でつかっているDmax関数です。

とてもシンプルな関数ですが、2番目の項目に””でくくっているのはテーブル名です。意味は以下のような内容になります。

「”DAT_売上”テーブルの、”売上日”項目の最大値(日付も見かけは/区切りですが、実際には大きな桁の数字で管理されているので数字です)を表示させる。その際の条件は”DAT_売上テーブル内のお客様ID項目 =  このクエリで使われている「お客様ID」”と一致するもの」

とりあえずこれだけでほかのテーブルから、今のクエリで使っている項目を条件にして最大値である日付、つまり最終来店日を表示させることができます。

弱点は今日お客様が来店した際に今日の日付を出してしまうとか、予約はしたけれども実際には来店しなかったとか・・・。そういう場合にも日付を表示してしまいます。

「DAT_売上」テーブルにはNoShowのフラグを作っているので、そのうちこちらを組み合わせてNoShow(来店しなかった)を除外する工夫も作りこもうとおおもいますが、今日のところはここまで。

写真を決めたフォルダに決まった名前で保存して表示させる。美容室向け顧客管理システム 開発日記9日目

Accessでアプリを作ってます。今日はお客様一覧に写真を選択して表示させるダイアログ関係をつくりました。

動作の手順としては以下のような感じ

  • ファイル選択ダイアログで取り込みたい写真を選択
  • ファイル名を「ID+氏名+拡張子」に変更して アプリで指定したフォルダへコピー
  • 変更後のファイル名をMST_お客様のテーブルに「写真FileName」の項目で登録(実際にはTextBoxに文字列として書き込む)

今回は参照設定の追加が2つ必要です。ファイルダイアログを使うために、Microsoft Scripting Runtime。ファイルの名前と拡張子を分離するためにMicrosoft Office 16.0 Object Libralyを追加しました。拡張子の分離などについては標準関数をつかった文字列操作でも可能ですが、今回はファイルオブジェクトから抜き出してみました。以下のようなコードになりました。

動作テストしてみます

まず、適当な場所にあるお客様の写真を選択します。あとでファイル名はお客様の名前に変換されるので、この時点で写真のファイル名はなんでも構いません。

コードの以下の部分で、ファイル名を変更して、指定のフォルダにコピーしています。

Dlookupを使っている部分があります。これはこのアプリで写真を一括保存してためておくフォルダ名です。コードのあちこちでフォルダ名を直接打ち込んでしまうと、あとで変更したいときに大変なので、アプリの環境変数的なものをテーブルに保存しておくことにしました。テーブルは以下のような状態になっています。ほかにも必要な項目があればふやしていけそうです。

写真の表示はイメージオブジェクトをからの状態で置く

写真を表示させたい位置にイメージオブジェクトを置きます。置いた直後にはファイルを選択するようにダイアログが出ますが、キャンセルでとじてしまいます。

イメージのプロパティのコントロールソースには、以下のような指定をしておきます。写真取り込みボタンの左側には非表示のテキストボックス。コントロールソースにはDlookupをつかった保存フォルダとファイル名を連結することで表示ができるようになりました。

ほかの一覧表示にも写真を表示させる

仕組みは同じなのでほかの一覧表示にも写真を表示させます。お客様詳細画面ではテキストボックスにファイル名が入っているので、その値を使いましたが、一覧ではお客様IDをキーに、こちらもDlookupを使ってファイル名も一緒に検索してしまうことができました。長いけれど要領は同じです。

写真が入るとそれっぽくなってきましたね。一気にお客様一覧がにぎやかになってきました。

できてくると次やりたいことが見えてくる

画面の左には一覧のタブだけがありますが、お客様にカテゴリ付けして、ここで女性、男性とか学生、成人など切り替えられるようにするってのはどうかしらと検討中です。

あと、欄だけ用意していますが、最終来店日ってのは美容院には必要な項目かしら?と思ってつけてみました。DM送るときの目安にもなるし。

クエリで検索窓の文字で絞り込めるようにする。美容室向け顧客管理システム 開発日記8日目

Microsoft Accessでアプリを作成中。お客様一覧画面に必須の検索窓をつくりました。

検索窓をつくって動作させるには簡単に思いつくだけで以下のような方法があります。

  • 検索文字をVBAでSQL文字列にして結果を出す
  • クエリを使って絞り込む
  • フィルタを使って絞り込む
  • マクロをつかっていろいろ

個人的に手軽で早くてどの項目を対象にするのかを設定しやすいのが「クエリを使って絞り込む」方法なので、今回もそれを使いました。

まず、この一覧フォームのプロパティには、レコードソースとしてお客様一覧のクエリである「Q_お客様一覧」をダイナセットで指定しています。

そのクエリのデザインビューを見てみると上のような感じ。ポイントは一番右側の、各項目を&で連結しつつ、抽出条件にLIKE句を使っているところです。

検索の部分を拡大するとこのような感じ。つまり、検索対象にしたい項目をフィールドの部分に「長いひと続きの文字列」にして、[SearchBox]と名前を付けている検索窓に入力された文字が含まれるものだけを抽出するという処理です。

Like句はみんな大好き正規表現の書き方で絞り込み条件を指定できる書き方。前後に※印をつけているので、検索窓の文字列が「一部に含まれる」を表します。

フィールドのところがイメージしにくいと思うので、クエリを実行してみると、検索文字列を指定しない場合は上記のような感じになります。

関係ないけれど、メニュータブをつかったので、[SearchBox]への階層が深くなってます。ここをピンポイントで指定するのに戸惑いましたので上の写真は自分へのメモ。

あとは、検索窓の右側あたりに検索の実行ボタンをつくり、「再クエリ」を埋め込みマクロで構わないので仕込んでおけば完成です。

あと、小ネタですが、テキストボックスの書式プロパティに上記のような指定をしてやると、文字が何も入力されていない時だけ案内を表示できます。ヒントを使ってもいいんだけれど、これも自分へのメモとして。

部品をタブを使ってまとめる。美容室向け顧客管理システム 開発日記7日目

マイクロソフトアクセスで、よっこらしょと開発始めました。今日はいろいろな画面を作って、それっぽく形になってきました。

本日のご予約

見ての通り、今日の予約が並びます。Twitterのタイムラインを踏襲して、上に来るのが未来時間。下に埋もれていくのが過去時間です。 予約時刻から30分過ぎたら色が変わります。1件しか登録していないのでわかりにくいですが、 グレー色の区切りで今どのお客様まで進んできたかがわかります。

NoShowのフラグを付けました。時間になっても現れなかったお客様の予約につけます。

明日以降の予約

明日以降のご予約画面です。こっちはシンプルですね。

お客様一覧

検索窓もあとでつける予定ですが、お客様はここから探して予約できます。

新規のお客様登録画面

まだ会員カードとか持っていらっしゃらないお客様から電話があった場合、お名前と予約時間を聞いてとりあえず登録する必要があります。新規の専用入力画面を呼び出しやすくしようと思います。作りながら、男性女性や学生などのカテゴリがあったほうがいいかな?と思って、画面を作りながら、お客様マスタに項目を追加しました。誕生日を年までなかなか聞き出しにくいし、必要もないだろうということで、誕生月をコンボボックスで設置しました。美容院ではタブレット端末を使ったオペレーションがありかも?と思い立ってコンボボックスにしています。タッチでも入力しやすいインターフェースにこの後寄せていくかもしれません。

画面が増えると一気にそれっぽくなる

だいぶイメージができてきました。ここまではよくある感じの顧客管理だとおもうのだけれど、ここからぜひ加えたいのはタイムライン。お客さんから聞いた情報、町の話題、そういうのをスタッフがTwitterに挙げるような気軽さで情報交換できる機能をつけたいと思ってます。

できれば現役の美容師の方とか勉強中の学生さんとかから、こういう機能があったらよさそう、という意見寄せてほしいわけですが、いかがでしょう?

フォームのボタンやラベルをプロパティ使って状況に応じ変化させる。美容室向け顧客管理システム 開発日記6日目

直接来店した場合に使うボタンとそのダイアログも用意しました。

別のフォームを用意してもよいんだけれど、条件に応じてラベルやタイトルが変化したらよいかな?と。

予約のダイアログは、来店日のところが予約日。来店時間のところは予約時刻でしたが、直来店の場合はボタンを押したときの実時間がそのまま入力されるようになっています。

もう少し変更必要かもですが、予約か直来店かを今のところ担当IDが含まれているかどうかで区別しています。

そこはいいとして、条件に応じて同じフォームをつかいつつ、キャプションというプロパティで表示を変えています。ついでにSQLでテーブルに書き込む際に参考にするフラグなんかもここで変更させてます。

中間テーブル多対多の関係をつくる。美容室向け顧客管理システム 開発日記5日目

Microsoft Accessで開発始めてみました。せっかくお客様管理するので、お客様同士の関係を見える化したら面白いと思いました。

紫式部さんのお客様情報詳細画面をひらくと、右下のお友達リストに小野小町さんが表意jされています。関係もメモで記録しておくことができます。

この関係性は「TBL_お客様関係」のテーブルで管理しています。

IDは関係性ごとにつけているキーで連番です。お客様IDの3は小野小町を表し、お友達IDの4は紫式部を表します。

このような中間テーブルをつかうと、関係性を多対多で表現できます。

3番の小野小町さんを開いた状態で、そのお友達IDを抽出しようとすると、こんな感じのクエリになります。

結果はこんな感じ

ここまでは簡単なんだけれど、このテーブルを単純に使うと、小野小町さんの画面に紫式部さんはお友達として表示されても、紫式部さんのところには小野小町さんは表示されないのです。

ではこんどは、4番の紫式部さんの画面を開いた状態で、以下のようなクエリをつかって、紫式部さんをお友達として登録しているお客様IDを抽出するクエリをつくります。

お互いに表示されるようになりました。

問題はこの二つの条件を同時に実行するクエリが必要。こんな時につかうのがユニオンクエリです。

先ほど作った2つのクエリをSQLで表示させて、あいだをUNIONでつなぐだけ。「;」は取り除きます。

すごく複雑に見えますが、UNION を真ん中において前後にふたつのSQLをコピーしただけです。

この辺の作り方もT’S Wareさんの記事を参考にさせていただきました。

ぶじにお互いのお友達リストに表示できるようになりました。クエリには中間テーブルである「TBL_お友達関係」のIDも含めています。メモ欄を直接あとで編集できればよいのだけれど、どうもUNIONを使っているクエリを参照したフォームは直接編集できないようなので、メモ欄をクリックしたときに編集用のダイアログが開くようにしました。この時に使っているのは中間テーブルのIDです。

7番目の[ID]は中間テーブルのIDです。OpenArgsとしてこれから開くフォームに渡す値です。

このダイアログが開くときに、OpenArgsで渡された中間テーブルのIDからメモ欄に表示させます。変数でもよいんだけれど、lbl_IDというラベルを作って、そこにOpenArgsから読み込んで使ってます。

メモ欄への表示には1行で処理できるDlookupを使いました。

OKボタンをおすことで登録。こっちにはDAOをつかいました。

お友達IDをクリックでお友達を表示

お友達の間をどんどん移動できるように、お友達IDの数字の部分をおすことで、相手の詳細画面が開けるようにしました。これはフォームをDoCmd.OpenFormで開くだけ。4番目の引数がフィルタなのでお客様IDで絞り込んでいます。

DAOで指定したIDの項目を更新する。美容室向け顧客管理システム 開発日記4日目

Microsoft Accessでアプリを作成中。まだお客様の管理画面にとどまっていますが、だいぶ作りこみが進んできました。

ご予約と直来店のボタンを作りました。その名の通り、将来の日付を指定する場合と、お客様が予約なく直接来店した場合にすぐに登録できるボタンを分けてみました。

登録用のダイアログが開きます。予約日は手入力できますが、本日や現在時刻のボタンを押すとその数字も入ります。

メモ欄は空欄でも入力しても構いません。予約登録ボタンを押したときに、メモ欄が空欄だった場合は、「ご予約」という文字列が入るようにしました。もちろん後から書き換えられます。ここは環境設定画面で切り替えられるようにしておいてもいいかも。後で考えます。

登録すると画面下の来店履歴に加わります。最初の段階では「ご予約中」のステータスが表示されています。さっき入力したメモ欄はここでも直接編集できます。

美容院での担当っていう概念がいまいちわからなかったので、お客様のマスタに担当者はあるのですが、来店時にその人がいなかったらどうなるの?ってことも考えて、来店履歴ごとにも担当欄をつけています。このデータは「DAT_売上」のテーブルに書き込まれます。

さて、実際にお客様が来店したら、「明細」ボタンを押します。

最初の段階ではカテゴリが入力待ちになっています。実際に行ったメニューに切り替えていきます。

カテゴリを切り替えると、メニューも「MST_メニュー」のテーブルに従って表jいされます。そのテーブルに登録されている単価が自動反映します。複数のメニューを追加すると、売上合計も自動計算されます。

売上合計の部分は以下のようにコントロールソースにSUM関数を組み込むことで簡単に仕込むことができます。

最後に閉じるを押すと、ダイアログは閉じて来履歴一覧の金額欄に反映するべきだんだけれど、ここに苦労しました。「DAT_売上明細」テーブルではメニュー単品が売上IDと関連づいているので、表示だけSUM関数で都度計算させてもいいかな思っていたんだけれど、結局は「DAT_売上」テーブルに「売上合計」という列を作って、DAOのレコードセットをEDITを使って変更するという方法を使ってみました。

これで「ご予約中」のオレンジの表示が消えて、4000円という金額が表示されました。

ステータスを条件付き書式で色分け

色使いとか表示はもうちょっと工夫がいるかもだけれど、同じ予約中でも条件によって色分けさせました。

当日なら日付が緑になって、かつオレンジ色の「ご予約中」表示。未来日ならご予約中は茶色。過去日で結局お客様来店しなかった場合はブルー。

フォームで「書式」のリボンを選択すると、「条件付き書式」というボタンが表示されます。条件によって色を変えたいセルを選択した状態で押します。

日付が当日より大きい値で、かつステータスが「予約中」か、など柔軟に設定できます。ノーショー(現れなかった)場合は背景をグレーにするなどもっとばっさりわかるようにしてもよいかもですね。

ノーショーが多い要注意客をさがせる?

ノーショーは「DAT_売上明細」を登録しなかったものなので、カテゴリが「入力待ち(ID999)」のものをクエリで絞り込めそうです。そういう切り口で分析するのもアリかもしれませんね。

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

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

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

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

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

写真の表示

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

売上明細

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

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

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

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

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

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

クリックで拡大

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

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

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

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

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

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

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

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

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

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

今後の開発の宿題

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

住所入力支援を使って郵便番号でラクチン入力。美容室向け顧客管理システム 開発日記2日目

MSAccessでアプリを作ってます。今日はお客様情報の詳細画面を整理しました。ポイントは写真を表示させたこと、SNSや住所などをタブ表示にしたこと、お客様関係性のサブフォームをつけて、そちらも写真でイメージがわかるようにしたあたりです。

写真は組み込みにしないでリンクに

写真はデータベースに入れ込んでしまうと、どんどんファイルサイズが肥大化するので、写真のファイル名のみをデータベースに入れておいて、特定のフォルダ名とつなげてコントロールソースにすることで表示させました。

写真ファイルの保存先の指定はあとで変数にして一元管理しようと思います。写真のファイル名も取り込むときにお客様IDを自動でつけるようにしたらよいかしら?

郵便番号を入れたら住所がはいる住所入力支援を使う

少しでも手間を防ぐために、Accessの標準機能である郵便番号による住所入力支援をつかってみました。あらかじめ郵便番号、県名、市町群、住所と4つのテキストフィールドを作って適当な名前を付けておきます。

郵便番号のテキストフィールドをクリックしてプロパティシートの「その他」の一番したにある住所入力支援の右端の「…」を押します。

郵便番号につけた項目を選択して次へ進みます。

住所をどの程度分けるかはここで選択できます。今回は県別、市別などでダイレクトメールを送るような想定をして細かめに分けておきました。こちらもまた該当するテキストフィールドを選択して次へ進みます。

設定が終わると、住所入力支援のところには先ほど選択したフィールド名が表示されました。

ここまで出来たら、適当な郵便番号を入力して、自動入力されることが確認できました。