经常遇到将外部数据大批量的导出sap中。今天的需求是:批量导入BOM分配,然后批量删除。
将execl导入sap内表的函数:ALSM_EXCEL_TO_INTERNAL_TABLE,很好用,不过听说这个函数只能导入1万行以内的数据,具体没有验证。
Step1:声明变量:
TYPES: BEGIN OF ITAB1,
MATNR LIKE MARA-MATNR,
WERKS LIKE MARC-WERKS,
END OF ITAB1.
DATA:ITAB TYPE STANDARD TABLE OF ITAB1 WITH HEADER LINE.
DATA:WA_UPLOAD TYPE ITAB1.
DATA:IT_DATA1 TYPE STANDARD TABLE OF ALSMEX_TABLINE WITH HEADER LINE.
DATA:FLG_WARNING LIKE CAPIFLAG-FLWARNING.
FIELD-SYMBOLS: <WA_ITAB> TYPE ALSMEX_TABLINE.
Step2:画屏:
SELECTION-SCREEN BEGIN OF BLOCK BLK1 WITH FRAME TITLE TEXT-001.
PARAMETERS: FNAME1 TYPE RLGRAP-FILENAME OBLIGATORY.
SELECTION-SCREEN END OF BLOCK BLK1.
Step3:控制级语句:
INITIALIZATION.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR FNAME1." SEACH HELP
* CALL FUNCTION 'F4_FILENAME'
* EXPORTING
* FIELD_NAME = 'FNAME1'
* IMPORTING
* FILE_NAME = FNAME1.
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
MASK = ',EXCEL FILE,*.XLS;*.XLSX;'
MODE = 'O' "S为保存,O为打开
IMPORTING
FILENAME = FNAME1
EXCEPTIONS
INV_WINSYS = 1
NO_BATCH = 2
SELECTION_CANCEL = 3
SELECTION_ERROR = 4
OTHERS = 5.
START-OF-SELECTION.
PERFORM INTERNAL_TABLE.
END-OF-SELECTION.
上面有2个函数,第一个函数(注释的):F4_FILENAME ,它是获取所有后缀的文件,如图:
第2个函数:WS_FILENAME_GET,它打开的文件仅仅锁定xls。如图:
Step 4:获取数据,转化到内表
FORM INTERNAL_TABLE.
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
FILENAME = FNAME1
I_BEGIN_COL = '1'
I_BEGIN_ROW = '2'
I_END_COL = '2'
I_END_ROW = '65535'
TABLES
INTERN = IT_DATA1
EXCEPTIONS
INCONSISTENT_PARAMETERS = 1
UPLOAD_OLE = 2
OTHERS = 3
.
IF IT_DATA1[] IS INITIAL.
MESSAGE '清单中无数据' TYPE 'E'.
ENDIF.
SORT IT_DATA1 BY ROW.
*格式转化
LOOP AT IT_DATA1 ASSIGNING <WA_ITAB>.
CASE <WA_ITAB>-COL.
WHEN '0001'.
WA_UPLOAD-WERKS = <WA_ITAB>-VALUE.
WHEN '0002'.
WA_UPLOAD-MATNR = <WA_ITAB>-VALUE.
ENDCASE.
AT END OF ROW.
APPEND WA_UPLOAD TO ITAB.
CLEAR WA_UPLOAD.
ENDAT.
ENDLOOP.
ENDFORM.
Step5. 批量删除BOM分配
FORM BOM_DELETE.
LOOP AT ITAB.
CALL FUNCTION 'CSAP_MAT_BOM_ALLOC_DELETE'
EXPORTING
MATERIAL = ITAB-MATNR
PLANT = ITAB-WERKS
BOM_USAGE = '1'
* ALTERNATIVE =
* FL_NO_CHANGE_DOC = ' '
* FL_COMMIT_AND_WAIT = ' '
IMPORTING
FL_WARNING = FLG_WARNING
BOM_NO = BOM_NO
* TABLES
* T_PLANT =
EXCEPTIONS
ERROR = 1
OTHERS = 2
.
IF FLG_WARNING = 'X'.
WRITE :/ ITAB-WERKS,ITAB-MATNR , '删除成功'.
ELSE.
WRITE :/ ITAB-WERKS,ITAB-MATNR , '删除失败'.
ENDIF.
ENDLOOP.
ENDFORM.