Отчеты в Word из Clipper или FoxPro с помощью RepoRTF
RepoRTF - замечательная утилита, генератор отчетов в формате Word - RTF. С помощью RepoRTF можно легко создавать различные отчеты из dos-программ в виде Word- файла, используя весь функционал редактора Word любой версии. Все просто, открываете Word и готовите в нём шаблон будущего отчета любой сложности, используя таблицы, картинки, различные шрифты, колонтитулы и т.д. Генератор поддерживает до 9 уровней детализации. В программе добавляете пару типовых функций (есть в архиве с RepoRTF, пример так же приведен ниже) и процедуру вывода динамических данных в обычный текстовый файл. Далее на основании данных из текстового файла и шаблона RTF формируется готовый современный отчет. Довольно просто как создавать новые отчеты, так и переделать старые, текстовые в новый красивый вид, что бывает очень необходимо, используя при этом хорошо зарекомендовавший и отлаженный старый досовский софт, например на Clipper-е или FoxPro.
Этот генератор можно применять с различными программами. В составе есть исходники для C++Builder, Delphi, FoxPro, документация, 13 контрольных примеров. Возможен запуск с параметрами или без - для создания и отладки.
Пример файла шаблона rtf-файла, создаем в Word.
Пример функции формирования отчета по шаблону Wodr (RTF) в clipper программе (утилита RepoRTF.EXE переименована в rep.exe). Приводится "как есть" для общего понятия использования RepoRTF, поэтому без комментариев.
FUNCTION form_men(nfile, nformat, ffile, no_form, graf)
acp = .F.
oldsc2pp = SaveScreen()
wpmen = wopen(8, 14 , 14, 64)
WBOX(0)
IF !Empty(graf)
@ 0, 2 SAY" Фоpмат Word " color "w/b"
vgraf = .T.
ENDIF
IF Empty(ffile)
ffile = wdir +"\"+ nfile
ELSE
ffile = wdir +"\"+ ffile
ENDIF
_nfile = ffile + ".prn"
IF vgraf
_nfile = ffile + ".txt"
_nfile2 = tekdir + "rep\" + nfile + ".rtf"
_nfile3 = ffile + ".rtf"
ENDIF
IF !Empty(no_form)
IF acp
nkol = co->acpu
ELSEIF shrift
nkol = co->acpu+20
ELSEIF Empty(nformat) .OR. nformat == "A3".OR.nformat == "A4"
nkol = co->stv
ELSE
nkol = co->stg
ENDIF
stra := i := 1
mvyv := {}
IF vgraf
DO &nfile
_par = tekdir + "EXE\REP.EXE " + _nfile + " " + _nfile2 + " " + _nfile3 + " - /p"
s_run (_par)
wclose(wpmen)
RestScreen(0, 0, 24, 79, oldsc2pp)
RETURN
ENDIF
DO &nfile
ENDIF
DO WHILE .T.
IF !Empty(no_form)
@ 2, 15 PROMPT " Просмотр "
@ 2, 28 PROMPT " Печать "
ELSEIF !Empty(graf)
@ 2, 15 PROMPT " Просмотр "
@ 2, 28 PROMPT " Печать "
ELSE
@ 2, 6 PROMPT " Формирование "
@ 2, 23 PROMPT " Просмотр "
@ 2, 37 PROMPT " Печать "
ENDIF
MENU TO wmen
IF ( !Empty(no_form).OR. !Empty(graf)).AND.wmen # 0
wmen++
ENDIF
oldsc1pp = SaveScreen()
DO CASE
CASE wmen = 0
EXIT
CASE wmen = 1
IF acp
nkol = co->acpu
ELSEIF shrift
nkol = co->acpu + 20
ELSEIF Empty(nformat) .OR. nformat == "A3".OR.nformat == "A4"
nkol = co->stv
ELSE
nkol = co->stg
ENDIF
stra := i := 1
mvyv := {}
DO &nfile
IF vgraf
_par = tekdir + "EXE\REP.EXE " + _nfile + " " + _nfile2 + " " + _nfile3 + " - /m"
s_run (_par)
ENDIF
CASE wmen = 2
IF !vgraf .AND. !File(_nfile)
Alert("Нет данных для просмотра. Произведите формирование.")
ELSE
IF vgraf
DO &nfile
IF LastKey() # 27
* _par = allTrim(co->pview) + " " + _nfile3
*_par = tekdir + "EXE\REP.EXE " + _nfile + " " + _nfile2 + " " + _nfile3 + " "
_par = tekdir + "EXE\REP.EXE " + _nfile + " " + _nfile2 + " " + _nfile3 + " " + AllTrim(co->pview)
s_run (_par)
ENDIF
ELSE
_par = tekdir + "LIST" + " " + _nfile
wppro = wopen(0, 0 , 24, 79)
CLEAR
s_RUN (_par)
wclose(wppro)
ENDIF
ENDIF
CASE wmen = 3
IF vgraf
DO &nfile
IF LastKey() # 27
_par = tekdir + "EXE\REP.EXE " + _nfile + " " + _nfile2 + " " + _nfile3 + " - /p"
* _par = tekdir + "EXE\REP.EXE " + _nfile + " " + _nfile2 + " " + _nfile3 + " "+ AllTrim(co->pview)+ " /p"
s_run (_par)
ENDIF
ELSE
flist(_nfile, nformat)
ENDIF
ENDCASE
RestScreen(0, 0, 24, 79, oldsc1pp)
IF ( !Empty(no_form).OR. !Empty(graf)).AND.wmen # 0
wmen--
ENDIF
ENDDO
wclose(wpmen)
RestScreen(0, 0, 24, 79, oldsc2pp)
RETURN
Эта функция переводит различные форматы данных в строковый, для формирования текстового файла под Word - rtf шаблон отчета
FUNCTION vstr(rf_fldname,rf_fldval, rf_zn1, rf_zn2,rf_emp, rf_lev)
rf_fldtype = ValType(rf_fldval)
DO CASE
CASE rf_fldtype == "C"
rf_vtmp = rf_fldval
CASE rf_fldtype == "D"
rf_vtmp = DtoC(rf_fldval)
CASE rf_fldtype == "N"
rf_vtmp = LTrim(Iif((rf_fldval == 0 .AND. !Empty(rf_emp)), '', ;
Str(rf_fldval, Iif(Empty(rf_zn1), 20, rf_zn1), ;
Iif(Empty(rf_zn2), 0, rf_zn2))))
CASE rf_fldtype == "L"
rf_vtmp = Iif(rf_fldval, 'Д', 'Н')
OTHERWISE
rf_vtmp = "unknown field type " + rf_fldtype
ENDCASE
rf_ltmp = Str(Iif(Empty(rf_lev), 0, rf_lev), 1)
rf_rtmp = '|' + rf_ltmp + ':' + rf_fldname + ':' + AllTrim(rf_vtmp)
RETURN rf_rtmp
Процедура формирования текстового файла шаблона для вывода через RepoRTF простого отчета в Word формате
PROCEDURE p_invz1
form_men("inventz1", "A4", , , "Word")
RETURN
PROCEDURE inventz1
jdat_n = Date()
wwre3 = wopen(14, 19 , 19, 60)
SetColor(color4)
WBOX(0)
SET CURSOR ON
@ 2, 5 SAY "Дата " GET jdat_n
READ
wclose(wwre3)
SET CURSOR OFF
IF LastKey() = 27
RETURN
ENDIF
***************************
USE sklad NEW INDEX sklad
USE kart NEW INDEX kart
SET FILTER TO nom = jnfil .AND. tip # "1"
GO top
w_ind(0, -2, _nfile, , "Вывод в файл")
jveso := jves := jkol := 0
? "|DOS:"
? vstr("JNFIL", jnfil, , , "N" , 0)
? vstr("JDAT_N", jdat_n, , , , 0)
DO WHILE !Eof()
w_ind(3,1)
IF Val(sost) < 20
SELECT sklad
SEEK kart->nom
DO WHILE kart->nom = nom .AND. !Eof()
? vstr("NOM", nom, , , , 1)
? ? vstr("NAME", name, , , , 1)
? ? vstr("KOL", 1, 7,0, , 1)
jkol++
SKIP
ENDDO
SELECT kart
ENDIF
SKIP
ENDDO
? vstr("JKOL", jkol, 9, 2, , 0)
CLOSE kart
CLOSE sklad
w_ind(2)
RETURN
Получаем текстовый файл INVENTZ.TXT подобного содержания
|DOS:
|0:JNFIL:2
|0:JDAT_N:07/11/14
|1:NOM:2130100|1:NAME:Серьги|1:PROBA:Золото 583|1:VESO:2.56|1:VES:2.56
|1:NOM:2130213|1:NAME:Обр. кольцо|1:PROBA:Золото 583|1:VESO:2.99|1:VES:2.99
|1:NOM:2130517|1:NAME:Цепочка с крестиком|1:PROBA:Золото 585|1:VESO:5.87|1:VES:5.82
|1:NOM:2130603|1:NAME:Кольцо|1:PROBA:Золото 585|1:VESO:4.09|1:VES:4.09
|1:NOM:2130603|1:NAME:Крестик|1:PROBA:Золото 583|1:VESO:1.73|1:VES:1.73
|1:NOM:2130603|1:NAME:Серьги|1:PROBA:Золото 583|1:VESO:6.02|1:VES:6.02
|1:NOM:2130603|1:NAME:Кольцо|1:PROBA:Золото 583|1:VESO:2.12|1:VES:2.00
|1:NOM:2130603|1:NAME:Кольцо|1:PROBA:Золото 583|1:VESO:1.80|1:VES:1.78
|1:NOM:2130603|1:NAME:Серьга|1:PROBA:Золото 583|1:VESO:0.86|1:VES:0.76
|1:NOM:2130607|1:NAME:Серьги|1:PROBA:Золото 585|1:VESO:1.16|1:VES:1.16
|1:NOM:2130647|1:NAME:Обр. кольцо|1:PROBA:Золото 583|1:VESO:3.26|1:VES:3.26
|1:NOM:2130647|1:NAME:Кольцо с камнем|1:PROBA:Золото 583|1:VESO:5.94|1:VES:4.34
|1:NOM:2130647|1:NAME:Кольцо|1:PROBA:Золото 585|1:VESO:3.13|1:VES:2.95
|1:NOM:2130718|1:NAME:Браслет|1:PROBA:Золото 585|1:VESO:3.35|1:VES:3.30
|1:NOM:2131290|1:NAME:Обр. кольцо|1:PROBA:Золото 583|1:VESO:11.75|1:VES:11.75
|1:NOM:2131379|1:NAME:Перстень|1:PROBA:Золото 583|1:VESO:5.12|1:VES:5.12
|1:NOM:2131627|1:NAME:Кольцо|1:PROBA:Золото 500|1:VESO:3.02|1:VES:2.92
|1:NOM:2131648|1:NAME:Кольцо|1:PROBA:Золото 585|1:VESO:1.14|1:VES:1.10
|1:NOM:2131648|1:NAME:Кольцо|1:PROBA:Золото 585|1:VESO:2.19|1:VES:2.12
|1:NOM:2140020|1:NAME:Серьги|1:PROBA:Золото 583|1:VESO:2.57|1:VES:2.29
|1:NOM:2140060|1:NAME:Обр. кольцо|1:PROBA:Золото 585|1:VESO:2.19|1:VES:2.19
|1:NOM:2140108|1:NAME:Серьги|1:PROBA:Золото 585|1:VESO:1.20|1:VES:1.18
|1:NOM:2140134|1:NAME:Цепочка с кулоном|1:PROBA:Золото 583|1:VESO:11.26|1:VES:11.21
|1:NOM:2140153|1:NAME:Обр. кольцо|1:PROBA:Золото 583|1:VESO:4.35|1:VES:4.35
|1:NOM:2140153|1:NAME:Серьги|1:PROBA:Золото 583|1:VESO:1.94|1:VES:1.94
|1:NOM:2140153|1:NAME:Кольцо|1:PROBA:Золото 583|1:VESO:2.89|1:VES:2.70
|1:NOM:2140153|1:NAME:Серьги|1:PROBA:Золото 585|1:VESO:2.05|1:VES:2.05
|1:NOM:2140219|1:NAME:Обр. кольцо|1:PROBA:Золото 583|1:VESO:8.67|1:VES:8.67
|1:NOM:2140230|1:NAME:Цепочка лом|1:PROBA:Золото 585|1:VESO:2.75|1:VES:2.70
После вызова формирования отчета утилитой RepoRTF по шаблонам rtf и txt файлов получаем отчет в формате rtf. В шаблоне можно использовать любые шрифты, таблицы, рисунки - весь функционал Word. Наш пример простого отчета будет выглядеть так:
По ссылке можете скачать RepoRTF бесплатно с сайта. Используя генератор RepoRTF Вы можете создавать красивые отчеты любой сложности в дос программах. К плюсам такого способа можно добавить удобство и простоту модификации отчетов в Word не изменяя код программы (если изменения не затрагивают динамических данных).