Хотя Visual FoxPro поставляется с приложением построителя отчета (Report Builder), для использования по умолчанию, объединенного с общей схемой обработчиков событий дизайнера отчета (Report Designer), вы можете заменить или расширить это приложение вашей собственной разработкой.

Смотрите статью Понимание событий построителя отчета  для получения подробной информации о способе написании программы, которая подчиняется прикладному программному интерфейсу построителя отчета (report builder API).

Использование альтернативного приложения построителя по умолчанию.

Для установки своего собственного приложения построителя отчета

  1. Добавьте в файд CONFIG.FPW строчку, которая установит системную переменную _REPORTBUILDER :

    _REPORTBUILDER = имя_вашей_программы_построителя.prg

Замена приложения reportbuilder.app "на лету"

Для замены построителя отчета в программном коде

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

    cOriginalBuilderApp = _REPORTBUILDER

    _REPORTBUILDER = "mybuilder.prg"

  2. Для восстановления значения по умолчанию - используйте следующую команду:

    _REPORTBUILDER = m.cOriginalBuilderApp

Возват к приложению ReportBuilder.App

Для возврата к приложению Reportbuilder.app

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

    parameters returnFlags, eventType, cmdClauses, sessionID

    :

    do (HOME(1)+"ReportBuilder.App") with returnFlags, eventType,

    cmdClauses, sessionID

Посмотрите приведенный ниже пример для приложения построителя отчета, который обеспечивает возврат к  Reportbuilder.app to augment the default behavior.

Пример

Этот пример программы предстааляет собой оболочку для приложения ReportBuilder.App с целью обеспечения настроенное поведение для команды CREATE REPORT - Quick Report.

Функциональность включает в себя:

  • Введение "Company letterhead" в раскладку.

  • Обновление элементов заголовка и подножия.

Для использования установите _REPORTBUILDER = FULLPATH("quickreportbuilder.prg").

  Copy Code
*-----------------------------
* QUICKREPORTBUILDER.PRG
*-----------------------------
#DEFINE QUERY_TITLE_LOC "Creating a Quick Report"
#DEFINE HEADER_QUERY_LOC "Company-standard name will be included. "+ ;
"Would you like to add something?"
#DEFINE FINISH_QUERY_LOC "Finished! "+CHR(13)+ ;
"Would you like to adjust the contents?"
#DEFINE COMPANY_HEADER_LOC "ABC Company"

* Флажки возвращаемых величие:---------
#DEFINE EVENT_PASSED_TO_VFP 0
#DEFINE EVENT_HANDLED_BY_BUILDER 1
#DEFINE FRX_DISCARD_CHANGES 0
#DEFINE FRX_RELOAD_CHANGES 2

* Типы событий перехватчика:-----------
#DEFINE EVENTTYPE_REPORTOPEN 7
#DEFINE EVENTTYPE_OBJECTCREATE 2
#DEFINE EVENTTYPE_REPORTSAVE 6
#DEFINE EVENTTYPE_REPORTCLOSE 8
#DEFINE EVENTTYPE_PROPERTIES 1

* Режимы обработок ReportBuilder.App:
#DEFINE MODE_HANDLE_CLASS 1
#DEFINE MODE_FORCE_DEBUG 2
#DEFINE MODE_FORCE_NATIVE 3

* стандартный набор FRX
#DEFINE OBJTYPE_TEXT 5
#DEFINE OBJTYPE_FIELD 8
#DEFINE OBJTYPE_FONTRES 23
* ----------------------------

#DEFINE MB_YESNO 4
#DEFINE MB_ICONQUESTION 32
#DEFINE IDYES 6
#DEFINE IDNO 7
* ----------------------------

LPARAMETERS returnFlags, eventType, commandClauses, designerSessionId

* Этот построитель пригоден лишь для быстрых отчетов "quick report".
* Критерий: - Должен быть раскладкой REPORT, но не LABEL
* - Должен быть использован командной CREATE REPORT FROM...

LOCAL BuilderModule
BuilderModule = HOME()+"ReportBuilder.App"

IF commandClauses.IsReport AND NOT EMPTY(commandClauses.FROM)

LOCAL oFrxHelper
oFrxHelper = NEWOBJECT("frxCursor", HOME()+"FFC\_frxcursor.vcx")

DO CASE
CASE m.eventType = EVENTTYPE_REPORTOPEN
* Это первое событие для быстрого отчета.
* Во-первых, заменим шрифтовые ресурсы и информацию и шрифте, используемые
 * замените шрифт и информацию о шрифте 
* в заголовке, в соответствии с вашими требованиями,так как
* в этом простом примере имеются некоторые жесткозаданные
* метрики для высот.
* Курсор FRX находится в текущей рабочей области:
REPLACE frx.fontface WITH "Courier New" ;
FOR RECNO() = 1 OR frx.objtype = OBJTYPE_FONTRES
LOCATE FOR frx.objtype = OBJTYPE_FONTRES

* Теперь, добавьте запись ресурса шрифта для нашего
* "designed" выражения:
SCATTER MEMVAR MEMO
m.penred = 255
m.fontface = "Tahoma"
m.fontstyle = 1
INSERT INTO frx FROM MEMVAR

* Теперь, повторно используйте переменные памяти, изменяя их значения,
* для установки записи спроектированного выражения:
m.uniqueid = SYS(2015)
m.objtype = OBJTYPE_TEXT
m.objcode = 0
m.timestamp = oFrxHelper.getFrxTimeStamp()
m.vpos = 20
m.hpos = 20
m.height = 3000
m.width = 50000
m.fillchar = "C"
m.penred = 255
STORE -1 TO m.fillred, m.fillgreen, m.fillblue
m.mode = 1
m.stretch = .T.
m.top = .T.
m.spacing = 2
m.offset = 2
m.resettotal = 1
m.supalways = .T.
m.suprpcol = 3
m.supgroup = 0
m.totaltype = 0
m.expr = INPUTBOX(HEADER_QUERY_LOC, ;
QUERY_TITLE_LOC, ;
COMPANY_HEADER_LOC)

DO CASE
CASE EMPTY(m.expr)
m.expr = COMPANY_HEADER_LOC

CASE ATC(COMPANY_HEADER_LOC,m.expr) = 0
m.expr = COMPANY_HEADER_LOC + " " + ALLTR(m.expr)

ENDCASE
m.expr = ["]+m.expr+["]

INSERT INTO frx FROM MEMVAR

* Наконец, сообщите дизайнеру о том, чтобы использовались наши изменения:
returnFlags = FRX_RELOAD_CHANGES

CASE m.eventType = EVENTTYPE_REPORTSAVE
* Это последнее событие в быстром отчете.

IF NOT EMPTY(m.BuilderModule) AND ;
MESSAGEBOX(FINISH_QUERY_LOC,;
MB_YESNO +MB_ICONQUESTION,;
QUERY_TITLE_LOC) = IDYES

* Дайте пользователю шанс установить или ликвидировать
* объекты определенных типов:
SCAN ALL FOR INLIST(frx.objtype, ;
OBJTYPE_FIELD, OBJTYPE_TEXT)
* Отметьте объект, как "selected" так чтобы построитель мог
* с ним работать:
REPLACE frx.curpos WITH .T.
* Вызовите приложение построителя, ;
* подделывая обычное событие дизайнера отчета:
do (BuilderModule) with ;
-1, EVENTTYPE_PROPERTIES, ;
m.commandClauses, ;
m.designerSessionId
REPLACE frx.curpos WITH .F.
ENDSCAN
m.returnFlags = FRX_RELOAD_CHANGES
ENDIF

* Найдите компонент для выражения DATE(), созданный
* процессом Quick Report и превратите его в DATETIME():
LOCATE FOR frx.objtype = OBJTYPE_FIELD AND ;
UPPER(ALLTRIM(frx.expr)) == "DATE()"
LOCAL liWidth
liWidth = oFrxHelper.GetFruTextWidth( ;
TRANSFORM(DATETIME()),;
frx.fontface, frx.fontsize )
REPLACE frx.expr WITH "DATETIME()", ;
frx.width WITH m.liWidth

* Найдите компоненты _pageno и слегка исправьте их:
LOCATE FOR frx.objtype = OBJTYPE_TEXT ;
AND ATC(["PAGE],frx.expr) > 0
IF FOUND()
REPLACE frx.expr WITH ["Page "+TRANSFORM(_PAGENO)],;
frx.objtype WITH OBJTYPE_FIELD, ;
frx.hpos WITH (frx.hpos - (frx.width*2)), ;
frx.width WITH frx.width*3
SKIP
* Удалите другой объект _pageno который следует за
* "Page" в обычном быстром отчете:
DELETE
ENDIF

* Мы должны проинструктировать дизайнер, чтобы он одобрил наши изменения:
returnFlags = FRX_RELOAD_CHANGES

OTHERWISE
returnFlags = EVENT_PASSED_TO_VFP

ENDCASE

ELSE
* Параметры направляются по ссылке:
do (BuilderModule) with m.returnFlags, ;
m.eventType, ;
m.commandClauses, ;
m.designerSessionId
ENDIF
RETURN

Смотри также