|
Подчиненные строки дерева в таблицу значений | ☑ | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0
STAYEKR
27.09.12
✎
14:56
|
Всем добра! Стоит задача выгрузки данных 1с в ексель. Выгрузка осуществляется некорректно, т.к. выгружаются только "родительские" строки. Возник вопрос: как сделать так, чтобы выгружались и вложенные строки? Использую следующий код (нашел в инете):
Процедура ВыгрузитьРезультатВExcel(ТаблицаРезультата) //ЦЕЛЬ: Выгрузить данные табличной части формы в файл Excel Попытка ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager"); Исключение Предупреждение(ОписаниеОшибки() + Символы.ПС + "программа OpenOffice не установлена на данном компьютере!"); Возврат; КонецПопытки; Desktop = ServiceManager.createInstance("com.sun.star.frame.Desktop"); Свойства = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue"); Свойства.Name = "AsTemplate"; Свойства.Value = Истина; Args = Новый COMSafeArray("VT_VARIANT", 3); Args.SetValue(0, Свойства); Свойства1 = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue"); Свойства1.Name = "Hidden"; Свойства1.Value = Истина; Args.SetValue(1, Свойства1); Document = Desktop.LoadComponentFromURL("private:factory/scalc", "_blank", 0, Args); Sheets = Document.getSheets(); Sheet = Sheets.getByIndex(0); мИтКол = 0; Для каждого кол из ТаблицаРезультата.Колонки Цикл Sheet.getCellByPosition(мИтКол,0).setString(кол.Имя); мИтКол = мИтКол + 1; КонецЦикла; ВсегоСтрок = ТаблицаРезультата.Количество(); ВсегоКолонок = ТаблицаРезультата.Колонки.Количество(); МассивКОМ = Новый COMSafeArray("VT_VARIANT", ВсегоСтрок,ВсегоКолонок); иткол = 0; итстр = 0; Для каждого стр из ТаблицаРезультата Цикл Для каждого кол из ТаблицаРезультата.Колонки Цикл стрРез = СокрЛП(стр[кол.Имя]); МассивКОМ.SetValue(итстр,иткол,стрРез); иткол = иткол+1; КонецЦикла; иткол = 0; итстр = ?(итстр=ВсегоСтрок,0,итстр+1); КонецЦикла; begCol = 0; begRow = 1; endCol = ВсегоКолонок-1; endRow = ВсегоСтрок; Range = Sheet.getCellRangeByPosition(begCol, begRow, endCol, endRow); Range.setDataArray(МассивКОМ); //Document.storeToURL(ПривестиФайлКУРЛ(ПутьКФайлу),Args); Свойства2 = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue"); Свойства2.Name = "FilterName"; Свойства2.Value = "MS Excel 97"; Args.SetValue(2,Свойства2); Document.GetCurrentController().GetFrame().GetContainerWindow().SetVisible(Истина); КонецПроцедуры; Буду признателен за любую помощь |
||||||||||||||||
1
STAYEKR
27.09.12
✎
14:59
|
+(0) при этом выводить "корневую" строку не надо. А с этим кодомона выводится
|
||||||||||||||||
2
Азат
27.09.12
✎
15:00
|
(0) идею могу подсказать за косарик
|
||||||||||||||||
3
Азат
27.09.12
✎
15:00
|
слово РЕ-КУР-СИЯ ни о чем не говорит?
|
||||||||||||||||
4
STAYEKR
27.09.12
✎
15:01
|
(2) Косарика у меня нету, любезнейший. Рекурсия - страшное слово, мало о чем говорит
|
||||||||||||||||
5
Мимо Проходил
27.09.12
✎
15:03
|
(3) Чтобы понять рекурсию, надо понять рекурсию (с) не мое
|
||||||||||||||||
6
STAYEKR
27.09.12
✎
15:03
|
(3) но от Вашей идейки не отказался бы!
|
||||||||||||||||
7
Maxus43
27.09.12
✎
15:04
|
зачем именно дерево выгружать? выгружай ТЗ с добавлением колонки "Родитель" типа таго
|
||||||||||||||||
8
STAYEKR
27.09.12
✎
15:06
|
(3) про рекурсия прочитал, проникся. А при чем здесь она?
(7) можно примерчик, уважаемый? |
||||||||||||||||
9
STAYEKR
27.09.12
✎
15:07
|
(7)я в отдельной процедуре перегоняю ДЗ в ТЗ, а ТЗ потом уже выгружаю в ОО.
|
||||||||||||||||
10
zladenuw
27.09.12
✎
15:07
|
При работе с деревом главное понять, что каждая строка дерева это коллекция подчиненных строк (возможно пустая)
|
||||||||||||||||
11
Maxus43
27.09.12
✎
15:08
|
(9) ну фигово перегоняеш, если строк подчинённых нет
|
||||||||||||||||
12
STAYEKR
27.09.12
✎
15:09
|
(10) я догадываюсь об этом. Только не могу понять, как выгружать вложенные строки, а не родительскую.
|
||||||||||||||||
13
STAYEKR
27.09.12
✎
15:10
|
Вот так перегоняю. Что не так?
Функция ВыгрузитьДеревоЗначенийВТаблицуЗначений(ДеревоЗаказы, ТаблицаРезультата) Если ТаблицаРезультата = Неопределено Тогда ТаблицаРезультата = Новый ТаблицаЗначений; Для Каждого Колонка Из ДеревоЗаказы.Колонки Цикл ТаблицаРезультата.Колонки.Добавить(Колонка.Имя, Колонка.ТипЗначения); КонецЦикла; КонецЕсли; Для Каждого СтрокаДерева Из ДеревоЗаказы.Строки Цикл ЗаполнитьЗначенияСвойств(ТаблицаРезультата.Добавить(), СтрокаДерева.Строки); //ВыгрузитьДеревоЗначенийВТаблицуЗначений(СтрокаДерева, ТаблицаРезультата); КонецЦикла; Возврат ТаблицаРезультата; КонецФункции; |
||||||||||||||||
14
Kashemir
27.09.12
✎
15:11
|
Процедура ОбходимДЗ(Строки)
Для каждого Строка из Строки Цикл Если Строка.Строки.Количество() = 0 Тогда // это нижняя ветка Иначе ОбходимДЗ(Строка.Строки); КонецЕсли; КонецЦикла КонецПроцедуры ОбходимДЗ(ДеревоЗначение.Строки); |
||||||||||||||||
15
zladenuw
27.09.12
✎
15:11
|
|||||||||||||||||
16
STAYEKR
27.09.12
✎
15:13
|
(15) Спасибо, но не осилил.
(14) Это для перегона из ДЗ в ТЗ? |
||||||||||||||||
17
Kashemir
27.09.12
✎
15:14
|
(16) Неа - просто получение "кроны" дерева.
|
||||||||||||||||
18
КуплюКровать
27.09.12
✎
15:15
|
нужно учить одно из двух слов: рекурсия, косарик
|
||||||||||||||||
19
STAYEKR
27.09.12
✎
15:22
|
(18) Косарик поможет осуществить твою голубую мечту?
(17) "Крона" уже с вложенными строками будет? |
||||||||||||||||
20
STAYEKR
27.09.12
✎
15:27
|
Помогите нубу, гуры и гурии!
|
||||||||||||||||
21
Kashemir
27.09.12
✎
15:28
|
Процедура ОбходимДЗ(Строки)
Для каждого Строка из Строки Цикл Если Строка.Строки.Количество() = 0 Тогда // в переменной Строка ветка самого нижнего уровня... без подчиненных Сообщить("Прувет - я мелкая Ветка "); Иначе // здесь в переменной Строка ветка, имеющая подчиненные Сообщить("Хеллоу - я большаяВетка"); ОбходимДЗ(Строка.Строки); КонецЕсли; КонецЦикла КонецПроцедуры ОбходимДЗ(ДеревоЗначение.Строки); |
||||||||||||||||
22
STAYEKR
27.09.12
✎
15:37
|
(21) Прошу прощения за откровенную тупежку, но никак не пойму, что нужно писать в закомментаренных Вами областях :(
|
||||||||||||||||
23
Kashemir
27.09.12
✎
15:43
|
(22) В закомментаренных областях переменная Строка принимает последовательно (в иерархии) значения каждой ветки дерева. Следовательно можно вставить нужный обработчик для строки
|
||||||||||||||||
24
STAYEKR
27.09.12
✎
15:56
|
(23) Беда. Как эту иерархию описать?
|
||||||||||||||||
25
Kashemir
27.09.12
✎
16:00
|
Представь себе дерево:
Элемент 1 - Элемент 1.1 - Элемент 1.2 -- Элемент 1.2.1 -- Элемент 1.2.2 --- Элементы 1.2.2.1 -- Элемент 1.2.3 - Элемент 1.3 Элемент 2 - Элемент 2.1 Именно в током порядке как видишь и будет осуществлен обход дерева приведенной функцией. Так где стоят комментарии, переменная Строка принимаем значение Элемент N Может хоть так понятнее ? |
||||||||||||||||
26
STAYEKR
27.09.12
✎
16:04
|
Дерево себе представляю. Из Ваших постов понял (возможно, ошибочно), что в зависимости от "Строка.Строки.Количество()" циклом должны обходится либо вложенные ветки, либо родительские. Так? Если так, то не могу себе представить сам цикл
|
||||||||||||||||
27
STAYEKR
27.09.12
✎
16:06
|
+(26) т.е. ЧТО должно быть написано в каждом случае (кол-во = о и иначе)
|
||||||||||||||||
28
Kashemir
27.09.12
✎
16:08
|
(27) Проверка на количество подчиненных нужна в случае если надо разделить обработчики конечных строк и имеющих подчиненные. Если такового не требуется
Процедура ОбходимДЗ(Строки) Для каждого Строка из Строки Цикл // вставляем обработчик для Строка // ... ОбходимДЗ(Строка.Строки); КонецЕсли; КонецЦикла КонецПроцедуры ОбходимДЗ(ДеревоЗначение.Строки); |
||||||||||||||||
29
STAYEKR
27.09.12
✎
16:41
|
Для Каждого СтрокаДерева Из ДеревоЗаказы.Строки Цикл
Для н=0 по ДеревоЗаказы.Строки.Количество()-1 Цикл ЗаполнитьЗначенияСвойств(ТаблицаРезультата.Добавить(), СтрокаДерева.Строки[н]); КонецЦикла; КонецЦикла; не так должно примерно выглядеть? |
||||||||||||||||
30
Kashemir
27.09.12
✎
16:42
|
(29) А где рекурсивный вызов ? Ну обойдешь ты первый уровень ... а глубже ?
|
||||||||||||||||
31
vmv
27.09.12
✎
16:44
|
тупая ветка
|
||||||||||||||||
32
STAYEKR
27.09.12
✎
16:45
|
Вот и не знаю :( Поэтому, собсно, обратился. ПомогЁте?
|
||||||||||||||||
33
STAYEKR
27.09.12
✎
16:45
|
(31) Не спорю. От Ваших гениальных постов она умней не станет, дядя
|
||||||||||||||||
34
Kashemir
27.09.12
✎
16:46
|
(32) Ты не в состоянии использовать готовое решение. Не вижу чем тут еще можно помочь.
|
||||||||||||||||
35
STAYEKR
27.09.12
✎
16:47
|
(34) Большое спасибо за потраченное на меня время! Буду курить матан
|
||||||||||||||||
36
STAYEKR
27.09.12
✎
16:49
|
(34) рекурсивный вызов это вызов процедуры в самой себе?
|
||||||||||||||||
37
Kashemir
27.09.12
✎
16:50
|
(36) Да
|
||||||||||||||||
38
STAYEKR
27.09.12
✎
16:51
|
Запилил так: (процедра называется "ВыгрузитьДеревоЗначенийВТаблицуЗначений(ДеревоЗаказы, ТаблицаРезультата)")
Для Каждого СтрокаДерева Из ДеревоЗаказы.Строки Цикл Для н=0 по ДеревоЗаказы.Строки.Количество()-1 Цикл ЗаполнитьЗначенияСвойств(ТаблицаРезультата.Добавить(), СтрокаДерева.Строки[н]); ВыгрузитьДеревоЗначенийВТаблицуЗначений(ДеревоЗаказы, ТаблицаРезультата); КонецЦикла; КонецЦикла; Рухнуло все и 1с закрылась :( |
||||||||||||||||
39
vmv
27.09.12
✎
16:52
|
(36) его уже в школе в старших классах учат, зачем ты с 5-го решил заняться программированием, подрасти надо
|
||||||||||||||||
40
STAYEKR
27.09.12
✎
16:54
|
(39) А я люблю сразу со сложного начинать. Вот сидел, беседовал с мудрым человеком. А тут рррраз! и Наимудрейший самый ценный в этой ситуации Секрет открыл! Расти, говорит, надо! Спасибо огромное! Жизнь моя отныене никогда не будет прежней! Спасибо!
|
||||||||||||||||
41
vmv
27.09.12
✎
16:55
|
(40) главное - скажи нет наркотикам и все получиться)
|
||||||||||||||||
42
STAYEKR
27.09.12
✎
16:56
|
(37) в (38) суть верна? Не могу проверить, падает 1с :(
|
||||||||||||||||
43
STAYEKR
27.09.12
✎
16:57
|
(41) Я с постижением Великой Истины сказал нет всему: еде, друзьям, сну. На наркотики и раньше не было времени, куда уж теперь
|
||||||||||||||||
44
vmv
27.09.12
✎
16:58
|
ВыгрузитьДеревоЗначенийВТаблицуЗначений(ДеревоЗаказы
ты в рекурсию передаешь тот же узел, что вошел в текущий вызов и как итог зацикленность и падение, я же говорю расти надо |
||||||||||||||||
45
STAYEKR
27.09.12
✎
16:58
|
(44) Спасибо. А как же её тогда вызывать, енту рекурсию?
|
||||||||||||||||
46
vmv
27.09.12
✎
16:59
|
(45) загуглить и найти на викии статью "Рекурсия для самых маленьких"
|
||||||||||||||||
47
STAYEKR
27.09.12
✎
17:01
|
(46) в вики про рекурсию все ясно. Даже для не самых маленьких. А в 1С не совсем. Думаю, подсказав чуток, Добрый Дядя приблизил бы Юного Падавана к изучению Матана.
|
||||||||||||||||
48
Kashemir
27.09.12
✎
17:02
|
(45) Падает очевидно потому что зацикливается. Как вызывать смотри (14) (21) (28)
|
||||||||||||||||
49
vmv
27.09.12
✎
17:03
|
(47) рекурсия в Африке рекурсия и нечего врать, что в 1С она по другим правилам работает
и я не потакаю лени, хотел написать и тупости тоже, но это будет не политкорректно |
||||||||||||||||
50
STAYEKR
27.09.12
✎
17:05
|
(49) а что же так несмело? или боитесь, что пативен выедет в НЭзалЭжну? Так и написали бы. Я не говорю, что в 1С она работает по другому. Пршу ткнуть носом посильнее в то место, где её внедрить.
|
||||||||||||||||
51
Kashemir
27.09.12
✎
17:06
|
По мотивам (13) твое творения должно выглядеть примерно так:
Функция ВыгрузитьДеревоЗначенийВТаблицуЗначений(ДеревоЗаказы, ТаблицаРезультата) Если ТаблицаРезультата = Неопределено Тогда ТаблицаРезультата = Новый ТаблицаЗначений; Для Каждого Колонка Из ДеревоЗаказы.Колонки Цикл ТаблицаРезультата.Колонки.Добавить(Колонка.Имя, Колонка.ТипЗначения); КонецЦикла; КонецЕсли; ОбходимДЗ(ДеревоЗаказы.Строки, ТаблицаРезультата); Возврат ТаблицаРезультата; КонецФункции; Процедура ОбходимДЗ(Строки, ТЗ) Для каждого Строка из Строки Цикл ЗаполнитьЗначенияСвойств(ТЗ.Добавить(), Строка); ОбходимДЗ(Строка.Строки, ТЗ); КонецЦикла; КонецПроцедуры |
||||||||||||||||
52
vmv
27.09.12
✎
17:06
|
(50) на понт меня решил взять, щенок?)
тебя уже ткнули и не раз, до свидания |
||||||||||||||||
53
STAYEKR
27.09.12
✎
17:11
|
На кол бы Вас взять, дядя. прямо неполиткорректной хохляцкой ж*пой, да погулбже! А вообще, в хохлостане, я гляжу, все боксеры! Кто в Раде, кто по-переписке! Неунывающие такие пенсионеры))
|
||||||||||||||||
54
vmv
27.09.12
✎
17:13
|
(53) да я живу в демократической стране, в которой каждый имеет право быть клоуном - не завидуй!)
|
||||||||||||||||
55
STAYEKR
27.09.12
✎
17:15
|
(54) Не забудьте, пожалуйста, принять свой галоперидол. Сегодня лучше даже двойную дозу. До свидания!
|
||||||||||||||||
56
vmv
27.09.12
✎
17:16
|
(55) пока, карапуз)
|
||||||||||||||||
57
STAYEKR
27.09.12
✎
17:22
|
(51) Огромное спасибО! Все работает! Еще раз благодарю за потраченные нервы и время!
|
||||||||||||||||
58
Stim
27.09.12
✎
17:23
|
деньги в кассу форума занесите, не забудьте
|
||||||||||||||||
59
STAYEKR
27.09.12
✎
17:27
|
(58) а вы не подмазывайтесь, гражданин! Вот заебдетесь также, тогда поговорим
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |