Добрый вечер, коллеги нужна ваша помощь,
Когда ранее сайт работал на 32 бите я использовал утилиту SqlTracker для получения sql запросы, очен удобный инструмент,
Как поменяли на 64 бит сайт, перестал работать SqlTracker, существует ли другие способы получение sql запросов быстро не используя метод .GetSelectQuery(UserConnection).GetSqlText();,
Версия 5.1.1.159

Нравится

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

А SQL Server Profiler из комплекта MS SQL Server не работает?

"Зверев Александр" написал:

А SQL Server Profiler из комплекта MS SQL Server не работает?


У нас Oracle стоит, MS SQL Server не используем

Это существенное уточнение. Ещё бы сообщили версию SQL Tracker.

"Зверев Александр" написал:

Это существенное уточнение. Ещё бы сообщили версию SQL Tracker.


Quest SQL Tracker v.3.0.1.70

Здравствуйте, Баглан!

Прошу уточнить, Вы имеете ввиду, что пул приложения теперь работает в 64-битном режиме?

Попробуйте использовать одну из альтернативных утилит:

http://www.toadworld.com/m/freeware/558.aspx
http://sourceforge.net/projects/ocimonitor/

"Безродный Андрей" написал:

Здравствуйте, Баглан!

Прошу уточнить, Вы имеете ввиду, что пул приложения теперь работает в 64-битном режиме?

Попробуйте использовать одну из альтернативных утилит:

http://www.toadworld.com/m/freeware/558.aspx

http://sourceforge.net/projects/ocimonitor/


Здравствуйте, Андрей!
Да, пул приложения теперь работает в 64-битном режиме

Баглан, попробуйте использовать альтернативные утилиты.

Вероятно, Quest SQL Tracker не может взаимодействовать с 64-битным приложением.

"Безродный Андрей" написал:

Баглан, попробуйте использовать альтернативные утилиты.

Вероятно, Quest SQL Tracker не может взаимодействовать с 64-битным приложением.

Добрый день! Андрей, я скачал утилиты, http://www.toadworld.com/m/freeware/558.aspx --- не работает, не смог запустить или я не правильно запускаю, высылаю скриншот

http://sourceforge.net/projects/ocimonitor/ ----- скачал отсуствовала exe файл для запуска утилиты, не смог запустить.

существует ли более гибкие утилиты?

Баглан, добрый день.

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

Что касается используемой Вами ранее Quest SQL Tracker, необходима установленная версия Toad не ниже 12 и 64-разрядной. Вероятно, в данный момент у Вас установлена 32-битная версия.

"Безродный Андрей" написал:

Баглан, добрый день.

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

Что касается используемой Вами ранее Quest SQL Tracker, необходима установленная версия Toad не ниже 12 и 64-разрядной. Вероятно, в данный момент у Вас установлена 32-битная версия.

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

Баглан, действительно, как оказалось, данная утилита не предусматривает подобной возможности.

Вы пробовали обновить версию TOAD?

"Безродный Андрей" написал:

Баглан, действительно, как оказалось, данная утилита не предусматривает подобной возможности.

Вы пробовали обновить версию TOAD?


обновить не удалось, требует лицензию, наша организация еще не покупала новую версию, еще есть вариант?

Здравствуйте, Баглан!

Последний возможный вариант, который я могу посоветовать - это штатный Enterprise-менеджер.
Инструкция по работе с ним доступна по ссылке:
http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/11g/r2/pro…

Каких-либо бесплатных Open-source - решений я не встречал.

"Безродный Андрей" написал:

Здравствуйте, Баглан!

Последний возможный вариант, который я могу посоветовать - это штатный Enterprise-менеджер.

Инструкция по работе с ним доступна по ссылке:

http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/11g/r2/prod...

Каких-либо бесплатных Open-source - решений я не встречал.

Добрый день.
Это не то что я запрашивал, по ссылке смотрел этим у нас занимаются администраторы базы данных, у нас у разработчико нет доступа совершать такие операций.

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

"Безродный Андрей" написал:

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

Все возможные варианты со своей стороны я Вам предоставил.


Администраторы доступ не предоставят, хорошо спасибо.

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

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

Нравится

3 комментария

Здравствуйте, Эмин!
Попробуйте по аналогии с тем, как реализовано в карточке счета или продажи добавить события типа "PrimaryAmountEditChange", "CurrencyRateEditChange" и т.д.

"Андрей Каспаревич" написал:

Здравствуйте, Эмин!

Попробуйте по аналогии с тем, как реализовано в карточке счета или продажи добавить события типа "PrimaryAmountEditChange", "CurrencyRateEditChange" и т.д.


Создал 4 сообщения со скриптами по аналогии со Счет. Проверил дебаггером, скрипты не вызываются. Т.е. нет никакой реакции на изменения в форме.
Разобрался. Необходимо руками добавить подписку на эвенты при изменении курса, валюты и тп. после сообщения Init

Эмин, я как раз собирался Вам об этом писать.
Рад, что Вы разобрались!

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

Добрый день !
Настроил почту, письма приходят, но при отправке возникает ошибка EmailSenderNotSetError.
С чем это может быть связано ?

Нравится

1 комментарий

При рассылке отправляется несколько писем, для остальных пишет:
"Socket connection was aborted by remote host."

Я так понимаю некий сервер воспринимает эту отправку как спам и блокирует отправку писем. Верно? Если так, то можно ли сделать отправку писем через некий интервал, например 20 сек?

Вот скрин: http://joxi.ru/Q7oZUxjKTJCJTP3O9-k

Нравится

3 комментария

Здравствуйте, Илья!

Попробуйте выставить большее значение в системной настройке SMTP TimeOut:

http://i.piccy.info/i9/7e0738ab20163a772b0952cf09ecbef9/1394201818/18591/710520/07_03_2014_16_16_23.png

Если это не поможет, необходимо обратиться к почтовому провайдеру для выяснения причин подобного поведения.

"Безродный Андрей" написал:

Здравствуйте, Илья!

Попробуйте выставить большее значение в системной настройке SMTP TimeOut:

http://i.piccy.info/i9/7e0738ab20163a772b0952cf09ecbef9/1394201818/18591/710520/07_03_2014_16_16_23.png

Если это не поможет, необходимо обратиться к почтовому провайдеру для выяснения причин подобного поведения.

поставил 40 сек, ошибка осталась.

Здравствуйте, Илья.
Судя по Вашему описанию механизм рассылки работоспособен. Отправка же блокируется провайдером. Думаю, что целесообразно обратить внимание в эту сторону.

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

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

Заранее спосиба.
С уважением,
Гюнель

Нравится

1 комментарий

Здравствуйте, Гюнель!

Для этого необходимо:

1) В разделе Администрирование-Доступ к объектам активировать Администрирование по записям для объекта «Группа контакта» (контрагента, активности – выбрать необходимый раздел):

2) На детали «Доступ к записям по умолчанию» определить необходимые права доступа. Если на детали «Доступ к записям по умолчанию» нет ни одной записи – все будущие группы в данном разделе будут доступны только автору (т.е. пользователи будут видеть только свои группы).

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

Здравствуйте!
Два вопроса по администрированию пользователей
1. Ограничить доступ к вкладке, к примеру, "Маркетинг"
2. Закрыть для обычных пользователей детали "входит в группы", "взаимосвязи"

Нравится

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

Здравствуйте, Эмин!

1. Управлять доступом непосредственно на Рабочие места не получится. Но, ограничив доступ на все разделы в данном рабочем месте, рабочее место пропадет из представления автоматически.

Для того, чтобы запретить доступ к разделу пользователю/группе пользователей, необходимо активировать администрирование по операциям и добавить запрет на все типы операций на раздел:

http://i.piccy.info/i9/76d41e545a17a7d24655b93a5f460751/1394111483/106822/710520/1.jpg

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

http://i.piccy.info/i9/507a190ab560e5b050ff65b5f29678f5/1394122797/31652/710520/06_03_2014_18_19_37.png

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

Спасибо за ответ.
По поводу детали. Деталь "Доступ" скрыть не удается. Она не отображается при настройке рабочих мест, соответственно ее нельзя удалить. Но если мы заходим в реестр любого модуля, то видим в деталях вкладку "Доступ". Данная вкладка доступна обычным пользователям. Как можно ее скрыть?

Здравствуйте, Эмин.

Если объект раздела администрируется по записям, то в разделе появляется деталь "Доступ". Это заложено в ядре.

Тем не менее, если Вы желаете эту деталь скрыть для отображения для пользователей без прав системного администратора, но при этом, чтобы объект администрировался по записям, необходимо в ScriptTask для события PageLoadComplete раздела прописать следующий код:

Guid roleId = new Guid("83A43EBC-F36B-1410-298D-001E8C82BCAD"); //системные администраторы
Guid currentUserId = UserConnection.CurrentUser.Id;
var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "SysUserInRole");
esq.AddColumn("Id");
esq.AddColumn("SysRole");
esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.NotEqual, 
                "SysUser", currentUserId));
var rolesCollection = esq.GetEntityCollection(UserConnection);
foreach(var role in rolesCollection) {
                if (role.GetTypedColumnValue<Guid>("SysRoleId") == roleId) {
                               for (var i = 0; i != Page.DetailsTabPanel.Tabs.Count - 1; i++) {
                                               if (Page.DetailsTabPanel.Tabs[i].Caption.ToString() == "Доступ") {
                                                               Page.DetailsTabPanel.Tabs[i].Visible = false;
                                               }
                               }
                }
}
return true;

"Безродный Андрей" написал:

Спасибо за помощь, разобрался.
Чтобы не создавать темы, спрошу в этой.
Пытаюсь добавить в едином окне реестр с обращениями. Создаю страницу реестра обращений в едином окне, которая наследуется от реестра обращений. Но в едином окне, реестр обращений не отображаются, а кнопки добавления, изменения и тп недоступны

Эмин, необходимо выгрузить данные, сами они туда не попадут.
На событии PageLoadComplete следует получить экземпляр источника данных, при необходимости наложить фильтры и выполнить LoadRows().
Очень наглядный пример есть в методе PrepareSchedule(), процесса страницы ManagersModulePage.

Еще раз по разграничению доступа к вкладкам (Маркетинг, Продажа и тп). К примеру доступ к вкладке Инструменты доступен только админам, необходимо сделать по аналогии, чтобы каждой роли была видна своя вкладка и все. В каком Процессе скрывается вкладка Инструменты?

Администрирования доступа к рабочим местам не существует. Рабочее место будет скрыто, если у пользователя нет прав доступа на все разделы, которые включены в данное рабочее место.

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

Вот этот код перебирает все выделенные записи в реестре.

for (var i = 0; i Page.TreeGrid.SelectedNodes.Count; i++) {

...

 }

Дорогие знатоки, как сделать так, чтобы перебирались все записи выборки?

Нравится

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

Здравствуйте, Илья!
Получить записи выборки можно закрузив строки в источник данных, а затем перебрать их.

Page.TreeGrid.DataSource.LoadRows();
foreach (var row in Page.TreeGrid.DataSource.Rows)
{
     //TODO
var name = row.GetTypedColumnValue<string>("Name"); //обращение к колонке
}

"Андрей Каспаревич" написал:

Здравствуйте, Илья!

Получить записи выборки можно закрузив строки в источник данных, а затем перебрать их.

Page.TreeGrid.DataSource.LoadRows();

foreach (var row in Page.TreeGrid.DataSource.Rows)

{

     //TODO

var name = row.GetTypedColumnValue<string>("Name"); //обращение к колонке

}

С уважением,

Каспаревич Андрей

Эксперт 3-й линии поддержки

Спасибо работает

foreach (var row in Page.TreeGrid.DataSource.Rows)

Данный код проходит только 41 запись, а например, не все 3700 записей. Как сделать чтобы по всей выборке проходил?

Здравствуйте, Илья!
Перед загрузкой данных в DataSource попробуйте установить неограниченное количество записей на странице источника данных:

Page.TreeGrid.DataSource.PageRowsCount = -1;
Page.TreeGrid.DataSource.PageRowsCount = -1;
Page.TreeGrid.DataSource.LoadRows();
foreach (var row in Page.TreeGrid.DataSource.Rows)

с таким кодом уже работает, спасибо

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

Добрый день,

Подскажите как передать table value parameter в Terrasoft.Core.DB.StoredProcedure?
по аналогии с ADO.NET
http://www.mssqltips.com/sqlservertip/2112/table-value-parameters-in-sql...

Нравится

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

Или возможно есть способ из Terrasoft.Core.UserConnection получить текущую строку подключения и использовать ее с ADO.NET?

Антон, переадресовал вопрос нашим разработчика. В ближайшее время ожидаем рекомендаций.

Спасибо за вопрос.

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

Подскажите, пожалуйста, я правильно понял, что она до сих пор не умеет с ними работать?

Нет, движок работы с базой существенно не меняли. Табличные параметры не поддерживаются, поскольку там нужно создавать пользовательские типы, а система работает только со стандартными.

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

Задача запустить рассылку по sql запросу

Выполнил SQL запрос, чтобы добавить контакт в рассылку:

INSERT INTO massmailingcontact ("ContactId","MassMailingId","EmailAddress") VALUES ('C92EA9E7-CC76-4FA1-9CA4-5186AA32FC2A','8EC7B788-401E-40F0-9B82-05937B4399B0','cc-sib@yandex.ru')

Но рассылка не идет и возвращает следующую ошибку:
http://joxi.ru/1zoQUxjKTJAoR_NrRlk

Нравится

4 комментария

Здравствуйте, Илья!
Кроме поля [EmailAddress] необходимо заполнить поле [EmailId] соответсвующим значением из таблицы [ContactCommunication].

Если в таблице [ContactCommunication] нет записи, то добавив туда запись, можно сделать отправку e-mail?
И как после добавления записи в таблицу [ContactCommunication]?

Запись там должна быть, если email в карточку контакта добавлен штатными средствами. Требования для отправки сообщения по рассылки заключаются в том, чтобы EmailAddress и ContactId соответствовали адресу идентификатору контакта из ContactCommunication, связанной с MassMailingContact по EmailId.

"Maxim Gritsenko" написал:

Запись там должна быть, если email в карточку контакта добавлен штатными средствами. Требования для отправки сообщения по рассылки заключаются в том, чтобы EmailAddress и ContactId соответствовали адресу идентификатору контакта из ContactCommunication, связанной с MassMailingContact по EmailId.

Спасибо. Добавление не штатными средствами, а через SQL.

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

Как выполнить sql скрипт из кода bpm 5.4 ? (не нашел на комьюнити)

Нравится

23 комментария

Здравствуйте, Илья!
Ссылки Вам в помощь:
http://www.community.terrasoft.ru/developer/article/7043
http://www.terrasoft.ru/bpmonlinesdk/ (раздел "Примеры")
http://www.community.terrasoft.ru/search/node/esq (можно найти примеры)

Андрей, подскажите, а как получить доступ к странице: http://www.community.terrasoft.ru/developer/article/7043 ?

"D.T." написал:

Андрей, подскажите, а как получить доступ к странице: http://www.community.terrasoft.ru/developer/article/7043 ?


+1

Прошу прощения, дал не ту ссылку.
Вот та же статья:
http://www.community.terrasoft.ru/blogs/8977

В примерах http://www.terrasoft.ru/bpmonlinesdk/ не понятно откуда берется userConnection.
Примера объявления userConnection не нашел.

Обычно в процессе страницы или объекта есть глобальная переменная UserConnection, можно подставить её.

"Зверев Александр" написал:

Обычно в процессе страницы или объекта есть глобальная переменная UserConnection, можно подставить её.

Подскажите каким образом подставлять глобальные переменные.

Просто к ней обращаться.

Илья, UserConnection - это класс ядра, который включает функции и свойства соединения пользователя (уникальные данные пользователя, сессии, временная зона).

Пример использования:

UserConnection.CurrentUser.Id // текущий пользователь
UserConnection.CurrentUser.ContactId // Контакт текущего пользователя
UserConnection.CurrentUser.AccountId // Контрагент текущего пользователя 
UserConnection.CurrentUser.GetCurrentDateTime() // Текущие время в часовой зоне пользователя

Как написал Александр, чтобы использовать UserConnection, достаточно обратиться (без дополнительных объявлений).

У меня такой код:

var insert = new Insert(userConnection).Into("massmailingcontact")
        .Set("ContactId", Column.Parameter("C92EA9E7-CC76-4FA1-9CA4-5186AA32FC2A"))
		.Set("MassMailingId", Column.Parameter("8EC7B788-401E-40F0-9B82-05937B4399B0"))
		.Set("EmailAddress", Column.Parameter("cc-sib@yandex.ru"))
        .Set("EmailId", Column.Parameter("6EEC951D-C89A-42A2-9DE4-AFCA74A72B97"));

и вот такую ошибку в итоге получаю http://joxi.ru/knMUU_3JTJBHE4UZoAc

Надо с большой буквы U.

Спасибо по букве U. Теперь не ругается при публикации, но запрос не выполняется (в таблице не появляется записей), использую такой код:

var insert = new Insert(UserConnection).Into("massmailingcontact")
        .Set("ContactId", Column.Parameter("C92EA9E7-CC76-4FA1-9CA4-5186AA32FC2A"))
		.Set("MassMailingId", Column.Parameter("8EC7B788-401E-40F0-9B82-05937B4399B0"))
		.Set("EmailAddress", Column.Parameter("cc-sib@yandex.ru"))
        .Set("EmailId", Column.Parameter("6EEC951D-C89A-42A2-9DE4-AFCA74A72B97"));
 
return true;

а SQL запрос выполняется

insert into massmailingcontact ("ContactId","MassMailingId","EmailAddress","EmailId") VALUES ('C92EA9E7-CC76-4FA1-9CA4-5186AA32FC2A','8EC7B788-401E-40F0-9B82-05937B4399B0','cc-sib@yandex.ru','6EEC951D-C89A-42A2-9DE4-AFCA74A72B97') 

Надо в конце

insert.Execute();

или прямо:

...
.Set("EmailId", Column.Parameter("6EEC951D-C89A-42A2-9DE4-AFCA74A72B97")).Execute();

"Зверев Александр" написал:

Надо в конце

insert.Execute();

Спасибо, работает!

Еще вопрос вдогонку, как после Insert узнать id новой записи?

"Андрей Каспаревич" написал:

Здравствуйте, Илья!

Ссылки Вам в помощь:

http://www.community.terrasoft.ru/developer/article/7043

http://www.terrasoft.ru/bpmonlinesdk/ (раздел "Примеры")

http://www.community.terrasoft.ru/search/node/esq (можно найти примеры)

С уважением,

Каспаревич Андрей

Эксперт 3-й линии поддержки

В примерах www.terrasoft.ru/bpmonlinesdk/ "userConnection" с маленькой буквы написан и не хватает в примерах ...Execute(); Просьба добавить.

"Соколов Илья Андреевич" написал:Еще вопрос вдогонку, как после Insert узнать id новой записи?

Сначала сгенерировать функцией:

var NewRecordId = Guid.NewGuid();

а при вставке указать поле "Id" и это значение:

...
.Set("Id", Column.Parameter(NewRecordId))
...

"Соколов Илья Андреевич" написал:"userConnection" с маленькой буквы написан

Глобальный объект UserConnection доступен не везде. Если, например, пишем функцию в отдельной схеме вроде CommonUtilities, то его нужно передавать в функцию как параметр. При вызове функции будет с большой буквы, а параметр функции — с маленькой, чтобы не перепутать.

"Соколов Илья Андреевич" написал:В примерах www.terrasoft.ru/bpmonlinesdk/ "userConnection" с маленькой буквы написан и не хватает в примерах ...Execute(); Просьба добавить.

Илья, в примерах SDK основной целью было показать, как формировать различные виды запросов к БД. Выполнение экземпляра запроса вторичен в данных примерах.
В связи с описанной Вами необходимостью уточнить дальнейший порядок действий, будет добавлена информацию о том, как запускать команды на выполнение.
Обновленные статьи будут опубликованы в следующем запланированном обновлении SDK.

"Зверев Александр" написал:
Соколов Илья Андреевич пишет:

Еще вопрос вдогонку, как после Insert узнать id новой записи?

Сначала сгенерировать функцией:

var NewRecordId = Guid.NewGuid();

а при вставке указать поле "Id" и это значение:

...

.Set("Id", Column.Parameter(NewRecordId))

...

Использую код:

var NewRecordId = Guid.NewGuid();
var insert = new Insert(UserConnection).Into("ContactCommunication")
        .Set("Id", Column.Parameter(NewRecordId))
		.Set("Number", Column.Parameter("cc-sib@yandex.ru"));
 
var insert2 = new Insert(UserConnection).Into("massmailingcontact")
        .Set("ContactId", Column.Parameter("C92EA9E7-CC76-4FA1-9CA4-5186AA32FC2A"))
		.Set("MassMailingId", Column.Parameter("8EC7B788-401E-40F0-9B82-05937B4399B0"))
		.Set("EmailAddress", Column.Parameter("cc-sib@yandex.ru"))
        .Set("EmailId", Column.Parameter(NewRecordId));
insert2.Execute();

Получаю ошибку:

Date: 05.03.2014 13:19:34
Date (UTC): 05.03.2014 6:19:35
 
Exception Message: The INSERT statement conflicted with the FOREIGN KEY constraint "FK1al75M40naNJlg36z3fYVOHfw". The conflict occurred in database "BPMonline CRM", table "dbo.ContactCommunication", column 'Id'.
The statement has been terminated.
Exception Type: System.Data.SqlClient.SqlException
Exception Source: .Net SqlClient Data Provider
 
Exception Stack Trace:
   в System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   в System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   в System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   в System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   в System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
   в System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite)
   в System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)
   в System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite)
   в System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
   в Terrasoft.Core.DB.DBExecutor.FailoverExecute[TResult](DbCommand command, Func`1 func)
   в Terrasoft.Core.DB.DBExecutor.Execute(String sqlText, QueryParameterCollection parameters)
   в Terrasoft.Core.DB.BaseInsert.Execute()
   в Terrasoft.WebApp.AccountsGridPageEventsProcessSchema`1.ScriptTask1Execute(ProcessExecutingContext context)
   в Terrasoft.Core.Process.ProcessScriptTask.InternalExecute(ProcessExecutingContext context)
   в Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
   в Terrasoft.Core.Process.ProcessScriptTask.Execute(ProcessExecutingContext context, Func`2 internalExecute)
   в Terrasoft.WebApp.AccountsGridPageEventsProcessSchema`1.ProcessQueue(ProcessExecutingContext context)
   в Terrasoft.WebApp.AccountsGridPageEventsProcessSchema`1.OnExecuted(Object sender, ProcessActivityAfterEventArgs e)
   в Terrasoft.Core.Process.ProcessFlowElement.OnExecuted(ProcessActivityAfterEventArgs e)
   в Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
   в Terrasoft.WebApp.AccountsGridPageEventsProcessSchema`1.ProcessQueue(ProcessExecutingContext context)
   в Terrasoft.WebApp.BaseGridPageEventsProcess`1.ThrowEvent(ProcessExecutingContext context, String message)
   в Terrasoft.WebApp.AccountsGridPageEventsProcessSchema`1.ThrowEvent(ProcessExecutingContext context, String message)
   в Terrasoft.UI.WebControls.PageSchemaUserControl.ThrowEvent(String message)
   в Terrasoft.WebApp.AccountsGridPageSchemaUserControl.ButtonKP1Click(Object sender, EventArgs e)
   в Terrasoft.UI.WebControls.Controls.ComponentAjaxEvent.OnEvent(Object sender, AjaxEventArgs e)
   в Terrasoft.UI.WebControls.Controls.Observable.FireAsyncEvent(String eventName, ParameterCollection extraParams)
   в Terrasoft.UI.WebControls.Controls.ScriptManager.RaisePostBackEvent(String eventArgument)
   в Terrasoft.UI.WebControls.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
   в System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
   в System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
 
Form:
	submitAjaxEventConfig: {&quot;config&quot;:{&quot;viewStateMode&quot;:&quot;include&quot;,&quot;extraParams&quot;:{}}}
	__EVENTTARGET: ScriptManager
	__EVENTARGUMENT: PageContainer_AccountsModulePage_Grid_ButtonKP1|event|Click
	__VIEWSTATEFIELDCOUNT: 25
	__VIEWSTATE0: ...................................

Нужно было вызвать Execute для insert.
Кроме того, ContactCommunication — деталь раздела контактов и в новой записи нужно заполнить связь ContactId и другие стандартные поля.

"Зверев Александр" написал:

Нужно было вызвать Execute для insert.


спасибо добавляет и рассылка идет

А как выполнить из скрипта хранимую процедуру или функцию sql?

Екатерина, с примером вызова хранимой процедуры из скрипта Вы можете ознакомиться в процессе страницы BaseDuplicateMergeEditPage, а именно в OKButtonClickScriptTask:

…
var storedProcedure = new StoredProcedure(UserConnection, "tsp_MergeDuplicates");
storedProcedure.WithParameter(Column.Const(EntityPrimaryColumnValue));
storedProcedure.WithParameter(Column.Const(entitiesToMerge));
storedProcedure.WithParameter(Column.Const(Page.DataSource.Schema.UId));
storedProcedure.WithOutputParameter("return_value", dataValueTypeManager.GetInstanceByName("Integer"));
storedProcedure.WithOutputParameter("error_message", dataValueTypeManager.GetInstanceByName("Text"));
using (DBExecutor dbExecutor = UserConnection.EnsureDBConnection()) {
         dbExecutor.StartTransaction(System.Data.IsolationLevel.ReadUncommitted);
         Page.DataSource.ActiveRow.Save();
         storedProcedure.Execute(dbExecutor);
         if (storedProcedure.Parameters.Count > 0) {
                   int result = (int)storedProcedure.Parameters[0].Value;
                   string errorMessage = storedProcedure.Parameters[1].Value as string;
                   if (result != 0) {
                            dbExecutor.RollbackTransaction();
                            throw new Exception(errorMessage);
                   }
         }        
         dbExecutor.CommitTransaction();  
}
Показать все комментарии