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. AT SELECTION-SCREEN ON VALUE-REQUEST FOR FNAME1." SEACH HELP
  3. *  CALL FUNCTION 'F4_FILENAME'
  4. *    EXPORTING
  5. *      FIELD_NAME = 'FNAME1'
  6. *    IMPORTING
  7. *      FILE_NAME  = FNAME1.
  8. CALL FUNCTION 'WS_FILENAME_GET'
  9. EXPORTING
  10. MASK             = ',EXCEL FILE,*.XLS;*.XLSX;'
  11. MODE             = 'O' "S为保存,O为打开
  12. IMPORTING
  13. FILENAME         = FNAME1
  14. EXCEPTIONS
  15. INV_WINSYS       = 1
  16. NO_BATCH         = 2
  17. SELECTION_CANCEL = 3
  18. SELECTION_ERROR  = 4
  19. OTHERS           = 5.
  20. START-OF-SELECTION.
  21. PERFORM INTERNAL_TABLE.
  22. 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. 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. LOOP AT ITAB.
    3. CALL FUNCTION 'CSAP_MAT_BOM_ALLOC_DELETE'
    4. EXPORTING
    5. MATERIAL                 = ITAB-MATNR
    6. PLANT                    = ITAB-WERKS
    7. BOM_USAGE                = '1'
    8. *     ALTERNATIVE              =
    9. *     FL_NO_CHANGE_DOC         = ' '
    10. *     FL_COMMIT_AND_WAIT       = ' '
    11. IMPORTING
    12. FL_WARNING               = FLG_WARNING
    13. BOM_NO                   = BOM_NO
    14. *   TABLES
    15. *     T_PLANT                  =
    16. EXCEPTIONS
    17. ERROR                    = 1
    18. OTHERS                   = 2
    19. .
    20. IF FLG_WARNING = 'X'.
    21. WRITE :/ ITAB-WERKS,ITAB-MATNR , '删除成功'.
    22. ELSE.
    23. WRITE :/ ITAB-WERKS,ITAB-MATNR , '删除失败'.
    24. ENDIF.
    25. ENDLOOP.
    26. 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. 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. DATA:BEGIN OF itab OCCURS 0,
    4. area LIKE zchannel-area,
    5. city LIKE zchannel-city,
    6. zsystem LIKE zchannel-zsystem,
    7. storename LIKE zchannel-storename,
    8. competent LIKE zchannel-competent,
    9. promoters LIKE zchannel-promoters,
    10. matnr LIKE zchannel-matnr,
    11. salesqty LIKE zchannel-salesqty,
    12. zunit LIKE zchannel-zunit,
    13. salesamount LIKE zchannel-salesamount,
    14. zdate LIKE zchannel-zdate,
    15. END OF itab.
    16. data:itab1 LIKE zchannel OCCURS 0 WITH HEADER LINE.
    17. DATA: IT_RAW TYPE TRUXS_T_TEXT_DATA.
    18. DATA: H_EXCEL TYPE OLE2_OBJECT,        " Excel object
    19. H_MAPL TYPE OLE2_OBJECT,         " list of workbooks
    20. H_MAP TYPE OLE2_OBJECT,          " workbook
    21. H_ZL TYPE OLE2_OBJECT,           " cell
    22. H_F TYPE OLE2_OBJECT.            " font
    23. SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE text-001.
    24. PARAMETERS: fname1 TYPE rlgrap-filename OBLIGATORY.
    25. SELECTION-SCREEN END OF BLOCK blk1.
    26. SELECTION-SCREEN BEGIN OF BLOCK BLK2 WITH FRAME TITLE TEXT-002.
    27. SELECTION-SCREEN: BEGIN OF LINE,
    28. PUSHBUTTON 2(10) PUSH USER-COMMAND DOWN.
    29. SELECTION-SCREEN  END OF LINE.
    30. SELECTION-SCREEN END OF BLOCK BLK2.
    31. INITIALIZATION.
    32. PUSH = '下载上传模板'.
    33. AT SELECTION-SCREEN.
    34. IF SY-UCOMM = 'DOWN'.
    35. PERFORM DISPLAYEXCEL.
    36. ENDIF.
    37. FORM DISPLAYEXCEL .
    38. * tell user what is going on
    39. CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    40. EXPORTING
    41. *           PERCENTAGE = 0
    42. TEXT       = TEXT-007
    43. EXCEPTIONS
    44. OTHERS     = 1.
    45. * start Excel
    46. CREATE OBJECT H_EXCEL 'EXCEL.APPLICATION'.
    47. *  PERFORM ERR_HDL.
    48. SET PROPERTY OF H_EXCEL  'Visible' = 1.
    49. *  CALL METHOD OF H_EXCEL 'FILESAVEAS' EXPORTING #1 = 'c:\kis_excel.xls'
    50. .
    51. *  PERFORM ERR_HDL.
    52. * tell user what is going on
    53. CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    54. EXPORTING
    55. *           PERCENTAGE = 0
    56. TEXT       = TEXT-008
    57. EXCEPTIONS
    58. OTHERS     = 1.
    59. * get list of workbooks, initially empty
    60. CALL METHOD OF H_EXCEL 'Workbooks' = H_MAPL.
    61. PERFORM ERR_HDL.
    62. * add a new workbook
    63. CALL METHOD OF H_MAPL 'Add' = H_MAP.
    64. PERFORM ERR_HDL.
    65. * tell user what is going on
    66. CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    67. EXPORTING
    68. *           PERCENTAGE = 0
    69. TEXT       = TEXT-009
    70. EXCEPTIONS
    71. OTHERS     = 1.
    72. * output column headings to active Excel sheet
    73. PERFORM FILL_CELL USING 1 1 1 '区域名称'(001).
    74. PERFORM FILL_CELL USING 1 2 1 '城市'(002).
    75. PERFORM FILL_CELL USING 1 3 1 '所在系统'(004).
    76. PERFORM FILL_CELL USING 1 4 1 '门店名称'(005).
    77. PERFORM FILL_CELL USING 1 5 1 销售代表'(006).
    78. PERFORM FILL_CELL USING 1 6 1 '促销员'(007).
    79. PERFORM FILL_CELL USING 1 7 1 '物料号'(008).
    80. PERFORM FILL_CELL USING 1 8 1 '数量'(009).
    81. PERFORM FILL_CELL USING 1 9 1 '单位'(009).
    82. PERFORM FILL_CELL USING 1 10 1 '金额'(010).
    83. PERFORM FILL_CELL USING 1 11 1 '日期'(011).
    84. PERFORM FILL_CELL USING 2 1 0 '北京'(001).
    85. PERFORM FILL_CELL USING 2 2 0 '北京'(002).
    86. PERFORM FILL_CELL USING 2 3 0 '天系统'(003).
    87. PERFORM FILL_CELL USING 2 4 0 '奥体天'(004).
    88. PERFORM FILL_CELL USING 2 5 0 '白小夏'(005).
    89. PERFORM FILL_CELL USING 2 6 0 '夏小白'(006).
    90. PERFORM FILL_CELL USING 2 7 0 'A00-000001'(007).
    91. PERFORM FILL_CELL USING 2 8 0 '3'(008).
    92. PERFORM FILL_CELL USING 2 9 0 '包'(009).
    93. PERFORM FILL_CELL USING 2 10 0 '38.8'(010).
    94. PERFORM FILL_CELL USING 2 11 0 '20130420'(011).
    95. ENDFORM.                    "displayexcel
    96. FORM ERR_HDL.
    97. IF SY-SUBRC <> 0.
    98. WRITE: / 'Fehler bei OLE-Automation:'(010), SY-SUBRC.
    99. STOP.
    100. ENDIF.
    101. ENDFORM.
    102. FORM FILL_CELL USING I J BOLD VAL.
    103. CALL METHOD OF H_EXCEL 'Cells' = H_ZL EXPORTING #1 = I #2 = J.
    104. PERFORM ERR_HDL.
    105. SET PROPERTY OF H_ZL 'Value' = VAL .
    106. PERFORM ERR_HDL.
    107. GET PROPERTY OF H_ZL 'Font' = H_F.
    108. PERFORM ERR_HDL.
    109. SET PROPERTY OF H_F 'Bold' = BOLD .
    110. PERFORM ERR_HDL.
    111. 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 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中的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’

abap Excel 导入的更多相关文章

  1. 一步步实现ABAP后台导入EXCEL到数据库【3】

    在一步步实现ABAP后台导入EXCEL到数据库[2]里,我们已经实现计划后台作业将数据导入数据库的功能.但是,这只是针对一个简单的自定义结构的导入程序.在实践应用中,面对不同的表.不同的导入文件,我们 ...

  2. 一步步实现ABAP后台导入EXCEL到数据库【1】

    在SAP的应用当中,导入.导出EXCEL文件的情况是一个常见的需求,有时候用户需要将大量数据定期导入到SAP的数据库中.这种情况下,使用导入程序在前台导入可能要花费不少的时间,如果能安排导入程序为后台 ...

  3. 2019.06.05 ABAP EXCEL 操作类代码 OLE方式(模板下载,excel上传,内表下载)

    一般使用标准的excel导入方法9999行,修改了标准的excel导入FM 整合出类:excel的 模板下载,excel上传,ALV内表下载功能. 在项目一开始可以SE24创建一个类来供整体开发使用, ...

  4. C# Excel导入、导出【源码下载】

    本篇主要介绍C#的Excel导入.导出. 目录 1. 介绍:描述第三方类库NPOI以及Excel结构 2. Excel导入:介绍C#如何调用NPOI进行Excel导入,包含:流程图.NOPI以及C#代 ...

  5. ASP.NET MVC5+EF6+EasyUI 后台管理系统(63)-Excel导入和导出-自定义表模导入

    系列目录 前言 上一节使用了LinqToExcel和CloseXML对Excel表进行导入和导出的简单操作,大家可以跳转到上一节查看: ASP.NET MVC5+EF6+EasyUI 后台管理系统(6 ...

  6. 解析大型.NET ERP系统 设计通用Microsoft Excel导入功能

    做企业管理软件很难避免与Microsoft Excel打交道,常常是软件做好了,客户要求说再做一个Excel导入功能.导入Excel数据的功能的难度不大,从Excel列数据栏位的取值,验证值,再导入到 ...

  7. (转)高效的将excel导入sqlserver中

    大部分人都知道用oledb来读取数据到dataset,但是读取之后怎么处理dataset就千奇百怪了.很多人通过循环来拼接sql,这样做不但容易出错而且效率低下,System.Data.SqlClie ...

  8. 安全的将excel导入sqlite3的解决方案

    最近在做一个小项目时,需要把一个excel中的数据保存到sqlite3数据库中以备后用,表中有字符也有数字,要用到特定的数据类型方便后续使用,参照网上的方法,将excel文件转换为csv文件后,在导入 ...

  9. 利用反射实现通用的excel导入导出

    如果一个项目中存在多种信息的导入导出,为了简化代码,就需要用反射实现通用的excel导入导出 实例代码如下: 1.创建一个 Book类,并编写set和get方法 package com.bean; p ...

随机推荐

  1. 倍福TwinCAT(贝福Beckhoff)基础教程2.0 TwinCAT常用快捷键

    F5:运行程序 CTRL+F5:停止运行当前程序 F12:登出 F11:登录 CTRL+F7:强制写入数值     更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: http://i.you ...

  2. 载入本地Html文件

    NSString * resousePath = [[NSBundle mainBundle]resourcePath];         NSString * filePath = [resouse ...

  3. 怎么运行Typescript

    依据官方示例: npm i -g typescript 示例:tsc *.ts 实例:tsc hello.ts 不过以上实现的太有限制了,如下实现可满足正常测试以及学习使用 package,json ...

  4. Transform.Translate 平移

    function Translate (translation : Vector3, relativeTo : Space = Space.Self) : void Description描述 Mov ...

  5. Android学习(十一) File文件操作

    File类 1.获取当前应用程序的目录: this.getFilesDir();                                             //获取当前应用程序的数据目录 ...

  6. rabbit mq 安装

    不知道为什么上不去erlang的官网,所以只能到中文社区来下载了. http://www.cnerlang.com/ 我下载的是下面这个版本 http://download.cnerlang.com/ ...

  7. mysql :安装过程中的问题

    安装mysql  选择路径的问题 出现如下问题:说明之前安装过mysql,写在的不干净

  8. Database returned an invalid value in QuerySet.datetimes(). Are time zone definitions for your datab

    Database returned an invalid value in QuerySet.datetimes(). Are time zone definitions for your datab ...

  9. web-小知识点(随记)

    1.position:fixed:窗口定位的时候(在刷新页面时若未出现.得稍等一会的话,就直接把需要定位的内容写在<html>标签的首部.这样页面加载html的时候首先加载fixed定位的 ...

  10. 遍历list,字典

    private void Form1_Load(object sender, EventArgs e) { List<int> ids = new List<int>(); i ...