Таблица 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

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