|
Изменить ТЗ в Дерево значений | ☑ | ||
---|---|---|---|---|
0
bUbA
01.07.13
✎
13:44
|
Есть таблица значений, мне её нужно заменить на дерево значений. Узлы должны создаваться по значениям колонки Код, если длина кода 4 символа - это первый узел, если 6 символов - второй. Как это реализовать можно?
|
|||
1
ДенисЧ
01.07.13
✎
13:46
|
ЗАпросом, разумеется
|
|||
2
Поросенок Петр
01.07.13
✎
13:46
|
Что пытался сделать, что не получилось...
|
|||
3
Maxus43
01.07.13
✎
13:48
|
я за запрос
|
|||
4
bUbA
01.07.13
✎
13:48
|
(1) эта таблица получилась путём выгрузки из xls, никаких запросов не было...
|
|||
5
Славен
01.07.13
✎
13:49
|
(4)залей твое тз в запрос и уже оттуда сделай дерево
|
|||
6
ptiz
01.07.13
✎
13:50
|
Чем простой перебор не устраивает?
|
|||
7
bUbA
01.07.13
✎
13:52
|
(5) через временные таблицы?
|
|||
8
Поросенок Петр
01.07.13
✎
13:59
|
(6) +1.
А нащщет адептов запросов, отметившихся в этой ветке, хотелось бы услышать каким образом будет построена произвольная иерархия без использования СКД. |
|||
9
Поросенок Петр
01.07.13
✎
14:01
|
Плюс, наверняка, отношение элементов к узлам явно не задано в ТЗ, а следует из текущего порядка строк.
|
|||
10
Professor83
01.07.13
✎
14:09
|
(9)
Выбрать Выбор когда Код ПОДОБНО "____" тогда //4 символа 1 Когда Код Подобно "______" тогда //6 символов 2 Когда код подобно "________" тогда //8 символов 3 Конец КАК Уровень из &МояТаблица Как-то так наверное? :) |
|||
11
Nexux
01.07.13
✎
14:10
|
скд
|
|||
12
hhhh
01.07.13
✎
14:14
|
(8) ИТОГИ в запросе вроде без использования СКД делают дерево
|
|||
13
pessok
01.07.13
✎
14:16
|
в упыпырище есть метод, познает рекурсию, чтобы познать рекурсию. а вообще, да, запросом с итогами
|
|||
14
pessok
01.07.13
✎
14:16
|
(8) идет курить матчасть, да
|
|||
15
AaNnDdRrEeYy
01.07.13
✎
14:17
|
и еще
Дерево = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); вот тогда точно дерево получишь. |
|||
16
Поросенок Петр
01.07.13
✎
14:18
|
(12) ИТОГИ добавляют новые строки, сортировка по иерархии требует иерархический объект (справочник, например)...
Что из этого может помочь? |
|||
17
Поросенок Петр
01.07.13
✎
14:21
|
(14) Если за матчасть считаешь своё поверхностное знание работы запросов, то да, таких у меня нет. И не нужно.
|
|||
18
AaNnDdRrEeYy
01.07.13
✎
14:22
|
(16)>>Что из этого может помочь?
матчасть поможет |
|||
19
Поросенок Петр
01.07.13
✎
14:23
|
(18) Присоединяюсь к ТС, жду гени(т)ального решения на запросах.
|
|||
20
AaNnDdRrEeYy
01.07.13
✎
14:25
|
пример таблицы в студию.
|
|||
21
pessok
01.07.13
✎
14:29
|
ВЫБРАТЬ Ном, ВЫБОР КОГДА Код > ПОДСТРОКА(Код, 1, 4) ТОГДА 1 ИНАЧЕ 2 КАК Уровень Из &Таблица КАК Таблица
; ВЫБРАТЬ * ИЗ Таблица ИТОГИ ПО Уровень |
|||
22
pessok
01.07.13
✎
14:29
|
">" заменить на "="
|
|||
23
pessok
01.07.13
✎
14:30
|
ну и поместить там не забыть, есессна
|
|||
24
bUbA
01.07.13
✎
14:31
|
Если ЛистЭксель = Неопределено Тогда
ЛистЭксель = ПолучитьCOMОбъект(,"Excel.Application"); КонецЕсли; Если ВсегоСтрок = 0 Тогда ВсегоСтрок = ЛистЭксель.Cells.SpecialCells(11).Row; КонецЕсли; //Если ВсегоКолонок = 0 Тогда // ВсегоКолонок = ЛистЭксель.Cells.SpecialCells(11).Column; //КонецЕсли; Если ИмпортируемыеКоды = Неопределено Тогда ИмпортируемыеКоды = Новый ТаблицаЗначений; Для Счетчик = 1 По ВсегоКолонок Цикл ИмпортируемыеКоды.Колонки.Добавить("Колонка"+Счетчик, Новый ОписаниеТипов("Строка")); КонецЦикла; КонецЕсли; Счетчик1 = 0; Для Счетчик = НомерПервойСтроки По ВсегоСтрок Цикл Попытка Код = ЛистЭксель.Cells(Счетчик, 1).Value; Код = СтрЗаменить(Код, Символы.НПП, ""); Если СокрЛП(Код) = "" Тогда Продолжить; КонецЕсли; Счетчик1 = Счетчик1 + 1; НоваяСтрока = ИмпортируемыеКоды.Добавить(); НоваяСтрока.Номер = Счетчик1; НоваяСтрока.Код = Код; НоваяСтрока.Наименование = ЛистЭксель.Cells(Счетчик, 2).Value; НоваяСтрока.Ставка = ЛистЭксель.Cells(Счетчик, 3).Value; Исключение Сообщить("Ошибка чтения строки файла Microsoft Excel." + Счетчик + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание); КонецПопытки; Состояние("Обработка файла Microsoft Excel : " + "строка " + Счетчик + " из " + ВсегоСтрок); КонецЦикла; ЛистЭксель = Неопределено; Возврат ИмпортируемыеКоды; |
|||
25
pessok
01.07.13
✎
14:31
|
хотя не, чепуху написал :) пойду обедать
|
|||
26
pessok
01.07.13
✎
14:32
|
(24) эммм. а почему нельзя СРАЗУ делать ДЗ в твоем случае?
|
|||
27
bUbA
01.07.13
✎
14:41
|
(26) потому что в документе экселя всё построчно идёт, а в 1с мне нужно сгруппировать инфу и запихнуть в справочник
|
|||
28
pessok
01.07.13
✎
14:44
|
НоваяСтрока = ИмпортируемыеКоды.Добавить();
НоваяСтрока.Номер = Счетчик1; НоваяСтрока.Код = Код; НоваяСтрока.Наименование = ЛистЭксель.Cells(Счетчик, 2).Value; НоваяСтрока.Ставка = ЛистЭксель.Cells(Счетчик, 3).Value; ИмпортируемыеКоды сделай ДЗ, а не ТЗ, и по своему условию делай ИмпортируемыеКоды.Строки.Добавить() Иили ИмпортируемыеКоды.Строки.Строки.Добавить() |
|||
29
bUbA
01.07.13
✎
14:45
|
(28) но получается, что это будет обход в цикле, без запроса
|
|||
30
Trainee
01.07.13
✎
14:48
|
(0) Если док. записываешь, можно и перебором(хотя, там будет поиск в колонке, говорят, это затратно по времени работает)
Если не записываешь, запросом, тогда ТЗ придется Выгрузить() предварительно. Только дерево - это скорее красиво, чем хорошо. По итогу у тебя будет 2 таблицы, если в дереве будет какой-нибудь расчет-пересчет, то запаришься, потом править. |
|||
31
bUbA
01.07.13
✎
14:49
|
пока у меня что то такое получилось
Для Каждого Строка Из ИмпортируемыеКоды Цикл Если СтрДлина(Строка.Код) = 4 Тогда СтрокаВерхнегоУровня = ДеревоКодов.Строки.Добавить(); СтрокаВерхнегоУровня.Код = Строка.Код; СтрокаВерхнегоУровня.Наименование = Строка.Наименование; СтрокаВерхнегоУровня.Ставка = Строка.Ставка; СтрокаВерхнегоУровня.Номер = Строка.Номер; КонецЕсли; Если СтрДлина(Строка.Код) = 10 Тогда СтрокаНижнегоУровня = ДеревоКодов.Строки.Добавить(); СтрокаНижнегоУровня.Код = Строка.Код; СтрокаНижнегоУровня.Наименование = Строка.Наименование; СтрокаНижнегоУровня.Ставка = Строка.Ставка; СтрокаНижнегоУровня.Номер = Строка.Номер; КонецЕсли; Если СтрДлина(Строка.Код) = 6 Тогда ПодчиненнаяСтрока = ДеревоКодов.Строки.Добавить(); ПодчиненнаяСтрока.Код = Строка.Код; ПодчиненнаяСтрока.Наименование = Строка.Наименование; ПодчиненнаяСтрока.Ставка = Строка.Ставка; ПодчиненнаяСтрока.Номер = Строка.Номер; КонецЕсли; //Если СтрДлина(Строка.Код) = 10 Тогда // СтрокаНижнегоУровня = ДеревоКодов.Строки.Добавить(); // СтрокаНижнегоУровня = Строка.Код; //КонецЕсли; КонецЦикла; |
|||
32
bUbA
01.07.13
✎
14:53
|
(30) потом всё это будет записываться в справочник, ну и пересчетов там быть не должно
|
|||
33
zladenuw
01.07.13
✎
15:14
|
(31) прочитай про ЗаполнитьЗначенияСвойств
Если СтрДлина(Строка.Код) = 4 Тогда СтрокаВерхнегоУровня = ДеревоКодов.Строки.Добавить(); ЗаполнитьЗначенияСвойств(СтрокаВерхнегоУровня,Строка); КонецЕсли; |
|||
34
bUbA
01.07.13
✎
15:42
|
если мне теперь необходимо записать всё это в справочник, лучше использовать метод СоздатьГруппу() или СоздатьЭлемент()?
|
|||
35
bUbA
01.07.13
✎
16:23
|
ещё вопрос, как можно сравнить шестизначное число с первыми шестью цифрами десятизначного числа? возможно ли такое вообще?
|
|||
36
bUbA
01.07.13
✎
16:38
|
никто не знает, или так нельзя сравнивать?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |