Цитата:
Сообщение от
timaluhs
Надо копировать строку из таблицы и добавить её в ту же таблицу и изменить значение одного или двух полей.
Цитата:
Сообщение от
TasmanianDevil
Buf2Buf() с последующим изменением только отличающихся полей поможет ?
А по мне так "клонирование" записей с помощью buf2buf() или data() есть зло, потому что такой вариант очень прост в плане реализации (и потому заманчив), но очень непрозрачен и даже опасен в плане последующей поддержки:
- Обычно рано или поздно оказывается, что какие-то поля копировать не надо вовсе - придется плодить уродские конструкции, очищающие их значения в новой записи.
- Пропадает возможность использовать логику инициализации новой записи в initValue(), либо эту логику надо как-то продублировать в коде копирования записей (а copy-paste - еще большее зло, чем buf2buf()).
- Когда в таблицу добавляются новые поля, то при этом нужно каждый раз помнить, что есть такие места кода с buf2buf(), где значения этих новых полей будут безусловно скопированы в другую запись (надо ли их очищать или перебивать на что-то?).
- Если захочется посмотреть по перекрестным ссылкам, в каких местах приложения заполняется то или иное поле, то фрагменты кода с buf2buf() опять-таки ускользнут из поля зрения...
В общем, из моего скромного опыта новые записи
никогда не стоит создавать с помощью buf2buf(), насколько бы они ни были похожи на уже существующие, - это то, что
mazzy называет "программистским подходом". Лучше потратить немного времени и написать метод типа initFromXX(), в котором
явно скопировать все нужные поля; его код можно сгенерить из списка полей с помощью поиска и замены с регулярными выражениями, так что независимо от числа полей пишется он очень просто. Такой метод куда проще поддерживать, в случае добавления в таблицу новых полей он не создаст побочных эффектов, наконец, он корректно отражается в перекрестных ссылках.
PS. А еще больше "веселых" косяков можно словить в том случае, если перед вставкой новой записи не вызывать validateWrite().