APEX - 创建一个页面,其中包含多个表单链接到多个相关表格...所有提交都只需一个按钮?

时间:2011-10-24 14:42:30

标签: forms oracle-apex

我在APEX中有两个表,它们通过主键链接。一个表(APEX_MAIN)保存我们系统中文档的基本元数据,另一个表(APEX_DATES)保存与该文档处理相关的重要日期。

对于我的团队,我创建了一个控制面板,可以与所有这些数据进行交互。问题是,现在他们改变了页面上APEX_MAIN中的信息,然后他们改变了另一个上的APEX_DATES。我真的希望能够在同一页面上提供这些表格,并将更新提交到各自的表格和带有单个提交按钮的行。我已经在同一页面上使用两个不同的区域进行了设置,但是我在初始获取行时遇到错误(哪个行获取第二个似乎工作但是然后在第一个获取的表单中的页面项目是空的?)和提交(它给出了自发送更新请求以来数据库中的信息已经改变的一些错误)。任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:18)

这是内置Apex表单的限制,不幸的是,每页只能有一个自动行获取过程。你可以在每个页面上有多个表单区域,但如果你这样做,你必须自己编写所有的提取和提交处理(真的不是那么困难,但你也需要自己处理乐观锁定等)。

即使使用内置的表单功能,也可以将一个表的表单拆分到多个区域,因为区域本身只是一个布局对象,它没有与之关联的功能。

手动构建表单非常简单,但需要更多工作。

产品

这些应该将源设置为“静态文本”而不​​是数据库列。

按钮

您需要提交页面等创建,应用更改,删除等按钮。这些需要唯一的请求值,以便您知道正在处理哪个表,例如CREATE_EMP。您可以使按钮有条件地显示,例如仅在PK项为空时创建。

行提取过程

这将是一个简单的PL / SQL过程,如:

select ename, job, sal
into :p1_ename, :p1_job, :p1_sal
from emp
where empno = :p1_empno;

它需要是有条件的,这样它才会在进入表单时触发,而不是在每次页面加载后触发 - 否则如果有验证错误,任何编辑都将丢失。这可以由隐藏项控制,该项最初为null,但在页面加载时设置为非空值。如果隐藏项为空,则仅获取行。

提交流程

您可以有3个单独的进程用于与按钮关联的插入,更新,删除,或者单个进程查看:request值以查看需要执行的操作。无论哪种方式,流程都将包含简单的DML,如:

insert into emp (empno, ename, job, sal)
values (:p1_empno, :p1_ename, :p1_job, :p1_sal);

乐观锁定

为简单起见,我省略了上述内容,但内置表单为您做的一件事是处理“乐观锁定”以防止2个用户同时更新同一记录,其中一个更新覆盖另一个。您可以使用各种方法来执行此操作。一个常见的方法是使用OWA_OPT_LOCK.CHECKSUM来比较选择时的记录,因为它是提交更新时的记录。

在获取过程中:

select ename, job, sal, owa_opt_lock.checksum('SCOTT','EMP',ROWID)
into :p1_ename, :p1_job, :p1_sal, :p1_checksum
from emp
where empno = :p1_empno;

在提交更新过程中:

update emp
set job = :p1_job, sal = :p1_sal
where empno = :p1_empno
and  owa_opt_lock.checksum('SCOTT','EMP',ROWID) = :p1_checksum;

if sql%rowcount = 0 then
    -- handle fact that update failed e.g. raise_application_error
end if;

答案 1 :(得分:1)

获取部分的另一个更简单的解决方案是使用所需的所有字段创建视图。

缺点是您以后需要更改“提交”代码以插入到作为视图数据源的表中