【问题标题】:How to disable filed based on value in oracle forms 10g?如何根据 oracle 表单 10g 中的值禁用字段?
【发布时间】:2020-07-23 16:40:45
【问题描述】:

如果值大于 10,我想禁用 deptno 字段。我尝试了下面的代码,但它不起作用

WHEN-NEW-FORM-INSTANCE
    GO_BLOCK('EMP');
EXECUTE_QUERY;

POST-TEXT-ITEM

DECLARE
 v_state VARCHAR2(5) := GET_ITEM_PROPERTY('emp.deptno', enabled);  
BEGIN  
IF ( nvl(:emp.deptno,0) > 10 AND v_state = 'TRUE' ) THEN
   SET_ITEM_PROPERTY('emp.deptno', enabled, property_false);
ELSIF ( nvl(:emp.deptno,0) <= 10 AND v_state = 'FALSE') THEN
   SET_ITEM_PROPERTY('emp.deptno', enabled, property_true);
END IF;
end;

Navigater Image

Form Image

【问题讨论】:

  • 什么是a.deptno?或者,我应该问,其中的a 是什么?
  • 你把这段代码放在什么触发器里了?
  • @AndyDan 在 POST-TEXT-ITEM 上
  • @Littlefoot 我已经更新了我的问题。请检查

标签: oracle oracle10g oracleforms


【解决方案1】:

我想表单有两个数据库块(即 aemp ),具有共同的列名( deptno )。如果是这样,请考虑使用代码在 :a.deptno 字段上创建 POST-TEXT-ITEM 触发器:

DECLARE
 v_state VARCHAR2(5) := GET_ITEM_PROPERTY('emp.deptno', enabled);  
BEGIN  
IF ( nvl(:cursor_item,0) > 10 AND v_state = 'TRUE' ) THEN
   SET_ITEM_PROPERTY('emp.deptno', enabled, property_false);
ELSIF ( nvl(:cursor_item,0) <= 10 AND v_state = 'FALSE') THEN
   SET_ITEM_PROPERTY('emp.deptno', enabled, property_true);
   SET_ITEM_PROPERTY('emp.deptno', navigable, property_true);
END IF;

为了在光标离开该项目后禁用相关项目。但是,不要忘记为其他情况启用。

【讨论】:

  • FRM-41042:Set_Item_Property 没有此类属性。
  • 当然SET_ITEM_PROPERTY 存在一个属性enabled。 @Farooq 你确定你说的正确吗?顺便说一句,也添加SET_ITEM_PROPERTY('emp.deptno', navigable, property_true);
【解决方案2】:

在我看来,POST-TEXT-ITEM 几乎可以肯定是一个错误的选择。当您进入该项目并通过按TABENTER 键(假设“验证单元”属性设置为“项目”或“默认”)离开它时,它将触发。但是,如果您使用鼠标离开它 - 它不会触发。

查看您发布的代码,您首先执行查询,然后想要禁用该项目。在这种情况下,POST-QUERY 可能是更好的选择。

但是,我想你会在WHEN-VALIDATE-ITEM(或者WHEN-VALIDATE-RECORD)触发器中再次需要它,因为POST-QUERY 将在表单开始时工作,但在你开始更改项目时不会做任何事情'价值观。正如@AndyDan 评论的那样(谢谢你,Andy),WHEN-NEW-RECORD-INSTANCE 触发器涵盖了当您返回到先前查询的记录而不实际查询它(再次)时的情况。由于这意味着您应该重用相同的代码,因此我建议您将其放入一个过程中,然后酌情从其他触发器中调用该过程。

此外,如果它是表格形式(显示许多条记录),您应该使用内置的SET_ITEM_INSTANCE_PROPERTY。不幸的是,它不支持ENABLED 属性,因此您必须使用INSERT_ALLOWED 和/或UPDATE_ALLOWED

最后,阅读“属性更改的传播”。当您更改ENABLED 属性时,它还会影响其他一些项目属性(可导航、可更新、必需),这意味着一旦将ENABLED 设置为FALSE,将其设置回TRUE 是不够的' 还必须将前面提到的属性设置为 TRUE

就代码本身而言,我认为应该这样做:

IF nvl(:emp.deptno, 0) > 10 THEN
   SET_ITEM_PROPERTY('emp.deptno', enabled   , property_false);
ELSE
   -- reset other properties as well! This is just an example, you'd use
   -- properties that this item actually has

   SET_ITEM_PROPERTY('emp.deptno', enabled   , property_true);
   SET_ITEM_PROPERTY('emp.deptno', navigable , property_true);
   SET_ITEM_PROPERTY('emp.deptno', updateable, property_true);
END IF;

【讨论】:

  • 我会考虑将其放入 WHEN-NEW-RECORD-INSTANCE 而不是 POST-QUERY。这样,如果用户导航回先前查询的记录而不实际再次查询它,它将正确触发。
  • 感谢您的评论,@Andy。这(部分)在我的第 3 段中进行了介绍,它说应该在不同的触发器中重用相同的代码。为了完整起见,我将您的评论添加到答案中。
猜你喜欢
  • 2021-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-20
  • 2017-10-16
  • 2019-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多