1

在 Oracle ApEx 4.1 中并假设通过使用 jQuery,我如何根据下拉列表动态创建文本项字段,其中询问用户需要多少文本项?

一个基本示例是,如果用户从下拉列表中选择 3,则将向用户显示 3 个单独的文本字段。

然后我的另一个问题是,我将如何将这些字段中的数据保存到数据库中?

除了上述之外,根据存储在数据库中的数据,我还需要基于一些模板生成富文本格式 - 这如何在 Oracle ApEx 中完成。

4

1 回答 1

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 事件来动态执行此操作。

--->
在这 3 种情况下,您可以通过关联的数组访问提交的值。例如,考虑这个 After Submit 过程:

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 回答