bpm 5.4 on-site
не выполнятся цикл по реестру
имею следующий код, но внутри цикла ничто не выполняется (цикл совершает 0 шагов).
Подскажите, в чём может быть дело.
Page.TreeGrid.DataSource.LoadRows();
foreach (var row in Page.TreeGrid.DataSource.Rows)
{
var name = row.GetTypedColumnValue
try {
var NewRecordId = Guid.NewGuid();
var insert = new Insert(UserConnection).Into("Emailing")
.Set("Id", Column.Parameter(NewRecordId))
.Set("EmailAddress", Column.Parameter(name))
.Set("type", Column.Parameter(1));
insert.Execute();
} catch (Exception e) {System.IO.File.AppendAllText("C:\\logs\\email_debug.txt", e.Message);}
}
Нравится
1) Посмотрите в отладчике, что возвращает это значение:
[csharp]
Page.TreeGrid.DataSource.Rows
[/csharp]
2) В файл лога что-нибудь выводится?
поставил код:
[code]
Page.TreeGrid.DataSource.PageRowsCount = -1;
Page.TreeGrid.DataSource.LoadRows();
foreach (var row in Page.TreeGrid.DataSource.Rows)
{
var NewRecordId3 = Guid.NewGuid();
var insert3 = new Insert(UserConnection).Into("Emailing")
.Set("Id", Column.Parameter(NewRecordId3))
.Set("email", Column.Parameter("укапу3пуп"))
.Set("type", Column.Parameter(1));
insert3.Execute();
var name = row.GetTypedColumnValue("email");
try {
var NewRecordId = Guid.NewGuid();
var insert = new Insert(UserConnection).Into("Emailing")
.Set("Id", Column.Parameter(NewRecordId))
.Set("email", Column.Parameter(name))
.Set("type", Column.Parameter(1));
insert.Execute();
} catch (Exception e) {System.IO.File.AppendAllText("C:\\logs\\email_debug.txt", e.Message);}
}
[/code]
причем код
[code]
var NewRecordId3 = Guid.NewGuid();
var insert3 = new Insert(UserConnection).Into("Emailing")
.Set("Id", Column.Parameter(NewRecordId3))
.Set("email", Column.Parameter("укапу3пуп"))
.Set("type", Column.Parameter(1));
insert3.Execute();
[/code]
если поставить до цикла, то он выполняется, значит в цикл не происходит вход
отладчиком не умею пользоваться (поставил visual studio, что надо нажать в ней, чтобы отладить bpm?)
в файл ничего не выводится
Илья, инструкция по отладке описана здесь:
http://www.community.terrasoft.ru/blogs/8747
После выполнения всех действий включите возможность отлавливать в студии все ошибки, как говорил Максим Кривонос:
http://www.community.terrasoft.ru/blogs/8747#comment-36912
нашел в списке процессов на отладку только http://joxi.ru/6Qj8U4wyTJDAAsoj74o
такой процесс как в инструкции я не нашел
нашлась ошибка, как с этим бороться?
скрин: http://joxi.ru/Ag38U_3JTJBqeXPt1wk
Видимо у вас в базе в этой таблице много записей и при попытке их все одновременно загрузить не хватает памяти. Лучше перебирать их поочерёдно.
Да, 287000 записей. Т.е. мне желательно расширить оперативную память, чтобы загрузить все записи?
А какая бизнес задача? Почему нельзя сделать запросом из MSSQL Management Studio ?
Или так:
[csharp]
var insert = new Insert(userConnection).Into("City")
.Set("CreatedById",
new Select(userConnection).Top(1)
.Column("Id")
.From("Contact")
.Where("Name").IsEqual(Column.Parameter("Supervisor")))
.Set("ModifiedById",
new Select(userConnection).Top(1)
.Column("Id")
.From("Contact")
.Where("Name").IsEqual(Column.Parameter("User1")));
[/csharp]
Илья,
для того, чтобы проходится не по всему множеству записей, можно установить PageRowsCount, например, в 1000. Тогда будут браться первые 1000 записей реестра (по аналогии с SQL - Top 1000).
[csharp]
Page.TreeGrid.DataSource.PageRowsCount = 1000;
[/csharp]
"Безродный Андрей" написал:Илья,
для того, чтобы проходится не по всему множеству записей, можно установить PageRowsCount, например, в 1000. Тогда будут браться первые 1000 записей реестра (по аналогии с SQL - Top 1000).
Page.TreeGrid.DataSource.PageRowsCount = 1000;
можно ли сначала 1000, потом еще 1000 ?
"Соколов Илья Андреевич" написал:А какая бизнес задача?
"Олейник Дмитрий" написал:
задача - в реестре контрагентов отфильтровать контрагентов, например по городу и исключая конкурентов, после чего нажать на кнопку "Отправить КП" и в таблицу отправки КП заносятся все записи являющиеся результатом выборки
например, в городе Н 10000 компаний, всем надо выбрать в реестре и нажать кнопку отправить всем КП
Илья,
как мне кажется, Вам лучше реализовать этот функционал через действие, которое будет запускать бизнес-процесс.
Передавать в него массив можно следующим образом.
Можно переопределить обработчик события StartRunModuleProcess и скопировать в скрипт код из базового метода, но сделать проверку, чтобы коллекция контрагентов выбиралась только для Вашего процесса.
[csharp]
if (schema.Parameters.ExistsByName("TreeGridSelectedRowsIds")) {
if (schema.Name == 'название Вашего процесса' {
// здесь Ваш запрос на выборку необходимых контрагентов с помощью EntitySchemaQuery
// .......
propValue[i] = idsCollection[i];
moduleProcess.SetPropertyValue("TreeGridSelectedRowsIds", propValue);
}
else {
var idsCollection = dataSource.SelectedItemPrimaryColumnValues;
var selectedRowsCount = idsCollection.Count;
var propValue = new Guid[selectedRowsCount];
for(var i = 0; i < selectedRowsCount; i++)
propValue[i] = idsCollection[i];
moduleProcess.SetPropertyValue("TreeGridSelectedRowsIds", propValue);
}
}
[/csharp]