Основной - tester.m4rb
Maple4 Report Builder\Работа с программой\Описание примера\
Должен предупредить, что для эффективной работы Вы должны иметь навыки создания отчетов в стандартном редакторе (СР) Visual FoxPro.
Почему?
Всего лишь потому, что принципы создания в RB аналогичны применяемым в стандартном.
Далее - описание выложенного примера.

Пример состоит из 5 репортов.
tester.m4rb - основной репорт
phone_user.m4rb - репорт для генерации списка телефонов
ip_user.m4rb - репорт для генерации списка IP
phone_user_detail.m4rb - репорт, который запускается по клику номера телефона в сформированном отчете
ip_user_detail.m4rb - репорт, который запускается по клику IP в сформированном отчете

Описание основного репорта - tester.m4rb



Установлен флаг Hide Values (для облегчения понимания отчета)

Каждый Report имеет следующие зоны (в дальнейшем - Хедеры ):
Title (Начало отчета), Summary (Конец отчета), Page Header (Начало страницы), Page Footer (Конец страницы) и Detail (Данные).
Использовать их пользователем или нет - личное дело пользователя, но они есть и всегда будут, ХОТЯ БЫ по одному каждого вида в Report-е.
Хедер управляет строками, которые в него входят

Вот, например, Хедер Title



А вот это - пример Хедера Detail



Сразу можно заметить, что в репорте есть ТРИ Хедера Detail
Один Вы уже видели, вот еще два.



и



При генерации отчета проверяется условие, и если оно = .t. (по умолчанию), Хедер печатается.
По репорту первый хедер печатается всегда, а второй и третий - в зависимости от типа договора.
Условие печати второго Хедера - по типу договора Телефония (задать/просмотреть условие можно, выбрав в контекстном меню Header/Rule/Report)
iif(alltr(test_.t2)=="Internet",.f.,.t.)

Третьего - по типу договора Интернет:
iif(alltr(test_.t2)=="Internet",.t.,.f.)

Порядок печати определяется расположением Хедеров в отчете.
Можно перемещать Хедеры Вверх/Вниз (только в пределах типа, т.е. нельзя, например, Detail расположить выше Title)
Можно удалять Хедеры (удаляются так же все строки в Хедере), НО нельзя вообще удалить Хедер, если он один в отчете.

Кроме рассмотренных Хедеров, есть еще один: Group
Его применение необходимо в случае группировки данных.
Нужно понимать, что данные УЖЕ ДОЛЖНЫ быть отсортированы, аналогично, как со стандартным Report Builder-ом
Group должен принадлежать какому-либо уровню (ROOT) сортировки, т.е. не может быть Group без уровня, просто так.
При добавлении нового уровня сортировки (ROOT), добавлется одновременно Group для начала и Group для конца.
Group Start срабатывает при начале новой группы, Group End - при конце группы.
Может быть несколько Group , но должен быть хотя бы один Group (Group Start) для каждого уровня для начала и хотя бы один (Group End) для конца
В примере, данные в таблице отсортированы по городу (t1) и типу договора (t2).
Следовательно, в репорте есть два уровня (Root) сортировки:
перед Detail



и после



Данные Хедеры срабатывают, если меняются значения группировки. В таких Хедерах удобно вставлять функции вычисления сумм, количества стро и т.д. по группам.
Уровни сортировок Вы можете очень просто поменять, выбрав в контекстном меню Root/+ Move IN или Root/- Move OUT (предварительно, конечно, став на нужный Хедер)

Как работать с ячейками:

При двойном клике по Dnister, r. откроется



Значение ячейки представляет собой обычный текст. Спрашивается, а где же тут форматированный текст (Bold и Underline),

которым отображается значение в репорте?
В редакторе ячейки - только текст ячейки. Форматирование можно задать, кликнув по панели инструментов, в нужных кнопках:



При нажатой кнопке - B - жирный шрифт , I - выделение курсивом, U - подчеркнутый

При двойном клике по ячейке с содержимым Report откроется редактор значение ячейки:



Здесь Вы можете увидеть, что значение состоит из двух строк, в первой строке - обычный текст, а во второй - тег программы с функцией FoxPro.
Значение ячейки - текст, следовательно и значение выражения должно быть текстом, отсюда и вставка "вроде бы не нужной" функции ttoc() во второй строке.
Переход на другую строку сгенерит в файле HTML тег < BR >, поэтому нет необходимости это делать вручную.

Какая еще интересная особенность данной ячейки?
Цвет шрифта выделен красным. Простейший способ изменить его - в панели инструментов нажать Font Color выбрать необходимый.



Если количество цветов не устраивает - выбираете GetColor - и далее - нужный цвет в привычном FoxPro-шном окне.



Другой вариант вызова окна - кликнуть мышкой по квадратику с цветом.
Аналогично с цветом шрифта можно работать и с фоном ячейки Back Color.

Смена шрифта и размера шрифта так же не составит труда - все достаточно интуитивно.
Кликнув по названию шрифта выбираете нужный, если не устраивают те, что есть по умолчанию - GetFont.




Выбор размера - аналогично - выбор из возможных, или задание нужного прямо в окне.




Еще одна интересная особенность данной ячейки - обработка клика по содержимому (в готовом отчете)
Задать/промотреть обработку можно в контекстном меню Edit/Cell/Click:

"VFP:///messagebox('DateTime for Report - `ttoc(datetime())`'+chr(13)+'DateTime For Click - '+ttoc(datetime()))
return -999
"
Попробую объяснить, что значит сие :)
Во первых, весь текст ДОЛЖЕН БЫТЬ обрамлен двойными кавычками (не допускаются двойные кавычки внутри)
Во вторых, обратите внимание на VFP:/// в тексте - это указание программе, что будет обработка клика, а не простой переход.
В третьих, данный текст формируется в момент генерации отчета - отсюда и наличие тегов с функцией FoxPro `ttoc(datetime())`
В четвертых, Вы должны понимать, что текст
messagebox('DateTime for Report - `ttoc(datetime())`'+chr(13)+'DateTime For Click - '+ttoc(datetime()))
return -999

это на самом деле кусок программы FoxPro, которая выполнится при клике по значению.
И в пятых - return -999 - указание программе, что после обработки клика должен быть рефреш (обновление) страницы.
У-ф-ф-ф...
Дальше - легче.

Вообще, представленный пример содержит море информации - например, дважды кликнув по полю Saldo Вы можете посмотреть, каким образом разместить в ячейке числовое значение, а в ячейке Address Вы увидите пример динамического форматирования ЧАСТИ текста в ячейке

Попробую объяснить, каким образом размещены рисунки в репорте.
Ячейка по умолчанию имеет тип Type: Value
Для того, что бы разместить рисунок, нужно сменить тип на Type: Picture
Это можно сделать в панели инструментов, нажав соответсвующую кнопку



или через контекстное меню
Edit/Type/Value или Edit/Type/Picture
На примере одного размещения рисунка попытаюсь объяснить, как все это делается.
При двойном клике по фотографии реки (кстати река Днестр, и привет Приднестровью :) и Бендерам ) откроется окно размещения графики в репорте.



Как Вы видите, файл называется top_11.jpg и он размещен в каталоге репорта (на это указывают \\ перед названием)
Размеры файла в репорте привязаны к размерам ячейки ( Height and Width/Size of Cell), поэтому картинка будет менять свои размеры с изменениями размеров - высоты и ширины - ячейки.
Есть много других вариантов - задание только высоты или только ширины, ограничение на максимальную высоту



или ширину максимальным значением или размерами ячейки,
в общем, можно выбрать подходящий по душе.

Картинку можно вставить в репорт (без размещения в каталоге).
Для этого выбираете переключатель Field in Cell и Open для выбора файла.

Еще один нюанс, который Вам несомненно понравится - в качестве имени файла может выступать выражение FoxPro.
Что это значит?
Допустим, Вы заранее размещаете пять различных файлов jpg в каталоге репорта (с именами top_1.jpg, top_2.jpg, top_3.jpg, top_4.jpg, top_5.jpg)
А в названии вписываете
\\top_`alltr(str(INT(RAND()*5)+1))`.jpg
это приведет к тому, что при генерации отчета (или рефреше) картинка будет меняться на другую случайным образом.

На что бы еще хотелось обратить внимание - на генерацию связанных отчетов.
Дважды кликнув по полю Phone by User Вы можете увидеть пример подготовки и запуска такого отчета (phone_user.m4rb):
`&
LOCAL ss,selesta
selesta=SELECT()
SELECT * FROM phone WHERE user_id=test_.user_id INTO CURSOR phonek
ss=maple4_ru_rb(2,"phone_user.m4rb","","phonek")
SELECT phonek
use
SELECT (selesta)
RETURN ss`


а в поле IP for User - отчета ip_user.m4rb
`&LOCAL ss,selesta
selesta=SELECT()
SELECT * FROM ip WHERE user_id=test_.user_id INTO CURSOR ipk
ss=maple4_ru_rb(2,"ip_user.m4rb","","ipk")
SELECT ipk
use
SELECT (selesta)
RETURN ss
`




При двойном клике по FIO откроется окно редактирования значения ячейки
`alltr(test_.fam)+" "+alltr(test_.im)+" "+alltr(test_.ot)`
Данная функция формирует текстовую строку из полей таблицы test_

При двойном клике по Saldo откроется окно редактирования значения ячейки
`alltr(str(test_.saldo,15,2))`
Данная функция формирует текстовую строку из test_.saldo - в ячейке должен находиться только текст.
В данной ячейке цвет зависит от значения test_.saldo
Вызвав через Edit/Font/Color окно редактирования, можно увидеть текст процедуры
iif(test_.saldo>0,RGB(255,0,0),NULL)
т.е. при test_.saldo>0 цвет будет красным

При двойном клике по Address откроется окно редактирования значения ячейки
`iif(alltr(test_.t2)=="Internet","< u >","< i >")``test_.addr``iif(alltr(test_.t2)=="Internet","< / u >","< / i >")`
В этой ячейке выводится значение поля test_.addr
Мало того, в зависимости от типа договора - Internet это или другой тип - значение либо подчеркивается, либо выделяется курсивом.

При двойном клике по изображению карандаша и листа в репорте откроется окно редактирования рисунка edit.ico
Но особенность данной ячейки в другом.
Выберите в контекстном меню Edit/Cell/Click для доступа к редактированию процедуры обработки клика.
Здесь находится пример запуска внешней формы maple4_rb_demo_form
"VFP:///do form maple4_rb_demo_form with `alltr(str(test_.user_id))`
return -999
"

При формировании динамически формируется ссылка с test_.user_id, а потом этот уникальный идентификатор передается (при клике в отчете) в заранее разработанную форму в каталоге запуска.
Назначение формы - редактирование адреса клиента. В данном случае это адрес некой Kuravkin-ой V I.



return -999 - указание программе обновить страницу

Код обновления страницы (отчета) - выбрать в контекстном меню Report/Refresh
lparameters zzz
wait window "Refresh report... Please wait" nowait
DO maple4_ru_rb WITH 1,"tester.m4rb","","test_","","MAIN REPORT"
wait clear

Обратите внимание - первая строка в процедуре - lparameters zzz
Обязательно указывать данную строку, можно даже с другим именем переменной.
Строка DO maple4_ru_rb WITH 1,"tester.m4rb","","test_","","MAIN REPORT" запускает генерацию репорта tester.m4rb без вывода его на экран - страница будет обновлена объектом IE.

При двойном клике по End Service откроется окно редактирования значения ячейки
For Service: `test_.t2` - ( < b >`str(m4rb_cnt())`< / b > ) -> < font size=+1 color=green >`alltr(str(m4rb_sum("test_.saldo"),15,2))`< / font>
На что бы тут хотелось обратить внимание:

test_.t2 - вывод типа договора
m4rb_cnt() - функция подсчета количества строк по группе (по типу договору в пределах города)
< b >`str(m4rb_cnt())`< / b > - частичное выделение жирным шрифтом
< font size=+1 color=green > - частичное выделение зеленым цветом и шрифтом на 1 больше текущего
m4rb_sum("test_.saldo") - вычисление суммы по полю test_.saldo в пределах типа договора и города (функция находится в хедере Group test_.t2 )

При двойном клике по End City откроется окно редактирования значения ячейки
For City: `test_.t1` - < font size = +1 color = blue >< b >`alltr(str(m4rb_sum("test_.saldo"),15,2))`< / b >< / font >
Что здесь:
формирование текстовой строки из значений
test_.t1 - вывод названия города
< font size = +1 color = blue >< b > - выделение части жирным текстом размером+1 синего цвета
m4rb_sum("test_.saldo") - подсчет общей суммы по полю test_.saldo по городу (функция находится в хедере Group test_.t1 )

При двойном клике по Summary откроется окно редактирования значения ячейки
Summary: `alltr(str(m4rb_sum("test_.saldo"),15,2))`

m4rb_sum("test_.saldo") - подсчет общей суммы по полю test_.saldo по всему отчету (функция находится в хедере Summary )



create by Maple4 Site Creator 6/2008  Контакты   Поиск   Карта сайта 
Rambler's Top100 Рейтинг@Mail.ru