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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 13.12.2013, 16:10   #1  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Нужно изменить значение неключевого поля(-ей) в некоторых записях. Задача-то несложная, но вопрос: чем лучше это делать?
Так:
Код:
SETRANGE(накладываем нужный фильтр);
IF FINDSET(TRUE, FALSE) THEN
   REPEAT
     Поле := Новое значение;
     MODIFY;
   UNTIL NEXT = 0
или так?
Код:
SETRANGE(накладываем нужный фильтр);
MODIFYALL(Поле, Новое значение)
Второй вариант короче, но где-то читала, что есть в нем какая-то каверза.
Что скажете, спецы? Как будет грамотнее?
Старый 13.12.2013, 17:43   #2  
InTacto is offline
InTacto
Участник
Аватар для InTacto
 
323 / 11 (1) +
Регистрация: 09.08.2005
http://dynamicsuser.net/blogs/waldo/...deleteall.aspx
тут пишут, что в вашем случае быстрее будет работать modifyall
Старый 14.12.2013, 18:27   #3  
alexb_imported is offline
alexb_imported
Участник
 
256 / 12 (1) ++
Регистрация: 25.08.2006
Будет ещё быстрее работать, если отфильтровать только те записи, которые требуется изменить, типа:
Код:
SETFILTER(поле,'<>%1',Новое значение);
И не забывать посредством ISEMPTY проверять, имеются ли в заданном фильтре вообще записи или нет (т.е. нужно ли вообще производить изменения):
Код:
SETRANGE(накладываем нужный фильтр);
SETFILTER(поле,'<>%1',Новое значение);
IF NOT ISEMPTY THEN BEGIN
  MODIFYALL(поле, Новое значение);
END;
Старый 16.12.2013, 23:23   #4  
romeo is offline
romeo
Участник
Аватар для romeo
 
564 / 10 (2) +
Регистрация: 31.03.2004
А кто сказал, что интересует скорость выполнения?
Например при изменении с помощью MODIFYALL() не получится вызвать VALIDATE() изменяемого поля.
Старый 18.12.2013, 11:06   #5  
romeo is offline
romeo
Участник
Аватар для romeo
 
564 / 10 (2) +
Регистрация: 31.03.2004
А еще MODIFYALL() не видит установленных в реке переменных.
То есть, если написано так
Код:
t36.SetMode(1);
t36.MODIFYALL("Posting Date", TODAY(), FALSE);
и если внутри t36 на Mode = 1 завязано что-то, то в этом процессе Mode внутри таблицы будет нулевой. Касается и DELETEALL().
Старый 18.12.2013, 11:50   #6  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Ребята, всем Данке +
Приняла к сведению.
 


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

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

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