Предварительный просмотр отчетов

Кратко о организации печати в Clarion

  • Автор: Still Zero
  • Уровень знаний: начальный
  • Подразделы: нет
  • Дата публикации: 21.06.2005

Как вы знаете, печать в Кларионе организована с использованием структуры REPORT.

Report  REPORT,AT(1000,2000,6000,7000),PRE(RPT),FONT('Arial',10,,),THOUS
detail1    DETAIL,AT(,,,438),USE(?detail1)
              STRING('DATA STRING'),AT(2656,156),USE(?String1),TRN
           END
        END

Здесь описан простой отчет, состоящий всего из одного detail-а, на котором присутствует всего одна строка «DATA STRING».
Описывается отчет в секции данных.
Для того, чтобы напечатать данный отчет, необходимо выполнить следующий код:

open(Report)              ! открыть отчет
print(RPT:Detail1)        ! напечатать detail
close(Report)             ! закрыть отчет

Существует возможность перенаправить вывод отчета, т.е. печатать не на принтер, а в файл. В этому случае в момент печати (при выполнении команды PRINT) Кларион создает WMF-файл на каждую страницу отчета. Размер (высота и ширина) WMF-файла такой, какой вы указали в структуре REPORT. Файл хранится во временной директории Windows (путь указан в переменных среды TEMP и TMP). После печати файл уничтожается.
WMF(Windows meta file) это обычный векторный графический файл. Таким образом, зная пути к файлам отчета можно ‘просмотреть/сохранить/отредактировать’ весь отчет.
Примерно таким же образом и работает стандартный preview-ер отчетов.

Существует свойство PROP:Preview, которое служит для перенаправления вывода печати и задания отчету очереди, которая будет содержать имена WMF-файлов. Также очередь можно задать в свойствах отчета на закладке Extra. Я описываю эту очередь следующим образом:

PreviewQueue       QUEUE
WMF_Image_Path        STRING(256)
                   END

Очередь состоит всего из одного поля — путь к WMF-файлу. Разбивка на страницы происходит при выполнении команды ENDPAGE.
Для того чтобы потом вывести отчет на принтер существует свойство PROP:FlushPreview. После установки этого свойства в TRUE Кларион удалит созданные WMF-файлы.
Таким образом код с использованием перенаправления вывода будет выглядеть так:

open(Report)                       ! открыть отчет
Report{Prop:Preview}= PreviewQueue ! перенаправление вывода
print(RPT:Detail1)                 ! напечатать detail
endpage(Report)                    ! окончательная разбивка на страницы
...                                ! в этом месте в очереди содержатся имена wmf-файлов
Report{Prop:FlushPreview}=TRUE     ! печать отчета на принтер
close(Report)                      ! закрыть отчет

Просмотр графических файлов
Я думаю, вы поняли каким образом можно получить список сформированных файлов-страниц. Пока они не удалены их можно скопировать в «другое место» 🙂 или сразу же просмотреть.
В Кларионе существует, известный вам, контрол IMAGE, который служит для просмотра «картинок». Контрол поддерживает wmf-формат. Для этого контрола можно динамически менять просматриваемый файл, используя свойство Prop:Text.
Таким образом, стандартное окно предварительного просмотра, не что иное как обычное окно, содержащее контрол IMAGE. Когда вы меняете текущую страницу, из очереди предварительного просмотра берется запись с порядковым номером этой страницы, т.е. выполняется примерно такой код:

get(PreviewQueue,CurrentPage)
?PreviewImage{Prop:Text} = PreviewQueue.WMF_Image_Path

Изменение масштаба просматриваемого изображения достигается путем изменения свойств IMAGE-контрола: Prop:Height, Prop:Width, Prop:MaxHeight, Prop:MaxWidth.
Свойства Prop:Vscroll, Prop:Hscroll влияют на появление вертикального/горизонтального скролл-баров.

Постраничная печать
Так как вы сами создаете окно предварительного просмотра, то вы можете реализовать любой нужный вам функционал. Например, вы можете организовать поиск строки в отчете (открыть wmf-файл как обычный текстовый файл, найти в нем строку, перейти на найденную страницу).
Наиболее необходимым является постраничная печать и задание количества копий для печати.
Для этого можно создать временную очередь и перебрасывать в нее необходимые записи из основной очереди. Если необходимо напечатать несколько копий, то записи в очереди необходимо продублировать. Т.е. если вам необходимо напечатать страницы 1 и 10, то код будет выглядеть примерно так:

tmp:PreviewQueue QUEUE(PreviewQueue). ! наследование очереди PreviewQueue

 code
 ...
 free(tmp:PreviewQueue)             ! очистили временную очередь
 get(PreviewQueue,1)                ! взяли первую запись, соответствующую первой странице
 tmp:PreviewQueue :=: PreviewQueue  ! перенесли значение из основной во временную таблицу
 add(tmp:PreviewQueue)
 get(PreviewQueue,10)               !  тоже самое с 10-ой страницей
 tmp:PreviewQueue :=: PreviewQueue
 add(tmp:PreviewQueue)

для того чтобы напечатать временную очередь создается «пустой» отчет:

TmpReport REPORT,AT(10,10,180,280),PAPER(PAPER:A4),PRE(RPT),FONT('Arial Cyr',10,,),MM
Detail1 DETAIL,AT(,,,33),USE(?Detail1)
       END
     END

код для печати временной таблицы на принтер с использованием пустого отчета будет выглядеть примерно так:

open(TmpReport)                              ! открыли временный отчет
TmpReport{Prop:Preview} = tmp:PreviewQueue   ! назначили уже заполненную очередь
endpage(TmpReport)                           ! разбили на страницы
TmpReport{Prop:FlushPreview}=TRUE            ! печать на принтер
close(TmpReport)                             ! закрыли отчет

Пример
Пример содержит класс для предварительного просмотра и шаблон для подключения класса и замены стандартного окна предпросмотра.
Пример проверен на C55, C6.1 ABC.

Report Preview (264)
© Project Zero, 2005-2006. Все права защищены.