即时创建文本项以及生成RTF格式文档

时间:2012-12-07 14:11:03

标签: jquery oracle-apex

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

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

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

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

1 个答案:

答案 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;

在调试模式下运行页面时,这会将值发送到调试输出。