|
Проверить строки ТЗ на дубли по значениям пары реквизитов | ☑ | ||
---|---|---|---|---|
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; КонецЦикла; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |