AXForum  
Вернуться   AXForum > Microsoft Dynamics NAV > NAV: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

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

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

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

Первоначально, у меня возникла проблема именно с WorkSheetName, т.к. я создала новый ключ "Worksheet Name","Row No.","Column No."
и отсортировала таблицу по этому ключу, у меня стала появляться подобная ошибка + еще указывалось существующий WorksheetName.
Вернула все обратно (остался один ключ "Row No.","Column No.", минимум данных для выгрузки - вернее всего заполнение двух ячеек) ошибка так и осталась, что делать ума не приложу...
Старый 24.06.2007, 22:16   #17  
Fordewind is offline
Fordewind
Участник
 
1,134 / 10 (3) +
Регистрация: 01.12.2005
Тогда быстрее будет поймать дебаггером...
Думаю, ошибка где-то в коде (не увеличен индекс или еще чего)
Старый 25.06.2007, 04:26   #18  
gennady is offline
gennady
Участник
 
92 / 11 (1) +
Регистрация: 27.09.2004
Адрес: Иркутск
Цитата:
Сообщение от Evgenia26 Посмотреть сообщение
Первоначально, у меня возникла проблема именно с 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.") не надо, т.к. сортировка по первичному ключу стоит по умолчанию.
Старый 29.06.2007, 12:40   #19  
smoyk is offline
smoyk
Участник
 
188 / 13 (1) ++
Регистрация: 20.04.2007
То Gennady Antropov
Извините за задержку, были проблемы с интернетом
Понятно, что каждый использует то, что ему нравится, но все же интересно сравнить возможности разных подходов к выгрузке
Про размерность массива - да, есть такая проблема. Как динамически размерность массива указать я так и не нашел. Тут тока при создании сразу врубить ему на порядок большую размерность, чем может быть записей в таблице, чтоб хоть какоето время спать спокойно. Но это не очь хорошо все равно.
А вот про то, что можно кроме самих записей еще что-то (неважно что) в этой таблице сохранять а в массиве нельзя - это вы зря. Во-первых в таблице можно сохранять только ограниченный набор настроек. Их можно расширить, доработав таблицу, но он все равно будет ограничен. Во-вторых, хоть в массив настройки сохранять и нельзя я не считаю это недостатком. Зачем вобще это делать? Вспомните, мы применяем массив при работе с excel напрямую через сервер автоматизации. А с его помощью мы имеем полный доступ к листу, включая и форматирование и формулы и любые функции использовать...
И насчет того, что в стандарте есть... Есть то он есть, я просто не уверен в эффективности реализации этого ресурса. Скорее наоборот, имеем потерю в скорости. Это и понятно, ради универсальности имеем потерю в гибкости, обычная ситуация, даже если предположить, что писал это дело грамотный программер и сделал всю на 5+. Хотя в последнем тоже можно усомнится. Знаете на какие перлы я натыкаюсь в стандартной конфигурации? Для примера, цикл на пять итераций и в цикле проверка - если переменная пустая, то присвоить ей пустое значение. Кроме шуток. И это не единственный пример.
Так что получается, что единственное преимущество Excel Buffer - это ее безразмерность? А в остальном только недостатки, не так ли?
Старый 29.06.2007, 13:10   #20  
Fordewind is offline
Fordewind
Участник
 
1,134 / 10 (3) +
Регистрация: 01.12.2005
Цитата:
Сообщение от smoyk Посмотреть сообщение
Для примера, цикл на пять итераций и в цикле проверка - если переменная пустая, то присвоить ей пустое значение.
Сдается мне кто-то ловил ошибку с пустой переменной и забыл стереть
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 01:03.