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. Matlab中特征向量间距离矩阵的并行mex程序

    在matlab中, 有n个向量(m维)的矩阵Mat(n, m) 要计算任两个向量间的距离, 即距离矩阵, 可使用以下的并行算法以加速: #include <iostream> #inclu ...

  2. 24.JAVA编程思想——违例差错控制

    24.JAVA编程思想--违例差错控制 Java 的基本原理就是"形式错误的代码不会执行". 与C++类似,捕获错误最理想的是在编译期间,最好在试图执行程序曾经.然而.并不是全部错 ...

  3. python——type()创建类

    今天我算是长知识了,我是一个python菜鸟,以前一直认为type(A)可以返回A的类型,但是不知道type还可以用于创建class,这篇经验就是介绍一下如何用type()创建一个类,以及如何设置该类 ...

  4. Android--Handler的用法:在子线程中更新界面

    本文主要介绍Android的Handler的用法.Handler能够发送Messsage和Runnable对象到与其相关联的线程的消息队列. 每一个Handler对象与创建它的线程相关联.而且每一个H ...

  5. java事务处理全解析

    http://blog.csdn.net/huilangeliuxin/article/details/43446177

  6. java 中的 i++ 和 ++i

    熟悉c/c++中的i++和++i,那么你知道下面的java代码效果是什么吗? 一 . 代码示例 /** * * @author elelule * */ public class TestPlusPl ...

  7. atititi.soa  微服务 区别 联系 优缺点.doc

    atititi.soa  微服务 区别 联系 优缺点.doc 1. 应用微服务的动机,跟传统巨石应用的比较1 2. 面向服务架构(SOA)  esb2 3. 微服务架构(Microservices)2 ...

  8. TMS320C6455 SRIO 实现方案

    TMS320C6455 SRIO 实现方案 SRIO(Serial RapidIO)构架是一种基于高性能包交换的互连技术,主要功能是完成在一个系统内的微处理器.DSP.通信和网络处理器.系统存储器以及 ...

  9. Android Studio 2.0 正式版公布啦 (首次中文翻译)

    Android Studio 2.0 公布了,添加了一些新特性: 1. 更加完好的 Instant Run 2. 更快的 Android Emulator 3.GPU Debugger Preview ...

  10. C++ Primer(第五版)读书笔记 & 习题解答 --- Chapter 1

    Chapter 1.1 1. 每个C++程序都必须有且只能有一个main函数,main函数的返回类型必须是int.操作系统通过调用main函数来运行C++程序. 2. 一个函数的定义包含四部分:返回类 ...