Архитектура Построителя Отчетов определена таким образом, что у вас имеется возможность подсоединить свои собственные пользовательские Классы, которые выполняют требуемые вам операции, отличающиеся от стандартных. Например, пользовательский вариант обработчика некоторых Событий Построителя Отчетов. Дополнительно, в Построителе Отчетов вы можете заменить вызов стандартного построителя выражений (Expression Builder), для этого необходимо зарегистрировать ваш обработчик указанного события в соответствующей Таблице Регистрации Построителя Отчетов.

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

NoteОбратите Внимание

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

NoteПримечание

Рассматриваемый материал данного параграфа предполагает, что системная переменная _REPORTBUILDERустановлена в стандартный Построитель Отчетов. Если эта переменная имеет пустое значение или указывает на построитель другого Разработчика ПО, то описываемые ниже процедуры могут либо не выполняться либо выполняться некорректно. Смотрите дополнительно раздел:  _REPORTBUILDER, системная переменная.

Для построения класса-оболочки GetExpression:

  1. Создайте или отредактируйте класс библиотеки, в виде программного Кода:

    MODIFY COMMAND c:\temp\mylibrary.prg

  2. Определите требуемый Класс-Оболочку GetExpression, который осуществляет программный  интерфейс с вашим Приложением  (API), как рекомендуется в параграфе: Регистрационная Таблица Контроллера Событий в Построителе Отчетов. Для построения указанного Класса вы можете использовать приводимый ниже Образец некоторого Шаблона класса-оболочки. В данном примере обычный текст Этикетки заменяется простейшим боксом Ввода Данных.

  3. Сохраните выполненные изменения.

  CopyCode imageКопировать Код
DEFINE CLASS MyGetExpressionWrapper AS Custom
PROCEDURE GetExpression( cDefaultExpr, cDataType, ;
cCalledFrom, oEvent )
LOCAL cNewValue
* Switch to the designer datasession, where tables
* may be open:
SET DATASESSION TO (oEvent.DefaultSessionID)
DO CASE
CASE m.cCalledFrom = "LabelCaption"
* Specify special handling for label captions:
cNewValue = INPUTBOX("Enter the label caption")
OTHERWISE
* All other expression builders will use the default:
GETEXPR "Enter the label caption" TO cNewValue ;
TYPE cDataType DEFAULT cDefaultExpr
ENDCASE
* Restore to the private builder datasession:
SET DATASESSION TO (oEvent.FrxSessionID)
RETURN cNewValue
ENDPROC
ENDDEFINE

Для регистрации вашего Класса-Оболочки в Таблице Построителя Отчетов:

  1. Откройте диалоговый бокс Options (Параметры) Построителя Отчетов:

    DO (_REPORTBUILDER)

  2. Нажмите кнопку Explore Registry (Проводник Реестра).

  3. Переместитесь на Запись в Таблице, которая имеет характеристику: Type = "G".

  4. Измените данную запись следующим образом: Class = "MyGetExpressionWrapper",  а имя Библиотеки: Library= "c:\temp\mylibrary.prg"

  5. Нажмите кнопку OK - для сохранения сделанных корректировок.

Для выполнения Тестовых проверок работоспособности сделанных изменений:

  1. Откройте ваш Отчет или Этикетку в соответствующем Дизайнере.

  2. Выполните "Double-click" на некотором объекте типа label, чтобы активировался Диалоговый бокс Properties (Характеристики).

  3. Нажмите кнопку Выбора (многоточие) - (…) для определения значения рассматриваемого Контрола Отчета, далее работает программный код вашего пользовательского Класса.

Пример

По-умолчанию, при активации диалогового бокса Построителя Выражений из стандартного построителя Отчетов ReportBuilder.App, открытые в глобальной Сессии Данных Таблицы не отображаются в соответствующем Списке. Таблицы и Курсоры, прикрепленные к Среде Данных создаваемого Отчета также являются недоступными. Данный Сценарий использовался в Построителе Выражений для младших версий VFP и используется в тех случаях, когда отключен Построитель Отчетов (_REPORTBUILDER = "").

В следующем далее Примере демонстрируется, как вы можете определить Альтернативный Контроллер для отслеживания текущей Среды Данных, открытых Таблицах в приватной сессии, активации стандартного диалогового бокса GETEXPR, который повторяет и дублирует все необходимые функции обычного Построителя Выражений.

Вы можете сохранить описываемый Класс в Процедурном файле (.prg) и зарегистрировать его в Построителе Отчетов, как описано выше; дальнейшее использование данного Класса позволит вам более успешно использовать требуемые Источники Данных.

  CopyCode imageКопировать Код
DEFINE CLASS GetExpressionWithDE AS Session

DataSession = 2 && private

PROCEDURE GetExpression
LPARAMETERS lcDefaultExpr, lcDataType, lcCalledFrom, loEvent

LOCAL lCurSel, lcNewExpr, liPrivateSession
LOCAL liLines, i, iTableCount, lcAlias, lcSource

*----------------------------------------------
* Save this before it changes:
*----------------------------------------------
liPrivateSession = THIS.DataSessionId

*----------------------------------------------
* Scan the data environment and open tables:
*----------------------------------------------
SET DATASESSION TO (loEvent.FrxSessionId)
lCurSel = SELECT()
iTableCount = 0
SELECT expr FROM frx WHERE objtype = 26 ;
INTO CURSOR environCursors
SELECT environCursors
SCAN
liLines = ALINES(laValuePairs, environCursors.expr )
FOR i = 1 TO liLines
DO CASE
CASE LEFT(UPPER(laValuePairs[i]),5) == "ALIAS"
lcAlias = THIS.GetValue( laValuePairs[i])
CASE LEFT(UPPER(laValuePairs[i]),7) == "CURSORS"
lcSource = THIS.GetValue( laValuePairs[i])
ENDCASE
ENDFOR

lcSource = EVL(lcSource,"")

DO CASE
CASE FILE(lcSource)
CASE FILE(FORCEEXT(lcSource,"DBF"))
lcSource = FORCEEXT(lcSource,"DBF")
CASE FILE(JUSTFNAME(lcSource))
lcSource = JUSTFNAME(lcSource)
CASE FILE(FORCEEXT(JUSTFNAME(lcSource),"DBF"))
lcSource = FORCEEXT(JUSTFNAME(lcSource),"DBF")
ENDCASE

IF FILE(lcSource)
lcAlias = EVL( lcAlias, "Cursor"+TRANSFORM(i))
SET DATASESSION TO (liPrivateSession)
IF NOT USED(lcAlias)
TRY
IF EMPTY(ALIAS())
USE (lcSource) ALIAS (lcAlias) ;
NOUPDATE SHARED
ELSE
USE (lcSource) ALIAS (lcAlias) ;
IN 0 NOUPDATE SHARED
ENDIF
iTableCount = iTableCount+1
CATCH WHEN .T.
ENDTRY
ENDIF
SET DATASESSION TO (loEvent.FrxSessionID)
ENDIF
ENDSCAN
USE IN environCursors
SELECT (lCurSel)
IF iTableCount > 0
SET DATASESSION TO (liPrivateSession)
ELSE
SET DATASESSION TO (loEvent.DefaultSessionID)
ENDIF

*-----------------------------------
* Display the GETEXPR dialog:
*-----------------------------------
GETEXPR TO lcNewExpr TYPE lcDataType DEFAULT lcDefaultExpr

*-----------------------------------
* Clean up and exit:
*-----------------------------------
SET DATASESSION TO (liPrivateSession)
CLOSE DATA
SET DATASESSION TO (loEvent.FrxSessionID)
RETURN lcNewExpr
ENDPROC

PROTECTED PROCEDURE GetValue
LPARAMETER lcValuePair
LOCAL liPos, lcReturn
lcReturn = ""
IF NOT EMPTY(lcValuePair)
liPos = AT("=",lcValuePair)
IF EMPTY(liPos)
RETURN ""
ENDIF
lcReturn =CHRTRAN(ALLTRIM(SUBSTR(lcValuePair,liPos+1)),["'],[])
ENDIF
RETURN lcReturn
ENDPROC

ENDDEFINE

См. также