FoxPro Club Главная

Конференция Решения Фотоальбом Сайт М.Дроздова Статьи Файловый архив Книга Visual FoxPro 9.0 Русский Help для Visual FoxPro
Пользователей: 9233
Вход
RtfEPORT - генератор отчетов из RTF-шаблона (совместим с GenRep, исключая его расширенные возможност

Генератор отчетов RtfEPORT предназначен для вывода данных из DBF-файлов/алиасов VFP в виде отчета в формате RTF на основании предварительно созданного файла шаблона (.SAB-файл). RtfEPORT разрабатывался как замена генератору отчетов GenRep (автор А. Куденцов), поэтому совместим с ним по формату шаблона (с небольшими отличиями в выражениях и без расширенных возможностей GenRep), а также содержит некоторые расширения и добавления функциональности. Update4: исправлены ошибки при группировке Update3: исправлена ошибка вывода при использовании условных функций IF/IIF, при несовпадении типов внутри выражения Update2: исправлена ошибка при работе с курсорами, полученными в результате выполнения SQL-запросов вида SELECT * FROM table_name INTO CURSOR cursor_name. Как оказалось, с такими курсорами RtfEPORT не работал. Update1: исправлены некоторые ошибки и неточности с группировкой. Добавлен новый формат вывода - dtm (месяц прописью)


 
Прислал: Алексей Кирпичев   Категория: Отчеты


RtfEPORT - генератор отчетов из RTF-шаблона (совместим с GenRep)

Генератор отчетов RtfEPORT предназначен для вывода данных из DBF-файлов/алиасов VFP в виде отчета в формате RTF (отчет открывается в программе, установленной по умолчанию для расширения .rtf – обычно это MS Word) на основании предварительно созданного файла шаблона (.SAB-файл). Работает в VFP 5.0 и выше. RtfEPORT разрабатывался как более функциональная замена генератору отчетов GenRep (автор А. Куденцов), поэтому совместим с ним по формату шаблона (с небольшими отличиями в выражениях и без расширенных возможностей GenRep), а также содержит некоторые расширения и добавления функциональности (выражения VFP; работает с мемо-полями; условное форматирование шрифта). Подробное описание внутри архива.
Отличия RtfEPORT от GenRep
1. Может использоваться только в программах, написанных на Visual FoxPro;
2. Поставляется в виде исходных кодов (prg-файл);
3. Может использовать не только внешние DBF-файлы, но и алиасы FoxPro;
4. Работает с мемо-полями;
5. может использовать любые выражения Visual FoxPro в полях вывода (в т.ч. данные не только из основной для отчета таблицы/алиаса, но и из других открытых в приложении алиасов);
6. Содержит дополнительные возможности условного форматирования: цвет и тип шрифта
7. В выражениях не работают знаки:
# - деление с округлением до большего,
| - деление с округлением до меньшего.
Вместо них нужно использовать функции FoxPro (round).
8. Более низкая скорость формирования отчетов (связанная, по крайней мере, с характером исполняемого кода: интерпретируемый p-код, в случае RtfEPORT, и компилированный – в случае GenRep). Возможно, проблема и в коде :-) - из-за неоднакратных дописываний/переписываний не совсем оптимизирован (есть что сделать в след. версии ;-)).

В настоящий момент RtfEPORT используется в работающем клиент-серверном приложении (RTF-шаблоны проще хранить в BLOB-поле, чем 2 файла отчетов VFP), в котором раньше использовался GenRep. Шаблоны переписывать не пришлось. :-)

Генератор поставляется в виде prg-файла RtfEPORT.prg (VFP 5.0) Подробно об использовании см. в описании (RtfEPORT.rtf) и в демо-проекте dortfrep.
 
Сделайте оценку этого решения Плохо Удовлетворительно Так себе Хорошо Отлично Текущая оценка: (4.958) Вложение [98.71]kb
Дополнения пользователей
RtfEPORT - генератор отчетов из RTF-шаблона (совместим с GenRep, исключая его расширенные возможност
[+][?]
Куденцов Александр
08.01.04 15:51:39

Тормозит скорее всего в связи с использованием encode_symbols()
Можете избавиться от нее :)

replace fcharset0 with fcharset204
Куденцов Александр
08.01.04 16:41:21

Насчет совместимости
http://alkud.boom.ru/zip/extendsab.zip
Алексей Кирпичев
09.01.04 13:17:58

Charset заменен, иначе бы и encode_symbols не помог бы. :о)
А encode_symbols остался атавизмом, я и сам хотел вызов закомментировать, но так и оставил (не
знаю как поведет себя текст при вызове RtfEPORT с charset по умолчанию, отличным от 204  ). :о)
Пожалуй закомментирую таки вызов. :о) Напишу об этом в описании.

И про совместимость добавлю - "без расширенных возможностей" :о) 

Харламенков Алексей
10.01.04 05:23:58

Давно искал такое решение!
Огромное спасибо!
Но у меня при коде charset 204 в отчёте получается полная ахинея - кодировка вставленных полей не
читаемая. Как это побороть?
Алексей Кирпичев
13.01.04 11:42:41

Ответ в почте.

Если ничего не поможет, то пришлите мне шаблон с данными и версию Word'а.
Харламенков Алексей
14.01.04 19:18:07

Для посетителей - просматривающих и интересующихся.
При работе с другими файлами-шаблонами данная ситуация не повторилась. Т.е. всё выводится по-русски.
Андрей
16.01.04 12:14:30

Могу для повышения скорости предоставить DLL для вписывания через нее данных в RTF. А то она все
равно просто так лежит... DLL сделана на Delphi и у нее много всего хорошего... Я собственно для
такого случая ее и делал.
Харламенков Алексей
17.01.04 21:02:23

Так за чем же дело стало? такие вещи всегда нужны!
Алексей Кирпичев
19.01.04 16:09:52

Можно попробовать и DLL. 
Только главный затык происходит, по-моему, в основном на этапе формирования структуры отчета, а не
вывода в RTF.
Андрей
26.01.04 17:06:50

А куда слать то ???
Алексей Кирпичев
27.01.04 17:48:39

kanank@mail.ru
Андрей
01.02.04 13:33:16

Пожелания:
А нелязя ли в этом генераторе прицепит свой progressBar так как это сделано в XFRX? Там
добавляется объект к уже существующим и у этого объекта есть обязательный метод -
setpercent(percent_done) а как там чего отрисовывается никого не волнует. Очень удобно.
Алексей Кирпичев
02.02.04 20:50:14

Для начала его надо в класс оформить. :о)
А до этого он еще не дорос. После расширения функциональности подумаю над этим. 
В принципе, при желании, можно и самому прикрутить все что захочется. :о)
Андрей
04.02.04 14:12:09

А кстати есть возможность работы с переменными, функциями VFP в отчете? Извиняюсь что сам не
попробовал... А вообще так держать - больше безплатных компонентов :-)
Алексей Кирпичев
05.02.04 21:14:27

см. п.5 наверху :о)
5. может использовать любые выражения Visual FoxPro в полях вывода (в т.ч. данные не только из
основной для отчета таблицы/алиаса, но и из других открытых в приложении алиасов);

стандартные функции - любые, пользовательские функции и переменные - в пределах видимости. В
общем, любое корректное выражение для функции eval() в месте вызова.
Например, поставляемый шаблон SAB\formats.sab содержит в себе вызовы функции sysmetric(). 
Шургин Ю.П.
03.03.04 16:44:12

Мне кажется, что детализация Detal для алиасов не работает. Во всяком случае, отчет создается, но
не открывается в Word.
Алексей Кирпичев
04.03.04 18:46:48

У меня в реальном приложении все работает. 
Пришлите мне на мыло шаблон и данные из алиаса. Проверю в чем дело.
Александр Боксгорн
27.07.04 08:07:11

Андрей. У меня с алиасами тоже геморой.. Файл RTF не открывается. Хорошо я RTF знаю мало-мальски в
выходном файле (в конце) пары скобок фигурных закрывающих нехватает. Да и в проге есть  ошибки.
Прога сама не досконально RTF обрабатывает. Пример: при поиске \par пропускаются имеющиеся вставки
"...........[rrrrrr].....\par }"
А так прога хорошая - только чуть сыровата.
Удачи!!
Алексей
27.08.04 18:34:45

Хоть бы один прислал примеры проблемных для алиасов файлов... Вот с чем-чем, а с алиасами у себя
проблем не было. Использую RTFeport в работающем приложении.
Хоть он и действительно сыроват, на доводку сейчас времени нет, пока все что надо мне работает, а
примеров ошибок никто и не присылает.
Шургин Ю.П.
17.09.04 16:08:12

Спасибо за доработку. Теперь все работает с алиасами. Суть такова была, что с простым контрольным
примером все работало, а в большой программе нет. Сейчас все нормально.
Шургин Ю.П.
21.09.04 10:38:23

Игнорируется фильтр, установленный для алиаса (курсора). В отчет попадают все записи курсора.
Алексей Кирпичев
22.10.04 19:05:54

Век живи, век учись.
Оказалось, что к курсору, созданному командой SELECT * FROM alias_name INTO CURSOR cursor_name,
нельзя применять такую же команду для создания другого курсора... А именно это и происходило в
RtfEPORT'e, что делало невозможным работу с такими курсорами...
Сам обнаружил это случайно, до сегодняшнего дня все чудно работало с курсорами, полученными из
SQL-баз с помощью SQLEXEC().
Пришлось исправить. :о) Исправления уже в архиве.
Рашид
04.11.04 04:47:31

Все замечательно, мне очень пригодилось.Но есть одна добавка, которую я хотел-бы добавить.Это
заменить строку
 m.out = rebld_form(pname,m.ptype,m.psize,m.psize1, m.form_pole)  на 
if alltrim(pname)="_rtfdata.pschet" && спецвставка от сих
  do case                            
    case _rtfdata.pschet=.t. and empty(_rtfdata.datposv)=.t.
 m.out ="Нет даты показа"
    case _rtfdata.pschet=.t. and empty(_rtfdata.datposv)=.f.  
 m.out =(ltrim(str(int((_rtfdata.datprov-_rtfdata.datposv )/30)))+" мес. прошло")    
   otherwise
 m.out = "По тарифу" 
  endcase    
 m.type="C"             && если нужен другой тип см. выше
 m.psize=18             && Длина поля равна 18  
 m.psize1=0   
 m.form_pole="%S"       && если нужен другой тип см. выше
else                                && до сих можно убрать или  вставить свое условие
 m.out = rebld_form(pname,m.ptype,m.psize,m.psize1, m.form_pole) 
endif
где
***  Пример спецвставки для вывода на печать           ***
***  сложного условия. Здесь pschet поле типа L        ***
***  datprov и datposv поля типа D                     ***
***  Вывод на печать в символьном виде                 ***
***  m.psize=??   Длину поля установить самому         *** 
и изменить func open_data
на 
lpara fn
ret = 0
= usedd('_rtfdata')
sele (name_table)
use
if file(fn)
  use (fn) in 0 alias _rtfdata
  if used('_rtfdata')
    ret = 1
  endif
endif
return ret

Дмитрий Петров
19.11.04 09:34:20

Очень хорошее решение, нам очень пригодится.

Хотелось бы только внести некоторые доработки:
- возможность явно указать имя файла в который формируется отчет
- возможность вставки рисунков в документ

И вопрос, можно ли использовать функции foxpro или свои в имени поля или выражения. Попробовал
использовать lookup в имени поля, результат нулевой.

Если не против могу принять посильное участие в развитии решения
Сергей
13.01.05 07:22:17

Ещё глюк. Если поля группы и подгруппы имеют похожие названия (например no, no2) вывод
зацикливается. Тоже названия переменных. Если переменная включает в себя название поля (например
как выше m.lenno) она не выводится!
Сергей
11.01.05 07:29:48

Обнаружил такой глюк. Если в конце группы написать к примеру  "Всего по [group]" рисуется название
следующей группы, а не текущей.
Алексей Кирпичев
24.01.05 10:20:04

Опять небольшое исправление. От 24.01.2005

Исправлены неточности отображения значений из поля, по которому производиться группировка после
окончания блока [Detal] (выводилось значение из след. группы) и возможная проблема при группировке
полей, имеющих начальные пробелы.
Алексей Кирпичев
26.01.05 13:47:50

Опять обновление. И опять исправление по группировке, точнее по вложенной группировке, исправление
от 24.01 оказалось действующим только на первый уровень группировки.
Алексей Кирпичев
20.01.05 15:57:40

Так как иногда здесь бываю достаточно редко, по всем срочным вопросам лучше писать на мой e-mail.
Для проблемных шаблонов лучше сразу прислать шаблон и кусок данных для его работы. Тогда я быстрее
и точнее смогу ответить по существу.

Дмитрию Петрову
- возможность явно указать имя файла в который формируется отчет - сделать легко, в следующее
обновление включу (не сегодняшнее);
- возможность вставки рисунков в документ - с этим пока сложнее, надо разбираться со структурой
хранения рисунков в RTF. К сожалению, пока не могу заниматься этим. Если хотите принять участие,
то можете копать в этом направлении. E-mail я оставил.

Функции использовать можно. Любое выражение корректное для функции EVALUATE(). Но от использования
функций, меняющих указатель записи, я бы предостерег.


Сергею
Шаблон с примером данными пришлите мне. Будем разбираться.
Алексей Кирпичев
20.01.05 16:17:59

Небольшое исправление от  20.01.2005
Исправлена работа с функцией IIF(IF) - при несовпадении типов выражений внутри функции и типа
поля, блок с такой функцией мог выдавать пустое значение, например для непустого числового поля
pole не работал блок
[IIF(!empty(pole),'поле не пустое',pole)]

для таких случаев теперь для получения результата желательно привести все составляющие блока к
единому типу (строковому)
[%S:IIF(!empty(pole),'поле не пустое',str(pole))] или как минимум:
[%S:IIF(!empty(pole),'поле не пустое', pole)]
Алексей Кирпичев
20.01.05 15:56:49

Так как иногда здесь бываю достаточно редко, по всем срочным вопросам лучше писать на мой e-mail.
Для проблемных шаблонов лучше сразу прислать шаблон и кусок данных для его работы. Тогда я быстрее
и точнее смогу ответить по существу.

Дмитрию Петрову
- возможность явно указать имя файла в который формируется отчет - сделать легко, в следующее
обновление включу (не сегодняшнее);
- возможность вставки рисунков в документ - с этим пока сложнее, надо разбираться со структурой
хранения рисунков в RTF. К сожалению, пока не могу заниматься этим. Если хотите принять участие,
то можете копать в этом направлении. E-mail я оставил.

Функции использовать можно. Любое выражение корректное для функции EVALUATE(). Но от использования
функций, меняющих указатель записи, я бы предостерег.


Сергею
Шаблон с примером данными пришлите мне. Будем разбираться.
[Дополнить]



© 2000-2017 Fox Club 
При размещении любых материалов с сайта на других ресурсах- прямая ссылка на www.foxclub.ru обязательна
Яндекс.Метрика