![]() |
|
Поиск "дублей" в таблице значений | ☑ | ||
---|---|---|---|---|
0
ПравильнаЯ
14.03.06
✎
17:41
|
Как в таблице значений найти записи с одинаковыми колонками? Есть таблица значений из 11 колонок, из них две РасчетныйСчет и КодБанка. Надо оставить строки с повторяющимися значениями колонок РасчетныйСчет и КодБанка, те оставить строки с неуникальными значениями этих колонок. Подскажите какие нибудь идеи к алгоритму.
|
|||
1
Токс
14.03.06
✎
17:43
|
Самая простая идея: Свернуть()...
|
|||
2
smaharbA
14.03.06
✎
17:45
|
+ (1) На всякий случай Свернуть, Свернуть, Свернуть...
|
|||
3
Мулька
14.03.06
✎
17:46
|
Перед КонецЦикла запоминаешь значение.
После начала цикла сравниваешь новое значение с запомненным. Если равно - дубль |
|||
4
smaharbA
14.03.06
✎
17:46
|
(3) Афигеть...
|
|||
5
Мулька
14.03.06
✎
17:46
|
(3) + ест-но перед циклом сортировка по искомому полю
|
|||
6
Omega
14.03.06
✎
17:47
|
(3) по двум искомым полям? )
|
|||
7
smaharbA
14.03.06
✎
17:47
|
+ (4) А первое значение с чем сравнивать с "пустышкой" ?
|
|||
8
Мулька
14.03.06
✎
17:47
|
(4) Афигевай
|
|||
9
Allexe
14.03.06
✎
17:47
|
(0) Может проще на этапе формирования?
Для к=1 по ТЗ.КоличествоСтрок Цикл ТЗ.ПолучитьСтроку(к); Если ТЗ.РасчетныйСчет<>ТЗ.КодБанка Тогда ТЗ.УдалитьСтроку(к) КонецЕсли; КонецЦикла; |
|||
10
smaharbA
14.03.06
✎
17:48
|
(9) Ты этт счас придумал
(8) А Свернуть нафиха тогда есть? |
|||
11
Каанкереде
14.03.06
✎
17:48
|
уж сотка ближется, а автора все нет...
|
|||
12
Мулька
14.03.06
✎
17:50
|
(6) - по двум полям - два прогона ТЗ.
(10) И что ты узнаешь в результате сворачивания ? Разве что в доп.поле единицу прописать перед сворачиванием в каждую строку. Потом проверять на Если >=2 |
|||
13
КонецЦикла
14.03.06
✎
17:50
|
Я подожду (цы)
|
|||
14
По идее так 2
14.03.06
✎
17:52
|
Метод удаления строк из конкурса с проклаба (не помню кто автор):
Перем ТЗ_СЛУЖ; тз = СоздатьОбъект("ТаблицаЗначений"); //тз - исходная табличка значений //Заполнение тз: .................. // Удалим не дубли КонСтрока=Мин(тз.НоваяКолонка("СЛУЖ_КОЛ"), 0); тз.ВыбратьСтроки(); Пока тз.ПолучитьСтроку()=1 Цикл Если ТЗ.РасчетныйСчет=ТЗ.КодБанка Тогда КонСтрока=КонСтрока+1; тз.СЛУЖ_КОЛ=1; КонецЕсли; КонецЦикла; Если (КонСтрока=0) ИЛИ (КонСтрока=тз.КоличествоСтрок()) Тогда тз.КоличествоСтрок(КонСтрока); тз.УдалитьКолонку("СЛУЖ_КОЛ"); Иначе тз.Сортировать("-СЛУЖ_КОЛ"); тз.УдалитьКолонку("СЛУЖ_КОЛ"); тз.Выгрузить(ТЗ_СЛУЖ,,КонСтрока); тз=ТЗ_СЛУЖ; КонецЕсли; |
|||
15
ПравильнаЯ
14.03.06
✎
17:52
|
(11) Тута я. Читаю и думаю что применять...
|
|||
16
Allexe
14.03.06
✎
17:53
|
(10) Ваш код в студию
ТЗ.Свернуть(1,2,3,4,5,6,7,8,9,10,11) Вы так предлагаете? |
|||
17
smaharbA
14.03.06
✎
17:53
|
(12)
Вы не знаете кто такой Паниковский? Нет, Вы не знаете кто такой Паниковский... Тогда поезжайте в Киев и спросите. Спросите... Нет, Вы поезжайте и спросите... (с) |
|||
18
Мулька
14.03.06
✎
17:53
|
(15) Ну а если что б оставить только уникальные - то см.(9) тока, как говорится сзаду надо это делать. Ну и два прогона - по любому.
|
|||
19
smaharbA
14.03.06
✎
17:54
|
(16) Не пристало мне код тута писать на такой "тривиал" :)
|
|||
20
romix
модератор
14.03.06
✎
17:54
|
Теперь в графе количество будет 2 и более если задвоены строки. |
|||
22
smaharbA
14.03.06
✎
17:55
|
(18) По любому ?
|
|||
23
Мулька
14.03.06
✎
17:55
|
(22) По любому - для простоты. Из принципа - ест-но и гланды можно снизу выдрать
|
|||
24
Allexe
14.03.06
✎
17:56
|
:-)
Пусть скажет аффтар в (0) |
|||
25
Таня
14.03.06
✎
17:57
|
согласна с (19)
|
|||
26
Allexe
14.03.06
✎
17:58
|
(25) В чем согласна?
|
|||
27
ПравильнаЯ
14.03.06
✎
17:59
|
(24) Вот (20) точно можно использовать, в (14) еще не врубилась
|
|||
28
КонецЦикла
14.03.06
✎
18:00
|
(27) Да, только не забудь, что нужно узнать не сам факт существования строк, а еще ведь и удалить их :)
|
|||
29
Таня
14.03.06
✎
18:01
|
(26) в том что "Не пристало мне код тута писать на такой "тривиал"
|
|||
30
ПравильнаЯ
14.03.06
✎
18:03
|
(27) так все в другую таблицу и там удалить строки у которых Количество>1
|
|||
31
ПравильнаЯ
14.03.06
✎
18:08
|
(28) Смотри (30)
|
|||
32
КонецЦикла
14.03.06
✎
18:11
|
(30) Их там еще нужно найти... а однозначно это сделать не получится
Короче перебирай строки таблицы и попутно найденные значения заноси в список, например Если нет в списке - добавить, если есть - удалить тек. строку Проще, конечно, при формировании ТЗ это сделать Долго, но верно ЗЫ. имхо |
|||
33
romix
модератор
14.03.06
✎
18:15
|
(28) Два вложенных цикла. По свернутой таблице и по искомой.
Не забывать делать ВыбратьСтроки(); после каждого удаления строки. Тупой надежный алгоритм. Но при больших таблицах может выполняться долго. |
|||
34
ПравильнаЯ
14.03.06
✎
18:18
|
(32) Однозначно получиться - пронумеровать строки то я могу (Добавить еще одну колонку в ТаблицуЗначений). Но мой метод через две таблицы
(33) Вот так и попробую сделать. спасибо |
|||
35
Токс
14.03.06
✎
18:18
|
Уж тогда уж Сортировать()... и далее...
|
|||
36
smaharbA
14.03.06
✎
18:22
|
Всеж непонял, а чем Свернуть неглянется ?
Поясните для тупых и алкоголиков...(правдо) Млж чего и посоветую, и вопряки (19) код койнибудь напишу... |
|||
37
КонецЦикла
14.03.06
✎
18:22
|
(33) Мдя... зачем два, когда можно ОДНИМ?
(34) Угумс... пронумеровать и благополучно свернуть :) |
|||
38
Shaman100M
14.03.06
✎
18:40
|
(0) А в колонках значения повторяются?
|
|||
39
Тык
14.03.06
✎
18:50
|
Мулька в (3)+(5) самую правильную наводку дал ...
А всё остальное, что здесь сказали - чушь собачья! |
|||
40
Таня
14.03.06
✎
18:53
|
(39) эт точно :)
|
|||
41
Shaman100M
14.03.06
✎
18:56
|
+(3) + (5) + (39) Свертка ни при чем.
Можно такой алгоритм. 1. Таб2 с колонками "ОбщийСчет","Ссылка" 2. Данные из ТЗ в Таб2 построчно: Таб2.ОбщийСчет=ТЗ.РасчетныйСчет; Таб2.Ссылка=ТЗ.НомерСтроки; 3. Данные из ТЗ в Таб2 повторно: Таб2.ОбщийСчет=ТЗ.КодБанка; Таб2.Ссылка=ТЗ.НомерСтроки; 4. Сортировка Таб2.Сортировать("ОбщийСчет"); 5. Удаление строк из Таб2 для которых "ОбщийСчет" не повторяется. 6. Сортировка Таб2 по "Ссылка" - итог: номера строк в ТЗ, которые надо оставить. |
|||
42
smaharbA
14.03.06
✎
19:01
|
(39) А это полная лажо ?
Процедура Сформировать() ТЗ=СоздатьОбъект("ТаблицаЗначений"); ТЗ.НоваяКолонка("КодБанка"); ТЗ.НоваяКолонка("РасчетныйСчет"); ТЗ.НоваяКолонка("названиеБанка"); ТЗ.НоваяКолонка("Остаток"); ТЗ.НоваяСтрока(); ТЗ.КодБанка = 1; ТЗ.РасчетныйСчет = 2; ТЗ.названиеБанка = "Пупкинский"; ТЗ.Остаток = 256; ТЗ.НоваяСтрока(); ТЗ.КодБанка = 1; ТЗ.РасчетныйСчет = 2; ТЗ.названиеБанка = "ЗаПупкинский"; ТЗ.Остаток = 256; ТЗ.НоваяСтрока(); ТЗ.КодБанка = 2; ТЗ.РасчетныйСчет = 2; ТЗ.названиеБанка = "ОччПупкинский"; ТЗ.Остаток = 253; ТЗ.Свернуть("КодБанка,РасчетныйСчет","НазваниеБанка,Остаток"); ТЗ.ВыбратьСтроку(); КонецПроцедуры |
|||
43
Токс
14.03.06
✎
19:09
|
(42) Не буянь, лажевинько...
|
|||
44
smaharbA
14.03.06
✎
19:12
|
(43) Но ведь (0) решает, кто не верит (не о тебе) может проверить...(дублито сказано тока по 2 колонкам зырить, знчит значения остальных пох какое выйдет, хотя могу кинуть чтоб и все значения было видно, при чем будет "приляпано" к тем двум калонкам)
|
|||
45
smaharbA
14.03.06
✎
19:13
|
+(44) Если есть колонки с числовым значением но их ссумировать ненада, то легко преобразуются до текстовых перед тем как...
|
|||
46
Токс
14.03.06
✎
19:16
|
(44)Так вот и надо, получается, эти дубляные строки совсем не трогать... Я сам (0) по диагонали прочитал... Криво здесь Свёртывать()...
Из принципа можно и её прикрутить, но это будет "пятая нога"... |
|||
47
Токс
14.03.06
✎
19:18
|
(45) Так к чему не преобразовывай, а данные из других колонок потеряешь...
|
|||
48
smaharbA
14.03.06
✎
19:19
|
(46)(47) Тогда решения для (0) нету кроме (44) в скобочках после второй запятой...
|
|||
49
Shaman100M
14.03.06
✎
19:20
|
(44) не решает.
|
|||
50
smaharbA
14.03.06
✎
19:20
|
+(48) "...после первой запятой"
|
|||
51
smaharbA
14.03.06
✎
19:22
|
(49) Почитай (0) сказано по двум колонкам? - сказано, тогда остальные как уж получатся, суммы будут верны, а строки/субконтывсякие будут по первой, хотя в (44) в скобочках есть вариант чтоб и все другие колонки остались целы....
|
|||
52
smaharbA
14.03.06
✎
19:24
|
+(51) а вот как сделать чтоб было по 2 колонкам, но остальные видны - думайте, я "в танке", нескажу...
|
|||
53
Shaman100M
14.03.06
✎
19:24
|
(51) смотря что ты будешь делать после (42) Но в любом случае, свертка по 2 полям лишняя.
|
|||
54
smaharbA
14.03.06
✎
19:25
|
(53) Ты пробовал ? все что в (0) описано сделано, остальное в (44) и (52)...
|
|||
55
Shaman100M
14.03.06
✎
19:26
|
КодБанка РасчетныйСчет
2 4 4 2 После свертки останется в первозданном виде. |
|||
56
smaharbA
14.03.06
✎
19:29
|
(55) Да ну на... ты в точности повторил ?
КодБанка РасчетныйСчет НазваниеБанка Остаток 1 2 Пупкинский 512 2 2 ОччПупкинский2 253 |
|||
57
smaharbA
14.03.06
✎
19:31
|
Или такая лажо
Процедура Сформировать() ТЗ=СоздатьОбъект("ТаблицаЗначений"); ТЗ.НоваяКолонка("КодБанка"); ТЗ.НоваяКолонка("РасчетныйСчет"); ТЗ.НоваяКолонка("названиеБанка"); ТЗ.НоваяКолонка("Остаток"); ТЗ.НоваяСтрока(); ТЗ.КодБанка = 1; ТЗ.РасчетныйСчет = 2; ТЗ.названиеБанка = "Пупкинский"; ТЗ.Остаток = 256; ТЗ.НоваяСтрока(); ТЗ.КодБанка = 2; ТЗ.РасчетныйСчет = 2; ТЗ.названиеБанка = "ОччПупкинский"; ТЗ.Остаток = 253; ТЗ.НоваяСтрока(); ТЗ.КодБанка = 1; ТЗ.РасчетныйСчет = 2; ТЗ.названиеБанка = "ЗаПупкинский"; ТЗ.Остаток = 256; ТЗ.НоваяСтрока(); ТЗ.КодБанка = 2; ТЗ.РасчетныйСчет = 2; ТЗ.названиеБанка = "ччПупкинский"; ТЗ.Остаток = 253; ТЗ.Свернуть("КодБанка,РасчетныйСчет","НазваниеБанка,Остаток"); ТЗ.ВыбратьСтроку(); КонецПроцедуры |
|||
58
Shaman100M
14.03.06
✎
19:34
|
(57) крылья крылья... Хвост! на.. тебе свертка? Сортировка + прогон для повторов которые идут подряд! Сначала для "КодБанка" потом для "Расчетного счета". Как и говорил Мулька.
|
|||
59
smaharbA
14.03.06
✎
19:38
|
(58) А на сортировать и прогонять если и так все решается, если конечно условия сложнее тогда мож и сортировать...
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |