8. Набор данных формы

Открытие набора данных формы

Если форма создается программой, то набор данных открывается автоматически. Если форма создается в скрипте, то открывать надо самостоятельно. Для этого можно воспользоваться одним из следующих методов: Open, OpenRecords и OpenRecord.

Open

Open - открывает набор данных с учетом установок фильтра формы, пользовательского фильтра и условия отбора. По умолчанию установки фильтра формы соответствуют предустановкам фильтра (см. свойство формы "Предустановки фильтра"), условия отбора учитываются (т. е. каждый пользователь видит только свои данные), пользовательский фильтр неопределен. Такие настройки используются самой программой при чтении данных из базы. Если предустановки фильтра неопределены и нет условий отбора, то будут прочитаны все данные.

За фильтр формы отвечает свойство формы Filter: TFilterObject, за пользовательский фильтр - CustomFilter: String, учитывать условия отбора или нет - UseSelectionCondition: Boolean.

Метод (и последующие OpenRecords, OpenRecord) вызывают следующие события:

  • OnBeforeOpen – событие до открытия набора данных;
  • OnAfterOpen – событие после открытия набора данных;
  • OnAfterScroll - событие перемещения на запись даже если нет записей.

OpenRecords

OpenRecords(const CustomFilter: String; CustomFilterForm: TdxForm; SelectCondition: Boolean) – загружает набор записей, определенный фильтром CustomFilter. Фильтр представляет собой выражение, аналогичное выражениям фильтра списка, фильтра источника или условия отбора (см. условия отбора записей). Имя поля формы-источника указывается в квадратных скобках. Операция сравнения: =|<>|<|⇐|>|>=|==|#. Выражение – полноценное выражение. В выражении можно обращаться к полям формы CustomFilterForm, которая указана во втором параметре метода. Если в выражении нет полей, то во втором параметре метода указывается nil. Пример:

Self.OpenRecords('[Дата]>="02.03.2016" & [Дата]<=Date', nil, False);
AnyForm.OpenRecords('[Дата]>=[Начальная дата] & [Дата]<=[Конечная дата]', Self, False);

Если выражение содержит знаки & или |, то выражение берется в скобки:

Self.OpenRecords('[название]=("Tom & Jerry") | [название]="Ну, погоди!"', nil, True);

Третий параметр определяет, будет ли учитываться условие отбора, заданное для этой формы в настройках роли. True – условие отбора учитывается, т. е. к указанному фильтру будет добавляться (операцией AND) условие отбора. Более подробную информацию об условии отбора читайте в справке в разделе Управление доступом-Условие отбора.

На самом деле вызов метода OpenRecords аналогичен вызову метода Open, с установкой свойств формы соответственно CustomFilter, CustomFilterForm, UseSelectionCondition. При этом фильтр формы Form очищается.

OpenRecord

OpenRecord(RecId: Integer) – загружает одну запись с определенным Id. Используется также для добавления записей:

...
Fm := TdxForm.Create('Заявки');
Fm.OpenRecord(0); // Открываем пустой набор данных для добавления записей
Fm.Append;
…
Fm.Post;

Вместо 0 может быть любой несуществующий ID записи.

Закрытие набора данных

Набор данных закрывается методом Close. Обычно это необходимо делать, когда вы создаете форму в скрипте, чтобы освободить занятую оперативную память. Метод вызывает события

  • OnBeforeClose - событие до закрытия набора данных;
  • OnAfterClose – событие после закрытия набора данных.

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

Определение количества записей в форме (RecordCount)

Метод RecordCount возвращает количество загруженных в набор данных записей. Однако стоит иметь в виду, что данные загружаются из базы не все, а порциями по мере надобности. Таким образом сразу после загрузки данных RecordCount может вернут, к примеру, 100 записей. Но при переходе на 100-ю запись подгружается еще порция данных, получается уже 200, и т. д. Чтобы определить реальное количество загружаемых записей, нужно вызвать метод MoveLast. Метод MoveLast способствует загрузке всего набора записей.

Обновление данных формы (Refresh)

Метод Refresh обновляет данные формы. Она последовательно вызывает Close и Open (!). Не вызывайте это метод, если набор данных был открыт методом OpenRecord, иначе в наборе данных будут уже не те записи, а записи соответствующие установленным фильтрам.