Аксапта содержит средства поиска. Вы задаете строку - критерий. Эта строка определяет что искать, а Аксапта ищет записи, в которых значение указанных полей подходит под критерий.

Поиск можно осуществлять как при помощи "быстрого поиска", так и при помощи фильтрации записей. Для того, чтобы выполнить быстрый поиск, нужно встать на поле и запустить поиск. Быстрый поиск найдет все записи, в которых указанное вами поле подходит под вашу строку.

Фильтрация записей перед своей работой показывает диалог, в котором можно добавить отбираемые поля, добавить таблицы, изменить сортировку, записать критерии и считать эти критерии. Все это можно выполнить, естественно, если у пользователя есть права.

Быстрый поиск можно выполнить выбрав контекстное меню "Найти...", нажав на бинокль на панели инструментов или с помощью комбинации клавиш Ctrl+F. Критерий поиска можно задать с помощью контекстного меню "Фильтрация записей", нажав на панели инструментов воронку или с помощью комбинации клавиш Ctrl+F3.

Строка поиска может содержать специальные символы, которые значительно расширяют возможности поиска. В таблице перечислены эти символы

? Вопросительный знак Один любой символ
* Звездочка Несколько любых символов
, Запятая Разделяет несколько критериев (и)
! Восклицательный знак Отрицание (не)
.. Две подряд идущие точки Разделяет начало и конец диапазона
< Знак меньше Меньше чем
> Знак больше Больше чем
" Кавычки Ограничивает строку
\ Обратный слэш Экранирует следующий символ

Рассмотрим эти символы подробнее.

? (вопросительный знак)

Вопросительный знак позволяет указать, что в этом месте может находится один любой символ. Например, критерий "МАГ Конс?лтинг" позволит найти как запись с "МАГ Консалтинг", так и запись с "МАГ Консултинг".

* (звездочка)

Звездочка позволяет указать что вместо нее может находится любые количество любых символов. Например, если задать критерий МАГ*, то будут найдены все записи, которые начинаются с "МАГ". Если же задать критерий *консулт*, то, с большой вероятностью, будут найдены все консультанты, зарегистрированные в системе.

, (запятая)

Запятая позволяет перечислить несколько вариантов, которые вы хотите найти. Например, если задать критерий Навижин,Аксапта, то будут найдены (показаны или обработаны) и Навижин, и Аксапта.

! (восклицательный знак)

Восклицательный знак позволяет указать отрицание. Т.е. можно запросить все записи, кроме некоторых. Например, если задать критерий Навижин,!Аттейн,Аксапта, то будут найдены все записи с навижин и Аксаптой, но без Аттейна.

Восклицательный знак, как правило, стоит использовать совместно со звездочкой. Так, критерий *Навижин*,!*Аттейн*,*Аксапта* корректнее передает смысл запроса.

.. (две подряд идущие точки)

Две подряд идущие точки позволяют указать диапазон. Например, критерий 01.01.02..31.12.02 позволяет указать, что надо искать записи за этот год. Можно опускать начало или конец диапазона. Например, критерий 01.01.02.. позволяет найти все записи с начала 2002 года, а критерий ..31.12.01 позволяет найти все записи от начала времен до 31.12.01 включительно.

Диапазон отлично работает не только с датами, но и с числовыми данными. Например, 0.. позволяет найти все положительные суммы.

Диапазон работает и с перечислениями. Например, критерий ..пассив, примененный к типу бухгалтерского счета, позволяет отобрать все счета, на которые можно делать проводки (не служебные счета). А критерий скомплектовано.., примененный к статусу расхода в складской проводке, позволяет отобрать все продажи, по которым еще не были выписаны документы (накладная и счет-фактура).

< (знак меньше)

Искать значения меньшие указанного. Например, "<1000" находит "999.99" и "-200".

> (знак больше)

Искать значения меньшие указанного. Например, ">1000" находит "1000.01", "20000" и "1000000".

" (кавычки)

Кавычки позволяют указать в качестве критерия строку, содержащую специальные символы. Например, критерий "Навижин,Аксапта" позволяет найти записи в которых присутствует именно эта строка.

\ (Обратный слэш)

Обратный слэш экранирует следующий символ. Так обратный слэш помогает указать, что хочется найти строку в которой есть какие-либо специальные символы. Например, если названия некоторых номенклатуры содержат знак *, а вы хотите найти именно такие номенклатуры. Строка критерия * не сработает, поскольку Аксапта трактует *, как специальный символ. Чтобы Аксапта искала именно *, необходимо перед этим символом указать экранирующий символ. Критерий \* означает, что надо искать именно звездочку, а не любые символы. А критерий *\** означает, что в начале строки могут находиться любые символы (первая *), где-то в середине искомой строки должна быть * (комбинация \*), а в конце снова могут находиться любые символы. Таким образом, критерий *\** найдет все строки, в которых присутствует хотя бы одна *. Кстати, если хочется найти символ \, то в критерии надо указывать \\.

Рекомендация 1

Это неочевидно, но Аксапта использует этот же механизм поиска и для связи данных в своей работе. Например, если из клиента сделать запрос по всем заказам, то Аксапта сгенерирует запрос и будет искать все заказы в которых клиент совпадает с текущим. Пока все нормально. Однако, если в коде клиента присутствуют специальные символы, то код клиента подставляется как есть и... поиск выполняется с шаблонами.

Например, есть клиент с кодом Аксапта 2,5. Если посмотреть заказы по этому клиенту, то Аксапта будет искать записи по двум (!) клиентам - "Аксапта 2" и по клиенту с кодом "5".

Поэтому: не используйте специальные символы в кодах.

Рекомендация 2

Даты необязательно писать полностью. Можно задавать дату без разделителей. Можно опускать месяц и год. Можно вместо даты указывать специальный символ d (текущая дата).

Например, критерий 01.., примененный к дате, найдет все записи с 1 числа текущего месяца текущего года. А критерий 0101 - все записи с 1 января текущего года

Рекомендация 3

Если вы указываете сумму, то не нужно указывать разделители между тысячами. В качестве разделителя между целой и дробной частью всегда надо указывать точку.

Например, если вы хотите найти сумму 123 456 рублей 78 копеек, то, какие бы региональные настройки не были у вашего компьютера, в критерии поиска надо указать 123456.78.

 

Дополнение

Хорошее дополнение прислал Андрей Бобков. Вот его письмо почти полностью:

1. Знаки < и > позволяют задать критерии "меньше чем" и "больше чем". Это может быть полезно, когда нужно задать критерий, не включающий указанную величину, например >0 для выбора всех значений, больших нуля. В то же время, .. (две точки) позволяет задать только диапазон, включающий границы. Например 0.. позволяет выбрать значения, большие или равные нуля (а не положительные, как у тебя написано). А причем тут начало и конец строки, я что-то не понял...

2. ? (вопросительный знак) позволяет указать, что в этом месте должен находиться ровно 1 любой символ, ни больше, ни меньше, пустая строка не подойдет. У тебя это как-то явно не прозвучало.

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

4. Полезно упомянуть, что в фильтре по перечислению системой рассматривается внутренний порядок значений (в этом порядке значения перечисления выводятся в лукапе), а не алфавитный порядок.

5. Полезно добавить рекомендацию, как сделать фильтр на пустое значение. Можно использовать "" или даже ". Это позволяет выбрать все пустые значения, а в числовых полях - нули. Фильтр на непустое значение (не 0 в числовых полях) выглядит как !"" или !".

6. Синтаксически ошибочные критерии игнорируются, например ! (отрицание без аргумента).

7. Полноценное логическое "И" мне сделать не удалось. Извращение с двойным отрицанием типа А,!!Б не проходит, второй критерий распознается как синтаксически ошибочный и игнорируется...

Спасибо, Андрей. Я дополнил текст про вопросительный знак и знаки < и >,

Подсказка по F1 при редактировании запроса в microsoft Axapta 3.0 Я не обновлял эту статью, поскольку в Microsoft Axapta 3.0 написан хороший хелп по поиску. Нажмите F1 когда указываете критерии в запросе, получите описание. Там все хорошо описано.

Комментарий: в Аксапте 3.0 описания и хелпы значительно улучшены, особенно в русской версии. Постарайтесь почитать описания к формам, посмотрите описания в "AOT\System Documentation" к функциям и системным классам. Там много нового.

Если задать критерий *"*, то Аксапта найдет все строчки с кавычками.

В скобках можно писать SQL выражения. На technet именно так рекомендуют делать выражения И. Например, ((datasource.field1 = Expr1) && (datasource.field2 = Expr2)). Например, чтобы получить все итоговые счета больше "50", в плане счетов можно указать критерий для счета ((accountnum>"5")&&(accountpltype=9)) Еще пример: ((accountnum>"5")||(accountnum <"1")).

Комментарий: В скобках можно использовать не все SQL-операторы сравнения, а только =, !=, >, >=, <, <=. Причем в сравниваемых выражениях не учитываются метасимволы *, % и т.п. Таким образом, задать Like в скобках не получится. Однако это не сильно мешает в реальной жизни, поскольку запись в скобках используется нечасто.

Комментарий: оба приведенных выше примера можно выразить нормальными критериями без скобок. При подготовке примеров, я нашел-таки выражение, которое без скобок я указать не смог.

(((accountnum>"5")&&(accountpltype=9))||((accountnum<"1")&&(accountpltype=3)))

Не думаю, что пользователи будут работать с подобными запросами. Если у пользователей возникает необходимость построить такой запрос, то, на мой взгляд, при настройке внедряльщики что то пропустили. Может быть, такие запросы будут использовать программисты?

 

07.10.03: Замечание от dn к SQL-выражениям.

Небольшая цитата из Best Practice (Advanced query range value expressions): "As the contents of the Query range value expressions should look like x++, you should be aware that you format the different data types correctly. Do not use strFmt or SysQuery::value/queryValue for this. In x++ you can use the global method date2StrXpp to format a date to the correct x++ format, and use for example int2str to convert an enumerated value to the suitable numeric format."

Согласен. Однако здесь ключевой фразой является "aware that you format ... data types correctly", а ключевым словом "correctly". Вопрос именно в том, какое поведение является корректным.

Вообще говоря, у разных типов в Аксапте можно явно указать региональные настройки. Кроме того, на разных компьютерах могут быть настроены разные региональные настройки. strfmt использует настройки из типа, а если в типе указано Auto, то берет настройки из локали windows на компьютере, где работает клиент.

Если ваши копьютеры рабтают в разных локалях (особенно, если региональные настройки на сервере AOS не совпадают с региональными настройками клиента), если вы хотите добиться, чтобы формат чисел/дат/времени не зависел от настроек локали, то действительно надо явно управлять преобразованием в строку. Если же для вас поведение Аксапты по умолчанию является корректным (а в подавляющем большинстве случае это именно так), то вполне можно пользоваться strfmt или SysQuery::value.

 

28.03.04: Дополнение от Glibs.

Символ \ (обратный слэш) экранирует следующий специальный символ. Если хочется найти строку, содержащую *, то в критерии надо указать \*.

 

Буду рад Вашим замечаниям и предложениям.
Мазуркин Сергей, mazzy@mazzy.ru