ИТЗ: выборочное заполнение колонки в зависимости от другой колонки

Автор Злоп, 06 декабря 2024, 12:01

« назад - далее »

Злоп

Вот есть ИТЗ. В ней есть колонки (условно) "товар" и колонка со статусамив товаров, статусы задаются через Перечисление. Пусть это для примера будут перечисление Раз, Два, Три. На один товар, может быть несколько статусов. ИТЗ заполняется из Регистр.ВыгрузитьИтоги().
.
Статусов всего немного, 3 значения.
.
Требуется отсортировать или обеспечить выборку/перебор строк ИТЗ по товарам по "приоритетности" значений перечислений. Сначала должны обрабатываться строки по товару со статусом "Раз", потом этот же товар со статусом "два" итд. Т.е. порядок обработки д.б. такой:
.
ТоварN,Раз
ТоварN,Два
ТоварN,Три
----------
ТоварY,Раз
ТоварY,Два
----------
ТоварХ,Два
----------
ТоварM,Два
ТоварM,Три
----------
.
Сделать доп.колонку числовую и пробежаться по ней и для Раз проставить 1, для Два проставить 2 и потом отсортировать как надо? - как-то не очень красиво и как такое заполнение сделать быстро?
.
Или как еще?

Djelf

ЛевоеСоединение с ит с колонками СтатусПеречисление, СтатусЧисло  по  СтатусПеречисление

Djelf

P.S. я эти чтучки очень хорошо знаю, интенсивно пользовалься ими до выхода 1sqlite в реальный продакшен.
Джойны работают четко, последовательность применения нужно делать так как было бы в запросе - замечательная штука в ИТ.

Злоп

Я думал мало-мало чтото подобное. На малых выборках разницы по времени простого перебора и проставления 1,2,3 вряд ли будет ощутимо, на больших - хз...
Разве что упрощение кода по заполнению...

Djelf

А что ты считаешь большими таблицами?  ;D
На табличке в 3кк строк, заполнение левым соединением в 30 раз быстрее, чем перебор. 
249 мс, против 7387мс, а это уже существенно!

Злоп


Djelf

А самому было попробовать сложно?  :(
Зачем ты перекладываешь тестирование на других людей? 
Ну нет у нас все случаи жизни тестов, нет! 5-10 минут на создание твоего теста ушло... 
Сам мог бы сделать пару дней назад...

Злоп

Ээээ, как говорила чья-то бабушка
"Дай бог все уметь, но не дай бог самому все делать" ;-)

Злоп

А если такой вариант?
.
// ТипРезерва - перечисление, три значения
// Порядок - приоритетность по ТипРезерва
   ИТЗзаявки.НоваяКолонка("Порядок"); // для приоритетности распределения остатка по типам резервов
   ИТЗзаявки.ДобавитьИндекс("ТипРезерва","ТипРезерва");
      ИТЗзаявки.УстановитьФильтр(глЗаявкаНеподтвержденная,глЗаявкаНеподтвержденная,"ТипРезерва");
      ИТЗзаявки.ЗаполнитьКолонку("ТипРезерва","Порядок",3);
      ИТЗзаявки.УстановитьФильтр(глЗаявкаНаПоставку,глЗаявкаНаПоставку,"ТипРезерва");
      ИТЗзаявки.ЗаполнитьКолонку("ТипРезерва","Порядок",2);
      ИТЗзаявки.УстановитьФильтр(глЗаявкаНаСклад,глЗаявкаНаСклад,"ТипРезерва");
      ИТЗзаявки.ЗаполнитьКолонку("ТипРезерва","Порядок",1);
   ИТЗзаявки.УдалитьИндекс("ТипРезерва");

Djelf

Можно и так, но все равно медленее чем левым соединением, а без "*" в колонке индекса медленнее раз в 5.
ИТЗзаявки.ДобавитьИндекс("ТипРезерва","ТипРезерва");
+  ИТЗзаявки.ДобавитьИндекс("ТипРезерва","*ТипРезерва");

Злоп