我正在尝试阻止用户崩溃创建新产品顶点页面。在创建页面上,我有一个文本字段:product_name和一个数字字段:product_quantity。
目前,当他们在product_quantity字段中输入文字并点击“保存”时,会出现以下错误:
处理验证时出错。
ORA-01722:无效号码
我调查了错误,但是我想在Apex中,如果你选择了一个数字字段,它会检测用户是否输入了文字或数字字符?
如果用户输入了文本,是否有显示验证消息的方法,它会大声喊叫,否则会让用户保存新条目?
的更新 的
我知道它为什么会发生,但不知道如何解决它。
我重新创建了我的页面并且它有效。然后我在页面处理中添加了两个验证,然后当我尝试它时,我在我的初始帖子中收到错误。如果我禁用它们它再次工作。验证使用NOT EXISTS在添加之前查找输入的值是否已存在于表中。
如果在查看是否输入了数值后,只有验证开始。我停止了查看相关项目的验证,并关闭了“按下按钮时”,但仍然没有快乐。
select 1 from MY_TABLE where column_name = :P6_TEXT_FIELD
有没有办法在页面处理中创建的验证之前运行文本框验证(检查是否输入了文本)?
答案 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/