在Oracle ApEx 4.1中并假设通过使用jQuery,我如何根据下拉列表动态创建文本项字段,用户被问到需要多少文本项?
一个基本的例子是,如果用户从下拉列表中选择3,则会向用户显示3个单独的文本字段。
我接下来的另一个问题是,如何将这些字段中的数据保存到数据库?
除了上述内容之外,基于数据库中存储的数据,我需要根据某个模板生成富文本格式 - 如何在Oracle ApEx中完成。
答案 0 :(得分:1)
您可以通过多种方式解决这个问题
但是,如果您想要可以引用的实际页面项目,例如:P20_SOME_ITEM
,并且想要动态生成这些页面项目:那将无效。
如果您知道上边界并且您希望使用实际页面项,那么您可以通过在页面项上添加条件来实现此目的。
例如,选择值为1到6的列表。更改后,页面将被提交。始终显示第一项P20_ITEM1
。第二项P20_ITEM2
上有条件SQL Expression
:
:P20_AMOUNT>1
然后,您可以将相同的条件应用于其他项::P20_AMOUNT>2
,>3
,...
替代方法仍然是使用文本输入,但不是由绑定变量引用。您可以应用与表格形式中使用的逻辑相同的逻辑:使用项目数组。 你仍然可以通过几种方式解决这个问题:
(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(Crimson)的选择器,因此您可能需要对此进行调整。它将克隆第一行并将其追加x次。例如,您可以在一个按钮中调用此函数。
(2)创建一个plsql区域 当然,您也可以通过PLSQL区域输出所需的HTML。
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事件来动态执行此操作。
<强> ---&GT; 强>
在这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;
在调试模式下运行页面时,这会将值发送到调试输出。