15.01.2008, 20:58 | #19 |
Moderator
|
Зацепило. Поигрался на тему. Сваял джоб-имитатор ситуации, использовав три временных буфера от таблицы 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) ); } Код: --- 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 |
|