2021年7月16日金曜日

マップのサンプル解説 (5) - マップに表示されている医療機関をレポートする

 こちらの記事の続きです。

マップに表示されている医療機関をレポートに表示します。



マップのサンプルではCircle Searchのページに実装されています。こちらの記事で作成したレポート上で選択のページをコピーします。ページ番号ページ名マップ上の医療機関とします。


ページが作成されたら作業の開始です。

マップ・リージョンにページ・アイテム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動画のような動作を確認してみましょう。

索引がある最初の記事はこちらになります。