禁止在多行块 Oracle Forms 中输入值

Disallow entering value in multiple row block Oracle Forms

我的 table 看起来像这样:

+-------------------+
|Name               |
+-------------------+
|Name1              |
|Name2              |
|Name3              |
|Name4              |
|Name1Jr            |
|Name2Jr            |
|Name3Jr            |
|Name4Jr            |
+-------------------+

我的多行块看起来像:

我想要的是如果块中不存在名称,则不允许输入以 Jr 结尾的名称。像这样:

如果我输入值 Name1 和 Name2:

然后它将允许我输入 Name1Jr 和 Name2Jr,但不允许输入 LOV 中但尚未在块中的带有 Jr 的名称:

注意:我正在为此列使用值列表。谢谢!

我可以想到两个选项。

第一个依赖于table内容。当您使用值列表 (LOV) 时,它可能看起来像这样(假设 table 名称是 TEST,由 CTE 表示):您 UNION 当前名称 fabricated "nameJr" 值(DECODE 是为了避免 "Name3JrJr" 的情况):

SQL> with test (col) as
  2    (select 'Name1'   from dual union
  3     select 'Name3'   from dual union
  4     select 'Name3Jr' from dual
  5    )
  6  select col from test
  7  union
  8  select col || decode(substr(col, -2), 'Jr', null, 'Jr') from test
  9  order by col;

COL
---------
Name1
Name1Jr
Name3
Name3Jr

SQL>

表单项的 "Validate from List" 属性 应设置为 "Yes",以便表单拒绝 LOV 中不存在的值。

但是,如果您输入的名称在 table 中不存在怎么办?例如,"Name2"?在WHEN-VALIDATE-ITEM触发器中使用SET_ITEM_PROPERTY并将VALIDATE_FROM_LIST属性修改为PROPERTY_FALSE。在 WHEN-CREATE-RECORD 触发器中将其设置回 TRUE

此外,您必须接受新添加的 "Name2" 值并将其显示在 LOV 中。如何? POST 您所做的更改(不要 COMMIT,只需 POST)。在哪里?由于这是一个受限过程,请尝试 KEY-NEXT-ITEMWHEN-NEW-RECORD-INSTANCE 触发器。

第二个选项 将动态创建 LOV,其值将是当前显示在块中的值。您将使用内置的 CREATE_GROUP 以及 ADD_GROUP_ROW,后者会将块值添加到记录组中(它是 LOV 的来源)。 WHEN-NEW-RECORD-INSTANCE 可能是您的选择,因为它允许受限制的程序,您应该 "scroll" 循环使用 NEXT_RECORD (至于 限制).在表单帮助中阅读 CREATE_GROUP;它包含一个如何使用它的例子。此外,如有必要,请点击指向其他示例的链接。