首页 > 解决方案 > 在 oracle apex 报告中显示员工记录或经理记录及其员工

问题描述

我在 Oracle Apex 中创建了一个带有表单的报告,其中:

如何做到这一点?谁能指导我?

标签: oracleoracle-apex

解决方案


如何区分“普通员工”和“经理”?应该有一些表这样说。正如您作为评论发布的代码(真的,您为什么这样做?您不能编辑问题并发布格式正确的代码而不是这种不可读的混乱吗?)表明唯一标识符是某人的电子邮件地址,也用作用户名登录到 Apex 时,该表将具有对 [电子邮件 + 角色],例如

SQL> desc apex_roles
 Name                                      Null?    Type
 ----------------------------------------- -------- ------------------------
 E_MAIL                                             VARCHAR2(15)
 ROLE                                               CHAR(1)

SQL> select * from apex_roles;

E_MAIL          R
--------------- -
lf@gmail.com    M          --> M = manager
kamal@yahoo.com E

SQL>

现在,创建一个函数来说明某人是否是经理。1如果是,则让它返回,0如果不是(为什么不是布尔值?你不能在select语句中使用它)。

SQL> create or replace function f_is_manager(par_app_user in varchar2)
  2    return number
  3  is
  4    retval number := 0;
  5  begin
  6    select 1
  7      into retval
  8      from apex_roles
  9      where e_mail = par_app_user
 10        and role = 'M';
 11
 12    return retval;
 13  exception
 14    when no_data_found then
 15      -- user isn't a manager
 16      return retval;
 17  end;
 18  /

Function created.

SQL>

现在where在报告的子句中使用该功能;假设这是包含您要显示的数据的表:

SQL> select * from my_data;

E_MAIL               JOB              SAL
-------------------- --------- ----------
CLARK@gmail.com      MANAGER         2450
KING@gmail.com       PRESIDENT       5000
MILLER@gmail.com     CLERK           1300
lf@gmail.com         MANAGER         2200        --> manager in APEX_ROLES table
kamal@yahoo.com      CLERK           1500

当 kamal 运行报告时会发生什么?该用户只能看到自己的数据:

SQL> select job, sal
  2  from my_data
  3  where e_mail = case when f_is_manager('&&APP_USER') = 1 then e_mail
  4                      else '&&APP_USER'
  5                 end;
Enter value for app_user: kamal@yahoo.com

JOB              SAL
--------- ----------
CLERK           1500

但是,如果经理运行它,它会看到每个人的数据:

SQL> select job, sal
  2  from my_data
  3  where e_mail = case when f_is_manager('&&APP_USER') = 1 then e_mail
  4                      else '&&APP_USER'
  5                 end;
Enter value for app_user: lf@gmail.com

JOB              SAL
--------- ----------
MANAGER         2450
PRESIDENT       5000
CLERK           1300
MANAGER         2200
CLERK           1500

SQL>

因为它是 Apex,所以你实际上会使用

select job, sal
from my_data
where e_mail = case when f_is_manager(:APP_USER) = 1 then e_mail
                    else ':APP_USER'
               end;

推荐阅读