|
Как узнать родителя в Excel для конкретной строки. | ☑ | ||
---|---|---|---|---|
0
AlexKulikov
16.01.17
✎
11:21
|
Добрый день, уважаемые форумчане.
Столкнулся со следующей проблемой, а именно: Есть файл Excel в нем указана номенклатура по группам, в таком виде: Дуб Светлый дуб Заказ светлого дуба №1 Доска светлого дуба (кривая) Горбыль из светлого дуба Молот инквизитора из светлого дуба, освященный Заказ светлого дуба №2 Светлый дуб для забора Ламинат из светлого дуба Собственно вопрос, с помощью следующего кода <code> Лист.Rows(НС).OutlineLevel </code> Где НС - это номер строки, я могу узнать какой уровень родителя у каждой строки, по моему примеру это будет для группы Дуб - уровень 1, для светлого дуба - 2, для заказов - 3, и для строк - 4. А как понять какая именно строка к какой группе относится, где посмотреть имя родителя для каждой строки. Очень надеюсь на Вашу помощь, с уважением Алексей. |
|||
1
vicof
16.01.17
✎
11:33
|
5 секунд гугления, Алексей, 5 секунд. Это быстрее, чем создавать тему.
http://www.cyberforum.ru/vba/thread592172.html С уважением, Александр. |
|||
2
AlexKulikov
19.01.17
✎
14:59
|
Добрый день, уважаемые форумчане. Помогите пожалуйста, тупому барану загрузить номенклатуру по иерархии правильно.
Когда я первый раз гружу номенклатуру из excel Файла, у меня группы встают так как надо. Но если я начинаю грузить его повторно, то опять начинают создаваться новые группы. И я не могу понять, где я ошибаюсь. <code> &НаСервере Процедура ЗагрузитьНаСервере() Попытка Эксель = Новый COMОбъект("Excel.Application"); Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; НомерЛиста = 1; Книга = Эксель.Workbooks.Open(Объект.ИмяФайла); КоличествоЛистов = Книга.Sheets.Count; Лист = Книга.WorkSheets(НомерЛиста); ВсегоКолонок = Лист.Cells(1,1).SpecialCells(11).Column; ВсегоСтрок = Лист.Cells(1,1).SpecialCells(11).Row; //Поставщик = Лист.Cells(3,2).Value; ТаблицаНоменклатур = Новый ТаблицаЗначений; ТипЧисло = Новый ОписаниеТипов("Число"); ТаблицаНоменклатур.Колонки.Добавить("Номенклатура"); ТаблицаНоменклатур.Колонки.Добавить("НоменклатураКод"); ТаблицаНоменклатур.Колонки.Добавить("Цена"); ТаблицаНоменклатур.Колонки.Добавить("ЕденицаИзмерения"); ТаблицаНоменклатур.Колонки.Добавить("УровеньИерархии",ТипЧисло); ТаблицаНоменклатур.Колонки.Добавить("ИмяРодителя"); МассивРодителей = Новый Массив; ТекущийУровень = 1; МассивРодителей.Вставить(1, "Верхний"); Для НС = 11 по ВсегоСтрок Цикл // НС указываем с какой строки начинать обработку НоваяСтрока = ТаблицаНоменклатур.Добавить(); НоваяСтрока.Номенклатура = СокрЛП(Эксель.Cells(НС, 2).Text); НоваяСтрока.НоменклатураКод = СокрЛП(Эксель.Cells(НС, 3).Text); НоваяСтрока.Цена = СокрЛП(Эксель.Cells(НС, 5).Text); НоваяСтрока.ЕденицаИзмерения = СокрЛП(Эксель.Cells(НС, 6).Text); НоваяСтрока.УровеньИерархии = СокрЛП(Лист.Rows(НС).OutlineLevel); ТекущийУровень = Число(НоваяСтрока.УровеньИерархии); Если ТекущийУровень = 1 Тогда НоваяСтрока.ИмяРодителя = НоваяСтрока.Номенклатура; МассивРодителей.Установить(1,НоваяСтрока.ИмяРодителя); Иначе Если МассивРодителей.Количество() <= ТекущийУровень Тогда НоваяСтрока.ИмяРодителя = МассивРодителей[ТекущийУровень - 1]; МассивРодителей.Вставить(ТекущийУровень,НоваяСтрока.Номенклатура); Иначе ИскомаяСтрока = МассивРодителей.Получить(ТекущийУровень); НоваяСтрока.ИмяРодителя = МассивРодителей[ТекущийУровень - 1]; МассивРодителей.Установить(ТекущийУровень,НоваяСтрока.Номенклатура); КонецЕсли; КонецЕсли; КонецЦикла; Отбор = Новый Структура; ОтбрЗначение = 1; Отбор.Вставить("УровеньИерархии", ОтбрЗначение); НайденныеСтроки = ТаблицаНоменклатур.НайтиСтроки(Отбор); Для Каждого ТекСтрока Из НайденныеСтроки Цикл ТекСтрока.ИмяРодителя = ""; КонецЦикла; ТестСправочник = Справочники.Номенклатура.НайтиПоНаименованию("Полотна"); Эксель.Application.Quit(); НовыйДокументУстановкиЦенНоменклатуры = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент(); НовыйДокументУстановкиЦенНоменклатуры.Дата = ТекущаяДата(); МассивРодителейДляСправочникаНоменклатур = Новый Массив; ТекущийУровень = 1; МассивРодителейДляСправочникаНоменклатур.Вставить(1, "Верхний"); Для каждого Элемента Из ТаблицаНоменклатур Цикл // ищу наоменклатуру по наоименованию в справочнике СправочникНоменклатура = Справочники.Номенклатура.НайтиПоНаименованию(Элемента.Номенклатура); Если Не ЗначениеЗаполнено(СправочникНоменклатура) Тогда Если ПустаяСтрока(Элемента.Цена) Тогда НоваяГруппаСправочникаНоменклатуры = Справочники.Номенклатура.СоздатьГруппу(); НоваяГруппаСправочникаНоменклатуры.Наименование = Элемента.Номенклатура; УровеньРодителя = Элемента.УровеньИерархии; Родитель = Справочники.Номенклатура.ПустаяСсылка(); Если УровеньРодителя = 1 Тогда НоваяГруппаСправочникаНоменклатуры.Родитель = Родитель; НоваяГруппаСправочникаНоменклатуры.Записать(); Ссылка = НоваяГруппаСправочникаНоменклатуры.Ссылка; МассивРодителейДляСправочникаНоменклатур.Установить(УровеньРодителя,Ссылка); Иначе Если МассивРодителейДляСправочникаНоменклатур.Количество() <= УровеньРодителя Тогда Родитель = МассивРодителейДляСправочникаНоменклатур[УровеньРодителя - 1]; НоваяГруппаСправочникаНоменклатуры.Родитель = Родитель; НоваяГруппаСправочникаНоменклатуры.Записать(); Ссылка = НоваяГруппаСправочникаНоменклатуры.Ссылка; МассивРодителейДляСправочникаНоменклатур.Вставить(УровеньРодителя,Ссылка); Иначе Родитель = МассивРодителейДляСправочникаНоменклатур[УровеньРодителя - 1]; НоваяГруппаСправочникаНоменклатуры.Родитель = Родитель; НоваяГруппаСправочникаНоменклатуры.Записать(); Ссылка = НоваяГруппаСправочникаНоменклатуры.Ссылка; МассивРодителейДляСправочникаНоменклатур.Установить(УровеньРодителя,Ссылка); КонецЕсли; КонецЕсли; КонецЕсли; Иначе Если ПустаяСтрока(Элемента.Цена) Тогда СуперТестОпределинияРодителя = ОпределенияРодителяВСправочникеНоменклатураПоИмени(СправочникНоменклатура); НоваяГруппаСправочникаНоменклатуры = Справочники.Номенклатура.СоздатьГруппу(); НоваяГруппаСправочникаНоменклатуры.Наименование = Элемента.Номенклатура; УровеньРодителя = 0; УровеньРодителя = Элемента.УровеньИерархии; Родитель = Справочники.Номенклатура.ПустаяСсылка(); Если СуперТестОпределинияРодителя.Наименование <> Элемента.ИмяРодителя Тогда Если УровеньРодителя = 1 Тогда НоваяГруппаСправочникаНоменклатуры.Родитель = Родитель; НоваяГруппаСправочникаНоменклатуры.Записать(); Ссылка = НоваяГруппаСправочникаНоменклатуры.Ссылка; МассивРодителейДляСправочникаНоменклатур.Установить(УровеньРодителя,Ссылка); Иначе Если МассивРодителейДляСправочникаНоменклатур.Количество() <= УровеньРодителя Тогда Родитель = МассивРодителейДляСправочникаНоменклатур[УровеньРодителя - 1]; НоваяГруппаСправочникаНоменклатуры.Родитель = Родитель; НоваяГруппаСправочникаНоменклатуры.Записать(); Ссылка = НоваяГруппаСправочникаНоменклатуры.Ссылка; МассивРодителейДляСправочникаНоменклатур.Вставить(УровеньРодителя,Ссылка); Иначе Родитель = МассивРодителейДляСправочникаНоменклатур[УровеньРодителя - 1]; НоваяГруппаСправочникаНоменклатуры.Родитель = Родитель; НоваяГруппаСправочникаНоменклатуры.Записать(); Ссылка = НоваяГруппаСправочникаНоменклатуры.Ссылка; МассивРодителейДляСправочникаНоменклатур.Установить(УровеньРодителя,Ссылка); КонецЕсли; КонецЕсли; Иначе Если УровеньРодителя = 1 Тогда МассивРодителейДляСправочникаНоменклатур.Установить(УровеньРодителя,СправочникНоменклатура); Иначе Если МассивРодителейДляСправочникаНоменклатур.Количество() <= УровеньРодителя Тогда МассивРодителейДляСправочникаНоменклатур.Вставить(УровеньРодителя,СправочникНоменклатура); Иначе МассивРодителейДляСправочникаНоменклатур.Установить(УровеньРодителя,СправочникНоменклатура); КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; КонецЦикла; КонецПроцедуры </code> <code> &НаСервере Функция ОпределенияРодителяВСправочникеНоменклатураПоИмени(СправочникНоменклатураГруппа) ИскомыйРод = ""; Запрос = Новый Запрос; Запрос.УстановитьПараметр("Номенклатура", СправочникНоменклатураГруппа); Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Родитель |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.Ссылка = &Номенклатура"; РезультатЗапроса = Запрос.Выполнить(); ТаблицаРезультатаЗапроса = РезультатЗапроса.Выгрузить(); Для каждого элемента Из ТаблицаРезультатаЗапроса Цикл ИскомыйРод = Элемента.Родитель; КонецЦикла; Возврат ИскомыйРод; КонецФункции </code> |
|||
3
DrZombi
гуру
19.01.17
✎
15:19
|
(2) Раздели код на 2 части:
1. Чтение Екселя и помещение его в Древо, либо в ТЗ 2. Чтение ТЗ или Древа и запись его в БД Будет проще понимать :) |
|||
4
DrZombi
гуру
19.01.17
✎
15:20
|
+(2) Код громоздок и не читаемый, лениво
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |