Добрый день!
Пытаюсь найти метод, назначающий права доступа на карточку контрагента. Просмотрел обработку нажатия кнопки Действия-Настроить права доступа. В схеме 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]));
}
}
}