zoukankan      html  css  js  c++  java
  • abap Excel 导入

    ABAP 将EXECL数据导入SAP内表的几个步骤。

    本文转自:http://blog.csdn.net/szlaptop/article/details/8663451
       http://www.cnblogs.com/VerySky/articles/3204361.html

    引用共同学习;

    经常遇到将外部数据大批量的导出sap中。今天的需求是:批量导入BOM分配,然后批量删除。

    将execl导入sap内表的函数:ALSM_EXCEL_TO_INTERNAL_TABLE,很好用,不过听说这个函数只能导入1万行以内的数据,具体没有验证。

    Step1:声明变量:

    1. TYPES: BEGIN OF ITAB1,  
    2.        MATNR LIKE MARA-MATNR,  
    3.        WERKS LIKE MARC-WERKS,  
    4.        END OF ITAB1.  
    5. DATA:ITAB TYPE STANDARD TABLE OF ITAB1 WITH HEADER LINE.  
    6. DATA:WA_UPLOAD TYPE ITAB1.  
    7. DATA:IT_DATA1 TYPE STANDARD TABLE OF ALSMEX_TABLINE WITH HEADER LINE.  
    8. DATA:FLG_WARNING LIKE CAPIFLAG-FLWARNING.  
    9. FIELD-SYMBOLS: <WA_ITAB> TYPE ALSMEX_TABLINE.  


    Step2:画屏:

    1. SELECTION-SCREEN BEGIN OF BLOCK BLK1 WITH FRAME TITLE TEXT-001.  
    2.       PARAMETERS: FNAME1 TYPE RLGRAP-FILENAME OBLIGATORY.  
    3. SELECTION-SCREEN END OF BLOCK BLK1.  


    Step3:控制级语句:

    1. INITIALIZATION.  
    2.   
    3. AT SELECTION-SCREEN ON VALUE-REQUEST FOR FNAME1." SEACH HELP  
    4. *  CALL FUNCTION 'F4_FILENAME'  
    5. *    EXPORTING  
    6. *      FIELD_NAME = 'FNAME1'  
    7. *    IMPORTING  
    8. *      FILE_NAME  = FNAME1.  
    9.   CALL FUNCTION 'WS_FILENAME_GET'  
    10.     EXPORTING  
    11.       MASK             = ',EXCEL FILE,*.XLS;*.XLSX;'  
    12.       MODE             = 'O' "S为保存,O为打开  
    13.     IMPORTING  
    14.       FILENAME         = FNAME1  
    15.     EXCEPTIONS  
    16.       INV_WINSYS       = 1  
    17.       NO_BATCH         = 2  
    18.       SELECTION_CANCEL = 3  
    19.       SELECTION_ERROR  = 4  
    20.       OTHERS           = 5.  
    21.   
    22. START-OF-SELECTION.  
    23. PERFORM INTERNAL_TABLE.  
    24. END-OF-SELECTION.  

    上面有2个函数,第一个函数(注释的):F4_FILENAME ,它是获取所有后缀的文件,如图:

    第2个函数:WS_FILENAME_GET,它打开的文件仅仅锁定xls。如图:


    Step 4:获取数据,转化到内表

    1. FORM INTERNAL_TABLE.  
    2.   CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'  
    3.   EXPORTING  
    4.     FILENAME                      = FNAME1  
    5.     I_BEGIN_COL                   = '1'  
    6.     I_BEGIN_ROW                   = '2'  
    7.     I_END_COL                     = '2'  
    8.     I_END_ROW                     = '65535'  
    9.   TABLES  
    10.     INTERN                        = IT_DATA1  
    11.  EXCEPTIONS  
    12.    INCONSISTENT_PARAMETERS       = 1  
    13.    UPLOAD_OLE                    = 2  
    14.    OTHERS                        = 3  
    15.           .  
    16. IF IT_DATA1[] IS INITIAL.  
    17.   MESSAGE '清单中无数据' TYPE 'E'.  
    18.   ENDIF.  
    19.   
    20.  SORT IT_DATA1 BY ROW.  
    1. *格式转化  
    2.   LOOP AT IT_DATA1 ASSIGNING <WA_ITAB>.  
    3.   CASE <WA_ITAB>-COL.  
    4.   WHEN '0001'.  
    5.       WA_UPLOAD-WERKS = <WA_ITAB>-VALUE.  
    6.   WHEN '0002'.  
    7.       WA_UPLOAD-MATNR = <WA_ITAB>-VALUE.  
    8.   ENDCASE.  
    9.   AT END OF ROW.  
    10.       APPEND WA_UPLOAD TO ITAB.  
    11.       CLEAR WA_UPLOAD.  
    12.   ENDAT.  
    13.   ENDLOOP.  
    14. ENDFORM.  

    Step5. 批量删除BOM分配

      1. FORM BOM_DELETE.  
      2.   
      3.  LOOP AT ITAB.  
      4.   CALL FUNCTION 'CSAP_MAT_BOM_ALLOC_DELETE'  
      5.     EXPORTING  
      6.       MATERIAL                 = ITAB-MATNR  
      7.       PLANT                    = ITAB-WERKS  
      8.       BOM_USAGE                = '1'  
      9. *     ALTERNATIVE              =  
      10. *     FL_NO_CHANGE_DOC         = ' '  
      11. *     FL_COMMIT_AND_WAIT       = ' '  
      12.    IMPORTING  
      13.       FL_WARNING               = FLG_WARNING  
      14.      BOM_NO                   = BOM_NO  
      15. *   TABLES  
      16. *     T_PLANT                  =  
      17.    EXCEPTIONS  
      18.      ERROR                    = 1  
      19.      OTHERS                   = 2  
      20.             .  
      21.   
      22.   IF FLG_WARNING = 'X'.  
      23.      WRITE :/ ITAB-WERKS,ITAB-MATNR , '删除成功'.  
      24.   ELSE.  
      25.      WRITE :/ ITAB-WERKS,ITAB-MATNR , '删除失败'.  
      26.     ENDIF.  
      27.   
      28.   ENDLOOP.  
      29.   
      30.  ENDFORM.  

    我之前写的一篇日志:ABAP 将EXECL数据导入SAP内表的几个步骤

    http://blog.csdn.net/szlaptop/article/details/8663451

    用的函数“ALSM_EXCEL_TO_INTERNAL_TABLE”,当时觉得它非常好用,但是今天要推翻这个结论了,因为发现了一个更好用的函数:

    “TEXT_CONVERT_XLS_TO_SAP”。这个函数直接可以把execl的内容原原本本的写入到内表,不用格式转化那么麻烦。

    如果该内表ITAB的数据最后要写入你的自建表里,那么还得迂回一下,因为透明表里有个MANDT客户端字段。所以得再建一个内表来迂回。

    1. LOOP AT itab.  
    2.   CLEAR itab1.  
    3.   MOVE-CORRESPONDING itab to itab1.  
    4.   APPEND itab1.  
    5. ENDLOOP.  
    6.   
    7.   MODIFY zchannel FROM TABLE itab1.  
    1.   CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'  
    2.     EXPORTING  
    3. *     I_FIELD_SEPERATOR          =  
    4.      I_LINE_HEADER               = 'X'  
    5.       i_tab_raw_data             = IT_RAW  
    6.       i_filename                 = fname1  
    7.     tables  
    8.       i_tab_converted_data       = itab  
    9.    EXCEPTIONS  
    10.      CONVERSION_FAILED          = 1  
    11.      OTHERS                     = 2  
    12.             .  
    13.   IF sy-subrc <> 0.  
    14.   MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO  
    15.          WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.  
    16.   ENDIF.  

    模板下载功能:

    通过下载execl模板给用户,用户按照模板填写再将数据导入SAP。

      1. INCLUDE ZOLE2INCL.  
      2. TYPE-POOLS: TRUXS.  
      3.   
      4. DATA:BEGIN OF itab OCCURS 0,  
      5.      area LIKE zchannel-area,  
      6.      city LIKE zchannel-city,  
      7.      zsystem LIKE zchannel-zsystem,  
      8.      storename LIKE zchannel-storename,  
      9.      competent LIKE zchannel-competent,  
      10.      promoters LIKE zchannel-promoters,  
      11.      matnr LIKE zchannel-matnr,  
      12.      salesqty LIKE zchannel-salesqty,  
      13.      zunit LIKE zchannel-zunit,  
      14.      salesamount LIKE zchannel-salesamount,  
      15.      zdate LIKE zchannel-zdate,  
      16.   END OF itab.  
      17.   
      18. data:itab1 LIKE zchannel OCCURS 0 WITH HEADER LINE.  
      19. DATA: IT_RAW TYPE TRUXS_T_TEXT_DATA.  
      20. DATA: H_EXCEL TYPE OLE2_OBJECT,        " Excel object  
      21.       H_MAPL TYPE OLE2_OBJECT,         " list of workbooks  
      22.       H_MAP TYPE OLE2_OBJECT,          " workbook  
      23.       H_ZL TYPE OLE2_OBJECT,           " cell  
      24.       H_F TYPE OLE2_OBJECT.            " font  
      25.   
      26. SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE text-001.  
      27. PARAMETERS: fname1 TYPE rlgrap-filename OBLIGATORY.  
      28. SELECTION-SCREEN END OF BLOCK blk1.  
      29.   
      30. SELECTION-SCREEN BEGIN OF BLOCK BLK2 WITH FRAME TITLE TEXT-002.  
      31. SELECTION-SCREEN: BEGIN OF LINE,  
      32.                   PUSHBUTTON 2(10) PUSH USER-COMMAND DOWN.  
      33. SELECTION-SCREEN  END OF LINE.  
      34. SELECTION-SCREEN END OF BLOCK BLK2.  
      35.   
      36. INITIALIZATION.  
      37.   PUSH = '下载上传模板'.  
      38.   
      39. AT SELECTION-SCREEN.  
      40.       IF SY-UCOMM = 'DOWN'.  
      41.     PERFORM DISPLAYEXCEL.  
      42.   ENDIF.  
      43. FORM DISPLAYEXCEL .  
      44. * tell user what is going on  
      45.   CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'  
      46.      EXPORTING  
      47. *           PERCENTAGE = 0  
      48.            TEXT       = TEXT-007  
      49.        EXCEPTIONS  
      50.             OTHERS     = 1.  
      51. * start Excel  
      52.   CREATE OBJECT H_EXCEL 'EXCEL.APPLICATION'.  
      53. *  PERFORM ERR_HDL.  
      54.   
      55.   SET PROPERTY OF H_EXCEL  'Visible' = 1.  
      56. *  CALL METHOD OF H_EXCEL 'FILESAVEAS' EXPORTING #1 = 'c:kis_excel.xls'  
      57.   .  
      58.   
      59. *  PERFORM ERR_HDL.  
      60. * tell user what is going on  
      61.   CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'  
      62.      EXPORTING  
      63. *           PERCENTAGE = 0  
      64.            TEXT       = TEXT-008  
      65.        EXCEPTIONS  
      66.             OTHERS     = 1.  
      67. * get list of workbooks, initially empty  
      68.   CALL METHOD OF H_EXCEL 'Workbooks' = H_MAPL.  
      69.   PERFORM ERR_HDL.  
      70. * add a new workbook  
      71.   CALL METHOD OF H_MAPL 'Add' = H_MAP.  
      72.   PERFORM ERR_HDL.  
      73. * tell user what is going on  
      74.   CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'  
      75.      EXPORTING  
      76. *           PERCENTAGE = 0  
      77.            TEXT       = TEXT-009  
      78.        EXCEPTIONS  
      79.             OTHERS     = 1.  
      80. * output column headings to active Excel sheet  
      81.   PERFORM FILL_CELL USING 1 1 1 '区域名称'(001).  
      82.   PERFORM FILL_CELL USING 1 2 1 '城市'(002).  
      83.   PERFORM FILL_CELL USING 1 3 1 '所在系统'(004).  
      84.   PERFORM FILL_CELL USING 1 4 1 '门店名称'(005).  
      85.   PERFORM FILL_CELL USING 1 5 1 销售代表'(006).  
      86.   PERFORM FILL_CELL USING 1 6 1 '促销员'(007).  
      87.   PERFORM FILL_CELL USING 1 7 1 '物料号'(008).  
      88.   PERFORM FILL_CELL USING 1 8 1 '数量'(009).  
      89.   PERFORM FILL_CELL USING 1 9 1 '单位'(009).  
      90.   PERFORM FILL_CELL USING 1 10 1 '金额'(010).  
      91.   PERFORM FILL_CELL USING 1 11 1 '日期'(011).  
      92.   
      93.   PERFORM FILL_CELL USING 2 1 0 '北京'(001).  
      94.   PERFORM FILL_CELL USING 2 2 0 '北京'(002).  
      95.   PERFORM FILL_CELL USING 2 3 0 '天系统'(003).  
      96.   PERFORM FILL_CELL USING 2 4 0 '奥体天'(004).  
      97.   PERFORM FILL_CELL USING 2 5 0 '白小夏'(005).  
      98.   PERFORM FILL_CELL USING 2 6 0 '夏小白'(006).  
      99.   PERFORM FILL_CELL USING 2 7 0 'A00-000001'(007).  
      100.   PERFORM FILL_CELL USING 2 8 0 '3'(008).  
      101.   PERFORM FILL_CELL USING 2 9 0 '包'(009).  
      102.   PERFORM FILL_CELL USING 2 10 0 '38.8'(010).  
      103.   PERFORM FILL_CELL USING 2 11 0 '20130420'(011).  
      104.   
      105. ENDFORM.                    "displayexcel  
      106.   
      107. FORM ERR_HDL.  
      108.   IF SY-SUBRC <> 0.  
      109.     WRITE: / 'Fehler bei OLE-Automation:'(010), SY-SUBRC.  
      110.     STOP.  
      111.   ENDIF.  
      112. ENDFORM.  
      113.   
      114. FORM FILL_CELL USING I J BOLD VAL.  
      115.   CALL METHOD OF H_EXCEL 'Cells' = H_ZL EXPORTING #1 = I #2 = J.  
      116.   PERFORM ERR_HDL.  
      117.   SET PROPERTY OF H_ZL 'Value' = VAL .  
      118.   PERFORM ERR_HDL.  
      119.   GET PROPERTY OF H_ZL 'Font' = H_F.  
      120.   PERFORM ERR_HDL.  
      121.   SET PROPERTY OF H_F 'Bold' = BOLD .  
      122.   PERFORM ERR_HDL.  
      123. ENDFORM.                    "FILL_CELL  

    TEXT_CONVERT_XLS_TO_SAP实例

    http://blog.csdn.net/liangziyisheng/article/details/6995896

    之前尝试很多次使用gui_upload去上传excel数据,每次都出现乱码,不管中文英文都乱码。 至今不知道gui_upload是否支持excel文件上传,它的每个参数都尝试了,修改参数貌似并不能解决它出现乱码的事实。

    于是想到用ALSM_EXCEL_TO_INTERNAL_TABLE,这个函数用起来有点蛋疼,不能使用自定义的格式,必须要定义一个和它规定的格式的内表来接收传来的值,完了要loop这个内表,再一条一条sign的自定义格式的内表中去。

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

    以下是实例:

    TYPE-POOLS truxsDATA:it_raw TYPE truxs_t_text_data.
    *定义一个内表来存储数据,内表的列数和要传得数据的列数要相同,其按照列来匹配传值 DATABEGIN 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传值 START-OF-SELECTION.   PERFORM exceltotab.   PERFORM display_data.
    *&---------------------------------------------------------------------* *&      Form  exceltotab *&---------------------------------------------------------------------* *       text *----------------------------------------------------------------------* FORM exceltotab .
      CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'   EXPORTING * I_FIELD_SEPERATOR = *  i_line_header = 'X'   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

    FUNCTION ‘TEXT_CONVERT_XLS_TO_SAP’ 在R/3 4.6C中的BUG

    发布者: wzeng | 发布时间: 2013-1-10 14:56| 查看数: 469| 评论数: 0|帖子模式

    http://www.guruface.net/guruface/forum.php?mod=viewthread&tid=935&from=portal

     

    R/3 4.6C系统,CALL FUNCTION ‘TEXT_CONVERT_XLS_TO_SAP’,把EXCEL数据读取到内表时,遇到以下问题:

    1.EXCEL中第一行是标题,调用FM时,参数I_LINE_HEADER=’X’

    读第一条数据时,会把标题放入“值是空的字段”

    2.模板中前两行是标题,调用FM时,参数I_LINE_HEADER=”,然后再把前两行数据删除

    100*N+1行,有把标题放入“值是空的字段”的情况

    以上问题在SAP ECC 6.0中没有发现

    解决方法:

    改用FUNCTION ‘ALSM_EXCEL_TO_INTERNAL_TABLE’

  • 相关阅读:
    053-146
    053-659
    053-658
    053-657
    053-656
    053-654
    053-655
    053-652
    053-651
    053-650
  • 原文地址:https://www.cnblogs.com/rainysblog/p/4007933.html
Copyright © 2011-2022 走看看