5.x
Технические вопросы

Лічильник записів

З одного боку начебто можна ув"язати підрахунок створюваних записів у процес форми редагування запису з T2 з відповідним аналізом чи то вставка, чи просто модифікація існуючого запису.
З іншого - більш природнім є зав"язати підрахунок у процес створення запису на об'єкті T2.

Але, що один спосіб, що інший, для мене, поки що, однаково мало зрозумілі.
Не маю ще ясності щодо організації процесів
.
Дуже потребую, щоб хтось знаючий задав правильний напрямок думкам.

Нравится

15 комментариев

Ігоре, генерацію номера має сенс прив'язувати до картки, коли в нас відрізняється маска і номер залежно від типу запису, і для кожного з типів вікористовується окрема картка. В іншому випадку варто генерувати номер на збереження об'єкту.

Щось не повний текст мого повідомлення зберігся.

У мене акцент на підрахунку дочірніх записів.
Маю два об'єкти: T1,T2, зв'язані по полю T2.T1_id
В T1 є поле кількості дочірніх записів: T1.Number.
Потрібно при створенні нового запису в T2 збільшувати на одиницю значення поля T1.Number.

Советую посмотреть в сторону события
[javascript]
OnDatasetAfterPost(Dataset)
[/javascript]
в нем открываете отфильтрованый Dataset Т1 и увеличиваете на 1 поле Number.
Но при этом учтите удаление дочерних записей, что можно сделать аналогичным способом в событии
[javascript]
OnDatasetAfterDelete(Dataset)
[/javascript]

Здравствуйте, Игорь.

Можно получить значение T2.T1_id, считать текущее значение поля с количеством дочерних записей, увеличить его на 1, и выполнить update:

[csharp]
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();
[/csharp]

T1.Number + 1 - это переменная, которую нужно получить из объекта:

[csharp]
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(Num);
}
[/csharp]

Це потрібно на T2 добавити обробку подій

"После добавления записи"
і
"После удаления записи" ?

Створив "пул/дорожку/событийный подпроцесс/начальные сообщение Inserted/задание-сценарий"

в сценарии следующий текст:
[csharp]
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(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;
[/csharp]

Тільки код містить помилки.
Не сприймається наступна конструкція:
[csharp]
var LI_BuildingId = LI_Board.LI_BuildingId;
[/csharp]
Говорить,
An object reference is required for the non-static field, method or property
Terrasoft.Configuration.LI_Board.LI_BuildingId.get
хоча в метаданих объекту LI_Board є ось такий блок:
[xml]
{
"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"
}
[/xml]
Щось іще потрібно явно описувати самому ?

"Ігор Андрусенко" написал:Не сприймається наступна конструкція:
var LI_BuildingId       = LI_Board.LI_BuildingId;

Если Вы пишете этот код в обработчике события вставки сущности LI_Board, то нужно писать так:
[csharp]
var LI_BuildingId       = Entity.LI_BuildingId;
[/csharp]
Суть ошибки в том, что Вы пишете название класса LI_Board, это не экземпляр, а значит компилятор считает, что Вы обращаетесь к статическому свойству, а оно таковым не является.

Здравствуйте.

Получить значение какой-то из колонок можно следующим образом:

[csharp]
var LI_BuildingId = Entity.GetTypedColumnValue("LI_BuildingId");
[/csharp]

Щось не складається все до купи.
Зареєстрував подію:

"Намалював процес:"

Cкрипт обробника події наразі має такий вигляд:
[csharp]
var LI_BuildingId = Entity.GetTypedColumnValue("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(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;
[/csharp]
Але створення нового запису поточного об'єкта не призводить до збільшення значення поля 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") ?
[csharp]
.Where("Id").IsEqual(Column.Parameter(LI_BuildingId));
[/csharp]

Если мое предположение про название колонки LI_BuildingId верно, то тут тоже нужно поменять на Id.

"Ігор Андрусенко" написал:query.Filters.Add(query.CreateFilterWithParameters(FilterComparisonType.Equal, "LI_BuildingId", LI_BuildingId ));

Всі зміни, які вношу в скрипт, ніяк не впливають на процес наповнення об'єктів значеннями.
Звідси запитання: а як перевірити, чи запускається процес взагалі ?

Игорь, доброе утро.

Можете отдалить исходный код процесса используя, к примеру, Visual Studio:

http://www.community.terrasoft.ua/blogs/8747

Там сказано наступне:
[code]
Использовать отладчик в BPMonline можно только в том случае, если система развернута у Вас локально – для базы OnDemand этого сделать не получится.
[/code]
Я так розумію, це не мій варіант.

"Ігор Андрусенко" написал:Всі зміни, які вношу в скрипт, ніяк не впливають на процес наповнення об'єктів значеннями.
Звідси запитання: а як перевірити, чи запускається процес взагалі ?

Попробуйте отписаться от события LI_BoardInserted в дизайнере, а потом подписаться снова.

Показать все комментарии