Таблица 370 Excel Buffer. Выгрузка как она есть.
Как известно, в Navision стандартные отчеты выдаются в «печатном» виде, и, таким образом, исключают какое либо редактирование. У такого решения есть свои плюсы и минусы, но речь пойдет не о них. В этой статье речь пойдет о том, как сделать данные доступными для редактирования путем их выгрузки в Excel при помощи таблицы Excel Buffer .
Для выгрузки данных в Excel в системе предусмотрена таблица Excel Buffer . Вообще говоря, данные можно выгружать, воспользовавшись напрямую соответствующим сервером автоматизации (например, Microsoft Excel 11.0 Object Library). Однако автор статьи придерживается пути добавления недостающих функций в Excel Buffer по необходимости, нежели выгрузки напрямую.
При выгрузке эта таблица используется исключительно как временная (что нужно всегда указывать при работе с ней). Работу с ней можно увидеть на примере выгрузки бюджетов в демонстрационной базе (блок Финансы раздел Бюджеты).
Схема работы выгрузки
Вкратце схему выгрузки можно разбить на несколько этапов:
- Загрузка данных во временную таблицу Excel Buffer
- Создание и открытие новой книги и листа Excel без отображения пользователю
- Перенос данных из таблицы на лист созданной книги. (В этот момент пользователь наблюдает прогресбар)
- Отображение книги на экране и передача контроля пользователю
Пример выгрузки списка Клиентов:
Для иллюстрации схемы построим простой отчет, выводящий список клиентов в Excel:
В этом отчете будет один единственный DataItem - Customer.
Для примера нам понадобятся: временная переменная ExcelBuffer типа Record на таблице 370 и счетчик i (не забудем обнулить его на всякий случай).
Далее. На триггере OnAfterGetRecord напишем:
i := i + 1; ExcelBuffer.VALIDATE(RowNo, i); //указание строки для выгрузки ExcelBuffer. VALIDATE(ColumnNo, 1); //указание столбца для выгрузки ExcelBuffer."Cell Value as Text" := Customer."No." // выгружаемое значение ExcelBuffer.INSERT; CLEAR(ExcelBuffer); ExcelBuffer.VALIDATE(RowNo, i); ExcelBuffer. VALIDATE(ColumnNo, 2); ExcelBuffer."Cell Value as Text" := Customer.Name + Customer."Name 2" ExcelBuffer.INSERT;
А на триггере OnPostReport:
ExcelBuffer.CreateBook; //создание книги ExcelBuffer.CreateSheet('STATUS','Description',COMPANYNAME,USERID); //создание листа и выгрузка данных на него ExcelBuffer.GiveUserControl // передача управления пользователю
Так как мы ничего не будем выводить на экран в Navision, то установим для нашего отчета свойство ProcessingOnly = Yes.
В итоге работы данного отчета мы получим список клиентов в Excel, причем в первом столбце будет стоять номер клиента в Nav, а во втором - его название.
Стоит отметить, что при выгрузке большого количества ячеек отчет будет работать сравнительно долго. И конечно, не стоит забывать об ограничениях самого Excel на количество строк.
На самом же деле Excel Buffer удобен для выгрузки не обычных списков (в отличие от Портов Данных), а вывода неких результатов и заполнения шаблонов.
Заполнение шаблонных документов принципиально не отличается от простой выгрузки. Только выгружать мы будем не во вновь созданный файл, а в заранее подготовленный шаблон (для его открытия используется функция OpenBook). Таким образом, мы можем выгрузить в Excel, например, Счет-фактуру.
Есть два пути открытия шаблонов из Nav.
1. Шаблон хранится на сервере, в папке с открытым для всех доступом на чтение. При этом путь к файлу должен храниться в одной из настроечных таблиц. Для примера в таблице Sales & Receivables Setup заведем поле Invoice Template Path типа Text 250. Тогда для открытия шаблона будем использовать следующий код:
SalesSetup.Get; // переменная типа Record таблицы Sales & Receivables Setup ExcelBuffer.OpenBook(SalesSetup."Invoice Template Path",'Template'); //для простоты договоримся, что основной лист шаблона будем всегда называть Template.
2. Шаблон загружается в некое поле типа BLOB в Nav. Это поле так же может располагаться в одной из настроечных таблиц. И в момент запуска выгрузки в Excel переносит файл из BLOB в некоторую папку на компьютере пользователя. Например, во временную папку Windows. Для того, чтобы не выгружать каждый раз один и тот же файл стоит проверять наличие выгруженного файла той же версии. Для этого следует ввести еще одно поле в таблицу с хранимым шаблоном, и содержащие дату его последней версии.
Для примера в таблице Sales & Receivables Setup заведем поля: Invoice Template типа BLOB, Invoice File Name типа text 30 и Invoice Template Stamp типа Date. Тогда для открытия шаблона будем использовать следующий код:
SalesSetup.Get; IF (NOT GETSTAMP(ENVIRON('TMP')+`\`+SalesSetup."Invoice File Name",TemplateDate)) OR (TemplateDate <> Invoice Template Stamp) THEN BEGIN //TemplateDate переменная типа Date SalesSetup.CALCFIELDS("Invoice Template") ; SalesSetup."Invoice Template".EXPORT(ENVIRON('TMP')+`\`+SalesSetup."Invoice File Name"); END; ExcelBuffer.OpenBook(ENVIRON('TMP')+`\`+SalesSetup."Invoice File Name",'Template');
Если нам понадобится хранить множество различных шаблонов, то лучше всего будет завести отдельную таблицу под шаблоны.
Стоит отметить, что формат ячеек можно задать непосредственно в шаблоне, и не задумываться о форматировании ячеек при создании выгрузки.
Вот собственно и все о выгрузке в Excel при помощи таблицы 370 Excel Buffer.
Метки: Бариев Юрий
13 Март 2008 в 14:35
В следующий раз выложу докрученую таблицу Excel Buffer