验证以检测数字字段中的文本

时间:2013-03-01 13:22:38

标签: oracle-apex

我正在尝试阻止用户崩溃创建新产品顶点页面。在创建页面上,我有一个文本字段:product_name和一个数字字段:product_quantity。

目前,当他们在product_quantity字段中输入文字并点击“保存”时,会出现以下错误:

处理验证时出错。

ORA-01722:无效号码

我调查了错误,但是我想在Apex中,如果你选择了一个数字字段,它会检测用户是否输入了文字或数字字符?

如果用户输入了文本,是否有显示验证消息的方法,它会大声喊叫,否则会让用户保存新条目?

更新

我知道它为什么会发生,但不知道如何解决它。

我重新创建了我的页面并且它有效。然后我在页面处理中添加了两个验证,然后当我尝试它时,我在我的初始帖子中收到错误。如果我禁用它们它再次工作。验证使用NOT EXISTS在添加之前查找输入的值是否已存在于表中。

如果在查看是否输入了数值后,只有验证开始。我停止了查看相关项目的验证,并关闭了“按下按钮时”,但仍然没有快乐。

select 1 from MY_TABLE where column_name = :P6_TEXT_FIELD

有没有办法在页面处理中创建的验证之前运行文本框验证(检查是否输入了文本)?

1 个答案:

答案 0 :(得分:0)

这是验证的事情:它们都被执行并且不会短路。实际上,在调试页面时,您可以清楚地看到这种情况 对于数字字段,您会看到它没有通过数字验证。但这并不能阻止验证。因此,将运行使用提交值的第二次验证,但是当您输入文本时,显然会失败。


有一些解决方法。 例如,您可以将NOT-EXISTS验证更改为PLSQL函数,返回错误消息并执行类似这样的操作(示例):

DECLARE
  v_test_nbr NUMBER;
  v_check_exists NUMBER;
BEGIN
  BEGIN
    v_test_nbr := to_number(:P6_TEXT_FIELD);
  EXCEPTION
  WHEN OTHERS THEN
    -- or catch 1722 (invalid number) and 6502 (char to number conversion error)
    v_test_nbr := NULL;
  END;

  IF v_test_nbr IS NOT NULL
  THEN
  -- if v_test_nbr is not null then the field should be numerically valid
  -- if it isn't then this code would be skipped and this validation
  -- will not throw an error.
  -- However, the previous validation will still fail when text is entered, 
  -- so this shouldn't matter.
    BEGIN
      SELECT 1
      INTO v_check_exists
      FROM my_table
      WHERE column_name = :P6_TEXT_FIELD;
    EXCEPTION 
    WHEN no_data_found THEN
      v_check_exists := 0;
    END;

    IF v_check_exists = 1 
    THEN
      RETURN 'A record with this key already exists';      
    END IF;
  END IF;

  RETURN NULL;
END;

但是 - 在这种情况下,如果您想要检查重复的条目,则至少在4.1版本上可能存在更好的选项。如果您的表具有已定义的正确约束,那么您将在执行不存在的字段上定义唯一键。这意味着如果您不在该字段上进行此验证,则会出现ora-00001 DUP_VAL_ON_INDEX错误。
然后,您可以使用apex提供的错误处理来捕获此错误,并生成用户友好的消息 您可以在顶级开发团队的Patrick Wolf的博客中找到如何使用和实现此示例的示例:
apex-4-1-error-handling-improvements-part-1/
apex-4-1-error-handling-improvements-part-2/