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

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

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

Нравится

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

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

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

У мене акцент на підрахунку дочірніх записів.
Маю два об'єкти: 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:

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

Там сказано наступне:

Использовать отладчик в BPMonline можно только в том случае, если система развернута у Вас локально – для базы OnDemand этого сделать не получится.

Я так розумію, це не мій варіант.

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

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

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