根据销售订单创建交货单并自动拣配、过账发货程序

Code listing for: ZSD020  
Description: 根据销售订单创建交货单并过账发货
*&---------------------------------------------------------------------*
* 程序名称: 根据销售订单创建交货单并过账发货
* 程序名  :ZSD020
* 开发日期:2013-08-26
* 创建者  :
* 申请者  :
*----------------------------------------------------------------------*
* 概 要  :
*&---------------------------------------------------------------------*

REPORT  ZSD020.

*****************************************************************
*TYPE DECLARATION
*****************************************************************

TYPES:BEGIN OF TY_TAB_UPLOAD,                        "上传文件接收表
  SHIP_POINT TYPE BAPIDLVCREATEHEADER-SHIP_POINT,    "装运点
  VBELN(10) TYPE C,                                  "订单号
  REF_ITEM TYPE RFPOS_VL,                            "项目
  DLV_QTY TYPE LFIMG,                                "交货数量
  MESSAGE TYPE STRING,
  END OF TY_TAB_UPLOAD.

TYPES:BEGIN OF TY_VBAP,
  VRKME TYPE VBAP-VRKME,
  END OF TY_VBAP.
*****************************************************************
*TYPE DECLARATION
*****************************************************************
TABLES: VBAP.
************************************************************************
* INTERNAL TABLE DECLARATION
************************************************************************

DATA:
      IT_TAB_UPLOAD TYPE STANDARD TABLE OF TY_TAB_UPLOAD,                    "上传文件接收表
      IT_INTERN LIKE STANDARD TABLE OF ALSMEX_TABLINE,                       "EXCEL文件接收表
      SALES_ITEMS LIKE STANDARD TABLE OF BAPIDLVREFTOSALESORDER,             "BAPI输入表:
      IT_RETURN LIKE STANDARD TABLE OF BAPIRET2,                             "BAPI返回参数 
      IT_SERIAL_NUMBERS LIKE STANDARD TABLE OF BAPIDLVSERIALNUMBER,          "BAPI返回参数 
      IT_EXTENSION_IN LIKE STANDARD TABLE OF BAPIPAREX,                      "BAPI返回参数
      IT_DELIVERIES LIKE STANDARD TABLE OF BAPISHPDELIVNUMB,                 "BAPI返回参数
      IT_CREATED_ITEMS LIKE STANDARD TABLE OF BAPIDLVITEMCREATED,            "BAPI返回参数
      IT_EXTENSION_OUT LIKE STANDARD TABLE OF BAPIPAREX.                     "BAPI返回参数



************************************************************************
* WORKAREA DECLARATION
************************************************************************

DATA:
      WA_VBAP TYPE TY_VBAP,
      WA_TAB_UPLOAD TYPE TY_TAB_UPLOAD,                         "上传文件接收表
      WA_SALES_ITEMS TYPE BAPIDLVREFTOSALESORDER,               "BAPI输入表:
      G_SHIP_POINT TYPE BAPIDLVCREATEHEADER-SHIP_POINT,         "装运点
      WA_INTERN LIKE ALSMEX_TABLINE,                            "EXCEL参数表
      G_DELIVERY TYPE BAPISHPDELIVNUMB-DELIV_NUMB,              "BAPI返回参数
      G_NUM_DELIVERIES TYPE BAPIDLVCREATEHEADER-NUM_DELIVERIES, "BAPI返回参数
      WA_CREATED_ITEMS LIKE BAPIDLVITEMCREATED,
      WA_RETURN LIKE  BAPIRET2.


************************************************************************
* SELECTION SCREEN DECLARATION
************************************************************************

SELECTION-SCREEN BEGIN OF BLOCK BLK.
PARAMETERS: P_FIN TYPE RLGRAP-FILENAME OBLIGATORY. "文件名
SELECTION-SCREEN END OF BLOCK BLK.

************************************************************************
* AT SELECTION SCREEN
************************************************************************

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FIN.
  PERFORM FRM_F4_HELP CHANGING P_FIN.  "文件浏览

************************************************************************
* EVENT START OF SELECTION
************************************************************************

START-OF-SELECTION.
  PERFORM FM_UPLOAD_DATA.       "上传文件

*&---------------------------------------------------------------------*
*  FORM  ADD_ZERO
*&---------------------------------------------------------------------*
*  增加前导零
*&---------------------------------------------------------------------*

  DEFINE ADD_ZERO.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        INPUT  = &1
      IMPORTING
        OUTPUT = &1.
  END-OF-DEFINITION.

*&---------------------------------------------------------------------*
*  FORM  DELIVERY
*&---------------------------------------------------------------------*
*  BAPI发货过账
*  输入参数:交货单号 P_VBELN
*&---------------------------------------------------------------------*
FORM  DELIVERY USING P_VBELN TYPE VBELN.
  DATA:G_LIKP LIKE  LIKP.
  DATA:G_LIPS LIKE  LIPS.
  DATA GV_14(14TYPE C.
  DATABEGIN OF I_VBKOK OCCURS 11.
          INCLUDE STRUCTURE VBKOK.
  DATAEND OF I_VBKOK.

  DATABEGIN OF I_VBPOK_TAB OCCURS 12.
          INCLUDE STRUCTURE VBPOK.
  DATAEND OF I_VBPOK_TAB.
  DATA:EF_ERROR_ANY TYPE XFELD.

  SELECT SINGLE INTO G_LIKP FROM LIKP
      WHERE VBELN P_VBELN.

  I_VBKOK-VBELN_VL        P_VBELN.        "DELIVERY NUMBER
  I_VBKOK-WABUC           'X'.            "AUTOMATIC PGI
  I_VBKOK-WADAT_IST       G_LIKP-BLDAT.
  APPEND I_VBKOK.

  SELECT INTO G_LIPS FROM LIPS
    WHERE VBELN P_VBELN.
    I_VBPOK_TAB-VBELN_VL    P_VBELN.      "DELIVERY NUMBER
    I_VBPOK_TAB-POSNR_VL    G_LIPS-POSNR.
    I_VBPOK_TAB-VBELN       P_VBELN.
    I_VBPOK_TAB-POSNN       G_LIPS-POSNR.
    I_VBPOK_TAB-MATNR       G_LIPS-MATNR.
    GV_14                   G_LIPS-LFIMG.
    CONDENSE GV_14.
    I_VBPOK_TAB-PIKMG       GV_14 .
    APPEND I_VBPOK_TAB.
  ENDSELECT.


  CALL FUNCTION 'WS_DELIVERY_UPDATE'
    EXPORTING
      VBKOK_WA       I_VBKOK
      COMMIT         'X'
      DELIVERY       P_VBELN
      UPDATE_PICKING 'X'
     IMPORTING
     EF_ERROR_ANY_0  EF_ERROR_ANY
    TABLES
      VBPOK_TAB      I_VBPOK_TAB
    EXCEPTIONS
      ERROR_MESSAGE  1
      OTHERS         2.



  IF EF_ERROR_ANY 'X'.
    WRITE:/ P_VBELN ' 发货过账失败!可能需要手动发货过账'.
  ELSE.
    WRITE:/ P_VBELN ' 发货过账成功!'.
  ENDIF.



ENDFORM.                    "DELIVERY



*&---------------------------------------------------------------------*
*  FORM  FM_UPLOAD_DATA
*&---------------------------------------------------------------------*
*  上传文件
*&---------------------------------------------------------------------*

FORM  FM_UPLOAD_DATA.
  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      FILENAME                = P_FIN
      I_BEGIN_COL             = 1
      I_BEGIN_ROW             = 1
      I_END_COL               = 255
      I_END_ROW               = 65536
    TABLES
      INTERN                  = IT_INTERN
    EXCEPTIONS
      INCONSISTENT_PARAMETERS = 1
      UPLOAD_OLE              = 2
      OTHERS                  = 3.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
  DELETE IT_INTERN WHERE ROW = 1.                    "删除字段名行

  LOOP AT IT_INTERN INTO WA_INTERN.                  "将EXCEL信息储存至内表IT_TAB_UPLOAD
    CASE WA_INTERN-COL.
      WHEN 1.
        WA_TAB_UPLOAD-SHIP_POINT = WA_INTERN-VALUE.
      WHEN 2.
        WA_TAB_UPLOAD-VBELN = WA_INTERN-VALUE.
        ADD_ZERO WA_TAB_UPLOAD-VBELN.
      WHEN 3.
        WA_TAB_UPLOAD-REF_ITEM = WA_INTERN-VALUE.
      WHEN 4.
        WA_TAB_UPLOAD-DLV_QTY = WA_INTERN-VALUE.
        APPEND WA_TAB_UPLOAD TO IT_TAB_UPLOAD.
    ENDCASE.
  ENDLOOP.


  LOOP AT IT_TAB_UPLOAD INTO WA_TAB_UPLOAD.          "填充BAPI参数表:SALES_ITEMS
    G_SHIP_POINT = WA_TAB_UPLOAD-SHIP_POINT.
    WA_SALES_ITEMS-REF_DOC = WA_TAB_UPLOAD-VBELN.
    WA_SALES_ITEMS-REF_ITEM = WA_TAB_UPLOAD-REF_ITEM.
    WA_SALES_ITEMS-DLV_QTY = WA_TAB_UPLOAD-DLV_QTY.
    SELECT SINGLE VRKME FROM VBAP INTO CORRESPONDING FIELDS OF WA_VBAP                                        "数量单位取VBAP中单位
      WHERE VBELN = WA_TAB_UPLOAD-VBELN
        AND POSNR = WA_TAB_UPLOAD-REF_ITEM.
    WA_SALES_ITEMS-SALES_UNIT = WA_VBAP-VRKME.
    APPEND WA_SALES_ITEMS TO SALES_ITEMS.
  ENDLOOP.
  PERFORM MANAGE_DATA.                                                                                        "创建交货单,发货过账

ENDFORM.                    "FM_UPLOAD_DATA


*&---------------------------------------------------------------------*
*  FORM  MANAGE_DATA
*&---------------------------------------------------------------------*
*  BAPI处理创建交货单
*&---------------------------------------------------------------------*

FORM  MANAGE_DATA.

  CALL FUNCTION 'BAPI_OUTB_DELIVERY_CREATE_SLS'
   EXPORTING
     SHIP_POINT             = G_SHIP_POINT
*   DUE_DATE                =
*   DEBUG_FLG               =
*   NO_DEQUEUE              = ' '
 IMPORTING
   DELIVERY                = G_DELIVERY
   NUM_DELIVERIES          = G_NUM_DELIVERIES
    TABLES
   SALES_ORDER_ITEMS       = SALES_ITEMS
   SERIAL_NUMBERS          = IT_SERIAL_NUMBERS
   EXTENSION_IN            = IT_EXTENSION_IN
   DELIVERIES              = IT_DELIVERIES
   CREATED_ITEMS           = IT_CREATED_ITEMS
   EXTENSION_OUT           = IT_EXTENSION_OUT
   RETURN                  = IT_RETURN
            .
  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
  EXPORTING
   WAIT = 'X'.
  LOOP AT IT_RETURN INTO WA_RETURN.
    IF WA_RETURN-ROW = 0.
    ELSE.
      READ TABLE IT_TAB_UPLOAD INTO WA_TAB_UPLOAD INDEX WA_RETURN-ROW.
      CONCATENATE WA_TAB_UPLOAD-MESSAGE WA_RETURN-MESSAGE INTO WA_TAB_UPLOAD-MESSAGE.
      MODIFY IT_TAB_UPLOAD FROM WA_TAB_UPLOAD INDEX WA_RETURN-ROW.
    ENDIF.
  ENDLOOP.

  LOOP AT IT_TAB_UPLOAD INTO WA_TAB_UPLOAD.
    IF WA_TAB_UPLOAD-MESSAGE IS NOT INITIAL.
      WRITE: / ' 单据号:', WA_TAB_UPLOAD-VBELN , ' 项目号:' , 
      WA_TAB_UPLOAD-REF_ITEM , '错误信息:', WA_TAB_UPLOAD-MESSAGE.
    ENDIF.
  ENDLOOP.

  IF IT_CREATED_ITEMS IS NOT INITIAL.


    WRITE: / , /  '==================================================================================================================================================================='.
    READ TABLE IT_CREATED_ITEMS INTO WA_CREATED_ITEMS INDEX 1.       "自动拣配过账

    WRITE: / , /  ' 已创建交货单:' , WA_CREATED_ITEMS-DELIV_NUMB.
*    LOOP AT IT_CREATED_ITEMS INTO WA_CREATED_ITEMS.
*      WRITE: / , /' 单据号:' , WA_CREATED_ITEMS-REF_DOC ,
*                  ' 项目号:' , WA_CREATED_ITEMS-REF_ITEM ,
*                  ' 发货单项目号:' , WA_CREATED_ITEMS-DELIV_ITEM ,
*                  ' 物料号:' , WA_CREATED_ITEMS-MATERIAL ,
*                  ' 发货数量:' , WA_CREATED_ITEMS-DLV_QTY ,
*                  ' 发货单位:' , WA_CREATED_ITEMS-SALES_UNIT.
*    ENDLOOP.
    PERFORM DELIVERY USING WA_CREATED_ITEMS-DELIV_NUMB.
  ELSE.
    WRITE: / , / ' 发货单未能创建!'.
  ENDIF.


ENDFORM.                    "MANAGE_DATA


*&---------------------------------------------------------------------*
*  FORM  FRM_F4_HELP
*&---------------------------------------------------------------------*
*  F4文件浏览帮助
*&---------------------------------------------------------------------*

FORM FRM_F4_HELP  CHANGING O_FNAME TYPE RLGRAP-FILENAME.
  DATA: L_FILETAB TYPE FILETABLE,
        L_WAFTAB LIKE LINE OF L_FILETAB,
        L_RC TYPE I.

  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
    EXPORTING
      WINDOW_TITLE            = '打开文件'
      INITIAL_DIRECTORY       = 'C:/'
    CHANGING
      FILE_TABLE              = L_FILETAB
      RC                      = L_RC
    EXCEPTIONS
      FILE_OPEN_DIALOG_FAILED = 1
      CNTL_ERROR              = 2
      ERROR_NO_GUI            = 3
      NOT_SUPPORTED_BY_GUI    = 4
      OTHERS                  = 5.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
               WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    EXIT.
  ELSE.
    READ TABLE L_FILETAB INTO L_WAFTAB INDEX 1.
    O_FNAME = L_WAFTAB-FILENAME.
    CLEAR: L_FILETAB,
           L_WAFTAB.
  ENDIF.

ENDFORM.                    "FRM_F4_HELP
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值