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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.11.2011, 12:39   #1  
Fly is offline
Fly
Участник
Аватар для Fly
 
102 / 10 (1) +
Регистрация: 05.10.2007
Приветствую!
Много раз задавался вопросом, почему сделано именно так. Встречал в нескольких местах в системе. Вот код процедуры из 37 таблицы:

Код:
ItemChargeAssgntSales.SETCURRENTKEY(
  "Applies-to Doc. Type","Applies-to Doc. No.","Applies-to Doc. Line No.");
ItemChargeAssgntSales.SETRANGE("Applies-to Doc. Type",DocType);
ItemChargeAssgntSales.SETRANGE("Applies-to Doc. No.",DocNo);
ItemChargeAssgntSales.SETRANGE("Applies-to Doc. Line No.",DocLineNo);
IF NOT ItemChargeAssgntSales.ISEMPTY THEN
  ItemChargeAssgntSales.DELETEALL(TRUE);
Вопрос: Зачем проверять методом ISEMPTY, если DELETEALL и так удаляет?
Единственное объяснение у меня - т.к. ISEMPTY быстрее позволяет обнаружить наличие записей, чем DELETEALL. Т.е. deleteall будет дольше искать записи для их удаления по сложному фильтру, нежели это делает ISEMPTY.
Так ли это? Есть еще какие-нибудь предположения?
Старый 15.11.2011, 14:55   #2  
alexb_imported is offline
alexb_imported
Участник
 
256 / 12 (1) ++
Регистрация: 25.08.2006
Цитата:
Сообщение от Fly Посмотреть сообщение
Вопрос: Зачем проверять методом ISEMPTY, если DELETEALL и так удаляет?
Единственное объяснение у меня - т.к. ISEMPTY быстрее позволяет обнаружить наличие записей, чем DELETEALL. Т.е. deleteall будет дольше искать записи для их удаления по сложному фильтру, нежели это делает ISEMPTY.
Так ли это? Есть еще какие-нибудь предположения?
ISEMPTY не делает FIND a просто возвращает TRUE/FALSE => есть ли записи или нет, поэтому и срабатывает очень быстро, т.к не возвращает ни запись, ни recordset (SQL по-моeму делает select NULL from table...). Но на скорость исполнения DELETEALL никак не влияет! Это просто проверка: есть записи или нет.
Грубо говоря: зачем делать DELETEALL для тех записей, которых может и не быть? Для проверки этого (надо или не надо вообще делать DELETEALL) и использутся ISEMPTY.
Без этой проверки Navision будет пытаться сначала найти записи, увидит, что записей нет и ничего удалять не надо: это сказывается на скорости.
По этому поводу по-моему даже есть баг-запрос к МС.
У нас уже стараются везде где можно (например в OnDelete()-триггерах таблиц 36,37,38,39) где масса таких прямых DELETEALL'ов добавить
предшествующую DELETEALL проверку с ISEMPTY.
To же самое касается FIND'a: зачем производить FIND('-'), FIND('+'), FINDSET если записей в фильтре может и не быть?
А НАВ попробует сначала несуществующие (или не отвечающие фильтру) записи найти.
FIND'ы: одно из слабых мест НАВ'a: нельзя селектнуть отдельные поля, нав возвращает всегда всю запись, а это сказывается на скорости.
Поэтому и FIND'ы надо (по-моему мнению) произвoдить только тогда, когда 100% гарантия (посредством ISEMPTY) что записи есть.
(Исключаются конечно те случаи, где записи обязаны быть)
Поэтому я почти везде перед FINDSET или DELETEALL произвожу проверку с ISEMPTY.
Старый 15.11.2011, 17:11   #3  
Fly is offline
Fly
Участник
Аватар для Fly
 
102 / 10 (1) +
Регистрация: 05.10.2007
AlexB, спасибо за ответ! Значит я в ту сторону думал
Насчет FIND - тоже есть своя логика. Особенно это актуально для больших таблиц в случае, если мы ищем по нескольким сложным фильтрам.
Старый 16.11.2011, 12:33   #4  
RedFox is offline
RedFox
Участник
 
1,441 / 10 (0) +
Регистрация: 28.12.2004
Адрес: Киев
Цитата:
Сообщение от Fly Посмотреть сообщение
..
Вопрос: Зачем проверять методом ISEMPTY, если DELETEALL и так удаляет?
..
ISEMPTY работает быстрее и если нет записей, то не нужно лишний раз ворошить базу
 


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

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

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