読者がAPEX開発環境とOracleデータベースの基本的な知識を持っていること。
処理のために個々のレコードをマークする機能を備えたレポートは非常に便利ですが、残念ながらすぐに実装されていません。 APEX APIには、レポートにチェックボックスを表示できるapex_item.checkbox2関数がありますが、プログラマはそれらを処理する必要があります。 複数ページのレポートでは、チェックボックスは現在のページにのみ存在し、レポートページを切り替えるときは、マークされたチェックボックスの値をどこかに保存する必要があるため、処理は非常に複雑です。 この場合、これにはAPEXコレクションが使用されます。
APEXコレクションについてのいくつかの言葉。 APEXコレクションは、ユーザーセッション内に存在する名前付きデータ構造であり、複雑なデータ入力フォーム、ウィザードなどを構築するときにデータを操作するように設計されています。コレクションは、構造がVARCHAR2(4000)の50属性、Numberの5属性のテーブルに似ていますタイプDateの属性、タイプXMLの1つの属性、タイプBLOBの1つの属性、およびタイプCLOBの1つの属性。 PL / SQL API APEX_COLLECTIONを介してコレクションを操作します。
そのため、ページではこのようなトリックとトリックを使用します。
- apex_item.checkbox2関数を使用して、レポートにチェックボックスを追加します。
- チェックボックスの状態の変更は、ダイナミックアクションから呼び出されるjavascript関数を使用して処理されます。
- APEXコレクションにチェックボックスの状態を保存します。このため、コレクションに書き込むためにAJAX OnDemandプロシージャを呼び出します。
リクエストに基づいたインタラクティブなレポートを含むページがすでにあると仮定します。
select id, name, descr from geo
idはテーブルの主キーフィールドです。 これをチェックボックスの属性としてコレクションに渡し、マークされたエントリを処理するときに使用します。
A.1ページでプロセスを作成します。
作成→ページコンポーネント→プロセス→
プロセスタイプ: PL / SQLコード
名前: AJAX_UpdateChBoxCollection
ポイント: Ajaxコールバック
PL / SQLページプロセスに次のコードを入力します。
declare l_value varchar2(4000); l_seq_id number := 0; seq number := 0; l_collection_name constant varchar2(30) := 'CHBOXCOLL'; begin ------------------------------------------------------------------ -- Get the value of the global var which was set by JavaScript ------------------------------------------------------------------ l_value := apex_application.g_x01; ------------------------------------------------------------------------ -- If our collection named doesn't exist yet, create it ------------------------------------------------------------------------ if apex_collection.collection_exists( l_collection_name ) = FALSE then apex_collection.create_collection( p_collection_name => l_collection_name ); end if; --------------------------------------------------------------------- -- See if the specified value is already present in the collection --------------------------------------------------------------------- for c1 in (select seq_id from apex_collections where collection_name = l_collection_name and c001 = l_value) loop l_seq_id := c1.seq_id; exit; end loop; ------------------------------------------------------------------- -- If the current value was not found in the colleciton, add it. -- Otherwise, delete it from the collection. ------------------------------------------------------------------- -- Htp.Prn('Seq:'||l_seq_id); if l_seq_id = 0 then begin seq := apex_collection.add_member( p_collection_name => l_collection_name, p_c001 => l_value ); -- Htp.Prn(' Set:'||l_value||' seq_id:'||seq); end; else begin apex_collection.delete_member( p_collection_name => l_collection_name, p_seq => l_seq_id ); -- Htp.Prn(' Rst:'||l_value); end; end if; commit; end;
このプロシージャは、「CHBOXCOLL」という名前のコレクションがまだ作成されていない場合は作成しますが、
状態が変更されたチェックボックスのコレクションにエントリを追加/削除します。 コレクションの名前は、すべて大文字で書かれています。 一意でなければなりません。 その結果、コレクションにはマークされたレコードの属性が含まれます。
A.2次に、このプロセスを呼び出す関数のjavascriptコードをページに追加します。
ページの編集→JavaScript→関数とグローバル変数の宣言
function ajax_call_func(val) { apex.server.process( "AJAX_UpdateChBoxCollection", { x01: val}, { dataType: "text", success: function( pData ) { console.log(pData); } } ); };
この関数は、「AJAX_UpdateChBoxCollection」という名前で以前に作成した関数を呼び出し、グローバル変数apex_application.g_x01を介して値「val」を渡します。
タイプ「text」の結果は、プロシージャ「AJAX_UpdateChBoxCollection」から返されます。
Htp.Prn関数を使用します(「何らかの結果」)。
A.3レポートにチェックボックスを作成します。このため、次のようにリクエストを編集します。
select apex_item.checkbox2(p_idx => 1, p_value => id, p_attributes => 'class="chbox_UpdColl"', p_checked_values => a.c001) cbox, id,name,descr from geo,apex_collections a where a.c001 (+)= id and a.collection_name (+)= 'CHBOXCOLL'
この場合、apex_item.checkbox2関数に基づいて列がリクエストに追加され、
IDによってテーブルに関連付けられたコレクションも同様です。 コレクションは、最初のページの読み込み時とレポートページの切り替え時にチェックボックスの状態を取得するためにのみ必要です。 チェックボックスのある列のタイプは「Standart report column」でなければなりません。
apex_item.checkbox2で使用されるパラメーターについて簡単に説明します。
p_idx => 1
変数番号APEX_APPLICATION 1はF01に対応しています。 2-F02など
p_value => id
コレクションに渡す値。この場合、これはテーブルの「id」フィールドです
p_attributes => 'class = "chbox_UpdColl"'
この場合、HTML属性はclass = "chbox_UpdColl"タグが使用され、それが動的アクションでjQueryセレクターとして使用されます。
p_checked_values => a.c001
コレクションの値を使用して、チェックボックスの状態を示します
わかりやすくするために、SQLクエリに基づく別のレポートを追加します。これはCollectonと呼ばれ、コレクションの内容を表示します。
select a.seq_id,a.c001 from apex_collections a where a.collection_name (+)= 'CHBOXCOLL'
A.4チェックボックスの状態が変更されたときに起動する動的アクションを作成し、 A.3 JavaScriptで作成された関数を呼び出します。
イベント: 変更
選択タイプ: jQuery Selector
jQueryセレクター: .chbox_UpdColl
条件: なし
アクション: JavaScriptコードを実行する
イベント結果が次の場合に起動: True
ページの読み込み時に起動 : False
コード:
var $checkBox = $(this.triggeringElement); ajax_call_func( $checkBox.val() );
セクション3の apex_item.checkbox2関数のパラメーターの 'class'属性の値は、jQuery Selectorフィールドに書き込まれます。 彼の前に、あなたは間違いなくそれに終止符を打たなければなりません。
作成した動的アクションに別のアクションを追加します-チェックボックスをクリックした後、コレクションレポートを更新します。
アクション: 更新
選択タイプ: 地域
地域: Collecton
チェックボックスの機能はすでに機能しています。チェックボックスでマークされたエントリのハンドラーを追加するためにのみ残ります。 カーソルを使用してコレクションからデータを順次抽出し、それを別の記事としてファイルに書き込むプロセッサの例を発行します。
基本的な考え方はここに描かれています 。 作成者は、マークされたチェックボックスをページのアイテムのリストとともに保存します。
欠点は、保存されたリストの最大長が4000文字であることです。 このケースでコレクションを使用すると、この制限がなくなります。
APEXでのAjaxコールバックの使用については、 こちらで詳しく説明されています 。
コードは、Application Express 5.1.0.00.45のapex.oracle.comでテストされました。
希望と建設的な批判は大歓迎です。