oracle - 在 oracle apex 报告中显示员工记录或经理记录及其员工
问题描述
我在 Oracle 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;
推荐阅读
- angular - 如何在 Angular 中使用 stylemode 在高图表的进度条中应用颜色渐变
- java - RestAssured:验证实体的创建
- android - 在片段中使用 OnNewIntent 方法
- wpf - Wpf Material Design 日期时间选择器
- sql - BigQuery:为什么在添加“LEFT JOIN”后我会获得更多行?
- indexing - 如果在活动工作期间创建索引,Firebird“键大小超出索引的实现限制”错误消息?
- sms - 接收 Twilio 发送的带有测试凭据的 SMS?
- c# - 识别为 DateTime 的十进制值,而不是从 DateTime.Parse 返回 false
- php - 在 phpword Laravel 中定义另一个表中的一些数据
- javascript - Recaptcha 错误“意外令牌” - Firebase 云功能