• 上载EXCEL到SAP系统的方法之一


    TEXT_CONVERT_XLS_TO_SAP实例

       使用:gui_upload去上传excel数据,每次都出现乱码,不管中文英文都乱码。 至今不知道gui_upload是否支持excel文件上传,。

       使用:ALSM_EXCEL_TO_INTERNAL_TABLE不能使用自定义的格式,必须要定义一个和它规定的格式的内表来接收传来的值,然后要loop内表,再一条一条灌到自定义格式的内表中。

       最后用:TEXT_CONVERT_XLS_TO_SAP,这个函数用起来挺方便,没有乱码现象,还可以去掉首行,最重要的是能返回自己需要的格式的内表,缺点是效率比较慢

    以下是实例:

    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元素,给其加上on value-request事件(在parameters上点击F4时触发)
    PARAMETERS:p_file TYPE rlgrap-filename.
    AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
      CLEAR p_file.
      CALL FUNCTION 'F4_FILENAME'
        IMPORTING
          file_name = p_file."返回文件名
    *Excel传值
      CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
      EXPORTING
    * I_FIELD_SEPERATOR =
    *  i_line_header = 'X'               "X表示带抬头行的EXCEL的抬头行不传进内表,否则EXCEL不要带抬头
      i_tab_raw_data = it_raw            " WORK TABLE
      i_filename = p_file
      TABLES
      i_tab_converted_data = gt_data[]   "ACTUAL DATA
      EXCEPTIONS
      conversion_failed = 1
      OTHERS = 2.
      IF sy-subrc <> 0.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
        WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      ENDIF.
    ENDFORM.                    "exceltotab

    上载函数TEXT_CONVERT_XLS_TO_SAP的问题

    使用上载函数TEXT_CONVERT_XLS_TO_SAP导入数据到SAP系统时,如果数量、金额小于1,则导入时被自动放大1000或100倍(如果数据为3位小数,则放大1000倍,如果数据为2位小数,则放大100倍)。例如:0.500 吨的数量 上载后被此函数自动转换为500吨,被放大了1000倍;0.98 CNY的金额,上载后被此函数自动转换为98 CNY,被放大了100倍。

    处理:方法一

    将上载数据EXCEL中的数量、金额,全部转换为文本(不是只将单元格设置为文本),必须转换为EXCEL单元中左上角为绿色小三角形的文本单元格。设置后再上载此数据,则解决此问题。

    处理:方法二

    修改程序,把上载后内表:数量、金额字段 全部设置为 字符型 ,上载后,使用 replace 命令去除千分位豆号(建议每个数据执行3-5次),然后将相同的数据 赋值 到另一个内表表(字段相同,只是:数量为数量型、金额为金额型).设置后再上载此数据,则解决此问题。

    SAP中本地文件的upload和download的方法

    无论是upload还是download,首先要确定文件的路径和名字。下面介绍几种使用文件选择框的方法:
    -、使用FM F4_FILENAME
    call function 'F4_FILENAME'
        importing
          file_name = filename.
    二、使用FM KD_GET_FILENAME_ON_F4
    call function 'KD_GET_FILENAME_ON_F4'
        changing
          file_name = p_pcfile.
    三、使用FM TB_LIMIT_WS_FILENAME_GET
    此FM可以指定默认选择路径,默认文件名,文件的打开目的(MODE,O为读,S为写)以及文件类型等,返回值FILENAME为文件的全路径。
    四、使用FM WS_FILENAME_GET
    功能同上。例子:

     1 call function 'WS_FILENAME_GET'
     2   exporting
     3     def_filename     = 'invoice.txt'
     4     def_path         = 'c:/windata/'
     5     mask             = ',*.TXT.'
     6     mode             = '0'
     7     title            = 'Find the input file'
     8   importing
     9     filename         = t_filename
    10   exceptions
    11     inv_winsys       = 1
    12     no_batch         = 2
    13     selection_cancel = 3
    14     selection_error  = 4
    15     others           = 5.

    五、使用Class cl_gui_frontend_services的静态方法file_open_dialog.

    此方法功能强大,可以修饰文件选择框,指定默认选择路径,设置文件类型过滤,同时打开多个文件,返回用户操作等,例子:

    call method cl_gui_frontend_services=>file_open_dialog
        exporting
          window_title     = 'Select File'
          default_extension = 'xls'
           file_filter     = cl_gui_frontend_services=>filetype_excel
          multiselection   = ' '
    
        changing
          file_table       = it_tab
          rc               = gd_subrc.

    文件UPLOAD方法(转成内表):

    一、最常用FM的是:GUI_UPLOAD
    有同等作用的是CLASS cl_gui_frontend_services的静态方法gui_upload,文件可以按二进制或文本格式上传,数值和日期等依赖于用户的设置。
    上传二进制文件时,内表通常定义为只含一个数据类型为X的field,如:

    data:begin of itab occurs 0,
     raw(255) type X,
            end fo itab.
    CALL FUNCTION 'GUI_UPLOAD'
               exporting
                  filetype =  'BIN'
                  filename = 'C:/DOWNLOAD.BIN'
               tables
                 data_tab = itab.

    主要参数:输入有filename 要上传文件的完成路径 filetype 包括'BIN' 'DAT' 'ASC'等,codepage 以数字编号的字符集,如8400是简体中文

        输出有data_tab 储存文件中数据的内表
    二、对上传excel数据可用FM TEXT_CONVERT_XLS_TO_SAP
    因为输出的I_TAB_CONVERTED_DATA类型为任意的standard table,所以此FM能方便的把excel中内容转化成格式相同的内表中。

    field-symbols: type standard table.
    call function 'TEXT_CONVERT_XLS_TO_SAP'
        exporting
    *         I_FIELD_SEPERATOR          =
    *         I_LINE_HEADER              =
          i_tab_raw_data             = raw_data
          i_filename                 = excel_file
        tables
          i_tab_converted_data       =
       exceptions
         conversion_failed          = 1
         others                     = 2.

    参数i_tab_raw_data虽为改办field,但好像没什么作用,传入一个空数据也可正常使用。

    三、以另外途径上传excel文件:ALSM_EXCEL_TO_INTERNAL_TABLE

    call function 'ALSM_EXCEL_TO_INTERNAL_TABLE'
        exporting
          filename                = p_file
          i_begin_col             = p_scol
          i_begin_row             = p_srow
          i_end_col               = p_ecol
          i_end_row               = p_erow
        tables
          intern                  = i_intern
        exceptions
          inconsistent_parameters = 1
          upload_ole              = 2
          others                  = 3.

    此FM可以限制从excel文件中第几行第几列开始,一次上传多少行多少列,但一次上传的最大行数为9999,是由接收数据的内表intern的定义来限制的

    所以如果要上传多于9999行的数据,要编码分批上传实现的。而intern不是直接与excel数据格式相符的内表,是系统定义好的,包含了行号、列号、数据值等,具体的
    请参照系统定义,因此要想转成自己定义符合格式的内表,可用下面代码实现:

    field-symbols : <$fs>.
    data  exception type ref to cx_root.
    sort i_intern by row col.
        try.
            loop at i_intern.
              move i_intern-col to index.
              assign component index of structure i_table to <$fs>.
              move i_intern-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_UPLOAD
    CLASS cl_gui_frontend_services的静态方法gui_upload与此功效相同。重要参数有BIN_FILESIZE FILENAME FILETYPE APPEND CODEPAGE DATA_TAB等,正确传入这些参数即可满足大多常见的需求。
    参数简述:BIN_FILESIZE  当要创建二进制的文件进,必须指定文件长度,但要下载成文本文件时,传入此参数会报 FILESIZE_NIT_ALLOWED 错误的。
    FILENAME  要存放文件的完整路径,要保证路径有效并且如果文件存在的话没有被打开,否则会报错。
    FILETYPE  'ASC' ASCII格式文件,此参数会受到CODEPAGE, TRUNC_TRAILING_BLANKS, 和 TRUNC_TRAILING_BLANKS_EOL等参数的影响。
          'IBM' ASCII文件,但只能包含IBM字符集的字符(CODEPAGE = '1103'),这种格式的文件通常用在软盘上。
       'DAT' 具有单元格形式的文本文件,但直接用excel打开的话,文本内容会受单元格格式影响(如自动会去前导零等)。这种文件可直接再用gui_upload上传到SAP程序中。
       'DBF' dBase格式,对于要用excel打开的数据,此种格式更能保持数据原型,不受excel单元格格式的影响。
       'WK1' Lotus 1-2-3格式。
       'BIN' 二进制格式文件,没有格式和字体集的限制。
    APPEND 'X'以追加模式写文件,SPACE 当文件已存在时,以覆盖模式写文件。
    CODEPAGE 指定写文件时用的字符集
    DATA_TAB 内表,包含要下载成文件的数据

    ...

    另注:当要上传在excel中存放的数据时,要注意sap系统中前导0的问题,解决方法可在excel文件中把0补全(调整单元格格式),或者在使用此类数据前,程序做alpha转换,
    使用FM: CONVERSION_EXIT_ALPHA_INPUT, 相反作用的FM: CONVERSION_EXIT_ALPHA_OUTPUT

  • 相关阅读:
    AC 自动机
    [HihoCoder-1424] Asa's Chess Problem
    C++ Tricks
    2017"百度之星"程序设计大赛
    后缀自动机
    ASP教程:gb2312和utf-8乱码问题解决
    cryto-js 常用加密库 md5加密
    nrm是什么?以及nrm的安装与命令
    MongoDB 安装
    koa2 安装与启动
  • 原文地址:https://www.cnblogs.com/ruingy/p/3525780.html
Copyright © 2020-2023  润新知