Титул
Создание простых приложений баз данных для одного или небольшой группы пользователей.
Программа распространяется абсолютно бесплатно.

Взаимодействие компонентов формы

Форма в DataExpress является сложным механизмом. Компоненты формы тесно взаимосвязаны друг с другом. Поля, списки, таблицы, запросы, табличная часть - все работает как одно целое. Между тем формы почти никак не взаимодействуют друг с другом. В этом нет особой необходимости, т. к. всю актуальную информацию можно получить из базы данных. Что же происходит в недрах формы? В какой последовательности вычисляются выражения? На эти вопросы я попытаюсь ответить в этой статье.

В программе форма представлена в виде закладки в различных представлениях. Кроме этого в интерфейсе широко используется открытие формы, связанной с объектом (в виде формы списка, формы записи), открытие формы, связанной с запросом или отчетом. За исключением некоторых нюансов работают они одинаково. Есть отличия в поведении подчиненных форм.

В процессе работы с формой происходит ряд ключевых событий: загрузка формы, загрузка данных, открытие формы, добавление/редактирование/удаление записи, перемещение на другую запись (скроллинг), обновление данных, обновление запросов, редактирование поля. Дальше будет рассказано, что делает программа во время этих событий.

Загрузка формы

1. В процессе загрузки происходит компиляция выражений в полях и надписях. Сюда входят выражения в свойствах: выражение, значение по умолчанию, проверка значения. Если во время компиляции в каком-то поле происходит ошибка, то появляется красный значок в углу формы и поле исключается из вычислений. (Значок вы можете и не увидеть, если форма в представлении "Только таблица". Для этого надо открыть форму записи.)

2. Применяются права доступа к полям формы: запрещенные для просмотра поля скрываются прямоугольником. На самом деле они никуда не деваются и участвуют в вычислениях в полной мере. Можно даже изменить такие поля из выражений.

3. Применяются права доступа к записям на добавление/изменение/удаление, если в правах четко указано (без условий) что можно, а что нельзя.

Пункты 1-3 повторяются для таблиц - дочерних форм.

Загрузка данных

После загрузки формы идет загрузка данных.

1. Формируется запрос к базе данных, который включает в себя условия выборки. Условие выборки формируется из нескольких составляющих: условия отбора, фильтра пользователя* и фильтра списка**. В запрос включаются абсолютно все поля формы (все до единого), в том числе изображения и файлы. Состав полей не зависит от настройки видимости столбцов в табличной части. Поэтому, если в базе много записей да еще и с увесистыми изображениями и файлами, хранящимися в самой базе, выборка может происходит медленно и съедать много оперативной памяти. Как это дело оптимизировать, будет рассказано в другой статье.

(*) Фильтр пользователя может быть заранее настроен в свойстве формы "Фильтры". Во время первоначальной загрузки первый пользовательский фильтр включается в выборку.
(**) Только для форм открываемых кнопкой объекта.

2. Срабатывает скроллинг.

3. Происходит обновление списков (списки, объекты, заметки).

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

Скроллинг

Событие скроллинга срабатывает сразу после загрузки данных и при перемещении по записям.

1. Загружаются данные таблиц из базы данных.

2. Загружаются изображения в отдельных потоках. Благодоря этому загрузка больших изображений происходит без "заморозки" интерфейса.

3. Обновляются списки, имеющие фильтр списка.

4. Обновляются запросы.

5. Вычисляются все выражения в надписях.

6. Выполняется проверка и применяются права доступа к записи и таблицам. Вычисляются условия редактирования и удаления текущей записи. Результат влияет на доступность команд редактирования.

Первые 2 пункта относятся только к основным формам, остальные для всех.

Добавление записи

1. Вычисляются значения по умолчанию. Если в процессе происходит ошибка, появляется красный значок в углу формы.

2. Определяется первый компонент в порядке перехода и ему передается фокус.

Изменение записи

Это относится к основным формам в сетевом многопользовательском режиме.

1. Программа проверяет не блокирована ли запись другим пользователем. Если блокирована, то выдается предупреждение и редактирование отменяется.

2. В случае успеха, программа проверяет не изменилась ли запись другим пользователем. Для этого она делает запрос к базе и вытягивает все поля записи, кроме изображений и файлов. Затем сравнивает с тем, что в кеше. Если изменения обнаружены, программа предлагает обновить данные формы. В проверку не попадают таблицы. Так что возможно, что программа "не заметит" изменений. Правда, если есть итоговые поля, то подобное маловероятно.

3. Если редактирование записи разрешено, то программа блокирует запись от изменений другими пользователями.

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

Сохранение записи

Данное событие может быть вызвано пользователем вручную: при нажатии на кнопку "Сохранить" или "ОК", или автоматически при скроллинге, переходе на другую закладку или при выборе какой-то команды.

1. Выполняется проверка ввода. Если проверка не пройдена, сохранение не выполняется.

2. Снимается блокировка с записи. Это относится к сетевому многопользовательскому режиму.

3. Обновляются все списки во всех формах, ссылающиеся на эту форму.

4. Вычисляются все итоговые поля и надписи родительской формы. В тексте выражений ищется подстрока вида 'имя формы', без учета регистра.

5. Выполняется проверка прав доступа к записи.

Пункты 1 и 2 относятся к родительским (основным) формам. Пункт 4 - только к дочерним формам.

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

Удаление записи

Это относится только к основным формам в сетевом многопользовательском режиме.

1. Проверка на блокировку. Если запись редактируется другим пользователем, выдается предупреждение и удаление отменяется.

2. Проверка на изменение. Если запись изменилась, то программа предлагает обновить данные формы. Вполне возможно, что новые изменения записи не позволят ее удалить.

3. Проверка на наличие ссылок на запись в базе данных. Если есть, то выдается предупреждение и удаление отменяется.

4. После удаления обновляются все списки во всех формах, ссылающиеся на текущую форму.

Обновление данных

1. Кэш формы очищается и данные загружаются снова (см. загрузка данных).

2. Обновляются все списки во всех формах, ссылающиеся на текущую форму.

Изменение поля

1. Обновляются списки с фильтрами, ссылающиеся на поле. В тексте фильтра ищется строка вида: [поле], [поле|, [:поле], [:поле|, [!поле], [!поле|.

2. Обновляются запросы, ссылающиеся на поле.

3. Вычисляются поля, ссылающиеся на поле. Это в свою очередь приводит к срабатыванию данного события в этих полях. Возникает цепная реакция.

4. Вычисляются надписи, ссылающиеся на поле. Изменение надписи может инициировать вычисления в других надписях, ссылающиеся на измененную надпись.

В текстах выражений ищется строка вида: [поле], [поле|, [:поле], [:поле|, [!поле], [!поле|. Если в процессе вычислений происходит ошибка, появляется красный значок в углу формы.

Открытие формы

Форма записи открывается при добавлении или изменении записи в режиме "Только таблица", при нажатии кнопки объекта, при редактировании записей в таблицах, запросах и отчетах. Форма открывается уже после загрузки формы, загрузки данных, скроллинга, добавления/редактирования записи.

Обновление запросов

Обновление запроса происходит при скроллинге и после добавления/изменения/удаления записи запроса. Если при обновлении происходит ошибка, то появляется красный значок. После обновления вычисляются все надписи, содержащие ссылку на запрос. В тексте выражений ищется подстрока вида: 'имя запроса'.

Обновление списков

Загрузка данных в список объекта производится не сразу. На момент загрузки данных список пуст. Однако текущее значение поля отображается, оно не зависит от содержимого списка. Данные загружаются в список в момент открытия списка или при вводе текста с клавиатуры и больше не загружаются ДО обновления. Когда происходит обновление списков, программа знает, что при открытии списка или вводе текста надо повторно загрузить данные. Такой алгоритм работы со списками позволяет комфортно работать с очень большими списками и быстро открывать форму, не дожидаясь полного заполнения всех списков. То же самое относится и к полю "Список", если указан источник списка.

Контакты

Техническая поддержка

Поддержать проект

VISA: 4036 7540 7191 2572
WebMoney: R031396282901