1

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

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

  • 如果金额类型为 YEAR,或者用户将其更改为 YEAR,则启用年金额项并禁用月金额。

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

但是,禁用项目“背后”的值仍然很重要;必须在提交页面时发布;这样一来,如果用户从 MONTH 更改为 YEAR,就会恢复他们原来的年度预算。

示例截图

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

  • 如果金额类型是 MONTH,我想动态显示(或可能在顶部)(禁用)年度金额项目中的月份项目总数;还,
  • 如果金额类型为 YEAR,我想动态获取输入的年度金额,除以 12,然后在每个(禁用的)月度项目中显示结果。

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

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

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

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

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

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

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

tl;博士

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

甲骨文顶点 4.1

注意:该解决方案必须适用于 IE7,也就是这里的 SOE。

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 回答