|6| 自己リレーション・コネクタ

by Guantare.com

前回のサンプルDBでミスがありました。ui01_g_実習管理のアンカーTOとd01_年度のアンカーTOの間にリレーションを組んでしまいました。アンカー・ブイモデルに反することをやってしまいました。気持ちが先走るとやりがちなことです。気をつけましょう。
後々、d01_年度TOとのリレーションは組み替えるので、今回はこのままにしておきます。

実習先と管理団体

前回でも書きましたが、実習を依頼する時、実習先に直接依頼する場合と教育委員会などの管理団体に依頼する場合があります。公立の保育園ではそれぞれの自治体の保育関連の部署、例えば「〇〇市保育課」などが多く、児童館では「〇〇市子育て支援課」など、公立幼稚園ではそれぞれの自治体の教育委員会になります。社会福祉法人が運営しているところは直接実習先に依頼することが多いのですが、1つの法人が多くの保育園を運営している場合、法人本部へ依頼することもあります。

管理団体テーブル

まず、管理団体のテーブルを作ります。実習先に関連するテーブルなので実習先のテーブル名と同じ「c」という記号を使い「c02_管理団体」とします。フィールドは

  • c02_管理団体ID
  • c02_役所法人名など(テキスト)
  • c02_役所法人名ヨミ(テキスト)
  • c02_名称(テキスト)
  • c02_名称ヨミ(テキスト)
  • c02_郵便番号(テキスト)
  • c02_都道府県(テキスト)
  • c02_市区町村(テキスト)
  • c02_町域番地(テキスト)
  • c02_建物名(テキスト)
  • c02_管理対象(テキスト)
  • c02_g_テキストkey01(テキスト・グローバル)
  • c02_g_検索テキスト01(テキスト・グローバル)

とします。

役所法人名と名称のフリガナはフリガナフィールドを指定しておきます。

郵便番号、都道府県、市区町村、町域番地は日本郵政の郵便番号簿のセルに従ってフィールドを分けてあります。

c02_g_テキストkey01とc02_g_検索テキスト01は実習先との関連付けと管理団体を新規で作成する時に使います。

関連付けのインターフェース

実習先テーブルにc01_管理団体idというフィールドを作ります。このフィールドと管理団体テーブルの間にリレーションを組めば関連づけることができます。

どのようなインターフェースにするかというと関連付けたい実習先を選択して管理団体を選択するというものにします。逆でもいいのですが、件数が多い方から少ない方を選択するのが楽だと思うからです。実習先は事業区分から絞り込んで探しやすいようにします。実際には住所や名称でさらに絞り込む必要がありますが、仕組みを理解しやすいように事業区分だけにします。実習先を選択したら同じ市町村にある管理団体を絞り込むようにします。

前回までのSampleDBでは実習先に住所のフィールドがありません。管理団体と同じように住所のフィールドと法人名、法人名ヨミ、名称ヨミのフィールドを追加しておきます。また今回は使いませんが、施設内容区分のフィールドを作っておきます。施設での実習では様々な目的の施設があります。障害児を対象としたもの、児童養護施設、児童館、障害者支援施設など様々です。児童館は管理団体と関連づける必要があるので区分を作っておくと絞り込みが楽になります。

自己リレーション

次にレイアウトデザインを考えます。レイアウト上に絞り込んだ実習先のリスト表示と住所などを確認できる詳細表示があると便利です。

これは自己リレーションと呼ばれる同じテーブルの2つのTOの間にリレーションを組むことで実現できます。リレーションキーを工夫することやポータルフィルターを使うことで絞り込むこともできますが、設定は面倒な作業になります。リレーションシップグラフも複雑になってしまいます。バージョン17ではとても簡単に作ることができるようになりました。
私は16から17へのアップグレードを躊躇していたのですが、トライアル版でこの機能がいかに有益なものかがわかり、アップグレードしてしまいました。また、17からはスクリプトのデバッグもできるようになっているので16以前を使用している方にはオススメです。私自身、自己リレーションは頻繁に使っていたのでとても助かっています。ただ、このポータルは16以前のバージョンで開くと何も表示されないので気をつけてください。

 

画面キャプチャ

実習管理_UIファイルのc01_実習先TOのレイアウト上にポータルを作ります。ダイアログでレコードを表示から「現在のテーブル(「c01_実習先」)」を選択します。必要なフィールドを配置します。ポータル以外のスペースに詳細がわかるフィールドを配置します。ポータル内のフィールドは初期設定で入力不可になっています。設定を変えれば入力できるようになりますが、レコードを選択するだけのリストなので初期設定のままにしておきます。

c01_実習先TOのレコードを何かの条件で検索したり、ソート順を変えるとポータル内のレコードも絞り込まれ、ソート順も変わります。
リレーションシップグラフにはリレーションが表示されることはなく、すっきりとしています。
気をつけなければならない点はポータルを作るレイアウトは同じテーブルのTOでなければならないことです。

関連付けするレコードが見つかったら、候補となる管理団体のリストを表示させます。管理団体のIDが分かっていればすぐに関連づけられるのですが、人の能力では全てのIDを覚えるわけにはいきません。同じ市町村にある管理団体を検索しますが、入力されていないかもしれませんし、教育委員会と市の部署など複数の団体が検索されるかもしれません。リスト表示させる必要があります。ここでも管理団体同士の自己リレーションを活用します。

c02_管理団体TOに自己リレーションのポータルを作ります。

c01_実習先TOで実習先を選択したら、c02_管理団体TOのレイアウトに移動して、実習先の住所で管理団体を検索し、絞り込みます。しかし、レイアウトを移動した時点で実習先が見えなくなります。選択したc01_実習先TOの情報がわかるようにし、c01_実習先TOのc01_管理団体idフィールドに管理団体IDの値を格納できるようにします。

 

リレーションのイラスト

レイアウトを移動する際にc01_実習先IDをc02_管理団体のc02_g_テキストkey01に格納してこのフィールドとc01_実習先IDの間にリレーションを組みます。これで管理団体のレイアウトで実習先の詳細を確認できるようになり、実習先に管理団体IDを格納することができるようになります。

c01_実習先TOのレイアウトにc02_管理団体のキーを設定してリレーションを組む方法もありますが、〇〇市〇〇区などの場合には住所でのキーを設定するのが難しくなります。また、法人本部などは同じ市町村にあるとは限らないのでキーの設定がさらに難しくなります。その点では検索の方が柔軟に対応できるのでc02_管理団体TOの自己リレーションの方が融通が効くと言えます。

住所での検索方法

市区町村で検索すると書きましたが、東京23区以外の区がある市町村は〇〇市〇〇区となっています。管理団体の所在地は同じ市内の別の区かもしれません。どうするかというと東京都以外で市区町村名の最後が「区」なっている場合は市区町村名の先頭から2文字を取得して検索します。東京都の府中市と広島県の府中市のように同じ名前の市がありますので、都道府県も同時に検索します。異なる2つの市区町村が検索されてもリスト表示で10件を超えることはないので目視で判別が可能です。管理対象でも検索しますが、管理対象を入力し忘れていることもあります。管理対象が入力されていない団体も同時に検索します。

対象レコードがない場合やあっても管理対象が異なる場合には管理団体を新規に作成することになります。複数の対象レコードがある場合には選択できるようにします。

自治体に関連する団体は住所での検索が可能ですが、法人本部は別な方法で検索しなければなりません。どんどん複雑になってしまうので今回は先送りすることにします。

 

画面キャプチャ

c01_実習先TOの自己リレーションを設定したレイアウトで「保育所」を検索した状態です。左側に検索された保育所のリスト、右上に選択された保育所の詳細表示、右下に関連付けされた管理団体の詳細が表示されています。青いフィールドが管理団体のフィールドになっています。

 

画面キャプチャ

管理団体を選択する画面でレイアウトはc02_管理団体TOに作られています。自己リレーションで右側に検索された管理団体のリスト、左下にリストから選択した管理団体の詳細が表示されています。

左上は実習先の詳細です。

 

基本のリレーションシップグラフ

実習先の詳細はc02_管理団体TOのc02_g_テキストkey01フィールドとc02_c01_実習先_詳細TOのc01_実習先IDフィールドの間に組み込んだリレーションによって表示しています。

管理団体の新規作成

管理団体を新規に作成するインターフェースを作ります。

通常ですと新規レコードを作成してデータを入力するのですが、住所が曖昧で入力途中で中断して他の画面に移動してしまうとゴミになるレコードが残っていきます。必須の項目が入力されていないと新規レコードを作らないようにする工夫が必要になります。また、今回は省略しますができるだけ重複しないようなチェックもしなければなりません。

グローバルフィールドを使います。一旦、グローバルフィールドに入力して必須項目が揃っていなければ、注意を促すという仕組みです。
この方法は管理団体の作成だけでなく、実習先の作成にも応用できます。同じレイアウトで済めば作業が楽になります。

ui01_g_実習管理のテーブルを利用して入力画面を作ります。必要な項目が入力されていれば管理団体なり実習先のレコードにデータを書き込むようします。
新規レコードの作成はスクリプトで処理します。

ui01_g_実習管理のテーブルにフィールドを追加します。全てグローバルフィールドにします。

  • ui01_g_郵便番号(テキスト グローバル)
  • ui01_g_都道府県(テキスト グローバル)
  • ui01_g_市区町村(テキスト グローバル)
  • ui01_g_町域番地(テキスト グローバル)
  • ui01_g_建物名(テキスト グローバル)
  • ui01_g_名称など(テキスト グローバル)
  • ui01_g_役所法人名(テキスト グローバル)
  • ui01_g_管理対象(テキスト グローバル)

フリガナや電話番号も必要ですが、仕組みを理解することが目的なのでこれぐらいにします。

 

画面キャプチャ

ui01_g_実習管理TOに新しいレイアウトを作成します。私の場合、レイアウト名は「ui01_g_実習管理・新規作成」のように TO名・レイアウト名 にしています。そのレイアウトがどのTOなのかわかりやすくするためです。また、アンカーブイモデルではアンカーTO以外にはレイアアウトを作らないことが原則です。

管理団体に新しいレコードを作成したら、元のレイアウトに戻るわけですが、新しく作成したレコードも表示されるようにもう一度検索し直します。

2つの自己リレーション

既に管理団体と関連づけられている場合、そのことが分かるようなインタフェースにします。間違えて関連付けたものを修正する場合もありますし、正しければ関連付ける必要がないからです。

画面キャプチャ・表示比較

左は関連付けられていない場合の表示、中央は関連付けられている場合の表示、右は関連付けられているが、c02_管理団体テーブルのレイアウト上でリストから他の管理団体を選択している場合です。

関連付けらた管理団体の名称、住所などのフィールドは2つのリレーションによって表示されています。ブルーのフィールドはc02_管理団体TO自体の自己リレーションのものです。リストから管理団体を選択すると関連付けられていなくてもその詳細が表示されます。関連付けられた団体を選択しているときは問題がないのですが、それ以外の団体をリストから選択している時は関連付けられていない団体の詳細が表示されるので具合が悪いことになります。その場合はフィールド自体を隠すようにしています。

 

簡単なリレーションシップグラフ

白い名称フィールドは常に関連付けられた管理団体を表示しています。これはc02_管理団体TOに配置したc02_g_テキストkey01にc01_実習先に格納されているc01_管理団体idフィールドの値を入力してc02_管理団体TOのc02_管理団体IDフィールドをリレーションで結んで表示しています。これも自己リレーションの一種ですがc02_g_テキストkey01の値が変わらない限り表示されるデータも変わりません。このフィールドも状況に応じて隠すようにしています。

入力操作をしている人にわかりやすくするための方法論です。

コネクタ

管理団体の話からは外れますが、様々なレイアウト上で当該年度を表示したいと思います。実習先と管理団体の関連付けでは当該年度を気にする必要はありませんが、新しく実習のレコードを作成するときや実習生を実習先に振り分ける時に当該年度が表示されている方が便利です。特に年度末や年度当初に作業をしている時には年度更新されているのかいないのかが重要になります。

 

通常のリレーションシップグラフ

アンカー・ブイモデルでは今まで作成したアンカーTOに当該年度を表示するためにはそれぞれのアンカーTOにそれぞれ別の年度のTOを結びつけることになります。
画面キャプチャではd01_年度TOを紫にしてあります。TOの数も増えリレーションシップグラフも煩雑になっていきます。

 

リレーションシップグラフ・コネクタ

もっとスッキリさせるためにuiz01_コネクタというテーブルを作ります。このテーブルは何もデータを持ちません。レイアウトが表示されることもありません。それぞれのアンカーTOを繋ぐ中継基地のようなものです。ただ、何かをフィルターするようなことはなく、とにかく何でも中継してしまいます。

uiz01_コネクタにはuiz01_g_Xジョインというフィールドだけを作ります。データは入力しません。1件のレコードを作ります。レコードがないと中継基地の役目を果たせません。ただデータを持たない1件のレコードがあるだけなのです。このテーブルのuiz01_g_Xジョインフィールドと他のアンカーTOのフィールドをX(クロス)ジョイントで結びます。アンカーTOのフィールドは何でもいいのですが、私はIDのフィールドにしています。

 

画面キャプチャ

こうしておくことでそれぞれのアンカーTOからd01_年度のレコードを参照できます。d01_年度のレコードは1件しかありませんので参照するデータは常に一定になります。

様々なレイアウトに配置してみます。フィールドを配置するのは面倒なのでマージフィールドにします。「<<d01_年度::d01_年度>>年度」と入力します。文字は数字が漢字より少し小さくデザインされているので漢字より大きめのポイント数を指定しておきます。あとはコピーペーストしていけば完成です。

 

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

上から
ui01_実習管理TOのレイアウト
b01_実習TOのレイアウト
a01_学生TOのレイアウト
c01_実習先TOのレイアウト
c02_管理団体TOのレイアウト
での表示です。

コネクタを中継させる仕組みはとても便利だと思いますし、次回に紹介するセレクタの仕組みに欠かせないテーブルになります。

 

リレーションシップグラフ・コネクタ

サンプルDBでは年度以外にもui99_レイアウトTというテーブルを実習管理_UIファイルの中に作り、コネクタとXジョイントで結んでいます。これは開発で便利なようにそれぞれのレイアウトでどのテーブルのレイアウトなのかを表示させるためです。このテーブルもレコードは1件だけにします。

 

画面キャプチャ

レイアウトのテーブル名を表示したり、非表示にしたりできるようにしてあります。

コネクタテーブルは次回のセレクタ・コネクタモデルでも重要な役割を担うことになります。


桜の蜜を吸うメジロの写真

桜の蜜を吸うメジロ 私のウォーキングコースの一つに梅の写真を撮りに行ったら、多くの鳥が飛び回っている木がありました。遠目には紅梅かなと思ったのですが、近くづくと早咲きの桜にメジロが集まっていました。
Canon EOS KissX7 EF-S55-250mm 250mm ISO800 1/800 F9.0 0.0EV P
Raw SILKYPIX
2019/3 Higashimurayama City