はじめに
自己紹介
主にFileMakerの記事を担当しますApple好きのハンドルネーム “ほうがん” です。SF好きな方ならわかる方もいらっしゃると思いますが、ハードSF作家 ジェイムズ・パトリック・ホーガン(James Patrick Hogan)さん から拝借しております。処女作「星を継ぐもの」に衝撃を受けて、それから彼のほとんどの作品に目を通しました。 最近、ChatGPTが話題になっていますが、ホーガンさんの「未来の二つの顔(1979年)」(The Two Faces of Tomorrow)という人口知能をテーマにした作品があります。(星野之宣さんが漫画化もされています。)内容を少し紹介しておきます。
全地球的にAIコンピュータネットワークが存在している未来、AIに月面の丘陵を平らに整地する工事を任せたところ、AIは命令した人物が想定した整地用重機ではなく、工事現場に人がいるのにそこに月の岩石を大量に打ち込み絨毯爆撃を行うという常識外れの手法を発案しわずかな時間で整地を行うという事件が発生します。 AIは是か非か、このまま進化するAIに人類は運命をゆだねても良いのか、人類はその判断を下すために、建造中のスペースコロニーを改造し閉鎖環境下(ミニ地球環境)で現行AIをさらに進化させた新AIに急成長出来る環境を与え、AIとそのコロニー内に居住する科学者と軍人との対峙する状況を作り出します。想定以上の進化をしていくAIは人間を自分の存在を脅かす存在として認識します。 AIにどんどん侵略される人間側ですが、さて結末は如何に、、、
おもしろそうですよね。
選択レコードを「チェック」フィールドで行う問題点
さてさて、本題に戻りましょう。 FileMaker で複数レコードに「チェック」を入れて選択したコードだけに特定の処理を行うという操作は多くの場面で目にします。普通は同じテーブルに「チェック」フィールドを追加して、各レコードにフィールド「チェック」を配置してマウスクリックで「チェック」するという操作です。
これでも「チェック」は機能しますが、いくつか気にいらないところがあります。
共有するデータベースでは複数の人が同時に同じ処理が出来ない
シングルユーザが使う場合ならこれでも良いですが、データベースを共有している場合、複数人が同時に別の選択状態をキープすることが出来ません。
AとBという2人が別のPCから同じ画面で「チェック」を付けていた場合を想像してください。Aの人、Bの人が行った「チェック」が混在してしまい、想定外の処理を行ってしまいます。
「修正情報タイムスタンプ」が更新されてしまう
「チェック」する操作はレコード情報の変更として扱われて「修正情報タイムスタンプ」が更新されてしまいます。「修正情報タイムスタンプ」が更新されると、ある日時以降の修正されていないレコードなどが判別できなくなってしまいます。
今回はこのチェック機能をデータベース共有で複数人が同時に使った場合にも対応出来て、レコードの「修正情報タイムスタンプ」も更新することなく行う手法を紹介させていただきます。
選択したレコード情報をグローバルフィールドに保存
これらの問題を解決するには選択したレコード固有情報をグローバルフィールドに保存する方法を取ります。
実際にFileMakerで作成してみましょう。
テーブル「住所録」に以下のフィールドを作成します。
修正情報タイムスタンプ 氏名 テキストタイプ 生年月日 日付タイプ チェック 数字 g_選択レコード テキストタイプ グローバル シリアルID テキストタイプ 番号自動入力「SN0001」から増分「1」で設定
作成終了したらレイアウトをリスト形式で作成します。動作がわかりやすいように「g_選択レコード」フィールドも上部に表示させました。比較のためにまずは「チェック」フィールドを追加した状態で作成します。
「住所録」「チェック」フィールドを計算フィールドに変更します。
式は =PatternCount ( g_選択レコード ; シリアルID ) > 0 数字タイプ。
※「g_選択レコード」に対象レコードの「シリアルID」が含まれてるか否かの判定です。
「チェック」フィールドを計算に変えたので「チェック」を入れることが出来なくなりました。
スクリプト名 「シリアルIDの追加削除」を作成
フィールド設定 ( g_選択レコード ; If ( PatternCount ( 住所録::g_選択レコード ; 住所録::シリアルID ) = 0 ; List ( 住所録::g_選択レコード ; 住所録::シリアルID ) ; Substitute ( 住所録::g_選択レコード ; 住所録::シリアルID ; "" ) ) )
※「g_選択レコード」に対象レコードの「シリアルID」が無ければ、List関数を使って「g_選択レコードに追加し、既に存在した場合にはSubstituteで「シリアルID」を「“”」で置換します。これでチェックのトグル機能が実現できます。
「チェック」フィールドにこのスクリプトを割り当てます。
これで完成です。ブラウズモードで実際に操作してみます。
「チェック」機能が動作するのと、修正情報タイムスタンプが書き換わらないことが確認出来ます。
共有環境でしたら、複数の人がそれぞれ固有の選択状態をキープ出来る事が確認できます。
如何でしたでしょうか? 今回作成したファイルを置いておきます。