FileMaker ブラウザテーブルで運用する

FileMakerで『ブラウザ用テーブル』を使い、メインデータをポータル表示する基本。

ブラウザ用テーブルにレコードを表示して運用

通常はデータテーブルを直接レイアウトに表示しますが、ここでは『ブラウザ用テーブル』をレイアウトに表示し、その中にポータルを使ってデータテーブルを表示します。
ブラウザ用テーブルは、データ管理のためというより “表示や操作を補助するためのテーブル” と考えると分かりやすいです。

この投稿は、小ネタリファレンスのうち、レコードを矢印キーで移動 の続きとなる投稿です。該当記事のサンプルでも、すでに「他テーブルにメインのテーブルをポータル配置する」レイアウトが登場しています。

矢印キーの投稿のサンプルファイル。「他テーブルにポータル」がすでにある。
矢印キーの投稿のサンプルファイル。「他テーブルにポータル」がすでにある。

自分ではアタリマエのようにこういうレイアウトを多用していますが、これについてちゃんと基礎部分を押さえたサンプルファイルを作っていなかったので作ることにしたのです。

ブラウザ用テーブルはデータがあるメインのテーブルとは無関係で、ブラウジングで使ういくつかのフィールド(すべてグローバル)だけで成り立ちます。

このような運用に何の意味が?・・・さあ。ここではまだ触れませんがWebビューアにデータを表示するときには本領を発揮します。

このやり方を行うために、必須フィールドやいくつかのお約束が発生します。リレーションは基本のカタチがこんな感じ。

基本的なリレーション
青色テーブルがメインのデータテーブル、黄金色がブラウズ用テーブルです。

レイアウト

ブラウザテーブルだけですべてが成立することはないので、レイアウトにはメインテーブルのものもしっかり作成しておきます。

レイアウトのリスト
レイアウトのリスト

この例では、上の三つはユーザーインターフェイスを備えたレイアウトです。ブラウザはブラウザに過ぎず、いろんな操作や処理はmainのレイアウトで行います。が、ブラウザからも同等のことが行えるようにするため、各種スクリプトでは一旦mainまたは素のレイアウトに移動して処理してから戻るといった手順を必須としています。

データテーブル

メインのデータテーブルは、IDがあってフィールドがある普通のデータテーブルです。他テーブルで運用するために、いくつかの必須フィールドを追加します。

RN

RNはレコード番号、“並び順を保証するための一時的な番号”です。IDは一意で固定ですが、リストの中で何番目にあるかという特定ができません。

対象レコードならレコード番号を記入し、対象外レコードなら空( Null )にします。

対象レコードを変更する操作(新規、削除、検索、ソートなど)のたびにRNを振り直すことで、対象のレコードを確実に特定できるようにします。

チェック用の集計・計算フィールド

RNの不整合はデータベースにとって致命傷になりますから、レコードロードの度にRNが正しく振られているかチェックします。そのためのフィールドも追加しています(チェック用の集計フィールドや計算フィールド)詳しくは後ほど。

ちょっと蛇足になりますが、ここで main と呼んでいるのは、メインのデータテーブルで、本来であればもっと沢山フィールドがあって複雑でもありましょう。

実務上、ほんとならID照合の↓こういうリレーションで、データテーブルをしっかり分離する形が理想かと思います。RNがあるテーブルはめまぐるしく総入れ替えされる生ものテーブルですから。今 main と呼んでいるのは「 RNとIDを司るRelationships 」とも言えます。でも話がややこしくなるのでここではデータテーブルにRNを追加する一体型として進めています。

ブラウザ用テーブル

ブラウザとして使うテーブルはグローバルフィールドだけで作られたテーブルです。サンプルファイルではGLBsという名前です。

dummy フィールド

dummy は数字フィールドです。値は 0 固定。リレーションで使います。ここではデータテーブルのIDがシリアルナンバーなので、IDとdummyを照合して基本のリレーションを成立させます。「X」で繋げば無条件に全部繋がります。

theId フィールド

これは現在アクティブなデータテーブルレコードのIDが入るフィールドです。データテーブルでレコードがアクティブ担った際に、トリガや必須処理でサクッとIDを転記します。「=」で接続することで、データテーブルの特定レコードと常に1対1で繋がります。リレーションでは「シングルレコードと繋がる」という理解で使用しています。

theRn, prevRn フィールド

theRn は「データテーブルで現在アクティブなレコードのRN」を転記します。prevRnは「直前アクティブだったレコードのRNを転記、保持します。prevRnは今回使いませんが、次回で使います。「直前のレコード」情報が必要な機能を盛り込みます。

アクティブ処理

theRn や theId にアクティブレコードを保持することは必須で、これももれなく実行されなければならない処理です。データテーブルでレコードがアクティブになったら、GLBs のそれぞれのフィールドに逐一記録します。

一見手間が多いように見えますが、この仕組みがあることで “アクティブなレコードを別テーブルから常に参照できる” という強みが生まれます。将来的にWebビューアやJavaScript連携を行う際、この設計が非常に役立ちます。

ブラウザ運用の必須処理リファレンス

ここからはリファレンス的にまとめます。フィールドやスクリプトを全部を網羅するわけにもいかないので、詳細はサンプルファイルでご確認ください。

集計・計算フィールド

フィールド定義ではメインテーブルにRNの整合性をチェックするための集計・計算フィールドを用意しています。

S_RnCount 集計, 数字 RN(Nullではない有効な値)をカウント
S_RnSum 集計, 数字 RNの合計値
C_foundCount 計算結果, 数字 コンテキスト "main" Get ( 対象レコード数 )
C_foundRnSum 計算結果, 数字 コンテキスト "main" ( Get ( 対象レコード数 ) * ( Get ( 対象レコード数 ) + 1 ) ) / 2

(ブラウザテーブル上では、メインデータテーブルのポータル内に配置)

スクリプト RNの整合性チェック

RNの整合性チェックは、ブラウザテーブルではなく、メインデータのレイアウト上で行います。

ブラウザテーブルによる運用といっても、何かにつけて実際はメインデータレイアウトに移動しては各種処理を行います。

#=====================================================
#RM が正しく付けられているかチェックするスクリプト
# このチェックは main のレイアウトのみで有効
#=====================================================
#現在レコードのRNをチェック
If [ Get ( レコード番号 ) = main::RN ]
  #OK
Else
  #NG
  スクリプト実行 [ 「RNを更新」 ]
End If
#RNチェック 以下を両方満たしていればOK RNのカウンタ = Get(対象レコード数) RNの合計 = 対象レコードのRNの合計

変数を設定 [ $対象RN合計; 値:( Get ( 対象レコード数 ) * ( Get ( 対象レコード数 ) + 1 ) ) / 2 ]

If [ main::S_RnCount = Get ( 対象レコード数 ) and main::S_RnSum = $対象RN合計 ]
  #OK 問題なし
Else
  #不整合。RNを更新
  スクリプト実行 [ 「RNを更新」 ]
End If
#このチェックについて
#このチェックでは、対象レコード数の変更を伴わない変更に未対応
# ・ソート ・対象レコード数が変化しない検索結果
#そのため、ソートと検索については、それぞれスクリプト内で最後に必ず RNを更新するスクリプトを走らせること

RNチェックはメインデータのレイアウトでOnRecordLoadに含めます。もう一つ「アクティブ処理」も含めます。

アクティブ処理

アクティブ処理は、レコードがアクティブになったら発動させます。データテーブルをレイアウト上で直接表示する運用では OnRecordLoad に含めて良いですが、ブラウザテーブルでの運用だとそれでは駄目です。そこで、ポータルの行を覆う透明ボタンを背面に置いて、ボタンクリックにより発動させます。

#===========================================================
#レコードアクティブで「アクティブ処理」を行う
# main のレイアウト、mainのポータル内で有効
#===========================================================
#theRn を prevRn に転記
# theRn が空でなく、対象レコード数より小さい場合のみ
フィールド設定 [ GLBs::prevRn; If ( not IsEmpty ( GLBs::theRn ) and main::C_foundCount ≥ GLBs::theRn ; GLBs::theRn ; main::RN ) ]
#theRn に今のRN、theId に今のIDを転記
フィールド設定 [ GLBs::theRn; main::RN ]
フィールド設定 [ GLBs::theId; main::ID ]

ボタンクリックの他、矢印キーで移動もすでに組み込まれていますから考慮します。矢印キーでポータルの行を移動した後にも、アクティブ処理を忘れずに追加しておきます。

 

付録

サンプルファイルについて

サンプルファイルにはあらかじめ数千件程度のデータが入っています。これくらいレコードがないと速度感がつかめませんし。

いくつかサンプルスクリプトも込みで入ってます。「ソート」と「検索フィールドの検索」です。

Sample file download: ブラウザテーブルで運用.fmp12.zip

この投稿は以下の投稿と関連しています

[FileMaker] レコードを矢印キーで移動 [初心]

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください