1

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

目前,当他们在 product_quantity 字段中输入文本并单击“保存”时,他们会收到以下错误:

错误处理验证。

ORA-01722: 无效号码

我已经调查了这个错误,但是我认为在 Apex 中,如果您选择了一个数字字段,它会检测用户输入的是文本还是数字字符?

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

更新

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

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

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

select 1 from MY_TABLE where column_name = :P6_TEXT_FIELD

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

4

1 回答 1

1

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


有一些解决方法。例如,您可以将 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-00001DUP_VAL_ON_INDEX错误。
然后,您可以使用 apex 提供的错误处理来捕获此错误,并生成用户友好的消息。
您可以在 apex 开发团队的 Patrick Wolf 的博客上找到如何使用和实现此功能的示例:
apex-4-1-error-handling-improvements-part-1/
apex-4-1-error-handling-改进-第 2 部分/

于 2013-03-04T10:16:21.253 回答