AXForum  
Go Back   AXForum > Microsoft Dynamics NAV > NAV: Программирование
CRM
Forgotten Your Password?
Register Forum Rules FAQ Members List Today's Posts Search

 
 
Thread Tools Search this Thread Display Modes
Old 17.06.2007, 18:02   #1  
Evgenia26 is offline
Evgenia26
Участник
 
14 / 10 (1) +
Join Date: 15.04.2007
Доброго времени суток!
Помогите, пожалуйста, разобраться. Во многих отчетах выгрузки данных в excel используется таблица excel buffer, описана функция
OpenBook для открытия excel шаблона и функция CreatSheet для создания листа. Зачем создавать, если в шаблонах есть уже листы с определенными
названиями, можно ли просто к ним обращаться? И еще приписка (комментарий) в функции CreatSheet - //выдрано из Эксель-буфер таблицы.
Что это значит, связаны ли как-нибудь CreatSheet и excel buffer? в чем преимущество excel buffer (если оно есть) перед прямым обращением
к excel?
Old 18.06.2007, 07:18   #2  
gennady is offline
gennady
Участник
 
92 / 11 (1) +
Join Date: 27.09.2004
Location: Иркутск
Можно просто обращаться, но бывает, что на базе шаблона создается книга excel с большим числом листов, для этого и нужна ф-я CreateSheet.
Назначение таблицы excel buffer, как видно из названия, служить буфером, временной таблицей, в которой данные накапливаются до начала обращения к excel, а потом все дружно туда выводится. При этом вы можете использовать функции из Excel Buffer, можете свои, частично используя код тех функций (что, видимо, и сделано в описываемом примере отчета).
Old 18.06.2007, 09:48   #3  
Evgenia26 is offline
Evgenia26
Участник
 
14 / 10 (1) +
Join Date: 15.04.2007
Спасибо большое за ответ! Так является ли использование таблицы Эксель-буфер предпочтительнее перед прямым доступом к Эксель файлу? Если да, то в чем?
Old 18.06.2007, 10:43   #4  
gennady is offline
gennady
Участник
 
92 / 11 (1) +
Join Date: 27.09.2004
Location: Иркутск
Желательно сминимизировать общение Навижн с Excel, т.к. оно ощутимо снижает снижает производительность. Поэтому имеет смысл в таких отчетах сначала извлечь данные из базы во временный буфер (с попутным указанием ячеек их дальнейшего вывода в Excel), а потом скидывать их из буфера уже в сам Excel (для этого можно использовать ф-ю буфера SaveCellsToExcel, к примеру). Это особенно актуально при выводе множества строк отчета (напр., остатки на складе).
При выводе небольшого объема данных (документа на базе шаблона, скажем, или графиков) имеет смысл работать с Excel напрямую.
Я обычно использую смешанный метод: при формировании отчета заполняю буфер, потом вывожу его содержимое в Excel, а затем напрямую навожу разную красоту: рамки, формулы, заполнения ячеек и т.д. (если не используется шаблон).
Old 18.06.2007, 12:39   #5  
Fordewind is offline
Fordewind
Участник
 
1,134 / 10 (3) +
Join Date: 01.12.2005
Quote:
Originally Posted by Evgenia26 View Post
Так является ли использование таблицы Эксель-буфер предпочтительнее перед прямым доступом к Эксель файлу? Если да, то в чем?
На этот счет существует 2 противоположных мнения. Лично я пользуюсь Excel Buffer'ом, в который дописал еще несколько нужных мне функций.
Если же нужно делать огромные выгрузки данных, то быстрее, вообще, делать выгрузку данных в файл, а потом уже загрузку из Excel без прямого контакта (поиск рулит)
Old 19.06.2007, 04:02   #6  
gennady is offline
gennady
Участник
 
92 / 11 (1) +
Join Date: 27.09.2004
Location: Иркутск
Да не просто быстрее, а быстрее на порядок! :О)
Я тоже сейчас выгружаю данные в XML файл, а потом просто открываю его из навижина в Excel-е.
Впрочем, этот способ подробно обсуждался в Navision downloads.
Old 20.06.2007, 00:16   #7  
Evgenia26 is offline
Evgenia26
Участник
 
14 / 10 (1) +
Join Date: 15.04.2007
Понятно, всем спасибо, очень помогли!

Только вот при занесении шаблона в таблицу Extern. report name, стали появляться ошибка "переменная Automation не была инициализирована". Подскажите, в чем может быть проблема?
Old 20.06.2007, 04:10   #8  
gennady is offline
gennady
Участник
 
92 / 11 (1) +
Join Date: 27.09.2004
Location: Иркутск
Возможно, проблема с переменной вроде XlApp типа Automation и сопутствующими ей (XlWrkBk и т.п.). К примеру, она инициализируется в ф-ии CreateBook табл. Excel Buffer. Если вы пытаетесь использовать их в своем отчете, то необходимо получить их из Excel Buffer, заведя там соответствующую ф-ю.
Old 21.06.2007, 09:03   #9  
smoyk is offline
smoyk
Участник
 
188 / 13 (1) ++
Join Date: 20.04.2007
Quote:
Originally Posted by Gennady Antropov View Post
...сначала извлечь данные из базы во временный буфер (с попутным указанием ячеек их дальнейшего вывода в Excel), а потом скидывать их из буфера уже в сам Excel (для этого можно использовать ф-ю буфера SaveCellsToExcel, к примеру).
Это, я так понимаю, вы про использование таблицы Excel Buffer говорите? Скажите, но разве нельзя использовать массив? Т.е. сначала заполнить массив в цикле, а потом этот массив присвоить выделенному диапозону на листе. По моему на этом форуме об этом в какойто теме уже говорилось. В этом случае и таблица EB не нужна будет, не так ли?
Old 22.06.2007, 04:09   #10  
gennady is offline
gennady
Участник
 
92 / 11 (1) +
Join Date: 27.09.2004
Location: Иркутск
Конечно, можно использовать и массив. Но, имхо, при использовании Excel Buffer есть ряд существенных преимуществ. Массив имеет ограниченный размер и содержит только значения ячеек Excel, в таблицу же можно вставлять произвольное количество записей. При этом, кроме самого значения, в запись вставляется адрес ячейки, размер и тип шрифта (курсив, там), я еще добавляю цвет. Кроме того, в сам объект этой таблицы естественно добавить свои ф-ии для задач вывода в Excel.
Впрочем, никто не запрещает использовать любые другие способы вывода данных в Excel, которое вы сочтете для себя более удобными. Но если в стандарте уже есть ресурс, почему бы и им не попользоваться, внося при этом по необходимости свои улучшения?
Old 24.06.2007, 01:28   #11  
Evgenia26 is offline
Evgenia26
Участник
 
14 / 10 (1) +
Join Date: 15.04.2007
Quote:
Originally Posted by Gennady Antropov View Post
Возможно, проблема с переменной вроде XlApp типа Automation и сопутствующими ей (XlWrkBk и т.п.). К примеру, она инициализируется в ф-ии CreateBook табл. Excel Buffer. Если вы пытаетесь использовать их в своем отчете, то необходимо получить их из Excel Buffer, заведя там соответствующую ф-ю.
Дело все в том, что как раз и использовалась функция OpenBook. Странно то, что еще вчера все запускалось, а сегодня уже нет, сразу выводится ошибка с переменной Automation. Что это может быть?
Old 24.06.2007, 01:55   #12  
Evgenia26 is offline
Evgenia26
Участник
 
14 / 10 (1) +
Join Date: 15.04.2007
Quote:
Originally Posted by Evgenia26 View Post
Дело все в том, что как раз и использовалась функция OpenBook. Странно то, что еще вчера все запускалось, а сегодня уже нет, сразу выводится ошибка с переменной Automation. Что это может быть?
Проблема разрешилась, все из-за невнимательности, был закомментирован вызов функции OpenBook
Old 24.06.2007, 14:05   #13  
Evgenia26 is offline
Evgenia26
Участник
 
14 / 10 (1) +
Join Date: 15.04.2007
Quote:
Originally Posted by Gennady Antropov View Post
Возможно, проблема с переменной вроде XlApp типа Automation и сопутствующими ей (XlWrkBk и т.п.). К примеру, она инициализируется в ф-ии CreateBook табл. Excel Buffer. Если вы пытаетесь использовать их в своем отчете, то необходимо получить их из Excel Buffer, заведя там соответствующую ф-ю.

И все таки не понятно, почему при использовании функций CreateBook и CreateSheet по-прежнему выскакивает данная ошибка. Может из-за того, что я создала в таблице excel buffer столбец WorkSheetName для работы с многостраничным шаблоном, но не пойму как это связано с инициализацией XlApp?
Old 24.06.2007, 19:50   #14  
Evgenia26 is offline
Evgenia26
Участник
 
14 / 10 (1) +
Join Date: 15.04.2007
Может кто сталкивался с подобной проблемой? При запуске отчета выскакивает ошибка "Excel Buffer уже существует. Идентифицирующие поля и значения: Линия Но.='5' Столбец Но.='40' ". Однако при просмотре этой таблице в ней никаких данных нет вообще.
Отчет делает выгрузку данных в Excel файл.
Old 24.06.2007, 19:58   #15  
Fordewind is offline
Fordewind
Участник
 
1,134 / 10 (3) +
Join Date: 01.12.2005
Quote:
Originally Posted by Evgenia26 View Post
Может кто сталкивался с подобной проблемой? При запуске отчета выскакивает ошибка "Excel Buffer уже существует. Идентифицирующие поля и значения: Линия Но.='5' Столбец Но.='40' ". Однако при просмотре этой таблице в ней никаких данных нет вообще.
Отчет делает выгрузку данных в Excel файл.
1. А у Вас переменная типа Excel Buffer в отчете временная?
2. WorkSheetNam включено в первичный ключ?
Old 24.06.2007, 20:33   #16  
Evgenia26 is offline
Evgenia26
Участник
 
14 / 10 (1) +
Join Date: 15.04.2007
Quote:
Originally Posted by Fordewind View Post
1. А у Вас переменная типа Excel Buffer в отчете временная?
2. WorkSheetNam включено в первичный ключ?
Да, переменная временная и в самом начале выполняются след. действия
TempExcelBuffer.RESET;
TempExcelBuffer.DELETEALL;

Первоначально, у меня возникла проблема именно с WorkSheetName, т.к. я создала новый ключ "Worksheet Name","Row No.","Column No."
и отсортировала таблицу по этому ключу, у меня стала появляться подобная ошибка + еще указывалось существующий WorksheetName.
Вернула все обратно (остался один ключ "Row No.","Column No.", минимум данных для выгрузки - вернее всего заполнение двух ячеек) ошибка так и осталась, что делать ума не приложу...
Old 24.06.2007, 22:16   #17  
Fordewind is offline
Fordewind
Участник
 
1,134 / 10 (3) +
Join Date: 01.12.2005
Тогда быстрее будет поймать дебаггером...
Думаю, ошибка где-то в коде (не увеличен индекс или еще чего)
Old 25.06.2007, 04:26   #18  
gennady is offline
gennady
Участник
 
92 / 11 (1) +
Join Date: 27.09.2004
Location: Иркутск
Quote:
Originally Posted by Evgenia26 View Post
Первоначально, у меня возникла проблема именно с WorkSheetName, т.к. я создала новый ключ "Worksheet Name","Row No.","Column No."
и отсортировала таблицу по этому ключу, у меня стала появляться подобная ошибка + еще указывалось существующий WorksheetName.
Вернула все обратно (остался один ключ "Row No.","Column No.", минимум данных для выгрузки - вернее всего заполнение двух ячеек) ошибка так и осталась, что делать ума не приложу...
Значения первичного ключа (у нас - "Row No.","Column No.") должно быть уникальным среди всех записей данной таблицы (это - имя записи).
Если вы ДОБАВИЛИ ключ "Worksheet Name","Row No.","Column No.", то это уже вторичный, поэтому для другого имени листа, но той же ячейки, выйдет такая ошибка.
Не добавляйте новый, а ВКЛЮЧИТЕ "Worksheet Name" в первичный ключ, и тогда все должно работать. При этом давать команду
SETCURRENTKEY("Worksheet Name","Row No.","Column No.") не надо, т.к. сортировка по первичному ключу стоит по умолчанию.
Old 29.06.2007, 12:40   #19  
smoyk is offline
smoyk
Участник
 
188 / 13 (1) ++
Join Date: 20.04.2007
То Gennady Antropov
Извините за задержку, были проблемы с интернетом
Понятно, что каждый использует то, что ему нравится, но все же интересно сравнить возможности разных подходов к выгрузке
Про размерность массива - да, есть такая проблема. Как динамически размерность массива указать я так и не нашел. Тут тока при создании сразу врубить ему на порядок большую размерность, чем может быть записей в таблице, чтоб хоть какоето время спать спокойно. Но это не очь хорошо все равно.
А вот про то, что можно кроме самих записей еще что-то (неважно что) в этой таблице сохранять а в массиве нельзя - это вы зря. Во-первых в таблице можно сохранять только ограниченный набор настроек. Их можно расширить, доработав таблицу, но он все равно будет ограничен. Во-вторых, хоть в массив настройки сохранять и нельзя я не считаю это недостатком. Зачем вобще это делать? Вспомните, мы применяем массив при работе с excel напрямую через сервер автоматизации. А с его помощью мы имеем полный доступ к листу, включая и форматирование и формулы и любые функции использовать...
И насчет того, что в стандарте есть... Есть то он есть, я просто не уверен в эффективности реализации этого ресурса. Скорее наоборот, имеем потерю в скорости. Это и понятно, ради универсальности имеем потерю в гибкости, обычная ситуация, даже если предположить, что писал это дело грамотный программер и сделал всю на 5+. Хотя в последнем тоже можно усомнится. Знаете на какие перлы я натыкаюсь в стандартной конфигурации? Для примера, цикл на пять итераций и в цикле проверка - если переменная пустая, то присвоить ей пустое значение. Кроме шуток. И это не единственный пример.
Так что получается, что единственное преимущество Excel Buffer - это ее безразмерность? А в остальном только недостатки, не так ли?
Old 29.06.2007, 13:10   #20  
Fordewind is offline
Fordewind
Участник
 
1,134 / 10 (3) +
Join Date: 01.12.2005
Quote:
Originally Posted by smoyk View Post
Для примера, цикл на пять итераций и в цикле проверка - если переменная пустая, то присвоить ей пустое значение.
Сдается мне кто-то ловил ошибку с пустой переменной и забыл стереть
 


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Рейтинг@Mail.ru
All times are GMT +3. The time now is 23:17.
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Contacts E-mail, Advertising.