如何在Oracle ApEx表单中维护状态

时间:2011-05-18 10:42:06

标签: jquery cookies oracle10g session-state oracle-apex

我遇到了麻烦,不确定使用Oracle ApEx解决此问题的最佳方法。

基本上我有一个基于Table1的表单,但同时,此表单中的一个部分/区域分支到另一个页面,然后在表格中添加详细信息。

为了扩展这个更好的例子,假设我有一个名为CUSTOMER的表,其中包含客户的个人详细信息,例如CUST_ID,FIRSTNAME,SURNAME,DOB,然后我还有另一个名为PURCHASES的表,其中包含以下内容: columns,PURCHASE_ID,CUST_ID,ITEM,ITEM_DESCR,COST,CUST_ID是CUSTOMERS表的外键。

我现在想要创建一个基于表CUSTOMER的Oracle Apex表单,但在同一表单中,在用户提交表单并将表单提交到数据库之前,我还想让用户添加所有购买的客户是通过某种方式在商店购买。一旦用户输入了客户详细信息以及5个购买记录(以某种方式),所有提交并提交到CUSTOMER和PURCHASES表的数据库。

任何人都可以就此类情况提出解决方案或其他替代方案。

感谢。

1 个答案:

答案 0 :(得分:4)

而不是重定向到第2页输入表2信息,您需要提交第1页和分支到第2页。这将保存页面1的会话状态。您不希望页面1数据已更新到Table1中,因此请确保此提交不会调用执行插入/更新的进程 - 例如以“保存”按钮或其他任何条件为条件。

或者,像我的示例here一样在一个页面上完成所有操作。感兴趣的页面是第7页,您可以通过“创建”按钮访问该页面。第7页有一种主/细节形式,但我没有使用Apex向导构建它 - 我不确定你是否可以,但我倾向于不使用向导和内置的表格式工具在我的工作中,所以我不确定。

这就是我为第7页所做的:

1)创建了空白页

2)添加了一个HTML区域“新客户”,并添加了一个Surname的文本项和一个DOB的日期项。

3)使用以下SQL创建报告区域“Purchases”:

select apex_item.text(1,'') item_desc
,      apex_item.text(2,'') cost
from   dual
connect by level <= 5

CONNECT BY子句是从DUAL生成5个虚拟行的技巧。 apex_item包生成表格表单项 - 在本例中为item_desc和cost的2个文本项,以''作为初始值。

4)创建了2个按钮: 提交 - 提交页面 取消 - 重定向到第6页

5)创建一个PL / SQL进程以在提交时运行,如下所示:

declare
  l_cust_id integer;
begin
  -- Insert the new customer
  insert into so_customers (surname, dob)
  values (:p7_surname, :p7_dob)
  returning cust_id into l_cust_id;

  -- Insert the purchases (if data has been entered)
  for i in 1..apex_application.g_f01.count loop
    if apex_application.g_f01(i) is not null then
      insert into so_purchases (cust_id, item_desc, cost)
      values (l_cust_id, 
              apex_application.g_f01(i),
              apex_application.g_f02(i)
             );
    end if;
  end loop;
end;

我以SUBMIT按钮为条件。 apex_application包中包含与表格形式列对应的数组变量g_f01,g_f02等。

6)创建了一个分支,当按下SUBMIT时,该分支返回到第6页。

如果您希望功能偏离Apex页面和区域向导提供的“开箱即用”行为,您必须编写更复杂的代码,如您所见。但是你想要做的任何事情都可以通过这种方式完成。