在 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,运行一个form

Oracle Forms 10g 自动查询

Oracle Forms 10g Tutorial Ebook Download - Oracle Forms Blog

Oracle Forms 10g,多次插入和更新不起作用

oracle forms 10g web应用程序