З одного боку начебто можна ув"язати підрахунок створюваних записів у процес форми редагування запису з T2 з відповідним аналізом чи то вставка, чи просто модифікація існуючого запису.
З іншого - більш природнім є зав"язати підрахунок у процес створення запису на об'єкті T2.
Але, що один спосіб, що інший, для мене, поки що, однаково мало зрозумілі.
Не маю ще ясності щодо організації процесів
.
Дуже потребую, щоб хтось знаючий задав правильний напрямок думкам.
Нравится
Ігоре, генерацію номера має сенс прив'язувати до картки, коли в нас відрізняється маска і номер залежно від типу запису, і для кожного з типів вікористовується окрема картка. В іншому випадку варто генерувати номер на збереження об'єкту.
Щось не повний текст мого повідомлення зберігся.
У мене акцент на підрахунку дочірніх записів.
Маю два об'єкти: T1,T2, зв'язані по полю T2.T1_id
В T1 є поле кількості дочірніх записів: T1.Number.
Потрібно при створенні нового запису в T2 збільшувати на одиницю значення поля T1.Number.
Советую посмотреть в сторону события
OnDatasetAfterPost(Dataset)
в нем открываете отфильтрованый Dataset Т1 и увеличиваете на 1 поле Number.
Но при этом учтите удаление дочерних записей, что можно сделать аналогичным способом в событии
OnDatasetAfterDelete(Dataset)
Здравствуйте, Игорь.
Можно получить значение T2.T1_id, считать текущее значение поля с количеством дочерних записей, увеличить его на 1, и выполнить update:
var myUpdate = new Update(userConnection, "MyTable") .Set("Number", new QueryParameter("Number", T1.Number + 1, "Int") .Where("Id").IsEqual(Column.Parameter(new Guid("T2.T1_id'"))); myUpdate.Execute();
T1.Number + 1 - это переменная, которую нужно получить из объекта:
var T1id = T2.T1_id; var manager = UserConnection.EntitySchemaManager; var query = new EntitySchemaQuery(manager, "T1"); var currentAccountId = query.AddColumn(query.RootSchema.PrimaryColumn.Name); var Num = query.AddColumn("Number").Name; query.Filters.Add(query.CreateFilterWithParameters(FilterComparisonType.Equal, "Id", T1id ); var queryResult = query.GetEntityCollection(UserConnection); if (queryResult.Count == 1) { var Number = queryResult[0].GetTypedColumnValue<int>(Num); }
Це потрібно на T2 добавити обробку подій
"После добавления записи"
і
"После удаления записи" ?
Створив "пул/дорожку/событийный подпроцесс/начальные сообщение Inserted/задание-сценарий"
в сценарии следующий текст:
var LI_BuildingId = LI_Board.LI_BuildingId; var TablesNumber = 0; var manager = UserConnection.EntitySchemaManager; var query = new EntitySchemaQuery(manager, "LI_Building"); var currentAccountId = query.AddColumn(query.RootSchema.PrimaryColumn.Name); var Number = query.AddColumn("TablesNumber").Name; query.Filters.Add(query.CreateFilterWithParameters(FilterComparisonType.Equal, "LI_BuildingId", LI_BuildingId )); var queryResult = query.GetEntityCollection(UserConnection); if (queryResult.Count == 1) { TablesNumber = queryResult[0].GetTypedColumnValue<int>(Number); } var myUpdate = new Update(UserConnection, "LI_Building") .Set("TablesNumber", new QueryParameter("TablesNumber", TablesNumber + 1, "Int")) .Where("LI_BuildingId").IsEqual(Column.Parameter(new Guid("LI_Building.LI_BuildingId"))); myUpdate.Execute(); return true;
Тільки код містить помилки.
Не сприймається наступна конструкція:
var LI_BuildingId = LI_Board.LI_BuildingId;
Говорить,
An object reference is required for the non-static field, method or property
Terrasoft.Configuration.LI_Board.LI_BuildingId.get
хоча в метаданих объекту LI_Board є ось такий блок:
{ "UId": "d55ee973-90d8-4e53-b693-41c9c2b5889b", "A2": "LI_Building", "A3": "a8927de2-f612-4c24-95cf-6602426cca16", "A4": "a8927de2-f612-4c24-95cf-6602426cca16", "S2": "b295071f-7ea9-4e62-8d1a-919bf3732ff2", "S4": "afbe04a3-54c1-4bbc-a185-63afe14f874d", "E2": 2, "E6": true, "E17": "LI_BuildingId", "E18": "LI_BuildingName" }
Щось іще потрібно явно описувати самому ?
"Ігор Андрусенко" написал:Не сприймається наступна конструкція:
var LI_BuildingId = LI_Board.LI_BuildingId;
Если Вы пишете этот код в обработчике события вставки сущности LI_Board, то нужно писать так:
var LI_BuildingId = Entity.LI_BuildingId;
Суть ошибки в том, что Вы пишете название класса LI_Board, это не экземпляр, а значит компилятор считает, что Вы обращаетесь к статическому свойству, а оно таковым не является.
Здравствуйте.
Получить значение какой-то из колонок можно следующим образом:
var LI_BuildingId = Entity.GetTypedColumnValue<Guid>("LI_BuildingId");
Щось не складається все до купи.
Зареєстрував подію:
Cкрипт обробника події наразі має такий вигляд:
var LI_BuildingId = Entity.GetTypedColumnValue<Guid>("LI_BuildingId"); var TablesNumber = 0; var manager = UserConnection.EntitySchemaManager; var query = new EntitySchemaQuery(manager, "LI_Building"); var currentAccountId = query.AddColumn(query.RootSchema.PrimaryColumn.Name); var Number = query.AddColumn("TablesNumber").Name; query.Filters.Add(query.CreateFilterWithParameters(FilterComparisonType.Equal, "LI_BuildingId", LI_BuildingId )); var queryResult = query.GetEntityCollection(UserConnection); if (queryResult.Count == 1) { TablesNumber = queryResult[0].GetTypedColumnValue<int>(Number); } var myUpdate = new Update(UserConnection, "LI_Building") .Set("TablesNumber", new QueryParameter("TablesNumber", TablesNumber + 1, "Int")) .Where("LI_BuildingId").IsEqual(Column.Parameter(new Guid("LI_Building.LI_BuildingId"))); myUpdate.Execute(); return true;
Але створення нового запису поточного об'єкта не призводить до збільшення значення поля LI_Building.TablesNumber
"Ігор Андрусенко" написал:.Where("LI_BuildingId").IsEqual(Column.Parameter(new Guid("LI_Building.LI_BuildingId")));
Вот эта часть кажется странной
Вы обновляете таблицу LI_BuildingId, у нее разве есть поле LI_BuildingId? может просто Id? Что возвращает эта запись new Guid("LI_Building.LI_BuildingId") ?
.Where("Id").IsEqual(Column.Parameter(LI_BuildingId));
Если мое предположение про название колонки LI_BuildingId верно, то тут тоже нужно поменять на Id.
"Ігор Андрусенко" написал:query.Filters.Add(query.CreateFilterWithParameters(FilterComparisonType.Equal, "LI_BuildingId", LI_BuildingId ));
Всі зміни, які вношу в скрипт, ніяк не впливають на процес наповнення об'єктів значеннями.
Звідси запитання: а як перевірити, чи запускається процес взагалі ?
Игорь, доброе утро.
Можете отдалить исходный код процесса используя, к примеру, Visual Studio:
Там сказано наступне:
Использовать отладчик в BPMonline можно только в том случае, если система развернута у Вас локально – для базы OnDemand этого сделать не получится.
Я так розумію, це не мій варіант.
"Ігор Андрусенко" написал:Всі зміни, які вношу в скрипт, ніяк не впливають на процес наповнення об'єктів значеннями.
Звідси запитання: а як перевірити, чи запускається процес взагалі ?
Попробуйте отписаться от события LI_BoardInserted в дизайнере, а потом подписаться снова.