Добрый день!
У меня возникла необходимость в приложении использовать хранимую процедуру и в затем в приложении работать с результатом.
В документации не нашел информации по этому вопросу.
Подскажите как реализовать вызов из JS процедуры , где передаются параметры , если есть готовые примеры было бы еще лучше.
Нравится
Здравствуйте!
Из 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"" (см прикрепл файл)
не могу понять в чем ошибка.