Всем привет.
Используется BPMonline Bank Sales Версия 7.5.0.1275
Возникает проблема с параметром процесса типа Коллекция. Диаграмма процесса приложена.
В первом сценарии делаем выборку данных и результирующую коллекцию присваиваем параметру процесса. Во втором сценарии достаем нужную информацию из выборки через Entity, которую, в свою очередь, вытаскиваем из коллекции по индексу. Сам индекс инкрементируем в Формуле и проверяем не превысил ли он количество элементов в выборке. Так вот, первый шаг проходит хорошо. Все данные достаются и показаны в окне Проверка результата и соответствуют действительности. Но при заходе на второй круг в элементе-сценарии Формирования текста SMS и номера возникает ошибка
System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
Parameter name: Значение индекса находится вне допустимого диапазона значений
at Terrasoft.Core.Entities.EntityCollection.FindNodeByIndex(Int32 index)
at Terrasoft.Core.Process.BirthdayQuery.ScriptTask2Execute(ProcessExecutingContext context)
at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
Индекс при этом равен 1. То есть, от коллекции, похоже, осталась только одна запись.
Если же убрать элемент Автогенерируемая страница, то бизнес-процесс заканчивается нормально с индексом, равным количеству элементов в выборке. Но хотелось бы все же видеть, что именно выбирается на каждом шаге. Настройка параметра-коллекции в приложении.
Код сценария Выборка данных у кого ДР
var esqBirthdays = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Contact");
contactIdFieldName = esqBirthdays.AddColumn("Id").Name;
esqBirthdays.AddColumn("GivenName");
esqBirthdays.AddColumn("MiddleName");
esqBirthdays.IsDistinct = true;
//Получение сегодняшней даты
today = DateTime.Today;
var esqMacrosTypeMonth = EntitySchemaQueryMacrosType.Month;
var esqFilterByMonth = esqBirthdays.CreateFilter(FilterComparisonType.Equal, "BirthDate", esqMacrosTypeMonth, today.Month);
esqBirthdays.Filters.Add(esqFilterByMonth);
var esqMacrosTypeDay = EntitySchemaQueryMacrosType.DayOfMonth;
var esqFilterByDayToday = esqBirthdays.CreateFilter(FilterComparisonType.Equal, "BirthDate", esqMacrosTypeDay, today.Day);
esqBirthdays.Filters.Add(esqFilterByDayToday);
//Есть моб тел?
var esqFilterWithMobilePhone = esqBirthdays.CreateFilterWithParameters(FilterComparisonType.Equal, "[ContactCommunication:Contact].CommunicationType", new Guid("F039972E-470E-457F-9B77-65054B3534B0"));
esqBirthdays.Filters.Add(esqFilterWithMobilePhone);
//Выполнение запроса и получение результирующей коллекции
entitiesBD = esqBirthdays.GetEntityCollection(UserConnection);
numberOfentitiesBDInCollection = entitiesBD.Count;
currentIndexBD = 0;
esqSqlText = esqBirthdays.GetSelectQuery(UserConnection).GetSqlText();
return true;
Код сценария Формирования текста СМС и номера
Entity element = entitiesBD[currentIndexBD];
Guid contactID = element.GetTypedColumnValueGuid>(contactIdFieldName);
string contactName = element.GetTypedColumnValuestring>("GivenName");
string contactMiddleName = element.GetTypedColumnValuestring>("MiddleName");
string BirthDateText = DateTime.Today.ToString("dd MMMM");
string messageText = "Дорогой(ая) "+contactName+"! Росинбанк поздравляет Вас с Днем Рождения "+BirthDateText+" и желает Вам всех благ! Росинбанк";
if(contactMiddleName!=null) messageText = "Дорогой(ая) "+contactName+" "+contactMiddleName+"! Росинбанк поздравляет Вас с Днем Рождения "+BirthDateText+" и желает Вам всех благ! Росинбанк";
SMSTextBD = messageText;
var contactComm = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "ContactCommunication");
var contacctNumberFieldName = contactComm.AddColumn("Number").Name;
var esqFilter1 = contactComm.CreateFilterWithParameters(FilterComparisonType.Equal, "Contact", contactID);
contactComm.Filters.Add(esqFilter1);
var esqFilter2 = contactComm.CreateFilterWithParameters(FilterComparisonType.Equal, "CommunicationType", new Guid("F039972E-470E-457F-9B77-65054B3534B0"));
contactComm.Filters.Add(esqFilter2);
var mobilePhoneCollection = contactComm.GetEntityCollection(UserConnection);
if(mobilePhoneCollection.Count>0)
{
phoneNumberBD = mobilePhoneCollection[0].GetTypedColumnValuestring>(contacctNumberFieldName);
} else
{
phoneNumberBD = "No number";
}
//var SMSObject = new SendSMSClass(SMSServiceAddress);
//SMSObject.SendSMS(phoneNumber, messageText);
return true;
csharp>