Добрый день!
Пытаюсь найти метод, назначающий права доступа на карточку контрагента. Просмотрел обработку нажатия кнопки Действия-Настроить права доступа. В схеме BasePageV2 нашел обработчик кнопки:
actionMenuItems.addItem(this.getButtonMenuItem({
"Caption": {"bindTo": "Resources.Strings.EditRightsCaption"},
"Tag": "editRights",
"Visible": {"bindTo": "getSchemaAdministratedByRecords"}
}));
метод же найти не могу.
Нужно для назначения прав на страницу контрагента в БП без использования Terrasoft.Core.DB
Нравится
По нажатию на кнопку действия 'Настроить права доступа' вызывается окно для редактирования прав, в котором пользователь вручную раздает права доступа, и его вызов реализован в методе editRights (указан в свойстве 'Tag').
В БП в элементе 'Задание-сценарий' можно реализовать произвольный запрос, в котором выполнять добавление/изменение/удаление данных напрямую в базу данных без использования Terrasoft.Core.DB:
var customQuery = new CustomQuery(context.UserConnection); customQuery.SqlText = @"insert into Cases (Id) values (newid())"; using (DBExecutor dbExecutor = context.UserConnection.EnsureDBConnection()) { var datareader = customQuery.ExecuteReader(dbExecutor); } return true;
Вот ещё другой пример:
var userConnection = context.UserConnection; var dr = new CustomQuery(userConnection, String.Format( "update case set SolutionProvidedOn = null where Id = 974ca9fc-c066-4a7a-ac65-7ec91a44a067")).ExecuteReader(dbExecutor); return true;
По нажатию на кнопку действия 'Настроить права доступа' вызывается окно для редактирования прав, в котором пользователь вручную раздает права доступа, и его вызов реализован в методе editRights (указан в свойстве 'Tag').
В БП в элементе 'Задание-сценарий' можно реализовать произвольный запрос, в котором выполнять добавление/изменение/удаление данных напрямую в базу данных без использования Terrasoft.Core.DB:
var customQuery = new CustomQuery(context.UserConnection); customQuery.SqlText = @"insert into Cases (Id) values (newid())"; using (DBExecutor dbExecutor = context.UserConnection.EnsureDBConnection()) { var datareader = customQuery.ExecuteReader(dbExecutor); } return true;
Вот ещё другой пример:
var userConnection = context.UserConnection; var dr = new CustomQuery(userConnection, String.Format( "update case set SolutionProvidedOn = null where Id = 974ca9fc-c066-4a7a-ac65-7ec91a44a067")).ExecuteReader(dbExecutor); return true;
В БП этот код вызывает ошибку компиляции "The name dbExecutor does not exist in the current context"
Либо "The type or namespace name 'IDataReader' coul not be found" в первом варианте.
То есть это работает только для неинтерпетируемого процесса?
Естественно, использование в БП блоков скриптов на C# требует компиляции процесса.
Виталий Егоров,
Если Вы используете второй вариант, попробуйте вместо UserConnection написать context.UserConnection.
Если первый вариант, то приблизительно такой код:
var userConnection = context.UserConnection; var customQuery = new CustomQuery(userConnection); customQuery.SqlText = @"insert into Cases (Id) values (newid())"; using (DBExecutor dbExecutor = userConnection.EnsureDBConnection()) { var reader = customQuery.ExecuteReader(dbExecutor); } return true;
Виталий Егоров пишет:
В БП этот код вызывает ошибку компиляции "The name dbExecutor does not exist in the current context"
Нужно обернуть в using, как и в первом фрагменте.
Либо "The type or namespace name 'IDataReader' coul not be found" в первом варианте.
А тут нужно включить нужную библиотеку System.Data в Usings (в дизайнере БП справа на вкладке «Методы»).
Спасибо, Алла, все работает.
Александр, спасибо, попробую добавить DataReader.
Добавил в этот же БП еще один сценарий с кодом:
foreach (string accountId in accountIdList){
try {
var update = new Update(UserConnection, "Account")
.Set("OwnerId", Column.Parameter(newOwner))
.Where ("Id").IsEqual(Column.Parameter(accountId));
update.Execute();
}
catch (SqlException ex){
errorsList.Add(ex.Message);
}
finally {
var sel = new Select(UserConnection)
.Column("Name")
.From("Account")
.Where ("Id").IsEqual(Column.Parameter(accountId));
using (DBExecutor dbExecutor = context.UserConnection.EnsureDBConnection()) {
using (IDataReader dataReader = sel.ExecuteReader(dbExecutor)){
accountName = CreateJson(dataReader);
}
}
accountNameList.Add(accountName);
}
}
На выходе получаю ошибку:
'Query' does not contain a definition for 'ExecuteReader' and no extension method 'ExecuteReader' accepting a first argument of type 'Query' could be found (are you missing a using directive or an assembly reference?)
Может, дело в забытом «as Select» в конце объявления sel? Как тут:
Select select = new Select(UserConnection) .Column("Id") .From("ActivityStatus") .Where("Finish").IsEqual(Column.Parameter(true)) as Select; using (var dbExecutor = UserConnection.EnsureDBConnection()) { using (IDataReader dr = select.ExecuteReader(dbExecutor)) { while (dr.Read()) { finishActivityStatuses.Add(UserConnection.DBTypeConverter.DBValueToGuid(dr[0])); } } }