Oracle Application Expressのリージョン・プラグインを作成します

この記事は、Oracle Application Expressと密接に連携するすべての人を対象としています(口語的にはAPEX、または単に頂点)。 また、何かを聞いたことがあり、仕事でそれを使い始めることを検討している人にも。 記事を読んだ後、これをもっとやりたいと思っています。



入門情報



読者は少なくとも一般的な用語で、次のことをよく知っている(または読んだ後すぐに知る)と想定されます。





これらの点で非常に複雑なものはありません;基本的なレベルでのこれらすべては、1か月のゆったりとした作業で多少なりともマスターできます。 例は、5年前の頂点の例で、1年ほど前にリリースされました。



頂点領域プラグインとは何ですか



Apexでは、リージョン、アイテム、プロセス、動的アクション(動的アクション)、認証および承認スキーム用のプラグインを作成できます。 リージョンプラグインとは、直感的に思います。 標準のApexリージョンが実行方法を知らないことを実行できる新しいタイプのリージョンを作成しています。 多くの場合、ここで最も難しいことは、実装するための本当に価値のあるアイデアを思いつくことです。 記事の例として、カテゴリーを作成するためのプラグインを思いつきました。インスピレーションの源は、本のアルファベット順と主題の索引と、サイトhtmlbook.ruのこのページでした。 それでは始めましょう。



ソースデータ



まず、データを含むテーブルを作成します。 記事を書く直前に、私の左のかかとで選択された世界の国々のルブリケーターを用意します。 国と大陸のリストと、これらの国に関するウィキペディアの記事へのリンクを保持しているとします。 このリストを画面にきちんと美しく表示し、カテゴリに分類する必要があります(対応する大陸がカテゴリになります)。 プラグインには、データが表示される列の数という1つのカスタムプロパティもあります。



テーブルを作成してデータを入力するためのコード
create table continent ( continent_id number primary key, continent_name varchar2(100)); create table country ( country_id number primary key, country_name varchar2(100), continent_id number references continent (continent_id), url varchar2(4000)); insert into continent(continent_id, continent_name) values (1, 'Europe'); insert into continent(continent_id, continent_name) values (2, 'Asia'); insert into continent(continent_id, continent_name) values (3, 'North America'); insert into continent(continent_id, continent_name) values (4, 'South America'); insert into continent(continent_id, continent_name) values (5, 'Australia'); insert into country (country_id, country_name, continent_id, url) values (1, 'France', 1, 'https://ru.wikipedia.org/wiki/%D0%A4%D1%80%D0%B0%D0%BD%D1%86%D0%B8%D1%8F'); insert into country (country_id, country_name, continent_id, url) values (2, 'Greece', 1, 'https://ru.wikipedia.org/wiki/%D0%93%D1%80%D0%B5%D1%86%D0%B8%D1%8F'); insert into country (country_id, country_name, continent_id, url) values (3, 'Norway', 1, 'https://ru.wikipedia.org/wiki/%D0%9D%D0%BE%D1%80%D0%B2%D0%B5%D0%B3%D0%B8%D1%8F'); insert into country (country_id, country_name, continent_id, url) values (4, 'Spain', 1, 'https://ru.wikipedia.org/wiki/%D0%98%D1%81%D0%BF%D0%B0%D0%BD%D0%B8%D1%8F'); insert into country (country_id, country_name, continent_id, url) values (5, 'China', 2, 'https://ru.wikipedia.org/wiki/%D0%9A%D0%B8%D1%82%D0%B0%D0%B9%D1%81%D0%BA%D0%B0%D1%8F_%D0%9D%D0%B0%D1%80%D0%BE%D0%B4%D0%BD%D0%B0%D1%8F_%D0%A0%D0%B5%D1%81%D0%BF%D1%83%D0%B1%D0%BB%D0%B8%D0%BA%D0%B0'); insert into country (country_id, country_name, continent_id, url) values (6, 'India', 2, 'https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D0%B4%D0%B8%D1%8F'); insert into country (country_id, country_name, continent_id, url) values (7, 'Japan', 2, 'https://ru.wikipedia.org/wiki/%D0%AF%D0%BF%D0%BE%D0%BD%D0%B8%D1%8F'); insert into country (country_id, country_name, continent_id, url) values (8, 'USA', 3, 'https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D0%B5%D0%B4%D0%B8%D0%BD%D1%91%D0%BD%D0%BD%D1%8B%D0%B5_%D0%A8%D1%82%D0%B0%D1%82%D1%8B_%D0%90%D0%BC%D0%B5%D1%80%D0%B8%D0%BA%D0%B8'); insert into country (country_id, country_name, continent_id, url) values (9, 'Canada', 3, 'https://ru.wikipedia.org/wiki/%D0%9A%D0%B0%D0%BD%D0%B0%D0%B4%D0%B0'); insert into country (country_id, country_name, continent_id, url) values (10, 'Mexico', 3, 'https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D0%BA%D1%81%D0%B8%D0%BA%D0%B0'); insert into country (country_id, country_name, continent_id, url) values (11, 'Brasil', 4, 'https://ru.wikipedia.org/wiki/%D0%91%D1%80%D0%B0%D0%B7%D0%B8%D0%BB%D0%B8%D1%8F'); insert into country (country_id, country_name, continent_id, url) values (12, 'Uruguay', 4, 'https://ru.wikipedia.org/wiki/%D0%A3%D1%80%D1%83%D0%B3%D0%B2%D0%B0%D0%B9'); insert into country (country_id, country_name, continent_id, url) values (13, 'Chile', 4, 'https://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D0%BB%D0%B8'); insert into country (country_id, country_name, continent_id, url) values (14, 'Australia', 5, 'https://ru.wikipedia.org/wiki/%D0%90%D0%B2%D1%81%D1%82%D1%80%D0%B0%D0%BB%D0%B8%D1%8F'); create view by_continent as select continent_name rubric, country_name value, url link from continent ct, country cr where ct.continent_id = cr.continent_id order by rubric, upper(value); create view by_alphabet as select upper(substr(country_name, 1, 1)) rubric, country_name value, url link from country cr order by rubric, upper(value);
      
      







プラグイン



プラグインは、apexアプリケーションで作成されます。 IDEを開き、必要なアプリケーションを選択し、「共有コンポーネント」セクションに移動すると、「その他のコンポーネント」セクションがあり、その中に「プラグイン」があります。 プラグインページに移動し、[作成]をクリックすると、プラグインを作成するためのウィザードが起動します。 次に、手順(2つしかない):作成方法-「最初から」を指定してから、プロパティを指定します。 名前( "Name")、内部名( "Internal name")、プラグインのタイプ( "Type"-"Region")、およびサポートされるアプリケーションのタイプ( "Supported for")-デスクトップおよびモバイル(必要な項目の隣のボックスをチェック)を指定する必要があります。 次に、「プラグインの作成」をクリックします。 プラグインが作成されたので、今度は少し構成する必要があります。 プラグインのプロパティに移動し(これを行うには、プラグインのリストでその名前をクリックします)、「標準属性」セクションで、「リージョンソースはSQLステートメント」および「リージョンソースが必要」チェックボックスをオンにします。 「カスタム属性」セクションに移動し、「属性の追加」をクリックして(出力用の列数を設定するプロパティを追加するには)、次のフィールドに入力します。





カスタム属性で軟膏を飛ばします。 そこには非常に不愉快なものが1つあります。「選択リスト」タイプのカスタム属性を作成する場合は、慎重に行ってください。 インターフェースには個々のレコードを削除するためのボタンはなく、戻り値を編集することもできません。 このわいせつのスクリーンショットは次のとおりです。







ご覧のとおり、「削除」ボタンはありません。 また、「戻り値」フィールドは編集できません。 つまり、どこかでミスをしてすぐに気付かない場合、またはリストを大幅に変更することにした場合は、属性を削除して最初から作成し直す必要があります。 はい、はい、ドロップダウンリストの20エントリもすべて。



プラグインのメインプロパティについて:「コールバック」タブで、「レンダリング関数名」-ブラウザーで表示するための領域のHTMLコードを生成するPL / SQL関数の名前を指定します。 ドキュメントによると、関数には次の署名が必要です。



 function <name of function> ( p_region in apex_plugin.t_region, p_plugin in apex_plugin.t_plugin, p_is_printer_friendly in boolean ) return apex_plugin.t_region_render_result
      
      





ちなみに、この関数の説明を取得するには、ドキュメントに移動する必要はありません。[関数名のレンダリング]フィールドの前にある質問をクリックして、組み込みのツールチップからテキストをコピーするだけです。 また、ドキュメントについて話し始めたので、プラグインの開発には、 APEX_PLUGINおよびAPEX_PLUGIN_UTILパッケージに関するドキュメントが非常に役立ちます。

この関数の最も不思議なことは、関数によって返された結果の説明と、それが使用されている場所を見つけることができなかったことです。 NULLを返すだけで、すべてが機能します。



レンダリング機能



プラグインはほぼ準備ができているので、レンダリング関数を作成する必要があります。 関数を作成します。



 function render ( p_region in apex_plugin.t_region, p_plugin in apex_plugin.t_plugin, p_is_printer_friendly in boolean ) return apex_plugin.t_region_render_result is begin return null; end;
      
      





ご想像のとおり、HTMLを生成するコードは、「begin」と「return null;」行の間に配置する必要があります。

ユーザーのSQLクエリの結果に基づいて領域を生成するには、このクエリを受け取って実行する必要があります。 リクエストの取得は簡単です。apex_plugin.t_region型の説明を読み、リクエストテキストがp_region.sourceフィールドに保存されていることを確認します。 このクエリを実行するためだけに残りますが、EXECUTE IMMEDIATEを急いで取得しないでください。ここでは役に立たないためです。 実際、リクエスト内のユーザーは、Apexエンジンがページフィールドに関連付けるパラメーターを指定できます。 Apexエンジンは、それらを決定してデータを入力できます。 これを自分で行うことはほとんど不可能であり、クエリパーサーを記述する必要があります。 それでは、どのようにリクエストを実行しますか? ユーザーがパラメーター付きのクエリを使用できないようにするか、ドキュメントの詳細を調べてAPEX_PLUGIN_UTIL.GET_DATAファミリーの関数を見つけることができます(2つのGET_DATA関数と2つのGET_DATA2関数。詳細については、パッケージのドキュメントを参照してください)。 これらの関数は、入力としてSQLクエリコードを受け取り、解析し、パラメータを決定し、ページ上の対応するアイテムを見つけます。結果はコレクションとして返され、その説明は同じドキュメントページにあります。 同じp_region変数(レコード-RECORD)には、attribute_01 ... attribute_25という名前の属性が含まれています。 これらの番号は、作成時に[属性]フィールドで指定されたカスタム属性の番号に対応しています。



そして最後の1つ。 HTMLコードは、htp.pプロシージャを使用してページに挿入されます(http!と混同しないでください)。 それはコードです



 htp.p('<b> !</b>');
      
      





「Hello everyone!」と太字で表示されます。 プラグインの完全な機能コードは以下になります。



私も試してみたい!



プラグインと必要なものはすべてここから入手できます 。 次のファイルが含まれています。





プラグインのインストール(この記事からプラグインを作成するためのすべての手順を完了している場合、プラグインを完了する必要はありません):IDEに移動し、必要なアプリケーションを開き、プラグイン(region_type_plugin_rubrikator.sql)でファイルをインポートします。 ファイルタイプの指定-プラグイン、[次へ]、[次へ]、[プラグインのインストール]の順にクリックします。



パッケージのインストール:ファイルrender_plugin_rubrikator.plsおよびrender_plugin_rubrikator body.plsからパッケージをコンパイルします。



パッケージにはレンダー関数と2つのプロシージャ(prepare_demoおよびdrop_demo)が含まれており、それぞれテーブルおよびビューを作成および削除してデモンストレーションを行います(prepare_demoプロシージャによって実行されるコードは記事の冒頭にあります。すでに実行している場合、prepare_demoを呼び出さないでください)必要)。 インストール後にprepare_demoプロシージャを実行します。



 begin render_plugin_rubrikator.prepare_demo; end; /
      
      





次に、新しいページを作成し、その上に2つの領域を作成します。 地域タイプを指定します-プラグイン、プラグインのリストで「Rubrikator」を選択します。 データソースとして指定します。



最初の地域の場合:



 select * from by_continent
      
      





2番目の場合:



 select * from by_alphabet
      
      





ここで、by_continentとby_alphabetは、prepare_demoプロシージャによって作成された2つのビューです。 プラグインの現在のバージョンでは、ソースリクエストの要件は次のとおりです。最初の列には見出しの見出し、2番目-見出し内のポイント、3番目-リンクを含める必要があります。 リンクがNULLの場合、エントリは<a>タグなしでページに表示されます。



プラグインの[列数]フィールドの値を好みに合わせて選択します。 デモ版では、最初の2つと2つ目の3つがあります。

最初のクエリの結果、たとえば:







ページを開始すると、プラグインはそれを次の形式に変換します。



最初の地域:







2番目の地域:







ページへのリンク



All Articles