美文网首页
ABAP报表数据处理:本地文件upload &&

ABAP报表数据处理:本地文件upload &&

作者: hitammy | 来源:发表于2016-12-01 16:22 被阅读648次

    无论是upload还是download,首先要确定文件的路径和名字。再将文件数据upload到内表或是将内表数据download到本地文件。

    一、 打开文件选择框,确定文件的路径和名字(以下几种方法皆可)
    • 使用FM: WS_FILENAME_GET
    DATA s_file LIKE rlgrap-filename.
    CALL FUNCTION 'WS_FILENAME_GET'
     EXPORTING
       DEF_FILENAME           = '工资单.XLS '              "默认文件名
       DEF_PATH               = 'd: '                      "当前路径
       MASK                   = ',*.TXT. '                 "文件格式:All Files (*.*)|*.*|Excel Files (*.xls)|*.xls|Word files(*.doc)|*.doc
       MODE                   = 'O '                       "S = 保存,O = 打开
     "  TITLE                  = ' '                       "设置对话框名称
     IMPORTING
       FILENAME               = s_file
     "  RC                     =
     EXCEPTIONS
       INV_WINSYS             = 1
       NO_BATCH               = 2
       SELECTION_CANCEL       = 3
       SELECTION_ERROR        = 4
       OTHERS                 = 5 .
    
    • 使用FM: F4_FILENAME
    CALL FUNCTION 'F4_FILENAME'
     EXPORTING
       PROGRAM_NAME        = SYST-CPROG       "当前程序名
       DYNPRO_NUMBER       = SYST-DYNNR       "当前屏幕编号
       FIELD_NAME          = ' '              "指定字段帮助
     IMPORTING
       FILE_NAME           = s_file           "获取到的文件名
    
    • 使用FM: KD_GET_FILENAME_ON_F4
    CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
      CHANGING
        file_name           = s_file
     EXCEPTIONS
       MASK_TOO_LONG       = 1
       OTHERS              = 2.
    
    • 使用Class cl_gui_frontend_services的静态方法file_open_dialog
      此方法功能强大,可以修饰文件选择框,指定默认选择路径,设置文件类型过滤,同时打开多个文件,返回用户操作等
    DATA: it_tab TYPE filetable,
          gb_rc TYPE i.
    CALL METHOD cl_gui_frontend_services=>file_open_dialog
      EXPORTING
        window_title            =  'Select File'
        default_extension       = '*.xls'
        default_filename        = ' '
        file_filter             = cl_gui_frontend_services=>filetype_excel "文件过滤:或者All Files (*.*)|*.*|Excel Files (*.xls)|*.xls|Word files(*.doc)|*.doc'
        initial_directory       = 'C:'
        multiselection          = 'X'       "是否可以同时打开多个文件
      CHANGING
        file_table              =  it_tab
        rc                      =  gb_rc
      EXCEPTIONS
        file_open_dialog_failed = 1
        cntl_error              = 2
        error_no_gui            = 3
        not_supported_by_gui    = 4
        others                  = 5 .
    
    二、 文件upload方法(转成内表)
    • 最常用FM:GUI_UPLOAD
      有同等作用的是CLASS METHOD:* cl_gui_frontend_services=>gui_upload*,文件可以按二进制或文本格式上传,数值和日期等依赖于用户的设置。上传二进制文件时,内表通常定义为只含一个数据类型为X的field。
    DATA: BEGIN OF itab OCCURS 0,
          raw(255) TYPE x,
          END OF itab.
    CALL FUNCTION 'GUI_UPLOAD'
      EXPORTING
        filename               = 'E:\02 sap文档自建 '     "要上载文件的完整路径
        filetype               = 'ASC'                    "ASC/BIN/DAT
       CODEPAGE                      = ' '                "以数字编号的字符集,如8400是简体中文
      TABLES
        data_tab                      = itab              " 储存文件中数据的内表
     EXCEPTIONS
       file_open_error               = 1
       file_read_error               = 2
       no_batch                      = 3
       gui_refuse_filetransfer       = 4
       invalid_type                  = 5
       no_authority                  = 6 .```
    - 上传excel数据可用FM: TEXT_CONVERT_XLS_TO_SAP
    因为输出的I_TAB_CONVERTED_DATA类型为任意的standard table,所以此FM能方便的把excel中内容转化成格式相同的内表中,还可以去掉首行。
    

    TYPE-POOLS truxs.
    DATA:it_raw TYPE truxs_t_text_data.
    DATA: BEGIN OF gt_data OCCURS 0,
    col1 TYPE char10,
    col2 TYPE char10,
    END OF gt_data.
    PARAMETERS:p_file TYPE rlgrap-filename.

    *在p_file上点击F4时触发,获取文件名
    AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
    CLEAR p_file.
    CALL FUNCTION 'F4_FILENAME'
    IMPORTING
    file_name = p_file. "返回文件名

    Excel传值
    START-OF-SELECTION.
    CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
    EXPORTING
    i_tab_raw_data = it_row
    i_filename = p_file
    TABLES
    i_tab_converted_data = gt_data "
    存储数据的内表,内表列数和要上传的数据列数相同,其按照列来匹配传值
    EXCEPTIONS
    conversion_failed = 1
    OTHERS = 2.

    - 使用FM:ALSM_EXCEL_TO_INTERNAL_TABLE
    1)此FM可以限制从excel文件中第几行第几列开始,一次上传多少行多少列,但一次上传的最大行数为9999,,是由接收数据的内表intern的定义来限制的。如果要上传多于9999行的数据,要编码分批上传实现的。
    2)而intern不是直接与excel数据格式相符的内表,是系统定义好的,包含了行号、列号、数据值等。要先loop这个intern内表,再一条一条传到自定义格式内表中去
    

    DATA lt_excel TYPE TABLE OF alsmex_tabline WITH HEADER LINE.
    DATA l_index LIKE sy-tabix.
    PARAMETERS:p_file TYPE rlgrap-filename.

    CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
    filename = p_file
    i_begin_col = '1'
    i_begin_row = '2'
    i_end_col = '50'
    i_end_row = '50000'
    TABLES
    intern = lt_excel
    EXCEPTIONS
    inconsistent_parameters = 1
    upload_ole = 2
    OTHERS = 3.

    *将EXCEL格式中的数据导入到内表itab中
    LOOP AT lt_excel.
    MOVE lt_excel-col TO l_index.
    CASE l_index.
    WHEN'1'.
    MOVE lt_excel-value TO itab-d_name.
    WHEN'2'.
    MOVE lt_excel-value TO itab-d_text.
    WHEN'3'.
    MOVE lt_excel-value TO itab-d_type.
    WHEN'4'.
    MOVE lt_excel-value TO itab-d_caracters.
    ENDCASE.
    AT END OF row.
    APPEND itab.
    CLEAR itab.
    ENDAT.
    ENDLOOP.
    **********************************或者按如下方式:********************************
    FIELD-SYMBOLS : <$fs>.
    DATA exception TYPE REF TO cx_root.
    SORT lt_excel BY row col.
    TRY.
    LOOP AT lt_excel.
    MOVE lt_excel-col TO index.
    ASSIGN COMPONENT index OF STRUCTURE i_table TO <$fs>.
    MOVE lt_excel-value TO <$fs>.
    AT END OF row.
    APPEND i_table. "user defined internal table to store excel data
    CLEAR i_table.
    ENDAT.
    ENDLOOP.
    CATCH cx_root INTO exception.
    MESSAGE 'Excel data format is wrong,please check' TYPE 'E'.
    ENDTRY.

    
    #####三、 文件download方法(内表->文件)
    - 最常用FM: gui_download
    等同于 cl_gui_frontend_services=>gui_download
    

    先获取导出文件名,然后如下:
    call method
    cl_gui_frontend_services=>gui_download
    exporting

    • BIN_FILESIZE =
      filename = s_file
      filetype = 'DAT' " ASC,WK1
    • APPEND = ' '
      changing
      data_tab = ot_data[]
      exceptions
      file_write_error = 1
      no_batch = 2
      gui_refuse_filetransfer = 3
      invalid_type = 4
      no_authority = 5.
    参数简述:
    1)BIN_FILESIZE:当要创建二进制文件时,必须指定文件长度,但要下载成文本文件时,传入此参数会报 FILESIZE_NIT_ALLOWED错误。2)FILENAME:要存放文件的完整路径。要保证路径有效并且如果文件存在的话没有被打开,否则会报错。
    3)FILETYPE: 
    ** 'ASC'**——ASCII格式文件,此参数会受到CODEPAGE等其他参数的影响。      
    **'IBM'**——ASCII文件,但只能包含IBM字符集的字符(CODEPAGE = '1103'),这种格式的文件通常用在软盘上。   
    **'DAT'**——具有单元格形式的文本文件,但直接用excel打开的话,文本内容会受单元格格式影响(如自动会去前导零等)。这种文件可直接再用gui_upload上传到SAP程序中。   
    **'DBF'**——dBase格式,对于要用excel打开的数据,此种格式更能保持数据原型,不受excel单元格格式的影响。  
    **'WK1'**——Lotus 1-2-3格式。   
    **'BIN'**——二进制格式文件,没有格式和字体集的限制。
    4)APPEND:'X'以追加模式写文件,SPACE 当文件已存在时,以覆盖模式写文件。
    5)CODEPAGE 指定写文件时用的字符集DATA_TAB 内表,包含要下载成文件的数据
    ---

    相关文章

      网友评论

          本文标题:ABAP报表数据处理:本地文件upload &&

          本文链接:https://www.haomeiwen.com/subject/vogbpttx.html