【问题标题】:Query not returning the intended results what am I missing查询未返回预期结果我缺少什么
【发布时间】:2017-04-06 17:46:37
【问题描述】:

我有一个APEX 5.0 App,将用于生成员工的名片。 我创建了一个名为 (P1_EMPLOYEE) 的页面和 SELECT LIST 页面项目。它执行此数据库查询以填充选择列表。

select 
    EMPLOYEE.LASTNAME||', '||EMPLOYEE.FIRSTNAME as FULLNAME,
    EMPLOYEE.SECTION AS SECTION
from 
    EMPLOYEE EMPLOYEE
ORDER BY 
    EMPLOYEE.LASTNAME asc;

当页面加载时,它会在选择列表中输入大约 900 名员工姓名(例如 Doe、John、Doe、Jane 等......)。

另外,我创建了一个名为 (Create) 的按钮,它的动态操作设置为执行 Javascript(例如 window.open( 'f?p=&APP_ID.:0:&SESSION.:PRINT_REPORT=CreateBizCards' );)。

上面的CreateBizCards是一个报表查询,我输入了

的SQL语法
select 
    EMPLOYEE.FIRSTNAME as "FIRST NAME",
    EMPLOYEE.LASTNAME as "LAST NAME",
    EMPLOYEE.TITLE as TITLE,
    EMPLOYEE.SECTION as SECTION,
    EMPLOYEE.OFFICE_PHONE as "OFFICE PHONE",
    EMPLOYEE.EMAIL as "E-MAIL"
from 
    EMPLOYEE EMPLOYEE
where 
    EMPLOYEE.LASTNAME = :P1_EMPLOYEE;

当触发(创建)按钮时,假设根据SELECT LIST 中选择的员工姓名创建报告。


发生了两件不想要的结果。

首先,当触发“创建”按钮时,它将生成具有相同姓氏的不同用户的报告。

其次,如果我在触发按钮时更改报告查询上的 SQL 查询,它会生成一个只有列名而没有数据的 PDF。

我应该如何为 CreateBizCards Report Query 编写一个查询,以便它从页面项目(例如 :P1_EMPLOYEE)上的 SELECT LIST 中找到所选员工,然后仅返回特定于该员工的数据?


注意:我无法共享 APEX URL,因为这是一个内部应用程序服务器。

【问题讨论】:

  • 如果它不是内部应用程序服务器,您会这样做吗?首先是个坏主意。
  • 是的,我当然会接受一些限制。

标签: sql plsql oracle-apex


【解决方案1】:

除其他外,选择列表是 LOV 需要 1 或 2 列的项目。第 1 列是显示值,第 2 列是返回值。

这就是“帮助”中关于使用 SQL 查询获取值列表的内容(直接从 apex 5 的帮助中复制)

输入 SQL 查询定义以填充此值列表。 通常,值查询列表的形式为:

select [displayValue],
       [returnValue]
  from ...
 where ...
 order by ...

选择的每一列都必须有一个唯一的名称或别名。甲骨文 建议在包含 SQL 的任何列上使用别名 表达。

示例

基于 SQL 查询的值列表

select ename as d, 
       empno as r
  from emp 
 order by 1

具有相同显示和返回值的值列表

select ename d,
       ename r 
  from emp 
 order by 1

注意:当为显示和返回选择同一列时 值使用列别名。


您的选择列表项 (P1_EMPLOYEE) 正在显示员工的 LASTNAMEFIRSTNAME 的串联。该项目正在返回(= 引用其会话状态时的值)员工的SECTION,我认为它不是员工的姓氏,也不是唯一的键。

这意味着您的报告查询有一个 where 子句,它实质上是说“返回 LASTNAME 等于 SECTION (P1_EMPLOYEE) 的记录。

我建议您将P1_ITEM 设置为:

Select e.lastname||', '||e.firstname as fullname,
[SOME UNIQUE ID] --replace with primary key
from employee e
order by e.lastname, e.firstname;

对于您的报告查询,您可能希望将 where 子句更改为如下内容:

where e.[SOME UNIQUE ID] = :P1_EMPLOYEE;

【讨论】:

  • 我在您的回答中添加了更多信息。它已经很好了,在另一个答案中传达完全相同的内容是没有意义的,因为我所要添加的只是一些关于基础知识的基本信息。
  • 感谢这非常有帮助。
猜你喜欢
  • 1970-01-01
  • 2014-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-22
  • 2017-12-31
相关资源
最近更新 更多