powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Отчет в VFP9
21 сообщений из 21, страница 1 из 1
Отчет в VFP9
    #36065793
Hikolay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно ли определить положение от начала страницы текущего элемента? И при определенных условиях сделать перевод на новую страницу?
...
Рейтинг: 0 / 0
Отчет в VFP9
    #36066063
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HikolayМожно ли определить положение от начала страницы текущего элемента?
Для VFP9 - можно.

HikolayИ при определенных условиях сделать перевод на новую страницу?
Если вы подразумеваете фразу "в зависимости от ранее вычисленного положения", то - нельзя.

Если же вы опишите собственно постановку задачи, а не выбранный способ решения, то возможно, найдутся другие способы решения. Например, задача "приклеивания" последней полосы деталировки к общему итогу (чтобы на последнем листе не оставались одни подписи без данных) вполне решаемая в любой версии FoxPro
...
Рейтинг: 0 / 0
Отчет в VFP9
    #36066092
Hikolay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ
Для VFP9 - можно.


А каким образом?

А задача такая:

При печати отчета выводится заключение, формирующееся из имеющихся данных, и после заключения печаются должность и фамилия людей принявших в этом участие. Так вот необходимо, чтобы хоть один абзац был с фамилиями. И все фамилии были на одной странице.
...
Рейтинг: 0 / 0
Отчет в VFP9
    #36066116
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HikolayПри печати отчета выводится заключение, формирующееся из имеющихся данных, и после заключения печаются должность и фамилия людей принявших в этом участие. Так вот необходимо, чтобы хоть один абзац был с фамилиями. И все фамилии были на одной странице.
Вы сами себе противоречите.

Либо "хоть один абзац с фамилиями", либо "все фамилии на одной странице". Какой именно вариант нужен?

Что из себя представляет сам отчет? Это некие строки деталировки после которых идет "итог" в виде подписей? И необходимо, чтобы:

1. Весь итог целиком (все подписи) печатался на одной странице
2. Вместе с итогом (с подписями) должна быть отображена хотя бы одна строка деталировки

Как формируется итог? Это переменное число строк или всегда фиксированное? Если переменное, то есть ли максимально возможное количество строк в итоге? Если предельного ограничения нет, то откуда уверенность, что все подписи поместятся на одном листе? Да еще со строкой деталировки?
...
Рейтинг: 0 / 0
Отчет в VFP9
    #36066212
Hikolay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извиняюсь неправильно выразился.
Там небольшое количество людей(max 10). И фиксированного большего ничего нет.
Там получается идет деталировка по проверенным показателям в продукте. Где указывается необходимое количество и найденное. Затем формируется вывод, мол такой продукт правильный или не правильный. И потом фамилии и подписи.
И чтобы подписи были все на одном листе, но хотя-бы абзац с вывода тоже был с ними. Или весь вывод, если все влезет на страницу
...
Рейтинг: 0 / 0
Отчет в VFP9
    #36066727
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что такое "вывод"? Как он формируется? Это одна строчка? Откуда там "абзацы"? Почему "вывод" должен располагаться как-то отдельно от "подписей"? Почему их нельзя расположить в одной полосе отчета?
...
Рейтинг: 0 / 0
Отчет в VFP9
    #36067169
Hikolay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Они и находятся в одной полосе отчета.
Вывод - это заключение, в котором написано, что продукт такой-то проверен и он нормальный или нет. Количество абзацев в выводе зависит от количества продуктов в отчете.

Пример:

Вывод
-Колбаса соответствует нормам и стандартам
-Мясо не соответсвует этому стандарту

Проверили

Ведущий инженер Васечкин В.В.

Инженер Пупкин П.П.

Так вот, что-бы пункт проверили и все фамилии был на одном листе без переносов. И если все это не влазит на один лист, то перенеслось на новый лист хотя-бы:

-Мясо не соответсвует этому стандарту

Проверили

Ведущий инженер Васечкин В.В.

Инженер Пупкин П.П.
...
Рейтинг: 0 / 0
Отчет в VFP9
    #36067179
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Hikolay

не рассматриваете идею генерации отчета в приложение МС офиса
(Ворд, ёксель...)?
...
Рейтинг: 0 / 0
Отчет в VFP9
    #36067186
Hikolay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
прошелмимо,
Это я тоже хочу сделать. Но только начал с этим разбираться. Инфы пока нормальной не могу найти
...
Рейтинг: 0 / 0
Отчет в VFP9
    #36067250
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Инфы пока нормальной не могу найти
один из простых вариантов
http://alkud.by.ru/

после генерации в ворд, оператор может руками подвигать строки в соответствии
со своими желаниями
...
Рейтинг: 0 / 0
Отчет в VFP9
    #36068480
Hikolay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
прошелмимо,

Спасибо почти со всем разобрался.

Но хочется еще сделать это и в отчете VFP9.
...
Рейтинг: 0 / 0
Отчет в VFP9
    #36068805
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все-так я не понял технологию формирования "вывода" и "подписей". По какой причине они могут оказаться на разных листах? Это просто гладкий текст, который загнали в один объект со свойством "Stretch with overflow"?

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

Насколько я понимаю, сейчас отчет имеет вид

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Колбаса
Показатель  1 
Показатель  2 

Мясо
Показатель  1 
Показатель  2 

Вывод 
-Колбаса соответствует нормам и стандартам
-Мясо не соответсвует этому стандарту

Проверили
Ведущий инженер Васечкин В.В.
Инженер Пупкин П.П.

Почему не сделать так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Колбаса
Показатель  1 
Показатель  2 

Вывод 
-Колбаса соответствует нормам и стандартам

Мясо
Показатель  1 
Показатель  2 

Вывод 
-Мясо не соответсвует этому стандарту

Проверили
Ведущий инженер Васечкин В.В.
Инженер Пупкин П.П.
...
Рейтинг: 0 / 0
Отчет в VFP9
    #36069549
Hikolay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМЭто просто гладкий текст, который загнали в один объект со свойством "Stretch with overflow"?


Да вывод лежит в одном объекте, а подписи в другом

ВладимирМПо какой причине они могут оказаться на разных листах?

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

ВладимирМПочему не сделать так

Сделать можно. Так даже проще отчет формировать. Но проблемы это не решит. Если опять все окажется в конце листа и начнет скакать.
...
Рейтинг: 0 / 0
Отчет в VFP9
    #36071628
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сам я не пробовал, так что придется экспериментировать самостоятельно.

Идея заключается в том, что до момента исполнения отчета невозможно сказать, как и где будут распологаться объекты. Значит, необходимо прогнать отчет "в никуда", сделать необходимые замеры и по результатам замеров изменить данные. Например, добавить Chr(13) в начало строки формирования "вывода". Потом уже выполнять отчет "как положено"

Как это сделать? Ну, в версиях младше VFP9 довольно сложно. А вот в версии VFP9 можно сделать нужные замеры при помощи нового класса ReportListener (слушатель отчета).

Концепция формирования отчетов при помощи объектов (Object-Assisted Reporting) заключается в том, что отчет по прежнему все формирует сам, но есть определенные места, где отчет дает возможность просмотреть сформированный объект и, если необходимо, изменить некоторые его параметры.

Класс ReportListener - это новый базовый класс версии VFP9. Соответственно, можно создать класс-наследник от этого базового класса и выполнить в нем необходимую обработку. В этом случае, запуск отчета примет вид

Код: plaintext
1.
2.
loListener = CreateObject("MyReportListener")
REPORT FORM MyReport.frx OBJECT loListener

Здесь MyReportListener - это как раз твой собственный класс на базе класса ReportListener

Первая задача прогона "в никуда" решается изменением свойства

ReportListener.ListenerType = 3 (или 2, если необходимо)

Еще одно полезное свойство

ReportListener.GetPageHeight() - оно показывает размер листа. Сопоставив его с текушей координатой объекта можно сделать вывод о том, сколько места осталось на листе

Для анализа содержимого и положения объектов может быть полезно перекрытие двух методов

ReportListener.EvaluateContents() - Событие, выполняющееся при формировании объекта Field-отчета

ReportListener.Render() - метод, выполняющийся непосредственно перед отрисовкой любого объекта отчета


Событие ReportListener.EvaluateContents() получает 2 параметра. Первый - номер записи в файле отчета FRX, который в данный момент обрабатывается. А второй - это объект, в свойствах которого записаны некоторые реквизиты сформированного текста.

Вот из свойств второго параметра можно вытащить сформированный текст.

Не думаю, что имеет смысл именно в этом событии менять текст поля, поскольку не вполне понятно, повлияет ли это на расположение других объектов. Впрочем, можно попробовать...

Метод ReportListener.Render() имеет несколько параметров определяющих координаты объектов. Особое внимание здесь следует обратить на параметр

nObjectContinuationType

Этот параметр содержит признак того, печатается ли текущий объект целиком на листе, является ли объект продолжением с предыдущего листа или он будет продолжен на следующем.

Проблема только в том, что в методе Render() ничего не известно о содержимом объекта. Поэтому придется синхронизировать его работу с событием EvaluateContents()

=======

В общем, по результату анализа можно, например, увеличить значение некоего счетчика (глобальной переменной), а строку "вывода" формировать примерно так

Код: plaintext
Replicate(chr( 13 ),gnAddLine) + "Собственно вывод"

Вот это самое значение gnAddLine и будет наращиваться в классе ReportListener, пока расположение объектов не удовлетворит нужным требованиям. После этого можно уже будет запустить отчет как обычно.

=======

Но, повторюсь, сам я подобного разбора не делал. Поэтому экспериментировать придется самостоятельно...
...
Рейтинг: 0 / 0
Отчет в VFP9
    #36074359
Hikolay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ,

Спасибо, буду пробовать.

О результатах потом напишу
...
Рейтинг: 0 / 0
Отчет в VFP9
    #36076918
Hikolay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А такой вопрос еще:

Как можно добавить свой код в метод EvaluateContents?

В дизайнере оно понятно. А программно как это сделать?
...
Рейтинг: 0 / 0
Отчет в VFP9
    #36076949
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
loListener = CreateObject("MyReportListener")
REPORT FORM MyReport.frx OBJECT loListener

DEFINE CLASS MyReportListener as ReportListener

PROCEDURE EvaluateContent
LPARAMETERS nFRXRecno, oObjProperties

* Мой код

ENDPROC

ENDDEFINE
...
Рейтинг: 0 / 0
Отчет в VFP9
    #36076973
Hikolay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А где его писать надо? А то на Click() кнопки он говорит, что не должен этого содержать
...
Рейтинг: 0 / 0
Отчет в VFP9
    #36077068
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Определение класса должно быть создано ДО его использования. Т.е. все команды DEFINE CLASS пишутся в отдельных файлах PRG. Собственно, создаются те же библиотеки классов, только другим способом. Поэтому нет никакой разницы, создадите вы класс в дизайнере классов или же в программном коде.

Далее надо указать FoxPro откуда брать определение класса. Для файлов PRG это просто ссылка на процедурный файл

SET PROCEDURE TO MyProg.prg

Для визуальных библиотек классов (файлов VCX) это команда

SET CLASSLIB TO MyClass.vcx

Далее команда

loListener = CreateObject("MyReportListener")

выполнит поиск нужного класса по указанным библиотекам.

Однако можно использовать функцию NewObject() отличие которой от CreateObject() в том, что нужную библиотеку классов можно указать напрямую в этой функции, без предварительнх настроек

loListener = CreateObject("MyReportListener", "MyClass.vcx")
...
Рейтинг: 0 / 0
Отчет в VFP9
    #36082891
Hikolay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Теперь можно подвести итог.
В foxpro 9 есть 2 варианта формирования отчета:

1. При помощи REPORT FORM. (старая форма)
2. При помощи GDI+ библиотеки

Класс ReportLister использует по умолчанию второй способ.

Т.е. если отчет прогонять в пусутю в ReportLister, то надо сделать одинаковый вариант формирования отчета.

1. ReportListener.DynamicLineHeight = .F.

т.е. указываем, что ReportListener будет формировать отчет по старой форме. Но в мануале написано, что этого делать не рекомендуют. У меня так и получилось. Он неправильно посчитал строки и отчет сделанный REPORT FORM отличался от того, что сделал ReportLister

2. SET REPORTBEHAVIOR 90
глобальная настройка указывающая, что все отчеты REPORT FORM выполняются при помощи новой библиотеки.


ReportListener.EvaluateContents() - служит для изменения объекта(его содержания, цвета и т.д.)

все сдела при помощи одной функции:

oReportListener.Render(nFRXRecNo,;
nLeft,nTop,nWidth,nHeight,;
nObjectContinuationType, ;
cContentsToBeRendered, GDIPlusImage)
полезными параметрами оказались:
1. nTop - начала объекта на странице в dpi. Чтобы получить сантиметры: (nTop/960)*2.54
2. nObjectContinuationType - показывает разорван-ли элемент на несколько страниц или нет
3. cContentsToBeRendered - содержит значение выводимое объектом. Но в UNICOD-е. Чтобы получить читаемое выражение - STRCONV(cContentsToBeRendered,6,1049)
4. nFRXRecNo - номер объекта в отчете, но он хранится в фале frx или lbx.
...
Рейтинг: 0 / 0
Отчет в VFP9
    #36083584
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HikolayТеперь можно подвести итог.
...
ReportListener.EvaluateContents() - служит для изменения объекта(его содержания, цвета и т.д.)
...

Только у тех объектов, у которых есть свойство Expression. Например, у Lable это событие не возникает.
С уважением, Алексей.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Отчет в VFP9
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]