22 | 11 | 2017

 reportf

Отчеты в Word из Clipper или FoxPro с помощью RepoRTF 

RepoRTF - замечательная утилита, генератор отчетов в формате Word - RTF. С помощью RepoRTF можно легко создавать различные отчеты из dos-программ в виде Word- файла, используя весь функционал редактора Word любой версии. Все просто, открываете Word и готовите в нём шаблон будущего отчета любой сложности, используя таблицы, картинки, различные шрифты, колонтитулы и т.д. Генератор поддерживает до 9 уровней детализации. В программе добавляете пару типовых функций (есть в архиве с RepoRTF, пример так же приведен ниже) и процедуру вывода динамических данных в обычный текстовый файл. Далее на основании данных из текстового файла и шаблона RTF формируется готовый современный отчет. Довольно просто как создавать новые отчеты, так и переделать старые, текстовые в новый красивый вид, что бывает очень необходимо, используя при этом хорошо зарекомендовавший и отлаженный старый досовский софт, например на Clipper-е или FoxPro.

Этот генератор можно применять с различными программами. В составе есть исходники для C++Builder, Delphi, FoxPro, документация, 13 контрольных примеров. Возможен запуск с параметрами или без - для создания и отладки.

Пример файла шаблона rtf-файла, создаем в Word.

reportf 1 

Пример функции формирования отчета по шаблону 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 2

 

По ссылке можете скачать RepoRTF бесплатно с сайта. Используя генератор RepoRTF Вы можете создавать красивые отчеты любой сложности в дос программах. К плюсам такого способа можно добавить удобство и простоту модификации отчетов в Word не изменяя код программы (если изменения не затрагивают динамических данных). 

 

Скачать бесплатно   download