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. 类的成员函数指针和mem_fun适配器的用法

    先来看一个最简单的函数: void foo(int a) { cout << a << endl; } 它的函数指针类型为 void (*)(int); 我们可以这样使用: v ...

  2. jenkins构建java项目找不到命令mvn,java的解决方法

    jenkins构建java项目时出现的报错情况: $ mvn clean install FATAL: command execution failed java.io.IOException: er ...

  3. List of CentOS Mirrors

    From:https://www.centos.org/download/mirrors/ CentOS welcomes new mirror sites. If you are consideri ...

  4. SpringCloud系列五:为Eureka Server添加用户认证及元数据

    1. 回顾 上一篇博客讲解了Eureka集群及将微服务注册到集群上.在前面的讲解中,Eureka Server都是允许匿名访问的,本次将讲解如何构建一个需要登录才能访问的Eureka Server. ...

  5. MQTT服务器搭建--Apollo

    尊重原创,我是伸手党:https://blog.csdn.net/u012377333/article/details/68943416 1.Apollo下载 下载地址:http://activemq ...

  6. 【数据挖掘】分类之Naïve Bayes(转载)

    [数据挖掘]分类之Naïve Bayes 1.算法简介 朴素贝叶斯(Naive Bayes)是监督学习的一种常用算法,易于实现,没有迭代,并有坚实的数学理论(即贝叶斯定理)作为支撑. 本文以拼写检查作 ...

  7. 关于ViewData,ViewBag,TempData三者学习记录!

    关于ViewData,ViewBag,TempData三者学习分享! 1.ViewData和TempData是字典类型,赋值方式用字典方式,ViewData["Key"] . 2. ...

  8. 给jquery easy-ui 添加右键菜单

    版权声明:转自为EasyUI 的Tab 标签添加右键菜单

  9. JavaWeb知识点总结一

    JavaWeb知识点总结一 常见的状态码以及其含义 一些常见HTTP状态码为: -- 服务器成功返回网页 -- 服务器不理解请求的语法 -- 请求的网页不存在 -- 服务不可用 常见HTTP状态码大全 ...

  10. 查找 TextBox 对象中非法数据的示例

    private void GetErrors(StringBuilder sb, DependencyObject obj){ foreach (object child in LogicalTree ...