Проблема:
На этапе подготовки и отладки отчета - все нормально, но когда готовый отчет запускается из формы приложения отчет либо выдает сообщения об ошибках, либо формирует некорректные данные.
Причина:
Отчет это всегда сканирование одной главной таблицы. Для корректной работы отчеты он должен обязательно перейти в рабочую область этой главной таблицы.
Если по каким-либо причинам этого не происходит, то в процессе выполнения отчета он начинает сканировать ту таблицу, которая оказалась в текущей рабочей области. В этом случае результат выполнения отчета становится не предсказуемым.
Решение:
Способ решения зависит от того, по какой причине оказалась потеряна (не выбрана) главная таблица отчета.
Наиболее вероятными являются следующие причины:
- В момент вызова отчета фокус находится в объекте Grid
- При создании отчета не была явно указана главная таблица отчета
- Главная таблица отчета не была открыта или не видна из отчета
1. В момент вызова отчета фокус находится в объекте Grid.
Это BUG (глюк) FoxPro. Причина такого поведения не вполне понятна, но если в момент вызова отчета фокус находится в объекте Grid, то объект Grid "не отпускает" текущую рабочую область.
Решение сводится к тому, чтобы перед выполнением отчета увести фокус с объекта Grid на любой другой объект формы. Если кроме собственно объекта Grid на форме ничего нет, то создайте специальный объект TextBox или CommandButton за границами видимой части окна (Top = -100, Left = -100) и передавайте фокус на этот "невидимый" объект непосредственно перед вызовом отчета:
ThisForm.Command1.SetFocus()
REPORT FORM MyReport.frx
ThisForm.Grid1.SetFocus()
2. При создании отчета не была явно указана главная таблица отчета.
Как правило, если Вы используете DataEnvironment отчета, то по-умолчанию главной таблицей отчета становится первая таблица, физически добавленная в DataEnvironment. Однако если по какой-либо причине это не устраивает, то главную таблицу можно указать явно в свойствах собственно DataEnvironment отчета. За это отвечает свойство:
Report.DataEnvironment.InitialSelectedAlias
Это свойство принимает значение алиаса одной из таблиц, добавленных в DataEnvironment собственно отчета. Выбранный алиас и назначается "главной" таблицей отчета.
Если же Вы не используете DataEnvironment отчета, то следует принудительно перейти в рабочую область главной таблицы непосредственно перед вызовом отчета
Select MainTab
REPORT FORM MyReport.frx
3. Главная таблица отчета не была открыта или не видна из отчета.
Подобная ситуация возможна, если Вы не используете DataEnvironment отчета или же установили его свойство
Report.DataEnvironment.AutoOpenTables = .F.
Это означает, что Вы полностью берете на себя ответственность за установку среды окружения отчета на себя. Другими словами, Вам необходимо самостоятельно проверить факт наличия нужных таблиц и открыть их, если это необходимо до того, как отчет начнет выполняться.
Как правило, подобная ситуация возникает, если в качестве источника данных для отчета используется курсор, которого просто не существует как объект, который можно было бы добавить в DataEnvironment отчета.
Но не просто факт использования курсора (это довольно легко определяется), а запуск отчета в Private DataSession. Это настраивается в режиме модификации отчета: пункт меню Report - Private DataSession.
Вообще-то, сама по себе идея запуска отчета в Private DataSession очень хорошая. Работа отчета происходит независимо от работы форм. Но применительно к курсорам следует помнить, что курсор созданный в одной DataSession "не виден" в другой DataSession. А установка свойства Private DataSession, как раз и означает, что отчет будет запущен в "другой" DataSession.
В этом случае формирование курсоров надо перенести извне отчета в методы самого отчета. Как правило, это делается в методах DataEnvironment отчета. Например, в методе
Report.DataEnvironment.BeforeOpenTables