金色传说:SAP-ABAP-交货单创建及过账工具类示例

文章目录

  • 前言
  • 一、工具类创建
  • 二、工具类方法
    • [1.POST_DN 交货单过账](#1.POST_DN 交货单过账)
      • [1.1 参数](#1.1 参数)
      • [1.2 代码](#1.2 代码)
    • [2.CREATE_DN_REF_SO 根据销售订单生成交货单](#2.CREATE_DN_REF_SO 根据销售订单生成交货单)
      • [2.1 参数](#2.1 参数)
      • [2.2 代码](#2.2 代码)
    • [3.CREATE_STO_DN_REF_PO 根据采购订单生成交货单](#3.CREATE_STO_DN_REF_PO 根据采购订单生成交货单)
      • [3.1 参数](#3.1 参数)
      • [3.2 代码](#3.2 代码)
    • [4.GET_XSLX_DATE 获取业务类型取值时间范围](#4.GET_XSLX_DATE 获取业务类型取值时间范围)
      • 4.1参数
      • 4.2代码
      • [4.3 自建表](#4.3 自建表)
        • [4.3.1 ZSDT_001](#4.3.1 ZSDT_001)
        • [4.3.2 ZSDT_005](#4.3.2 ZSDT_005)
    • [5.RECORD_EXCUTE_INFO 记录程序执行信息](#5.RECORD_EXCUTE_INFO 记录程序执行信息)
      • [5.1 无参数](#5.1 无参数)
      • [5.2 代码](#5.2 代码)
      • [5.3 自建表](#5.3 自建表)
    • [6.GET_TIMESTAMP 获取时间戳](#6.GET_TIMESTAMP 获取时间戳)
      • [6.1 参数](#6.1 参数)
      • [6.2 代码](#6.2 代码)
    • [7.GET_MATNR_VALUE 获取物料是否启用价值管](#7.GET_MATNR_VALUE 获取物料是否启用价值管)
      • [7.1 参数](#7.1 参数)
      • [7.2 代码](#7.2 代码)
    • [8. CHECK_DATE_VALIDATION 判断当前日期是否在有效账期内](#8. CHECK_DATE_VALIDATION 判断当前日期是否在有效账期内)
      • [8.1 参数](#8.1 参数)
      • [8.2 代码](#8.2 代码)
  • 三、调用示例

前言

封装的ABAP交货单创建和过账工具类代码,主要是为了方便ABAP的开发,可以收藏保存以便后用.


一、工具类创建

事务代码SE24,名称ZCL_UTILITY

二、工具类方法

1.POST_DN 交货单过账

1.1 参数

1.2 代码

c 复制代码
  method POST_DN.

    DATA: ls_header_data TYPE bapiobdlvhdrcon.
    DATA: ls_header_control TYPE bapiobdlvhdrctrlcon.
    DATA: lv_tzntstmps TYPE tzntstmps.
    DATA: lv_date TYPE sy-datum.
    DATA  lt_header_deadlines TYPE TABLE OF bapidlvdeadln .
    DATA  ls_header_deadlines TYPE bapidlvdeadln .

    lv_date = iv_date.
    CALL FUNCTION 'FRE_CONVERT_DATE_TO_TIMESTMP'
      EXPORTING
        ip_start_date = lv_date
        ip_time_zone  = 'UTC'
      IMPORTING
        ep_start_date = lv_tzntstmps.

    CLEAR:ls_header_data, ls_header_control.
    ls_header_data-deliv_numb   = iv_vbeln.
    ls_header_control-deliv_numb  = iv_vbeln .
    ls_header_control-post_gi_flg   = 'X'.
    ls_header_control-volume_flg = 'X'.

    CLEAR:lt_header_deadlines, ls_header_deadlines.
    ls_header_deadlines-deliv_numb = iv_vbeln.
    ls_header_deadlines-timestamp_utc = lv_tzntstmps.
    ls_header_deadlines-timetype = 'WSHDRWADTI'.
    APPEND ls_header_deadlines TO lt_header_deadlines.

    "外向交货单发货过账
    CLEAR:et_return.
    CALL FUNCTION 'BAPI_OUTB_DELIVERY_CONFIRM_DEC'
      EXPORTING
        header_data      = ls_header_data
        header_control   = ls_header_control
        delivery         = iv_vbeln
      TABLES
        header_deadlines = lt_header_deadlines
        return           = et_return.

    LOOP AT et_return TRANSPORTING NO FIELDS WHERE type CA 'EA'.
      EXIT.
    ENDLOOP.

    IF sy-subrc = 0.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      CALL FUNCTION 'RV_DELIVERY_INIT'
        EXPORTING
          status_buff_init = abap_true.

    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = 'X'.
    ENDIF.

  endmethod.

2.CREATE_DN_REF_SO 根据销售订单生成交货单

2.1 参数

2.2 代码

c 复制代码
  method CREATE_DN_REF_SO.

    DATA:lt_sales_order_items TYPE TABLE OF bapidlvreftosalesorder.
    DATA:ls_sales_order_items TYPE  bapidlvreftosalesorder.

    SELECT vbap~vbeln,vbap~posnr INTO TABLE @DATA(lt_vbap) FROM vbap
      WHERE vbeln = @iv_vbeln
      ##DB_FEATURE_MODE[TABLE_LEN_MAX1].

    CLEAR: lt_sales_order_items.
    LOOP AT lt_vbap INTO DATA(ls_vbap).
      CLEAR ls_sales_order_items.
      ls_sales_order_items-ref_doc = ls_vbap-vbeln.
      ls_sales_order_items-ref_item = ls_vbap-posnr.
      APPEND ls_sales_order_items TO lt_sales_order_items.
    ENDLOOP.

    CLEAR:ev_delivery_num,et_return.
    CALL FUNCTION 'BAPI_OUTB_DELIVERY_CREATE_SLS'
      IMPORTING
        delivery          = ev_delivery_num
      TABLES
        sales_order_items = lt_sales_order_items
*       SERIAL_NUMBERS    =
*       EXTENSION_IN      =
*       DELIVERIES        =
*       CREATED_ITEMS     =
*       EXTENSION_OUT     =
        return            = et_return.

    LOOP AT et_return TRANSPORTING NO FIELDS WHERE type CA 'EA'.
      EXIT.
    ENDLOOP.

    IF sy-subrc = 0.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      CALL FUNCTION 'RV_DELIVERY_INIT'
        EXPORTING
          status_buff_init = abap_true.

    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = 'X'.
    ENDIF.

  endmethod.

3.CREATE_STO_DN_REF_PO 根据采购订单生成交货单

3.1 参数

3.2 代码

c 复制代码
  method CREATE_STO_DN_REF_PO.

    DATA:ls_item TYPE bapidlvreftosto.
    DATA:lt_item TYPE TABLE OF bapidlvreftosto.
    DATA:lt_created_items  TYPE TABLE OF bapidlvitemcreated.

    SELECT ebeln, ebelp, menge,meins INTO TABLE @DATA(lt_ekpo) FROM ekpo
                                                        WHERE ebeln = @iv_ebeln AND
                                                              loekz = @abap_false.
    LOOP AT lt_ekpo INTO DATA(ls_ekpo) .
      CLEAR ls_item.
      ls_item-ref_doc = ls_ekpo-ebeln.
      ls_item-ref_item = ls_ekpo-ebelp.
      ls_item-dlv_qty = ls_ekpo-menge.
      ls_item-sales_unit = ls_ekpo-meins.
      APPEND ls_item TO lt_item.
    ENDLOOP.

    CALL FUNCTION 'BAPI_OUTB_DELIVERY_CREATE_STO'
      EXPORTING
        ship_point        = iv_ship_point
        due_date          = '99991231'
*       DEBUG_FLG         =
*       NO_DEQUEUE        = ' '
      IMPORTING
        delivery          = ev_delivery_num
*       NUM_DELIVERIES    =
      TABLES
        stock_trans_items = lt_item
*       SERIAL_NUMBERS    =
*       EXTENSION_IN      =
*       DELIVERIES        =
        created_items     = lt_created_items
*       EXTENSION_OUT     =
        return            = et_return.

    LOOP AT et_return INTO DATA(ls_return) WHERE type CA 'EA'.
      EXIT.
    ENDLOOP.

    IF sy-subrc = 0.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    ELSE.
      IF lines( lt_item ) = lines( lt_created_items ).
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait = 'X'.
      ELSE.
        CLEAR ev_delivery_num.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        ls_return-type = 'E'.
        MODIFY et_return FROM ls_return TRANSPORTING type WHERE type = 'W'.
      ENDIF.
    ENDIF.

  endmethod.

4.GET_XSLX_DATE 获取业务类型取值时间范围

4.1参数


ZSDT_001是自建表,结构在下方

4.2代码

c 复制代码
  method GET_XSLX_DATE.

    DATA: ls_xslx TYPE zsdt_001.

*** 获取所有业务类型
    SELECT * INTO TABLE @DATA(lt_005) FROM zsdt_005.

*** 读取业务类型的取值范围
    LOOP AT lt_005 INTO DATA(ls_005).

      SELECT SINGLE * INTO @DATA(ls_001) FROM zsdt_001 WHERE zzxslx = @ls_005-zzxslx AND ztybs = @abap_false.
      IF sy-subrc = 0.
        CLEAR ls_xslx.
        ls_xslx-zzxslx = ls_005-zzxslx.
        ls_xslx-begda  = ls_001-begda.
        ls_xslx-endda  = ls_001-endda.
        APPEND ls_xslx TO rt_xslx.
      ELSE.
        CLEAR ls_xslx.
        ls_xslx-zzxslx = ls_005-zzxslx.
        ls_xslx-begda  = '19000101'.
        ls_xslx-endda  = '99991230'.
        APPEND ls_xslx TO rt_xslx.
      ENDIF.

    ENDLOOP.

  endmethod.

4.3 自建表

4.3.1 ZSDT_001

未维护数据.

4.3.2 ZSDT_005

维护数据:

5.RECORD_EXCUTE_INFO 记录程序执行信息

5.1 无参数

5.2 代码

c 复制代码
  method RECORD_EXCUTE_INFO.

    DATA: ls_record TYPE zcat_record.

    CLEAR ls_record.
    ls_record-cprog = sy-cprog.
    ls_record-tcode = sy-tcode.
    ls_record-datum = sy-datum.
    ls_record-uzeit = sy-uzeit.
    ls_record-uname = sy-uname.

    MODIFY zcat_record FROM ls_record.
    IF sy-subrc = 0.
      COMMIT WORK.
    ENDIF.

  endmethod.

5.3 自建表

6.GET_TIMESTAMP 获取时间戳

6.1 参数

6.2 代码

c 复制代码
  method GET_TIMESTAMP.

    GET TIME STAMP FIELD rv_timestamp.

  endmethod.

7.GET_MATNR_VALUE 获取物料是否启用价值管

7.1 参数

7.2 代码

c 复制代码
  method GET_MATNR_VALUE.

*** Get 物料类型
    SELECT SINGLE mtart INTO @DATA(lv_mtart) FROM mara WHERE matnr = @iv_matnr.

*** 价值管理配置信息
    SELECT SINGLE  * INTO @DATA(ls_t134) FROM t134m WHERE bwkey = @iv_werks AND mtart = @lv_mtart.
    IF ls_t134-wertu = abap_true.
      rv_value = abap_true.
    ELSE.
      rv_value = abap_false.
    ENDIF.

  endmethod.

8. CHECK_DATE_VALIDATION 判断当前日期是否在有效账期内

8.1 参数

8.2 代码

c 复制代码
  method CHECK_DATE_VALIDATION.

    DATA:lv_year TYPE bapi0002_4-fiscal_year.
    DATA:lv_period TYPE bapi0002_4-fiscal_period.

*** 取日期的当前年度和当前日期
    CLEAR: lv_period,lv_year.
    CALL FUNCTION 'BAPI_COMPANYCODE_GET_PERIOD'
      EXPORTING
        companycodeid = iv_bukrs
        posting_date  = iv_date
      IMPORTING
        fiscal_year   = lv_year
        fiscal_period = lv_period
     "  RETURN        =
      .

    CLEAR rv_result.
*** 取物料账期数据
    SELECT SINGLE * INTO @DATA(ls_marv) FROM marv WHERE bukrs = @iv_bukrs.
    IF ls_marv-xruem = abap_true.

      IF  ls_marv-lfgja = lv_year AND ls_marv-lfmon = lv_period.
        rv_result = abap_true.
        RETURN.
      ENDIF.

      IF  ls_marv-vmgja = lv_year AND ls_marv-vmmon = lv_period.
        rv_result = abap_true.
        RETURN.
      ENDIF.

    ELSE.

      IF  ls_marv-lfgja = lv_year AND ls_marv-lfmon = lv_period.
        rv_result = abap_true.
      ENDIF.

    ENDIF.

  endmethod.

三、调用示例

请移步文章:金色传说:SAP-旺店通接口:SAP调用旺店通WMS的销售出库单查询接口示例-下

相关推荐
goyeer3 天前
05.[SAP ABAP] ABAP中的运算符
算法·sap·abap·运算符
千码君20164 天前
kotlin:基础类型的扩展函数有什么特点?
kotlin·工具类·this·扩展函数·接收者·安全类型·字符串验证
CodeAmaz15 天前
通用 List 分批切割并循环查询数据库工具类
java·数据结构·工具类·分页
爱喝水的鱼丶17 天前
SAP-ABAP:SAP概述:数据处理的系统、应用与产品
运维·学习·sap·abap·1024程序员节
1314lay_100718 天前
SAP ABAP 导入excel表,导多个sheet
excel·abap
一叶飘零_sweeeet20 天前
不止于 API 调用:解锁 Java 工具类设计的三重境界 —— 可复用性、线程安全与性能优化
java·工具类
IT小白农民工21 天前
安装SAP Business one for HANA之前的准备
linux·经验分享·sap
寒武青锋21 天前
SAP 后台批量激活程序
sap·abap
LilySesy1 个月前
ABAP+在select的时候,可以A=B A=C B=C这样子JOIN吗?
数据库·sql·ai·excel·sap·abap