Как выполнить sql скрипт из кода bpm 5.4 ?

Как выполнить 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: {"config":{"viewStateMode":"include","extraParams":{}}}
	__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();  
}
Показать все комментарии