在oracle apex报表中显示员工记录或经理记录及其员工

时间:2020-05-28 14:08:07

标签: oracle oracle-apex

我已经在Oracle Apex中使用表单创建了一个报告,其中:

  • 如果普通员工在时间表应用程序中登录,则报告应仅显示员工记录,但
  • 如果经理登录,则报告应显示经理记录以及在其下工作的所有员工。

如何实现?谁能指导我?

1 个答案:

答案 0 :(得分:0)

您如何区分“正常员工”和“经理”?应该有一些表这样。当您将代码发布为注释时(真的,为什么这样做?您不能编辑问题并发布正确格式的代码,而不是这种难以理解的混乱吗?)表明唯一标识符是某人的电子邮件地址,该电子邮件地址也用作用户名登录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;