在 Oracle Forms 10g 中使用 LOV 值过滤数据块
Posted
技术标签:
【中文标题】在 Oracle Forms 10g 中使用 LOV 值过滤数据块【英文标题】:Filter Data block with a LOV value in Oracle Forms 10g 【发布时间】:2018-03-31 21:12:28 【问题描述】:我需要从名为“PRODUCTS”的数据块中实现一个简单的产品表单。
产品通过“COMPANIES_PARTNERS_ID”字段与“合作伙伴”相关联。
此字段将由 LOV 表示,以选择我们要为其可视化您的产品的合作伙伴。
如果当前没有选择合作伙伴,则应显示您的所有产品。 And when a partner is selected, only their products should be displayed.
表单将如下所示:
搜索字段右侧的按钮应显示 LOV 并启动查询。当我按下按钮时,我尝试了以下代码作为 “智能触发器”。但它根本不能很好地工作。 LOV 列表出现两次,当没有选择合作伙伴时,不会出现任何产品。
有人可以帮我实现这个功能吗?谢谢
【问题讨论】:
【参考方案1】: 您不需要使用ENTER_QUERY
命令。
最好使用相对于COMPANIES_PARTNERS_ID
设置的DEFAULT_WHERE
。如果未通过按CANCEL
或通过X
符号取消选择LOV 的任何行,则将列出所有产品(在这种情况下,您将看到第一个ID,很可能值为1
,因为COMPANIES_PARTNERS_ID
不在CONTROL
块上,而是在同一个块上,即PRODUCTS
,与其他项目。当您通过向下箭头向下时,您将看到其他ID
值,当您的光标是在COMPANIES_PARTNERS_ID
字段中,似乎该字段的“显示的项目数”设置为1
,因为PRODUCTS
块已设置为10
显示的项目)。
因此,您可以在WHEN-BUTTON-PRESSED
trigger 中使用以下代码:
DECLARE
V_WHERE VARCHAR2(500);
BEGIN
GO_ITEM('COMPANIES_PARTNERS_ID');
IF SHOW_LOV('COMPANIES_LOV') THEN
V_WHERE:='COMPANIES_PARTNERS_ID='||:COMPANIES_PARTNERS_ID;
ELSE
V_WHERE:='1=1';
END IF;
SET_BLOCK_PROPERTY('PRODUCTS',DEFAULT_WHERE,V_WHERE);
CLEAR_BLOCK(NO_VALIDATE);
EXECUTE_QUERY;
END;
【讨论】:
非常感谢您的回答。解决方案很棒。 @AbdullahBahattab 不客气,兄弟。你可以尝试投票。【参考方案2】:一旦您进入查询模式(这是ENTER_QUERY
所做的),进一步的处理将停止,直到您执行查询。
我认为您正确创建了 LoV - 最常用的方法是先创建记录组查询,然后基于它创建 LoV。
因此,我会在 WHEN-NEW-FORM-INSTANCE
中触发 ENTER_QUERY
并让您当前的按钮显示 LoV 并让用户在“公司合作伙伴 ID”项中选择一个值。执行查询(通过按下相应的工具栏按钮、快捷键 (F8?) 或新的“执行查询”按钮)实际上会执行查询。如果正确创建了主从关系(使用数据块向导是最简单的选项),那么您将在“产品”块中获得行。
【讨论】:
【参考方案3】:在 PRODUCTS 块 WHERE 子句的属性中输入一个值。
WHERE CLAUSE 属性:
COMPANIES_PARTNERS_ID LIKE NVL(:lov_block.COMPANIES_PARTNERS_ID, '%')
【讨论】:
以上是关于在 Oracle Forms 10g 中使用 LOV 值过滤数据块的主要内容,如果未能解决你的问题,请参考以下文章
在 Oracle Forms 10g 中动态设置“Copy value from item”的值
Oracle Forms 10g Tutorial Ebook Download - Oracle Forms Blog