2024/03/18

作ってみよう:#3)お小遣い帳 - 過去の入力から選択肢を取得

アプリケーション作ることを主体にした連載 ”作ってみよう” の第 3 回です。

前回、ベースとなる簡単なアプリを作成しましたので、少しずつ機能を追加しましょう。今回は、過去の入力から選択肢を取得する方法です。


ターゲットとなるのは、購入場所 です。どこで買い物するかは事前にわからないので、マスタなどあらかじめ準備できません。だからと言って、毎回手入力だと面倒ですね。

そこで、一度入力した購入場所を選択肢として表示する機能を作成ます。


利用する機能は、@DbColmun と @DbLookup 関数です。それぞれの関数の仕様や使い方は、別途まとめていますので、以下のリンクからご確認ください。

@DbColmun ビューまたはフォルダから列の値を取得します。
@DbLookup ビューを検索して値を取得します。


ビューの作成

どちらの関数もビューの列を経由して値を取得する仕様です。そこで、@関数から接続する検索用のビューを作成します。

前回作成した 1.日付順 ビューをコピペして編集します。列を移動して、1列目は店舗 Vendor、2列目は支店 Branch フィールドに変更します。3列目以降は使用しないのですが、確認用としてそのままとします。

重要なのは、1列目がソートされていることです。@DbLookup でビューを検索する条件だからですね。


続いて、ビューの名前を変更します。

ビュー名 (x.検索\1.購入場所)
別名 vSchVendor

ビュー名を ( ) で括るとそのビューは非表示となり、ビューの一覧に表示されません。

アウトラインやナビゲータで左にメニューを作成することが一般的なので、非表示って必要なの?と思われるかもしれませんが、[表示]-[移動]メニューに表示されてしまい、ビューに移動できてしまいます。


表示するビューはユーザに提供するもの、プログラムでアクセスするビューは非表示とすると決めておくとよいかと思います。ユーザ向けのビューはユーザからの要望で変更しがちです。「要望に応えたら機能が動かなくなった」なんてトラブルは回避したいですよね。


フォームの修正

作成したビューから購入場所情報を取得して選択肢として表示する設定を行います。

まずは、Vender と Branch フィールドの種類を『ダイアログリスト』に変更し、[制御]タブの「選択」は『式で選択肢を設定』を指定します。設定する式は以下通りです。


◇ Vendor フィールド

xLst := @DbColumn("Notes":"NoCache"; ""; "vSchVendor"; 1);
@Unique(xLst)

ビューの一列目を取得して選択肢とする式ですね。


◇ Branch フィールド

xLst := @DbLookup("Notes":"NoCache"; ""; "vSchVendor"; Vendor; 2);
@Unique(xLst)

Vendor フィールドの値でビューを検索して、ヒットしたエントリの2列目を取得する式です。


どちらの式にも、取得した結果を @Unique しています。この関数は、その名の通り重複した結果を排除してくれます。今回のように履歴から取得するタイプでは、重複は普通にあり得ますから、必ず設定が必要ですね。


続いて選択肢が確実に更新されるように設定します。フィールドのプロパティの[制御]タブで以下をチェックします。

Vendor キーワードの変更時にフィールドを更新
Branch 文書の更新時に選択肢を更新

この設定の必要性については、『ダイアログリストフィールドの設定と挙動』をご確認ください。


最後に新しい購入場所の追加ができるように『リストにない値も可』をチェックします。


動作確認

出来上がったら動作確認しましょう。

あらかじめデータをコピペして、重複した状態にしておきます。

文書を新規作成して、購入場所の選択肢が正しく表示されるか確認します。次のように重複排除されて表示できれば成功です。

また、別の店舗を選択したら、支店の選択肢が正しく変更されるかも確認しましょう。


前回 作ってみよう 次回


0 件のコメント:

コメントを投稿