|3| アンカー・ブイモデル

|3| アンカー・ブイモデル

by Guantare.com

学生、実習、実習先、実習生の関連を利用して次のようなことを調べられます。

  • 特定の実習に参加した学生と実習先。
  • 特定の学生が過去にどのような実習先で実習したのか。あるいは実習予定なのか。
  • 特定の実習先で誰が実習しているのか、あるいは過去に実習した学生は誰なのか。

保育士資格の場合は、卒業生が実習した実習先の一覧を厚労省に提出しなければなりませんから、記録を残しておくことは大切ですし、時間がかからないようにしなければなりません。
また、実習先に学生に関する書類を送付する際はその実習先で実習する学生の分をまとめて送る必要があります。

 

自己リレーション

特定の実習に参加した学生と実習先を表示するようにしてみます。

 

実習管理_UIファイルのb01_実習のレイアウトに移動します。表示をフォーム形式に変更します。レイアウトモードにしてポータルを挿入し、リレーションで結ばれた関連テーブルではなく、「現在のテーブル」を選択します。ブラウズモードに切り替えると、このポータルにb01_実習テーブルのレコードがリストアップされます。ポータル行をクリックするとその行の詳細がフォームに表示されるようになります。ポータル行はb01_実習テーブルのレコードを検索することによって絞り込まれます。バージョン17からの仕様です。16以前では自己リレーションを組む必要があり、絞り込むためにリレーションキーに工夫が必要でした。私は自己リレーションをよく使っていたので17にアップグレードして大いに助かっています。

 

アンカー・ブイモデル

 

a02_実習生を起点とした最初に作ったリレーションではb01_実習TOからa02_実習生TOを参照できないのでa02_b01_実習TOのレイアウトを作らなければなりません。ですが、テーブルが増えTOも増えるとレイアウトの管理で混乱してきます。他のテーブルを参照するにも起点となるTOは少ない方が整理しやすいのでb01_実習TOからa02_実習生TOを参照できるリレーションを作り直します。新しいa02_実習生のTOの名前をb01_a02_実習生とします。さらに学生の氏名と実習先の名称を表示するためにb01_a02_a01_学生TOとb01_a02_c01_実習先TOを作り、リレーションで関連付けます。

 

b01_実習レイアウトにb01_a02_実習生TOのポータルを作り、b01_a02_a01_学生TOの氏名とb01_a02_c01_実習先TOの名称のフィールドを配置します。

 

ブラウズモードにしてb01_実習ポータルのリストをクリックするとその実習の詳細と参加した学生と実習先が表示されます。

 

a01_学生とc01_実習先もb01_実習と同じようにリレーションを組みます。

このようなリレーションの組み方をアンカー・ブイと言います。テーブルを作成した時に自動でできるTOを左側に置き、アンカーとします。アンカーを起点にして右側に関連付けるTOを複製して結び続けていきます。レイアウトはできる限りアンカーTOに作成します。計算フィールドも起点となるTOを間違うと結果が出ませんから、アンカーTOを起点とした計算式にします。アンカー・ブイはリレーションの作成が多くなり冗長になりがちですが、データベースの構造としては色々と整理され、全体を見渡しやすくする有効な手段だと思います。

ただ、並べる順番は左から右でなければならないというわけではありません。逆でもいいですし、TOが増えれば半分は左から、もう半分は右からでも構いません。

アンカーを「親」と考えるとブイは「子」、「子」に結びついたブイは「孫」とも言われます。親子関係もできれば短い方が整理しやすいので私は長くても孫までと考えています。できれば親子だけで済めばスッキリします。

最初に作ったa02_実習生をアンカーにしたリレーションは今までのところ使っていません。後々使うことになるのでこのままの状態にしておきます。

 

実習先から実習生を表示させています。

 

学生から実習生を表示させています。

 

アンカー・ブイでなければいけないということではありません。上のアンカー・ブイを崩したリレーションは最初に作ったリレーションと内容的には変わりません。ただアンカーがブイに収束しているだけなのです。こちらの方がスッキリ解いています。これだとa01_学生のレイアウトでa02_実習生を介してb01_実習の名称フィールドやc01_実習先の名称フィールドを参照することができます。

ただ、私の経験に照らすとこのような組み方をすると将来、TOが増えた時に行き詰る可能性があります。データベースが大きくなってからの変更は困難を生じます。
何も問題がないかもしれませんが、私はアンカー・ブイというポリシーを守ろうと思います。

が、やはり「親」「子」「孫」まであるのは鬱陶しいもので、もう少しリレーションシップグラフを整理したいと思います。

コンピュータはキーさえあれば色々なレコードを結びつけられますが、人は学生IDを見ても学生の顔は思い描けません。今、できている孫のTOは全て人に学生の氏名や実習の名称、実習先の名称を伝えるものです。
a02_実習生のレコードに氏名、実習名、実習先名称を格納してしまえば孫のTOは要らなくなります。二重に同じデータを持つことになるのでデータベースとしては良くないことですが、ここはリレーションシップグラフをスッキリさせて見通しをよくすることに重点を置くことにします。

 

リレーションシップグラフをスッキリさせる

サンプルはSampleDB_03zipになります。

第2回で少し触れましたが、実習管理ファイルのa02_実習生テーブルに学生の氏名、実習名、実習先名称を格納するフィールドを作ります。ルックアップか計算フィールドにしても良いのですが、そのためには実習管理ファイルの各テーブルにリレーションを組まなければなりません。実習管理_UIファイルのリレーションでは計算フィールドが成り立たないからです。データベースが大きくなった時の改良を考えると実習管理ファイルではなく、実習管理_UIでの修正の方が効率がいいと思います。現状では実習管理ファイルにはリレーションを組んでいません。

修正に取り掛かる前にui01_実習管理のレイアウトで実習生を作成するわけですが、どの実習の実習生なのかわかりづらいので、こちらを先に修正します。

まず、ui01_実習管理テーブルにui01_g_テキスト01というテキストタイプのグローバルフィールドを作ります。このフィールドは汎用的に利用するのでテキスト01という名前にしてあります。このフィールドに実習名を入れるわけです。ui01_実習管理TOのレイアウトに追加します。

 

実習を選択スクリプトの修正

実習を選択スクリプトを修正します。実習名を変数に入れ、ui01_g_テキスト01フィールドに格納するようにします。

 

フィールド背景に条件付きで色をつける

さらに左側のb01_実習ポータルの実習名フィールドの背景に色をつけます。

 

レイアウトモードでフィールドを選択し書式メニューから「条件付き…」を選択します。「追加」ボタンをクリックして条件の項目で「計算式がを選択し、計算式を入力します。

ここでは
ui01_実習管理::ui01_g_実習ID = ui01_b01_実習::b01_実習ID
としてあります。

 

ui01_g_テキスト01に実習名が表示され、実習ポータルの実習名フィールドの背景に色がつきます。

実習名フィールドでなく、背景専用のフィールドを作ってポータル行全体に色をつけることもできます。

 

GetValue関数を使う

a02_実習生のレコードを作成するスクリプトを修正して学生氏名と実習名を格納し、実習先を決定するスクリプトを修正して実習先名称を格納します。

実施年度も格納することにします。他にも必要な項目が出てくると思いますが、とりあえずこの4項目のフィールドを実習管理ファイルのa02_実習生テーブルに作ります。実施年度は数字タイプ、他はテキストタイプにします。

 

実習生レコード作成スクリプト

スクリプトの中で変数$実習名年度は
ui01_実習管理::ui01_g_テキスト01 & “¶” &  ui01_実習管理::ui01_g_年度
間に改行記号を入れて2行にしてあります。

フィールド設定の際は
GetValue ( $実習名年度 ; 1 )
とします。数字は行番号になります。GetValue関数は改行されたテキストを行ごとにを切り分けます。

 

実習先選択スクリプト

次に実習先選択スクリプトを修正します。$$実習先IDの他に$$実習先名称のグローバル変数を作り、ui01_実習管理TOの必要なフィールドに格納します。1個の変数に2行の文字列を渡してもいいのですが、IDなどデータベースに不可欠なものは単独の変数にするのが私のクセです。

 

ui01_実習管理のレイアウト
a01_学生のレイアウト

それぞれのレイアウトでフィールドを入れ替えます。

 

孫のTOを削除します。リレーションシップグラフがスッキリしました。

基本的なテーブルの関連付けの方法が決まりましたので、次回は実際の業務フローを考えていきます。


年末の夕暮れ、新宿駅新南口を出たあたりにイルミネーションがありました。
久しぶりにJR新宿駅で降りたので、ついスマホで撮っていました。
暗かったのでブレています。
iPhone 6S 4.20mm ISO125 1/30 F2.2 P
jpg
2017/12/20 Shinjuku