引用共同学习;

经常遇到将外部数据大批量的导出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.  


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内表的几个步骤

用的函数“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实例

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

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

后来选择用: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传值 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中的BU

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’