17.06.2007, 18:02 | #1 |
Участник
|
Доброго времени суток!
Помогите, пожалуйста, разобраться. Во многих отчетах выгрузки данных в excel используется таблица excel buffer, описана функция OpenBook для открытия excel шаблона и функция CreatSheet для создания листа. Зачем создавать, если в шаблонах есть уже листы с определенными названиями, можно ли просто к ним обращаться? И еще приписка (комментарий) в функции CreatSheet - //выдрано из Эксель-буфер таблицы. Что это значит, связаны ли как-нибудь CreatSheet и excel buffer? в чем преимущество excel buffer (если оно есть) перед прямым обращением к excel? |
|
18.06.2007, 07:18 | #2 |
Участник
|
Можно просто обращаться, но бывает, что на базе шаблона создается книга excel с большим числом листов, для этого и нужна ф-я CreateSheet.
Назначение таблицы excel buffer, как видно из названия, служить буфером, временной таблицей, в которой данные накапливаются до начала обращения к excel, а потом все дружно туда выводится. При этом вы можете использовать функции из Excel Buffer, можете свои, частично используя код тех функций (что, видимо, и сделано в описываемом примере отчета). |
|
18.06.2007, 09:48 | #3 |
Участник
|
Спасибо большое за ответ! Так является ли использование таблицы Эксель-буфер предпочтительнее перед прямым доступом к Эксель файлу? Если да, то в чем?
|
|
18.06.2007, 10:43 | #4 |
Участник
|
Желательно сминимизировать общение Навижн с Excel, т.к. оно ощутимо снижает снижает производительность. Поэтому имеет смысл в таких отчетах сначала извлечь данные из базы во временный буфер (с попутным указанием ячеек их дальнейшего вывода в Excel), а потом скидывать их из буфера уже в сам Excel (для этого можно использовать ф-ю буфера SaveCellsToExcel, к примеру). Это особенно актуально при выводе множества строк отчета (напр., остатки на складе).
При выводе небольшого объема данных (документа на базе шаблона, скажем, или графиков) имеет смысл работать с Excel напрямую. Я обычно использую смешанный метод: при формировании отчета заполняю буфер, потом вывожу его содержимое в Excel, а затем напрямую навожу разную красоту: рамки, формулы, заполнения ячеек и т.д. (если не используется шаблон). |
|
18.06.2007, 12:39 | #5 |
Участник
|
Цитата:
Если же нужно делать огромные выгрузки данных, то быстрее, вообще, делать выгрузку данных в файл, а потом уже загрузку из Excel без прямого контакта (поиск рулит) |
|
19.06.2007, 04:02 | #6 |
Участник
|
Да не просто быстрее, а быстрее на порядок! :О)
Я тоже сейчас выгружаю данные в XML файл, а потом просто открываю его из навижина в Excel-е. Впрочем, этот способ подробно обсуждался в Navision downloads. |
|
20.06.2007, 00:16 | #7 |
Участник
|
Понятно, всем спасибо, очень помогли!
Только вот при занесении шаблона в таблицу Extern. report name, стали появляться ошибка "переменная Automation не была инициализирована". Подскажите, в чем может быть проблема? |
|
20.06.2007, 04:10 | #8 |
Участник
|
Возможно, проблема с переменной вроде XlApp типа Automation и сопутствующими ей (XlWrkBk и т.п.). К примеру, она инициализируется в ф-ии CreateBook табл. Excel Buffer. Если вы пытаетесь использовать их в своем отчете, то необходимо получить их из Excel Buffer, заведя там соответствующую ф-ю.
|
|
21.06.2007, 09:03 | #9 |
Участник
|
Это, я так понимаю, вы про использование таблицы Excel Buffer говорите? Скажите, но разве нельзя использовать массив? Т.е. сначала заполнить массив в цикле, а потом этот массив присвоить выделенному диапозону на листе. По моему на этом форуме об этом в какойто теме уже говорилось. В этом случае и таблица EB не нужна будет, не так ли?
|
|
22.06.2007, 04:09 | #10 |
Участник
|
Конечно, можно использовать и массив. Но, имхо, при использовании Excel Buffer есть ряд существенных преимуществ. Массив имеет ограниченный размер и содержит только значения ячеек Excel, в таблицу же можно вставлять произвольное количество записей. При этом, кроме самого значения, в запись вставляется адрес ячейки, размер и тип шрифта (курсив, там), я еще добавляю цвет. Кроме того, в сам объект этой таблицы естественно добавить свои ф-ии для задач вывода в Excel.
Впрочем, никто не запрещает использовать любые другие способы вывода данных в Excel, которое вы сочтете для себя более удобными. Но если в стандарте уже есть ресурс, почему бы и им не попользоваться, внося при этом по необходимости свои улучшения? |
|
24.06.2007, 01:28 | #11 |
Участник
|
Цитата:
Сообщение от Gennady Antropov
Возможно, проблема с переменной вроде XlApp типа Automation и сопутствующими ей (XlWrkBk и т.п.). К примеру, она инициализируется в ф-ии CreateBook табл. Excel Buffer. Если вы пытаетесь использовать их в своем отчете, то необходимо получить их из Excel Buffer, заведя там соответствующую ф-ю.
|
|
24.06.2007, 01:55 | #12 |
Участник
|
Проблема разрешилась, все из-за невнимательности, был закомментирован вызов функции OpenBook
|
|
24.06.2007, 14:05 | #13 |
Участник
|
Цитата:
Сообщение от Gennady Antropov
Возможно, проблема с переменной вроде XlApp типа Automation и сопутствующими ей (XlWrkBk и т.п.). К примеру, она инициализируется в ф-ии CreateBook табл. Excel Buffer. Если вы пытаетесь использовать их в своем отчете, то необходимо получить их из Excel Buffer, заведя там соответствующую ф-ю.
И все таки не понятно, почему при использовании функций CreateBook и CreateSheet по-прежнему выскакивает данная ошибка. Может из-за того, что я создала в таблице excel buffer столбец WorkSheetName для работы с многостраничным шаблоном, но не пойму как это связано с инициализацией XlApp? |
|
24.06.2007, 19:50 | #14 |
Участник
|
Может кто сталкивался с подобной проблемой? При запуске отчета выскакивает ошибка "Excel Buffer уже существует. Идентифицирующие поля и значения: Линия Но.='5' Столбец Но.='40' ". Однако при просмотре этой таблице в ней никаких данных нет вообще.
Отчет делает выгрузку данных в Excel файл. |
|
24.06.2007, 19:58 | #15 |
Участник
|
Цитата:
Сообщение от Evgenia26
Может кто сталкивался с подобной проблемой? При запуске отчета выскакивает ошибка "Excel Buffer уже существует. Идентифицирующие поля и значения: Линия Но.='5' Столбец Но.='40' ". Однако при просмотре этой таблице в ней никаких данных нет вообще.
Отчет делает выгрузку данных в Excel файл. 2. WorkSheetNam включено в первичный ключ? |
|
24.06.2007, 20:33 | #16 |
Участник
|
Цитата:
TempExcelBuffer.RESET; TempExcelBuffer.DELETEALL; Первоначально, у меня возникла проблема именно с WorkSheetName, т.к. я создала новый ключ "Worksheet Name","Row No.","Column No." и отсортировала таблицу по этому ключу, у меня стала появляться подобная ошибка + еще указывалось существующий WorksheetName. Вернула все обратно (остался один ключ "Row No.","Column No.", минимум данных для выгрузки - вернее всего заполнение двух ячеек) ошибка так и осталась, что делать ума не приложу... |
|
24.06.2007, 22:16 | #17 |
Участник
|
Тогда быстрее будет поймать дебаггером...
Думаю, ошибка где-то в коде (не увеличен индекс или еще чего) |
|
25.06.2007, 04:26 | #18 |
Участник
|
Цитата:
Сообщение от Evgenia26
Первоначально, у меня возникла проблема именно с WorkSheetName, т.к. я создала новый ключ "Worksheet Name","Row No.","Column No."
и отсортировала таблицу по этому ключу, у меня стала появляться подобная ошибка + еще указывалось существующий WorksheetName. Вернула все обратно (остался один ключ "Row No.","Column No.", минимум данных для выгрузки - вернее всего заполнение двух ячеек) ошибка так и осталась, что делать ума не приложу... Если вы ДОБАВИЛИ ключ "Worksheet Name","Row No.","Column No.", то это уже вторичный, поэтому для другого имени листа, но той же ячейки, выйдет такая ошибка. Не добавляйте новый, а ВКЛЮЧИТЕ "Worksheet Name" в первичный ключ, и тогда все должно работать. При этом давать команду SETCURRENTKEY("Worksheet Name","Row No.","Column No.") не надо, т.к. сортировка по первичному ключу стоит по умолчанию. |
|
29.06.2007, 12:40 | #19 |
Участник
|
То Gennady Antropov
Извините за задержку, были проблемы с интернетом Понятно, что каждый использует то, что ему нравится, но все же интересно сравнить возможности разных подходов к выгрузке Про размерность массива - да, есть такая проблема. Как динамически размерность массива указать я так и не нашел. Тут тока при создании сразу врубить ему на порядок большую размерность, чем может быть записей в таблице, чтоб хоть какоето время спать спокойно. Но это не очь хорошо все равно. А вот про то, что можно кроме самих записей еще что-то (неважно что) в этой таблице сохранять а в массиве нельзя - это вы зря. Во-первых в таблице можно сохранять только ограниченный набор настроек. Их можно расширить, доработав таблицу, но он все равно будет ограничен. Во-вторых, хоть в массив настройки сохранять и нельзя я не считаю это недостатком. Зачем вобще это делать? Вспомните, мы применяем массив при работе с excel напрямую через сервер автоматизации. А с его помощью мы имеем полный доступ к листу, включая и форматирование и формулы и любые функции использовать... И насчет того, что в стандарте есть... Есть то он есть, я просто не уверен в эффективности реализации этого ресурса. Скорее наоборот, имеем потерю в скорости. Это и понятно, ради универсальности имеем потерю в гибкости, обычная ситуация, даже если предположить, что писал это дело грамотный программер и сделал всю на 5+. Хотя в последнем тоже можно усомнится. Знаете на какие перлы я натыкаюсь в стандартной конфигурации? Для примера, цикл на пять итераций и в цикле проверка - если переменная пустая, то присвоить ей пустое значение. Кроме шуток. И это не единственный пример. Так что получается, что единственное преимущество Excel Buffer - это ее безразмерность? А в остальном только недостатки, не так ли? |
|
29.06.2007, 13:10 | #20 |
Участник
|
|
|