【问题标题】:Trying to create an APEX Link Column that queries a report尝试创建查询报告的 APEX 链接列
【发布时间】:2014-08-19 17:23:27
【问题描述】:

基本上,假设我有一个报告 A,我想向它添加一个链接列,我将其目标设置为应用程序中的一个页面......它所引用的页面有另一个报告(我们称之为 B)

我是否有可能以某种方式使表 A 的链接列打开带有报告 B 的页面,其中行的某一列具有相同的列值?


这里的例子:

一个

Name Num1 Num2
--------------
A    5    3
B    3    3
C    4    2

B

Name Quantity Serial
--------------------
D    2        3
E    1        8
F    4        6

因此,如果我单击 A 行的链接列,我希望它打开报表 B,并且只显示其 Num2 = Serial 的行,因此只有 D 行会显示,因为它是唯一等于 3 的行

【问题讨论】:

  • 查看我要问的另一种方法是我试图让链接列返回一个使用其列值之一查询的表

标签: sql oracle oracle-apex datagridviewlinkcolumn


【解决方案1】:

使用报表链接过滤其他 APEX 报表输出

尽管如此,我还是玩得很开心。 “A”和“B”的东西很枯燥,所以我决定创建一个更吸引人的数据集,也许对我们其他人来说更容易理解...... :) 这就是数据生态系统被破坏的原因下来,以及我满足 OP 要求的方式。

测试架构:

欢迎来到“Recipe Stack”食品厂的制造工厂。下面是架构设计和 ERD(实体关系图),以及用于此演示的示例数据:

数据关系如下:

  1. Stack Food-Works 的工作人员为他们制造的膳食和预制食品的类型保留了所有成分的清单。每种成分都有一个唯一的 ID (INGREDIENT_ID),工作人员会跟踪他们储藏室中每种物品的数量。
  2. 每种成分都可以在多个配方中使用,但对于给定的配方,它们将只使用一次
  3. ENTREE_RECIPE 表有一个COMPOSITE KEY,这意味着它是该组合键的两个部分(ENTREE_NAMEINGREDIENT_SEQ)的组合,应该是唯一的。
  4. 两个表的 INGREDIENT_ID 值之间存在 FOREIGN KEY 关系。

报表显示要求(APEX 和 SQL 设计元素)

从第一个报告中选择一个项目用作第二个报告的输入和限制/过滤条件。

用户案例 #1:

  1. 用户从食品储藏室的可用配料列表中选择一个配料 ID。
  2. 来自 (1) 的输入过滤了 RECIPE REPORT 的输出。这是配方中包含所选成分的所有配方的列表。

用户案例 #2:

  1. 用户从食谱报告中选择ENTREE_NAMEENTREE_NAME 用于提供第三份报告:配方公式,它是从上一份报告中选择的主菜的完整配方。

测试工具

(对于更复杂的页面,您通常需要这些,因此为更简单的页面使用或开发它们是一个很好的开始......)

我自己制作了,但您也可以在您正在运行的应用程序(显示时)的 APEX 页面底部的开发人员工具栏上调用 SESSION 链接。

这是我的想法;它是一个标题区域,还有一个指向RESET 输入值的按钮,以便我可以清除缓存并重新测试或尝试其他示例。稍后我将展示如何使用此链接查看发生了什么。您可以在本指南底部的测试讨论中看到它。

APEX 报告/页面设计和 SQL 参数化

我的 columnn 链接方案看起来类似于上一篇文章,例如来自 FTaveras 的文章。这就是我的链接的工作方式。不同的是我不去另一个页面,我只是回到我原来的那个页面。重定向和分支显然不在乎它们是否只是返回到同一位置。

回程中的不同之处在于,最初为空或未填充的页面参数现在有一个值。现在,该值使页面上空的报告变得生动起来。

第 1 步:食品储藏室报告

  1. 输出:查询FOOD_SUPPLIES表中的所有项目。
  2. 输入:通过 INGREDIENT_ID 提供链接以过滤 RECIPE_REPORT 输出。

怎么做:(提示) 要做到这一点,请将报表布局设计页面中的报表列/字段值定义为“链接”列,并将其值指定为 页面项目。页面项将在下一个报表的 SQL 查询中被引用...

第 2 步:配方报告

  1. 输出:ENTREE_RECIPE 表中查询所有在其公式中具有步骤 1 中的INGREDIENT_ID 的记录。
  2. 输入:通过 ENTREE_NAME 提供链接以过滤 RECIPE_FORMULA 输出。

怎么做:(提示)步骤 1中定义的页面项目包含在此报告的 SQL 查询中:

    SELECT * FROM entree_recipe 
     WHERE ingredient_id = :P3_INGREDIENT_ID 

第 3 步:公式报告

  1. 输出:查询ENTREE_RECIPE 表中的所有记录,其中ENTREE_NAME 从步骤2 中选择。

调试和测试运行

大多数人都能毫无问题地做到这一点。如果没有,这里有几个示例说明如何调试和测试您的工作。 Apex 中可能已经存在一些内置工具和包,因此欢迎在 cmets 中提供有关替代方法的任何建议...!

使用 APEX 开发者会话输出

选择试运行的输入后,单击页面底部开发人员工具栏上的SESSION 链接。这是一个示例输出:

请注意,会显示为该会话设置的页面项目。我用于此测试的输入是:

  1. INGREDIENT_ID: 6432
  2. ENTREE_NAME:桃皮匠(新鲜)

额外积分:这是一种替代方法。将这样的东西设计为您设计的任何应用程序的附加组件可能会很有用。当您将其推送到生产环境时,您无需将其从应用程序中删除,因为页面区域有“条件显示/抑制”功能。 (看看)

只需在 Apex 应用程序上将全局参数设置为“模式”。将值设置为“DEBUG”或“TEST”或其他任何值,并键入此页面区域的所有实例以仅在全局参数设置为它时显示。

总结和讨论

希望您对“Stack Food Works”的参观感到愉快(请不要品尝或品尝)。

这更像是 Apex 应用程序设计的整体方法。它有助于制定每一步的方法,以及在开发过程的开始和结束时检查您的工作的方法。使用像此演示这样的较小示例来应用这些方法,可以将 Apex 开发理解为一个软件创建过程。

【讨论】:

  • 感谢您的示例和花费的时间,我开始工作了...对于我的工作,我使用链接列转到另一个页面,但我使用的是模式页面,因此它显示在同一页面上。
  • 没问题。这就是这个平台的伟大之处……有几十种方法可以做类似的事情。如果您是新手,您会发现哪种方法是最好的部署方式。此示例还旨在帮助将通过 Apex 遇到此常见设计任务的许多其他人。感谢您发布您的问题......我相信其他人会喜欢这个讨论。前进!
【解决方案2】:

是的,这是可能的。

  1. 在 B 页上,添加并隐藏项目名称,例如 P(#)_SERIAL,其中 (#) 是您当前的页码。
  2. 修改查询并添加一行,如AND SERIAL=:P(#)_SERIAL
  3. 在页面 A 上,转到报告区域上的“报告属性”选项卡,单击编辑。
  4. 在列链接部分配置您到页面 B 的链接,并将页面 B 上的隐藏项设置为页面 A 报告列上的值。

名称:项目 1 [P(#)_SERIAL] 值:#Num2#

Demo

【讨论】:

  • 谢谢...对于任何未来的用户,如果它在您的第 2 步中说明查询的“位置”可能会更容易
猜你喜欢
  • 2012-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-19
  • 1970-01-01
相关资源
最近更新 更多