Добавлено: Вс Сен 02, 2012 11:43 am Заголовок сообщения:
Никак, потому что в RepWizard нет строк. Там есть многоуровневая структура элементов. Корневой элемент - Root. В него вложено Children элементов. В свою очередь, если уровней больше одного, в элементы первого уровня вложены элементы второго уровня. И т.д. до уровня Levels.
Добавлено: Пн Сен 03, 2012 7:39 am Заголовок сообщения:
Oleksandr писал(а):
Спасибо. Я так и подумал, но лучше уточнить. Вдруг есть какое-то свойство/метод, которое даст это значение.
И что же вы хотели бы получить в результате? Как получить количество элементов в дереве? Ветки считать, или только листья? А если некоторые листья растут на 2 ветках сразу??? Какой ответ вас устраивает?
Для каждой коллекции есть Count. Если вам нужно количество строк, которые получатся, если сделать из отчета Sheet - то таки MakeSheet и потом Rows. Но врядли вам именно это надо
Добавлено: Пн Сен 03, 2012 9:08 am Заголовок сообщения:
Oleksandr писал(а):
Это как????
....
Сойдет этот способ. Только нужно 7 отнять (или 8, если есть атрибуты. вроде так)
Всяко бывает Один и тот же элемент в разных ветках (например, документ). Кто его знает, какой у вас отчет и с чем работает
Способ-то сойдет, но перебирать у вас все равно не получится. Идти надо по каждой вложенной коллекции отдельно. А таким образом количество можно использовать разве что для Meter'a, когда вначале перебора общее количество листьев еще не известно. Но MakeSheet работает дольше простого перебора для получения количества всех вложенных деревьев, потому это использование тоже сомнительно.
Добавлено: Пн Сен 03, 2012 10:45 am Заголовок сообщения:
kris писал(а):
Способ-то сойдет, но перебирать у вас все равно не получится. Идти надо по каждой вложенной коллекции отдельно. А таким образом количество можно использовать разве что для Meter'a, когда вначале перебора общее количество листьев еще не известно.
Смысл вообще в следующем. Есть процедуры/функции, работающие либо с двумерным массивом, полученным из рекордсет, либо с самим рекордсетом. Чтоб их использовать, нужно подготовить результат RepWizard.
Далее решение (поправьте, если есть способы получше):
1. Выясняем размерность массива (.MakeSheet (false); узнаем Rows; узнаем Columns)
2. ReDim Array (Columns, Rows)
3. Заполняем массив перебором всех веток. (Из построенного Sheet нельзя напрямую брать данные, если нужны ID элементов, а не их наименования, я правильно понимаю?)
Для получения размерности массива удобнее использовать MakeSheet, даже если он работает дольше (уверен, время построения в любом случае будет не критично, даже на больших результатах)
kris писал(а):
MakeSheet работает дольше простого перебора для получения количества всех вложенных деревьев
Добавлено: Пн Сен 03, 2012 1:08 pm Заголовок сообщения:
Строго говоря, вы не правы.
1. Размер шита может даже примерно не соответствовать количеству элементов во всех уровнях. Пример? Запросто: показывать обороты в столбик.
2. Можно использовать Redim Preserve. На него есть некоторые ограничения, но в вашем случае они не применимы. Да, работает чуток медленне - каждый раз в цикле добавляется выделение памяти.
3. С шитом работать - вообще гиблое дело. Только с Root.
В частном случае ваша схема применима. Но я же не знаю, откуда вы берете RepWizard и насколько этот случай частный?
З.Ы. На больших объемах RepWizard не работает Ну, точнее, работает, но часы Может имеет смысл написать запрос и вернуть готовый RS?
Добавлено: Вт Сен 04, 2012 8:01 am Заголовок сообщения:
Oleksandr писал(а):
Смысл вообще в следующем. Есть процедуры/функции, работающие либо с двумерным массивом, полученным из рекордсет, либо с самим рекордсетом. Чтоб их использовать, нужно подготовить результат RepWizard.
Чет я все равно не понял. Какая связь между RepWizad и Recordset ?
Есть данные. Они могут быть подготовлены либо мастером отчетов либо запросом. Мастер отчетов возвращает древовидную структуру repWizard, запрос - двумерный массив.
Есть лист электронной таблицы, который нужно заполнить этими данными, но не в стандартном виде (MakeSheet), а в произвольном.
Хочется написать универсальную процедуру, которая бы принимала оба варианта для автоматического заполнения шита ?
Добавлено: Вт Сен 04, 2012 8:08 am Заголовок сообщения:
Oleksandr писал(а):
Может я и не прав, но стараюсь использовать ОМ там где позволяет сложность выборки. А с каких объемов "листьев" начинает тормозить RepWizard?
Трудно дать какой-то конкретный ответ. Все зависит от сложности визарда и фазы луны
Если в визарде аналитики, то даже на относительно небольшой базе могут быть проблемы. Аналогично - если много уровней. С другой стороны если визард по 311 счету в разрезе дат - скорее всего будет хорошо работать долго и счастливо.
Я в своей практике от визардов полностью отказался уже лет 5 назад. Пускай и тянется в базе пару сотен хранимок, да они пишутся за минуты, а хлеба не просят. И отрабатывают мгновенно. Главное - именовать их по-людски :)
З.Ы. Вот для теста попробовал отчет по платежам за год в базе около 2гб:
* корреспондент-документ: 2 мин (18000 строк)
* корреспондент-документ-аналитика: задолбался ждать, после 10 мин вырубил
* корреспондент-дата: 8 сек (3000 строк)
* корреспондент-дата-аналитика: 20 сек (9000 строк)
В базе объемом 25 гиг аналогичный отчет не строится. Вообще. Даже за 1 день.
З.З.Ы. Все зависит не от количества листьев. А от объема базы и сложности (количества уровней и их содержимого). Визард может работать полдня и вернуть в результате 3 строки. Я не ковырялся в механизме работы визарда, тут есть товарищи, которые истинно постигли принцип его работы, может скажут что-то в дополнение
Последний раз редактировалось: kris (Вт Сен 04, 2012 8:13 am), всего редактировалось 1 раз
Добавлено: Вт Сен 04, 2012 8:13 am Заголовок сообщения:
Oleksandr писал(а):
Может я и не прав, но стараюсь использовать ОМ там где позволяет сложность выборки. А с каких объемов "листьев" начинает тормозить RepWizard?
Все зависит от объема информации в базе, показателей их порядка в мастере отчета. Конкретный запрос, в отличии от запроса мастера отчетов, можно оптимизировать.
Например, база 150 тыс проводок и 50 тыс партий. Мастер строит отчет по 1 корр., ОУ в разрезе партий порядка 5 минут. Тот же отчет запрос строит за пару секунд.
Почему так медленно строит мастер, не разбирался. Быстрее было сделать отчет на запросе.
Очень может быть, что медленно работает именно процесс заполнения объекта RepWizard. Это сильно видно, когда меняешь местами показатели. Например, отчет ОУ+партия строится медленнее, чем партия + ОУ.
Добавлено: Вт Сен 04, 2012 8:31 am Заголовок сообщения:
olimp писал(а):
Хочется написать универсальную процедуру, которая бы принимала оба варианта для автоматического заполнения шита ?
Это не обязательно Sheet. Это может быть что угодно, и диалог и форма и даже мессаж бокс или другая процедура не связанная с контролами. Если процедур работающих с двумерным массивом (типа рекордсета) много, то чтоб каждую не переписывать, нужно сделать другую процедуру, которая будет преобразовывать RepWizard в двумерный массив. Либо, если процедура хранится в каком-то модуле, а вызывается неизвестно откуда еще. Чтоб её не менять с риском что что-то перестанет работать в другом месте, проще подготовить для нее данные в том виде, который она понимает.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах