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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.12.2004, 11:09   #1  
Greggy_imported is offline
Greggy_imported
Участник
Аватар для Greggy_imported
 
291 / 10 (1) +
Регистрация: 24.09.2004
Здравствуйте, Подскажите какую запись вернет FIND('=><') ???
Старый 28.12.2004, 12:01   #2  
Likefire is offline
Likefire
Заноза в заднице
Аватар для Likefire
MCBMSS
Лучший по профессии 2009
 
547 / 50 (3) ++++
Регистрация: 22.10.2007
Адрес: Москва
Записей в блоге: 1
Тут может быть два варианта: либо все записи, либо вообще ничего. Все записи будут возвращены в случае, если до вызова FIND определены значения полей текущего (CURRENTKEY) и первичного (PRIMARY) ключей. В противном случае FIND ничего не возвратит.
__________________
Лень мудрого человека - это необходимое средство нейтрализации кипучей активности руководящих им дураков!
Старый 28.12.2004, 12:04   #3  
Kirvisniemi is offline
Kirvisniemi
Moderator
 
342 / 13 (1) ++
Регистрация: 21.12.2004
FIND вернет не запись, а значение TRUE.

А уж что вернет переменная типа Record это науке не известно
Старый 28.12.2004, 12:13   #4  
Likefire is offline
Likefire
Заноза в заднице
Аватар для Likefire
MCBMSS
Лучший по профессии 2009
 
547 / 50 (3) ++++
Регистрация: 22.10.2007
Адрес: Москва
Записей в блоге: 1
Цитата:
Сообщение от tyrex
FIND вернет не запись, а значение TRUE.

А уж что вернет переменная типа Record это науке не известно
Конечно! Позволю себе скорректировать свой ответ...
Если FIND возвратит значение TRUE, тогда это означает, что в записи, либо ссылке на запись, к которой применён FIND, отобраны все существующие строки. Если же FIND возвратил FALSE, то это значит, что в записи, к которой применялся отбор "не всё в порядке" (смотри выше), и, соответственно, ни одной строки не будет включено в отбор.
__________________
Лень мудрого человека - это необходимое средство нейтрализации кипучей активности руководящих им дураков!
Старый 28.12.2004, 12:40   #5  
Greggy_imported is offline
Greggy_imported
Участник
Аватар для Greggy_imported
 
291 / 10 (1) +
Регистрация: 24.09.2004
Спасибо большое за ответ!
Старый 28.12.2004, 13:18   #6  
Kirvisniemi is offline
Kirvisniemi
Moderator
 
342 / 13 (1) ++
Регистрация: 21.12.2004
Обычно конструкцию IF "Что-то-там".FIND('=><') THEN ... применяют для проверки отфильтрованной таблицы на наличие записей
Старый 28.12.2004, 14:22   #7  
Wizard_imported is offline
Wizard_imported
Участник
 
157 / 10 (1) +
Регистрация: 25.11.2004
хм... функция действительно возвращает булево значение, но думаю, вопрос был не об этом...
Вообще говоря, параметр функции Find указывает, на какой позиции в наборе данных следует установить курсор. Чаще всего в коде используют '-' (первая) или '+' (последняя запись). Конструкция ('=><') означает "спозиционироваться на текущую запись, а при её отсутствии в наборе данных - на следующую ближайшую запись к ней" (в соответствии со значениями ключевых полей записи и установленным порядком сортировки). Навижен неявно использует её, например, при открытии формы, свойство которой "SourceTablePlacement" установлено в <Saved> (значение по умолчанию). Легко догадаться что ('=<>') - спозиционироваться на текущую или предыдущую запись.
PS. напомню, что "текущую запись" определяют значения полей, входящих в ключ, выбранный в этот момент для сортировки таблицы. Таким образом, подобную конструкцию в коде удобно использовать, когда известны не все значения "ключевых полей" (в кавычках потому что это не обязательно поля первичного ключа, в навижене все индексы ключами называют...)
Старый 29.12.2004, 06:43   #8  
Greggy_imported is offline
Greggy_imported
Участник
Аватар для Greggy_imported
 
291 / 10 (1) +
Регистрация: 24.09.2004
Большое спасибо Wizard за такой полный, подробный и понятный ответ.
Старый 29.12.2004, 09:35   #9  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Greggy, форум позволяет добавить респект тем участникам, ответы которых вам понравились.
Для того, чтобы добавить респект нажмите + в строке Респекты слева от сообщения.
__________________
полезное на axForum, github, vk, coub.
Старый 29.12.2004, 09:58   #10  
Wizard_imported is offline
Wizard_imported
Участник
 
157 / 10 (1) +
Регистрация: 25.11.2004
Да не за что... Замечу всё таки, что все параметры этой функции в справке описаны, не сказано только что их можно комбинировать, перечисляя в порядке приоритета...

Но я не об этом, вот о чем:
Цитата:
Обычно конструкцию IF "Что-то-там".FIND('=><') THEN ... применяют для проверки отфильтрованной таблицы на наличие записей
Народы, не скажу за родную навиженскую базу, хотя и там имхо было бы более красиво использовать для этого функцию Rec.ISEMPTY, а вот за SQL опцию - скажу:
Не рекомендую использовать ни FIND, ни ISEMPTY для проверки фильтрованного набора данных на наличие в нём записей. Возьмусь в данном случае поспорить со справкой - опыт показывает что COUNT с проверкой на 0 отрабатывает значительно быстрее.
Попробую пояснить почему:
Навижен, при обращении к записям таблицы, всегда запрашивает у SQL сервера "звездочки" (SELECT * FROM...). В результате даже при наличии подходящего SQL индекса сервер вынужден вычитывать страницы с данными. В случае же использования COUNT серверу достаточно индекса для подсчета записей.
Конечно, вопрос производительности сложный и надо к любым советам относиться с осторожностью, но опыт...
Старый 29.12.2004, 12:59   #11  
Kirvisniemi is offline
Kirvisniemi
Moderator
 
342 / 13 (1) ++
Регистрация: 21.12.2004
Не согласен.

операции типа MyTable.FIND генерируют запрос вида
Код:
SELECT  * FROM MyTable WHERE "Key"=@P1
а операции типа MyTable.COUNT запрос вида
Код:
SELECT COUNT(*) FROM  MyTable WHERE "Key"=@P1
что по определению не может работать быстрее.

Поэтому правильнее использовать FIND
Старый 29.12.2004, 16:01   #12  
Wizard_imported is offline
Wizard_imported
Участник
 
157 / 10 (1) +
Регистрация: 25.11.2004
ваше право...
однако мне не знакомо определение, по которому это не может работать быстрее, а вот почему реально работает быстрее - я написал. Предлагаю сомневающимся ставить эксперименты самостоятельно. Ещё раз подчеркну - важно наличие подходящих SQL индексов.
Старый 29.12.2004, 16:32   #13  
Kirvisniemi is offline
Kirvisniemi
Moderator
 
342 / 13 (1) ++
Регистрация: 21.12.2004
Я не сомневаюсь, я утверждаю.

Специально поставил эксперимент на кронусе. Выставил аудит на сиквеле. Создал таблицу в 10 млн записей. Написал два простейших кода в стиле SETFILTER - FIND, SETFILTER - COUNT. Запустил профайлер для каждого и замерил время. Если есть желающие посмотреть, какие в действительности SQL-запросы генерирует навижн - пишите - опубликую
Старый 29.12.2004, 17:51   #14  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от tyrex
Если есть желающие посмотреть, какие в действительности SQL-запросы генерирует навижн - пишите - опубликую
Есть!

А может лучше статью?
В стиле http://axapta.mazzy.ru/hints/indexhints/ и http://axapta.mazzy.ru/hints/indexhi...leresults.html
__________________
полезное на axForum, github, vk, coub.
Старый 29.12.2004, 18:07   #15  
Wizard_imported is offline
Wizard_imported
Участник
 
157 / 10 (1) +
Регистрация: 25.11.2004
Спасибо, коллега tyrex, что не забросили тему, надеюсь с вашей помощью всё таки довести до аудитории суть своих рекомендаций.
Во-первых вспомним, что речь шла о проверке набора данных на наличие в нем записей... Вопрос: а зачем это вообще делать? - вопрос открытый.
На мой взгляд - для того, чтобы принять решение о продолжении обработки этого набора данных. А почему бы сразу не открыть для этого курсор, как обычно
IF FIND('-') THEN REPEAT
...
UNTIL NEXT=0;
если вероятность того, что записей не окажется, маленькая (что обычно бывает) - то дополнительной проверки на пустоту не нужно делать, поскольку всё равно для заполнения табличной переменной реальными значениями FIND придется вызвать. А вот если вероятность от FIND('-') получить FALSE достаточно велика - дополнительная проверка становится осмысленной.
Для того, чтобы получить описанный мной эффект надо построить подходящий SQL индекс, в который бы входили все поля, участвующие в фильтре. Конечно, важно чтобы этот индекс был достаточно селективным. Так вот, для того чтобы обработать запрос <SELECT COUNT(*) FROM MyTable WHERE "Key"=@P1> серверу в этом случае не придется обращаться к данным в таблице, и выигрыш во времени получится существенным.
В моем опыте конструкция
IF COUNT <> 0 THEN BEGIN
FIND('-');
REPEAT
...
UNTIL NEXT=0;
END;
привела к ускорению соответствующего процесса в разы.
Замечу для точности что сам этот кусок кода находился в цикле обработки другого, основного набора данных, на основании которого определялись значения фильров.
Получив такой результат, я прошелся по тем местам кода, где вспомнилась именно проверка "на пустоту", когда потребности в самих данных нет. Во всех случаях замена на COUNT привела к ускорению процессов.
Именно это и позволило мне выдать такие рекомендации.
Старый 30.12.2004, 14:45   #16  
Wizard_imported is offline
Wizard_imported
Участник
 
157 / 10 (1) +
Регистрация: 25.11.2004
Благо перед праздниками удалось выкроить свободного времени, провел ревизию своего утверждения про функцию ISEMPTY.
При её вызове Навижен генерит запрос вида
Код:
SELECT TOP 1 NULL FROM TABLE WHERE FIELD1=@P1
в отличие от FIND, при вызове которой запрос выгядит примерно вот так
Код:
SELECT TOP 1 * FROM TABLE WHERE FIELD1=@P1 ORDER BY <CURRENTKEY FIELDS>
Собственно именно об этой звездочке и об ORDER BY я и говорил, призывая не использовать FIND для проверки набора данных на пустоту.
select TOP 1 NULL свободен от этих недостатков, и в смысле использования индексов работает аналогично COUNT, но, конечно, ограничивается первой попавшейся записью в индексе и концептуально лучше.
К своему сожалению я не могу сейчас повторить ситуацию, в которой на моей базе COUNT был лучше чем ISEMPTY, поэтому:
1. Снимаю свои призывы использовать COUNT
2. Оставляю в силе рекомендацию не использовать FIND
3. Предлагаю использовать ISEMPTY
4. На мой взгляд проводить эксперименты с производительностью лучше не на тестовых примерах а на собственных данных, от их организации и наполнения многое зависит.
5. Посыпать голову пеплом пока не буду, поскольку было такое... ("у меня все ходы записаны" (С), профайлер запускался и результаты запротоколированы, ошибки не было). Повторится ситуация - отпишу обязательно.

Модератору: на мой взгляд, обсуждение использования COUNT лучше вынести в отдельную тему форума, начиная с моей фразы "Но я не об этом, вот о чем:"
PS. tyrex'у - респект за неравнодушное отношение.
Старый 04.01.2005, 13:55   #17  
Uni_DeMoN_imported is offline
Uni_DeMoN_imported
Участник
 
83 / 10 (1) +
Регистрация: 05.04.2004
Народ, а как Вы отслеживаете генерацию sql-левских селектов от кода в навижен?
Используете ли Вы встроенные средства в навижине для мониторинга производительности?
Старый 04.01.2005, 14:02   #18  
Uni_DeMoN_imported is offline
Uni_DeMoN_imported
Участник
 
83 / 10 (1) +
Регистрация: 05.04.2004
Да и респект wizardу за грамотные советы в отношении скорости обработки комманд find, isempty, count.
Старый 26.01.2005, 15:42   #19  
СMЕРТЬ is offline
СMЕРТЬ
Участник
 
1 / 10 (1) +
Регистрация: 26.01.2005
The number of filters that you have applied to the records affects the speed of the ISEMPTY function. The fewer the number of filters, the faster the system performs the operation.

When you are using SQL Server, this function is faster than using the Record.COUNT function and then testing the result for zero.

RTFM
 


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

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

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