AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.05.2011, 13:03   #1  
timaluhs is offline
timaluhs
newborn in DAX
Аватар для timaluhs
 
102 / 10 (1) +
Регистрация: 16.12.2010
Адрес: Израиль
копирование строки в таблице
Господа, подкиньте идейку. Надо копировать строку из таблицы и добавить её в ту же таблицу и изменить значение одного или двух полей.
первая мысль создать второй инстант той же таблицы с выбраной строкой и каждое поле добавлять по отдельности. Звучит не особо. Тем более что количество полей периодически меняется и при каждом изменении надо будет помнить поменять и тут. Заранее спасибо
Что-то подобное
Select * from tmp_tbl where ...
tbl.f = tmp_tbl.f
tbl.f1 = tmp_tbl.f1
tbl.f2 = tmp_tbl.f2
....
Может существует что-то типа foreach field in table
Старый 02.05.2011, 13:39   #2  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
886 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Buf2Buf() с последующим изменением только отличающихся полей поможет ?
__________________
Мы летаем, кружимся, нагоняем ужасы ...
За это сообщение автора поблагодарили: timaluhs (1).
Старый 02.05.2011, 13:49   #3  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,509 / 432 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
или tbl.data(tmp_tbl) с последующим изменением нужных полей
__________________
С уважением,
Вячеслав
Старый 02.05.2011, 14:10   #4  
timaluhs is offline
timaluhs
newborn in DAX
Аватар для timaluhs
 
102 / 10 (1) +
Регистрация: 16.12.2010
Адрес: Израиль
похоже на то что надо, надо только менять значения полей до вставки
Старый 02.05.2011, 14:29   #5  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,509 / 432 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
так data сама по себе вставку в таблицу не делает. Она только полностью копирует табличную переменную. Надо сделать так:
X++:
 tbl.data(tmp_tbl);
tbl.Field1 = newValue_1;
tbl.Field2 = newValue_2;
tbl.insert();
__________________
С уважением,
Вячеслав
Старый 02.05.2011, 18:44   #6  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от timaluhs Посмотреть сообщение
Надо копировать строку из таблицы и добавить её в ту же таблицу и изменить значение одного или двух полей.
Цитата:
Сообщение от TasmanianDevil Посмотреть сообщение
Buf2Buf() с последующим изменением только отличающихся полей поможет ?
А по мне так "клонирование" записей с помощью buf2buf() или data() есть зло, потому что такой вариант очень прост в плане реализации (и потому заманчив), но очень непрозрачен и даже опасен в плане последующей поддержки:
  • Обычно рано или поздно оказывается, что какие-то поля копировать не надо вовсе - придется плодить уродские конструкции, очищающие их значения в новой записи.
  • Пропадает возможность использовать логику инициализации новой записи в initValue(), либо эту логику надо как-то продублировать в коде копирования записей (а copy-paste - еще большее зло, чем buf2buf()).
  • Когда в таблицу добавляются новые поля, то при этом нужно каждый раз помнить, что есть такие места кода с buf2buf(), где значения этих новых полей будут безусловно скопированы в другую запись (надо ли их очищать или перебивать на что-то?).
  • Если захочется посмотреть по перекрестным ссылкам, в каких местах приложения заполняется то или иное поле, то фрагменты кода с buf2buf() опять-таки ускользнут из поля зрения...
В общем, из моего скромного опыта новые записи никогда не стоит создавать с помощью buf2buf(), насколько бы они ни были похожи на уже существующие, - это то, что mazzy называет "программистским подходом". Лучше потратить немного времени и написать метод типа initFromXX(), в котором явно скопировать все нужные поля; его код можно сгенерить из списка полей с помощью поиска и замены с регулярными выражениями, так что независимо от числа полей пишется он очень просто. Такой метод куда проще поддерживать, в случае добавления в таблицу новых полей он не создаст побочных эффектов, наконец, он корректно отражается в перекрестных ссылках.

PS. А еще больше "веселых" косяков можно словить в том случае, если перед вставкой новой записи не вызывать validateWrite().
За это сообщение автора поблагодарили: timaluhs (1).
Старый 03.05.2011, 09:45   #7  
timaluhs is offline
timaluhs
newborn in DAX
Аватар для timaluhs
 
102 / 10 (1) +
Регистрация: 16.12.2010
Адрес: Израиль
Спасибо gl00mie за мысли к размышлению только мне ещё "учиться, учиться и учиться" до такого понимания.
Что такое initValue() и когда им пользуются. И зачем нужны перекрестные ссылки и с чем их едят?

И написание initFromXX() требует более подробного объяснения - как это "сгенерить из списка полей с помощью поиска и замены с регулярными выражениями" для меня звучит как на иностранном - каждое слово понятно в отдельности, а смысл мысли непонятен.

В моей задаче создаётся таблица из класса которая фактически является объединением друх таблиц чисто для удобства просмотра. Меня можно сказать кинули в море axapta, а в качестве спасательного круга - google. Спасибо форуму - с вашей помощью удалось решить уже несколько задачек, которые даже было не понятно как начинать.

Последний раз редактировалось timaluhs; 03.05.2011 в 09:49.
Старый 03.05.2011, 10:57   #8  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Так если новая таблица создается "чисто для удобства просмотра", то, может, не умножать сущности без необходимости, а сделать на форме join или использовать view'шку?..
Теги
как правильно, копирование строк

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Фильтрование записей при "переходе к основной таблице" demID DAX: Программирование 10 18.11.2015 12:52
Тормозит копирование строк в буфер обмена ivas DAX: Программирование 20 21.08.2007 15:05
При создании строки в закупке статус строки становится "Отменено" AlexUnik DAX: Функционал 4 27.09.2004 16:05
Переход на правильную запись при Переходе к основной таблице. Anais DAX: Программирование 11 29.06.2004 19:16
фильтр по связанной таблице mick_777 DAX: Программирование 13 21.08.2002 16:00
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 02:17.