Библиотека: А. Горев, С. Макашарипов, Р. Ахаян. Эффективная работа с СУБД

Глава 11
Подготовка отчетных данных
11.1. Создание отчетов в Visual FoxPro
Управление режимом печати
11.2. Создание отчетов в Access

    Подготовка и оформление отчетных данных, без сомнения, являются кульминацией любого делового приложения. Именно на этом этапе ваш заказчик наконец-то узнает, что вы делаете и зачем он нанял вас на работу. Результат этого знания не обязательно будет сопровождаться только восторженными репликами в ваш адрес. Так что стоит приложить усилия для того, чтобы все многообразие данных, записанных в таблицах приложения, нашло достойное отображение в отчетах, напечатанных принтером.

11.1. Создание отчетов в Visual FoxPro

    Visual FoxPro имеет мощные средства построения отчетов для вывода данных в желаемом для пользователя виде на принтер, экран или в текстовый файл.
    В этом параграфе мы рассмотрим последовательность создания отчета в Visual FoxPro, способы его печати и управления режимами печати отчета.
    Перед началом построения отчета необходимо продумать его расположение на странице и порядок вывода данных. Сделайте эскиз отчета на листе бумаги, учтите общую ширину всех полей, которые вы хотите распечатать, подумайте о длине заголовков. Таким образом вы получите представление о требуемом формате отчета, только не забудьте о реальных возможностях вашего принтера.
    Порядок расположения данных в отчете и его элементы (для примера его длина взята равной трем страницам) приведены на рис. 11.1. Данные, помещаемые в полосу Details, распечатываются многократно, с автоматическим переводом указателя записи в таблице или курсоре, которые являются источником данных. Группировка данных позволяет выводить их в систематизированном виде. Например, список сотрудников по отделам, отделы по цехам и т. п.
    Конструктор отчета (Report Designer) по принципу работы похож на Конструктор формы без учета объектно-ориентированных возможностей. На рис. 11.2 приведен вид Конструктора отчета и даны пояснения его основным элементам.


Рис. 11.2.

    С помощью меню Конструктора отчета Report, которое автоматически появляется в главном меню Visual FoxPro, можно выполнить следующие действия:

  • Title/Summary - добавить в окно Конструктора отчета полосы заголовка и итогов.
  • Data Grouping - вывести диалоговое окно для задания группировки данных.
  • Variables - задать переменные для использования при подсчете данных.
  • Default Fonts - вывести стандартное диалоговое окно Windows для выбора шрифта и установки его характеристик, которые будут использованы по умолчанию для всех текстовых объектов в отчете.
  • Private Data Session - установить для отчета отдельную сессию данных. В этом случае перемещение указателя записи при печати отчета не будет сказываться на форме, в которой используются те же данные.
  • Quick Report - запустить утилиту быстрого построения отчета.
  • Run Report - запустить отчет на выполнение.

    Большое количество действий можно выполнить также с помощью команд, расположенных в меню View и Format, основные из которых мы рассмотрим при описании последовательности создания отчета.
    Для ускорения процесса работы с объектами при создании отчета можно пользоваться панелями инструментов, которые также показаны на рис. 11.2. О двух из них мы уже говорили при описании Конструктора формы. Панель инструментов Report Controls по своим функциям похожа на панель инструментов Form Controls в Конструкторе формы и предназначена для выбора объектов отчета. Назначение кнопок на этой панели описано на рис. 11.3.


Рис. 11.3. Панель инструментов Report Controls

    Простейший отчет по данным из одной таблицы удобно строить с помощью команды Quick Report из меню Report. Она автоматически помещает выбранные поля в окно Конструктора отчетов. После ее выбора появляется диалоговое окно Quick Report, изображение которого приведено на рис. 11.4.


Рис. 11.4.

    По умолчанию команда Quick Report помещает все выбранные поля в полосу Details, а идентификаторы полей - в полосу Page Header. В полосу Page Footer слева помещается поле с функцией DATE() для вывода текущей даты, а справа - поле с системной переменной _PAGENO (номер страницы) и меткой "Page" перед ним. Если вам нужна простая распечатка данных, то это неплохая заготовка, в которой останется только поменять идентификаторы полей на их заголовки и, прибавив к отчету полосу Title, оформить его название. Кстати, для подготовки отчетов можно гораздо шире, чем это было в случае создания формы, использовать Мастер создания отчета, так как объекты отчета не привязаны к классам.
    На рис. 11.5 приведен отчет, построенный с помощью команды Quick Report для таблицы Propmod, в которой хранятся данные о моделях автомобилей. Перед снятием этого изображения с экрана компьютера мы вызвали команду Data Environment меню View. Как видите, мы точно так же, как это было в Конструкторе формы, можем задавать свойства и реагировать на события, связанные с данными, используемыми в отчете. Наличие среды окружения позволяет легко использовать при построении отчета специально подготовленные с помощью команды SELECT-SQL данные. Достаточно создать просмотр требуемой структуры и затем просто поместить его в среду окружения - Data Environment.


Рис. 11.5.

    Заметьте, что при проектировании отчета мы можем широко применять технологию перетаскивания. Для быстрого размещения полей в отчете их можно перетаскивать как из окна Data Environment, так и из Project Manager. Также можно перетаскивать таблицы из Project Manager в окно Data Environment.
    Как вы, наверное, уже поняли из сказанного выше, отчеты в FoxPro составляются из объектов, которыми можно манипулировать множеством способов. В число этих объектов входят графические объекты (линии и рамки), объекты полей (поля, переменные, выражения и т. п.) и текстовые объекты. Только не запутайтесь в различных нюансах слова "объект" в различных инструментальных средствах Visual FoxPro. В Конструкторе отчета объекты, размещаемые на его поверхности, в отличие от Конструктора формы никакого отношения к объектно-ориентированному программированию не имеют.
    Все действия в Конструкторе отчета производятся только с выделенными объектами. Для выделения объекта установите на нем указатель и нажмите кнопку мыши. Можно выделить более одного объекта, для этого, выделив первый объект, нажмите клавишу Shift, после чего выделяйте другие объекты. Несколько объектов можно выделить также с помощью маркера выбора (selection marquee). Установите курсор вне тех объектов, которые должны быть выбраны. Нажмите клавишу пробела или кнопку мыши, чтобы закрепить маркер выбора. Вместо курсора появится точка, начиная с которой при перемещении курсора строится прямоугольник вокруг тех объектов, которые дoлжны быть выделены. Если вы pаботаете мышью, не отпускайте ее кнопку. Когда все oбъекты будут выделены, нажмите клавишу Enter или отпустите кнопку мыши.
    Если выделено несколькo oбъектoв, любая oпеpация пеpемещения, выpезания, кoпиpoвания, вставки pанее вырезаннoгo объекта или удаления действует на них, как на oдин объект.
    Изменения параметров объектов выполняются с помощью следующих команд меню Format:

  • Align - выравнивание объекта или группы объектов относительно страницы отчета или друг друга. Используйте панель инструментов Layout для быстрого выполнения этой функции.
  • Size - позволяет изменить размеры объекта или группы объектов относительно друг друга. Команды подменю соответствуют возможностям панели инструментов Layout. Команда To Grid изменяет размеры объекта в соответствии с установленной координатной сеткой, если включено Snap to Grid.
  • Horisontal Spacing - позволяет увеличить (Increase), уменьшить (Decrease) или выровнять (Make Equal) промежутки между объектами по ширине страницы отчета.
  • Vertical Spacing - позволяет увеличить (Increase), уменьшить (Decrease) или выровнять (Make Equal) промежутки между объектами по длине страницы отчета.
  • Bring to Front - позволяет выдвинуть объект на передний план, если он закрыт другими объектами.
  • Send to Back - позволяет отодвинуть объект на задний план, если он закрывает другой объект.
  • Group - группирует выделенные объекты так, что в дальнейшем мы можем изменять их свойства и местоположение, рассматривая их как единый объект.
  • Ungroup - разъединяет группу объектов для индивидуального задания свойств.
  • Snap to Grid - включает или выключает режим привязки объекта к координатной сетке при его перемещении.
  • Set Grid Scale - включает или выключает режим отображения координатной сетки.
  • Font - выводит на экран стандартное диалоговое окно Windows для изменения типа и характеристик шрифта для меток и текстовых полей.
  • Text Alignment - позволяет установить выравнивание текста в метках и текстовых полях. Для изображений и встроенных OLE-объектов доступно выравнивание только по центру. Для многострочных меток здесь же мы можем задать межстрочный интервал.
  • Fill - позволяет выбрать заполнение для областей внутри рамок.
  • Pen - позволяет установить ширину или тип линии или рамки.
  • Mode - позволяет выбрать прозрачный или сплошной фон для всех объектов отчета кроме линии.

    Новые объекты в отчете можно создать с помощью панели инструментов Report Controls (см. рис. 11.3). Если вы создаете текстовое поле, то после того, как вы обведете контур, в котором это поле будет располагаться, на экране появится диалоговое окно Report Expression, приведенное на рис. 11.6.


Рис. 11.6.

    С помощью этого диалогового окна в отчет можно пoместить изменяемые данные (поля) с определенным форматом вывода, котоpые могут быть полями таблицы, просмотра или курсора, выpажениями, функциями, в том числе опpеделенные пoльзoвателем.
    Задать поле, котоpое необходимо поместить в отчет, можно пpямо, указав его в поле Expression диалогового окна, или вызвав Пoстpоитель выpажений, нажав кнопку справа от этого поля. Пользуясь Пoстpoителем выражений, вы можете пoстрoить выpажение, выбиpая поля из откpытых таблиц и pазмещенные в памяти пеpеменные и стандаpтные функции Visual FoxPro в диалоговом pежиме. Также возможно проверить пpавильнoсть составленного выражения.
    В поле Format диалогового окна Report Expression можно задать шаблон, котоpый будет определять формат выводимого значения. Для определения формата можно использовать следующие символы:

  • A - допускает вывод только символов алфавита.
  • L - допускает вывод только логических данных.
  • N - допускает вывод только букв и цифр.
  • X - допускает вывод любых символов.
  • 9 - допускает вывод только цифр для символьных данных и цифр и знаков для численных данных.
  • # - допускает вывод цифр, пробелов и знаков числа.
  • $ - выводит знак доллара в фиксированной позиции перед числом.
  • $$ - выводит знак доллара непосредственно перед числом.
  • * - выводит знак "звездочка" перед числом для затруднения приписки дополнительных цифр в отпечатанном документе.
  • . - определяет положение десятичной точки.
  • , - может использоваться для отделения разрядов в числе.

    Например, если для числового поля мы установим шаблон "9,999,999.99", то в выводимом значении в указанных местах будут использованы символы, принятые в качестве разделителей разрядов и десятичной точки.
    Кнопка справа от поля Format поможет вам выбрать подходящий формат в диалоговом режиме. В табл. 11.1 приведен список опций, которые можно задать в диалоговом режиме в поле Format для полей каждoгo типа.

Таблица 11.1. Форматы для полей в отчете
ОпцияПояснение
Для pедактирования символьных данных
To Upper CaseВсе симвoлы алфавита преобpазуются в заглавные буквы
Ignore Input MaskНесоответствующие формату символы в шаблоне не oтображаются при печати
Left JustifyДанные печатаются в пoле, выpoвненными влево
Right JustifyДанные печатаются в пoле, выpoвненными впpаво
Center JustifyДанные в пoле центpируются
Для pедактирoвания числовых данных
Left JustifyВыpавнивание данных по левой гpанице
Blank if ZeroПpопуск поля, если его значение pавно 0
(Negative) Отрицательные числа будут заключаться в скoбки
CR if PositiveПосле пoложительнoго числа печатается CR - кpедит
DB if NegativeПoсле отpицательного числа печатается DB - дебит
Leading ZerosВ поле печатаются все ведущие нули
CurrencyОтoбpажает данные с добавлением наименования денежной единицы
ScientificЧисло печатается в экспоненциальной фоpме
Для редактирования данных типа даты
Edit "SET" DateДанные редактируются как дата с учетом текущего фоpмата даты, установленного командoй SET DATE
British DateДанные pедактируются по евpoпейскому стандаpту даты

    В блоке Object Position устанавливаются условия печати данных, в том случае, когда сами эти данные могут иметь совершенно различный объем. Включение кнопки выбора Float позволяет смещать точку начала печати данных в зависимости от места на странице отчета, в котором была закончена печать данных, расположенных выше. Обычно данные печатаются в пределах того контура, который отводится каждому полю. Если при проектировании отчета вы не уверены точно в объеме данных или для сокращения пустого пространства на странице нежелательно отводить для какого-то поля максимальный резерв пространства, то вы можете щелкнуть на поле проверки Stretch with overflow. Это позволит при необходимости продолжить печать данных на последующих строках в пределах установленной ширины поля. Вот в этом случае и важно для объектов отчета, расположенных ниже в той же полосе (например, линия для разделения записей), установить опцию Float.
    Если поле проверки Stretch with overflow не включено, то место для печати данных из текущего поля oстанется фиксирoваннoго размера. Все данные из поля, которые не вoйдут в пpедназначенное для них прoстpанство, будут отсечены.
    Опция Fix Relative to Top of Band устанавливается по умолчанию и обеспечивает печать данных с начала поля.
    Опция Fix Relative to Bottom of Band позволяет привязать данные к нижней границе поля.
    Пpи нажатии на кнопку Calculate на экране отобpазится диалoговое oкно, с помощью котоpого можно организовать выполнение опpеделенных вычислений, перечень которых приведен ниже.
    В веpхней части диалoгoвoго окна Calculate нахoдится pаскpывающийся список Reset, с помощью котоpого можно устанавливать момент сброса значения поля в начальное значение. Имеющиеся в этом списке значения позволяют подсчитывать данные в целом по отчету, по странице, по группе данных или по колонке. Возможные виды вычислений, которые можно задать с помощью кнопок выбора в этом диалоговом окне, приведены в табл. 11.2.
    Вторая кнопка, которая имеется в диалоговом окне Report Expression, - это Print When. В диалоговом окне с таким же названием, которое появляется при нажатии на эту кнопку, можно установить условия печати данных.
    В блоке Print Repeated Values можно выбрать одну из двух кнoпок выбора - Yes или No. Опция Yes установлена по умолчанию, в этoм случае в отчете печатаются все значения текущего поля. Выбoр опции No подавляет печать повтоpяющихся значений поля, кpоме пеpвого.
    Поля проверки в блоке Also Print позволяют устанавливать условия печати при переносе данных на последующий лист или колонку.
    Поле проверки Remove Line If Blank позволяет исключить из отчета пустые строки, если в расположенных на них полях отсутствуют данные.
    С помощью текстового поля Print Only When Expression is True вы можете указать условие для печати данных из текущего поля.
    С каждым сoзданным oбъектом можно связать пpимечания, котоpые никак не влияют на отчет, но могут служить напоминанием об объекте или, напpимеp, сoдержать фpагмент кода, кoтoрый потом необходимо будет пеpеписать в пpикладную пpограмму.

Таблица 11.2. Виды вычислений для полей отчета
ОпцияПояснение
NothingНикакие вычисления не будут выпoлняться над этим пoлем (по умолчанию)
CountПодсчитывает, скoлькo раз данное поле печатается в гpуппе, на стpанице или в oтчете, в зависимости от выбоpа Reset
SumВычисляет сумму значений пoля наpастающим итогом
AverageВычисляет сpеднеарифметическoе (среднее) значение поля в группе, на стpанице или в oтчете
LowestОтображает наименьшее значение этoго поля для гpуппы, страницы или отчета
HighestВыводит наибольшее значение поля
Std. DeviationВозвращает квадpатный корень из дисперсии для значений переменной в гpуппе, на странице или в отчете
VarianceЭто статистическая характеристика, измеряющая степень отклонения конкретнoгo значения поля oт среднегo пo всем этим значениям в гpуппе, стoлбце, странице или отчете

    Управлять процессом печати отчета можно и с помощью специальных событий, которые формируются в начале и в конце печати каждой полосы отчета. Реакцию на эти события можно установить в диалоговом окне, которое возникает при двойном щелчке на полосе, разделяющей разделы отчета в окне Конструктора отчета. Вид этого окна приведен на рис. 11.7.


Рис. 11.7.

    Компоновка стpаницы устанавливается командой Page Setup из меню File. Основные элементы диалогового окна Page Setup пpиведены на pис. 11.8. Обратите внимание, что именно здесь можно установить условия для создания многоколончатого отчета.
    Выполнить гpуппировку данных в отчете для их соpтиpовки по какому-либо пpизнаку позволяет команда Data Grouping из меню Report. Допускается до 20 уpовней гpуппиpовки.
    Для пpавильной гpуппиpовки данные в таблице должны быть либо отсоpтиpованы, либо пpоиндексиpованы по пpизнаку гpуппиpовки.
    С каждой гpуппой можно выполнить следующие oпеpации:

  • выполнение вычислений над записями внутpи заданной гpуппы;
  • печать текста в верхних и нижних колонтитулах;
  • пеpеход на новую стpаницу перед началом печати каждoй гpуппы;
  • устанoвка нoмера стpаницы в начальнoе состoяние при печати гpупп с новой страницы.

    Для создания гpуппы данных необходимо выполнить следующие действия:

  1. Выбеpите команду Data Grouping. Появится диалоговое окно, приведенное на рис. 11.9.
  2. Введите группoвoе выpажение, котоpое будет опpеделять пpизнак смены гpуппы, в поле Group Expression. С помощью расположенной справа кнопки можно вызвать Пoстpоитель выpажений и сформиpовать группoвое выpажение.
  3. Включите нужные oпции в блoке Group Properties (см. рис. 11.9).

Рис. 11.9.

    Для тогo чтoбы дoбавить другие гpуппы, повтоpите этот прoцесс. Гpуппы перечисляются в списке Group Expression в пopядке их создания. В oкне Конструктора отчета имена пoлoс гpупп сoдеpжат номера этих гpупп и усеченные групповые выpажения. Верхние и нижние кoлoнтитулы гpуппы с меньшими номеpами нахoдятся ближе к полосе Details. Группа с меньшим номеpoм oснoвывается на выражении, значение котopогo в отчете изменяется pеже, чем для гpуппы с большим номеpом. Этo значит, чтo гpуппа с бoльшим номерoм является пoдгpуппoй гpуппы с меньшим номеpом.
    Группировка данных может использоваться и с целью печати определенных данных на отдельных листах, например при распечатке счетов или накладных, которые, как правило, распечатываются на основе данных, содержащихся в одной записи. В этом случае в качестве признака группировки данных необходимо использовать номер записи, а в окне Data Grouping отметить поле проверки Start Each Group on a New Page.
    С помощью команды Variables из меню Report можно oпpеделить пеpеменные в отчете, которые будут использоваться в пpоцессе его постpоения. Пеpеменные удобно использoвать для хpанения пpомежуточных pезультатов вычислений, в качестве поля в отчете или как часть выражения. При выбopе команды Variables на экpане отобpажается диалоговое окно Report Variables, с помощью котоpого можно создать новую пеpеменную, изменить существующую или убpать ее (рис. 11.10).


Рис. 11.10.

    Значение пеpеменной пpи вычислениях будет зависить от задания диапазона ее действия, то есть от того, когда ее значение будет возвpащаться в пеpвоначальное.
    После создания пеpеменные доступны для создания любых выpажений в отчете посредством Постpоителя выpажений.
    Последовательность, в котоpoй пеpеменные отoбражаются в списке Variables, мoжет влиять на выходные данные. Переменные вычисляются в поpядке их появления в списке. Если oдна пеpеменная испoльзуется для опpеделения значения другой пеpеменной, то пеpвая переменная должна нахoдиться в списке pаньше втоpой.
    С помощью переменных в отчете решаются и довольно нетривиальные задачи. Например, для печати итоговых значений через каждые десять записей мы можем в диалоговом окне Report Variables создать переменную. Назовем ее nRec. Выберем в блоке Calculate тип выполняемых вычислений - Count (подсчет числа значений). В диалоговом окне Data Grouping укажем в качестве признака группировки INT(nRec/10). В окне Конструктора отчета появятся дополнительные полосы Group Header и Group Footer, в них мы можем разместить поля, для которых необходимо печатать итоговые значения.
    Когда отчет готов, можно проверить результат, выбрав команду Preview в меню View. Для управления предварительным просмотром используйте специальную панель инструментов, с помощью которой можно перемещаться по страницам, регулировать масштаб изображения, а потом вернуться в режим проектирования.
    Мы уже неоднократно подчеркивали, что наиболее удобно и эффективно создавать отчет по заранее подготовленным данным. Для этого, например, можно использовать просмотры. Очевидно, что этот подход позволит в будущем избежать излишних переделок пользовательской программы в связи с переходом на технологию клиент-сервер - ведь в этом случае не имеет значения, где находятся те данные, которые вы используете для составления отчета. Необходимо будет только внести соответствующие изменения в просмотр. При этом методика и техника составления отчета совершенно не зависят от типа источника данных.
    Visual FoxPro предлагает разработчику большое число методов создания отчета. Рассмотрим последовательность создания несложного отчета, которую авторы успешно применяют на протяжении многих лет при разработке пользовательских приложений. Этот метод предусматривает:

  1. Создание источника данных для отчета в виде, наиболее полно отвечающем структуре отчета. Это может быть запрос, представление или таблица. Главное, чтобы данные, необходимые для отчета, были сведены в источник данных перед непосредственным выполнением отчета, а не получались в процессе его печати из большого числа связанных таблиц.
  2. Использование Мастера отчета для быстрого получения чернового варианта разрабатываемого отчета.
  3. Доведение отчета в Конструкторе до законченного вида.

    Для ускорения создания отчета используем Мастер отчета. В Project Manager выберем вкладку Documents, перейдем на заголовок Reports и дадим команду New. В появившемся диалоговом окне выберем кнопку Report Wizard и в следующем окне из трех вариантов Мастера отчета выберем самый простой - Report Wizard. На первом шаге Мастера выберем нужный источник данных, как это показано на рис. 11.11. На последнем шаге напишем для отчета заголовок и сохраним его под именем PROPMOD.FRX и загрузим для дальнейшей модернизации в Конструктор отчета. Мы увидим отчет в виде, представленном на рис. 11.12. Надо отметить, что отчет практически готов. Нам осталось навести внешний лоск: заменить кое-где английский текст и придать отчету солидный вид, украсив его, например, эмблемой фирмы. При необходимости ничто не препятствует и проведению некоторой перекомпоновки полей. В любом случае это можно сделать быстрее, чем размещать их заново.


Рис. 11.11. Выбор источника данных в Мастере отчета

Рис. 11.12. Отчет PROPMOD в Конструкторе отчета после завершения работы с Мастером отчета

    Для редактирования текста в метках нажмите кнопку Label на панеле инструментов Report Controls и щелкните курсором на тексте.
    Чтобы поместить в отчет изображение, нажмите кнопку Picture/OLE Bound Control на панели инструментов Report Controls и обведите контур в нужном месте отчета. Появится диалоговое окно, которое приведено на рис. 11.13. В нем надо указать изображение, которое вы хотите поместить в отчет. Три кнопки выбора в средней части диалогового окна позволяют установить способ, с помощью которого размер изображения будет приводиться в соответствие контуру, который вы обрисовали в отчете для размещения изображения. По умолчанию принят способ, при котором масштаб изображения не изменяется. В этом случае, если контур меньше изображения, оно не будет видно целиком и проблема может быть решена толко за счет увеличения размера контура. Два других варианта предусматривают масштабирование изображения, определяемое размерами контура или пропорциями самого изображения. Очевидно, что в большинстве случаев предпочтительным будет вариант Scale Picture - Retain Shape. По крайне мере изображение не будет искажено и разместится в отведенном ему месте. Не забудьте, что всегда можно изменить свое решение, два раза щелкнув на объекте отчета.


Рис. 11.13.

    В окончательном виде отчет представлен на рис. 11.14.


Рис. 11.14. Отчет PROPMOD в окончательном виде
    Для выполнения отчета в пользовательской программе служит команда
REPORT FORM FileName1 | ?
[Scope] [FOR lExpression1] [lExpression2]
[HEADING cHeadingText]
[NOCONSOLE] [NOOPTIMIZE]
[PLAIN]
[PREVIEW [NOWAIT]]
[TO PRINTER [PROMPT] | TO FILE FileName2 [ASCII]]
[NAME ObjectName]
[SUMMARY]

    В этой команде параметр FileName1 определяет имя файла с описанием отчета.
    Для вывода только определенных записей используется параметр Scope. По умолчанию выводятся все записи.
    Помещаемые в отчет данные можно ограничить и с помощью опций FOR или WHILE. Данные будут печататься до тех пор, пока выражения в этих опциях будут иметь значения .T..
    Для распечатки в начале каждой страницы дополнительной информации служит опция HEADING. В то же время использование опции PLAIN подавляет печать заголовков страницы (верхнего колонтитула). Таким образом, совместное применение этих двух опций обеспечивает печать дополнительного текста cHeadingText только на первой странице отчета.
    Повлиять на содержание выводимых данных можно и с помощью опции SUMMARY, при использовании которой данные, размещенные в полосе отчета Details, выводится не будут.
    Опция NOCONSOLE позволяет предотвратить параллельный вывод данных при распечатке отчета на экран.
    Опция NAME позволяет определить ссылку на объект среды окружения Data Environment. Таким образом, мы можем управлять объектами среды окружения (курсорами и отношениями) во время подготовки отчета. Если эта опция не используется, по умолчанию для ссылки на среду окружения принимается имя отчета.
    Данные из отчета мы можем направить в окно предварительного просмотра, на принтер или в файл, задавая в команде опции PREVIEW, TO PRINTER или TO FILE соответственно. При выводе данных в окно предварительного просмотра можно не приостанавливать действие программы, если указать дополнительную опцию NOWAIT. При выводе данных на принтер использование дополнительной опции PROMPT обеспечивает вывод диалогового окна для уточнения установок принтера. Если мы направляем данные в файл, то по умолчанию он получает расширение TXT и в него помещаются все необходимые коды принтера для обеспечения возможности его дальнейшего вывода на соответствующее печатающее устройство. Если вы хотите получить только текст, используйте дополнительную опцию ASCII. Естественно, это приведет к потере графического оформления.
    Число символов в строке будет определяться системной переменной

_ASCIICOLS = nExpression

    Параметр nExpression по умолчанию равен 80.
    Число строк на листе будет определяться системной переменной

_ASCIIROWS = nExpression

    Параметр nExpression по умолчанию равен 63.
    Таким образом, для получения текстового файла на основе данных отчета можно, например, выполнить такой код:

_ASCIICOLS = 60
_ASCIIROWS = 40
REPORT FORM Rep_price TO FILE D:\INFO\PRICE_TEXT ASCII

Управление режимом печати

    Все или по крайней мере большинство приложений Windows позволяют для каждого документа задавать индивидуальные условия печати: размеры полей, страничную ориентацию и т. д.
    Естественно предположить, что так же поступает Visual FoxPro со своими документами, предназначенными для печати, - отчетами. В команде выполнения отчета REPORT FORM есть опция TO PRINTER PROMPT, которая обеспечивает вывод на экран диалогового окна для установки условий печати. Это окно представлено на рис. 11.15.


Рис. 11.15. Диалоговое окно установки принтера в Visual FoxPro
    Кстати, это окно можно вывести на экран и после выполнения функции
GETPRINTER()

    Если по каким-то причинам появление этого окна в пользовательской программе нежелательно, то изменить режим печати можно и программно. Файл, в котором запоминается описание отчета, представляет собой стандартную таблицу Visual FoxPro. В первой записи этого файла в поле expr, которое имеет тип поля примечаний, в текстовом виде указывается информация об установках принтера.
    Каждая установка записывается с новой строки, всего в этом поле может храниться до 16 различных установок:

  • DRIVER - имя маршрутизатора, используемого Windows для управления запросами на печать от клиентов. Он определяет, какой компонент спулера печати должен обрабатывать этот запрос.
  • DEVICE - имя принтера.
  • OUTPUT - имя порта, к которому присоединен принтер.
  • ORIENTATION - ориентация страницы.
  • PAPERSIZE - размер бумаги.
  • PAPERLENGTH - длина листа бумаги.
  • PAPERWIDTH - ширина листа бумаги.
  • SCALE - фактор масштаба документа.
  • COPIES - число копий, которое будет напечатано.
  • DEFAULTSOURCE - тип лотка для подачи бумаги.
  • PRINTQUALITY - горизонтальное разрешение принтера.
  • COLOR - определяет, будет использоваться цветная или монохромная печать.
  • DUPLEX - определяет, будет ли использоваться при печати двойной проход.
  • YRESOLUTION - вертикальное разрешение принтера.
  • TTOPTION - определяет режим печати шрифта TrueType.
  • COLLATE - определяет порядок вывода страниц при печати нескольких копий.

    Пример содержания поля expr для отчета Propmod приведен на рис. 11.16.
    Допустимые значения для перечисленных выше параметров можно получить с помощью функции

PRTINFO(nPrinterSetting [, cPrinterName])

    которая возвращает текущие установки, сделанные в Windows.
    Различные допустимые значения параметра nPrinterSetting приведены в следующем списке:

  • 1 - ориентация страницы
  • 2 - размер бумаги
  • 3 - длина листа бумаги
  • 4 - ширина листа бумаги
  • 5 - масштаб документа
  • 6 - число копий, которое будет напечатано при выводе
  • 7 - тип лотка для подачи бумаги
  • 8 - горизонтальное разрешение принтера
  • 9 - цветная или монохромная печать
  • 10 - перенасыщенная печать
  • 11 - вертикальное разрешение принтера
  • 12 - режим печати шрифта TrueType
  • 13 - режим последовательной печати
    Получить информацию о текущем принтере можно с помощью функции
APRINTERS(ArrayName)
    которая записывает данные в указанный массив. Массив может до выполнения ункции не существовать. Например, команда:
APRINTERS(aCurrentPrn)
    запишет в массив aCurrentPrn следующие данные:
ACURRENTRRN
Pub      A
( 1, 1) C "Epson LQ-100 ESC/P 2"
( 1, 2) C "LPT1:"

    Установку драйвера принтера можно проверить с помощью функции

PRINTSTATUS()

    Если драйвер установлен, она возвращает значение .T.. Обратите внимание, что эта функция не определяет готовность принтера к печати.
    Как быть, если мы хотим напечатать лишь некоторые страницы из отчета? Нам поможет команда

PRINTJOB
<<Команды вывода на печать>>
    ENDPRINTJOB

    Она активизирует установки системных переменных, имеющих отношение к печати. Например, следующий фрагмент обеспечит вывод на печать вторую, третью и четвертые страницы отчета Propmod.

_PBPAGE = 2
_PEPAGE = 4
PRINTJOB
     REPORT FORM Propmod TO PRINTER
ENDPRINTJOB

11.2. Создание отчетов в Access

    В MS Access получать твердые копии результатов обработки данных можно путем распечатки таблиц, запросов и форм. Но при этом сложно или невозможно получить то качество и гибкость, которые предоставляет Конструктор отчета.
    В этом параграфе мы расскажем, как создавать отчет с помощью Конструктора отчета и печатать его из программы Access.
    Помимо вывода данных на печать, Конструктор отчета поможет провести, при установке соответствующих опций, предварительную сортировку и группировку данных, форматирование данных и подсчет промежуточных результатов без какого-либо программирования.
    Для запуска Конструктора отчета в контейнере БД перейдите на вкладку Отчеты и нажмите кнопку Создать. В появившемся диалоговом окне в списке выберите пункт Конструктор. При загрузке Конструктора отчета вместе с ним загружается меню Конструктора отчета, а также панели инструментов для форматирования данных, выбора элементов управления и работы с Конструктором отчета.
    Отчет для отображения данных из какого-либо набора должен иметь установленным свойством RecordSource (Источник данных). Обычно источник данных выбирается при первом вызове Конструктора отчета для создания конкретного отчета, когда диалог позволяет выбрать нужные таблицу или запрос из списка таблиц и запросов, находящихся в текущей базе данных. Если вам необходимо отображать данные из таблиц и запросов, находящихся в других базах данных Access или другого формата, то вам необходимо либо их присоединить, либо создать к ним сквозной запрос. Как это сделать, мы говорили в восьмой главе. Если вы не указали источник данных при создании отчета, то можете исправить положение с помощью окна Properties (Свойства), которое служит для установки свойств объектов в течение дальнейших изменений в отчете.
    Элементы управления можно копировать и вставлять в другие отчеты, при этом элементы переносятся из отчета в отчет со всеми установлеными значениями свойств. Можно выделить и перенести целый набор объектов. Для выделения объекта вам достаточно, чтобы хотя бы часть его попала в область охвата указателя мыши, перемещаемого при нажатой левой кнопке. Для того чтобы установить эти параметры, используется диалоговое окно Параметры и вкладка Формы/Отчеты, как показано на рис. 11.17.


Рис. 11.17.

    Если вам необходимо несколько элементов, у которых много одинаковых свойств, создайте элемент, обладающий всеми общими для группы объектов свойствами, а затем дублируйте их с помощью команды Дублировать меню Правка.
    В тех случаях, когда вам необходимо особо точно выстраивать элементы в отчете, используйте линейку, которая займет место вдоль верхней и левой границ окна Конструктора отчета. Для вывода Линейки используется команда с одноименным названием в меню Вид. При этом шкала измерений зависит от установок Windows. Поэтому, если вдруг шкала линейки окажется в дюймах, а не в сантиметрах, обратитесь к Панели Управления Windows и выберите установку Язык и Стандарты. В ней вы найдете вкладку, в которой можете установить метрическую систему исчисления. После этого, что очень приятно, не потребуется перезагрузка Access - установки будут приняты немедленно. Вместе с линейкой можно вывести сетку, воспользовавшись командой с одноименным названием из меню Вид.
    В любой момент создания отчета вы можете перейти в режим предварительного просмотра и обратно, то есть для того, чтобы получить представление о внешнем виде отчета, вам необязательно его печатать. Режим предварительного просмотра позволяет увидеть отчет в том виде, в котором он будет выглядеть при печати.
    При работе с отчетом и его элементами часто возникает необходимость в различных операциях форматирования. Например, выравнивание группы элементов по верхнему краю, приведение их размеров к одному значению, установка одинакового расстояния между элементами в группе. Для этого используется меню Формат, команды Выровнять, Размер, Интервал по горизонтали и Интервал по вертикали. Если вам не нравится шрифт текстового поля и его размер, принятые по умолчанию для каждого нового объекта, вы можете создать объект с требуемыми свойствами и запомнить его в качестве стандартного. Для этого выделите созданный вами будущий стандартный объект и выберите команду Задать стандартные свойства в меню Формат.
    В меню Формат имеется команда Автоформат, которая служит для быстрого выбора формата отчета из заранее предопределенных, в которых задаются шрифт, цвет и границы. При этом вы можете с помощью кнопки Настройка переопределить любой встроенный формат или создать новый. Любой созданный отчет вы можете указать в качестве шаблона. Для этого используется вкладка Формы/Отчеты окна Настройки параметров.
    Отчет в Access, так же как в Visual FoxPro, состоит из пяти частей: заголовок отчета, примечание отчета (итоги), верхний колонтитул, нижний колонтитул (или, другими словами, заголовок страницы и примечание страницы) и область данных. Все области, кроме области данных, вы можете выводить или не выводить в окне Конструктора отчетов. Каждая область имеет свой набор свойств и событий.
    Рассмотрим пример создания отчета, который будет выводить сведения о наличие автомобилей на складе, группируя их по странам нахождения штаб-квартир и выводя сумму товара по каждой группе. При этом каждая отдельная группа должна выводиться своим цветом шрифта и иметь изображение национального флага рядом с названием страны. Для этого нам надо создать запрос, который мы назовем "Данные для отчета" и в который отберем четыре поля из трех таблиц.
    Запрос будет выглядеть следующим образом, если его открыть в режиме SQL:

SELECT DISTINCTROW country.country_name, model.name_model,
[automobile passenger car].date_issue, [automobile passenger car].cost
FROM country INNER JOIN (firm INNER JOIN (model INNER JOIN
[automobile passenger car] ON model.key_model = [automobile passenger
car].key_model) ON firm.key_firm = model.key_firm) ON country.key_country
= firm.key_country;

    Начав создание отчета, выберите в качестве источника данных запрос "Данные для отчета". Попав в режим Конструктора отчета, создайте себе комфортное окружение, разместив панели инструментов так, чтобы они всегда находились в одном месте и предоставляли быстрый доступ к нужным вам кнопкам. Оставьте в панели инструментов только те элементы, которые вы собираетесь часто использовать. Поработав с Конструктором отчета буквально одну-две недели, вы поймете, что держать кнопки для вывода-удаления Линейки и Сетки в панели инструментов Конструктора отчета смысла нет, так как это довольно редкая операция, к тому же ее можно выполнить из меню. А вот кнопка Копировать формат понадобится довольно часто.
    Пример размещения инструментов и окон при работе с Конструктором приведен рис. 11.18.


Рис. 11.18.

    После того как вы разместили все окна и панели инструментов, определите, какие из частей отчета вы собираетесь использовать. Если вам не нужен заголовок отчета, то отключите его вывод.
    С помощью линеек, отделяющих одну часть отчета от другой, можно изменить размер каждой из областей. Для этого необходимо установить курсор мыши на линейку и, когда он примет форму перекрестия, нажать кнопку мыши и изменить размер перетаскиванием. Для размещения полей можно воспользоваться двумя способами. Первый - вывести список полей с помощью команды Список полей меню Вид и обычным перетаскиванием графического образа поля в окно Конструктора отчета получить связанное текстовое поле. Второй - выбрать значок Поле в панели элементов и поместить элемент в окне Конструктора. При этом курсор примет вид, указывающий, какой элемент вы собираетесь разместить. Таким образом вы получите несвязанное поле. После этого необходимо указать поле в источнике, с которым вы хотите связать полученный элемент управления. Для этого измените свойство Источник данных (ControlSource). На этом этапе вы получите размещение полей и надписей, которое представлено на рис. 11.19.


Рис. 11.19.

    Необходимо сгруппировать данные по полю country_name, так как в нашей задаче преследуется цель получить сводные данные по каждой автомобильной державе, автомобили которой мы продаем. Используем для этого команду Сортировка и Группировка. После ее выбора перед вами предстанет окно Сортировка и Группировка. Здесь в колонке Поле/Выражение мы выбираем необходимое нам поле, в нашем случае это country_name, во второй колонке указываем тип сортировки по этому полю - либо по возрастанию, либо по убыванию.
    Для каждой записи в верхней части окна, в нижней части становятся доступными свойства группы. Это Заголовок и Примечание группы. Установив эти свойства в Да, вы получаете еще несколько областей в вашем отчете вместе с их свойствами и событиями.
    Следующее свойство - группировка - может принимать различные значения в зависимости от типа поля, по которому проводится группировка. Для текстового поля таких значений может быть только два - По полному значению или По первым символам. Например, если вы хотите, чтобы в одну группу попали страны, названия которых начинаются на одну букву, то выберите группировку По первым символам, а следующее свойство Интервал оставьте равным 1.
    Теперь Италия, Испания и Индия попадут в одну группу, если, конечно, фирма продает производимые в них автомобили. Для создаваемого отчета выбираем значение По полному значению, так как нам нужна группа с конкретной страной.
    Последнее свойство - Не разрывать используется тогда, когда вы хотите, чтобы сведения о группе не разрывались, а размещались на одной странице. Бесспорно это очень удобно, но не экономно, так как даже если всего одно значение из группы не уместится на странице, вся группа целиком будет отпечатана на новой. Поэтому мы оставляем это свойство равным Нет.
    Окно Конструктора отчета изменилось, его новый вид представлен на рис. 11.20, и, надеемся, то же самое вы наблюдаете на экранах своих компьютеров.


Рис. 11.20.

    После того, как у нас появилась область для группирования, мы разместили в ее заголовке поле country_name. Теперь при выводе отчета данные, соответствующие каждой новой стране, будут предваряться ее названием.
    В примечании группы нам надо вывести сумму по полю цена для каждой страны. Для этого размещаем в примечании группы элемент управления поле, а в свойстве данные указываем следующее выражение:

= Sum(cost)

    Обратите внимание, что выражение обязательно должно начинаться со знака равенства. В противном случае Конструктор отчета воспримет его как параметр и потребует ввести его значение перед форматированием отчета. Так как мы разместили элемент управления в Примечании группы, то нам не надо заботиться о том, сумму по каким странам он будет вычислять. Сумма будет вычислена именно по группе. Теперь имеет смысл, выбрав команду Предварительный просмотр, вывести на экран макет нашего отчета. В окне предварительного просмотра он должен выглядеть так, как это представлено на рис. 11.21.


Рис. 11.21.

    Перед нами осталась последняя задача - вывести флаг каждой страны в заголовке группы и динамически изменить цвет шрифта у элемента управления, выводящего название страны в заголовке группы. Добавим в заголовок элемент управления Рисунок. Нас интересует его свойство Picture.
    Элементы управления отчетов не имеют свойств событий, но эти свойства присутствуют у каждой из областей отчета, в том числе и у заголовков групп. Это свойства OnFormat, OnPrint, OnRetreat.
    Событие Format (Форматирование) происходит при форматировании части отчета, к которой он относится, то есть на внутреннем уровне происходит установка свойств, которые мы задали при конструировании отчета. Имеет смысл иногда сделать эти свойства динамическими, чтобы при форматировании каждой группы отдельные элементы получали разные свойства в зависимости от того, к какой группе они относятся.
    Запишите следующий код для процедуры события форматирования заголовка группы:

Private Sub ЗаголовокГруппы0_Format(Cancel As Integer, FormatCount As Integer)
     Dim kolor As String
     kolor = country_name
     If Trim(kolor) = "Германия" Then
Me!country_name.ForeColor = 255
risrep.Picture = "c:\project_book\Flggerm.ico"
     End If
     If Trim(kolor) = "Италия" Then
Me!country_name.ForeColor = RGB(0, 255, 0)
risrep.Picture = "c:\project_book\FlgItaly.ico"
     End If
     If Trim(kolor) = "США" Then
Me!country_name.ForeColor = RGB(0, 0, 255)
risrep.Picture = "c:\project_book\Flgusa01.ico"
     End If
End Sub

    Теперь при выводе нашего отчета для предварительно просмотра будет изучаться значение элемента управления country_name и после этого устанавливаться свойство ForeColor (цвет шрифта) объекта country_name и свойство Picture объекта risrep, который в нашем случае является элементом управления для вывода значка с национальным флагом страны, являющейся заголовком группы. В итоге получается отчет, который представлен на рис. 11.22.


Рис. 11.22.

    Использование событий придаст вашим отчетам значительную гибкость, вы сможете использовать различные итоги в зависимости от ситуации, скрывать и выводить суммы, целые колонки полей. Создав один отчет, вы фактически получите несколько его вариантов.
    Кроме этого, используя событие самого отчета например, Открытие, вы сможете легко запретить нежелательному пользователю вывод вашего отчета на печать или его предварительный просмотр.
    В заключение мы хотели бы дать вам следующие рекомендации при построении отчета в Access:

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

    СУБД Access позволяет чрезвычайно легко организовать печать отчетов из формы. Для этого действительно достаточно нескольких щелчков мышью.
    Откройте какую-либо форму в Конструкторе формы. Выделите на панели элементов кнопку "Кнопка". Щелкните мышкой на форме в месте, где должен находиться левый верхний угол будущей кнопки для печати отчета. Автоматически запустится Мастер "Создание кнопок". Выберите в списке категорий пункт "Работа с отчетом", а в списке действий - "Печать отчета". На следующем шаге из списка необходимо выбрать имя одного из созданных ранее отчетов. Далее останется выбрать значок, которым будет украшена кнопка, и назначить ей имя, например cmdPrint.
    В форме появится кнопка, при нажатии на которую будет печататься требуемый отчет.
    Если в Конструкторе формы вы посмотрите на код, который будет выполняться при наступлении события OnClick для этой кнопки (нажатие кнопки), то увидите следующий текст:

Sub cmdPrint_Click()
On Error GoTo Err_cmdPrint_Click
     Dim stDocName As String
     stDocName = "Account"
     DoCmd.OpenReport stDocName, acNormal
Exit_cmdPrint_Click:
     Exit Sub
Err_cmdPrint_Click:
     MsgBox Err.Description
     Resume Exit_cmdPrint_Click
End Sub

    В данном примере для печати отчета используется метод OpenReport, который в программе выполняет макрокоманду "ОткрытьОтчет" (OpenReport). Этот метод имеет следующий синтаксис:

DoCmd.OpenReport ИмяОтчета [, Режим] [, ИмяФайла][,Условие]

    Аргумент ИмяОтчета представлят имя отчета, хранящегося в текущей базе данных.
    Для задания значения аргумента Режим может использоваться одна из следующих встроенных констант:

  • acNormal - печать отчета (по умолчанию);
  • acDesign - вызов Конструктора отчета;
  • acPreview - вывод отчета в окно предварительного просмотра.

    Аргумент ИмяФайла позволяет задать имя запроса, хранящегося в текущей базе данных, с помощью которого будут подготовлены данные для печати отчета.
    Аргумент Условие позволяет задать допустимое предложение SQL WHERE без ключевого слова WHERE
    Необходимо отметить, что в Access мы можем легко вывести на печать не только отчет, но и любой активный объект, например форму или таблицу. Для этого используется метод PrintOut, который выполняет макрокоманду "Печать" (PrintOut). Синтаксис этого метода имеет следующий вид:

DoCmd.PrintOut [Диапазон] [, СоСтраницы, ПоСтраницу]
[, Качество] [, ЧислоКопий] [, РазобратьКопии]

    В качестве аргумента Диапазон может использоваться одна из следующих встроенных констант:

  • acPrintAll - для печати всего отчета (по умолчанию);
  • acSelection - для печати фрагмента отчета;
  • acPages - для печати указанных страниц. При этом должны быть указаны аргументы СоСтраницы и ПоСтраницу.

    Для задания значения аргумента Качество должна использоваться одна из следующих встроенных констант:

  • acHigh - высокое качество печати (разрешение принтера) - по умолчанию;
  • acMedium - среднее качество печати;
  • acLow - низкое качество печати;
  • acDraft - печать черновика.

    Число печатаемых копий отчета задается аргументом ЧислоКопий которое по умолчанию равно 1.
    Задание для аргумента РазобратьКопии значения, равного True(-1), определяет печать с раскладкой по копиям, а False (0) - печать без раскладки. Если оставить данный аргумент пустым, будет принято значение по умолчанию (True).
    Напомним, что в Access необязательный аргумент посреди списка аргументов разрешается пропустить, однако при этом необходимо ввести запятую, отделяющую пропущенный аргумент. Если опускаются один или несколько последних аргументов, вводить запятые вслед за последним указанным аргументом не требуется.
    Например, для вывода формы на принтер мы можем создать в ней специальную кнопку, для события OnClick которой запишем следующий код, при выполнении которого будут напечатаны три экземпляра отчета:

Private Sub cmdForm_Click()
DoCmd.PrintOut(acPrintAll,,3)
End Sub
Глава 10 || Содержание || Глава 12