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

Javascript 在页面上为项目显示一个值,但发布不同的值,javascript,html,oracle,oracle-apex,Javascript,Html,Oracle,Oracle Apex,我有一个包含大量项目的页面,使用表格形式生成。这是一个预算分录表。每个预算条目可以是单个年度预算金额,也可以是一组12个月的预算金额 我用一个“金额类型”选择列表实现了这一点,该列表是“年”或“月”,后面是13个项目——一个年度金额,后面是一年中每个月的12个金额 如果金额类型为“年”,或用户将其更改为“年”,则启用“年金额”项目,禁用“月金额” 如果金额类型为月,或用户将其更改为月,则年度金额项目将被禁用(同时仍显示已输入的值) 但是,禁用项后面的值仍然很重要;必须在提交页面时发布;这就是

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

我用一个“金额类型”选择列表实现了这一点,该列表是“年”或“月”,后面是13个项目——一个年度金额,后面是一年中每个月的12个金额

  • 如果金额类型为“年”,或用户将其更改为“年”,则启用“年金额”项目,禁用“月金额”

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

但是,禁用项后面的值仍然很重要;必须在提交页面时发布;这就是说,如果用户从(比如)月份变回了年份,他们原来的年度预算就会恢复

现在,所有这些都很有效。我想补充的是:

  • 如果Amount Type是MONTH,我希望动态显示(禁用的)年度Amount项目内(或顶部)的月份项目总数;而且
  • 如果Amount Type为YEAR,我希望动态地获取输入的年度金额,除以12,并在每个(禁用的)月度项目中显示结果
但是,我不想更改每个禁用项的基础值;发布页面时,应保留禁用项目的原始值,而不是计算版本

例如,假设一个用户有一个Amount Type=YEAR的预算条目,输入的年度金额(并保存到数据库中)为$120000。所有每月金额最初在数据库中为空

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

我的问题是,如果我添加一些javascript,用所有每月数字的总和填充年度金额项目,我将覆盖100000美元,如果用户返回到年度,它将不会“恢复”其原始年度预算金额

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

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

请注意,我的javascript技能是有限的——到目前为止,我所做的是基于大量的谷歌搜索

tl;博士

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

Oracle Apex 4.1


注意:解决方案必须与IE7配合使用,IE7在这里是SOE。

使用隐藏字段存储实际值

<input type="hidden">

当实际字段更改时更新隐藏字段


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

使用隐藏字段存储真实值

<input type="hidden">

当实际字段更改时更新隐藏字段


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

非常感谢NoPyGod,他的评论让我找到了一个可行的解决方案

我在表格中添加了一个额外的字段TOTAL_AMOUNT_DSP,并隐藏了底层数据库字段TOTAL_AMOUNT。我使用javascript设置总金额,并根据金额类型将其设置为可编辑或只读

为了避免“自用户启动更新过程以来,数据库中数据的当前版本已更改”。错误,我已将默认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保护;基本上是“最后更新获胜”。我通过基于表中的版本列进行简单的丢失更新检测来解决这个问题。

非常感谢NoPyGod,他的评论让我找到了一个有效的解决方案

我在表格中添加了一个额外的字段TOTAL_AMOUNT_DSP,并隐藏了底层数据库字段TOTAL_AMOUNT。我使用javascript设置总金额,并根据金额类型将其设置为可编辑或只读

为了避免“自用户启动更新过程以来,数据库中数据的当前版本已更改”。错误,我已将默认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保护;基本上是“最后更新获胜”。我已经通过基于表上的版本列的简单丢失更新检测解决了这一问题。

不确定-我最初的想法略有不同,即生成隐藏项以保存计算值,并在禁用项的顶部动态显示隐藏的计算项。你的想法是使用隐藏字段来存储实际值,以便发布到数据库中。我不确定它是否适用于Apex的表格格式,我发现它很容易弄糟。我会玩一玩看看。现在的主要问题是,当我有了隐藏项时,我会收到可怕的“自用户启动更新过程以来,数据库中数据的当前版本已更改。”提交页面时。删除您添加的所有额外字段,并设置原始字段