|7| セレクタ・コネクタ

|7| セレクタ・コネクタ

by Guantare.com

セレクタ・コネクタ

セレクタ・コネクタでの基本的なリレーションを説明します。

基本的なリレーション

 

リレーションシップグラフ

前回はc02_管理団体TOのレイアウト上でリレーションを結んだc02_c01_実習先_詳細TOから特定の実習先の詳細を表示しました。また、自己c02_管理団体_1件TOから自己リレーションを通して実習先に関連付けされた管理団体の詳細を表示しました。それぞれのリレーションはc02_管理団体テーブルに設定されたグローバルフィールドをリレーションのキーとして成り立っています。

この方法だと他のテーブルから実習先や管理団体とリレーションを組まなければならなくなった時に、同じようなリレーションを繰り返し組み込むことになります。リレーションキーとして使うグローバルフィールドをそれぞれのアンカーとなるテーブルに作らなくてはなりませんし、リレーションシップグラフも煩雑になっていきます。
前回、該当年度を全てのレイアウトで表示させるためにコネクタテーブルを利用しました。この仕組みを応用してみます。

 

リレーションシップグラフ

「uiz02_セレクタ」というテーブルを作ります。コネクタの時と同じように「uiz2_Xジョイン」というグローバルフィールドを作り、1件のレコードを作ります。uiz2_Xジョインフィールドとuiz01_コネクタのuiz01_XジョインフィールドをXジョイントで結びます。uiz02_セレクタテーブルに他のテーブルとのリレーションキーとなるグローバルフィールドを作ります。ここではuiz02_g_実習先ID、uiz02_g_管理団体ID、uiz02_g_実習IDという3つのグローバルフィールドを作りsl_c01_実習先TO、sl_c01_管理団体TO、sl_c01_実習TOと「=」ジョイントで結んでいます。

c02_管理団体TO、uiz01_コネクタTO、uiz02_セレクタTOはそれぞれがXジョイントで結ばれているのでc02_管理団体TOからuiz02_セレクタTOのuiz02_g_実習先IDフィールドやuiz02_g_管理団体IDフィールドを参照できるようになり、入力が可能になります。

例えば、c02_管理団体TOのレイアウトでuiz02_g_実習先IDフィールドに実習先のIDを入力すればその実習先の詳細を見ることができるようになります。

コネクタが単なる中継基地だとするとセレクタはフィルター機能を持つ中継基地だと考えてください。ネットワークでのハブとルーターみたいな感じです。

コネクタとセレクタの関係を図示するとコネクタがなくてもそれぞれのアンカーテーブルからXジョイントでセレクタに直接、結び付ければ機能する気がするのですが、セレクタ・コネクタモデルを使い始めたのは最近のことで確証が持てません。私が参考にさせてもらったサイトでは他にも機能があるようでコネクタとセレクタは分けてありました。ここでも別のテーブルにすることにします。私が参考にしたサイトです。

 

とても勉強になりましたが、よく理解できていない部分も多くあります。

 リレーションシップグラフ

 

リレーションシップグラフ

前回サンプル(SampleDB_05.zip)のリレーションシップグラフです。

 

リレーションシップグラフ

今回サンプル(SampleDB_06.zip)のリレーションシップグラフです。

レイアウト上のでの表示

 

画面キャプチャ

前回サンプル(SampleDB_05.zip)の管理団体に登録する画面です。実習先と管理団体へのリレーションキーがc02_g_テキストkey01とc02_g_テキストkey02になっています。

 

画面キャプチャ

今回サンプル(SampleDB_06.zip)ではuiz02_セレクタのuiz02_g_実習先IDフィールドとuiz02_g_管理団体IDフィールドを配置し、実習先の詳細はsl_c01_実習先TOのフィールドを配置してあります。

このレイアウトはc02_管理団体TOのレイアウトです。「現在のテーブルのポータル(リレーションシップグラフに表示されない自己リレーション)」のレイアウトなので、青い管理団体の詳細を表示するフィールドは右側のリストから選択された団体の詳細になります。

 

画面キャプチャ

関連付けられた管理団体以外を選択した時に関連付けられた管理団体の詳細を表示するフィールドはuiz02_セレクタのuiz02_g_管理団体IDフィールドをキーとするsl_c02_管理団体TOのフィールドになっています。

前回も書きましたが、青いフィールドは関連付けられた団体が選択された時か関連付けられた団体がない時以外は隠す設定になっていて、白いフィールドはすでに関連付けられた団体があり、関連付けられていない団体が選択された時以外は隠す設定になっています。

 

画面キャプチャ

実習先のリスト内に関連付けられた管理団体を表示する場合、セレクタはうまく機能しません。セレクタテーブルのキーはグローバルフィールドなので一つの値しか持てないからです。
リスト内に表示させる場合はc01_実習先テーブルのc01_管理団体idフィールドを使ったリレーションを利用して管理団体を表示することになります。

このように一時的に1件のレコードを参照する場合に利用するのがセレクタになります。
セレクタテーブルのグローバルフィールドはコネクタに繋がっている全てのテーブルに配置することができ、どのテーブルからでもキーとなるフィールドに入力することでリレーションを確立することができます。とても便利な仕組みです。

データベースの修正

リレーションを変更したのでスクリプト内でキーになる値を入力するフィールドを修正しなければなりません。

スクリプトの書き換え

c02_g_テキストkey01をuiz02_セレクタのuiz02_g_実習先IDに、c02_g_テキストkey02をuiz02_セレクタのuiz02_g_管理団体IDに修正します。
修正するスクリプトは「管理団体関連付け」と「管理団体登録」です。
「c02_管理団体・設定」レイアウトも配置するフィールドを変更します。

今回は簡単な修正で済みますが、スクリプトの数がもっと多かったり、スクリプトの中に別のスクリプトが入れ子になっているとフィールドを探すのが厄介になってきます。そういう時はスクリプトワークスペースで全てのスクリプトを選択してPDFに書き出し、目指すフィールド名称を検索する方法があります。
使っているOSがWindows10かMacであればスクリプトを選択して印刷を選び、PDFにします。書き出されたPDFをAdobeReaderなどのビューアを使って検索します。

フィールドの削除

c02_管理団体のc02_g_テキストkey01フィールドとc02_g_テキストkey02フィールドは使わなくなったので削除してもいいのですが、私の流儀では不要になったフィールドを削除しません。「___xxx01」のように使っていないのがわかりやすい名前のグローバルフィールドに変更し、後々、フィールドを追加する時に使用するか、「___住所関連グループ」のようにフィールドのグループ分けの仕切りにします。グローバルフィールドにするのはフィールド内に入力された値が空になり、全体の容量が減るからです。
不要になったテーブルオカレンスやテーブルも削除しません。

これは私の流儀であって、削除しても構いません。
私が削除しないのは昔の苦い経験があるからです。

FileMakerのバージョンアップには機能の追加や改善だけでなく、ファイルフォーマットの変更を伴うものがあります。ファイルフォーマットが変更されるとファイル名の拡張子が変わります。現在の拡張子は「.fmp12」ですが、バージョン12でファイルフォーマットが変更されたことを示しています。それ以前のバージョンで作られたファイルをバージョン12で開こうとすると「フォーマットを変換するか」というダイアログが表示されて変換を始めます。一度変換してしまえば後は普通に開くことができます。

バージョン5.5はよく出来たFileMakerでしたが、1ファイルに1テーブルという構成で実際にはテーブルという概念はありませんでした。リレーションはファイルとファイルを結びつけるものであり、一緒に運用できるファイル数にも制限がありました。

バージョン7は画期的な製品でした。1ファイルに複数のテーブルを持つことができるようになり、それまで通りファイルへのリレーションも可能でした。
このようなことができるようになったのはファイルフォーマットの大改革があったからです。しかし、ファイルフォーマットが大きく変わったので古いバージョンで作られたファイルを変換するのも制約が多く大変でした。指定された通りに古いバージョンを整備して変換しても失敗が多かったのです。うまく変換されても数日使っていると突然ファイルが壊れて画面が真っ白になって修復することもできませんでした。

バージョン7でそれまでと全く同じ構造のファイルを作ってそれから徐々に作り変えた方がいいという結論に至って作業を始めました。ファイルは10数箇あり、フィールド数は100〜200というファイルがありました。そのフィールドの多くは計算フィールドであり一つづつ作るのは途方も無い感じがしたので古いバージョンのフィールドを計算式ごとコピーして新しいファイルにペーストすることしました。スクリプトも同じようにコピーペーストしました。
結果、計算フィールドの計算結果がおかしいのです。

プロの方に相談したら、フィールドIDが違うからだと言われました。
つまりFileMakerはフィールド名称ではなくフィールドIDで管理しているわけです。だから、フィールド名称を変更してもスクリプトでも計算式でもフィールド名称の変更を即座に反映させることができるわけです。
フィールドを作成順に並べ替えても途中に削除されたフィールドがあればフィールドIDが飛びます。そのまま新しいファイルにコピーしても新しいファイルのフィールドは順番にIDがつけられていくのでズレが生じてしまうのです。

結局、フィールドIDを調べて削除されたフィールドの数だけ新しくフィールドを作り、作成順に並べ替えた後に削除されたフィールドの順番のところに新しいフィールドを入れてからコピーペーストするという大変な手間をかけることになりました。それ以降、フィールドを削除しないのが私の流儀になりました。


袋田の滝の写真

袋田の滝 有名な滝ですが、展望台が間近すぎて雄大な全景を撮るのが難しい。
iPhone 4S 4.30mm ISO64 1/500 F2.4 P
jpg
2012/6 Daigo Town