1

Oracle ApEx 4.1内で、jQueryを使用すると仮定すると、ドロップダウンリストに基づいてテキストアイテムフィールドをその場で作成するにはどうすればよいですか。ユーザーは必要なテキストアイテムの数を尋ねられます。

基本的な例は、ユーザーがドロップダウンリストから3つを選択した場合、3つの個別のテキストフィールドがユーザーに表示されることです。

それでは、これらのフィールドのデータをデータベースに保存するにはどうすればよいでしょうか。

上記に加えて、データベース内に格納されているデータに基づいて、テンプレートに基づいてリッチテキスト形式を作成する必要があります。これは、OracleApEx内でどのように実行できますか。

4

1 に答える 1

1

これにはいくつかの方法があります。
ただし、参照できる実際のページ アイテムが必要:P20_SOME_ITEMで、その場で生成したい場合は、うまくいきません。


ページ項目

上限があることがわかっていて、実際のページ アイテムを使用したい場合は、ページ アイテムに条件を設定することでこれを実現できます。たとえば、値が 1 ~ 6 のリストを選択します。変更すると、ページが送信されます。最初の項目P20_ITEM1は常に表示されます。2 番目のアイテムP20_ITEM2には、次のタイプの条件がありますSQL Expression

:P20_AMOUNT>1

次に、同じ条件を他の項目に適用できます: :P20_AMOUNT>2>3、...


アイテム配列

もう 1 つの方法は、引き続きテキスト入力を使用することですが、バインド変数によって参照されません。表形式で使用されるのと同じロジックを適用できます。項目配列を使用します。あなたはまだいくつかの方法でそれについて行くことができます:

(1)例: 実際の手動の表形式のクラシック レポートを作成します。ソース:

select apex_item.text(1, null) some_item
from dual
connect by level <= :P20_AMOUNT

列を標準レポート列にします。addrow ボタンはありませんが、最初の行は常に存在するため、行を複製できます。

function addRows(){
   var lAmount = $("#P20_AMOUNT").val(),
       lTbody = $("#report_tabform tbody.uReportBody table tbody"),
       lInitRow = $("tr:first", lTbody);
   for(var i=1;i<lAmount;i++){
      lTbody.append(lInitRow.clone());
   };
};

これはテーマ 23 (クリムゾン) のセレクターなので、これを調整する必要があるかもしれません。最初の行を複製し、x 回追加します。たとえば、この関数をボタンで呼び出すことができます。

(2) plsql リージョンの作成 もちろん、必要な HTML を PLSQL リージョンを介して出力することもできます。

FOR i IN 1..:P20_AMOUNT
LOOP
   htp.p('<input type="text" name="f01" />');
END LOOP;

これも、金額の選択が変更された後にページを送信する必要があります。

(3)または、javascript を使用してすべてを作成します。

//with empty region as basis
//pNode: node which will hold the generated table
//pName: name of the item array (f01, f02,...)
//pAmount: amount of items to be generated
function generateItemArray(pNode, pName, pAmount){
   var lTable = $('<table></table>'), 
       lRow = $('<tr></tr>'), 
       lCell = $('<td></td>'),
       lInput = $('<input name="'+pName+'" type="text" />'),
       lnRow, lnInput;
   //ln vars: will hold cloned items
   //cloning is necessary because the same instance can not be
   //put in multiple places
   for(var i=1;i<=pAmount;i++){
      lnRow = lRow.clone(); //new row
      lnRow.append(lCell.clone().text("Text for item "+i)); //first cell: label
      lnRow.append(lCell.clone().append(lInput.clone())); //second cell: input item
      lTable.append(lnRow); //append the row to the table
   };

   pNode.html(lTable);  //replace node contents with new table
   // or use append - but you may want to clear the previous content
   // Best use would be to provide a container which you know will only
   // contain the generated items.
};

これにより、金額が変更されたときに送信する必要がなくなります。選択リストの onchange イベントにバインドすることで、これを動的に行うことができます。

--->
これら 3 つのケースでは、関連する配列を介して送信された値にアクセスできます。たとえば、次の送信後のプロセスについて考えてみましょう。

for i in 1..apex_application.g_f01.count
loop
   apex_debug_message.log_message('item value: '||apex_application.g_f01(i));
end loop;

これにより、ページをデバッグ モードで実行すると、デバッグ出力に値が送信されます。

于 2012-12-10T11:45:17.847 に答える