こちらの記事の続きです。
マップに表示されている医療機関をレポートに表示します。
マップのサンプルではCircle Searchのページに実装されています。こちらの記事で作成したレポート上で選択のページをコピーします。ページ番号は9、ページ名はマップ上の医療機関とします。
ページが作成されたら作業の開始です。
マップ・リージョンにページ・アイテムP9_BBOXを作成します。このページ・アイテムは、マップ・リージョンに表示されている領域のジオメトリを保存します。タイプは非表示、設定の保護された値はOFFにします。
マップ・リージョンのAttributesを開き、詳細の境界ボックス・アイテムとしてP9_BBOXを指定します。この設定により、マップに表示されている領域がP9_BBOXに保存されます。
マップの表示倍率が低いと多数の医療機関がマップ上に表示されます。それらすべての医療機関をレポートに一覧する代わりに、マップの倍率を上げるよう警告を表示します。
最初にレイアウトを調整するためのリージョンを作成します。リージョンの作成を実行し、Content Bodyの直下に配置します。識別のタイトルをレポートとします。タイプは静的コンテンツ、外観のテンプレートとしてBlank with Attributes (No Grid)を選択します。
対話モード・レポートのリージョン医療機関のレイアウトの親リージョンをレポートに変更します。
警告を表示するリージョンを作成します。リージョンの作成を実行し、識別のタイトルをレポートなしとします。ソースのテキストとして以下を記述します。
詳細のレポートを表示するには、マップの表示領域が広すぎます。レポートを表示するにはマップを拡大してください。
レイアウトの親リージョンはレポートとし、外観のテンプレートにAlertを選択します。
これで、レポートの準備はできました。
マップの表示領域が変わったときに(ズームイン、ズームアウトされたとき)動的アクションを起動し、医療機関のレポートをリフレッシュします。
マップ・リージョンで動的アクションの作成を実行します。
識別の名前をRefresh Reportとします。タイミングのイベントはマップが変更されました [マップ]です。選択タイプはリージョン、リージョンは..マップを選びます。クライアント側の条件として、タイプにJavaScript式を選び、JavaScript式に以下を記述します。
$v("P9_BBOX") !== ""
&&
apex.region("medical-facilities-region").call("getMapCenterAndZoomLevel").zoom >= 12
P9_BBOXに値が設定されていて、かつ、マップの倍率が12を超えているときに、マップに表示されている医療機関をレポートに一覧します。
最初のTrueアクションとして、識別のアクションをリフレッシュ、影響を受ける要素の選択タイプをリージョン、リージョンに..医療機関を指定します。このアクションによって医療機関のレポートが更新されます。
警告のリージョンを非表示にします。TRUEアクションの作成を実行し、識別のアクションを非表示とします。影響を受ける要素の選択タイプをリージョン、リージョンを..レポートなしとします。
動的アクションのクライアント側の条件に一致しない場合、警告のリージョンを表示させます。作成したTrueアクションでコンテキスト・メニューを開き反対のアクションの作成を実行します。
TRUEアクションの作成を実行し、医療機関のレポート表示します。識別のアクションは表示、影響を受ける要素の選択タイプをリージョンとし、リージョンに..医療機関を選びます。
このアクションについても、反対のアクションの作成を実行します。
P9_BBOXとして保存されるジオメトリが検索結果に反映されるよう、レポートおよびマップのソースであるSQL問合せを更新します。
対話モード・レポートの医療機関のソースのSQL問合せは以下になります。P9_BBOXとして設定されている領域に接しているか含まれる位置に存在する医療機関に限定されるよう、WHERE句でSDO_ANYINTERACTファンクションが使用されています。
select f.facility_id, f.zip_code, f.facility_name, f.facility_addr, f.geometry
, m.ans_type ans_type_m, e.ans_type ans_type_e, h.ans_type ans_type_h
from c19_medical_facilities f
left outer join (
select ans_type, facility_type, facility_id
from c19_medical_facility_statuses
where facility_type = 'M') m
on f.facility_id = m.facility_id
left outer join (
select ans_type, facility_type, facility_id
from c19_medical_facility_statuses
where facility_type = 'E') e
on f.facility_id = e.facility_id
left outer join (
select ans_type, facility_type, facility_id
from c19_medical_facility_statuses
where facility_type = 'H') h
on f.facility_id = h.facility_id
where
:P9_BBOX is not null
and
sdo_anyinteract(
geometry,
mdsys.sdo_util.from_geojson( :P9_BBOX )
) = 'TRUE'
送信するページ・アイテムにP9_BBOXを指定します。
マップのソースのSQL問合せには以前の作業でWHERE句が付けられています。今回の用途では不要なので削除します。以下のSQLになります。
select f.facility_id, f.zip_code, f.facility_name, f.facility_addr, f.geometry
, m.ans_type ans_type_m, e.ans_type ans_type_e, h.ans_type ans_type_h
from c19_medical_facilities f
left outer join (
select ans_type, facility_type, facility_id
from c19_medical_facility_statuses
where facility_type = 'M') m
on f.facility_id = m.facility_id
left outer join (
select ans_type, facility_type, facility_id
from c19_medical_facility_statuses
where facility_type = 'E') e
on f.facility_id = e.facility_id
left outer join (
select ans_type, facility_type, facility_id
from c19_medical_facility_statuses
where facility_type = 'H') h
on f.facility_id = h.facility_id
送信するページ・アイテムに設定されているP9_FACILITY_IDは不要なので削除します。
以上で完了です。ページを実行して記事の最初にあるGIF動画のような動作を確認してみましょう。
索引がある最初の記事はこちらになります。