Report

HomeFAQReport
Неустранимая ошибка при выполнении отчета

Проблема

При работе в Visual FoxPro 5.0 или Visual FoxPro 6.0 запуск на выполнение готового отчета приводит к неустранимой ошибке и прерыванию выполнения приложения. Как правило, это происходит в операционных системах Windows 95 или Windows 98. Хотя для версии Visual FoxPro 5.0 это может произойти на любой операционной системе.

Причина

Причина заключается в конфликте использования сопроцессора собственно FoxPro и текущим драйвером принтера.

Решение

Решение заключается либо в отключении сопроцессора (это можно сделать через панель управления), либо в принудительной его очистке при помощи специальной библиотеки

  
  DECLARE _fpreset IN msvcrt20.dll  
  =_fpreset()  
 * Запуск на выполнение отчета  
  REPORT FORM MyReport.frx  
  =_fpreset()

Подробнее об этой ошибке можно прочитать в базе знаний на сайте MicroSoft. Статья Q183522

VFP8 некорректно отображает содержимое отчета

Проблема.

При выполнении отчета в среде Visual FoxPro 8.0 буквы наезжают друг на друга или отображаются непонятные "закорючки"

Причина.

Причина связана с тем, что в Visual FoxPro 8 как-то изменили обработку отчетов, использующих TrueType - шрифты в случае оптимизации печати принтером. Т.е. это ситуации, когда принтер пытается печатать такие шрифты не как графику, а используя некую внутреннюю библиотеку шрифтов.

Решение.

Есть несколько решений

  1. Отказаться от использования TrueType-шрифтов
  2. Изменить настройки драйвера принтера у клиента
  3. Принудительно изменить настройки каждого файла отчета

Отказаться от использования TrueType-шрифтов.

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

В идеале, желательно создать собственные шрифты. Но далеко не каждый программист на это способен.

Изменить настройки драйвера принтера у клиента.

В операционных системах Windows 95 или Windows 98 необходимо установить печать шрифтов в виде графики. Для старших версий операционной системы такого переключателя нет. Там необходимо отключить оптимизацию печати.

Проблема только в том, что это "внешние" по отношению к самой программе настройки. А это значит, что проконтролировать их значение у клиента практически невозможно. Тем более некорректно требовать принудительного задания настроек внешних устройств только для того, чтобы корректно работала одна из многих программ, установленная на компьютере клиента.

Принудительно изменить настройки каждого файла отчета.

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

Физически, файлы отчетов FoxPro - это обычные DBF-таблицы. Просто у них изменено расширение. DBF - FRX, FPT - FRT.

Вам следует открыть файл отчета как таблицу командой

  
  USE MyReport.frx  
  BROWSE

В этой команде следует обязательно указать расширение файла отчета "FRX". В противном случае, FoxPro посчитает, что речь идет о файле с расширением DBF.

Теперь находите в этом файле запись со значениями полей

  
  ObjType = 1  
  ObjCode = 53

Как правило, это физически самая первая запись.

Откройте на редактирование в этой записи Memo-поле с именем Expr. Найдите (или создайте) строку, начинающуюся с ключевого слова TTOPTION и установите значение

TTOPTION=1

Это и означает команду принтеру печатать TrueType-шрифты как графику. Сохраните внесенные изменения и закройте файл отчета.

Недостаток данного решения в том, что после каждой модификации отчета при помощи дизайнера отчетов эта настройка опять примет значение 2 или 3. Т.е. после каждой модификации отчетов надо не забыть еще раз открыть файл отчета как таблицу и внести нужные изменения.

Кстати, значение TTOPTION = 2 - это значение по умолчанию, для принтеров Hewlett-Packard использующих Printer Control Language (PCL). Именно поэтому данная проблема чаще всего встречается при работе с принтерами Hewlett-Packard.

Достаточно подробно данная проблема обсуждалась на этом сайте. Можете почитать дискуссию по приведенной ссылке

forum.foxclub.ru

Как выбрать принтер из окна предварительного просмотра

Вопрос

При открытии отчета на предварительный просмотр и последующего нажатия кнопки с изображением принтера не появляется окно настройки принтера. Печать идет на принтер по умолчанию. Как можно вызвать окно настройки принтера из режима предварительного просмотра?

Ответ

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

REPORT FORM MyReport.frx PREVIEW

Отчет будет выдан на экран вместе с командной кнопкой с изображением принтера, по нажатию на которую будет выполнена печать на бумагу.

Однако в этом случае пользователь не получит приглашение по выбору и настройке принтера. Печать пойдет на принтер по умолчанию, и будут использованы его настройки по умолчанию.

Чтобы пользователь получил возможность выбора принтера и его настроек используйте команду

REPORT FORM MyReport.frx TO PRINTER PROMPT PREVIEW

Обратите внимание на порядок следования опций. "PREVIEW" должна следовать после опций "TO PRINTER PROMPT". В противном случае, вы получите сообщение об ошибке при попытке выполнить команду.

Замечание

Этот совет не применим к версиям FoxPro 2.x, а также в том случае, если в команде REPORT FORM используется опция NOWAIT.

Однако в версии Visual FoxPro 9 даже при использовании опции NOWAIT можно вызвать окно предварительной настройки принтера по приведенной выше схеме если предварительно сделать дополнительную настройку

  
  SET ReportBehavior 90  
  REPORT FORM MyReport.frx TO PRINTER PROMPT PREVIEW NOWAIT
Как отобразить окно предварительного просмотра в As Top-Level форме

Вопрос

Приложение написано на базе As Top-Level форм. При вызове отчета на предварительный просмотр он вообще не появляется. В чем причина? Как можно отобразить окно предварительного просмотра.

Причина

Для версий до Visual FoxPro 6 включительно, по умолчанию, окно предварительного просмотра открывается In-Screen. Т.е. внутри основного окна FoxPro.

Решение

Необходимо перенаправить вывод окна предварительного просмотра в окно, созданное на базе As Top-Level формы. Это стало возможным только с появлением опции IN WINDOW в Visual FoxPro 6.

Пример решения описан в статье Q188887, на сайте Microsoft

How to display the Print Preview window in a top-level form in Visual FoxPro

Суть приведенного там примера заключается в следующем коде

  
  oPForm = CREATEOBJECT('printpreview')  
  oPform.visible = .t.    && Открыть форму в которую пойдет вывод  
 *******  
 * Следующая команда использует опцию IN WINDOW  
 * Заметьте, что использована как опция WINDOW, так и опция IN WINDOW  
 * Опция WINDOW устанавливает для окна предварительного просмотра  
 * те же характеристики, что и у указанного окна, в то время как   
 * опция IN WINDOW говорит о том, внутри какого окна следует открывать  
 * окно предварительного просмотра  
 *******  
  REPORT FORM report_1 PREVIEW WINDOW printpreview IN WINDOW printpreview  
    
 * Класс окна предварительного просмотра  
  DEFINE CLASS printpreview AS form  
    
  ScaleMode = 3  
  Top = 0  
  Left = 0  
  Height = 454  
  Width = 641  
  ShowWindow = 2  
  DoCreate = .T.  
  Caption = "Print Preview Window"  
  Movable = .T.  
  TitleBar = 0  
  WindowState = 0  
  SizeBox = .F.  
  Name = "printpreview"  
    
  ENDDEFINE

Разумеется, Вы можете создать нужный класс в визуальной библиотеке классов. Можете использовать для опции Window одно окно, а для опции IN WINDOW - другое. Это просто пример.

Замечание

Опция IN WINDOW была добавлена только в версии Visual FoxPro 6. Для младших версий FoxPro придется, так или иначе, использовать основное окно FoxPro.

Т.е. перед открытием окна предварительного просмотра отобразить основное окно FoxPro, а после просмотра - закрыть.

  
  _SCREEN.Visible = .T.  
  REPORT FORM MyReport.frx  
  _SCREEN.Visible = .F.
Как запретить печать из окна предварительного просмотра

Вопрос

Как запретить печать из окна предварительного просмотра?

Ответ

Данная проблема имеет несколько решений, но наиболее корректным является удаление кнопки с изображением принтера из окна предварительного просмотра. Это можно сделать при помощи специально созданного файла ресурсов.

Файл ресурсов, по умолчанию, это файл FoxUser.dbf (fpt). Он хранит настройки всех когда-либо открытых окон в среде FoxPro.

Сначала создадим копию ресурсного файла:

  
  SELECT 0  
  USE (SYS(2005)) AGAIN  
  COPY TO NoPrint.dbf  
  USE

В результате получится копия ресурсного файла в текущей директории с именем NoPrint.dbf

Устанавливаем в качестве реусрсного файла этот вновь созданный файл.

  
  gcResource=SYS(2005)   && сохраняю путь к старому ресурсному файлу  
  SET RESOURCE TO NoPrint.dbf

Далее выбираем пункт главного меню View->ToolBars... Убедитесь, что стоит крестик в пункте "Print Preview" и нажмите кнопку "Customize..."

Теперь нажмите левой кнопкой мыши кнопку с изображеним принтера в ToolBar "Print Preview" и не отпуская перетащите ее за пределы этого ToolBar. Все, кнопка удалена из этого ToolBar и такое состояние сохранено в текущем файле ресурсов.

Восстанавливаем исходный файл ресурсов

SET RESOURCE TO (m.gcResource)

Следует заметить, что внутри файла ресурсов много самой разнообразной информации, которая собственно не нужна в данной задаче. Поэтому для экономи места все лишнее можно удалить. Для этого откройте новый файл ресурсов

USE NoPrint.dbf

И найдите в нем не удаленную запись со следующими значениями полей:

  
  TYPE="PREFW"  
  ID="TTOOLBAR"  
  NAME="Print Preview"

Все остальные записи можно смело удалять. Они никак не влияют на данный ToolBar.

В принципе, этот файл ресурсов (вместе с мемо-полем) можно включить внутрь проекта, чтобы не поставлять отдельно кучу ресурсных файлов.

Собственно запуск отчета с использованием только что созданного файла ресурсов примет вид:

  
 * Запоминаю старый файл ресурсов  
  LOCAL lcResource  
  lcResource=SYS(2005)  
 * Подключаю нужный ресурсный файл  
  SET RESOURCE TO NoPrint.dbf  
    
 * Выполняю отчет  
  REPORT FORM MyReport.frx NOCONSOLE PREVIEW  
    
 * Восстанавливаю старый ресурсный файл  
  SET RESOURCE TO (m.lcResource)
При запуске отчета из формы формируются неверные данные

Проблема:

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

Причина:

Отчет это всегда сканирование одной главной таблицы. Для корректной работы отчеты он должен обязательно перейти в рабочую область этой главной таблицы.

Если по каким-либо причинам этого не происходит, то в процессе выполнения отчета он начинает сканировать ту таблицу, которая оказалась в текущей рабочей области. В этом случае результат выполнения отчета становится не предсказуемым.

Решение:

Способ решения зависит от того, по какой причине оказалась потеряна (не выбрана) главная таблица отчета.

Наиболее вероятными являются следующие причины:

  1. В момент вызова отчета фокус находится в объекте Grid
  2. При создании отчета не была явно указана главная таблица отчета
  3. Главная таблица отчета не была открыта или не видна из отчета

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

Авторизация
*
*
Регистрация
*
*
*
Пароль не введен
*
Генерация пароля