问题描述
我正在APEX中实施流程。这个过程包括一些角色。该过程由在第一步中填写表格的人员启动。
输入的数据存储在集合中,并在提交后输入到相应的表中。这也启动了该过程的下一步。
现在我的问题是,我想在提交完表格后 (即第一个过程步骤完成后) 显示一种完成步骤的历史记录。
我在想一种日志表。
这总结了采取了哪些行动,谁采取了行动,以及在表格中输入了哪些其他重要信息 (例如,在表格中选择了哪个负责人等,表格的ID)。
为了实现这一点,我想到了创建一个触发器,该触发器将跟踪用户的活动并将必要的信息输入日志表中。
然后,我想在 “历史记录” 选项卡中将此表显示为经典报告。
每次用户进行更改时,它都会被记录并显示。但每次在不同的日志表中。这意味着在第二步中,另一个用户必须执行操作,该操作也应记录并显示在 “历史记录” 选项卡中。
目的是记录并显示该过程中每个用户的每个活动。
我希望对以下三件事有所帮助:
1.如何从另一个表 (此处为tbl1) 获取日志表所需的信息 (例如Responsible_id1)。
2.不同的用户编辑同一个表 (这意味着下一个用户将数据添加到同一个表中),但是必须在不同的日志表中进行不同的条目。我是否可以将触发器绑定到用户或此特定过程步骤。
3.成功完成第一个过程步骤后,如何显示当前状态 (这意味着用户下次登录时不必再次执行这些步骤,但他应该看到他目前在该过程的哪一步)?
一些建议已经非常有帮助了。
我对APEX相对较新,对开发不太熟悉。
我也不确定触发器是否是这种用例的正确通用解决方案。
输入的数据存储在集合中,并在提交后输入到相应的表中。这也启动了该过程的下一步。
现在我的问题是,我想在提交完表格后 (即第一个过程步骤完成后) 显示一种完成步骤的历史记录。
我在想一种日志表。
这总结了采取了哪些行动,谁采取了行动,以及在表格中输入了哪些其他重要信息 (例如,在表格中选择了哪个负责人等,表格的ID)。
-- create log tbl create table form_submitted log_id number not null, Responsible_id1 number , Responsible_id2 number, Responsible_id3 number, Responsible_id4 number, added_date date, action varchar2(100); alter table form_submitted add constraint pk_log_id PRIMARY KEY (log_id); -- create sequence to autoincrement values create sequence seq_log_id start with 1 increment by 1 nocache nocycle; --create trigger to insert auto-incremented value create or replace trigger bi_form_submitted before insert on form_submitted for each row begin :new.log_id :=seq_log_id.nextval; end;
为了实现这一点,我想到了创建一个触发器,该触发器将跟踪用户的活动并将必要的信息输入日志表中。
-- create trigger to track user activity and insert on logs table
create or replace trigger trg_user_activity
after insert or update or delete
on tbl1
for each row
begin
if deleting then
--insert data in tbl_logs
insert into form_submitted
(Responsible_id1,Responsible_id2, Responsible_id3, Responsible_id4,created_time, added_date, action)
values
(:new.Responsible_id1,:new.Responsible_id2,:new.Responsible_id3,:new.Responsible_id4, SYSDATE,to_char(SYSDATE,'HH:MI:SS PM'),SYSDATE, 'form_deleted');
end if;
if updating then
--insert data in tbl_logs
insert into form_submitted
(Responsible_id1,Responsible_id2, Responsible_id3, Responsible_id4,created_time, added_date, action)
values
(:new.Responsible_id1,:new.Responsible_id2,:new.Responsible_id3,:new.Responsible_id4, SYSDATE,to_char(SYSDATE,'HH:MI:SS PM'),SYSDATE, 'form_updated');
end if;
if inserting then
--insert data in tbl_logs
insert into form_submitted
(Responsible_id1,Responsible_id2, Responsible_id3, Responsible_id4,created_time, added_date, action)
values
(:new.Responsible_id1,:new.Responsible_id2,:new.Responsible_id3,:new.Responsible_id4, SYSDATE,to_char(SYSDATE,'HH:MI:SS PM'),SYSDATE, 'form_submitted');
end if;
end;
然后,我想在 “历史记录” 选项卡中将此表显示为经典报告。
每次用户进行更改时,它都会被记录并显示。但每次在不同的日志表中。这意味着在第二步中,另一个用户必须执行操作,该操作也应记录并显示在 “历史记录” 选项卡中。
目的是记录并显示该过程中每个用户的每个活动。
我希望对以下三件事有所帮助:
1.如何从另一个表 (此处为tbl1) 获取日志表所需的信息 (例如Responsible_id1)。
2.不同的用户编辑同一个表 (这意味着下一个用户将数据添加到同一个表中),但是必须在不同的日志表中进行不同的条目。我是否可以将触发器绑定到用户或此特定过程步骤。
3.成功完成第一个过程步骤后,如何显示当前状态 (这意味着用户下次登录时不必再次执行这些步骤,但他应该看到他目前在该过程的哪一步)?
一些建议已经非常有帮助了。
我对APEX相对较新,对开发不太熟悉。
我也不确定触发器是否是这种用例的正确通用解决方案。
专家解答
我有点困惑的例子-form_已提交日志表还是主表?这使得在这里给出详细的建议变得棘手。
1.Responsible_id1和其他值如何与源表中的值相关?
如果它们是触发表中的列,则可以使用: new/:old (删除时需要: old值) 访问它们的值。如果他们不是,我们需要更多关于他们如何与这里的帮助相关的细节。
2.您可以有一个if/case语句,该语句检查用户并插入到适当的表中。
但这听起来像你有一个每个用户的日志表。我建议不要这样做-这会使开发更加困难。有一个带有用户列的表,并存储
3.请澄清您在这里要实现的目标。这听起来像是你想要找到用户/进程的最新行,你可以用这样的查询来完成:
还有其他方法; 在以下位置阅读这些内容:
https://blogs.oracle.com/sql/how-to-select-the-top-n-rows-per-group-with-sql-in-oracle-database#one-row-per-group
也就是说,我会尽可能避免触发器,而是构建一个PL/SQL API,例如:
这些将根据需要从主表中插入/更新/删除,并同时记录。然后连接您的表单提交过程以调用适当的过程。
最后,如果你想要自动增加PK值,不需要触发器这样做:
要么将列声明为标识,要么将序列设置为列的默认值。
1.Responsible_id1和其他值如何与源表中的值相关?
如果它们是触发表中的列,则可以使用: new/:old (删除时需要: old值) 访问它们的值。如果他们不是,我们需要更多关于他们如何与这里的帮助相关的细节。
2.您可以有一个if/case语句,该语句检查用户并插入到适当的表中。
但这听起来像你有一个每个用户的日志表。我建议不要这样做-这会使开发更加困难。有一个带有用户列的表,并存储
3.请澄清您在这里要实现的目标。这听起来像是你想要找到用户/进程的最新行,你可以用这样的查询来完成:
with rws as (
select ...,
row_number () over (
order by update_time desc
) rn
from ...
where ...
)
select * from rws
where rn = 1;还有其他方法; 在以下位置阅读这些内容:
https://blogs.oracle.com/sql/how-to-select-the-top-n-rows-per-group-with-sql-in-oracle-database#one-row-per-group
也就是说,我会尽可能避免触发器,而是构建一个PL/SQL API,例如:
create or replace package form_submission_mgr as
function insert_form ( ... )
return table.id%type;
procedure update_form ( ... );
procedure delete_form ( ... );
end;
/这些将根据需要从主表中插入/更新/删除,并同时记录。然后连接您的表单提交过程以调用适当的过程。
最后,如果你想要自动增加PK值,不需要触发器这样做:
:new.log_id :=seq_log_id.nextval;
要么将列声明为标识,要么将序列设置为列的默认值。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




