Показать сообщение отдельно
Старый 02.05.2011, 18:44   #4  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5813 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от timaluhs Посмотреть сообщение
Надо копировать строку из таблицы и добавить её в ту же таблицу и изменить значение одного или двух полей.
Цитата:
Сообщение от TasmanianDevil Посмотреть сообщение
Buf2Buf() с последующим изменением только отличающихся полей поможет ?
А по мне так "клонирование" записей с помощью buf2buf() или data() есть зло, потому что такой вариант очень прост в плане реализации (и потому заманчив), но очень непрозрачен и даже опасен в плане последующей поддержки:
  • Обычно рано или поздно оказывается, что какие-то поля копировать не надо вовсе - придется плодить уродские конструкции, очищающие их значения в новой записи.
  • Пропадает возможность использовать логику инициализации новой записи в initValue(), либо эту логику надо как-то продублировать в коде копирования записей (а copy-paste - еще большее зло, чем buf2buf()).
  • Когда в таблицу добавляются новые поля, то при этом нужно каждый раз помнить, что есть такие места кода с buf2buf(), где значения этих новых полей будут безусловно скопированы в другую запись (надо ли их очищать или перебивать на что-то?).
  • Если захочется посмотреть по перекрестным ссылкам, в каких местах приложения заполняется то или иное поле, то фрагменты кода с buf2buf() опять-таки ускользнут из поля зрения...
В общем, из моего скромного опыта новые записи никогда не стоит создавать с помощью buf2buf(), насколько бы они ни были похожи на уже существующие, - это то, что mazzy называет "программистским подходом". Лучше потратить немного времени и написать метод типа initFromXX(), в котором явно скопировать все нужные поля; его код можно сгенерить из списка полей с помощью поиска и замены с регулярными выражениями, так что независимо от числа полей пишется он очень просто. Такой метод куда проще поддерживать, в случае добавления в таблицу новых полей он не создаст побочных эффектов, наконец, он корректно отражается в перекрестных ссылках.

PS. А еще больше "веселых" косяков можно словить в том случае, если перед вставкой новой записи не вызывать validateWrite().
За это сообщение автора поблагодарили: timaluhs (1).