Пометить определенные записи для обновления в таблице Visualforce

Я создал страницу поиска, которая возвращает наборы записей с помощью пользовательского контроллера и страницы Visualforce. Пользователи могут обновлять определенные поля в отдельных записях.

Я хочу иметь возможность сохранять сразу все измененные записи, но команда действия обновляет весь возвращаемый набор, а не только измененные записи. Приложение требует, чтобы обновлялись только измененные записи.

За исключением фильтрации всех возможных изменений, которые можно внести в запись, или добавления кнопки сохранения в каждую запись, есть ли у кого-нибудь креативная идея о том, как идентифицировать конкретные записи, которые были изменены, чтобы приложение могло сохранить только те, которые были отредактированы?


person NebX    schedule 17.02.2014    source источник


Ответы (1)


Очень интересный вопрос :)

На SFSE есть классный ответ об отслеживании изменений между «старым» и «новым» с помощью описания поля или сериализации JSON: Generally walk sObject fields< /а>. Обратите внимание, что я связался с ответом, который считаю наиболее аккуратным, подумайте о том, чтобы прочитать всю страницу!

Этот вопрос интересен еще и тем, что он поставил бы вашу логику в более правильное место - в триггер. Потому что вы должны спросить себя, нельзя ли сделать обновление, которое на самом деле ничего не меняет на вашей странице поиска — возможно ли это и на других страницах?


Если это не то, что сработает для вас, вот еще один интересный трюк.

Наборы внутренне используют хэш объекта для определения уникальности (не только идентификатор, все поля). Это совершенно нормально, чтобы установить так:

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. Пользователь не изменяет ничего/некоторых/всех и нажимает «отправить».
  3. Бросьте этот список в помощник Set<sObject> (используйте метод addAll).
  4. Снова получить результаты поиска в другой вспомогательный список. Убедитесь, что вы запросили точно такие же поля.
  5. Вызовите mySet.removeAll(originals); - должны стереть все одинаковые элементы.
  6. Добавьте выживших в окончательный список помощников и вызовите обновление.

Это имеет некоторые недостатки, например, если кто-то тем временем изменил одну из записей - запрос из #4 даст другие результаты... Вы можете решить эту проблему, сохранив скрытую копию исходных результатов поиска и сравнив их (читайте о List.deepClone ) - но это будет означать удвоение вашего состояния просмотра!

(у нас также могут возникнуть конфликты хеш-кода с правильным набором данных - может быть, просто отказаться от removeAll и использовать equals для каждого элемента. Надеюсь, я дал вам пищу для размышлений)

person eyescream    schedule 18.02.2014