Временная таблица базы данных

From SunFlurry wiki
Jump to: navigation, search
  TempDB (Временная таблица базы данных)
Статус разработки: Реализован
Создание объекта: Create

Объект временная таблица базы данных может использоваться для создания выгрузок во внешние источники больших объемов данных, полученных из нескольких объектов базы данных и объединенных сложным образом. Также любая выгрузка или обработка, оперирующая данными, которая проходит без участия пользователя (консольный клиент), имеющая потенциально большой объем информации, может быть написана с использованием временных таблиц баз данных вместо запросов баз данных. Работа с информацией с помощью временных таблиц сильно отличается от таковой при работе с запросами. Основное отличие заключается в том, что временные таблицы всегда хранятся на сервере базы данных и получение информации из них происходит в последний момент, когда все или большинство операций преобразования информации уже выполнено. Таблицы не хранятся в памяти машины текущего клиента, и информация доставляется до программы с помощью выборки по несколько записей одновременно, это позволяет использовать таблицы для преобразования информации неограниченного объема. Однако, работа с таблицами происходит с помощью наборов данных, а не выборкой по каждой записи, как это обычно делается программно при обработке результатов запроса, это может усложнить написание программы, и сделать ее более сложной для понимания. При использовании временных таблиц для вывода информации на экран, удобно пропускать получаемые данных через сборщик объектов, это позволит ускорить вывод и сэкономить память. См. также статью Оптимизация отчетов и обработок.

Плюсы при использовании временных таблиц баз данных:

  • Работа с данными неограниченного объема.
  • Значительное ускорение процесса обработки по сравнению с запросами в случаях, когда вычисления можно выполнить с помощью наборов данных.

Минусы использования временных таблиц баз данных:

  • Некоторое увеличение нагрузки на сервер баз данных (увеличение расхода памяти и объема записи на диск).
  • Значительное усложнение читабельности программного текста по сравнению с запросами.
  • Усложнение написания программного текста за счет другой идеологии обработки информации.
  • Замедление процесса обработки по сравнению с запросами в случаях, когда вычисления невозможно выполнить с помощью наборов данных, так как выборка данных временных таблиц происходит медленнее, чем получение всех данных запроса одновременно.

Формулы при вычислении полей записей временной таблицы базы данных

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

  • В формулах разрешается использование всех операторов и функций языка запросов (см. Список операторов и функций языка запроса), кроме агрегатных функций для работы с сальдо накопителей (Income, Expence, BegTotals, EndTotals, BegTotalsT, EndTotalsT), данная возможность планируется.
  • Использовании пути и приведение типов данных для путей типов данных (см. Выражения и задание переменной в виде пути к реквизиту) разрешено. Если выражение указывает на периодический реквизит, также как и в случае с запросами, необходимо задать дату получения его значения с помощью конструкции <Путь и наименование реквизита>(<Дата реквизита>). Все особые реквизиты по-прежнему работают как при их использовании в запросе, однако, есть исключение для особых реквизитов @ELEMENT и @HEADER применимо к запросам к строчным частям объектов.
    • @ELEMENT -- задает внутренний код строки строчной части объекта (не на сам элемент, которому принадлежит строчная часть, как это происходит в запросах)
    • @HEADER -- задает элемент, которому принадлежит текущая строка строчной части (тождественно тому, как это происходит в запросах)
  • При указании на столбцы временной таблицы, доступно специальное наименование @ID, являющееся уникальным идентификатором записи. Такие идентификаторы содержат числовые значения и присутствуют в любой временной таблице. Использовать их можно, к примеру, в случае получения данных из таблицы с помощью функции Unload, изменения их каким-либо образом, затем сопоставлением с оригинальными записями таблицы.
  • Так как при работе с временными таблицами базы данных нет возможности определения дополнительных переменных в формулах запроса, задание пути и адресация реквизитов возможны непосредственно после указания полей текущей временной таблицы, реквизитов адресуемого объекта базы данных или полей другой адресуемой временной таблицы. Путь можно начинать задавать непосредственно после указания на поле. К примеру, если в текущей таблице существует поле (столбец) с наименованием Номенклатура, который был задан, как тип данных DB и нам необходимо с помощью фильтра выбрать только те записи временной таблицы, поле Номенклатура которых содержит номенклатуру с реквизитом ТоварнаяГруппа, значение которого, входит в список спТоварныеГруппы, можно задать для фильтра следующее логическое выражение: Номенклатура..Ref.Номенклатура.ТоварнаяГруппа IN спТоварныеГруппы. Приведение типа здесь используется, так как тип данных столбца определен таким образом, что система не знает, ссылки на какой объект в нем хранятся (DB).
  • Функции агрегации (AVG, MAX, MIN, SUM, COUNT) применимы только в случае выполнения агрегатных запросов, к примеру, в функции LoadFrom. Однако, по умолчанию всегда выполняется обычный запрос, для использования запросов агрегации необходимо дополнительное указание на тип запроса.
  • При работе с наименованиями внешних переменных, полями временной таблицы базы данных, а также наименованиями реквизитов объектов базы данных, может получиться ситуация неопределенной адресации (ambiguity), когда наименования поля и реквизита совпадают, для таких случаев для указания на источник наименования предусмотрен особый префикс (особенно это важно для функции LoadFrom, которая оперирует дополнительным источником данных, который может быть не только объектом базы данных, но и другой временной таблицей базы данных). Система ищет объект наименования в следующей приоритетной последовательности:
    • Поиск реквизитов объектов базы данных с указанным наименованием, либо наименований полей другой временной таблицы базы данных (см. LoadFrom).
    • Поиск наименований полей текущей временной таблицы базы данных. Если необходимо форсировать указание на то, что данное наименование это имя поля текущей временной таблицы, для него можно использовать префикс : (пример: :ИмяПоляТаблицы).
    • Поиск наименований внешних переменных языка или констант языка. Если необходимо форсировать указание на то, что данное наименование это имя внешней переменной или константы, для него можно использовать префикс :: (пример: ::aList).

Пример синергичной работы сборщика объектов и временной таблицы базы данных

//Пример показывает рабочий цикл с объектами из временной таблицы, используя сборщик объектов для уменьшения расхода памяти
//MainTab -- визуальная таблица, в которую будут копироваться результаты обработки временной таблицы БД

//Создание сборщика объектов
ObjC:=ObjectCollector.Create();

MainTab.Lock();
Try
  //Очистка визуальной таблицы
  MainTab.ClearLines();

  //Создание и загрузка сложной временной таблицы БД, детали загрузки не имеют особого значения для нашего примера
  аТемп:=TempDB.Create("зДок:DB,зЗад:DB,зВып:DB,зДата:DATE,зНомерСтроки:NUMBER.10,Номенклатура:DB,Смена:DB,Работники:STRING.200,Количество:NUMBER.15.5");
  аТемп.LoadFrom("Doc.РегистрацияВыпускаПродукции.Содержание","@HEADER->зДок,@HEADER.DocDate->зДата,@HEADER.ВыпускПродукции->зВып,@HEADER.ВыпускПродукции..Doc.ВыпускПродукции.ДокОснование->зЗад,"+
    "@LINE->зНомерСтроки,Материал->Номенклатура,КоличествоОпераций->Количество,Работники->Работники,Смена->Смена",
    "ТипЗаписи=1","not isEmpty(@HEADER.ВыпускПродукции)","IsType(@HEADER.ВыпускПродукции,Doc.ВыпускПродукции)");

  Всего:=аТемп.Size();
  aNum:=0;
  аТемп.Select("зВып+,зДата+,зДок+,зНомерСтроки+");
  While аТемп.Next() Do
    aNum:=aNum+1;
    If aNum%20=0 Then
      Form.StatusText("Обработано строк: "+aNum+" из "+Всего);
    EndIf;
    зНом:=ObjC.Get(аТемп.Номенклатура);
    зЗад:=ObjC.Get(аТемп.зЗад);
    зВып:=ObjC.Get(аТемп.зВып);
    зДок:=ObjC.Get(аТемп.зДок);
    MainTab.AddLine("Документ,Номенклатура,Ед,Количество,Смена,зДок,НомСтр,зВып,зЗад,Работники,Индекс",зЗад.DocNum+" от "+зЗад.DocDate,зНом,ObjC.Get(зНом.базЕдиница),аТемп.Количество,
      ObjC.Get(аТемп.Смена),зДок,аТемп.зНомерСтроки,зВып,зЗад,ПолучитьСписокРаботников(Trim(аТемп.Работники),ТРаботники),зДок.DocNum+"@"+зДок.DocDate+"@"+аТемп.зНомерСтроки);
  EndDo;
  MassLoadObjects(MainTab);
Finally
  MainTab.Unlock();
EndTry;
Form.MainTab.SetFocus();

Атрибуты и функции

Идентификатор Статус Тип Визуальная Параметры Описание
Create Реализована Функция TempDB.Create(<Наименования столбцов с типами данных (STRING)>):<Новый объект (TEMPDB)> Функция создает новый объект временной таблицы базы данных с заданными столбцами и их типами данных, если это необходимо.
LoadFrom Реализована Функция TempDB.LoadFrom(<Источник данных (DB,STRING,TEMPDB)>,<Формулы для вычисления столбцов (STRING)>,<Стандартные фильтры>...) Функция выполняет загрузку записей из указанного источника данных (таблицы объекта проекта или другой временной таблицы базы данных), при этом указанные столбцы таблицы заполняются требуемым образом. Запрос к источнику базы данных может быть выполнен с использованием агрегации или без оной. Если выполняется запрос агрегации, для вычисления столбцов возможно применять функции агрегации.
Update Реализована Функция TempDB.Update(<Источник данных (STRING,TEMPDB)>,<Формулы для вычисления столбцов (STRING)>,<Стандартные фильтры>...) Функция выполняет групповые вычисления и обновления указанных столбцов указанным образом, при этом можно использовать дополнительный источник данных для вычисления значений столбцов. Источником может быть указание на объект базы данных проекта или другая временная таблица базы данных.
AddColumns Реализована Функция TempDB.AddColumns(<Наименования столбцов с типами данных (STRING)>) Функция добавляет указанные столбцы к существующей временной таблице базы данных.
RemoveColumns Реализована Функция TempDB.RemoveColumns(<Наименования столбцов (STRING)>) Функция удаляет указанные столбцы из существующей временной таблицы базы данных.
AddLine Планируется Функция TempDB.AddLine(<Наименования столбцов (STRING)>,<Значение столбца 1>,<Значение столбца 2>...) Функция добавляет одну запись к временной таблице базы данных. В записи заполняются указанные столбцы.
Size, SizeL Реализована Функция TempDB.Size(<Стандартные фильтры>...):<Количество записей (INT)> Функция возвращает количество записей, входящих в указанных фильтр
SizeC Реализована Функция TempDB.SizeC():<Количество столбцов (INT)> Функция возвращает количество столбцов в текущей временной таблице базы данных.
GetColumnName Реализована Функция TempDB.GetColumnName(<Индекс столбца (INT)>):<Наименование столбца (STRING)> Функция возвращает наименование столбца по его индексу
GetColumnIndex Реализована Функция TempDB.GetColumnIndex(<Наименование столбца (STRING)>):<Индекс столбца (INT)> Функция возвращает индекс столбца по его наименованию. Если столбца с указанным именем не существует, функция возвращает 0.
GetColumnDataType Реализована Функция TempDB.GetColumnDataType(<Наименование или индекс столбца (INT,STRING)>):<Тип данных столбца (STRING)> Функция возвращает тип данных столбца, заданный во время добавления столбца в таблицу.
GetColumnFlags Реализована Функция TempDB.GetColumnFlags(<Наименование или индекс столбца (INT,STRING)>):<Дополнительные флаги столбца (STRING)> Функция возвращает совокупность дополнительных флагов столбца (в данный момент "I" -- столбец индексируется, "U" -- текст столбца имеет кодировку UTF-16), заданных во время добавления столбца в таблицу.
SetColumnName Реализована Функция TempDB.SetColumnName(<Индекс столбца (INT)>,<Наименование столбца (STRING)>) Функция изменяет наименование столбца, заданного его индексом.
Remove Реализована Функция TempDB.Remove(<Стандартные фильтры>...) Функция удаляет из временной таблицы базы данных записи, входящие в фильтр.
Upload, CopyFrom Реализована Функция TempDB.Upload(<Источник данных (TAB,LIST)>,<Наименования столбцов для загрузки (STRING)>,<Наименования столбцов для фильтрации (STRING)>,<Фильтр столбца 1>,<Фильтр столбца 2>...) Функция добавляет в текущую временную таблицу базы данных информацию из таблицы значений или списка значений. При использовании списка, значения добавляются в указанный во втором аргументе столбец таблицы, при использовании таблицы значений, указанные во втором аргументе наименования столбцов таблицы должны соответствовать наименованиям столбцов временной таблицы базы данных.
Unload, CopyTo Реализована Функция TempDB.Unload(<Объект в который происходит копирование>,<Наименования столбцов для копирования (STRING)>,<Стандартные фильтры>...) Функция осуществляет загрузку записей из временной таблицы базы данных в список значений или таблицу значений. Записи отбираются с помощью фильтра. При загрузке в список значений, указывается столбец загрузки, при загрузке в таблицу, указывает список столбцов, если соответствующий столбец в таблице отсутствует, он будет создан. Объекты базы данных в таблице значений или списке будут незагруженными.
Select Реализована Функция TempDB.Select(<Наименования столбцов сортировки с направлением сортировки (STRING)>,<Стандартные фильтры>...):<Найдена по крайней мере одна запись (INT)> Функция открывает выборку записей из временной таблицы базы данных. К выборке применяется заданный фильтр, записи сортируются в соответствии с заданным направлением сортировки. При сортировке объектов базы данных нужно учитывать, что сортировка на сервере осуществляется только по внутреннему коду базы данных, а не по реквизиту сортировки объекта. Чтобы осуществить сортировку по требуемому реквизиту сортировки (к примеру, по наименованию или по дате документа), необходимо добавить столбец в таблицу и заполнить его значением требуемого реквизита и осуществлять сортировку по новому столбцу.
Next Реализована Функция TempDB.Next():<Найдена и загружена следующая запись (INT)> Функция получает следующую запись выгрузки, открытой ранее с помощью функции Select. Запись загружается во внутренний буфер объекта, столбцы будут доступны по наименованию или с помощью функции Get.
PeekNext Реализована Функция TempDB.PeekNext():<Найдена и загружена следующая запись (INT)> Функция получает следующую запись выгрузки, открытой ранее с помощью функции Select, однако, шаг курсора не происходит, поэтому следующий вызов функции Next вернет эту же самую запись. Запись загружается во внутренний буфер объекта, столбцы будут доступны по наименованию или с помощью функции Get.
Get Реализована Функция TempDB.Get(<Наименования столбца (STRING)>):<Значение столбца> Функция получает значение указанного по наименованию столбца таблицы в случае, если запись уже загружена с помощью функций Next, PeekNext или Find.
Set Реализована Функция TempDB.Set(<Наименования столбца (STRING)>,<Значение столбца>) Функция изменяет значение указанного по наименованию столбца таблицы в случае, если запись уже загружена с помощью функций Next, PeekNext или Find.
<Имя столбца> Реализована Атрибут TempDB.<Имя столбца>:<Значение столбца> Атрибут получает или изменяет значение указанного по наименованию столбца таблицы в случае, если запись уже загружена с помощью функций Next, PeekNext или Find.
Find Реализована Функция TempDB.Find(<Стандартные фильтры>...):<Запись найдена (INT)> Функция останавливает текущую выборку, если таковая существует и загружает в буфер выборки запись, идентифицируемую фильтром. Если запись загружена, функция возвращает 1, иначе 0.
New Планируется Функция TempDB.New() Функция создает новую пустую запись в буфере выборки. Поля записи в дальнейшем можно заполнить, и запись можно сохранить. После сохранения запись будет добавлена во временную таблицу.
Save Планируется Функция TempDB.Save() Функция сохраняет изменения в столбцах текущей записи, находящейся в буфере выборки.
Group Реализована Функция TempDB.Group(<Столбцы группировки (STRING)>,<Столбцы агрегации с операциями (STRING)>) Функция выполняет операцию группировки над записями таблицы, в таблице результате остаются только столбцы группировки и столбцы агрегации. См. также Group.
UpdateFromGroups Реализована Функция TempDB.UpdateFromGroups(<Условие для определения строк группировки (STRING)>,<Наименования столбцов сортировки с направлением сортировки (STRING)>,<Наименования заполняемых столбцов (STRING)>,<Стандартные фильтры>...) Функция выполняет заполнение обычных столбцов значениями столбцов группировки. Функция используется, при загрузке из сложных строчных частей с промежуточными группировками или подобных случаев. Выполнение функции может занимать продолжительное время, так как серверы базы данных (типа SQL) не имеют функционала для выполнения таких операции с помощью функций, оперирующих наборами записей.
Gross1, Compute1 Реализована Функция TempDB.Gross1(<Наименование столбца (STRING)>,<Тип операции агрегации (STRING)>="SUM",<Стандартные фильтры>...):<Результат агрегации> Функция вычисляет значение агрегации указанного столбца таблицы среди записей, входящих в указанный фильтр.
Compute Планируется Функция TempDB.Compute(<Наименование столбцов группировки (STRING)>,<Список столбцов агрегации с типами операций (STRING)>,<Стандартные фильтры>...):<Результат вычисления (TAB)> Функция производит выборку с агрегацией с помощью указанных фильтров. Результат выборки возвращается в виде таблицы значений со столбцами группировки и агрегации.
AddIndex Планируется Функция TempDB.AddIndex(<Наименования столбцов индекса с направлениями сортировки (STRING)>) Функция добавляет индекс во временную таблицу базы данных. Индекс может быть как простым (использовать один столбец), так и композитным (использовать несколько столбцов). Простые индексы можно задать при добавлении столбцов в таблицу.