среда, 5 февраля 2014 г.

Запись во внешние источники данных

Внешние источники данных, появившиеся в 8.2.14 был отличным шагом навстречу интеграции с другими приложениями. Сейчас на дворе 8.3 и таблицы внешних источников данных:

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

Но, в 8.3.4 мы получаем Функции внешних источников данных

При работе с внешними источниками данных реализована возможность использования функций, описанных во внешних источниках данных. Функция может возвращать одно значение, таблицу или не возвращать значений вовсе. Реализована возможность указывать вид таблицы внешнего источника данных - таблица или выражение (для описания функций, возвращающих таблицу).
Для обращения к функциям внешнего источника данных из языка запросов используется один из синтаксисов:
ВнешнийИсточникДанных.<Имя источника>.Таблица.<Имя табличной функции>(<Параметр 1>,...,<Параметр N>);
ВнешнийИсточникДанных.<Имя источника>.<Имя функции>(<Параметр 1>,...,<Параметр N>);
Обращение к функциям с помощью объектной модели возможно с помощью менеджера внешнего источника данных или менеджера таблицы внешнего источника данных.
В библиотеке картинок реализована картинка ВнешнийИсточникДанныхФункция (ExternalDataSourceFunction).
Да именно функции, не процедуры


В функции мы можем передать параметры (в том числе ссылки из объектных таблиц внешних источников данных) ну и как водится вернуть 1 значение.

Сообщить(ВнешниеИсточникиДанных.ВнешИстоник1.ДобавитьЧек(ПараметрыСеанса.Касса));

Все идет по плану до тех пор вы не решаетесь поместить в код функции DML (Data Manipulation Language) операторы (INSERT, UPDATE, DELETE)

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

В ORACLE DML разрешен в функциях если функция будет выполнятся в автономной транзакции

CREATE OR REPLACE FUNCTION RGUSER."F_ADDVOU"(
   p_pos    IN   VOU.pos%TYPE 
) RETURN NUMBER 
IS 
   PRAGMA AUTONOMOUS_TRANSACTION
BEGIN
   INSERT INTO RGUSER.VOU (POU, V_,UPD,POS)  VALUES (RGUSER.f_inc ('POU', 0, 0),RGUSER.f_inc('V_', 0,  p_pos),sysdate, p_pos);
   COMMIT;
   RETURN 1;
   EXCEPTION  WHEN OTHERS THEN 
    ROLLBACK;
    RETURN (-1); 
 END ;

Теперь мы по настоящему, штатными средствами  изменяем данные во внешних источниках данных в том числе и на Linux!