Зацепило. Поигрался на тему. Сваял джоб-имитатор ситуации, использовав три временных буфера от таблицы InventTable. Получил набор хороших id-шников, которые можно засунуть, например, в map и далее уже без анализа использовать в цикле. Одним словом - выкладываю, а там, может, на что-то натолкнет еще...
P.S. 09:50 16.01.08. Добавил еще один временный буфер и сделал имитацию обновления исходной таблицы. Джоб обновил.
X++:
static void Test_6_star_7(Args _args)
{
InventTable table1_t; // исходная таблица
InventTable tmpTable1_m; // маски
InventTable tmpTable2_g; // хорошие id
InventTable tmpTable3_u; // обновления для хороших id
// InventTable inventTable;
;
// ниже везде id храним в ItemId, Amount в Height
//(просто так выбрали подходящие поля из InventTable)
// имитация table1 (исходная таблица)
table1_t.setTmp();
ttsbegin;
table1_t.ItemId = '7489'; table1_t.Height = 10; table1_t.doInsert();
table1_t.ItemId = '7569'; table1_t.Height = 11; table1_t.doInsert();
table1_t.ItemId = '6758'; table1_t.Height = 12; table1_t.doInsert();
table1_t.ItemId = '6547'; table1_t.Height = 13; table1_t.doInsert();
ttscommit;
/*
// а можно прочитать из реальной постоянной таблицы
// например, из inventTable
ttsbegin;
while select inventTable
{
table1_t.data(inventTable);
table1_t.doInsert();
}
ttscommit;
*/
info('--- 1. ДО ОБНОВЛЕНИЯ:');
while select table1_t
info( strFmt('id: %1, Amount: %2', table1_t.ItemId, table1_t.Height) );
// имитация tmpTable1 (маски)
tmpTable1_m.setTmp();
ttsbegin;
tmpTable1_m.ItemId = '*7'; tmpTable1_m.Height = 2; tmpTable1_m.doInsert();
tmpTable1_m.ItemId = '6*'; tmpTable1_m.Height = 3; tmpTable1_m.doInsert();
ttscommit;
// хорошие id - во временной служебной таблице
tmpTable2_g.setTmp();
ttsbegin;
while select ItemId, count(RecId)
from table1_t group by ItemId
join tmpTable1_m
where table1_t.ItemId like tmpTable1_m.ItemId
{
if (table1_t.RecId==1)
{
tmpTable2_g.ItemId = table1_t.ItemId;
tmpTable2_g.doInsert();
}
}
ttscommit;
// готовим набор обновлений (id и Amount) - во временной служебной таблице
tmpTable3_u.setTmp();
ttsbegin;
while
select ItemId from tmpTable2_g
join Height from tmpTable1_m
where tmpTable2_g.ItemId like tmpTable1_m.ItemId
{
tmpTable3_u.ItemId = tmpTable2_g.ItemId;
tmpTable3_u.Height = tmpTable1_m.Height;
tmpTable3_u.doInsert();
}
ttscommit;
info('--- 2. ОБНОВЛЕНИЯ:');
while select tmpTable3_u
info( strFmt('id: %1, addAmount: %2', tmpTable3_u.ItemId, tmpTable3_u.Height) );
// обновляем исходную таблицу
ttsbegin;
while
select forupdate table1_t join tmpTable3_u
where table1_t.ItemId == tmpTable3_u.ItemId
{
table1_t.Height += tmpTable3_u.Height;
table1_t.doUpdate();
}
ttscommit;
info('--- 3. ПОСЛЕ ОБНОВЛЕНИЯ:');
while select table1_t
info( strFmt('id: %1, Amount: %2', table1_t.ItemId, table1_t.Height) );
}
В окне infolog:
Код:
--- 1. ДО ОБНОВЛЕНИЯ:
id: 6547, Amount: 13.00
id: 6758, Amount: 12.00
id: 7489, Amount: 10.00
id: 7569, Amount: 11.00
--- 2. ОБНОВЛЕНИЯ:
id: 6758, addAmount: 3.00
--- 3. ПОСЛЕ ОБНОВЛЕНИЯ:
id: 6547, Amount: 13.00
id: 6758, Amount: 15.00
id: 7489, Amount: 10.00
id: 7569, Amount: 11.00