NAV4U (онлайн-журнал) » Blog Archive » Таблица 370 Excel Buffer. Выгрузка как она есть.

Таблица 370 Excel Buffer. Выгрузка как она есть.

Как известно, в Navision стандартные отчеты выдаются в «печатном» виде, и, таким образом, исключают какое либо редактирование. У такого решения есть свои плюсы и минусы, но речь пойдет не о них. В этой статье речь пойдет о том, как сделать данные доступными для редактирования путем их выгрузки в Excel при помощи таблицы Excel Buffer .

Для выгрузки данных в Excel в системе предусмотрена таблица Excel Buffer . Вообще говоря, данные можно выгружать, воспользовавшись напрямую соответствующим сервером автоматизации (например, Microsoft Excel 11.0 Object Library). Однако автор статьи придерживается пути добавления недостающих функций в Excel Buffer по необходимости, нежели выгрузки напрямую.

При выгрузке эта таблица используется исключительно как временная (что нужно всегда указывать при работе с ней). Работу с ней можно увидеть на примере выгрузки бюджетов в демонстрационной базе (блок Финансы раздел Бюджеты).

Схема работы выгрузки
Вкратце схему выгрузки можно разбить на несколько этапов:

  1. Загрузка данных во временную таблицу Excel Buffer
  2. Создание и открытие новой книги и листа Excel без отображения пользователю
  3. Перенос данных из таблицы на лист созданной книги. (В этот момент пользователь наблюдает прогресбар)
  4. Отображение книги на экране и передача контроля пользователю

Пример выгрузки списка Клиентов:
Для иллюстрации схемы построим простой отчет, выводящий список клиентов в 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.

Метки:



Комментариев: 1

  1. Юрий пишет:

    В следующий раз выложу докрученую таблицу Excel Buffer

Оставьте свой отзыв!