1

ユーザーが新製品の作成の頂点ページをクラッシュさせないようにしようとしています。作成ページには、テキストフィールド:product_nameと数値フィールド:product_quantityがあります。

現在、product_quantityフィールドにテキストを入力して[保存]をクリックすると、次のエラーが発生します。

検証の処理中にエラーが発生しました。

ORA-01722:番号が無効です

エラーを調査しましたが、Apexで考えたのですが、数値フィールドを選択すると、ユーザーがテキストと数字のどちらを入力したかが検出されますか?

ユーザーがテキストを入力した場合に検証メッセージを表示する方法はありますか?それ以外の場合は、ユーザーが新しいエントリを保存できるようになりますか?

アップデート

私はそれが起こっている理由を知っていますが、それを解決する方法を知りません。

ページを再作成しましたが、機能しました。次に、ページ処理に2つの検証を追加しました。それを試してみると、最初の投稿でエラーが発生します。それらを無効にすると、再び機能します。検証では、NOT EXISTSを使用して、入力した値を追加する前に、入力した値がテーブルにすでに存在するかどうかを確認します。

数値が入力されているかどうかを確認した後、検証のみが開始された場合。関連するアイテムを見て検証を停止し、「ボタンが押されたとき」をオフにしましたが、それでも喜びはありません。

select 1 from MY_TABLE where column_name = :P6_TEXT_FIELD

ページ処理で作成した検証の前に、テキストボックスの検証(テキストが入力されているかどうかを確認する)を実行する方法はありますか?

4

1 に答える 1

1

それが検証の問題です。検証はすべて実行され、短絡しません。ページをデバッグすると、実際にこれが発生していることがはっきりとわかります。
数値フィールドの場合、数値検証に合格しないことがわかります。しかし、これは検証を停止しません。したがって、送信された値を使用する2番目の検証が実行されますが、たとえばテキストを入力した場合は明らかに失敗します。


そのためのいくつかの回避策があります。たとえば、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 に答える