2013-03-01 72 views
1

我試圖阻止用戶崩潰創建新產品apex頁面。在創建頁面上,我有一個文本字段:product_name和一個數字字段:product_quantity。驗證以檢測數字字段中的文本

目前,當他們在product_quantity字段中輸入文字,並點擊「保存」,他們得到以下錯誤:

錯誤處理驗證。

ORA-01722:無效數字

我已經調查了,但是我認爲在心尖中的錯誤,如果你選擇了數字領域,它會檢測用戶是否輸入的文字或數字字符?

如果用戶輸入了文本,它會發出一個驗證消息,它會發出喊聲,否則會使用戶保存新條目?

UPDATE

我知道爲什麼它的發生,但不知道如何解決它。

我重新創建我的網頁,它的工作。然後,我在頁面處理中添加了兩個驗證項,然後當我嘗試它時,我在我的初始文章中遇到了錯誤。如果我禁用它,它再次工作。驗證使用NOT EXISTS來查找輸入的值在添加之前是否已經存在於表中。

如果僅在驗證是否已輸入數字值後開始驗證。我停止驗證查看關聯的項目,並關閉「按鈕按下時」,但仍然沒有快樂。

select 1 from MY_TABLE where column_name = :P6_TEXT_FIELD 

是否有一種方式來運行文本框驗證(檢查其是否文本輸入的)我已經在頁面處理生成的驗證之前?

+0

我不知道如果你不小心刪除了驗證。你可以嘗試重新創建頁面,看看問題是否存在? – 2013-03-01 22:35:28

+0

該字段是定義爲文本字段還是數字字段?數字是用'.'還是'''輸入的? – Tom 2013-03-02 10:49:58

+0

@Tom這是一個文本字段,但我對自己說數據庫列是數字,輸入的值是數字,所以技術上這個字段應該是一個數字字段。數字驗證在另一頁的字段上工作得很好。這就是爲什麼我會因爲這個而迷失方向。我試試馬修建議明天。 – Blob 2013-03-03 20:11:35

回答

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提供的錯誤處理來捕獲此錯誤,並生成一個用戶友好的消息。
你可以找到如何使用的例子,實現這個的頂點開發團隊的帕特里克·沃爾夫的博客:
apex-4-1-error-handling-improvements-part-1/
apex-4-1-error-handling-improvements-part-2/