|
v7: Группировка строк ... Свернуть()? | ☑ | ||
---|---|---|---|---|
0
BLP
07.07.16
✎
00:20
|
Есть какая-то ТЗ с двумя колонками, поля оба текстовые , например,
А а А п Б р А ж Б ю Надо вывести в печатную таблицу в сгруппированном виде А апж или ещё лучше а, п, ж Б рю или р, ю Т.Е. Получается свернуть() по первой колонке, а по второй сложить тексты. Если бы там были чиста, то все понятно, сложилась бы общая сумма. А как быть в моей ситуации ? |
|||
1
ИсчадиеADO
07.07.16
✎
00:27
|
2 списка значений каких нить. че сложного?
|
|||
2
Изучаю1С8
07.07.16
✎
00:27
|
Перебором
|
|||
3
Злопчинский
07.07.16
✎
01:39
|
Идем по исходной тз
Делаем новую тз Каждое новое уник значение первой колонки порождает новую строку Каждое новое уник значение второй колонки порождает новую колонку с 1 в ячейке |
|||
4
Злопчинский
07.07.16
✎
01:40
|
это тупотнавскидку
Можно наверняка и красивее придумать |
|||
5
Это_mike
07.07.16
✎
06:42
|
(4) красиво - это 1с++ и группировать(). Но все равно перебор понадобится.
Или запросом 1sqlite (новой версии. |
|||
6
Ёпрст
07.07.16
✎
09:25
|
(0) запрос на 1sqlite + group_concate
select Колонка1, Колонка2,group_concat(Колонка1) from tab group by Колонка1, Колонка2 |
|||
7
skafandr
07.07.16
✎
09:56
|
(3)
немного не так 1. Каждое новое уник значение первой колонки порождает новую строку 2. при повторе в первой колонке,добавлять к строке во второй колонке ","+значение второй колонки исходной таблицы.Если нужно не повторять букавки во второй колонке,сначала делать проверку на наличие в строке второй колнки попавшейся буквы |
|||
8
BLP
07.07.16
✎
10:07
|
Спасибо за советы
Пытаюсь делать как в (3) т.к. Мне более-менее понятно С остальными возможностями пока не "дружу" ;) |
|||
9
Это_mike
07.07.16
✎
10:15
|
(7) проверка - долго. проще лобавлять во вложенный сз или вложенную тз
|
|||
10
BLP
07.07.16
✎
10:20
|
Пои итогам отпишусь, получилось-не получилось и что не получилось если не получилось )
|
|||
11
skafandr
07.07.16
✎
10:23
|
(8)
Не очень понимаю как для "вывести в печатную таблицу в сгруппированном виде" помогут новые колонки с 1. По моему алгоритму во второй колонке новой таблицы сразу формируется строка для печати "а,п,ж". |
|||
12
Ёпрст
07.07.16
✎
10:29
|
(8) че там делать то ?
Процедура Сформировать() Попытка база = СоздатьОбъект("SQLiteBase"); Исключение ЗагрузитьВнешнююКомпоненту("1sqlite.dll"); база = СоздатьОбъект("SQLiteBase"); КонецПопытки; база.Открыть(":memory:"); запрос = база.НовыйЗапрос(); ТЗ = СоздатьОбъект("ТаблицаЗначений"); ТЗ.НоваяКолонка("Колонка1","Строка"); ТЗ.НоваяКолонка("Колонка2","Строка"); Для к = 1 По 10 Цикл ТЗ.НоваяСтрока(); ТЗ.Колонка1 = "Колонка"+к%2; ТЗ.Колонка2 = "Вася"+к; КонецЦикла; база.УложитьТЗ(ТЗ,"Табличка",0); ТекстЗапроса = " |select Колонка1,group_concat(Колонка2) from Табличка group by Колонка1"; ТЗ = запрос.ВыполнитьЗапрос(ТекстЗапроса); ТЗ.ВыбратьСтроку(); Возврат; ТЗ = запрос.ВыполнитьЗапрос(ТекстЗапроса); ТЗ.ВыбратьСтроку(); КонецПроцедуры |
|||
13
Это_mike
07.07.16
✎
10:30
|
(10) если не получится - не в форум писать надо, а заявление в отдел кадров...
|
|||
14
BLP
07.07.16
✎
10:45
|
(13) спасибо и за этот совет, но совсем не в тему из-за незнания ситуации.
И фирмы нет, и отдела кадров нет, и бухгалтерии нет, и конфа самописная для собственных целей и никак не связаная с бух учётом... так что... е надо умничать ;) Остальным спасибо (8) вот так и должно быть в идеале, что-то крутится вокруг да около, но "просто" не получается. (12) спасибо!!!! Верю опыту, что так и должно быть. Но Сейчас своё уже доделаю, посмотрю, хотя у меня "сложным путём все", потом попробую как в (12) - уверен, что лучше. Тупо скопировать и юзать - это роще всего, а хочется разобраться на будущее, понять, чтобы такие для 1сГуру "простые" вопросы не задавать. |
|||
15
BLP
07.07.16
✎
10:48
|
(11) я написал свой (8) когда еще не видел ваш (11)
Тоже учитываю спс |
|||
16
BLP
07.07.16
✎
10:53
|
(7) 2. при повторе в первой колонке,добавлять к строке во второй колонке ","+значение второй колонки исходной таблицы.Если нужно не повторять букавки во второй колонке,сначала делать проверку на наличие в строке второй колнки попавшейся буквы
"Буковки" или их набор не повторяются ни у кого, так что задача упрощается ;) |
|||
17
Это_mike
07.07.16
✎
11:05
|
(14) задачка-то школьная.
|
|||
18
BLP
07.07.16
✎
11:11
|
(17) Верю, но за все время мне впервые пришлось столкнуться с такой задачкой и свернуть().
Сейчас прост для большей наглядности покажу что у меня получается и что НАДО получить ЕСТЬ Список с людями и их номерами в выставчном каталоге :) Aggersbol 249 Aggersbol 250 Aggersbol 251 Akerman 19 Alsmark 312 Altier 320 Ambo 147 Ambo 173 ------------------------ НАДО чтобы было Aggersbol 249, 250, 251 Akerman 19 Alsmark 312 Altier 320 Ambo 147,173 |
|||
19
BLP
07.07.16
✎
11:17
|
В результате всего вот такой код у меня получился. Но выдает после формирования такое сообщение
TZ1.УстановитьЗначепние(CatNr,Str,"Nr1"); {C:\USERS\BLP\EXTFORMS\111.ERT(37)}: Number is out of the value range! <code> TZ=CreateObject("ТаблицаЗначений"); TZ1=CreateObject("ТаблицаЗначений"); TZ2=CreateObject("ТаблицаЗначений"); TZ.NewColumn("FIO"); TZ.NewColumn("Nr"); TZ1.NewColumn("FIO1"); TZ1.NewColumn("Nr1"); TZ2.NewColumn("FIO2"); TZ2.NewColumn("Nr2"); Док.SelectLines(); While Док.GetLine()>0 Do TZ.NewLine(); TZ.FIO=Док.Владелец; TZ.Nr=Док.NrCat; TZ1.NewLine(); TZ1.FIO1=Док.Владелец; TZ1.Nr1=Док.NrCat; EndDo; TZ1.GroupBy("FIO1","Nr1"); TZ.SelectLines(); While TZ.GetLine()>0 Do Str=""; TZ1.НайтиЗначение(TZ.FIO,Str,"FIO1"); CatNr=TZ1.ПолучитьЗначение(Str,"Nr1")+TZ.Nr; TZ1.УстановитьЗначение(CatNr,Str,"Nr1"); EndDo; TZ1.SelectLines(); While TZ1.GetLine()>0 Do Tab.PutSection("List_DE"); EndDo; </code> |
|||
20
Это_mike
07.07.16
✎
11:22
|
(19) a chto, russkii yazik - ne rodnoy?
|
|||
21
BLP
07.07.16
✎
11:28
|
(20) Нет, надо на англ ). Честно.
Если и пишу код по-Русски (для быстроты) при написании, потом переделываю на англ |
|||
22
Ёпрст
07.07.16
✎
11:29
|
(19)
// TZ1.УстановитьЗначение(CatNr,Str,"Nr1"); TZ1.SetValue(Str,"Nr1",CatNr); |
|||
23
BLP
07.07.16
✎
11:30
|
(20) т.к. Не всегда русскоязычная Клава под рукой )
|
|||
24
Это_mike
07.07.16
✎
11:40
|
(21) возникает ТрадиционныйКитайскийВопрос™
хотя ответа на него я уже почему-то боюсь... |
|||
25
skafandr
07.07.16
✎
11:45
|
Блин как замудрили то, с точностью до языка операторов
<code> Док.SelectLines(); While Док.GetLine()>0 Do Str=""; Если TZ.НайтиЗначение(Док.Владелец,Str,"FIO")>0 Тогда CatNr=TZ.ПолучитьЗначение(Str,"Nr"); TZ.SetValue(Str,"Nr",CatNr+","+Док.NrCat); Иначе TZ.NewLine(); TZ.FIO=Док.Владелец; TZ.Nr=Док.NrCat; КонецЕсли; EndDo; TZ.SelectLines(); While TZ.GetLine()>0 Do Tab.PutSection("List_DE"); EndDo; </code> |
|||
26
skafandr
07.07.16
✎
11:45
|
сорри за кривость, ни разу код не вставлял
|
|||
27
BLP
07.07.16
✎
11:47
|
(19) Спасиб, ГЛАВНОЕ - получилось. Уже легче.
Только почему-то первый номер задваивается... Вот что я получил на выходе. <code> Ahrend Kathrin 12, 12, 11, 10, Almandinger Daniela 72, 72, 87, Aymar Ulrich 185, 185, 186, Bakker de Bruin 209, 209, 197, Bekiesch Arin 127, 127, 128, Bierlein Sandra 53, 53, 107, Binder Lydia 78, 70, 71, 78, Brauer Petra 56, 56, 59, 89, Bцhm Christian 220, 220, 221, Bьttner Romana 148, 148, 147, Bьttner Thilo 223, 223, Christen Heidi 20, 20, 4, Dechant Brigitte 24, 24, 22, </code> |
|||
28
BLP
07.07.16
✎
12:01
|
Упс, некоторые посты удалены... Сыылки на их номера сбились...
(25) А вот в Вашем варианте получается так Ahrend Kathrin 12, Ahrend Kathrin 11, Ahrend Kathrin 10, Almandinger Daniela Stefanie 72, Almandinger Daniela Stefanie 87, Aymar Ulrich 185, Aymar Ulrich 186, Т.е. не свернулось ))) |
|||
29
BLP
07.07.16
✎
12:20
|
(25) Упс, сорри за (28).
Тоже работает... и без 2-й ТЗ. Но также выводит задвоенные первые номера как в отчете (27) :( |
|||
30
BLP
07.07.16
✎
12:24
|
Итак... почти (если не считать задвоенные первые номера) рабочий код (только с одной ТЗ).
Ребят, ну, помогите ышо, пжалста, как убрать дубли ))) <code> Док = Form.Параметр; Док.SortLines("Владелец"); Tab=CreateObject("Table"); Tab.SourceTable("Participants"); TZ=CreateObject("ТаблицаЗначений"); TZ.NewColumn("FIO"); TZ.NewColumn("Nr"); Док.SelectLines(); While Док.GetLine()>0 Do TZ.NewLine(); TZ.FIO=Док.Владелец; TZ.Nr=""+Док.NrCat; EndDo; Док.SelectLines(); While Док.GetLine()>0 Do Str=""; Если TZ.НайтиЗначение(Док.Владелец,Str,"FIO")>0 Тогда CatNr=TZ.ПолучитьЗначение(Str,"Nr"); TZ.SetValue(Str,"Nr",CatNr+","+Док.NrCat); Иначе TZ.NewLine(); TZ.FIO=Док.Владелец; TZ.Nr=Док.NrCat; КонецЕсли; EndDo; TZ.GroupBy("FIO","Nr"); TZ.SelectLines(); While TZ.GetLine()>0 Do Tab.PutSection("List_DE2"); EndDo; Tab.Options(0,0,0,0,,"PrintExhibitors"); Tab.PageSetup(1,100,,10,,10,10,,,1,,глПолучитьПринтерПоУмолчанию()); Tab.Show("Print of List of Exhibitors",""); </code> |
|||
31
Ёпрст
07.07.16
✎
12:26
|
(30) полный ПЭ..
Док.SelectLines(); While Док.GetLine()>0 Do TZ.NewLine(); TZ.FIO=Док.Владелец; TZ.Nr=""+Док.NrCat; EndDo; это выкини из кода нахрен |
|||
32
skafandr
07.07.16
✎
12:28
|
Значит всё-таки в каких-то доках дублятся комнаты
вместо Если TZ.НайтиЗначение(Док.Владелец,Str,"FIO")>0 Тогда CatNr=TZ.ПолучитьЗначение(Str,"Nr"); TZ.SetValue(Str,"Nr",CatNr+","+Док.NrCat); Иначе Если TZ.НайтиЗначение(Док.Владелец,Str,"FIO")>0 Тогда CatNr=TZ.ПолучитьЗначение(Str,"Nr"); Если Найти(CatNr,Док.NrCat)=0 Тогда TZ.SetValue(Str,"Nr",CatNr+","+Док.NrCat); КонецЕсли; Иначе |
|||
33
skafandr
07.07.16
✎
12:30
|
а зачем первый раз то ТЗ заполняете?
я привел ПОЛНЫЙ текст - больше ничего не нужно |
|||
34
skafandr
07.07.16
✎
12:32
|
(31) +500
|
|||
35
BLP
07.07.16
✎
12:48
|
(31) и (34) Согласен... )))) Просто уже в глазах все рябит... НО!
Теперь все СУПЕР как надО!!! Спасиб, ГОСПОДА!!!!!!!!!!!!! |
|||
36
BLP
10.07.16
✎
13:30
|
Еще раз спасибо всем. Прoстo всегда бoялся ТЗ, пoэтoму никoгда их не делал и не испoльзoвал, как тo oбхoдился другими спoсoбами.
Пoсле этoй темы, накoнец-тo, в этих ТЗ и СЗ разoбрался и... пoнеслo! Наклепал нoвых oбрабoтoк, o кoтoрых раньше тoка мечтал. ))) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |