Имя: Пароль:
1C
 
Поиск "дублей" в таблице значений
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

тз=СоздатьОбъект("ТаблицаЗначений");
тз.НоваяКолонка("РассчетныйСчет");
тз.НоваяКолонка("КодБанка");
тз.НоваяКолонка("Количество");


//Заполняем единицами Количество

тз.Заполнить(1,,,"Количество");

...

тз.Свернуть("РассчетныйСчет,КодБанка","Количество");


Теперь в графе количество будет 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) А на сортировать и прогонять если и так все решается, если конечно условия сложнее тогда мож и сортировать...
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.