1

表形式を使用して生成された、多数のアイテムを含むページがあります。予算内訳表です。各予算エントリは、単一の年間予算額の場合もあれば、12 の月間予算額のセットの場合もあります。

私はこれを「年」または「月」のいずれかである「金額タイプ」選択リストで実装し、その後に13項目が続きます.年間金額とその年の各月の12金額が続きます。

  • Amount Type が YEAR の場合、またはユーザーが YEAR に変更した場合、年間金額項目が有効になり、月額項目が無効になります。

  • Amount Type が MONTH の場合、またはユーザーが MONTH に変更した場合、年間金額項目は無効になります (入力された値は引き続き表示されます)。

ただし、無効なアイテムの「背後」にある値は依然として重要です。ページの送信時に投稿する必要があります。これは、ユーザーが MONTH から YEAR に戻った場合に、元の年間予算が復元されるようにするためです。

サンプルのスクリーンショット

さて、上記のすべてがうまく機能します。追加したいのは次のとおりです。

  • Amount Type が MONTH の場合、(無効化された) 年額アイテム(またはおそらく上)に月アイテムの合計を動的に表示したいと思います。また、
  • Amount Type が YEAR の場合、入力された年間金額を動的に取得し、12 で割って、(無効な) 月次項目のそれぞれに結果を表示したいと思います。

ただし、無効になっている各アイテムの基になる値を変更したくありません。ページが投稿されると、計算されたバージョンではなく、無効化されたアイテムの元の値が保持されます。

たとえば、ユーザーが金額タイプ = YEAR の予算エントリを持ち、年間金額が $120,000 であるとします (データベースに保存されます)。すべての月額は、最初はデータベース上で NULL になります。

ここで、ユーザーは金額タイプ = MONTH を変更します。これにより、年間金額項目が無効になります。たとえば、7 月に 1000 ドル、8 月に 2000 ドルなど、いくつかの金額を入力します。彼らが変更を保存すると、データベースには (MONTH, 100000, 1000, 2000, null, ... null) が保存されます。バジェット)。しかし、表示目的のために、年間金額項目に $3000 を表示したいと思います。

私の問題は、JavaScript を追加して年間金額項目にすべての月額の合計を入力すると、$100,000 が上書きされ、ユーザーが YEAR に戻った場合、元の年間予算が「復元」されないことです。額。

ユーザーは YEAR と MONTH の間を行ったり来たりすることができ、両方のタイプの値を入力できます。ユーザーが入力するすべての値をデータベースに保存する必要があります。

そのため、ページが投稿されたときに元の値を基になるアイテムに保持しながら、画面に 1 つの値を表示したいと思います。

JavaScript に関する私のスキルには限界があることに注意してください。これまでに行ったことは、多くのグーグル検索に基づいています。

tl;dr

readOnly の場合はページに 1 つの値を表示するが、ページが送信されると別の値を投稿する入力項目が必要です。

オラクル頂点4.1

注: このソリューションは、ここでは SOE である IE7 で動作する必要があります。

4

2 に答える 2

1

非表示フィールドを使用して実際の値を保存する

<input type="hidden">

実際のフィールドが変更されたときに非表示のフィールドを更新します

次に、視覚のみのフィールドに必要なものを表示できます(名前を付けないでください。フォームの投稿データには含まれません)。

于 2012-11-12T02:42:06.543 に答える
0

NoPyGod に感謝します。そのコメントにより、実用的な解決策にたどり着きました。

表形式のフォーム TOTAL_AMOUNT_DSP に追加フィールドを追加し、基礎となるデータベース フィールド TOTAL_AMOUNT を非表示にしました。JavaScript を使用して TOTAL_AMOUNT_DSP を設定し、金額の種類に応じて編集可能または読み取り専用にします。

「ユーザーが更新プロセスを開始したため、データベース内のデータの現在のバージョンが変更されました」を回避するには。エラーが発生しました。デフォルトの MRU プロセスをカスタムの更新手順に置き換えました。

FOR i IN 1..APEX_APPLICATION.g_f01.COUNT LOOP
  UPDATE budget_entries
  SET amount_type  = APEX_APPLICATION.g_f02(i)
     ,total_amount = APEX_APPLICATION.g_f03(i)
     ,month1       = APEX_APPLICATION.g_f05(i)
     ,month2       = APEX_APPLICATION.g_f06(i)
     ,month3       = APEX_APPLICATION.g_f07(i)
     ,month4       = APEX_APPLICATION.g_f08(i)
     ,month5       = APEX_APPLICATION.g_f09(i)
     ,month6       = APEX_APPLICATION.g_f10(i)
     ,month7       = APEX_APPLICATION.g_f11(i)
     ,month8       = APEX_APPLICATION.g_f12(i)
     ,month9       = APEX_APPLICATION.g_f13(i)
     ,month10      = APEX_APPLICATION.g_f14(i)
     ,month11      = APEX_APPLICATION.g_f15(i)
     ,month12      = APEX_APPLICATION.g_f16(i)
  WHERE budget_entry_id = APEX_APPLICATION.g_f01(i); 
END LOOP;

このアプローチの唯一の欠点は、複数のユーザーがほぼ同時に行を更新すると、組み込みの Apex 保護が得られないことです。基本的に「最後の更新が勝つ」。テーブルのバージョン列に基づく単純な失われた更新の検出でこれを修正しました。

于 2012-11-12T08:10:18.370 に答える