Текущее время: Ср, июн 18 2025, 02:35

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: Addon к ФМ для выгрузки данных в WORD, EXCEL
СообщениеДобавлено: Пт, июн 26 2009, 15:49 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Чт, мар 09 2006, 10:12
Сообщения: 565
Откуда: Волгодонск
Пол: Мужской
Для интерфейса славной разработки Parazit ФМ для выгрузки данных в WORD, EXCEL
сделал ещё два вариант формирования файлов, отличие состоит в том что файлы полностью формируются на сервере SAP а затем готовые файлы выгружаются на машину клиента и там открываются

1. RTF - можно использовать шаблоны сделанные для word-а только сохранить как RTF затем загружаем его в SAP SMW0... всё точно также
Проблемы RTF - для того чтоб побороть индивидуальное форматирование отдельных символов подставляемых параметров хорошо помогает след. трюк - копируем параметр в notepad затем копируем из notepad назад в файл, также рекомендую выполнить следующую операцию в word-е выделить весь текст а затем сервис\язык\выбрать язык\русский
Преимущества - заполненный шаблон открываются практически мгновенно

2. Excel - можно использовать шаблоны сделанные для excel только сохранить как "Веб-страница *.htm..." затем загружаем его в SAP SMW0... всё точно также
Принцип работы: файл преобразуется на сервере затем сохраняется на машину клиента, там он с помощю OLE открывается Excel-ем и помощью OLE делается сохранить как в формате XLS - в результате имеем полноценный excel файл

LZWWWFORMTOP
Code:
DATA: str TYPE string.
DATA: build_mode TYPE c.

DATA: BEGIN OF itdoc OCCURS 0,
        name    TYPE string,
        content TYPE string,
      END   OF itdoc.


Инклюд для выгрузки в RTF + некоторые общие подпрограммы с выгрузкой в Excel
Code:
*----------------------------------------------------------------------*
***INCLUDE LZWWWFORMF02 .
*----------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*&      Form  OPEN_RTF
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_IT_VALUES  text
*      -->P_OPENFORM  text
*----------------------------------------------------------------------*
FORM rtf_open_form  TABLES itvals TYPE zwww_values_tab
                     USING rtfform afilename.
  DATA: filename TYPE string.
  filename = afilename.

  PERFORM read_form_to_str USING '4110' rtfform.
  PERFORM rtf_split_doc.

  CASE build_mode.
    WHEN '1' OR ' '. PERFORM rtf_build_form TABLES itvals.
    WHEN '2'. PERFORM rtf_build_form2 TABLES itvals.
  ENDCASE.

  PERFORM save_str_to_file USING '4110' filename.

  CALL METHOD cl_gui_frontend_services=>execute
     EXPORTING
       document               = filename
*      application            =
*      parameter              =
*      default_directory      =
*      maximized              =
*      minimized              =
*      synchronous            =
*      operation              = 'OPEN'
     EXCEPTIONS
       cntl_error             = 1
       error_no_gui           = 2
       bad_parameter          = 3
       file_not_found         = 4
       path_not_found         = 5
       file_extension_unknown = 6
       error_execute_failed   = 7
       synchronous_failed     = 8
       not_supported_by_gui   = 9
       OTHERS                 = 10.
ENDFORM.                    " OPEN_RTF

*&---------------------------------------------------------------------*
*&      Form  rtf_build_form
*&---------------------------------------------------------------------*
*       Построение документа на основе документа
*----------------------------------------------------------------------*
FORM rtf_build_form TABLES itvals TYPE zwww_values_tab.
  DATA: rtf_find_text TYPE string.
  DATA: rtf_var_name     TYPE string.
  DATA: rtf_value        TYPE string.
  DATA: content       TYPE string.
  DATA: tabix         TYPE sy-tabix.

* BREAK-POINT.
  CLEAR str.
  SORT itvals BY var_name var_num find_text.
  LOOP AT itdoc.
    content = itdoc-content.
    LOOP AT itvals.
      AT NEW var_name.
        PERFORM rtf_convert USING itvals-var_name rtf_var_name.
      ENDAT.

      IF rtf_var_name = itdoc-name.
        PERFORM rtf_convert USING itvals-find_text rtf_find_text.
        PERFORM rtf_convert USING itvals-value rtf_value.
        REPLACE ALL OCCURRENCES OF rtf_find_text IN content WITH rtf_value.
      ENDIF.

      AT END OF var_num.
        IF rtf_var_name = itdoc-name.
          CONCATENATE str content INTO str.
          content = itdoc-content.
        ENDIF.
      ENDAT.
    ENDLOOP.
  ENDLOOP.
ENDFORM.                    "rtf_build_form

*&---------------------------------------------------------------------*
*&      Form  rtf_build_form2
*&---------------------------------------------------------------------*
*       Построение документа на основании последовательности параметров
*----------------------------------------------------------------------*
*      -->ITVALS     text
*----------------------------------------------------------------------*
FORM rtf_build_form2 TABLES itvals TYPE zwww_values_tab.
  DATA: rtf_find_text TYPE string.
  DATA: rtf_var_name  TYPE string.
  DATA: rtf_value     TYPE string.
  DATA: content       TYPE string.
  DATA: ename_num     TYPE i.
  DATA: ename_numx    TYPE i.

* BREAK-POINT.
  CLEAR str.

  LOOP AT itvals.
    AT NEW var_num.
      CLEAR content.
      IF NOT itvals-var_name IS INITIAL.
        PERFORM rtf_convert USING itvals-var_name rtf_var_name.
        READ TABLE itdoc WITH KEY name = rtf_var_name.
        IF sy-subrc = 0.
          content = itdoc-content.
        ENDIF.
      ELSE.
        ADD 1 TO ename_num.
        ename_numx = ename_num.
        LOOP AT itdoc WHERE name IS INITIAL.
          SUBTRACT 1 FROM ename_numx.
          IF ename_numx IS INITIAL.
            content = itdoc-content.
            EXIT.
          ENDIF.
        ENDLOOP.
      ENDIF.
    ENDAT.

    PERFORM rtf_convert USING itvals-find_text rtf_find_text.
    PERFORM rtf_convert USING itvals-value rtf_value.
    REPLACE ALL OCCURRENCES OF rtf_find_text IN content WITH rtf_value.

    AT END OF var_num.
      CONCATENATE str content INTO str.
    ENDAT.
  ENDLOOP.
ENDFORM.                    "rtf_build_form


*&---------------------------------------------------------------------*
*&      Form  rtf_split_doc
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM rtf_split_doc.
  DATA: len   TYPE i.
  DATA: fdpos TYPE match_result.
  DATA: xfdpos TYPE i.
  DATA: xlen TYPE i.
  DATA: tstr TYPE string.
  DATA: tlen TYPE i.
  DATA: d    TYPE i.

  REFRESH itdoc.
  DO.
    IF str CS '{\*\bkmkstart'.
      IF sy-fdpos > 0.
        itdoc-name    = space.
        itdoc-content = str(sy-fdpos).
        APPEND itdoc.
        SHIFT str BY sy-fdpos PLACES.
      ENDIF.

      IF str CS '{\*\bkmkend '.
        xfdpos = sy-fdpos.

        FIND '}' IN SECTION OFFSET sy-fdpos OF str RESULTS fdpos.
        xlen = fdpos-offset - sy-fdpos + 1.
        ADD 12 TO sy-fdpos.
        len = fdpos-offset - sy-fdpos.
        itdoc-name = str+sy-fdpos(len).
        ADD 1 TO fdpos-offset.
        itdoc-content = str(fdpos-offset).
        IF itdoc-content+13 CS '{\*\bkmkstart'.
* надо проверить а не находится ли найденое начало bookmark перед концом нашего..
* если это так надо их развязать поменяв местами
          ADD 13 TO sy-fdpos.
          FIND '}' IN SECTION OFFSET sy-fdpos OF str RESULTS fdpos.
          d = xfdpos - fdpos-offset.
          IF d = 1.
            tlen = fdpos-offset - sy-fdpos + 1.
            fdpos-offset = xfdpos + xlen.
            CONCATENATE str(sy-fdpos) str+xfdpos(xlen) str+sy-fdpos(tlen) str+fdpos-offset INTO str.
            fdpos-offset = sy-fdpos + xlen.
            itdoc-content = str(fdpos-offset).
          ELSE.
            MESSAGE x398(00) WITH 'не найдено начало bookmark внутри bookmark'.
          ENDIF.
        ENDIF.
        SHIFT str BY fdpos-offset PLACES.

        APPEND itdoc.
      ELSE.
        MESSAGE x398(00) WITH 'не найдено окончание bookmark'.
      ENDIF.
    ELSE.
      itdoc-name    = space.
      itdoc-content = str.
      APPEND itdoc.
      EXIT.
    ENDIF.
  ENDDO.
ENDFORM.                    "split_doc


*&---------------------------------------------------------------------*
*&      Form  rtf_convert
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->IN         text
*      -->OUT        text
*----------------------------------------------------------------------*
FORM rtf_convert USING in out.
  STATICS: BEGIN OF itconv OCCURS 0,
             char   TYPE c,
             rtf(15) TYPE c,
           END   OF itconv.
  DATA itch(15)  TYPE c OCCURS 0 WITH HEADER LINE.
  DATA: str(100) TYPE c.
  DATA: rtf(300) TYPE c.
  DATA: len      TYPE i.
  DATA: index    TYPE i.
  DATA: char     TYPE c.
  DATA: space_translate TYPE c.

  IF itconv[] IS INITIAL. " Готовим таблицу перекодировки
* Пробел в начале str нужен чтоб sy-tabix правильно пошол
* У первой буквы в RTF нет \ это чтоб split правильно отработал
    str = ' абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ«»№”|{}‘"'.
    CONCATENATE '"e0\"e1\"e2\"e3\"e4\"e5\"b8\"e6\"e7\"e8\"e9\"ea\"eb\"ec\"ed\"ee\"ef\"f0\"f1\"f2'
               '\"f3\"f4\"f5\"f6\"f7\"f8\"f9\"fa\"fb\"fc\"fd\"fe\"ff\"c0\"c1\"c2\"c3\"c4\"c5\"a8'
               '\"c6\"c7\"c8\"c9\"ca\"cb\"cc\"cd\"ce\"cf\"d0\"d1\"d2\"d3\"d4\"d5\"d6\"d7\"d8\"d9'
               '\"da\"db\"dc\"dd\"de\"df\"ab\"bb\"b9\"94\|\{\}\lquote'
    INTO rtf.

    TRANSLATE str USING '"'''.

    TRANSLATE rtf USING '"'''.
    SPLIT rtf AT '\' INTO TABLE itch.

    LOOP AT itch.
      itconv-char = str+sy-tabix(1).
      CONCATENATE '\' itch INTO itconv-rtf.
      APPEND itconv.
    ENDLOOP.
    SORT itconv BY char.
  ENDIF.

  CLEAR out.
  len = STRLEN( in ).
  DO len TIMES.
    char = in+index(1).
    IF char = space.
      CONCATENATE out '#' INTO out.
      space_translate = 'X'.
    ELSE.
      READ TABLE itconv WITH KEY char = char BINARY SEARCH.
      IF sy-subrc = 0.
        CONCATENATE out itconv-rtf INTO out.
      ELSE.
        CONCATENATE out char INTO out.
      ENDIF.
    ENDIF.
    ADD 1 TO index.
  ENDDO.
  IF space_translate = 'X'.
    TRANSLATE out USING '# '.
  ENDIF.
ENDFORM.                    "rtf_convert

*&---------------------------------------------------------------------*
*&      Form  rtf_read_form
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->OBJID      text
*----------------------------------------------------------------------*
FORM read_form_to_str USING page objid.
  DATA: key TYPE wwwdatatab.
  DATA: itmime  TYPE w3mime OCCURS 0 WITH HEADER LINE.
  DATA: cfilesize(11) TYPE c.
  DATA: filesize TYPE i.
  DATA: converter TYPE REF TO cl_abap_conv_obj.
  DATA: xstr TYPE xstring.

  CLEAR: str.

  key-relid = 'MI'.
  key-objid = objid.

  CALL FUNCTION 'WWWDATA_IMPORT'
    EXPORTING
      key               = key
    TABLES
      mime              = itmime
    EXCEPTIONS
      wrong_object_type = 1
      import_error      = 2
      OTHERS            = 3.

  CALL FUNCTION 'WWWPARAMS_READ'
    EXPORTING
      relid = key-relid
      objid = key-objid
      name  = 'filesize'
    IMPORTING
      value = cfilesize.
  filesize = cfilesize.

  CREATE OBJECT converter
    EXPORTING
      incode           = page
*     incode           = '1504' " ANSI (1251)
*     incode           = '4110' " utf-8
      miss             = 'S' " prc_miss
      broken           = 'M' " prc_broken
      use_f1           = 'X'
      substc           = '00035' " prc_sapno
    EXCEPTIONS
      invalid_codepage = 1
      internal_error   = 2.

  CALL METHOD cl_umc_ostream=>tab2xstr
    EXPORTING
      it_data  = itmime[]
      i_length = filesize
    IMPORTING
      e_xstr   = xstr.

  CALL METHOD converter->convert
    EXPORTING
      inbuff         = xstr
      inbufflg       = 0
      outbufflg      = 0
    IMPORTING
      outbuff        = str
    EXCEPTIONS
      internal_error = 1
      OTHERS         = 2.

  REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>cr_lf IN str WITH ''.
ENDFORM.                    "rtf_read_form

*&---------------------------------------------------------------------*
*&      Form  rtf_save_file
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->FIELNAME   text
*----------------------------------------------------------------------*
FORM save_str_to_file USING page fielname.
  DATA: converter TYPE REF TO cl_abap_conv_obj.
  DATA: xstr TYPE xstring.
  DATA: BEGIN OF itblob OCCURS 0,
          data(255) TYPE x,
        END   OF itblob.
  DATA: blob_length TYPE i.

  CREATE OBJECT converter
    EXPORTING
      outcode          = page
*     outcode          = '1504' " ANSI (1251)
*     outcode          = '4110' " UTF-8
    EXCEPTIONS
      invalid_codepage = 1
      internal_error   = 2
      OTHERS           = 3.

  CALL METHOD converter->convert
    EXPORTING
      inbuff         = str
      inbufflg       = 0
      outbufflg      = 0
    IMPORTING
      outbuff        = xstr
    EXCEPTIONS
      internal_error = 1
      OTHERS         = 2.

  CALL METHOD cl_umc_ostream=>xstr2tab
    EXPORTING
      i_xstr   = xstr
    IMPORTING
      et_data  = itblob[]
      e_length = blob_length.

  CALL FUNCTION 'GUI_DOWNLOAD'
    EXPORTING
      bin_filesize            = blob_length
      filename                = fielname
      filetype                = 'BIN'
    TABLES
      data_tab                = itblob
    EXCEPTIONS
      file_write_error        = 1
      no_batch                = 2
      gui_refuse_filetransfer = 3
      invalid_type            = 4
      no_authority            = 5
      unknown_error           = 6
      header_not_allowed      = 7
      separator_not_allowed   = 8
      filesize_not_allowed    = 9
      header_too_long         = 10
      dp_error_create         = 11
      dp_error_send           = 12
      dp_error_write          = 13
      unknown_dp_error        = 14
      access_denied           = 15
      dp_out_of_memory        = 16
      disk_full               = 17
      dp_timeout              = 18
      file_not_found          = 19
      dataprovider_exception  = 20
      control_flush_error     = 21
      OTHERS                  = 22.
ENDFORM.                    "rtf_save_file


Инклюд для выгрузки в Excel
Code:
*----------------------------------------------------------------------*
***INCLUDE LZWWWFORMF03 .
*----------------------------------------------------------------------*

FORM html_excel_open_form  TABLES itvals TYPE zwww_values_tab
                            USING rtfform afilename.
  DATA: filename TYPE string.
  DATA: xlsfname TYPE string.
  DATA: ext TYPE string.

  filename = afilename.

  SPLIT filename AT '.' INTO xlsfname ext.
  CONCATENATE xlsfname '.xls' INTO xlsfname.

  PERFORM read_form_to_str USING '1504' rtfform.
  PERFORM html_excel_split_doc.

  CASE build_mode.
    WHEN '1' OR ' '. PERFORM html_excel_build_form TABLES itvals.
    WHEN '2'. PERFORM html_excel_build_form2 TABLES itvals.
  ENDCASE.

  PERFORM save_str_to_file USING '1504' filename.
  PERFORM html_excel_run USING filename xlsfname.
ENDFORM.                    " HTML_EXCEL_OPEN_FORM

*&---------------------------------------------------------------------*
*&      Form  html_excel_build_form
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->ITVALS     text
*----------------------------------------------------------------------*
FORM html_excel_build_form TABLES itvals TYPE zwww_values_tab.
  DATA: var_name      TYPE string.
  DATA: content       TYPE string.
  DATA: tabix         TYPE sy-tabix.

* BREAK-POINT.
  CLEAR str.
  SORT itvals BY var_name var_num find_text.
  LOOP AT itdoc.
    content = itdoc-content.
    LOOP AT itvals.
      AT NEW var_name.
        var_name = itvals-var_name.
      ENDAT.

      IF var_name = itdoc-name.
        REPLACE ALL OCCURRENCES OF itvals-find_text IN content WITH itvals-value.
      ENDIF.

      AT END OF var_num.
        IF var_name = itdoc-name.
          CONCATENATE str content INTO str.
          content = itdoc-content.
        ENDIF.
      ENDAT.
    ENDLOOP.
  ENDLOOP.
ENDFORM.                    "rtf_build_form

*&---------------------------------------------------------------------*
*&      Form  html_excel_build_form2
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->ITVALS     text
*----------------------------------------------------------------------*
FORM html_excel_build_form2 TABLES itvals TYPE zwww_values_tab.
  DATA: content       TYPE string.
  DATA: ename_num     TYPE i.
  DATA: ename_numx    TYPE i.

* BREAK-POINT.
  CLEAR str.

  LOOP AT itvals.
    AT NEW var_num.
      CLEAR content.
      IF NOT itvals-var_name IS INITIAL.
        READ TABLE itdoc WITH KEY name = itvals-var_name.
        IF sy-subrc = 0.
          content = itdoc-content.
        ENDIF.
      ELSE.
        ADD 1 TO ename_num.
        ename_numx = ename_num.
        LOOP AT itdoc WHERE name IS INITIAL.
          SUBTRACT 1 FROM ename_numx.
          IF ename_numx IS INITIAL.
            content = itdoc-content.
            EXIT.
          ENDIF.
        ENDLOOP.
      ENDIF.
    ENDAT.

    REPLACE ALL OCCURRENCES OF itvals-find_text IN content WITH itvals-value.

    AT END OF var_num.
      CONCATENATE str content INTO str.
    ENDAT.
  ENDLOOP.
ENDFORM.                    "rtf_build_form

*&---------------------------------------------------------------------*
*&      Form  html_excel_split_doc
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM html_excel_split_doc.
  DATA: itfind TYPE match_result_tab WITH HEADER LINE.
  DATA: find1  TYPE match_result.
  DATA: find2  TYPE match_result.
  DATA: pos    TYPE i.
  DATA: len    TYPE i.
  DATA: wstr1  TYPE string.
  DATA: wstr2  TYPE string.
  DATA: wstr3  TYPE string.
  DATA: tr_index  TYPE string.
  DATA: cur_name  TYPE string.
  DATA: prev_name TYPE string.

  DATA: BEGIN OF itrows OCCURS 0,
          name TYPE string,
          brow TYPE i,
          erow TYPE i,
        END   OF itrows.

  REFRESH itdoc.

* 1 Ищим именованые диапазоны (собственно нас интересует только диапазон строк)
* Наверно с помощью регулярных выражений это можно сделать как то проще - но я к своему стыду их не знаю
  FIND ALL OCCURRENCES OF '<x:ExcelName>' IN str IGNORING CASE RESULTS itfind[].
  LOOP AT itfind.
    FIND '<x:Name>'  IN SECTION OFFSET itfind-offset OF str IGNORING CASE RESULTS find1.
    FIND '</x:Name>' IN SECTION OFFSET find1-offset  OF str IGNORING CASE RESULTS find2.
    pos = find1-offset + 8.
    len = find2-offset - pos.
    itrows-name = str+pos(len).
    FIND '<x:Formula>=' IN SECTION OFFSET find2-offset OF str IGNORING CASE RESULTS find1.
    FIND '</x:Formula>' IN SECTION OFFSET find1-offset OF str IGNORING CASE RESULTS find2.
    pos = find1-offset + 12.
    len = find2-offset - pos.
    wstr1 = str+pos(len).
    SPLIT wstr1 AT '$' INTO wstr1 wstr2 wstr3.
    TRANSLATE wstr2 USING ': '.
    itrows-brow = wstr2.
    itrows-erow = wstr3.
    APPEND itrows.
  ENDLOOP.

*  BREAK-POINT.
* 2 проходим по тегам <tr и разбиваем документ в соответствии с именоваными диапазонами
  FIND ALL OCCURRENCES OF '<tr ' IN str IGNORING CASE RESULTS itfind[].
  CLEAR pos.
  LOOP AT itfind.
    tr_index = sy-tabix.
    CLEAR cur_name.
    LOOP AT itrows.
      IF tr_index >= itrows-brow AND tr_index <= itrows-brow.
        cur_name = itrows-name.
        EXIT.
      ENDIF.
    ENDLOOP.

    IF prev_name <> cur_name.
      itdoc-name = prev_name.
      len = itfind-offset - pos.
      IF len > 0.
        itdoc-content = str+pos(len).
        APPEND itdoc.
      ENDIF.

      pos       = itfind-offset.
      prev_name = cur_name.
    ENDIF.
  ENDLOOP.

  itdoc-name = prev_name.
  itdoc-content = str+pos.
  APPEND itdoc.
ENDFORM.                    "html_excel_split_doc

*&---------------------------------------------------------------------*
*&      Form  html_excel_run
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->HTMLFILE   text
*      -->XLSFILE    text
*----------------------------------------------------------------------*
FORM html_excel_run USING htmlfile xlsfile.
  DATA: h_appl  TYPE ole2_object.
  DATA: h_books TYPE ole2_object.
  DATA: h_work  TYPE ole2_object.
  DATA: rc TYPE i.

  CALL METHOD cl_gui_frontend_services=>file_delete
    EXPORTING
      filename             = xlsfile
    CHANGING
      rc                   = rc
    EXCEPTIONS
      file_delete_failed   = 1
      cntl_error           = 2
      error_no_gui         = 3
      file_not_found       = 4
      access_denied        = 5
      unknown_error        = 6
      not_supported_by_gui = 7
      wrong_parameter      = 8
      OTHERS               = 9.

  CREATE OBJECT h_appl 'EXCEL.APPLICATION'.
  CHECK sy-subrc = 0.

  CALL METHOD OF h_appl 'WORKBOOKS' = h_books.
  CHECK sy-subrc = 0.

  CALL METHOD OF h_books 'OPEN'
    EXPORTING #1 = htmlfile.
  CHECK sy-subrc = 0.

  CALL METHOD OF h_appl 'ACTIVEWORKBOOK' = h_work.
  IF sy-subrc <> 0. EXIT. ENDIF.

  CALL METHOD OF h_work 'SAVEAS'
    EXPORTING #1 = xlsfile
    #2 = -4143. " xlNormal
  CHECK sy-subrc = 0.

  SET PROPERTY OF h_appl 'VISIBLE' = 1.
ENDFORM.                    "RUN_EXCEL


изменения сделаные в ZWWW* для подключения инклюдов
Code:
FUNCTION zwww_openform.
-----------------------------------
  IF filetype = 'RTF'.
    PERFORM rtf_open_form TABLES it_values USING form_name file_name.
  ELSEIF filetype = 'HTML_EXCEL'.
    PERFORM html_excel_open_form TABLES it_values USING form_name file_name.
  ELSE.
    PERFORM openform
      USING file_name
            filetype
            it_values[]
            optimize
            protect
            printdialog
            only_save
            xdebug_mode
            decimal_separator
            return_code.

    CASE return_code.
      WHEN 1.
        RAISE printcancel.
    ENDCASE.
  ENDIF.
-------------------------------
ENDFUNCTION.

FORM downloadwwwtemplate
---------------------------------
  CASE ext.
    WHEN '.XLS'.
      filetype = 'EXCEL'.
    WHEN '.DOC'.
      filetype = 'WORD'.
    WHEN '.RTF'.
      filetype = 'RTF'.
      EXIT.
    WHEN '.HTM'.
      filetype = 'HTML_EXCEL'.
      EXIT.
    WHEN OTHERS.
      EXIT.
  ENDCASE.
--------------------------------
ENDFORM.


ФМ для выбора режима сборки файла
Режим сборки по умолчанию 1 - обычный режим
режим сборки 2 - в этом случае файл собирается из кусков в соответствии с порядком заполнения таблицы параметров
Code:
FUNCTION zwww_set_build_mode.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  IMPORTING
*"     REFERENCE(MODE) TYPE  C
*"----------------------------------------------------------------------

  build_mode = mode.

ENDFUNCTION.


ЗЫ
В виду того что это addon к уже существующему интерфейсу, и кроме того идею мне подсказали - авторских прав не заявляю, распространение и доработка совершенно свободая

_________________
Изображение Попытка не пытка


Последний раз редактировалось DKiyanov Вт, сен 08 2009, 01:52, всего редактировалось 2 раз(а).

Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Addon к ФМ для выгрузки данных в WORD, EXCEL
СообщениеДобавлено: Пн, июн 29 2009, 08:30 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Пн, окт 11 2004, 20:32
Сообщения: 2470
Пол: Мужской
Добавил в тему 'Разработки участников форума'

_________________
- Может ли настоящий мастер кунг-фу получить по морде?
- Настоящий мастер может все!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Addon к ФМ для выгрузки данных в WORD, EXCEL
СообщениеДобавлено: Пн, июн 29 2009, 11:12 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, авг 19 2004, 17:37
Сообщения: 1962
Откуда: Москва
Пол: Мужской
DKiyanov написал:
1. RTF - можно использовать шаблоны сделанные для word-а только сохранить как RTF затем загружаем его в SAP SMW0... всё точно также
Проблемы RTF - для того чтоб побороть индивидуальное форматирование отдельных символов подставляемых параметров хорошо помогает след. трюк - копируем параметр в notepad затем копируем из notepad назад в файл, также рекомендую выполнить следующую операцию в word-е выделить весь текст а затем сервис\язык\выбрать язык\русский


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

_________________
"For all entries" не в SAP-ах, "for all entries" в головах! :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Addon к ФМ для выгрузки данных в WORD, EXCEL
СообщениеДобавлено: Вт, июн 30 2009, 12:39 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Чт, мар 09 2006, 10:12
Сообщения: 565
Откуда: Волгодонск
Пол: Мужской
2 Parazit ну собственно выше описанные манипуляции 100% решают эти проблемы, муторно конечно немного но вполне выполнимо

_________________
Изображение Попытка не пытка


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Addon к ФМ для выгрузки данных в WORD, EXCEL
СообщениеДобавлено: Вт, сен 08 2009, 02:13 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Чт, мар 09 2006, 10:12
Сообщения: 565
Откуда: Волгодонск
Пол: Мужской
Для заполнения таблицы значений написал свой ФМ ZWWW_FILL_VALUES

Для связывания переменных программы и текстовых "меток"шаблона я сделал настоечную таблицу ZWWW_FASSIGN и ФМ ZWWW_FILL_VALUES для сбора значений из программы которая его вызвала и заполнения таблицы значений на основе настроечной таблицы

Структура таблицы: zwww_fassign
Code:
OBJID     W3OBJID        ключь Имя объекта
NUM       NUMC3          ключь Номер по порядку (практического смысла не имеет, просто чтоб размножить записи)
FGROUP    ZWWW_FGROUP    Группа полей используется в подпрограммах заполнения шаблона
VAR_NAME  ZWWW_VAR_NAME  Имя закладки
FIND_TEXT ZWWW_FIND_TEXT текстовая метка из шаблона например «[ИМЯ_КЛИЕНТА]»
FNAMES    TEXT255        макрос для формирования строки которой будет заменена метка.


поле FNAMES – предназначен для упрощения формирования строки для замены метки
Пример заполнения: «[ADRC-POST_CODE1] [ADRC-REGION] {г. [ADRC-CITY1],} [ADRC-STREET],} [ADRC-HOUSE_NUM1]»
В квадратных скобках указаны имена полей заполняющей программы из которых должно быть взято значение, перед и после квадратных скобок могут быть указаны соотв. фигурные скобки значение которое указано между фигурной и квадратной скобкой будет внесено в текст если значение поля в квадратных скобках не пустое

т.е. в нашем примере если поле программы ADRC-CITY1 (город) заполнено (не пустое) то перед ним будет выведено «г.» а после него «,».

внутри квадратных скобок перед именем поля программы может быть указана подпрограмма преобразования через разделитель «|» например [D1|VEDA-VBEGDAT] – в данном случае «D1» -это имя стандартной подпрограммы преобразования подпрограммы начинающиеся на «Z» должны быть закодированы в программе формирующей формуляр. У таких подпрограмм два параметра – входящая переменная и исходящая строка.

поле FGROUP – это поле является одним из параметров ФМ ZWWW_FILL_VALUES и служит для единовременного заполнение строк значений для нескольких текстовых меток шаблона.

Code:
FUNCTION zwww_fill_values.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  IMPORTING
*"     VALUE(PROGRAM) TYPE  SY-REPID OPTIONAL
*"     REFERENCE(OBJID) TYPE  ZWWW_FASSIGN-OBJID
*"     REFERENCE(FGROUP) TYPE  ZWWW_FASSIGN-FGROUP DEFAULT '*'
*"     REFERENCE(VAR_NUM) TYPE  ZWWW_VAR_NUM OPTIONAL
*"  TABLES
*"      IT_VALUES
*"----------------------------------------------------------------------

  DATA: index TYPE sy-index.
  DATA: field(100) TYPE c.
  DATA: wa_values TYPE zwww_values.
  DATA: tail(50) TYPE c.
  DATA: len TYPE i.
  DATA: ch  TYPE c.
  DATA: tabix TYPE sy-tabix.
  DATA: prg(20) TYPE c.
  DATA: str TYPE string.

  DATA: BEGIN OF itw OCCURS 0,
          pch TYPE c,
          nch TYPE c,
          str TYPE string,
        END   OF itw.

  DATA: wx LIKE LINE OF itw.
  DATA: ftabix TYPE sy-tabix.

  FIELD-SYMBOLS <fs>.

  READ TABLE itfassign  WITH KEY objid = objid.
  IF sy-subrc <> 0.
    SELECT * APPENDING TABLE itfassign
      FROM zwww_fassign
     WHERE objid = objid.
    IF sy-subrc <> 0.
      MESSAGE x398(00) WITH 'Данные для объекта' objid 'не найдены'.
    ENDIF.
  ENDIF.

  IF program IS INITIAL.
    CALL 'AB_GET_CALLER' ID 'PROGRAM' FIELD program.
  ENDIF.

  LOOP AT itfassign WHERE objid = objid
                      AND fgroup CP fgroup
                      AND outmode <> 'T'.
    len = STRLEN( itfassign-fnames ).
    IF len = 0. " Ищем последнее значение с такимже текстом для замены
      IF NOT itfassign-find_text IS INITIAL.
        CLEAR ftabix.
        LOOP AT it_values INTO wa_values.
          IF wa_values-find_text = itfassign-find_text.
            ftabix = sy-tabix.
          ENDIF.
        ENDLOOP.
        IF NOT ftabix IS INITIAL.
          READ TABLE it_values INTO wa_values INDEX ftabix.
          wa_values-var_name  = itfassign-var_name.
          wa_values-var_num   = var_num.
          APPEND wa_values TO it_values.
        ENDIF.
      ELSE.
        CLEAR wa_values.
        wa_values-var_name  = itfassign-var_name.
        wa_values-var_num   = var_num.
        APPEND wa_values TO it_values.
      ENDIF.

      CONTINUE.
    ENDIF.

    ASSIGN itfassign-fnames(len) TO <fs>.
    TRANSLATE <fs> USING ' #'.

    CLEAR: itw[], itw, index.
    DO len TIMES.
      ch = itfassign-fnames+index(1).
      IF ch CA '{}[]'.
        itw-nch = ch.
        APPEND itw.
        CLEAR itw.
        itw-pch = ch.
      ELSE.
        CONCATENATE itw-str ch INTO itw-str.
      ENDIF.
      ADD 1 TO index.
    ENDDO.

    LOOP AT itw WHERE nch = ']'.
      tabix = sy-tabix.
      TRANSLATE itw-str TO UPPER CASE.

      IF itw-str CA '|'.
        SPLIT itw-str AT '|' INTO prg itw-str.
      ELSE.
        CLEAR prg.
      ENDIF.

      CONCATENATE '(' program ')' itw-str INTO field.
      ASSIGN (field) TO <fs>.

      CLEAR str.
      IF NOT <fs> IS INITIAL.
        IF prg IS INITIAL.
          PERFORM write_val USING <fs> str.
        ELSE.
          IF prg(1) = 'Z'.
            PERFORM (prg) IN PROGRAM (program) IF FOUND
              USING <fs> str.
          ELSE.
            CONCATENATE 'CONVERT_' prg INTO prg.
            PERFORM (prg) IN PROGRAM (sy-repid) IF FOUND
              USING <fs> str.
          ENDIF.

          IF str IS INITIAL.
            PERFORM write_val USING <fs> str.
          ENDIF.
        ENDIF.


        ADD 1  TO tabix.
        READ TABLE itw INDEX tabix INTO wx.
        IF wx-nch = '}'.
          CONCATENATE str wx-str INTO str.
        ENDIF.

        SUBTRACT 2 FROM tabix.
        IF tabix > 0.
          READ TABLE itw INDEX tabix INTO wx.
          IF wx-pch = '{'.
            CONCATENATE wx-str str INTO str.
          ENDIF.
        ENDIF.

        ADD 1  TO tabix.
      ENDIF.

      itw-str = str.
      MODIFY itw INDEX tabix TRANSPORTING str.
    ENDLOOP.

    CLEAR wa_values.
    LOOP AT itw WHERE NOT str IS INITIAL.
      IF itw-pch = '{' AND itw-nch = '['
      OR itw-pch = ']' AND itw-nch = '}'.
        CONTINUE.
      ENDIF.

      CONCATENATE wa_values-value itw-str INTO wa_values-value.
    ENDLOOP.

    TRANSLATE wa_values-value USING '# '.

    wa_values-var_name  = itfassign-var_name.
    wa_values-var_num   = var_num.
    wa_values-find_text = itfassign-find_text.
*    wa_values-val_type  = .
    APPEND wa_values TO it_values.
  ENDLOOP.
ENDFUNCTION.

*&---------------------------------------------------------------------*
*&      Form  write_val
*&---------------------------------------------------------------------*
*       Нужна из за того что write to string не возможен
*----------------------------------------------------------------------*
*      -->VAL        text
*      -->STR        text
*----------------------------------------------------------------------*
FORM write_val USING val str.
  DATA: typ TYPE c.
  DATA: len TYPE i.
  DATA: val_str(256) TYPE c.

  DESCRIBE FIELD val TYPE typ.
  IF typ = 'g'. " String
    str = val.
  ELSEIF typ = 'C'. " Бывает тип C но с coversion_exit
    len = STRLEN( val ).
    IF len < 256.
      WRITE val TO val_str LEFT-JUSTIFIED.
      str = val_str.
    ELSE.
      str = val.
    ENDIF.
  ELSE.
    WRITE val TO val_str LEFT-JUSTIFIED.
    str = val_str.
  ENDIF.
ENDFORM.                    "write_val

*&---------------------------------------------------------------------*
*&      Form  CONVERT_d1
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->D          text
*      -->STR        text
*----------------------------------------------------------------------*
FORM convert_d1 USING ad str.
  DATA: d TYPE d.
  DATA: month(15) TYPE c.
  d = ad.
  CASE d+4(2).
    WHEN '01'. month = 'января'.
    WHEN '02'. month = 'февраля'.
    WHEN '03'. month = 'марта'.
    WHEN '04'. month = 'апреля'.
    WHEN '05'. month = 'майя'.
    WHEN '06'. month = 'июня'.
    WHEN '07'. month = 'июля'.
    WHEN '08'. month = 'августа'.
    WHEN '09'. month = 'сентября'.
    WHEN '10'. month = 'октября'.
    WHEN '11'. month = 'ноября'.
    WHEN '12'. month = 'декабря'.
  ENDCASE.
  CONCATENATE '«' d+6(2) '»#' month '#' d(4) INTO str.
  TRANSLATE str USING '# '.
ENDFORM.                                                    "CONVERT_d1

*&---------------------------------------------------------------------*
*&      Form  menge
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->VAL        text
*      -->RET        text
*----------------------------------------------------------------------*
FORM convert_menge USING val ret.
  DATA: xret(20) TYPE c.
  WRITE val TO xret LEFT-JUSTIFIED.
  SHIFT xret RIGHT DELETING TRAILING space.
  SHIFT xret RIGHT DELETING TRAILING '0'.
  SHIFT xret RIGHT DELETING TRAILING ','.
  SHIFT xret LEFT DELETING LEADING space.
  ret = xret.
ENDFORM.                    "menge

*&---------------------------------------------------------------------*
*&      Form  convert_spell
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->VAL        text
*      -->RET        text
*----------------------------------------------------------------------*
FORM convert_spell USING val ret.
  DATA: spell TYPE spell.
  CALL FUNCTION 'SPELL_AMOUNT'
    EXPORTING
      amount    = val
      currency  = 'RUB'
      filler    = ' '
      language  = sy-langu
    IMPORTING
      in_words  = spell
    EXCEPTIONS
      not_found = 1
      too_large = 2
      OTHERS    = 3.

  CONCATENATE spell-word spell-decword INTO ret SEPARATED BY space.
ENDFORM.                    "convert_spell

*&---------------------------------------------------------------------*
*&      Form  convert_region
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->VAL        text
*      -->RET        text
*----------------------------------------------------------------------*
FORM convert_region USING val ret.
  DATA: bezei TYPE t005u-bezei.
  SELECT SINGLE bezei INTO bezei
    FROM t005u
   WHERE spras = sy-langu
     AND land1 = 'RU'
     AND bland = val.
  ret = bezei.
ENDFORM.                    "convert_region

*&---------------------------------------------------------------------*
*&      Form  convert_land
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->VAL        text
*      -->RET        text
*----------------------------------------------------------------------*
FORM convert_land USING val ret.
  DATA: landx TYPE t005t-landx.
  SELECT SINGLE landx INTO landx
    FROM t005t
   WHERE spras = sy-langu
     AND land1 = val.
  ret = landx.
ENDFORM.                    "convert_land


Данный ФМ позволяет упростить программу формирования шаблона, сделать её более наглядной и настраиваемой,
отделяет названия текстовых меток шаблона от программы формирования шаблона

_________________
Изображение Попытка не пытка


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB