Автоматическое сохранение отчета "сводная таблица" в базе DIRECTUM

13 7

 

Вступление

Не так давно пришлось решать задачу с автоматическим сохранением отчетов вида «Сводная таблица» для Excel в базе данных DIRECTUM, сформированных пользователем из DIRECTUM, без участия самого пользователя.

Казалось бы, задача простая – создаем сценарий или кнопку для карточки справочника, которые будут находить и запускать нужный отчет, а затем создавать документ из файла во временной папке. Но в реальности получилось не так просто, как казалось.

Задача

Все дело в том, что порядок формирования отчетов типа «сводная таблица» состоит из двух этапов:

  1. При выполнении отчета во временной папке пользователя создаются *.drsf файл с исходными данными и файл Report.ini с настройками, по которым в дальнейшем будет строиться сама сводная таблица
  2. При открытии файла с исходными данными в Excel с помощью надстройки DIRECTUM.xla происходит построение сводной таблицы по исходным данным, в соответствии с настройками из Report.ini на новом листе.

Т.е. файл, получаемый при сохранении отчета в файл, еще не содержит листа сводной таблицы по тому, что сама сводная таблица формируется не в момент сохранения файла, а в момент открытия документа в Excel.

Появляется вопрос – как сохранить отчет в DIRECTUM с уже сформированной сводной таблицей, а не только файл с исходными данными, и при этом не заставлять пользователя делать какие то дополнительные телодвижения типа сохранения файла или создания из него документа в DIRECTUM.

Решение

Решение было найдено за счет использования функции VBScript GetObject(). Ниже представлен пример текста сценария. Сценарий выполняет отчет с именем «ReportName», отчет отображается для пользователя, формируется сводная таблица, затем отчет со сводной таблицей сохраняется  в системе DIRECTUM.

  

 

  // Выполнить отчет
  ReportName = 'Сводная таблица по документам'
  Rep = Reports.GetObjectByName(ReportName)
  Rep.Destination = rdWindow
  Rep.Execute
  // Заменить пробелы в наименовании отчета на подчеркивания
  ReportTitle = Replace(Rep.Title; ' '; '_')
  tmp = GetTempFolder()
  // Получить имя временного файла
  Source = Format('%s~%s.drsf'; ArrayOf(tmp; ReportTitle))
  // Если во временной папке уже есть старый файл отчета - необходимо подобрать первое свободное имя
  i = 1
  While FileExists(Source)
    Source = Format('%s~%s%s.drsf'; ArrayOf(tmp; ReportTitle; i))
    i = i +1
  endWhile
  // Используется VBScript, так как на ISBL нельзя вызывать метод GetObject()
  ScriptControl = CreateObject("MSScriptControl.ScriptControl")
  ScriptControl.Language = "VBScript"
  ScriptControl.Reset
  // Скрипт выполнит подключение к активному процессу Excel и сохранит копию файла
  Script = '
    Dim Excel
    Set Excel = GetObject(, "Excel.Application")
    Dim Doc
    Set Doc = Excel.ActiveWorkbook
    Excel.DisplayAlerts = False
    Doc.SaveAs "%s", -4143
    Doc.Close
    Excel.DisplayAlerts = True
    '
  ScriptControl.ExecuteStatement(Format(Script; Source))

  // Создать документ в системе DIRECTUM
  Editor = "EXCEL"
  Kind = "Г000027"
  Type = "ПЭА"
  Doc = EDocuments.CreateNewFromFile(Type; Kind; Editor; Source; FALSE)
  Doc.Save

 

13
Авторизуйтесь, чтобы оценить материал.
Дмитрий Абрамов

Петр, а нет ли возможности сделать создание отчета вообще без участия пользователя?

Например, руководство каждый месяц в первый рабочий день желает получать сводный отчет по прошлому месяцу для каких либо своих целей (например для контроля процессов и прочее). Отчет достаточно большой и может строится достаточно долго, чтоб делать его самому, а поручать кому-то может нецелесообразно из-за соображений безопасности (кубы данных и CrystalReports дорого для одной задачи). Будет удобно, если отчет автоматически создавался бы ночью в определенное время, сохранялся и затем отправлялся бы вложением в задачу заданному руководителю.

Андрей Куров
Петр, а нет ли возможности сделать создание отчета вообще без участия пользователя?

Планировщик задач в Windows может запускать сценарий по расписанию.
Иван Середкин

Еще вариант - для генерации отчетов использовать конструктор документов.

Алексей Язынин
использовать конструктор документов

Вариант возможен только в DIRECTUM 4.7. В ранних версиях нет такого.
Алена Рунова

Попробовали реализовать пример, но вышло сообщение "невозможно создание объекта контейнером ActiveX: 'GetObject'".

Алена Рунова

Разобрались, спасибо за статью и код ))

Андрей Гец

В код скрипта нужно добавить очищение переменной, без этого  у меня не корректно работает:

После 

Excel.DisplayAlerts = True

добавить 

Excel.Quit
Set Excel = nothing

 

Андрей Гец: обновлено 23.01.2019 в 06:04

Авторизуйтесь, чтобы написать комментарий