【发布时间】:2014-03-27 07:32:25
【问题描述】:
我需要复制选定的行值并存储为新记录。 我正在使用 Oracle Apex 4.2 和表格形式。 我需要使用复选框来选择行和按钮副本。当我选择多行然后单击复制按钮将所有选定的行值复制为新行并保存时。
谁能帮忙
【问题讨论】:
我需要复制选定的行值并存储为新记录。 我正在使用 Oracle Apex 4.2 和表格形式。 我需要使用复选框来选择行和按钮副本。当我选择多行然后单击复制按钮将所有选定的行值复制为新行并保存时。
谁能帮忙
【问题讨论】:
通过 Oracle APEX 表格形式从单个表中克隆现有记录的想法不会对您可以通过 APEX 向导为页面区域内容设置的默认设计产生太大干扰。
用独立的主键建立一个表。
建议包含两个辅助列:COPY_REQUEST 和 COPIED_FROM 用于运行复制操作。特定的表单元素将映射到要设置的表格表单上的这些列。
构建一个 Oracle 存储过程,可以读取需要复制的记录。每次按下SUBMIT 按钮时都会调用此过程。
(可选)如果没有要处理的内容(即没有标记为复制的记录),请考虑取消步骤 (3)。
提示:如果您使用标准的 TABLE 创建向导,您会更轻松。将 CUSTOMER_ID 指定为 PRIMARY_KEY 并让 APEX 在顶部创建其标准自动递增功能。 (序列加触发器设置。)
这是我使用的示例数据...虽然没关系。您可以输入自己的值并能够轻松验证发生了什么。
此过程一次处理 1 个或多个记录,在 COPY_REQUEST 表中具有特殊标识符。任务完成后,程序会清理并再次重置请求值。
create or replace procedure proc_copy_me_request is
c_request_code CONSTANT char(1):= 'Y';
cursor copy_cursor is
SELECT cme.CUSTOMER_ID, cme.CUSTOMER_NAME, cme.CITY, cme.COUNTRY,
cme.COPY_REQUEST
FROM copy_me cme
WHERE cme.COPY_REQUEST = c_request_code
FOR UPDATE OF cme.COPY_REQUEST;
BEGIN
FOR i in copy_cursor LOOP
INSERT INTO copy_me (customer_name, city, country, copied_from)
VALUES (i.customer_name, i.city, i.country, i.customer_id);
UPDATE copy_me
SET copy_request = null
WHERE CURRENT OF copy_cursor;
END LOOP;
COMMIT;
END proc_copy_me_request;
还有一列可以隐藏。它跟踪记录最初是从哪里复制的。
请注意,光标使用
FOR UPDATE OF和WHERE CURRENT OF表示法。这很重要,因为该过程正在更改它所引用的记录。
建立一个标准的FORM类型页面,选择TABULAR FORM风格。按照设置说明进行操作,注意映射正确的主键,以及在上述步骤中使用表创建的 PK 序列对象。
这些步骤完成后,您的页面设置如下所示:
编辑COPY_REQUEST 表单值:
编辑COPIED_FROM 表单值:
在列属性部分下,将显示为选项更改为“显示为文本(保存状态)”。这只是为了防止用户踩到这个只读字段。如果知道不重要,你也可以隐藏它。
创建一个新进程:执行复制过程
这是同一个配置页面的底部,有很少的东西可以更改或添加:
下面的第一张截图是在页面整理和复选框控件到位之前的截图。
插入一些测试数据并尝试一下。上述步骤中创建的页面进程有条件地调用存储过程,该存储过程处理在选择SUBMIT 表单按钮时同时发出的所有复制请求。
评论:如果您花足够的时间修补 Oracle APEX 中的内置向导,就有机会学习与该工具兼容的新设计模式和流程。调整您的方法可以减少额外的工作量和挫败感。
【讨论】: