Форум программистов, компьютерный форум, киберфорум
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/141: Рейтинг темы: голосов - 141, средняя оценка - 4.74
0 / 0 / 0
Регистрация: 16.05.2009
Сообщений: 142
1

Поиск дублирующих строк в документе

16.02.2011, 15:18. Показов 27689. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В общем необходимо найти дубли в многострочном документе (дублем считается строка совпадающая с более ранней строкой по ряду параметров). Первоначально делал как отдельную процедуру - не работало. В итоге внес проверку в тело основной процедуры, в итоге заработало, но некорректно - за дубль программа принимает только предпоследнюю дублирующую строку в документе вне зависимости от того сколько их имеется. Поясню: например у нас 10 строк, строки 1 и 3 имеют дубликаты с номерами 2, 6 и 8,9 соответственно. Так вот, в результате проверки как дубль будет выведена только строка 8 и все!!


Код ( (Unknown Language)):
СписокДублей = СоздатьОбъект("СписокЗначений");
ВыбратьСтроки();
НомерПоПорядку=1;
Пока ПолучитьСтроку() = 1 Цикл

Если СписокДублей.НайтиЗначение (НомерПоПорядку)= 0 Тогда
Для СчетСтр=1 по КоличествоСтрок() Цикл
ПолучитьСтрокуПоНомеру(СчетСтр);
Если (СчетСтр<>НомерПоПорядку) Тогда
Если (Фамилия=ФамилияПациента) и (Имя=ИмяПациента) и
(Отчество=ВРЕГ(СокрЛП(ОтчествоПациента) и
ДатаРожд=ДатаРожденияПациента) и (Профиль =КодПрофиля) Тогда //
СписокДублей.ДобавитьЗначение(СчетСтр);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
ПолучитьСтрокуПоНомеру(НомерПоПорядку);
Если СписокДублей.НайтиЗначение (НомерПоПорядку)= 1 Тогда
Дубли="V";
КонецЕсли;
Если (Дубли="V") Тогда
ТЗ.НоваяСтрока();
ТЗ.Фамилия = Фамилия;
ТЗ.Имя = Имя;
ТЗ.Отчество = Отчество;
ТЗ.ДатаРождения = ДатаРожд;
ТЗ.Дубликат = Дубли;
КонецЕсли;
НомерПоПорядку=НомерПоПорядку+1;
КонецЦикла;

Таб=СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Ошибки");
Таб.ВывестиСекцию("Заголовок");
ТЗ.ВыбратьСтроки(); // открываем выборку строк из д. таблицы
Пока ТЗ.ПолучитьСтроку()=1 Цикл
Фамилия=ТЗ.Фамилия;
Имя=ТЗ.Имя;
Отчество=ТЗ.Отчество;
ДатаРождения = ТЗ.ДатаРождения;
Повтор = ТЗ.Дубликат;
Таб.ВывестиСекцию("Ошибка");
КонецЦикла;
Таб.ТолькоПросмотр(1);
Таб.ПараметрыСтраницы(1,100,1);
Таб.Показать("Ошибки","");
Список параметров для сравнения и количество полей в Таблице Значений сокращены для улучшения читаемости; за вывод результата отвечает переменная Повтор печатной формы "Ошибки". Вроде бы простецкая задачка, а все никак не могу наладить корректный вывод результатов ;)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.02.2011, 15:18
Ответы с готовыми решениями:

Упорядочивание строк в документе
Процедура УпорядочитьСтроки() Если Вопрос(&quot;Упорядочить строки?&quot;,&quot;Да+Нет&quot;) = &quot;Да&quot; Тогда ТЗН =...

7.7 Количество строк в документе
Добрый день! Проблема состоит в следующем: имеется документ Прайс, табличная часть которого...

Очистка строк в табличном документе
Событие Команды &amp;НаКлиенте Процедура Команда1(Команда) НаСервере(); КонецПроцедуры ...

Нарушение порядка строк в документе
В протоколе было 660 строк, расположенных в алфавитном порядке. После удаления нескольких строк...

8
0 / 0 / 0
Регистрация: 01.01.2010
Сообщений: 226
16.02.2011, 15:26 2
А какое действие должно быть в результате нахождения дубля?
И много строчек может быть в т.ч. ?
0
0 / 0 / 0
Регистрация: 01.01.2010
Сообщений: 226
16.02.2011, 15:35 3
Вообщем так. Лень разбираться в коде, преложу такой вариант.
- выгружаеш в тз;
- задаеш переменную дубль=0;
- Выборка строк;
- пока получаеш строку перебираеш тз, если находиш дубль по параметрам - ставиш переменную+1;
- В конце проверка - Если дубль>1 тогда действие;
- обнуление переменной;
Вообщем как-то так
0
0 / 0 / 0
Регистрация: 16.05.2009
Сообщений: 142
16.02.2011, 15:35 4
Цитата Сообщение от TimeDontWait
А какое действие должно быть в результате нахождения дубля?
И много строчек может быть в т.ч. ?
Ну я вообще хотел сделать такой алгоритм:

Предварительно создаю список значений. Далее начинаю перебирать строки документа. Если номер текущей строки отсутствует в СЗ, то начинаем проверять все строки документа с первой по последнюю. При совпадении указанных параметров заносим номер строки (из второго цикла) в СЗ (естественно строку с самой собой не сравниваем). После окончания проверки позиционируемся опять на нужную строку (НомерПоПорядку) и проверяем наличие этого номера в СЗ, если есть - то переменную Дубли приравниваем к "V". Далее при наличии ошибки заносим данные по человеку в ТЗ, по окончании полного цикла проверки перебираем ее строки и выводим на экран.
Строчек может быть и 1, и 1000, я пока проверяю на маленьких примерах (копирую 2-3 строки по 2-3 раза и запускаю проверку). Код очень корявый, но он работает, правда совсем не так как надо(
0
0 / 0 / 0
Регистрация: 16.05.2009
Сообщений: 142
16.02.2011, 15:55 5
Цитата Сообщение от TimeDontWait
Вообщем так. Лень разбираться в коде, преложу такой вариант.
- выгружаеш в тз;
- задаеш переменную дубль=0;
- Выборка строк;
- пока получаеш строку перебираеш тз, если находиш дубль по параметрам - ставиш переменную+1;
- В конце проверка - Если дубль>1 тогда действие;
- обнуление переменной;
Вообщем как-то так
Умная мысль, тоже думал попробовать вариант с ТЗ, но детально еще не продумывал. Спасибо огромное за подсказку! ;)
Завтра с утра проверю все, а то осталось 15 минут и процессор уже совсем не варит..
0
0 / 0 / 0
Регистрация: 01.01.2010
Сообщений: 226
16.02.2011, 16:02 6
Цитата Сообщение от BBDragon
процессор уже совсем не варит
Не только у вас)
Сам уже домой иду, устал седня по самое...
0
1 / 1 / 0
Регистрация: 15.11.2009
Сообщений: 947
16.02.2011, 23:05 7
Цитата Сообщение от TimeDontWait
- выгружаеш в тз;
- задаеш переменную дубль=0;
Да, мысль с переменной можно развить.
- выгружаеш в тз;
- добавить колонку Дубль
- пройти по строкам и проставить 1
- Свернуть. Полей для сравнения вижу много.
Получается компактненько.
0
0 / 0 / 0
Регистрация: 22.04.2010
Сообщений: 38
17.02.2011, 14:34 8
выгрузить таб часть в 2 таблицы значений, одну свернуть по параметрам и сравнить количество строк отличается, есть дубли строк
0
0 / 0 / 0
Регистрация: 16.05.2009
Сообщений: 142
17.02.2011, 15:15 9
Уфф.. наконец-то, я это сделал. Сделал с использованием второй ТЗ и СЗ, но дело было совсем не в этом. Виновата была строчка


Код ( (Unknown Language)):
Если СписокДублей.НайтиЗначение (НомерПоПорядку)= 1 Тогда
Помня, что если значение не найдено, то возвращается 0, я автоматически решил, что при обнаружении возвращаться должно 1, не удосужившись проверить синтаксис
Само собой что при выводе он видел только первую дублирующую строку
Хула мне, стало быть и позор

Потратил кучу времени на элементарную процедуру, но еще раз понял простую мысль:
Если алгоритм правильный, а что-то не получается - надо обязательно проверить синтаксис.

Всем еще раз спасибо
0
17.02.2011, 15:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.02.2011, 15:15
Помогаю со студенческими работами здесь

7.7 Контекстный Поиск В Документе
Добрый день. В одном документе пропал контекстный поиск, причем во всех колонках сразу. В чем может...

Порядок строк в документе "на основании"
Доброго дня! Возник вопрос - в документе, вводимом на основании меняется порядок строк относительно...

Проверка дублирующих записей в табличной части документа
Всем привет! Мне необходимо выполнить проверку на наличие дублирующих строк в табличной части...

Удаление дублирующих строк в ListView
Есть процедура которая добавляет строки в ListView простенький пример ниже (процедура вызывается...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru