использование хранимых процедур

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

Нравится

18 комментариев

Здравствуйте!

Из JS нельзя вызвать хранимую процедуру напрямую. Используйте вызов вебсервиса для запуска процедуры.

можете подробнее рассказать про веб сервис и как потом в JS обратиться к веб сервису?
ранее не сталкивался с этим.

Привет.
Прикладываю примерные коды. Из js делаем вызов C# модуля, а в модуле уже вызываем хранимку и оборачиваем все это дело в транзакцию.
"...работать с результатом." - Как вариант: хранимка кладет все нужные данные в таблицу (которую нужно будет предварительно создать в BPM), и в коде, в коллбэке, вы делаете ESQ запрос в эту таблицу, выгребая нужные данные. Как-то так.

"Варфоломеев Данила Викторович" написал:

Привет.

Прикладываю примерные коды.

привет.
спасибо за примеры буду разбираться.

вчера попробовал взять пример работы с веб сервисом из
https://academy.terrasoft.ru/documents/technic-sdk/7-8-0/kak-sozdat-svo…
почему то пример не сработал можете посмотреть в чем проблема?

вот коды сервиса

// Класс конфигурационного сервиса должен быть реализован в пространстве имен Terrasoft.Configuration.
// При необходимости можно создавать для веб-сервиса свое рабочее пространство, но оно должно быть
// обязательно вложенным в Terrasoft.Configuration.
namespace Terrasoft.Configuration.CustomConfigurationService
{
using System;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.ServiceModel.Activation;

// Класс сервиса помечен обязательными атрибутами [ServiceContract] и
// [AspNetCompatibilityRequirements] с параметрами.
[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public class CustomConfigurationService
{
// Метод сервиса помечен обязательными атрибутами [OperationContract] и
// [WebInvoke] с параметрами.
[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped,
ResponseFormat = WebMessageFormat.Json)]
public string GetTransformValue(string inputParam)
{
var result = inputParam + " + output string";
return result;
}
}
}

а это вызов в JS

poisksumtotal: function()
{

var name = 'привет';
// Объект, инициализирующий входящие параметры для метода сервиса.
var serviceData = {
// Название свойства совпадает с именем входящего параметра метода сервиса.
inputParam: name
};

// Вызов веб-сервиса и обработка результатов.
ServiceHelper.callService("CustomConfigurationService", "GetTransformValue",
function(response) {
var result = response.GetTransformValueResult;
this.showInformationDialog(result);
}, serviceData, this);
// this.showInformationDialog(name);
},

"Евдокимов Евгений" написал:почему то пример не сработал можете посмотреть в чем проблема?

Вроде все правильно. К сожалению, без скрина ошибок в консоли не разберешься.
Из частых проблем - не добавлен ServiceHelper в define или название CustomConfigurationService указано иное (там вроде как namespace, class и название объекта должны совпадать).

"Варфоломеев Данила Викторович" написал:
Евдокимов Евгений пишет:

почему то пример не сработал можете посмотреть в чем проблема?

Вроде все правильно. К сожалению, без скрина ошибок в консоли не разберешься.

Из частых проблем - не добавлен ServiceHelper в define или название CustomConfigurationService указано иное (там вроде как namespace, class и название объекта должны совпадать).


ошибок вроде нет, ServiceHelper добавлен, все имена проверил,
при нажатии на пункт меню не выходит сообщение,

я извиняюсь но в примерах ваших коды на русском написаны.,
боюсь ошибиться в написании, можете скинуть оригинал

кодировка сбилась видимо

"Варфоломеев Данила Викторович" написал:

кодировка сбилась видимо


спасибо

ошибку нашел в консоле прикрепил в файле

"Евдокимов Евгений" написал:ошибку нашел в консоле прикрепил в файле

Хм. Bpm не может достучаться до метода. попробуйте в define прописать ServiceHelper с самого начала.
Что-то вроде:

define("UsrCustomPage",["ServiceHelper", "Terrasoft".....],
	function(ServiceHelper, terrasoft.....) 

"Варфоломеев Данила Викторович" написал:
Евдокимов Евгений пишет:

ошибку нашел в консоле прикрепил в файле

Хм. Bpm не может достучаться до метода. попробуйте в define прописать ServiceHelper с самого

да уж)) даже и не подумал бы что из за порядка написания ServiceHelper может не работать весь код...

спасибо получилось !!

скажите а в чем разница в вашем примере сервис вызывается с помощью Terrasoft.AjaxProvider.request
а в этом примере через
ServiceHelper.callService("CustomConfigurationService", "GetTransformValue",
function(response) {

в чем разница и какой лучше использовать в дальнейшем??

"Евдокимов Евгений" написал:в чем разница и какой лучше использовать в дальнейшем??

Поищите ServiceHelper в конфигурации. Там используется тот же самый AJAX.request. Так что разницы никакой. Просто хэлпер предоставляет пользователю более удобную/простую форму вызова.

Но, блин, ни в каких SDK не написано, что оказывается в ServiceHelper, в конфиге, можно указывать timeout. Если его не указывать и хранимка долго собирает данные, то запрос просто обрывается (столкнулся с этим).

да посмотрел так и есть Helper поудобнее,
насчет тайм-аута учту

можно еще вопрос , чтобы из одного модуля JS вызвать выполнение другого тоже JS
тоже так же нужно описывать или другой код будет?

"Евдокимов Евгений" написал:так же нужно описывать или другой код будет?

Через mixins. Посмотрите в конфигурации BaseGridDetailV2 (базовая деталь с гридом), в define подключается "GridUtilitiesV2" (JS модуль, конкретно методы по работе с гридом), в Mixins:

GridUtilities: "Terrasoft.GridUtilities". 

В схеме BaseGridDetailV2 куча кода, относящегося к детали, однако как только нужно, допустим, обновить данные в гриде, пишется this.reloadGridData(), где reloadGridData - это метод из GridUtilitiesV2. Единственное - подключаемый в этом случае модуль с доп.методами немного по другому описывается.

Ну или, опять же, смотрите в сторону ServiceHelper) Это же JS модуль с 1 встроенной функцией. И вызывается он отовсюду, подключается в схемы через define.

хорошо спасибо , много полезного Вы мне подсказали.
буду практиковаться)

"Варфоломеев Данила Викторович" написал:

Привет.

нт: хранимка кладет все нужные данные в таблицу (которую нужно будет предварительно создать в BPM), и в коде, в коллбэке, вы делаете ESQ запрос в эту таблицу, выгребая нужные данные. Как-то так.

Добрый день!
Практически применил ваши примеры к своей задаче, обращение работает,
хотел спросить, каким образом результат работы процедуры вывести в JS
т е вместо return "OK"; значение которое подсчитывается в процедуре.

или в дальнейшем набор строк (результат select) без создания таблиц и дополнительных запросов типа ESQ

"Евдокимов Евгений" написал:или в дальнейшем набор строк (результат select) без создания таблиц и дополнительных запросов типа ESQ

В конце хранимки дописать select нужных столбцов. В коде немного по другому вызвать процедуру:

string sqlText = "exec [dbo].[tsp_Procedure] '"+UserConnection.CurrentUser.ContactId+"',30, ...куча параметров..."'";
var resultQuery = new CustomQuery(UserConnection, sqlText);
DataTable dt = new DataTable();
using (DBExecutor dbExecutor = UserConnection.EnsureDBConnection()) {
	using(var dr = resultQuery.ExecuteReader(dbExecutor)) {
		dt.Load(dr);      
	}
}

Ну и потом в C# коде работать с datatable как вам угодно. И в конце return нужного вам параметра. Ну или public string[] в объявлении функции и в конце возвращать массивы из datatable.
Или гуглить

спасибо буду разбираться

"Варфоломеев Данила Викторович" написал:
вы делаете ESQ запрос в эту таблицу, выгребая нужные данные. Как-то так.

Добрый день!
Могу я у вас еще спросить кое что,
разобрался с процедурой с вызовом и обработкой результата, теперь пытаюсь выгрузить результат в Excel с помощью метода
DataUtilities.exportToCsvFile("TestReportTable");
передаю имя схемы откуда выгружать все данные.
система выдает ошибку
"Объект не поддерживает свойство или метод "on"" (см прикрепл файл)
не могу понять в чем ошибка.

Показать все комментарии