Как выполнить sql скрипт из кода bpm 5.4 ? (не нашел на комьюнити)
Нравится
Здравствуйте, Илья!
Ссылки Вам в помощь:
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. Теперь не ругается при публикации, но запрос не выполняется (в таблице не появляется записей), использую такой код:
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(); } …