第一步  CALL FUNCTION 'BAPI_OUTB_DELIVERY_CREATE_SLS'

这个参数少,没有库位,批号信息

SAP SAP 交货单批导三部走(带批次)

SAP SAP 交货单批导三部走(带批次)

第二步 BADI 增强内部传值

SAP SAP 交货单批导三部走(带批次)

SAP SAP 交货单批导三部走(带批次)

SAP SAP 交货单批导三部走(带批次)

SAP SAP 交货单批导三部走(带批次)

SAP SAP 交货单批导三部走(带批次)

SAP SAP 交货单批导三部走(带批次)

 

第三步 修改交货单加上批次

SAP SAP 交货单批导三部走(带批次)

SAP SAP 交货单批导三部走(带批次)

SAP SAP 交货单批导三部走(带批次)

 

源码:


*&---------------------------------------------------------------------*
REPORT zsd017.
TABLESsscrfields,pbim.

DATAls_functxt TYPE smp_dyntxt"功能代码文本
DATAgv_flag TYPE c LENGTH  .

TYPESBEGIN OF ty_upload,
         vbeln    LIKE vbap-vbeln ,    订单号
         posnr    LIKE vbap-posnr ,    订单行项目
         posnr2   LIKE vbap-posnr ,    订单行项目
         erdat    LIKE lips-erdat,
         posnr3   LIKE lips-posnr,
         lgort    LIKE lips-lgort,
         lfimg    LIKE lips-lfimg,
         charg    TYPE  lips-charg,
         pc02     TYPE c LENGTH 10,
         vbeln_dn TYPE lips-vbeln,
         icon     TYPE icon_d,
         zmsg     TYPE char255,
         zmsg2    TYPE char255,
       END OF ty_upload.




DATAlf_vbeln  TYPE vbeln_vl,
      lf_num    TYPE vbnum,
      ls_deli   TYPE bapishpdelivnumb,
      lt_deli   TYPE TABLE OF bapishpdelivnumb,
      lt_order  TYPE TABLE OF bapidlvreftosalesorder,
      ls_order  TYPE bapidlvreftosalesorder,
      ls_itm    TYPE bapidlvitemcreated,
      lt_itm    TYPE TABLE OF bapidlvitemcreated,
      ls_ext    TYPE bapiparex,
      lt_extin  TYPE TABLE OF bapiparex,
      lt_extout TYPE TABLE OF bapiparex,
      ls_ret    TYPE bapiret2,
      lt_return TYPE TABLE OF bapiret2.

TYPES:BEGIN OF ty_vbap,
        vbeln  LIKE vbap-vbeln,
        posnr  LIKE vbap-posnr,
        kwmeng LIKE vbap-kwmeng,
        meins  LIKE vbap-meins,
      END OF ty_vbap.

DATA:it_vbap TYPE TABLE OF ty_vbap.
DATA:ws_vbap TYPE ty_vbap.

DATAgt_out TYPE TABLE OF ty_upload,
      gs_out TYPE ty_upload.



DATAgt_fieldcat TYPE TABLE OF  slis_fieldcat_alv.
DATAgs_fieldcat TYPE slis_fieldcat_alv.
DATAgs_layout TYPE slis_layout_alv .

PARAMETERSp_erdat  LIKE vbak-erdat  OBLIGATORY .

SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE TEXT-001.
  PARAMETERSp_path LIKE rlgrap-filename MODIF ID m1.
SELECTION-SCREEN END OF BLOCK blk1.



INITIALIZATION.
  SELECTION-SCREENFUNCTION KEY 1.

  ls_functxt-icon_id   icon_export.     "FUNCTXT_01按钮设置图标
  ls_functxt-quickinfo '模版选择下载'.   "FUNCTXT_01按钮设置指针悬停文本
  ls_functxt-icon_text '模板选择下载'.   "FUNCTXT_01按钮设置显示文本
  sscrfields-functxt_01 ls_functxt.

AT SELECTION-SCREEN.
  IF sy-ucomm 'FC01'.
    PERFORM frm_download.
  ENDIF.


AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path.

  DATAl_filename LIKE rlgrap-filename.

  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
*     DEF_FILENAME     = ',*.XLSX,*.XLSX;,*.XLS,*.XLS;'
*     DEF_PATH         = ' '
      mask             ',Excel file,*.xls;*.xlsx;'  "
      mode             'O'
*     TITLE            = ' '
    IMPORTING
      filename         l_filename
*     RC               =
    EXCEPTIONS
      inv_winsys       1
      no_batch         2
      selection_cancel 3
      selection_error  4
      OTHERS           5.
  IF sy-subrc 0.
    p_path  l_filename.
  ENDIF.

START-OF-SELECTION.
  "提示选择导入文件
  IF p_path IS INITIAL.
    MESSAGE '请选择导入文件!TYPE 'S' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
    RETURN.
  ENDIF.
  PERFORM frm_upload.
  PERFORM check_data .
  PERFORM display_alv .



*----------------------------------------------------------------------*
* END-OF-SELECTION                                                     *
*----------------------------------------------------------------------*
END-OF-SELECTION.


*&---------------------------------------------------------------------*
*& Form FRM_UPLOAD
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_upload .

  DATA:
    lt_excel_data                 TYPE zsalsmex_tabline2 OCCURS WITH HEADER LINE,
    ls_excel_data                 TYPE zsalsmex_tabline2,
    ls_result                     TYPE TY_upload,
    lr_cx_sy_conversion_no_number TYPE REF TO cx_sy_conversion_no_number.
  FIELD-SYMBOLS:
    <fs_value>.

  CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      filename                p_path
      i_begin_col             
1
      i_begin_row             2        "读取开始行:
      i_end_col               90       "读取的列数
      i_end_row               50000    "最多读取5万行 "65535.
    TABLES
      intern                  lt_excel_data
    
EXCEPTIONS
      inconsistent_parameters 1
      upload_ole              2
      OTHERS                  3.

  LOOP AT lt_excel_data INTO ls_excel_data.
    AT NEW row.
      CLEAR ls_result.
    ENDAT.

    TRY.
        ASSIGN COMPONENT ls_excel_data-col OF STRUCTURE LS_result TO <fs_value>.
        MOVE ls_excel_data-value TO <fs_value>.
      CATCH cx_sy_conversion_no_number INTO lr_cx_sy_conversion_no_number.


    ENDTRY.

    AT END OF row.

      APPEND ls_result TO gt_out .
    ENDAT.
  ENDLOOP.

*  MOVE-CORRESPONDING gt_upload[] TO gt_alv[].

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DOWNLOAD
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_download .
  DATAlw_key        TYPE wwwdatatab,
        l_filename    TYPE string,
        l_path        TYPE string,
        l_fullpath    TYPE string,
        l_destination TYPE rlgrap-filename.
  DATAlv_objid     TYPE w3objid VALUE 'ZSD017',
        lv_fieldname TYPE string.

  lv_fieldname '交货单批导模板'.
判断模版是否存在
  SELECT SINGLE *
  
INTO CORRESPONDING FIELDS OF lw_key
  
FROM wwwdata
  
WHERE relid EQ 'MI'
  AND   objid EQ lv_objid.
  IF sy-subrc NE 0.
*    MESSAGE S000(ZZZCOMMON001) WITH UV_OBJID.
    RETURN.
  ENDIF.

调用函数打开文件选择框
  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    
EXPORTING
      default_extension         cl_gui_frontend_services=>filetype_excel
      default_file_name         
lv_fieldname
      file_filter               
'EXCEL文件(*.XLS)|*.XLS|全部文件 (*.*)|*.*|'
    CHANGING
      filename                  l_filename
      path                      
l_path
      fullpath                  
l_fullpath
    
EXCEPTIONS
      cntl_error                1
      error_no_gui              2
      not_supported_by_gui      3
      invalid_default_file_name 4
      OTHERS                    5.
  IF sy-subrc <> 0.
  ENDIF.
  CHECK l_fullpath NE ''.

下载模版
  l_destination l_fullpath.
  CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
    EXPORTING
      key         lw_key
      destination 
l_destination.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_dn_create
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_dn_create .
  DATAi_vbkok TYPE vbkok.

  DATAlv_vstel LIKE likp-vstel,
        lv_vbeln LIKE likp-vbeln.
  DATAlt_soitem    LIKE bapidlvreftosalesorder OCCURS WITH HEADER LINE,
        lt_return    LIKE bapiret2 OCCURS WITH HEADER LINE,
        lt_extension LIKE bapiparex OCCURS WITH HEADER LINE.
  DATAlv_mseg(220).

  DATA:lt_out LIKE TABLE OF gs_out .
  DATAls_out LIKE gs_out .
  DATAlv_vygid TYPE likp-itm_vygid .

  lt_out gt_out .
  SORT lt_out BY   vbeln   posnr   posnr2    .
  DELETE ADJACENT DUPLICATES FROM lt_out  COMPARING vbeln posnr posnr2 .
  LOOP AT lt_out INTO ls_out .
    lv_vygid 'BADI2' .
    LOOP AT gt_out   INTO gs_out WHERE  vbeln ls_out-vbeln AND posnr ls_out-posnr AND posnr2 ls_out-posnr2 AND posnr3  EQ '10' .
      lv_vstel =  'Z001'.
      REFRESHlt_soitemlt_return.
      CLEARlt_soitemlt_return.

      lt_soitem-ref_doc     gs_out-vbeln.
      lt_soitem-ref_item    gs_out-posnr.
      lt_soitem-dlv_qty     gs_out-lfimg.
      SELECT SINGLE meins INTO lt_soitem-sales_unit FROM vbap WHERE vbeln GS_out-vbeln AND posnr gs_out-posnr .
      APPEND lt_soitem.
      CLEAR lt_soitem.
    ENDLOOP.
    "传值给内存
    EXPORT ls_out-lgort  TO MEMORY ID 'zsd0117lgort'.
    EXPORT lv_vygid  TO MEMORY ID 'zsd0117vygid'.

    IF lt_soitem[] IS NOT INITIAL.
      CALL FUNCTION 'BAPI_OUTB_DELIVERY_CREATE_SLS'
        EXPORTING
          ship_point        lv_vstel
          due_date          
p_erdat
        
IMPORTING
          delivery          lv_vbeln
        
TABLES
          sales_order_items lt_soitem
          
return            lt_return.

      READ TABLE lt_return WITH KEY type 'E'.
      IF sy-subrc <> 0.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait 'X'.
        LOOP AT gt_out INTO gs_out WHERE vbeln ls_out-vbeln AND posnr ls_out-posnr AND posnr2 ls_out-posnr2  .
*      SELECT * INTO TABLE gt_lips FROM lips WHERE vbeln = lv_vbeln AND posnr < '900000'.
*      LOOP AT gt_Out   WHERE refno = gt_do-refno AND vstel = gt_do-vstel.
          gs_out-vbeln_dn lv_vbeln.
          gs_out-zmsg    '导入成功,批次未成功'.
          gs_out-icon icon_led_yellow.
*          CLEAR: gt_lips.
*          READ TABLE gt_lips WITH KEY vgbel = gt_result-vbeln vgpos = gt_result-posnr.
*          gt_result-posnr_vl = gt_lips-posnr.
          MODIFY gt_out  FROM  gs_out  TRANSPORTING vbeln_dn   zmsg icon.
        ENDLOOP.
*      IF p_pgi = 'X'.
*        CLEAR lv_mseg.
*        PERFORM pgi_dn USING lv_vbeln CHANGING lv_mseg.
*        IF lv_mseg IS NOT INITIAL.
*          gt_result-zmsg = '自动过帐失败!' && lv_mseg.
*          gt_result-icon = icon_led_green.
*          MODIFY gt_result TRANSPORTING zmsg icon WHERE refno = gt_do-refno AND vstel = gt_do-vstel.
*        ENDIF.
*      ENDIF.
      ELSE.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        CLEARlv_mseg.
        LOOP AT lt_return WHERE type 'E'.
          CONCATENATE lv_mseg lt_return-message INTO lv_mseg SEPARATED BY '|'.
        ENDLOOP.
        LOOP AT gt_out INTO gs_out WHERE vbeln ls_out-vbeln AND posnr ls_out-posnr AND posnr2 ls_out-posnr2  .
          gs_out-vbeln_dn ''.
          gs_out-icon icon_led_red.
          gs_out-zmsg    lv_mseg.
          MODIFY gt_out FROM   gs_out  TRANSPORTING   zmsg icon  .
        ENDLOOP .
      ENDIF.
    ENDIF.
    FREE MEMORY  ID  'zsd0117lgort'.
  ENDLOOP .
  "拆分批次
  WAIT UP TO 2  SECONDS .
  DATA:
    lit_header_partner   LIKE TABLE OF bapidlvpartnerchg           "交货:合作伙伴更改
    lit_header_deadlines LIKE TABLE OF bapidlvdeadln               "交货截止日期
    lit_item_data        LIKE TABLE OF bapiobdlvitemchg            "更改外向交货拣配数据项目等级
    lit_item_control     LIKE TABLE OF bapiobdlvitemctrlchg        "外向交货项目级别控制数据
    lit_ret              LIKE TABLE OF bapiret2   WITH HEADER LINE "返回参数
    lit_item_data_spl    LIKE TABLE OF /spe/bapiobdlvitemchg       "更改向外交货拣配数据项目等级(SPE
    is_header_data       LIKE          bapiobdlvhdrchg             "更改外向交货拣配数据表头等级
    is_header_control    LIKE          bapiobdlvhdrctrlchg         "外向交货标题级别控制数据
    iv_delivery          LIKE          bapiobdlvhdrchg-deliv_numb  "交货

  DATA:
    lwa_header_partner   LIKE          bapidlvpartnerchg           "交货:合作伙伴更改
    lwa_header_deadlines LIKE          bapidlvdeadln               "交货截止日期
    lwa_item_data        LIKE          bapiobdlvitemchg            "更改外向交货拣配数据项目等级
    lwa_item_control     LIKE          bapiobdlvitemctrlchg        "外向交货项目级别控制数据
    lwa_return           LIKE          bapiret2                    "返回参数


  DATAl_techn_control  TYPE bapidlvcontrol.
  DATA:
    ls_item         TYPE bapiobdlvitemchg,
    ls_item_t       TYPE bapiobdlvitemchg,
    ls_item_control TYPE bapiobdlvitemctrlchg,
    ls_deadlines    TYPE bapidlvdeadln.

  CLEAR ls_out ,lt_out[] .
  lt_out gt_out .
  SORT lt_out BY   vbeln      posnr    posnr2    .
  DELETE ADJACENT DUPLICATES FROM lt_out  COMPARING vbeln posnr posnr2 .

  DATA lv_lfimg    LIKE lips-lfimg .
*  DATA : lv_posnr_old LIKE lwa_item_data-hieraritem .
  DATA lv_posnr_old LIKE lips-posnr .
  LOOP AT lt_out INTO ls_out WHERE vbeln_dn <> '' .
    "抬头信息
    iv_delivery ls_out-vbeln_dn .
    is_header_data-deliv_numb     ls_out-vbeln_dn "交货单号
    is_header_control-deliv_numb  ls_out-vbeln_dn .
    lv_lfimg  .

    "拆分批次项目
    "获取原来行项目
    SELECT SINGLE posnr INTO  lv_posnr_old
      
FROM lips
     
WHERE vbeln =  ls_out-vbeln_dn
     
AND vgbel ls_out-vbeln
     
AND vgpos ls_out-posnr .

    LOOP AT gt_out   INTO gs_out WHERE posnr3+0(1EQ '9' AND vbeln_dn  ls_out-vbeln_dn .
      CLEAR lwa_item_data.
      lwa_item_data-deliv_numb gs_out-vbeln_dn.
      lwa_item_data-deliv_item gs_out-posnr3.       "拆分后的新行项目
      "上级行项目(交货单行项目)
      lwa_item_data-hieraritem lv_posnr_old.             "上级行项目

      lwa_item_data-batch      gs_out-charg.   "新批次
      lwa_item_data-dlv_qty    gs_out-lfimg.              "自己重新计算拆分后的数量,
      lwa_item_data-dlv_qty_imunit gs_out-lfimg.
      lwa_item_data-fact_unit_nom   1.       "销售数量转换成SKU的分子(因子)
      lwa_item_data-fact_unit_denom 1.       "销售数量转换为 SKU 的值(除数)
*lwa_item_data-base_uom        = 'KG'.    "基本单位
*lwa_item_data-sales_unit      = 'KG'.    "销售单位
      lwa_item_data-usehieritm      '1'.

      "ctrol
      CLEAR lwa_item_control.
      lwa_item_control-deliv_numb gs_out-vbeln_dn.
      lwa_item_control-deliv_item gs_out-posnr3. . "拆分后的新行项目
      lwa_item_control-chg_delqty 'X'.      "数量修改标志
      APPEND lwa_item_control TO lit_item_control  .


      APPEND lwa_item_data TO lit_item_data.
      lv_lfimg lv_lfimg + gs_out-lfimg .
    ENDLOOP.
    "原来行项目修改
    CLEAR lwa_item_data.
    lwa_item_data-deliv_numb     =  ls_out-vbeln_dn.
    lwa_item_data-deliv_item     lv_posnr_old.      "原行项目
    lwa_item_data-batch          ls_out-charg.
    lwa_item_data-dlv_qty        =  ls_out-lfimg lv_lfimg .
    lwa_item_data-dlv_qty_imunit ls_out-lfimg lv_lfimg ..
*lwa_item_data-base_uom       = 'KG'.    "基本单位
*lwa_item_data-sales_unit     = 'KG'.    "销售单位

    lwa_item_data-fact_unit_nom   1.      "销售数量转换成SKU的分子(因子)
    lwa_item_data-fact_unit_denom 1.     "销售数量转换为 SKU 的值(除数)

    APPEND lwa_item_data TO lit_item_data .

    CLEAR lwa_item_control.
    lwa_item_control-deliv_numb ls_out-vbeln_dn.
    lwa_item_control-deliv_item lv_posnr_old.       "原行项目
    lwa_item_control-chg_delqty 'X'.      "数量修改标志

    APPEND lwa_item_control TO lit_item_control.


    CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
      EXPORTING
        header_data      is_header_data
        header_control   
is_header_control
        delivery         
iv_delivery
      
TABLES
        header_partner   lit_header_partner
        header_deadlines 
lit_header_deadlines
        item_data        
lit_item_data
        item_control     
lit_item_control
        
return           lit_ret.

    CLEAR :  lit_item_data[] .
    CLEAR lit_item_control[] .

    IF lit_ret[] IS INITIAL.
      COMMIT WORK AND WAIT.

      LOOP AT gt_out   INTO gs_out WHERE  vbeln_dn  ls_out-vbeln_dn .
        gs_out-zmsg2 '批次拆分成功.
        gs_out-zmsg    '导入成功'.
        gs_out-icon icon_led_green.
        MODIFY gt_out FROM gs_out .
      ENDLOOP .
    ELSE .
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.



    ENDIF.

    CLEAR lit_ret[] .


  ENDLOOP .

ENDFORM.
*&---------------------------------------------------------------------*
*& Form display_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM display_alv .
  DEFINE append_field.
    gs_fieldcat-fieldname &1.
    gs_fieldcat-seltext_l &2.
    APPEND gs_fieldcat TO gt_fieldcat.
    CLEARgs_fieldcat.
  END-OF-DEFINITION.

  append_field'ICON' '状态.
  append_field'ZMSG' '创建消息.
  append_field'ZMSG2' '拆分消息.
  append_field'VBELN_DN' '交货单号.
  append_field'VBELN' '销售订单号.
  append_field'POSNR' '销售订单行项目.
  " append_field: 'ZZNME' '物料名称' .
  append_field'POSNR2' '自定义交货单号.
  append_field'ERDAT' '送货日期.
  append_field'POSNR3' '交货单行项目'.
  append_field'LGORT' '库位.
  append_field'LFIMG' '出货数量.
  append_field'CHARG' '生产批次.




*  gs_layout-box_fieldname = 'MARK'.
  gs_layout-colwidth_optimize 'X'.


  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program       sy-repid
      i_callback_pf_status_set 
'FRM_STATUS_SET'
      i_callback_user_command  'FRM_USER_COMMAND'
*
*     I_GRID_SETTINGS          =
      is_layout                gs_layout
      it_fieldcat              
gt_fieldcat
*     ES_EXIT_CAUSED_BY_USER   =
    TABLES
      t_outtab                 gt_out
    
EXCEPTIONS
      program_error            1
      OTHERS                   2.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.
ENDFORM.

FORM frm_status_set USING ut_extab TYPE slis_t_extab.
  SET PF-STATUS 'PF_001'.
ENDFORM.



FORM frm_user_command USING uv_ucomm LIKE sy-ucomm
                          us_selfield 
TYPE slis_selfield.



  IF  sy-ucomm EQ 'IMPORT' .
    IF gv_flag <> 'NG' .
      PERFORM frm_dn_create.
      us_selfield-refresh 'X'.
    ELSE .
      MESSAGE '导入数据有问题,请修正后再导入'  TYPE 'E' .
    ENDIF .
  ENDIF .
ENDFORM .
*&---------------------------------------------------------------------*
*& Form check_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM check_data .

  DATAlt_out LIKE TABLE OF gs_out .
  DATAls_out LIKE gs_out .
  DATA lv_charg LIKE mchb-charg .
  DATA lv_matnr LIKE mara-matnr .
  LOOP AT gt_out INTO gs_out .
    SELECT SINGLE matnr INTO lv_matnr FROM vbap WHERE vbeln =   gs_out-vbeln AND posnr gs_out-posnr  .
    CLEAR lv_charg .
    SELECT  SINGLE charg  INTO lv_charg
       
FROM mch1
      
WHERE  matnr =  lv_matnr
      
AND charg gs_out-charg.

    IF lv_charg IS INITIAL .
      gs_out-icon =  icon_led_red .
      gs_out-zmsg '批次不存在.
      Gv_flag 'NG' .
    ELSE.
      gs_out-icon =  icon_led_green .
      gs_out-zmsg '批次检查通过.

    ENDIF .
    MODIFY gt_out FROM gs_out .

  ENDLOOP .

  SORT gt_out BY posnr posnr .
  LOOP AT gt_out INTO gs_out  .
    IF gs_out+0(1<> '9'.
      ls_out-lfimg ls_out-lfimg + gs_out-lfimg .
    ENDIF .
    ls_out-vbeln gs_out-vbeln .
    ls_out-posnr gs_out-posnr .
    AT END OF posnr .
      APPEND ls_out TO lt_out .
      CLEAR :ls_out .
    ENDAT .

  ENDLOOP .






ENDFORM.

相关文章: