ポータルの表示方法の考察
ポータルに「…more」機能を追加する。
FileMaker において、数万以上のレコードをポータル上に表示させようとすると、(一番最初の読込表示の時に)3秒以上かかる事がある。この事に苦痛を伴う人がいるらしく、なんとかしてほしいという。
そこでポータルの表示方法を工夫し、一度に全てのレコードを表示させるのではなく、数百件毎に表示するようなサンプルを作ってみた。(Admin passなし)
とりあえず100行分程度表示させていて、対象レコードが100を超える場合はポータルの最後の行に、[more]ボタンを設置している。
これなら1秒以内で表示が可能。
数万以上レコードがあるような場合、目的のレコードを表示させるために必ず検索というステップが間にはさまるので、最初から全部表示させる必要ないですね。
また、サンプルファイルには、ページ送りをするようなレイアウトもありますが、iPhone 等の画面の小さいレイアウトの場合、[more]ボタンのようにボタン配置のスペースを取らない工夫の方が良いと思いました。
実装方法
サンプルファイルを見ていただくとわかるが、かなり独特な作り方(スクリプト引数がおかしい)をしている。この作り方についての解説は別の機会にするとして、ざっと実装方法の概要を説明したい。
仕組みとしては単純で、リレーション用の改行区切りフィールドに表示させたいIDを入れているだけである。
1. リレーションの作成
ポータルの最後に [more] ボタンを表示させたいために、リレーションの設定には、「このリレーションを使用して、このテーブルでのレコードの作成を許可」にチェックを入れておく。(注意) 実際このリレーションを使用してのレコードの作成は行ってはいけない。
2. ファイルが開いたら、最初の100件を表示するスクリプトを作る。
FileMaker Pro 13 より、ExecuteSQL 関数にOFFSET 句とFETCH FIRST 句の指定が可能になり、レコード n 件目から m 件目までのIDのリスト等を取得することができるようになった。
以下のスクリプトステップで100件までのIDリストをグローバルフィールドに格納する事ができる。( TableA::g_search フィールドは検索用、Flg_Del フィールドは削除用のフラグとしています。)
フィールド設定 [ TableA::IDList ; ExecuteSQL ( “SELECT ID FROM TableB WHERE Flg_Del IS NULL AND Name LIKE ? OFFSET 0 ROWS FETCH FIRST 100 ROWS ONLY” ; “” ; “” ; “%” & TableA::g_search & “%” ) ]
3. [more]ボタンの実装
ポータルの行にボタンを配置し、最後の行の時のみ、[more]ボタンを表示するように設定する。(not IsEmpty ( TableB::ID ) が True の場合は隠す)
ボタンには、以下のスクリプトステップが動くように設定する。
フィールド設定 [ TableA::IDList ; ExecuteSQL ( “SELECT ID FROM TableB WHERE Flg_Del IS NULL AND Name LIKE ? OFFSET 0 ROWS FETCH FIRST ” & ValueCount ( TableA::IDList ) + 100 &“ ROWS ONLY” ; “” ; “” ; “%” & TableA::g_search & “%” ) ]
ボタンを押すたびに、100件ずつ追加されていく。
(もし追加されないようであれば、ポータルの更新や、オブジェクトへ移動(オブジェクト指定なし)、再表示等のスクリプトステップを入れると良いかもしれません。私のサンプルでは、オブジェクトへ移動(オブジェクト指定なし)を入れてあります。)
WEBDirect での利用
この「すべてを表示させない」という方針は、「ネットワークの通信量を抑える」効果があると思うので、WEBDirect なんかでも有用なんじゃないかな、って思っていたりします。
ポータルで期間表示
ポータルに4月1日〜4月30日までの期間を表示させたいという要望がある。幾つかの方法を紹介する。
リレーションによる実装方法 (日付)
大なりイコールと小なりイコールのリレーションで作成した例。
リレーションによる実装方法 (ExecuteSQL)
「普通はこんな作り方はしない(と思う)」サンプル。真似しない方がいいかもしれない。
ポータルフィルターによる実装方法
「普通はこんな作り方はしない(と思う)」サンプル。真似しない方がいいかもしれない。