Автор Тема: YTSH_SAVE_LONG_TEXT - Загрузка длинных текстов ОЗМ  (Прочитано 6632 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 727
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Небольшой пример по загрузке длинных текстов к ОЗМ. В принципе данная программа может легко быть преобразована для загрузки любых длинных текстов к любым объектам системы. Файл для обработки используется текстовый с разделителем табуляция (код символа #09). Структура файла:
1. Код материала
2. Код формата для строки
3. Текстовая строка 132 символа

т.е. файл приблизительно такой структуры:
Код: You are not allowed to view links. Register or Login
T-BBC24 /= строка 1
T-BBC24 / строка 2
T-BBC01 /= строка 11
T-BBC01 / строка 12
T-BBC01 / строка 13
T-BBC03 /= строка 21
T-BBC03 / строка 22
Код: You are not allowed to view links. Register or Login
*&---------------------------------------------------------------------*
*& Report  YTSH_SAVE_LONG_TEXT
*&
*&---------------------------------------------------------------------*
*&    Небольшая программа по загрузке длинных текстов к кодам ОЗМ
*&
*&---------------------------------------------------------------------*
REPORT ytsh_save_long_text.
TABLES: rlgrap.

PARAMETERS: p_file LIKE rlgrap-filename DEFAULT 'C:\1.cvs'.


*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
DATA: BEGIN OF lt_text OCCURS 1,
  matnr LIKE mara-matnr,
  tdformat LIKE tline-tdformat,
  tdline LIKE tline-tdline,
END OF lt_text.

*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      def_filename     = ''
      def_path         = 'C:\'
      mask             = ',*.cvs,*.*.'
      mode             = 'O'
      title            = 'Данные для загрузки'
    IMPORTING
      filename         = p_file
    EXCEPTIONS
      inv_winsys       = 1
      no_batch         = 2
      selection_cancel = 3
      selection_error  = 4
      OTHERS           = 5.



*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
START-OF-SELECTION.
  PERFORM read_text.
  PERFORM save_text.


*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Form  READ_TEXT
*&---------------------------------------------------------------------*
*       Прочитать файл с даннами
*----------------------------------------------------------------------*
*  <--  LT_TEXT - Данные загруженные для обработки
*----------------------------------------------------------------------*
FORM read_text.
  DATA: l_filename TYPE string,
        l_filelength LIKE sy-tabix.

  l_filename = p_file.
  CALL METHOD cl_gui_frontend_services=>gui_upload
    EXPORTING
      filename                = l_filename
      filetype                = 'DAT'
    IMPORTING
      filelength              = l_filelength
    CHANGING
      data_tab                = lt_text[]
    EXCEPTIONS
      file_open_error         = 1
      file_read_error         = 2
      no_batch                = 3
      gui_refuse_filetransfer = 4
      invalid_type            = 5
      no_authority            = 6
      unknown_error           = 7
      bad_data_format         = 8
      header_not_allowed      = 9
      separator_not_allowed   = 10
      header_too_long         = 11
      unknown_dp_error        = 12
      access_denied           = 13
      dp_out_of_memory        = 14
      disk_full               = 15
      dp_timeout              = 16
      not_supported_by_gui    = 17
      error_no_gui            = 18
      OTHERS                  = 19.
  IF sy-subrc <> 0. MESSAGE 'Ошибка чтения файла с данными' TYPE 'I'. EXIT. ENDIF.
ENDFORM.                    " READ_TEXT
*&---------------------------------------------------------------------*
*&      Form  SAVE_TEXT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  LT_TEXT - Данные для обработки
*----------------------------------------------------------------------*
FORM save_text.
  DATA: l_count LIKE sy-tabix,
        ls_header LIKE thead,
        lt_lines LIKE tline OCCURS 1 WITH HEADER LINE.
  SORT lt_text BY matnr.
  CLEAR: lt_lines[].

  LOOP AT lt_text.
    ON CHANGE OF lt_text-matnr.
      DESCRIBE TABLE lt_lines LINES l_count.
      IF l_count > 0.
        CALL FUNCTION 'SAVE_TEXT'
          EXPORTING
            header   = ls_header
            insert   = 'I'
          TABLES
            lines    = lt_lines
          EXCEPTIONS
            id       = 1
            language = 2
            name     = 3
            object   = 4
            OTHERS   = 5.
      ENDIF.
      ls_header-tdobject = 'MATERIAL'.
      ls_header-tdname = lt_text-matnr.
      ls_header-tdlinesize = '132'.
      ls_header-tdid = 'GRUN'.
      ls_header-tdspras = sy-langu.

      CLEAR: lt_lines[].
    ENDON.
    MOVE-CORRESPONDING lt_text TO lt_lines.
    APPEND lt_lines.
  ENDLOOP.

  DESCRIBE TABLE lt_lines LINES l_count.
  IF sy-subrc = 0.
    CALL FUNCTION 'SAVE_TEXT'
      EXPORTING
        header   = ls_header
      TABLES
        lines    = lt_lines
      EXCEPTIONS
        id       = 1
        language = 2
        name     = 3
        object   = 4
        OTHERS   = 5.
  ENDIF.
  CALL FUNCTION 'COMMIT_TEXT'
    IMPORTING
      commit_count = l_count.
  IF l_count > 0. COMMIT WORK. ENDIF.
ENDFORM.                    " SAVE_TEXT

Оффлайн Паганель

  • Administrator
  • Full Member
  • *****
  • Сообщений: 1 367
  • Репутация: +20/-0
  • Пол: Мужской
  • http://www.noteifyapp.com
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • MacPlus Software
Re: YTSH_SAVE_LONG_TEXT - Загрузка длинных текстов ОЗМ
« Ответ #1 : Февраль 24, 2014, 02:53:03 pm »
В продолжение темы, единственный недостаток приведенного примера, это ИМХО не совсем удобная структура файла для загрузки, по этому немного модифицировал

На вход подаеться файл формата:
[код материала] <tab> [длинный текст]

Код: You are not allowed to view links. Register or Login

report zmm_ozm_load_longtext.
tables: rlgrap.

parameters: p_file like rlgrap-filename default 'C:\1.cvs'.


*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
data: begin of lt_text occurs 1,
  matnr like mara-matnr,
  tdformat like tline-tdformat,
  tdline like tline-tdline,
end of lt_text.

data: begin of lt_raw_text occurs 1,
  matnr like mara-matnr,
  longtext type string,
end of lt_raw_text.

*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
at selection-screen on value-request for p_file.
  call function 'WS_FILENAME_GET'
    exporting
      def_filename     = ''
      def_path         = 'C:\'
      mask             = ',*.cvs,*.*.'
      mode             = 'O'
      title            = 'Данные для загрузки'
    importing
      filename         = p_file
    exceptions
      inv_winsys       = 1
      no_batch         = 2
      selection_cancel = 3
      selection_error  = 4
      others           = 5.



*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
start-of-selection.
  perform read_text.
  perform convert_text.
  perform save_text.


*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Form  READ_TEXT
*&---------------------------------------------------------------------*
*       Прочитать файл с даннами
*----------------------------------------------------------------------*
*  <--  LT_TEXT - Данные загруженные для обработки
*----------------------------------------------------------------------*
form read_text.
  data: l_filename type string,
        l_filelength like sy-tabix.

  l_filename = p_file.
  call method cl_gui_frontend_services=>gui_upload
    exporting
      filename                = l_filename
      filetype                = 'DAT'
    importing
      filelength              = l_filelength
    changing
      data_tab                = lt_raw_text[]
    exceptions
      file_open_error         = 1
      file_read_error         = 2
      no_batch                = 3
      gui_refuse_filetransfer = 4
      invalid_type            = 5
      no_authority            = 6
      unknown_error           = 7
      bad_data_format         = 8
      header_not_allowed      = 9
      separator_not_allowed   = 10
      header_too_long         = 11
      unknown_dp_error        = 12
      access_denied           = 13
      dp_out_of_memory        = 14
      disk_full               = 15
      dp_timeout              = 16
      not_supported_by_gui    = 17
      error_no_gui            = 18
      others                  = 19.
  if sy-subrc <> 0. message 'Ошибка чтения файла с данными' type 'I'. exit. endif.
endform.                    " READ_TEXT

*&---------------------------------------------------------------------*
*&      Form  convert_text
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
form convert_text.
  data: l_line(3000) type c . " ?????  уточнить длину

  data: begin of lt_temp_lines occurs 10,
    line(132) type c,
  end of lt_temp_lines.




  loop at lt_raw_text.

    clear: lt_temp_lines[].

    l_line = lt_raw_text-longtext.

    call function 'RKD_WORD_WRAP'
       exporting
         textline                  = l_line
         delimiter                 = '  '
         outputlen                 = 132
*        IMPORTING
*          OUT_LINE1                 =
*          OUT_LINE2                 =
*          OUT_LINE3                 =
       tables
         out_lines                 = lt_temp_lines
      exceptions
        outputlen_too_large       = 1
        others                    = 2.

    loop at lt_temp_lines.

      lt_text-matnr = lt_raw_text-matnr.

      if sy-tabix = 1.
        lt_text-tdformat = '/='.
      else.
        lt_text-tdformat = '/'.
      endif.

      lt_text-tdline = lt_temp_lines-line.

      append lt_text.

    endloop.


  endloop.


endform.                    "convert_text

*&---------------------------------------------------------------------*
*&      Form  save_text
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
form save_text.
  data: l_count like sy-tabix,
        ls_header like thead,
        lt_lines like tline occurs 1 with header line.

  sort lt_text by matnr.
  "CLEAR: lt_lines[].

  loop at lt_text.
    on change of lt_text-matnr.

      describe table lt_lines lines l_count.


      if l_count > 0.
        call function 'SAVE_TEXT'
          exporting
            header   = ls_header
            insert   = 'I'
          tables
            lines    = lt_lines
          exceptions
            id       = 1
            language = 2
            name     = 3
            object   = 4
            others   = 5.
      endif.

      ls_header-tdobject = 'MATERIAL'.
      ls_header-tdname = lt_text-matnr.
      ls_header-tdlinesize = '132'.
      ls_header-tdid = 'GRUN'.
      ls_header-tdspras = sy-langu.

      clear: lt_lines[].
    endon.

    move-corresponding lt_text to lt_lines.


    append lt_lines.
  endloop.

  describe table lt_lines lines l_count.
  if sy-subrc = 0.
    call function 'SAVE_TEXT'
      exporting
        header   = ls_header
      tables
        lines    = lt_lines
      exceptions
        id       = 1
        language = 2
        name     = 3
        object   = 4
        others   = 5.
  endif.
  call function 'COMMIT_TEXT'
    importing
      commit_count = l_count.
  if l_count > 0. commit work. endif.
endform.                    " SAVE_TEXT
---
FYI (особенно это касается рекрутеров)
Я НЕ ЗАНИМАЮСЬ САП, уже более 4х лет!
По вопросам SAP - НЕ БЕСПОКОИТЬ
---
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login