DB.SelectEx

From SunFlurry wiki
Revision as of 08:43, 7 February 2021 by Admin (talk | contribs) (1 revision imported)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
  SelectEx (Выборка объектов)
Объект:Объект базы данных
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Сервер и БД
Исключения:Ошибка в фильтрах, невозможно превратить в число, строку
Визуальность:Нет

Функция инициирует выборку по таблице текущего объекта с учетом указанных фильтров, и возвращает 1, если в выборке есть объекты. Для получения следующего объекта выборки необходимо использовать функцию Next, новый объект помещается в текущий, все изменения в текущем объекте будут утеряны. Полнота загрузки полученного объекта, будет определяться режимом загрузки. Функцию удобно использовать для ускорения выборки, когда не все объекты требуют загрузки, либо совместно со сборщиком объектов. Выборку можно осуществлять только для объектов типа справочник, документ, журнал. Выборка происходит по порядку сортировки, заданному функцией UseOrder и использует ограничение, заданное функцией UseBorders. При загрузке объекта в режиме полной загрузки (режим 0), работают правила, заданные функцией UseOption. При использовании сортировки, отличной от сортировки по умолчанию, режимы загрузки только заголовков (1) или выборки без загрузки (3), будут исправлены на режим частичной загрузки (2), так как для получения граничных условий при загрузке порциями необходимы значения реквизитов сортировки. Функция не получает все объекты, соответствующие фильтру сразу, а запрашивает их порциями с сервера, таким образом не затрачивая большое количество памяти даже для объектов, имеющих большие количество реквизитов. Если используются режимы загрузки, отличные от нуля, потребность в памяти еще больше уменьшается и скорость получения данных с сервера увеличивается. Функцию удобно использовать совместно со сборщиком объектов.

Синтаксис

DB.SelectEx(<Режим загрузки (INT)>=0,<Доп. реквизиты при загрузке заголовков (STRING)>="",<Стандарные фильтры>...):<В выборке есть по крайней мере один элемент (INT)>

Аргументы

  • <Режим загрузки (INT)> - (необязательный аргумент) Определяет способ (полноту) загрузки объектов выборки (см. Объект базы данных). Аргумент может принимать следующие значения:
    • 0 (по умолчанию) -- производится полная загрузка объектов выборки.
    • 1 -- производится выборка объектов в режиме только заголовка.
    • 2 -- производится выборка объектов в режиме частичной загрузки. Второй аргумент используется, как список реквизитов для загрузки.
    • 3 -- объекты будут позиционированы, но не будут загружены.
  • <Доп. реквизиты при загрузке заголовков (STRING)> - (необязательный аргумент) Список наименований дополнительных реквизитов при выборке объектов в режиме частичной загрузки (2).
  • <Стандартные фильтры> - (необязательный аргумент) Стандартные фильтры позиционирования описаны в статье Стандартные фильтры.

Возвращаемое значение

Возвращается 1, если в выборке присутствует по крайней мере один объект, иначе возвращает 0.

Примеры

//Пример из функции Select, с более быстрой выборкой за счет запроса в режиме частичной загрузки
//Пример производит выборку по подчиненному справочнику ЛицензииКонтрагентов, чтобы найти самую свежую лицензию из диапазона дат НачДата..КонДата.
аДата:=0;
аЭл:=Ref.ЛицензииКонтрагентов;
//Выбрать не удаленные элементы подчиненные элементу зК, запрос будет содержать только перечисленные реквизиты
//  для справочников с большим количеством реквизитов это сильно ускоряет запрос и выборку
аЭл.SelectEx(2,"ТипЛицензии,ДатаВыдачиЛицензии,ДатаНачалаДействияЛицензии,ДатаОкончанияДействияЛицензии","@Parent,@Status",зК,0);
аРез:=0;
While аЭл.Next() Do
  If (аЭл.ТипЛицензии<>Enum.ТипыЛицензий.АлкогольнаяРозничная)And(аЭл.ТипЛицензии<>Enum.ТипыЛицензий.АлкогольнаяОптовая) Then
    Continue;
  EndIf;
      
  If (аЭл.ДатаВыдачиЛицензии<=КонДата)And(аЭл.ДатаНачалаДействияЛицензии<=КонДата)And(аЭл.ДатаОкончанияДействияЛицензии>=НачДата) Then
    If _Or(аДата=0,аДата<аЭл.ДатаОкончанияДействияЛицензии) Then
      аДата:=аЭл.ДатаОкончанияДействияЛицензии;
      //ВАЖНО: результат должен быть копией текущего объекта аЭл, 
      //       так как иначе он будет изменен в момент, когда текущий объект аЭл будет загружен заново при выполнении аЭл.Next()
      аРез:=аЭл.Copy();
    EndIf;
  EndIf;
EndDo;