これにはいくつかの方法があります。
ただし、参照できる実際のページ アイテムが必要: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;
これにより、ページをデバッグ モードで実行すると、デバッグ出力に値が送信されます。