2012-11-12 31 views
1

我有一個包含大量項目的頁面,使用表格形式生成。這是預算分錄表。每個預算分錄可能是單個年度預算金額,也可能是一組12個月度預算金額。在頁面上顯示一個項目的一個值,但發佈一個不同的值

我已經用「金額類型」選擇列表實現了這個選擇列表,它是「年」或「月」,後面是13個項目 - 年度金額,然後是每年的12個金額。

  • 如果金額類型爲YEAR,或用戶將其更改爲YEAR,則啓用年金額項目並且每月金額被禁用。

  • 如果金額類型爲MONTH,或者用戶將其更改爲MONTH,則會關閉年金額項目(同時仍顯示已輸入的值)。

但是,「禁用」項目後面的值仍然很重要,它必須在頁面提交時發佈;這是因爲如果用戶從MONTH回到年份,他們原來的年度預算就會恢復。

sample screenshot

現在,以上所有的偉大工程。我想補充的是:

  • 如果金額類型是一個月,我想動態顯示(或者之上)的(禁用)中的全部項目每月每年金額項目;
  • 如果金額類型爲YEAR,我想動態地輸入年度金額,除以12,並在每個(禁用)月度項目中顯示結果。

但是,我不想更改每個禁用項目的基礎值;當頁面發佈時,應保留禁用項目的原始值,而不是計算的版本。

例如,假設用戶具有Amount Type = YEAR的預算分錄,每年輸入(並保存到數據庫)的金額爲120,000美元。數據庫中的所有月度金額將初始爲NULL。

現在,用戶更改金額類型= MONTH,導致年金額項目被禁用。它們輸入一定量,例如7月份爲1000美元,8月份爲2000美元。當他們保存更改時,數據庫將存儲(MONTH,100000,1000,2000,null,... null) - 換句話說,我保留了舊的年度金額(萬一用戶翻轉回年度預算)。但爲了顯示目的,我希望年度項目顯示3000美元。

我的問題是,如果我添加一些JavaScript來填充所有月度數字的總和年度金額項目,我會覆蓋$ 100,000,如果用戶翻轉回年,它不會「恢復」他們原來的年度預算金額。

允許用戶在YEAR和MONTH之間來回翻轉,併爲兩種類型輸入值;用戶輸入的所有值都必須保存到數據庫中。

所以我想在屏幕上顯示一個值,同時在頁面發佈時保留底層項目的原始值。

請注意,我的JavaScript技能是有限的 - 到目前爲止我所做的是基於大量的谷歌搜索。

TL;博士

我想一個輸入項,當只讀的,顯示在頁面上的一個值,但職位當頁面提交不同的值。

的Oracle APEX 4.1

注:該解決方案必須與IE7,這是國有企業在這裏工作。

+0

這是一個手動表格形式,還是一個嚮導生成的? – Tom

+0

嚮導生成 –

+0

另外:比方說,用戶輸入一年的金額和沒有月份的金額。保存。顯示年份數量,並顯示月份值(年/ 12)而不是空值。現在用戶將類型翻轉爲月份而不是年份,禁用年份和啓用月份。八月份的價值發生了變化。保存。問:現在只有8月才能得救?繼續:八月的變化也改變了總數,假設沒有保存完成。用戶每月翻轉一次。保存。問:哪個值?問:如果用戶確實改變年度金額,八月的價值會發生什麼變化? – Tom

回答

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保護同時;基本上「最後更新獲勝」。我已經通過基於表格上版本列的簡單丟失更新檢測來修復此問題。

1

使用隱藏字段來存儲實際值

<input type="hidden"> 

更新時,真正的變化領域

然後你就可以顯示任何你想要的視覺唯一字段(不隱藏字段給他們一個名字,他們將不會被包含在表格發佈數據中)

+0

不確定 - 我最初的想法稍微不同,即生成隱藏項目以保存計算值,並在禁用項目頂部動態顯示隱藏的計算項目。你想隱藏字段來存儲發佈到數據庫的實際值可能會起作用 - 我不確定它是否可以與Apex的表格形式一起工作,我發現它很容易糟糕。我會玩,看看。 –

+0

目前的主要問題是當我有隱藏的項目,我得到可怕的*「當前版本的數據庫中的數據已改變,因爲用戶啓動更新過程。」*提交頁面時。 –

+0

刪除您添加的任何額外字段,並將原始字段設置爲type = hidden並嘗試再次提交,您是否仍然收到該錯誤?錯誤客戶端(javascript)還是服務器端? – NoPyGod

相關問題