TempDB.Update

From SunFlurry wiki
Jump to: navigation, search
  Update (Обновление значений столбцов временной таблицы)
Объект:Временная таблица базы данных
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Сервер и БД
Исключения:Невозможно превратить в строку, неверные аргументы, ошибка сервера
Визуальность:Нет

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

Синтаксис

TempDB.Update(<Источник данных (STRING,TEMPDB)>,<Формулы для вычисления столбцов (STRING)>,<Стандартные фильтры>...)

Аргументы

  • <Источник данных (DB,STRING,TEMPDB)> - (необязательный аргумент) Источник данных для получения дополнительной информации для изменения столбцов таблицы. Параметр необязателен, если он является другой временной таблицей базы данных, также необходимо указать дополнительное условие связи между записями текущей временной таблицы и записями или элементами объекта базы данных (см. второй аргумент). Источником может быть:
    • Строка -- задает путь объекта базы данных и наименование столбца, по которому будет происходить синхронизация между объектом и текущей таблицей в виде <Тип данных БД>.<Вид данных БД>:<Столбец, содержащий объекты указанного вида>.
    • Другая временная таблица базы данных -- переменная, задающая другую временную таблицу базы данных.
  • <Формулы для вычисления столбцов (STRING)> - Аргумент задает способ вычисления столбцов таблицы, формулы могут использовать столбцы самой таблицы при вычислении, а также, если указан дополнительный источник данных, информацию из него. Задание аргумента имеет следующий формат: [<Условие объединения записей текущей таблицы и записей другой временной таблицы-источника данных>,]<Выражение 1>-><Имя столбца 1>,<Выражение 2>-><Имя столбца 2>.... Выражения содержат весь возможный набор функций и операторов языка запросов (см. Временная таблица базы данных, Объект запрос базы данных). Важно: Не все серверы базы данных готовы принимать выражения с использованием ссылок на поля внешних таблиц (Doc.DocDate и т.п.) в условие объединения и записей текущей таблицы и записей другой временной таблицы-источника данных. Это ограничение можно обойти, предварительно создав дополнительный столбец в оригинальной таблице и заполнив его результатом выражения, с тем, чтобы в условии были только простые указания на столбцы. См. пример, демонстрирующий такую проблему ниже. Также для этого условия рекомендуется использовать наиболее простые выражения без вычислений. SQLite3, к примеру, очень сильно замедляет выполнение запроса, если в условии для объединения использованы какие-либо вычисления.
  • <Стандартные фильтры> - (необязательный аргумент) Стандартные фильтры отбора записей текущей таблицы данных описаны в статье Стандартные фильтры. Важное отличие от фильтров функций объектов базы данных заключается в том, что стандартные фильтры всегда работают в сложном (расширенном) режиме, при этом отсутствует требование, что первая строка фильтра должна начинаться на знак ~. Выражения фильтров содержат весь возможный набор функций и операторов языка запросов (см. Временная таблица базы данных, Объект запрос базы данных), при указании наименование также применимы префиксы (типа :), как это описано в статье по временной таблице базы данных. Записи таблицы, не входящие в фильтр, будут пропущены при изменении.

Примеры

//Пример создает таблицу аТемп, и заполняет ее резервами документа ЗаказНаПроизводство, при этом в ней также заполнено поле документа ВыпускПродукции. 
//  Документ ВыпускПродукции подчинен документу ЗаказНаПроизводство. Выборка документов происходит за период с НачДата по КонДата.
//Таблица номенклатуры из резервов с выпусками и заданиями
аТемп:=TempDB.Create("зДок:DB,зЗад:DB,зН:DB:I,Количество:NUMBER.15.5");
//Заказы на производство
аТемп.LoadFrom("Stor.Резервы","@LINK->зЗад,Номенклатура->зН,?(@EXPENSE=1,-Количество,Количество)->Количество",
  "(BegOfDay(@DATE)>=НачДата)And(BegOfDay(@DATE)<=КонДата)","IsType(@LINK,Doc.ЗаказНаПроизводство)");
//Заполняем зДок (подчиненный документ -- ВыпускПродукции)
вТемп:=TempDB.Create("зДок2:DB,зЗад:DB");
//Выбираются только те документы выпусков, основания которых (ЗаказНаПроизводство) находятся в таблице аТемп
вТемп.LoadFrom("Doc.ВыпускПродукции","@ELEMENT->зДок2,@ELEMENT.ДокОснование->зЗад","@ELEMENT.ДокОснование IN аТемп.зЗад");
//Заполним столбец зДок оригинальной таблицы, объединение происходит по условию ":зЗад=зЗад".
аТемп.Update(вТемп,":зЗад=зЗад,зДок2->зДок");
//В дальнейшем таблицу аТемп можно выводить на экран или использовать в последующих запросах.


//Второй пример показывает последовательное заполнение реквизитов Контрагент (зК), Адрес (зАД) и Дата документа (зДата) из разных объектов базы данных в таблицу, 
//  которая содержит совокупность строк, загруженных из накопителя
//Создаем и заполняем таблицу движениями накопителя Остатки, накопитель не содержит всех необходимых нам полей, к примеру, в нем отсутствует указание на контрагента или адрес
аСтроки:=TempDB.Create("зДал:Number.20.7,зН:DB,зПартия:DB,зК:DB,зАД:DB,зДок:DOC,зСклад:DB,зДата:Date");
//Запрос производится за период с НачДата по КонДата, также отбирается номенклатура по спискам оН.Get(1) и оН.Get(2)
аСтроки.LoadFrom("Storage.Остатки","Количество*?(@EXPENSE=0,1,-1)*Номенклатура.Объем->зДал,Номенклатура->зН,Склад->зСклад,Партия->зПартия,@LINK->зДок","@DATE>=НачДата","@Date<КонДата",
      "Номенклатура IN оН.Get(1)","Номенклатура NOT IN оН.Get(2)");

//Удаляем из таблицы строки, связанные с документами, типа Сторнирование
аСтроки.Remove("IsType(зДок,Doc.Сторнирование)");

//Заполняем столбцы Контрагент, Адрес и Дата, так как накопитель может иметь записи разных документов, которые являются разными таблицами БД, 
//  необходимо делать запросы отдельно по каждой из таблицы, альтернативно, можно было бы сделать запрос к какому-нибудь журналу документов, 
//  если последний содержит нужные поля.
//Запросы выглядят одинаковыми, но они происходят к разным таблицам и разным реквизитам (столбцам) таблиц
//  Те записи текущей таблицы, которые отсутствуют в источнике данных, по которому происходит запрос, будут пропущены при обновлении
аСтроки.Update("Doc.Реализация:зДок","Контрагент->зК,Адрес->зАД,DocDate->зДата");
аСтроки.Update("Doc.ВозвратПоставщику:зДок","Контрагент->зК,Адрес->зАД,DocDate->зДата");
аСтроки.Update("Doc.ВозвратОтПокупателя:зДок","Контрагент->зК,Адрес->зАД,DocDate->зДата");
аСтроки.Update("Doc.ПоступлениеТМЦ:зДок","Контрагент->зК,Адрес->зАД,DocDate->зДата");


//Пример показывает ограничения при использовании функции и обновлении содержимого таблицы с помощью другой таблицы базы данных, когда объединение производится с помощью сложного выражения.
//Таблицы:
//аТемп содержит столбцы зДок (документ ВыпускПродукции) и зН (справочник Номенклатура), Количество (вещественное число)
//бТемп содержит столбцы Index (составной столбец, полученный по формуле зДок.DocNum+":"+GetYear(зДок.DocDate)+":"+зН.Code), Цена (цена материала зН в документе ВыпускПродукции зДок)
//Требуется добавить и заполнить столбец "Сумма" в таблице аТемп используя столбик локальный Количество и столбик Цена из бТемп.

//Данная конструкция не будет работать под MS-SQL, так как при объединении таблиц не разрешается использование переменных из внешних таблиц
//  (однако, конструкция, возможно будет работать под управлением других типов СУБД):

аТемп.AddColumns("Сумма:Number.15.2");
аТемп.Update(бТемп,"Trim(:зДок..Doc.ВыпускПродукции.DocNum)+"":""+Str(GetYear(:зДок..Doc.ВыпускПродукции.DocDate))+"":""+:зН..Ref.тмцНоменклатура.Code=Index,Цена*:Количество->Сумма");

//Данная конструкция будет работать корректно (заметьте, что локальные столбцы помечаются префиксом ":", чтобы избежать разночтения системой):

аТемп.AddColumns("Сумма:Number.15.2,Index:STRING.100");
аТемп.Update(,"Trim(зДок..Doc.ВыпускПродукции.DocNum)+"":""+Str(GetYear(зДок..Doc.ВыпускПродукции.DocDate))+"":""+зН..Ref.тмцНоменклатура.Code->Index");
аТемп.Update(бТемп,":Index=Index,Цена*:Количество->Сумма");