2014-02-17 36 views
3

我創建了一個搜索頁面,該頁面使用自定義控制器和Visualforce頁面返回集記錄。用戶可以更新單個記錄上的特定字段。在Visualforce表中標記用於更新的特定記錄

我希望能夠一次保存所有更改的記錄,但操作命令會更新整個返回集 - 而不僅僅是更改的記錄。該應用程序要求只更新修改的記錄。

缺少對每條記錄上可能發生的變化進行過濾或在每條記錄上放置保存按鈕,沒有人有關於如何識別修改的特定記錄的創意,以便應用程序可以保存這些記錄那編輯?

回答

1

非常有趣的問題:)

有大約之間的「老」和「新」無論是通過現場描述或JSON序列化跟蹤變化對SFSE一個很酷的答案:Generically walk sObject fields。請注意,我已經鏈接到我認爲最整齊的答案,請考慮閱讀整個頁面!

這個問題很有趣,因爲它會把你的邏輯放在更正確的位置 - 觸發器中。因爲您應該問問自己,如果進行更新並不能真正改變搜索頁面上的任何內容 - 是否也可以在其他頁面上進行更新?


如果這不適合你,那麼這裏有另一個有趣的把戲。

設置內部使用對象的散列來確定唯一性(不僅僅是Id,所有字段)。這是完全正常的都設置這樣的:

Set<User> users = new Set<User>(); 

User u1 = new User(Id = UserInfo.getUserId()); 
User u2 = new User(Id = UserInfo.getUserId(), LastName = 'Doe'); 

users.add(u1); 
users.add(u2); 

System.assert(users.contains(u2)); 

u2.FirstName = 'John'; 

System.assert(users.contains(u2), users); // boom, headshot. It was there a minute ago, I swear! 

通常這是一個缺點,而我們被告知使用Map<Id, sObject>代替鍵/散列/不管不會改變。但在你的情況 - 你可以使用它作爲預期的功能。

試試這個(未經測試):

  1. 獲取搜索結果,你現在做的。
  2. 用戶更改none/some/all並點擊「提交」。
  3. 將該列表投入幫助程序Set<sObject>(使用addAll方法)。
  4. 將搜索結果再次提取到另一個幫助程序列表。確保你查詢了完全相同的字段。
  5. 致電mySet.removeAll(originals); - 應清除所有相同的項目。
  6. 將倖存者放入最終的幫助列表中並調用更新。

這有一些缺點,例如,如果有人修改的同時記錄一個 - 從#4中的查詢將產生不同的結果...您可以通過存儲的原始搜索結果中隱藏的副本處理它和比較這些(閱讀約List.deepClone) - 但這將意味着你的視圖狀態加倍!

(我們可能得到的散列碼衝突太右一組數據 - 也許只是溝removeAllequals去在每個項目上,我希望我給你一些精神食糧)