在页面上显示项目的一个值,但发布不同的值

时间:2012-11-12 02:24:23

标签: javascript html oracle oracle-apex

我有一个包含大量项目的页面,使用表格形式生成。这是预算条目表。每个预算条目可能是一个年度预算金额,也可能是一组十二个月预算金额。

我已经使用“金额类型”选择列表实现了这个,该列表是“年”或“月”,然后是13个项目 - 年度金额,然后是一年中每个月的12个金额。

  • 如果Amount Type为YEAR,或者用户将其更改为YEAR,则启用Annual Amount项目并禁用月度金额。

  • 如果Amount Type为MONTH,或者用户将其更改为MONTH,则年度金额项目将被禁用(同时仍显示已输入的值)。

然而,禁用物品的“后面”值仍然很重要;它必须在提交页面时发布;这样,如果用户从MONTH更改回YEAR,则会恢复其原始年度预算。

sample screenshot

现在,以上所有工作都很棒。我想补充的是:

  • 如果金额类型为月,我想动态显示中的月份项(或者可能位于)(已禁用)年度金额项目的总和;也
  • 如果金额类型是YEAR,我想动态获取输入的年度金额除以12,并在每个(已禁用)月度项目中显示结果。

但是,我不想更改每个禁用项的基础值;发布页面时,应保留已禁用项目的原始值,而不是计算版本。

例如,假设用户的预算条目金额类型=年份,输入的年度金额(并保存到数据库中)为120,000美元。数据库中的所有月度金额最初都为NULL。

现在,用户更改Amount Type = MONTH,这会导致Year Amount项被禁用。他们输入一些金额,例如7月1000美元,8月2000美元。当他们保存更改时,数据库将存储(MONTH,100000,1000,2000,null,... null) - 换句话说,我保留了旧的年度金额(如果用户翻转回年度预算)。但出于显示目的,我希望年度金额项目显示3000美元。

我的问题是,如果我添加一些javascript以使用所有月度数字的总和填充年度金额项目,我将覆盖100,000美元,如果用户翻回年份,它将不会“恢复”他们的原始年度预算金额。

允许用户在YEAR和MONTH之间来回切换,并输入两种类型的值;用户输入的所有值必须保存到数据库中。

所以我想在屏幕上显示一个值,同时在发布页面的基础项目中保留原始值。

请注意我使用javascript的技能有限 - 到目前为止我所做的是基于大量的Google搜索。

TL;博士

我想要一个输入项,当readOnly在页面上显示一个值,但在提交页面时发布不同的值。

Oracle Apex 4.1

注意:解决方案必须与IE7一起使用,这是SOE。

2 个答案:

答案 0 :(得分:1)

使用隐藏字段存储实际值

<input type="hidden">

在真实字段更改时更新隐藏字段

然后,您可以在仅视觉字段中显示您想要的任何内容(不要为它们命名,并且它们不会包含在表单发布数据中)

答案 1 :(得分: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保护。基本上“最后更新获胜”。我已经通过基于表格上的版本列的简单丢失更新检测来解决这个问题。