最近、ずっと農作業をやってないのは、やることがないわけでも、毎日遊び呆けているわけでもなくて、最近データベースにかかりっきりだからです。

今までも、出荷伝票管理や、産直の販売管理、集落営農の機械の使用管理なんかは、データベースを作って、それで管理していたのですが、これらを統合して、作物単位に経費から売り上げまでの収支が見えるようにしたいという、統一場理論のような壮大な計画を進行中です。

それにしても、うちは少量多品目なもんで作物の種類がたくさんある上に、圃場も一箇所で一品目ってわけじゃなく、圃場に肥料を入れた時点では、まだ何を植えるか決まってなかったりもし、機械は料金体系の異なる2箇所の集落営農から借りていたりするので、もう複雑きわまりないです。
そんなわけで、データベース構造もわや。

今までずっとかけて、圃場に投入する経費関係を管理するところまでは、なんとか来ました。

そんな中で、「ポータル内にポータルを表示する」という仕組みを実現する必要が出てきて、あちこちググってようやく、どうしたらいいのか理解出来たので、記録しておきます。
あくまでも、自分の為なので、ここまで読んで興味がない方には申し訳ないです。
こっから先はもっとつらいと思うので、ご遠慮くださってかまいません。

——————————————–

【この問題の背景】

FileMakerでは、テーブルの構造が多段階のリレーションシップになっているとき、特定のレコード(第1世代)に関連付けられた他のテーブルのひとつ以上のレコード(第2世代)はポータルで表示する事が出来ます。
しかし、ポータル内に表示されているレコード(第2世代)に関連付けられたレコード(第3世代)を、ポータル内にさらにポータルを作って表示する事が出来ません。
この問題を解決するために、第2世代用のポータルと第3世代用のポータルを用意し、第2世代の特定のレコードが選択されたら、対応する第3世代のレコードが表示される仕組みを作ることにしました。

【具体的な作業方法】

この問題を簡単に表現する為のモデルを作ります。

cats

世代1が第1世代で、世代2が第2世代です。第2世代のGen1Idが第1世代のIDを保持する事により、第1世代と第2世代の間でリレーションが張られています。第2世代と第3世代の間も同様です。

cats2

ポータル内で関連付けられた新規レコードを作製出来るように、リレーションに「レコード作成の許可」のチェックをつけます。

最初に作成するレイアウトです。

cats3

第1世代のレイアウトに、第2世代のポータルと第3世代のポータルを貼り付けています。

このままの状態でデータを入力してみます。

cats4

第3世代のポータルにデータを入力すると、第2世代のどこを選択していても、第2世代の最初のレコードにしか関連付けられないことがわかります。(写真じゃよくわからないけど、やってみるとわかります)

ここで、第1世代のテーブルに「Gen2Id for Portal」というフィールドを追加します。
リレーションの設定に戻り、第3世代のオブジェクト(オカレンス)を複製し、「世代3ポータル表示用」オブジェクトを作成し、「Gen2Id for Portal」と第3世代のGen2Idフィールドにリレーションを設定します。

cats5

レイアウトに戻り、「第3世代」のポータルを「世代3ポータル表示用」に変更します。

cats17

「世代3ポータル表示用」ポータル上のフィールドを、「第3世代」から「世代3ポータル表示用」に変更します。

cats16

これで、ポータルの内容が「世代3ポータル表示用」に変更されました。

cats6

第2世代のレコードが選択された時、自動的に「Gen2Id for Portal」に設定されるようにスクリプトを組みます。
タイトルは「表示する第2世代を指定」とでもしておきます。

cats7

スクリプトの内容は「フィールド設定[世代1::Gen2Id for portal;世代2::ID]」です。
世代2のIDを世代1のGen2Id for portalフィールドにコピーするスクリプトです。

cats8

第2世代のポータルのフィールドが並んでいる部分を右クリックし、「スクリプトトリガ設定」を選び、スクリプトボタンを押し、先ほど作成してスクリプトを指定します。

これで、第2世代のレコードを選択すると、関連付けられた第3世代のレコードを入力/参照できるようになります。

cats15