|
15.11.2011, 12:39 | #1 |
Участник
|
Приветствую!
Много раз задавался вопросом, почему сделано именно так. Встречал в нескольких местах в системе. Вот код процедуры из 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. Т.е. deleteall будет дольше искать записи для их удаления по сложному фильтру, нежели это делает ISEMPTY. Так ли это? Есть еще какие-нибудь предположения? |
|
15.11.2011, 14:55 | #2 |
Участник
|
Цитата:
Сообщение от Fly
Вопрос: Зачем проверять методом ISEMPTY, если DELETEALL и так удаляет?
Единственное объяснение у меня - т.к. ISEMPTY быстрее позволяет обнаружить наличие записей, чем DELETEALL. Т.е. deleteall будет дольше искать записи для их удаления по сложному фильтру, нежели это делает ISEMPTY. Так ли это? Есть еще какие-нибудь предположения? Грубо говоря: зачем делать 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 |
Участник
|
AlexB, спасибо за ответ! Значит я в ту сторону думал
Насчет FIND - тоже есть своя логика. Особенно это актуально для больших таблиц в случае, если мы ищем по нескольким сложным фильтрам. |
|
16.11.2011, 12:33 | #4 |
Участник
|
|
|