Текущее время: Вт, июл 22 2025, 08:34

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: Выгрузка в DBF на сервер приложений
СообщениеДобавлено: Чт, июн 16 2011, 11:35 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Чт, дек 07 2006, 16:32
Сообщения: 131
Откуда: Украина, Мариуполь
Пол: Мужской
Здравствуйте уважаемые коллеги. Возникла задача выгружать DBF файл на сервер приложений с помощью OPEN DATASET... Стандартного решения не нашел и поэтому взял процедуру из ФМ GUI_DOWNLOAD которая срабатывает при выгрузке в формате DBF. На ее основе слепил собственный ФМ.

Бинарный массив во внутренней таблице prc_hex_tab получается вроде бы то что надо, но после выгрузки через OPEN DATASET в конец файла дописываются непонятные байты из-за которых DBF-ка читается некорректно. Не могу понять как от них избавиться?

Ниже код ФМ и программа для его тестирования в которой файл test1.dbf выгружается локально с помощью стандартного GUI_DOWNLOAD а test2.dbf удаленно через мой ФМ. Версия системы 6.0.

Нормальный файл test1.dbf
Изображение

Файл test2.dbf с непонятными байтами
Изображение

Код ФМ:
Code:
FUNCTION zdbf_download.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  IMPORTING
*"     REFERENCE(FILENAME) TYPE  STRING
*"     REFERENCE(ENCODING) TYPE  CHAR20
*"  TABLES
*"      DATA_TAB
*"      FIELD_TAB
*"----------------------------------------------------------------------

  PERFORM dbf_download
            TABLES
               data_tab
               field_tab
            USING
               filename
               ''
               ''
               encoding
               'X'
               ''.

ENDFUNCTION.

*&---------------------------------------------------------------------*
*&      Form  dbf_download
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->PAR_DATA_TAB          text
*      -->PAR_FIELD_NAMES       text
*      -->PAR_FILENAME          text
*      -->PAR_COL_SELECT        text
*      -->PAR_COL_SELECT_MASK   text
*      -->PAR_ENCODING          text
*      -->PAR_IGNORE_CERR       text
*      -->PAR_REPLACEMENT_CHAR  text
*----------------------------------------------------------------------*
FORM dbf_download  TABLES par_data_tab
                          par_field_names
                   USING
                          par_filename          TYPE string
                          par_col_select        TYPE c
                          par_col_select_mask   TYPE c
                          par_encoding          TYPE abap_encoding
                          par_ignore_cerr       TYPE abap_bool
                          par_replacement_char  TYPE abap_repl.



  DATA: prc_lines_count   TYPE i,
        prc_all_columns_count TYPE i,  " columns including invalid types
        prc_columns_count TYPE i,      " columns including valid types
        prc_column_idx    TYPE i,
        prc_data_type     TYPE c,
        prc_output_length TYPE i,
        prc_dpts_length   TYPE i,
        prc_column_name(256)  TYPE c,
        prc_column_name_str   TYPE string,
        prc_column_value(256) TYPE c,
        prc_column_value_str  TYPE string,
        prc_dbf_data_type TYPE c,
        prc_table_type TYPE c,
        prc_output_string TYPE xstring.

  FIELD-SYMBOLS: <f>    TYPE ANY,
                 <name> TYPE c.

*----------------------------------------------------------------------*
*** Determine parameters
*----------------------------------------------------------------------*

  DESCRIBE TABLE par_data_tab LINES prc_lines_count.
  DESCRIBE FIELD par_data_tab TYPE  prc_table_type
    COMPONENTS prc_all_columns_count.

*----------------------------------------------------------------------*
*** Convert par_replacement_char into ABAP character number
*----------------------------------------------------------------------*

  DATA: prc_conv    TYPE REF TO cl_abap_conv_out_ce,
        prc_xstr_no TYPE xstring,
        prc_i_no    TYPE i,
        prc_sapno   TYPE cpcharno,
        prc_space   TYPE string.

  TRY.
      CALL METHOD cl_abap_conv_out_ce=>create
        EXPORTING
          encoding = '4000'
        RECEIVING
          conv     = prc_conv.
    CATCH cx_parameter_invalid_range .
      MESSAGE ID 'FES' TYPE 'E' NUMBER '023' RAISING unknown_error.
    CATCH cx_sy_codepage_converter_init .
      MESSAGE ID 'FES' TYPE 'E' NUMBER '024' RAISING unknown_error.
  ENDTRY.
*----------------------------------------------------------------------*
*** Setup codepage converter
*----------------------------------------------------------------------*

  DATA: converter       TYPE REF TO cl_abap_conv_obj,
        prc_codepage(4) TYPE n,
        prc_miss        TYPE c,
        prc_broken      TYPE c.

  IF par_ignore_cerr = abap_true.
    prc_miss   = 'S'.
    prc_broken = 'M'.
  ELSE.
    prc_miss   = '.'.
    prc_broken = '.'.
  ENDIF.

  prc_codepage = par_encoding.

  CREATE OBJECT converter
    EXPORTING
      outcode          = prc_codepage
      miss             = prc_miss
      broken           = prc_broken
      use_f1           = 'X'
      substc           = prc_sapno
    EXCEPTIONS
      invalid_codepage = 1
      internal_error   = 2.

  IF sy-subrc <> 0.
    CASE sy-subrc.
      WHEN 1.
        MESSAGE ID 'FES' TYPE 'E' NUMBER '023' RAISING unknown_error.
      WHEN 2.
        MESSAGE ID 'FES' TYPE 'E' NUMBER '024' RAISING unknown_error.
    ENDCASE.
  ENDIF.

*----------------------------------------------------------------------*
*** Write header
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
*** BYTES: [0] : Version
*----------------------------------------------------------------------*
  DATA: prc_version_number    TYPE x VALUE 3.
  CONCATENATE prc_output_string prc_version_number
    INTO prc_output_string
    IN BYTE MODE.

  DATA: prc_day        TYPE x,
        prc_month      TYPE x,
        prc_year(2)    TYPE x,
        prc_year_short TYPE x.

*----------------------------------------------------------------------*
*** BYTES: [1] - [3]: Date of last change
*----------------------------------------------------------------------*

  MOVE sy-datum(4) TO prc_year.
  prc_year_short = prc_year - 1900.
  MOVE sy-datum+4(2) TO prc_month.
  MOVE sy-datum+6(2) TO prc_day.
  CONCATENATE prc_output_string prc_year_short prc_month prc_day
    INTO prc_output_string
    IN BYTE MODE.

*----------------------------------------------------------------------*
*** Scan columns
*----------------------------------------------------------------------*

  DATA: prc_enc_column_name   TYPE xstring,
        prc_enc_dbf_data_type TYPE xstring,
        prc_enc_column_data   TYPE xstring,
        prc_enc_column_value  TYPE xstring,
        prc_enc_all_columns   TYPE xstring,
          prc_rec_len           TYPE i VALUE 1,
          prc_col_select        TYPE c,
          prc_col_mask_offset   TYPE i,
          prc_col_mask_length   TYPE i. " Add 1 for additional SPACE

  prc_column_idx = 1.

  prc_col_select = par_col_select.

  " prc_columns_count   = prc_all_columns_count.
  prc_columns_count   = 0.

  prc_col_mask_length = STRLEN( par_col_select_mask ).

  WHILE prc_column_idx <= prc_all_columns_count.

    "--- Select Columns for Header ----------------------------------*
    IF par_col_select IS INITIAL.
      prc_col_select = 'X'.
    ELSE.
      prc_col_mask_offset = prc_column_idx - 1.
      IF prc_col_mask_offset >= prc_col_mask_length.
        CLEAR prc_col_select.
      ELSE.
        MOVE par_col_select_mask+prc_col_mask_offset(1)
        TO prc_col_select.
      ENDIF.
    ENDIF.

    CLEAR prc_column_name.
    IF prc_col_select IS NOT INITIAL.
      "--- End of Select Columns for Header ---------------------------*

      ASSIGN COMPONENT prc_column_idx OF STRUCTURE par_data_tab TO <f>.
      DESCRIBE FIELD <f> TYPE          prc_data_type
                         OUTPUT-LENGTH prc_output_length.

      READ TABLE par_field_names INDEX prc_column_idx.

      IF sy-subrc = 0.
        ASSIGN COMPONENT 1 OF STRUCTURE par_field_names TO <name>.
        prc_column_name = <name>.
      ELSE.
        prc_column_name = 'F'.
        WRITE prc_column_idx TO prc_column_name+1.
      ENDIF.
      CONDENSE prc_column_name NO-GAPS.

      prc_dpts_length = 0.
      prc_dbf_data_type = prc_data_type.

      IF prc_data_type = 'C' OR prc_data_type = 'D'.
        DESCRIBE FIELD <f> LENGTH prc_output_length IN CHARACTER MODE.
      ENDIF.

      CASE prc_data_type.
        WHEN 'C'.
        WHEN 'X'.
          prc_dbf_data_type = 'C'.
          prc_output_length = prc_output_length + 1.         "// leading 'x'
        WHEN 'P' OR 'N'.
          IF prc_output_length < 20.
            prc_dbf_data_type = 'N'.
            DESCRIBE FIELD <f> DECIMALS prc_dpts_length.
          ELSE.                      "// Typ C
            prc_dbf_data_type = 'C'.
          ENDIF.
        WHEN 'I'.
          prc_dbf_data_type = 'N'.
        WHEN 'F'.
          prc_dbf_data_type = 'C'.
        WHEN 's'.
          prc_dbf_data_type = 'N'.
          prc_output_length = 6.
        WHEN 'b'.
          prc_dbf_data_type = 'N'.
          prc_output_length = 3.
        WHEN 'D'.
          prc_output_length = 8.
        WHEN 'T'.
          prc_dbf_data_type = 'C'.
*        prc_output_length = 6.
        WHEN OTHERS.
          CLEAR prc_dbf_data_type.
          prc_columns_count = prc_columns_count - 1.
      ENDCASE.

      prc_column_name_str = prc_column_name.

      IF NOT prc_dbf_data_type IS INITIAL.

        prc_rec_len = prc_rec_len + prc_output_length.

        CALL METHOD converter->convert
          EXPORTING
            inbuff         = prc_column_name_str
            inbufflg       = 0
            outbufflg      = 0
          IMPORTING
            outbuff        = prc_enc_column_name
          EXCEPTIONS
            internal_error = 1
            OTHERS         = 2.
        IF sy-subrc <> 0.
          CASE sy-subrc.
            WHEN 1.
              MESSAGE ID 'FES' TYPE 'E' NUMBER '024'
                RAISING unknown_error.
            WHEN 2.
              MESSAGE ID 'FES' TYPE 'E' NUMBER '024'
                RAISING unknown_error.
          ENDCASE.
        ENDIF.

        CALL METHOD converter->convert
          EXPORTING
            inbuff         = prc_dbf_data_type
            inbufflg       = 0
            outbufflg      = 0
          IMPORTING
            outbuff        = prc_enc_dbf_data_type
          EXCEPTIONS
            internal_error = 1
            OTHERS         = 2.
        IF sy-subrc <> 0.
          CASE sy-subrc.
            WHEN 1.
              MESSAGE ID 'FES' TYPE 'E' NUMBER '024'
                RAISING unknown_error.
            WHEN 2.
              MESSAGE ID 'FES' TYPE 'E' NUMBER '024'
                RAISING unknown_error.
          ENDCASE.
        ENDIF.

        PERFORM buildcolumninfo USING prc_enc_column_name
                                      prc_enc_dbf_data_type
                                      prc_output_length
                                      prc_dpts_length
                                CHANGING prc_enc_column_data.

        CONCATENATE prc_enc_all_columns prc_enc_column_data
          INTO prc_enc_all_columns
          IN BYTE MODE.
      ENDIF.

      ADD 1 TO prc_columns_count. "--- COL_SELECT

    ENDIF.
    prc_column_idx = prc_column_idx + 1.


  ENDWHILE.

*----------------------------------------------------------------------*
*** BYTES: [4] - [7]: number of rows
*** BYTES: [8] - [9]: header length
*----------------------------------------------------------------------*

  DATA: prc_hex_lines_count(4)    TYPE x,
        prc_hex_lines_count_le(4) TYPE x,
        prc_header_len            TYPE i,
        prc_hex_header_len(2)     TYPE x.

  MOVE prc_lines_count TO prc_hex_lines_count.

  prc_header_len = prc_columns_count * 32.
  prc_header_len = prc_header_len + 33.
  MOVE prc_header_len TO prc_hex_header_len.

* Convert to little-endian
  MOVE prc_lines_count TO prc_hex_lines_count.

  MOVE prc_hex_lines_count(1) TO prc_hex_lines_count_le+3(1).
  MOVE prc_hex_lines_count+1(1) TO prc_hex_lines_count_le+2(1).
  MOVE prc_hex_lines_count+2(1) TO prc_hex_lines_count_le+1(1).
  MOVE prc_hex_lines_count+3(1) TO prc_hex_lines_count_le(1).

  CONCATENATE prc_output_string prc_hex_lines_count_le
              prc_hex_header_len+1 prc_hex_header_len(1)
    INTO prc_output_string
    IN BYTE MODE.

*----------------------------------------------------------------------*
*** BYTES: [10] - [11]: record length
*----------------------------------------------------------------------*
  DATA: prc_hex_rec_len(2) TYPE x.
  MOVE prc_rec_len TO prc_hex_rec_len.
  CONCATENATE prc_output_string prc_hex_rec_len+1 prc_hex_rec_len(1)
    INTO prc_output_string
    IN BYTE MODE.

*----------------------------------------------------------------------*
*** BYTES: [12] - [31]: 0x00
*----------------------------------------------------------------------*
  PERFORM addzerobytes USING 20
                       CHANGING prc_output_string.

*----------------------------------------------------------------------*
*** Column description
*----------------------------------------------------------------------*
  CONCATENATE prc_output_string prc_enc_all_columns
    INTO prc_output_string
    IN BYTE MODE.

*----------------------------------------------------------------------*
*** End of Header
*----------------------------------------------------------------------*
  DATA: prc_end_of_header TYPE x VALUE 13.
  CONCATENATE prc_output_string prc_end_of_header INTO prc_output_string
    IN BYTE MODE.

  DATA: prc_val_tmp(40)   TYPE c,
        prc_enc_value_len TYPE i,
        prc_spaces_to_add TYPE i,
        prc_do_append     TYPE c.

  LOOP AT par_data_tab.

    PERFORM addspaces USING 1
                      CHANGING prc_output_string.

    prc_column_idx = 1.
    WHILE prc_column_idx <= prc_all_columns_count.

      "--- Select Columns for data ----------------------------------*
      IF par_col_select IS INITIAL.
        prc_col_select = 'X'.
      ELSE.
        prc_col_mask_offset = prc_column_idx - 1.
        IF prc_col_mask_offset >= prc_col_mask_length.
          CLEAR prc_col_select.
        ELSE.
          MOVE par_col_select_mask+prc_col_mask_offset(1)
          TO prc_col_select.
        ENDIF.
      ENDIF.

      CLEAR prc_column_name.
      IF prc_col_select IS NOT INITIAL.
        "--- End of Select Columns for Header -------------------------*

        ASSIGN COMPONENT prc_column_idx OF STRUCTURE par_data_tab TO <f>.

        DESCRIBE FIELD <f> TYPE prc_data_type
                           OUTPUT-LENGTH prc_output_length.
        DESCRIBE FIELD <f> DECIMALS prc_dpts_length.

        prc_do_append = 'X'.

        IF prc_data_type = 'C' OR prc_data_type = 'D'.
          DESCRIBE FIELD <f> LENGTH prc_output_length IN CHARACTER MODE.
        ENDIF.

        CASE prc_data_type.
          WHEN 'C' OR 'D' OR 'T'.
            prc_column_value =  <f>.
          WHEN 'X'.
            prc_column_value = 'x'.
            WRITE <f> TO prc_column_value+1.
            CONDENSE prc_column_value NO-GAPS.
          WHEN 'P' OR 'I' OR 'N' OR 'b' OR 's'.
            CLEAR prc_val_tmp.
            IF <f> < 0.
              MOVE <f> TO prc_val_tmp+1.
              TRANSLATE prc_val_tmp USING '- '.
              WRITE '-' TO prc_val_tmp(1).
            ELSE.
              MOVE <f> TO prc_val_tmp.
            ENDIF.
            CONDENSE prc_val_tmp NO-GAPS.

*         Write number right-aligned
            DATA: prc_val_tmp_len TYPE i,
                  prc_shift_len TYPE i.

            prc_val_tmp_len = STRLEN( prc_val_tmp ).

            prc_shift_len = prc_output_length - prc_val_tmp_len.
            IF prc_shift_len > 0.
              SHIFT prc_val_tmp BY prc_shift_len PLACES RIGHT.
            ENDIF.

            prc_column_value = prc_val_tmp.
          WHEN 'F'.
            CLEAR prc_val_tmp.
            IF <f> = 0.
              prc_val_tmp = '0'.
            ELSE.
              WRITE <f> TO prc_val_tmp EXPONENT 0.
            ENDIF.
            TRANSLATE prc_val_tmp USING ',.'.
            CONDENSE prc_val_tmp NO-GAPS.
            prc_column_value = prc_val_tmp.
          WHEN OTHERS.               "// nothing, no append
            CLEAR prc_do_append.
        ENDCASE.

        IF NOT prc_do_append IS INITIAL.
          prc_column_value_str = prc_column_value.
          CALL METHOD converter->convert
            EXPORTING
              inbuff         = prc_column_value_str
              inbufflg       = 0
              outbufflg      = 0
            IMPORTING
              outbuff        = prc_enc_column_value
            EXCEPTIONS
              internal_error = 1
              OTHERS         = 2.
          IF sy-subrc <> 0.
            CASE sy-subrc.
              WHEN 1.
                MESSAGE ID 'FES' TYPE 'E' NUMBER '024'
                  RAISING unknown_error.
              WHEN 2.
                MESSAGE ID 'FES' TYPE 'E' NUMBER '024'
                  RAISING unknown_error.
            ENDCASE.
          ENDIF.

          CONCATENATE prc_output_string prc_enc_column_value INTO prc_output_string
            IN BYTE MODE.

          prc_enc_value_len = XSTRLEN( prc_enc_column_value ).

          prc_spaces_to_add = prc_output_length - prc_enc_value_len.

          PERFORM addspaces USING prc_spaces_to_add
                               CHANGING prc_output_string.
        ENDIF.

      ENDIF.
      prc_column_idx = prc_column_idx + 1.

    ENDWHILE.
  ENDLOOP.

*----------------------------------------------------------------------*
*** End of table marker
*----------------------------------------------------------------------*
  DATA: prc_end_of_table TYPE x VALUE 26.
  CONCATENATE prc_output_string prc_end_of_table INTO prc_output_string
    IN BYTE MODE.

*----------------------------------------------------------------------*
*** Send data to dataprovider
*----------------------------------------------------------------------*
  DATA: BEGIN OF hex_record,
          myhex(1024) TYPE x,
        END OF hex_record.

  DATA: prc_hex_tab LIKE hex_record OCCURS 1 WITH HEADER LINE,
        prc_bin_filesize TYPE i,
        prc_rest         TYPE i,
        prc_dp_error     TYPE i VALUE 0,
        prc_dp_sysubrc   TYPE i VALUE 0.

  prc_bin_filesize = XSTRLEN( prc_output_string ).
  prc_rest = prc_bin_filesize.

  WHILE prc_rest > 1024.
    prc_hex_tab-myhex = prc_output_string(1024).
    APPEND prc_hex_tab.
    MOVE prc_output_string+1024 TO prc_output_string.
    prc_rest = prc_rest - 1024.
  ENDWHILE.

  IF prc_rest > 0.
    prc_hex_tab-myhex = prc_output_string.
    APPEND prc_hex_tab.
  ENDIF.
**********************************************************************
  DATA v_path TYPE text255.

  v_path = par_filename.

  DELETE DATASET v_path.
  OPEN DATASET v_path FOR OUTPUT IN BINARY MODE.
  LOOP AT prc_hex_tab.
    TRANSFER prc_hex_tab TO v_path.
  ENDLOOP.
  CLOSE DATASET v_path.

**********************************************************************
ENDFORM.                    " dbf_download

*&---------------------------------------------------------------------*
*&      Form  BuildColumnInfo
*&---------------------------------------------------------------------*
FORM buildcolumninfo  USING    par_enc_column_name   TYPE xstring
                               par_enc_dbf_data_type TYPE xstring
                               par_output_length     TYPE i
                               par_dpts_length       TYPE i
                      CHANGING par_column_data       TYPE xstring.

  DATA: prc_name_len      TYPE i,
        prc_bytes_to_add  TYPE i,
        prc_output_length TYPE x,
        prc_dpts_length   TYPE x.

  prc_name_len = XSTRLEN( par_enc_column_name ).
  IF prc_name_len > 10.
    prc_name_len = 10.
    par_column_data = par_enc_column_name(10).
  ELSE.
    par_column_data  = par_enc_column_name.
  ENDIF.
  prc_bytes_to_add = 11 - prc_name_len.

  PERFORM addzerobytes USING prc_bytes_to_add
                       CHANGING par_column_data.

  CONCATENATE par_column_data par_enc_dbf_data_type INTO par_column_data
    IN BYTE MODE.

  prc_bytes_to_add = 4.

  PERFORM addzerobytes USING prc_bytes_to_add
                       CHANGING par_column_data.

  MOVE par_output_length TO prc_output_length.
  MOVE par_dpts_length   TO prc_dpts_length.

  CONCATENATE par_column_data prc_output_length prc_dpts_length
    INTO par_column_data
    IN BYTE MODE.

  prc_bytes_to_add = 14.

  PERFORM addzerobytes USING prc_bytes_to_add
                       CHANGING par_column_data.

ENDFORM.                    " BuildColumnInfo
*&---------------------------------------------------------------------*
*&      Form  AddZeroBytes
*&---------------------------------------------------------------------*
FORM addzerobytes  USING    par_bytes_to_add TYPE i
                   CHANGING par_column_data.

  DATA: i TYPE i,
        x TYPE x.

  i = 0.
  CLEAR x.

  WHILE i < par_bytes_to_add.
    CONCATENATE par_column_data x INTO par_column_data IN BYTE MODE.
    i = i + 1.
  ENDWHILE.
ENDFORM.                    " AddZeroBytes
*&---------------------------------------------------------------------*
*&      Form  AddSpaces
*&---------------------------------------------------------------------*
FORM addspaces  USING    par_spaces_to_add TYPE i
                CHANGING par_column_data.
  DATA: i TYPE i,
        x TYPE x VALUE 32.

  i = 0.

  WHILE i < par_spaces_to_add.
    CONCATENATE par_column_data x INTO par_column_data IN BYTE MODE.
    i = i + 1.
  ENDWHILE.
ENDFORM.                    " AddSpaces

Код программы для тестирования
Code:
*
DATA BEGIN OF gs_file.
DATA field1 TYPE n LENGTH 10.
DATA field2 TYPE c LENGTH 20.
DATA END OF gs_file.
*
DATA BEGIN OF gs_fields.
DATA fieldname TYPE c LENGTH 15.
DATA END OF gs_fields.
*
DATA gt_file LIKE STANDARD TABLE OF gs_file.
*
DATA gt_fields LIKE STANDARD TABLE OF gs_fields.

INITIALIZATION.

  PERFORM fill_data.
  PERFORM fill_fields.

  PERFORM download_dbf1
              TABLES
                 gt_file
                 gt_fields
              USING
                 'd:\test_dbf\test1.dbf'.

  PERFORM download_dbf2
              TABLES
                 gt_file
                 gt_fields
              USING
                 '\\a01\test_dbf\test2.dbf'.



*&---------------------------------------------------------------------*
*&      Form  fill_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM fill_data.
  DATA index TYPE string.
**********************************************************************`
  DO 3 TIMES.
    index = sy-index.
    CLEAR gs_file.
    gs_file-field1 = sy-index.
    CONCATENATE 'Текст' index INTO gs_file-field2 SEPARATED BY space.
    APPEND gs_file TO gt_file.
  ENDDO.
ENDFORM.                    "fill_data
*&---------------------------------------------------------------------*
*&      Form  fill_fields
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM fill_fields.
  CLEAR gt_fields.

  CLEAR gs_fields.
  gs_fields-fieldname = 'FIELD1'.
  APPEND gs_fields TO gt_fields.

  CLEAR gs_fields.
  gs_fields-fieldname = 'FIELD2'.
  APPEND gs_fields TO gt_fields.
ENDFORM.                    "fill_fields

*&---------------------------------------------------------------------*
*&      Form  download_dbf
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->IT_DATA    text
*      -->IT_FIELDS  text
*      -->IV_FNAME   text
*----------------------------------------------------------------------*
FORM download_dbf1 TABLES
                    it_data
                    it_fields
                  USING
                    iv_fname.
  CALL FUNCTION 'GUI_DOWNLOAD'
    EXPORTING
      filename                = iv_fname
      filetype                = 'DBF'
      codepage                = '1504 '
    TABLES
      data_tab                = it_data
      fieldnames              = it_fields
    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.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ELSE.
    MESSAGE s145(hrpadrureports) WITH iv_fname.
  ENDIF.
ENDFORM.                    "download_dbf

*&---------------------------------------------------------------------*
*&      Form  download_dbf2
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->IT_DATA    text
*      -->IT_FIELDS  text
*      -->IV_FNAME   text
*----------------------------------------------------------------------*
FORM download_dbf2 TABLES
                    it_data
                    it_fields
                  USING
                    iv_fname.

  CALL FUNCTION 'ZDBF_DOWNLOAD'
    EXPORTING
      filename      = iv_fname
      encoding      = '1504'
    TABLES
      data_tab      = it_data
      field_tab     = it_fields.
ENDFORM.                    "download_dbf2

_________________
я в пути и нет у меня никаких тревог и забот. одинокая лодка моя рассекая волну плывет...


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Выгрузка в DBF на сервер приложений  Тема решена
СообщениеДобавлено: Чт, июн 16 2011, 20:46 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1257
Все очень просто: когда Вы делаете выгрузку построчно вашей внутренней таблицы. в последней строке данные не заполняют строку полностью. Поэтому когда происходит Transfer, последняя запись сливает нулевые символы а не ставит EOF(признак конца файла). Как я вижу решения такие: или сливайте данные в xstring и его уже сливайте в файл, или укажите для последней строки сколько именно нужно байт записывать.

_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


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

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


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

Сейчас этот форум просматривают: Google [Bot]


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

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