Проектировщик отчета Visual FoxPro
« Назад Создает макет отчета. В качестве источников данных могут быть использованы одна таблица или две связанные таблицы. Откроем файл d:\AuthorsAndBooks.qpr – первый запрос, созданный средствами проектировщика запроса, и направим вывод в таблицу d:\AuthorsAndBooks.dbf (фрагмент таблицы см. на рис. 12.6). Отобразим эту таблицу в виде отчета. Откроем проектировщик отчета (команда меню File – New – переключатель Report – New File). Сделаем быстрый отчет: выполним команду меню Report – Quick Report, выберем затем таблицу d:\AuthorsAndBooks.dbf, в появившемся диалоге Quick Report (рис. 12.21) сбросим флажок Add alias и нажмем на кнопку Fields. Рис. 12.21. Диалог Quick Report В открывшемся диалоге Field Picker (рис. 12.22) выберем все поля и нажмем на OK сначала в Field Picker, а затем в диалоге Quick Report. Рис. 12.22. Выбраны все поля Замечание. Все поля будут выбраны, если нажать OK в диалоге Quick Report, минуя Field Picker. Проектировщик отчета создаст приведенный на рис. 12.23 макет. Рис. 12.23. Quick Report-макет Сохраним его в файле d:\AuthorsAndBooks.frx. В макете 3 полосы:
В вершине и основании все данные, кроме системной переменной _PAGENO, отвечающей за номер страницы, постоянны. В деталях, как правило, приводится табличная часть отчета, в вершине страницы отображаются заголовки столбцов таблицы, а в основании – номер страницы. Если просмотреть отчет, выполнив, например, команду меню View – Preview или употребив иконку стандартной панели инструментов, то получим результат, фрагмент которого приведен на рис. 12.24. Рис. 12.24. Просмотр быстрого отчета Недостатки отчета очевидны. Во-первых, нет заголовка отчета, во-вторых, непонятны заголовки столбцов, в-третьих, неоднократно печатаются одни и те же фамилии авторов, имеются также замечания по его оформлению т. д. Чтобы ввести заголовок, а заодно и полосу для итогов, откроем вкладку Optional Bands окна редактирования свойств отчета (команда меню Report – Properties) и установим на ней флажки Report has title band и Report has summary band (рис. 12.25); остальные флажки оставим сброшенными. Рис. 12.25. Задание полос для заголовка и итогов отчета В полосу заголовка, воспользовавшись, например, иконкой панели инструментов Report Controls, добавим текст "Авторы и книги". Также перенесем, оперируя мышкой, в эту полосу и поле с функцией DATE( ) из основания страницы. Кроме того, заключим дату в скобки, заменив функцию DATE( ) на следующее выражение: "(" + Dtoc(Date( ))+ ")" Удалим все заголовки столбцов в вершине страницы, воспроизведем их русскими словами и подчеркнем сплошной линией. Устраним теперь повторения фамилий авторов. Для этого дважды ударим мышью по полю Author и в окне редактирования свойств поля (рис. 12.26) на вкладке Print When установим флажок No (рис. 12.27) в группе кнопок Print repeated values (печатать повторяющиеся значения). Рис. 12.26. Фрагмент диалога Field Properties Рис. 12.27. Фрагмент вкладки Print When В основании страницы удалим надпись Page, а поле _PAGENO поместим в центре полосы и, дважды ударив по нему мышью, в окне редактирования свойств поля _PAGENO введем выражение "– " + Transform(_PAGENO) + " –" которое обеспечит вывод номера страницы в формате "– № –". В новую полосу для итогов поместим копию поля Price и обеспечим в нем вывод суммарного значения величин столбца "Цена". Для этого откроем окно редактирования свойств поля Price, расположенного в полосе итогов, выберем в окне вкладку Calculation и приведем ее в соответствии с рис. 12.28. Рис. 12.28. Задание вычисляемого поля Перед полем Price полосы итогов отчета добавим надпись "Всего книг на сумму:". После перечисленных модификаций, а также изменений геометрии элементов и выбора подходящих шрифтов для надписей и полей макет отчета примет приведенный на рис. 12.29 вид. Рис. 12.29. Новый вариант макета диалога Просмотр отчета (иконка ) покажет более приемлемый результат (рис. 12.30). Рис. 12.30. Вариант отчета "Авторы и книги" Рассмотрим вариант, в котором имя и отчество автора заменяются инициалами. Для его реализации создадим функцию ShortAuthor( ), получающую поле Author, и возвращающую фамилию автора с инициалами: function ShortAuthor(Author) if Empty(Author) then return "" endif && Число слов в строке nWords = GetWordCount(Author) && Фамилию берем полностью sAu = GetWordNum(Author, 1) for k = 2 to nWords && Получаем очередное слово, формируем инициал && и прибавляем его после пробела к строке sAu sAu = sAu + " " + Left(GetWordNum(Author, k), 1) + "." next && Возвращаем фамилию с инициалами return sAu endFunc Функцию сохраним, например, в файле d:\ShortAuthor.prg. Поле Author макета заменим на поле с выражением ShortAuthor(Author) (рис. 12.31). Рис. 12.31. Преобразованное поле Author Для запуска отчета выполним программу из 3-х следующих строчек: set procedure to d:\ShortAuthor.prg additive report form d:\AuthorsAndBooks preview release procedure d:\ShortAuthor.prg Как вариант, функцию ShortAuthor( ) можно разместить в файле с командой REPORT FORM: report form d:\AuthorsAndBooks preview function ShortAuthor(Author) … endFunc Фрагмент результата приведен на рис. 12.32. Рис. 12.32. Две строки табличной части отчета Недостаток такой организации отчета в том, что его нельзя запускать, если не загружена функция ShortAuthor( ). Рассмотрим теперь вариант отчета с группировкой данных, поместив дату ввода и фамилию автора перед списком его книг. После списка книг автора выведем сумму значений в столбце "Цена". Откроем окно редактирования свойств отчета, выберем вкладку Data Grouping и оформим ее в соответствии с рис. 12.33. Рис. 12.33. Группировка по полю Author Раздвинем появившуюся в макете отчета полосу Group Header 1:author и перенесем в нее заголовки "Автор" и "Дата ввода", а также соответствующие им поля из полосы Detail. Перед каждым заголовком проставим двоеточие, воспользовавшись окном редактирования свойств надписи (рис. 12.34). Рис. 12.34. Окно редактирования свойств надписи Раздвинем далее полосу Group Footer 1:author и поместим в нее поле Price (рис. 12.35), например копируя существующее или пользуясь иконкой панели инструментов Report Controls. Рис. 12.35. Макет диалога с группировкой данных Оформим Price как вычисляемое поле и укажем для него функцию Sum( ) (рис. 12.36). Рис. 12.36. Поле Price в полосе Group Footer 1:Author будет отображать общую стоимость книг автора Важно, чтобы в списке Reset base on находилось название созданной группы Author. Это будет означать, что в каждой новой группе суммирование начинается с нуля, что, собственно, нам и нужно для получения верного результата. Прочие изменения можно воспроизвести по вышеприведенному макету (см. рис. 12.35). Выполнив отчет, получим результат, фрагмент которого приведен на рис. 12.37. Рис. 12.37. Фрагмент отчета с группировкой по полю Author результата запроса |