Содержание
Объект
Практически ни одна база данных не может обходиться без объектов. Объект связывает текущую форму с другой. Вместо того, чтобы постоянно вводить в форму повторяющиеся данные, вы можете выделить их в отдельную форму и просто проставлять ссылки. Например, вы можете постоянно вводить в форму одни и те же данные о клиенте (фио, адрес, телефон и т. п.) или создать отдельную форму Клиенты, в которой данные вводятся только один раз, а в других формах вы просто выбираете клиента из объекта. Форму с клиентами можно назвать справочником.
Благодаря объектам вы можете соединить данные связанных форм в единую таблицу и вывести их на печать или экран.
Несмотря на то, что вы видите в поле текст, фактически в базе хранится ссылка на запись связанной формы - ID записи. ID - это целое число.
Если в вашей базе есть несколько форм и нет объектов, то почти наверняка база данных спроектирована неправильно.
Кнопка объекта открывает связанную форму в виде окна списка, в котором вы можете найти нужную запись и выбрать ее, а также создать, отредактировать, удалить существующие. При открытии окна всегда происходит считывание данных из базы.
Объект поддерживает фильтрацию раскрываемого списка по введенному в поле тексту. Данные фильтруются по введенным фрагментам текста. Каждый фрагмент отделяется пробелом. Порядок фрагментов в отфильтрованных данных может быть разным, но обязательно наличие всех фрагментов. Например, вы вводите в поле «бум карт»: в результате могут быть: бумага цветная картонная, картонная бумага, картонная цветная бумага и т. д. Данные фильтруются по основному полю, а также по полям, включенных в поиск. Поиск по дополнительным полям работает только, если основное поле текстовое. Если поле имеет другой тип, то столбец Включить в поиск скрывается. При смене фокуса, если поле в режиме фильтрации, восстанавливается текст текущего элемента.
Связь с формой
Это свойство связывает текущую форму с другой. Объект будет показывать в списке данные выбранной формы, а именно те поля, которые выбраны в Поле (основное поле) и Дополнительные поля в списке.
Вы можете настроить ширину столбцов в списке. Если ширина столбца равна 0, то она будет вычислена автоматически. Ширина основного поля также вычисляется автоматически.
Параметр «Расширить список на» позволяет прибавить к ширине раскрываемого списка N пикселей. Возможно это потребуется, если компонент слишком узкий, а в раскрываемом списке данные не помещаются.
При изменении содержимого поля включается фильтрация и открывается список с найденными записями. Введенные фрагменты подсвечиваются. После выбора элемента список закрывается и фильтрация отключается. Если после этого снова открыть список (кнопкой или клавишей Вниз), то откроется полный список.
Если выбрана опция «Скрыть список», то ввод данных вручную в поле будет невозможен. Значения можно будет выбрать из справочника. Если скрыты и список, и кнопка, то в поле нельзя изменить значение вручную. Это может понадобиться, если между формами есть постоянная связь.
Опция «При наличии дерева в окне списка» как часто будет обновляться дерево, расположенное в окне списка. По умолчанию, дерево обновляется только при первом показе окна. Можно настроить, чтобы дерево обновлялось при каждом показе окна. Это имеет смысл, если дерево меняется часто или для объекта задан фильтр.
Источник списка
По умолчанию, источником данных выпадающего списка является форма. Вы можете выбрать в качестве источника данных запрос. Нажмите кнопку «Дополнительно», чтобы открыть окно настроек источника списка.
Обязательно нужно указать ключевое поле и основное поле списка. Ключевое поле - это любое числовое поле. Значение ключевого поля должно совпадать с ID записи связанной формы. Основное поле списка должно быть первым в списке. Значение этого поля должно совпадать с полем связанной формы.
Любое поле можно включить в поиск и список будет фильтроваться по введенным фрагментам текста независимо от типа поля.
Автоматическая фильтрация работает только если запрос не в режиме SQL. Если запрос в режиме SQL, то позаботиться о фильтрация придется вам. (Специально для этого случая была добавлена функция TypedText, которая возвращает вводимый текст.) В этом случае флажок «Включить в поиск» просто включает или отключает подсветку текста.
Примечание:
- Источник списка действует только на выпадающий список. Если нажать на кнопку объекта, будет открыта связанная форма.
- Для источника списка свойство «Фильтр» не имеет значения. Он нужен только для кнопки.
- Несмотря на то, что в поиск можно включить вычисляемые поля, данные по ним не фильтруются, работает только подсветка текста. Хотя вы можете фильтровать и по вычисляемым полям в выходном фильтре запроса.
- Включите в запросе свойство «Обновлять вручную», чтобы избежать лишних запросов к базе.
Управление списком с клавиатуры
С помощью клавиш можно управлять списком. Клавиши при активном поле:
Символ - включается фильтрация и открывается список с найденными записями;
Вниз - открыть список;
Esc - закрыть список или восстановить исходное значение, если список закрыт;
Enter - если список открыт, то выбрать выделенный элемент списка, или восстановить исходное значение, если список закрыт;
Shift-Enter - открыть справочник;
Клавиши при активном списке:
Enter - выбрать элемент;
Esc - закрыть список;
Символ, Влево, Вправо, Backspace, Delete, Tab - активировать поле, не закрывая список;
Вставить значение
Бывает возникает потребность вставить некоторые данные из справочника в поля для последующего редактирования. Например, это может быть цена, взятая из справочника товаров. У объекта есть свойство Вставить значения. Нужно сопоставить поля объекта с полями формы. Поля должны быть совместимыми друг с другом. Например, нельзя сопоставить число и текст.
Заполнить таблицу
Это свойство позволяет настроить копирование одной таблицы в другую при выборе объекта. В качестве источника выбирается таблица формы, на которую ссылается объект. В качестве целевой таблицы выбирается таблица текущей формы. Фильтр позволяет копировать только нужные записи из таблицы-источника.
Фильтр таблицы-источник
Это логическое выражение применяется к записям таблицы-источника. Если результат выражения «Истина», то запись копируется в целевую таблицу. Обращаться к полям родительской формы таблицы-источника нельзя.
Вставка значений по-умолчанию
Когда вы добавляете новую запись, некоторые поля могут быть заполнены значениями по умолчанию. При составлении выражения для объекта нужно помнить, что в объекте хранится ID-записи. Примеры выражений:
objid('Сотрудники', 'Логин', user) objid('Склады', 'Название', 'Склад № 1') objid('Склады', 'Название', 'Склад № 1')
Фильтр
Когда вы задаете источник списка для объекта, списка или заметки, может возникнуть необходимость как-то ограничить набор значений, выводимых списком. Для этого используется свойство «фильтр».
Все нижеописанное про фильтр относится к запросам, отчетам, объектам, спискам, заметкам, условию отбора.
Фильтр записывается в виде простого текста, напоминающего логическое выражение. Например:
[!Статус]='Выдано' | [!Статус]='Готово'
Помните, что несмотря на сходство с выражениями, фильтр составляется по следующим правилам. Слева пишется поле формы-источника, затем операция сравнения (=, <>, < и т. д.), затем выражение. Условия могут соединятся логическими операциями & - И, | - ИЛИ. Если в самом выражении есть символы & и |, то выражение должно браться в круглые скобки.
В фильтре запроса и отчета в качестве поля источника может быть поле родительской или подчиненной формы. Поля родительской формы обозначаются восклицательным знаком перед именем поля, поля подчиненной формы записываются без восклицательного знака. В условии отбора и фильтре списков возможно обращение только к основной форме. при этом наличие восклицательного знака перед именем поля значения не имеет. Если поле источника является объектом, то можно обратиться к полю объекта. Глубина вложений объектов не ограничена. Например:
[!счет|закрыт]=0
Операции сравнения применяются те же, что и в выражениях, плюс добавляется еще несколько операций, которые можно использовать только в фильтрах (==, #, in, notin - о них чуть ниже).
Операции =, <>, >, >=, <, <= допустимо применять к числовым полям, дате, времени, флажкам. К тексту допустимо применять все операции сравнения. К объектам применяются операции =, <>. Операции in и notin можно применять к полям любых типов. Ниже в таблице наглядно показано какие операции допустимо применять к полям разных типов.
Тип поля | = | <> | > | >= | < | <= | == | # | in | notin |
---|---|---|---|---|---|---|---|---|---|---|
Число | * | * | * | * | * | * | * | * | ||
Дата | * | * | * | * | * | * | * | * | ||
Время | * | * | * | * | * | * | * | * | ||
Счетчик | * | * | * | * | * | * | * | * | ||
Флажок | * | * | * | * | * | * | * | * | ||
Объект | * | * | * | * | ||||||
Текст | * | * | * | * | * | * | * | * | * | * |
Заметка | * | * | * | * | * | * | * | * | * | * |
Список | * | * | * | * | * | * | * | * | * | * |
Изображение | * | * | * | * | * | * | * | * | * | * |
Файл | * | * | * | * | * | * | * | * | * | * |
Глядя на таблицу, можно заметить, что для файлов и изображений применимы те же операции, что и для текстовых полей. Это связано с тем, что файлы и изображения в фильтре рассматриваются как текстовые поля. Но на самом деле программа ищет не в самих файлах, а в дополнительных полях, которые связаны с файлами и изображениями. Так для файлов, это поле на форме, куда вставляется имя файла, когда вы выбираете файл. Для изображений - это поле, которое хранит исходное расположение файла изображения.
Думаю, нет смысла останавливаться на стандартных операциях сравнения, они достаточно очевидны. Давайте рассмотрим дополнительные операции, которые доступны только в фильтрах.
Операция ==
Операция ==
применяется для поиска записей, в которых встречается указанный фрагмент текста. Указанный фрагмент может быть в начале, в конце, в середине текста, причем регистр не имеет значения. Например, ищем записи, в которых поле «комментарий» содержит текст «позвонить»:
[!Комментарий]=='позвонить'
Это вполне может быть поле объекта:
[Товар|Наименование]=='samsung'
Операция #
Операция #
противоположна операции ==
. Этот знак говорит программе найти все записи с текстом, в котором не содержится указанный фрагмент.
Операция in
Операция in
позволяет искать все записи, содержащие значения из списка. Список задается в виде текста, значения разделяются точкой с запятой. Например:
[!статус] in 'Новый;в работе;готов'
Будут найдены все записи, в которых поле «статус» равен или «Новый», или «В работе», или «Готово». Данный фильтр аналогичен следующему фильтру:
[!статус]="Новый" | [!статус]="В работе" | [!статус]="Готов"
Но есть и существенное отличие - операция in
не чувствительна к регистру символов. Кроме того, операция in
позволяет сравнивать с произвольным набором значений. Например, список значений может быть задан в каком-нибудь поле:
[Товар|Группа] in [выбранные группы]
Операцию in
можно использовать не только для текстовых полей, но и для объектов, чисел, дат и любых других типов полей. Значения также задаются в виде текста и отделяются точкой с запятой. Например:
[!объект] in "4;6;12;553;73;;99" [!дата] in "01.02.2021;01.03.2021;01.04.2021" [!время] in "10:00;12:00;14:00;16:00"
Среди значений могут присутствовать пустые значения (как в первой строчке примера) - они интерпретируются как Null. Если весь список состоит из пустых значений или не содержит значений вообще, то значением будет считаться Null.
Практическое применение операции in
В простых формах для фильтрации по произвольному набору значений можно использовать связку: таблица - поле - MERGE (MERGEX) - in. Т. е. добавляете таблицу. В таблицу добавляете поле того же типа, что и поле, по которому фильтруются данные (хотя тип необязательно должен совпадать). Например, пусть это будет объект «Группа». В родительскую форму вставляете текстовое поле «Выбранные группы» и пишите выражение:
MERGEX('таблица', '[группа]', ';')
В фильтре пишите:
[Товар|Группа] in [выбранные группы]
Еще можно использовать заметку с настроенным источником. Здесь еще проще. Вставляете заметку, указываете форму-источник, меняете разделитель на ;
(без пробелов), указываете заметку в фильтре:
[Товар|Группа|Наименование] in [Заметка]
Но заметка не позволяет фильтровать по объектам, также запрос будет реагировать на изменения в заметке, только после выхода из нее.
Операция NotIn
Операция notin
противоположна операции in
- будут найдены все записи, за исключением записей с перечисленными значениями.
Фильтрация значений Null
Значение Null может быть задано в фильтре в явном виде или являться результатом вычисления выражений. Любая операция сравнения с Null будет аналогична операции =
, кроме операций #
и notin
- они будут аналогичны операции <>
. Например, если задан такой фильтр:
[число]>=Null
то будут отобраны все записи со значением Null. Еще пример:
[статус] in [заметка]
Если поле «заметка» пустое (т. е. равно Null), то будут отобраны все записи с пустым полем «статус».
Необязательные поля в фильтре
В фильтрах можно использовать необязательные поля. Если значение такого поля равно Null, то оно исключается из фильтра. Для этого перед именем поля ставится ?
(вопросительный знак). Например:
[?!клиент]=getvar('заказчик') & [!статус]='Готово'
Если переменная «заказчик» равна Null, то условие исключается из выражения.
Изменение приоритета условий фильтра
Условия фильтра можно брать в фигурные скобки, чтобы изменить их приоритет. Например:
{[!устройство]='Принтер' | [!устройство]=null} & {[!марка]='Canon' | [!марка]=null}
Логическая операция |
имеет более низкий приоритет, чем операция &
, поэтому условия надо взять в фигурные скобки.
Ошибки фильтра
В процессе анализа фильтра могут быть найдены следующие ошибки:
Ошибка | Описание |
Поле источника не найдено | Программа не может найти указанное поле в форме-источнике. Проверьте правильность ввода имени поля. |
Ожидается поле источника | Ошибка возникает, когда не соблюдаются правила написания фильтра. Часто начинающие разработчики путают фильтр с обычным выражением и пишут слева от операции сравнения выражение (например, функцию), а должно быть поле формы-источника. |
Неверная операция сравнения | Допустимы следующие операции сравнения: = <> < <= > >= == #. |
Ожидается операция сравнения | Не соблюден синтаксис написания фильтра. После поля источника программа ожидает операцию сравнения. |
Выражение не распознано | Выражение (справа от операции сравнения) содержит недопустимые символы. |
Ошибка в выражении | Выражение содержит какую-то ошибку (программа сообщает какую именно). |
Тип поля формы-источника не совместим с типом результата вычисления выражения | Убедитесь, что тип поля формы-источника совпадает с типом результата вычисления выражения. Например, ошибка возникнет, если попытаться сравнить поле «объект» с текстом. |
Ожидается логическая операция | Пропущена логическая операция между двумя условиями фильтра. |
Ожидается символ { | Пропущена одна или более фигурных скобок {. Ошибка возникает, когда число закрывающих фигурных скобок } больше чем открывающих. |
Ожидается символ } | Пропущена одна или более фигурных скобок }. Ошибка возникает, когда число открывающих фигурных скобок { больше чем закрывающих. |
Недопустимое поле источника | В качестве поля-источника нельзя использовать изображение, файл и поле объекта (компонент). |