二维码

商品批量调拨,通过bapi将execl上传到sap系统

Twilight发表于 2014-02-06 21:00Twilight 最后回复于 2014-02-06 21:00 [复制链接] 2643 0

在业务中经常存在仓库或门店间相互调入调出、服装换款(剪标改唛)的需求,我们称其为商品调拨。在现在的企业信息化处理中,很多直接通过系统间的接口来实现商品调拨数据的传递,也可能有部分企业存在通过数据文件(如Excel)进行批量导入的方式
商品调拨可能是公司间的、仓库间的调拨,根据移动类型进行区分。需要的数据包括调出和调入的工厂、库位、商品编码、数量(基本单位)等

执行结果:
excel_upload.jpg
最后两列 显示bapi创建成功的凭证号码和时间,不成功不显示

主程序代码:
  1. *--------------------------------------------------------------------*
  2. *DEFINE TYPE POOL
  3. *--------------------------------------------------------------------*
  4. TYPE-POOLS:SLIS,TRUXS.

  5. *--------------------------------------------------------------------*
  6. *DEFINE TABLES
  7. *--------------------------------------------------------------------*
  8. *TABLES:

  9. *--------------------------------------------------------------------*
  10. *DEFINE CONSTANTS
  11. *--------------------------------------------------------------------*
  12. CONSTANTS: CO_BWART_STOCK_TRANS TYPE MSEG-BWART VALUE '311',
  13.            "Movement Type (Inventory Management)
  14.            CO_MAT_DOC_LINES TYPE I VALUE 2."批次过账的行数

  15. *--------------------------------------------------------------------*
  16. *DEFINE INTERNAL TABLES & VARIANTS
  17. *--------------------------------------------------------------------*
  18. DATA:BEGIN OF IT_FDAT OCCURS 0,
  19.         WERKS LIKE ZMM_STOCK_TRANS-WERKS,
  20.         LGORT LIKE ZMM_STOCK_TRANS-LGORT,
  21.         UMLGO LIKE ZMM_STOCK_TRANS-UMLGO,
  22.         MATNR LIKE ZMM_STOCK_TRANS-MATNR,
  23.         MENGE TYPE CHAR20,
  24.         MEINS LIKE ZMM_STOCK_TRANS-MEINS,
  25.      END OF IT_FDAT.
  26. DATA:IT_DATA TYPE ZMM_STOCK_TRANS OCCURS 0 WITH HEADER LINE.

  27. *--------------------------------------------------------------------*
  28. *DEFINE RANGES
  29. *--------------------------------------------------------------------*

  30. *--------------------------------------------------------------------*
  31. *PARAMETERS
  32. *--------------------------------------------------------------------*
  33. SELECTION-SCREEN BEGIN OF BLOCK BLK_010 WITH FRAME TITLE TEXT-001.
  34. PARAMETERS:
  35. P_BLDAT LIKE MKPF-BLDAT OBLIGATORY DEFAULT SY-DATUM,
  36. P_BUDAT LIKE MKPF-BUDAT OBLIGATORY DEFAULT SY-DATUM.
  37. PARAMETERS:
  38. P_FILE LIKE RLGRAP-FILENAME OBLIGATORY.
  39. SELECTION-SCREEN END OF BLOCK BLK_010.

  40. *--------------------------------------------------------------------*
  41. *INITIALIZATION
  42. *--------------------------------------------------------------------*
  43. INITIALIZATION.
  44.   PERFORM INIT_PARAMETERS.

  45. *--------------------------------------------------------------------*
  46. *AT SELECTION-SCREEN OUTPUT
  47. *--------------------------------------------------------------------*
  48. AT SELECTION-SCREEN OUTPUT.

  49. *--------------------------------------------------------------------*
  50. *AT SELECTION-SCREEN
  51. *--------------------------------------------------------------------*
  52. AT SELECTION-SCREEN.

  53. *--------------------------------------------------------------------*
  54. *AT SELECTION-SCREEN ON VALUE-REQUEST
  55. *--------------------------------------------------------------------*
  56. AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.
  57.   CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
  58.    EXPORTING
  59. *     PROGRAM_NAME        = SYST-REPID
  60. *     DYNPRO_NUMBER       = SYST-DYNNR
  61. *     FIELD_NAME          = ' '
  62.      STATIC              = 'X'
  63. *     MASK                = ' '
  64. *     FILEOPERATION       = 'R'
  65. *     PATH                =
  66.     CHANGING
  67.       FILE_NAME           = P_FILE
  68. *     LOCATION_FLAG       = 'P'
  69. *   EXCEPTIONS
  70. *     MASK_TOO_LONG       = 1
  71. *     OTHERS              = 2
  72.             .
  73.   IF SY-SUBRC <> 0.
  74. * Implement suitable error handling here
  75.   ENDIF.


  76. *--------------------------------------------------------------------*
  77. *AT SELECTION-SCREEN ON HELP-REQUEST
  78. *--------------------------------------------------------------------*

  79. *--------------------------------------------------------------------*
  80. *START-OF-SELECTION
  81. *--------------------------------------------------------------------*
  82. START-OF-SELECTION.
  83.   PERFORM PARAMETERS_CHECK.
  84.   PERFORM GET_DATA.

  85. *--------------------------------------------------------------------*
  86. *END-OF-SELECTION
  87. *--------------------------------------------------------------------*
  88. END-OF-SELECTION.
  89.   PERFORM POST_DATA.
  90.   PERFORM DIAPLAY_DATA.

  91. *&---------------------------------------------------------------------*
  92. *&      Form  INIT_PARAMETERS
  93. *&---------------------------------------------------------------------*
  94. FORM INIT_PARAMETERS .

  95. ENDFORM.                    " INIT_PARAMETERS
  96. *&---------------------------------------------------------------------*
  97. *&      Form  PARAMETERS_CHECK
  98. *&---------------------------------------------------------------------*
  99. FORM PARAMETERS_CHECK .
  100.   DATA: LV_FILE TYPE STRING,
  101.         LV_EXIST TYPE ABAP_BOOL.
  102.   LV_FILE = P_FILE.
  103.   "Checks if a File Exists  检查文件是否存在
  104.   CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_EXIST
  105.     EXPORTING
  106.       FILE                 = LV_FILE
  107.     RECEIVING
  108.       RESULT               = LV_EXIST
  109.     EXCEPTIONS
  110.       CNTL_ERROR           = 1
  111.       ERROR_NO_GUI         = 2
  112.       WRONG_PARAMETER      = 3
  113.       NOT_SUPPORTED_BY_GUI = 4
  114.       OTHERS               = 5.
  115.   IF SY-SUBRC <> 0.
  116.     MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
  117.             WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  118.     LEAVE LIST-PROCESSING.
  119.   ELSEIF LV_EXIST = ABAP_FALSE.
  120.     MESSAGE S001(00) WITH '文件:' LV_FILE '不存在'.
  121.     LEAVE LIST-PROCESSING.
  122.   ENDIF.

  123. ENDFORM.                    " PARAMETERS_CHECK
  124. *&---------------------------------------------------------------------*
  125. *&      Form  GET_DATA
  126. *&---------------------------------------------------------------------*
  127. FORM GET_DATA .
  128.   DATA: IT_RAW_DATA TYPE TRUXS_T_TEXT_DATA,
  129.         LV_OUTPUT LIKE IT_FDAT-MENGE.
  130.   REFRESH: IT_FDAT,IT_DATA.
  131.   "ALSM_EXCEL_TO_INTERNAL_TABLE 需要用at end of整理内表数据格式
  132.   "“TEXT_CONVERT_XLS_TO_SAP”。这个函数直接可以把execl的内容
  133.   "原原本本的写入到内表,不用格式转化那么麻烦。
  134.   CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
  135.     EXPORTING
  136. *   I_FIELD_SEPERATOR          =
  137.       I_LINE_HEADER              = 'X'"去掉模板第一行标题头部
  138.       I_TAB_RAW_DATA             = IT_RAW_DATA
  139.       I_FILENAME                 = P_FILE
  140.     TABLES
  141.       I_TAB_CONVERTED_DATA       = IT_FDAT[]
  142. * EXCEPTIONS
  143. *   CONVERSION_FAILED          = 1
  144. *   OTHERS                     = 2
  145.             .
  146.   IF SY-SUBRC <> 0.
  147.     MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
  148.             WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  149.   ENDIF.

  150.   IF IT_FDAT[] IS INITIAL.
  151.     MESSAGE S001(00) WITH '文件中没有数据'(001).
  152.     LEAVE LIST-PROCESSING.
  153.   ENDIF.

  154.   LOOP AT IT_FDAT.
  155.     CLEAR IT_DATA.
  156.     IT_DATA-TABIX = SY-TABIX.
  157.     IT_DATA-WERKS = IT_FDAT-WERKS.
  158.     IT_DATA-LGORT = IT_FDAT-LGORT.
  159.     IT_DATA-UMLGO = IT_FDAT-UMLGO.
  160.     CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT' "料号前面补0
  161.       EXPORTING
  162.         INPUT              = IT_FDAT-MATNR
  163.       IMPORTING
  164.         OUTPUT             = IT_DATA-MATNR
  165. *   EXCEPTIONS
  166. *     LENGTH_ERROR       = 1
  167. *     OTHERS             = 2
  168.               .
  169.     CALL FUNCTION 'CATS_NUMERIC_INPUT_CHECK'"检查字段值是否为数值
  170.       EXPORTING
  171.         INPUT            = IT_FDAT-MENGE
  172. *        INTERNAL         = 'X'
  173.        IMPORTING
  174.          OUTPUT           = LV_OUTPUT
  175.    EXCEPTIONS
  176.      NO_NUMERIC       = 1
  177.      OTHERS           = 2
  178.               .
  179.     IF SY-SUBRC <> 0.
  180.       MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
  181.               WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  182.     ELSE.
  183.       IT_DATA-MENGE = LV_OUTPUT.
  184.     ENDIF.
  185.     CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT' "外部单位转换成内部单位
  186.       EXPORTING
  187.         INPUT                = IT_FDAT-MEINS
  188. *       LANGUAGE             = SY-LANGU
  189.      IMPORTING
  190.        OUTPUT               = IT_DATA-MEINS
  191. *     EXCEPTIONS
  192. *       UNIT_NOT_FOUND       = 1
  193. *       OTHERS               = 2
  194.               .
  195.     APPEND IT_DATA.
  196.   ENDLOOP.
  197. ENDFORM.                    " GET_DATA
  198. *&---------------------------------------------------------------------*
  199. *&      Form  POST_DATA
  200. *&---------------------------------------------------------------------*
  201. FORM POST_DATA .
  202.   DATA:IT_DATA_PST LIKE TABLE OF IT_DATA,
  203.        IS_DATA_PST LIKE LINE OF IT_DATA_PST,
  204.        LV_TAB_LINES TYPE SY-TABIX,
  205.        LV_TAB_IDXFM TYPE SY-TABIX,
  206.        LV_TAB_IDXTO TYPE SY-TABIX.
  207. DATA:GOODSMVT_HEADER LIKE TABLE OF BAPI2017_GM_HEAD_01 WITH HEADER LINE,
  208.      GOODSMVT_CODE LIKE BAPI2017_GM_CODE,
  209.      GOODSMVT_ITEM LIKE TABLE OF BAPI2017_GM_ITEM_CREATE
  210.      WITH HEADER LINE,
  211.      GOODSMVT_HEADRET LIKE BAPI2017_GM_HEAD_RET,
  212.      RETURN LIKE TABLE OF BAPIRET2 WITH HEADER LINE.

  213.   DESCRIBE TABLE IT_DATA LINES LV_TAB_LINES.
  214.   DO."没指定times 无限循环  通过下面的条件exit退出循环的
  215.     CLEAR:GOODSMVT_HEADER,GOODSMVT_CODE,GOODSMVT_ITEM[],
  216.           GOODSMVT_HEADRET,RETURN[],IT_DATA_PST.
  217.     LV_TAB_IDXFM = CO_MAT_DOC_LINES * ( SY-INDEX - 1 ) + 1.
  218.     IF LV_TAB_IDXFM > LV_TAB_LINES.
  219.       EXIT.
  220.     ENDIF.
  221.     LV_TAB_IDXTO = CO_MAT_DOC_LINES * SY-INDEX.
  222.     IF LV_TAB_IDXTO > LV_TAB_LINES.
  223.       LV_TAB_IDXTO = LV_TAB_LINES.
  224.     ENDIF.
  225.     "批次处理的范围控制
  226.     APPEND LINES OF IT_DATA FROM LV_TAB_IDXFM TO LV_TAB_IDXTO
  227.                                               TO IT_DATA_PST.
  228.     GOODSMVT_HEADER-PSTNG_DATE = P_BUDAT.
  229.     GOODSMVT_HEADER-DOC_DATE = P_BLDAT.
  230.     GOODSMVT_CODE = '06'.
  231.     LOOP AT IT_DATA_PST INTO IS_DATA_PST.
  232.       CLEAR:GOODSMVT_ITEM.
  233.       GOODSMVT_ITEM-MATERIAL = IS_DATA_PST-MATNR.
  234.       GOODSMVT_ITEM-PLANT = IS_DATA_PST-WERKS.
  235.       GOODSMVT_ITEM-STGE_LOC = IS_DATA_PST-LGORT.
  236.       GOODSMVT_ITEM-MOVE_TYPE = CO_BWART_STOCK_TRANS.
  237.       GOODSMVT_ITEM-MOVE_PLANT = IS_DATA_PST-WERKS.
  238.       GOODSMVT_ITEM-MOVE_STLOC = IS_DATA_PST-UMLGO.
  239.       GOODSMVT_ITEM-ENTRY_QNT = IS_DATA_PST-MENGE.
  240.       GOODSMVT_ITEM-ENTRY_UOM = IS_DATA_PST-MEINS.
  241.       APPEND GOODSMVT_ITEM.
  242.     ENDLOOP.
  243. *BAPI_GOODSMVT_CREATE*的功能就是用于货物移动,其主要可以实现MB*
  244. *事物的一些功能,其中该BAPI的参数
  245. *GOODSMVT_CODE就控制了对应哪个事物码的功能,
  246. *下面给出该参数的值和对应的事务码:
  247. *01 MB01
  248. *02 MB31
  249. *03 MB1A
  250. *04 MB1B
  251. *05 MB1C
  252. *06 MB11
  253. *07 MB04
  254. *
  255. *这些值存储在表T158G中。
  256.     CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
  257.       EXPORTING
  258.         GOODSMVT_HEADER         = GOODSMVT_HEADER
  259.         GOODSMVT_CODE           = GOODSMVT_CODE
  260. *       TESTRUN                 = ' '
  261. *       GOODSMVT_REF_EWM        =
  262.       IMPORTING"Material Document Number/Material Document Year
  263.         GOODSMVT_HEADRET        = GOODSMVT_HEADRET"bapi创建成功传出的凭证号
  264. *       MATERIALDOCUMENT        =
  265. *       MATDOCUMENTYEAR         =
  266.       TABLES
  267.         GOODSMVT_ITEM           = GOODSMVT_ITEM
  268. *       GOODSMVT_SERIALNUMBER   =
  269.         RETURN                  = RETURN
  270. *       GOODSMVT_SERV_PART_DATA =
  271. *       EXTENSIONIN             =
  272.       .

  273.     READ TABLE RETURN WITH KEY TYPE = 'E'.
  274.     IF SY-SUBRC = 0 OR GOODSMVT_HEADRET-MAT_DOC IS INITIAL.
  275.       CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
  276. *       IMPORTING
  277. *         RETURN        =
  278.                 .
  279.     ELSE.
  280.       CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
  281.        EXPORTING
  282.          WAIT          = 'X'
  283. *     IMPORTING
  284. *       RETURN        =
  285.                 .
  286.       CLEAR IT_DATA.
  287.       IT_DATA-MBLNR = GOODSMVT_HEADRET-MAT_DOC.
  288.       IT_DATA-MJAHR = GOODSMVT_HEADRET-DOC_YEAR.
  289.       MODIFY IT_DATA TRANSPORTING MBLNR MJAHR
  290.              WHERE TABIX >= LV_TAB_IDXFM AND TABIX <= LV_TAB_IDXTO.
  291.     ENDIF.

  292.   ENDDO.
  293. ENDFORM.                    " POST_DATA
  294. *&---------------------------------------------------------------------*
  295. *&      Form  DIAPLAY_DATA
  296. *&---------------------------------------------------------------------*
  297. FORM DIAPLAY_DATA .
  298.   DATA:LV_TITLE TYPE LVC_TITLE,
  299.        LS_LAYOUT TYPE SLIS_LAYOUT_ALV.
  300.   LS_LAYOUT-ZEBRA = 'X'.
  301.   LS_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.

  302.   CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
  303.    EXPORTING
  304.    I_STRUCTURE_NAME                  = 'ZMM_STOCK_TRANS'
  305. *   I_BACKGROUND_ID                   = ' '
  306.      I_GRID_TITLE                      = LV_TITLE
  307. *   I_GRID_SETTINGS                   =
  308.      IS_LAYOUT                         = LS_LAYOUT
  309.     TABLES
  310.       T_OUTTAB                          = IT_DATA
  311. * EXCEPTIONS
  312. *   PROGRAM_ERROR                     = 1
  313. *   OTHERS                            = 2
  314.             .
  315. ENDFORM.                    " DIAPLAY_DATA
复制代码


定义结构
stock transfer.jpg

测试excel附件 导入文件.zip (7.26 KB, 下载次数: 1, 售价: 2 枚金币)
回复

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表