|
Проверить строки ТЗ на дубли по значениям пары реквизитов |
☑ |
0
Dmitriy_
Kolesnikov
24.08.17
✎
11:26
|
Когда надо проверить строки на дубли по значению одной колонки, я делаю так.
1. Создаю массив для элементов, которые не должны дублироваться
2. Обхожу ТЗ с последней строки, при этом ищу в новом массиве значение проверяемой колонки
3. Если значение в массиве найдено - удаляю текущую строку (потому что дубль). Если не найден - добавляю значение в массив имеющихся.
Теперь мне надо сравнить строки по дублированию пар значений (в двух колонках). То есть надо исключить ситуацию, когда в первой и второй колонке двух строк значения совпадают.
Какие вижу варианты:
1. При обходе создавать новую структуру, в неё добавлять два элемента: "ключ" первой - имя первой колонки, "ключ" второй - имя второй колонки, "значения" соответственно. Искать в массиве эту структуру. Если не найдена - добавлять её в массив.
2. При обходе создавать новое соответствие, в неё добавлять один элемент: "ключ" - значение первой колонки, "значение" - значение второй колонки. Дальше аналогично.
Какой вариант лучше?
Есть ли третий?
В таблицах мало строк будет (не больше 10)
|
|
1
Вафель
24.08.17
✎
11:29
|
Запросом
|
|
2
Вафель
24.08.17
✎
11:30
|
Это если номера строк нужны, если ненужны, то есть вариант попроще
|
|
3
lodger
24.08.17
✎
11:39
|
ну если так хочется просто накодить...
0) копируем ТЗ1 в ТЗ2
1) запускаем цикл обхода строк ТЗ1
2) внутри 1) запускаем обход ТЗ2
3) считаем сколько раз попались рек1 и рек2 из ТЗ1 в ТЗ2, когда счетчик больше 1, тогда запоминаем строки ТЗ2 в массив (перед запоминанием ищем строку в массиве, если нет добавим, если есть пропустим).
4) обойдем массив и из ТЗ2 удалим строки.
5) профит. ТЗ2 это ТЗ1 без дублей по вашим кастомным ключам.
|
|
4
Ёпрст
гуру
24.08.17
✎
11:40
|
Свернуть табличку - проще всего
|
|
5
mistеr
24.08.17
✎
11:42
|
(0) >Есть ли третий?
Классический. Скопировать, добавить колонку, Заполнить (единицей), Свернуть, НайтиСтроки
|
|
6
Dmitriy_
Kolesnikov
28.08.17
✎
02:02
|
(5) как в структуре ПараметрыОтбора в НайтиСтроки я укажу, что ищу "Количество" > 2?
О, придумал. Я буду искать количество = 1, а в цикле обхода ТЗ проверять, что строка не попадает в возвращенный массив строк.
|
|
7
Dmitriy_
Kolesnikov
28.08.17
✎
02:25
|
Вроде красиво и лаконично получилось. Колонок, по которым проверяем дубли, может быть произвольное количество.
// ВознагражденияБезнал: по Сотрудник + Должность
тзкВознагражденияБезнал = тзВознагражденияБезнал.Скопировать();
тзкВознагражденияБезнал.Колонки.Добавить("Кол", ОписаниеТиповЧ); // количество строк с одинаковым значением в проверяемой колонке (колонках)
тзкВознагражденияБезнал.ЗаполнитьЗначения(1, "Кол");
тзкВознагражденияБезнал.Свернуть("Сотрудник, Должность", "Кол");
ит = тзВознагражденияБезнал.Количество() - 1;
Пока ит > 0 цикл
стр = тзВознагражденияБезнал[ит];
масСтрТЗК = тзкВознагражденияБезнал.НайтиСтроки(новый Структура("Сотрудник, Должность", стр.Сотрудник, стр.Должность));
стрТЗК = масСтрТЗК[0];
Если стрТЗК.Кол > 1 тогда
тзВознагражденияБезнал.Удалить(стр);
стрТЗК.Кол = стрТЗК.Кол - 1;
КонецЕсли;
ит = ит - 1;
КонецЦикла;
|
|
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший