SAP入库自动创建采购订单,并更新批次特征值,物料分类,批次,特征值修改


MM03分类视图中相关表:

INOB:在内部编号和对象之间的链接。KLART字段对应“类别种类”,OBTAB='MARA'代表主数据配置,OBTAB=‘MCH1’代表批次数据(OBJEK=物料号&&批次)

KSSK:分配表: 对象到单个类。KSSK-OBJEK=AUSP-OBJEK,KSSK-OBJEK=INOB-CUOBJ(左边补0)

KLAH:类表头数据。CLASS字段对应“分配-类别”

KSML:类的特性。KSML-IMERK = AUSP-ATINN

AUSP:特征值。ATWRT字段对应“常规-特征值”

CABN:特征

CABNT:特性描述

批次相关表:

MCH1:批量(如果批次管理多工厂)。CHARG字段对应“批号”

 

相关设置操作-SAP MM批次管理(4)批次分类

https://blog.csdn.net/kangliujie/article/details/76129894

 

维护物料的批次特征值用到以下2个BAPI函数

BAPI_OBJCL_GETDETAIL
BAPI_OBJCL_CHANGE

 

如下代码主要实现入库自动创建采购订单,并根据ITEM_TEXT字段值更新批次特征值。

FUNCTION zsrm_create_mb01.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  EXPORTING
*"     VALUE(BKERRMSG) TYPE  BKK_ERRMSG
*"  TABLES
*"      IT_ITEM STRUCTURE  ZMM_MB01 OPTIONAL
*"      IT_RESULT STRUCTURE  ZMM_MB01_RESULT OPTIONAL
*"----------------------------------------------------------------------

  DATA: BEGIN OF gmhead.
          INCLUDE STRUCTURE bapi2017_gm_head_01.
  DATA: END OF gmhead.

  DATA: BEGIN OF gmcode.
          INCLUDE STRUCTURE bapi2017_gm_code.
  DATA: END OF gmcode.

  DATA: BEGIN OF mthead.
          INCLUDE STRUCTURE bapi2017_gm_head_ret.
  DATA: END OF mthead.

  DATA: BEGIN OF itab OCCURS 100.
          INCLUDE STRUCTURE bapi2017_gm_item_create.
  DATA: END OF itab.

  DATA: BEGIN OF errmsg OCCURS 10.
          INCLUDE STRUCTURE bapiret2.
  DATA: END OF errmsg.

  DATA:
    ls_item   TYPE zmm_mb01,
    ls_result TYPE zmm_mb01_result.

  DATA:
    lv_status TYPE string VALUE 'E',
    lv_ebeln  TYPE ebeln.
  DATA:  errflag.

  DATA:
    lv_classtype       TYPE bapi1003_key-classtype,
    lv_classnum        TYPE bapi1003_key-classnum,
    lv_objectkey       TYPE bapi1003_key-object,
    lt_allocvaluesnum  TYPE bapi1003_alloc_values_num OCCURS 0,
    lt_allocvalueschar TYPE bapi1003_alloc_values_char OCCURS 0,
    lt_allocvaluescurr TYPE bapi1003_alloc_values_curr OCCURS 0,
    lt_return          TYPE bapiret2 OCCURS 0,
    ls_return          TYPE bapiret2,
    lv_obj             TYPE ausp-objek,
    lv_clint           TYPE kssk-clint,
    lv_imerk           TYPE ksml-imerk,
    ls_allocvalueschar TYPE bapi1003_alloc_values_char.

  DATA ls_ausp LIKE ausp.

  READ TABLE it_item INTO ls_item INDEX 1.

  gmhead-pstng_date = ls_item-pstng_date.
  gmhead-doc_date = ls_item-pstng_date.
  gmhead-pr_uname = sy-uname.
  gmcode-gm_code = '01'.   "01 - MB01 - Goods Receipts for Purchase Order

  LOOP AT it_item INTO ls_item.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  = ls_item-material
      IMPORTING
        output = ls_item-material.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  = ls_item-vendor
      IMPORTING
        output = ls_item-vendor.
    itab-move_type  = ls_item-move_type.
    itab-mvt_ind    = 'B'.
    itab-plant      = ls_item-plant.
    itab-material   = ls_item-material.
    itab-entry_qnt  = ls_item-entry_qnt.
    itab-entry_uom  = ls_item-entry_uom.
    itab-move_stloc = ls_item-move_stloc.
    itab-stge_loc   = ls_item-move_stloc.
    itab-vendor     = ls_item-vendor.
    itab-item_text  = ls_item-item_text.
    itab-batch      = ls_item-batch.

    APPEND itab.
  ENDLOOP.



  CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
    EXPORTING
      goodsmvt_header  = gmhead
      goodsmvt_code    = gmcode
    IMPORTING
      goodsmvt_headret = mthead
    TABLES
      goodsmvt_item    = itab
      return           = errmsg.

  CLEAR errflag.
  LOOP AT errmsg.
    IF errmsg-type EQ 'E'.
      errflag = 'X'.
      bkerrmsg = bkerrmsg && errmsg-message.
    ELSE.
    ENDIF.
  ENDLOOP.

  IF errflag IS INITIAL.
    COMMIT WORK AND WAIT.
    IF sy-subrc NE 0.
      bkerrmsg = bkerrmsg && 'Error in updating'.
      EXIT.
    ELSE.
      lv_status = 'S'.
      WRITE:/ mthead-mat_doc, mthead-doc_year.
      SELECT SINGLE ebeln INTO lv_ebeln
        FROM mseg
        WHERE mblnr = mthead-mat_doc
        AND mjahr = mthead-doc_year.
    ENDIF.
  ENDIF.



  LOOP AT it_item INTO ls_item.
    MOVE-CORRESPONDING ls_item TO ls_result.
    ls_result-status = lv_status.
    ls_result-mblnr = mthead-mat_doc.
    ls_result-ebeln = lv_ebeln.

    IF lv_status = 'S'.
      CLEAR: lv_classtype,lv_classnum,lv_obj.
      REFRESH: lt_allocvaluesnum,lt_allocvalueschar,lt_allocvaluescurr,lt_return.

      SELECT SINGLE klart INTO lv_classtype  FROM inob WHERE obtab = 'MARA' AND objek = ls_item-material.

      lv_objectkey = ls_item-material && ls_item-batch.

      SELECT SINGLE cuobj INTO lv_obj  FROM inob WHERE obtab = 'MCH1' AND objek = lv_objectkey.

      SELECT SINGLE clint INTO lv_clint FROM kssk WHERE objek = lv_obj AND klart = lv_classtype.

      SELECT SINGLE imerk INTO lv_imerk FROM ksml WHERE clint = lv_clint.

      SELECT SINGLE class INTO lv_classnum FROM klah WHERE klart = lv_classtype.

      IF lv_classtype > ' ' AND lv_classnum > ' '.


        CALL FUNCTION 'BAPI_OBJCL_GETDETAIL'
          EXPORTING
            objectkey       = lv_objectkey
            objecttable     = 'MCH1'
            classnum        = lv_classnum
            classtype       = lv_classtype
          TABLES
            allocvaluesnum  = lt_allocvaluesnum
            allocvalueschar = lt_allocvalueschar
            allocvaluescurr = lt_allocvaluescurr
            return          = lt_return.
        READ TABLE lt_return INTO ls_return INDEX 1.
        IF ls_return-type = 'S'.
          READ TABLE lt_allocvalueschar INTO ls_allocvalueschar INDEX 1.
          IF sy-subrc = 0.
            ls_allocvalueschar-value_char = ls_item-item_text+00(30).
            ls_allocvalueschar-value_neutral = ls_item-item_text+00(30).
            MODIFY lt_allocvalueschar FROM ls_allocvalueschar INDEX 1.

            CALL FUNCTION 'BAPI_OBJCL_CHANGE'
              EXPORTING
                objectkey          = lv_objectkey
                objecttable        = 'MCH1'
                classnum           = lv_classnum
                classtype          = lv_classtype
                status             = '1'
                keydate            = sy-datum
              TABLES
                allocvaluesnumnew  = lt_allocvaluesnum
                allocvaluescharnew = lt_allocvalueschar
                allocvaluescurrnew = lt_allocvaluescurr
                return             = lt_return.
            READ TABLE lt_return INTO ls_return WITH KEY type = 'E'.
            IF sy-subrc = 0.
              bkerrmsg = bkerrmsg && ls_return-message.
              CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
            ELSE.
              CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
                EXPORTING
                  wait = 'X'.
            ENDIF.
          ELSE.
            CLEAR ls_ausp.
            ls_ausp-objek = lv_obj.
            ls_ausp-atinn = lv_imerk.
            ls_ausp-atzhl = '001'.
            ls_ausp-mafid = 'O'.
            ls_ausp-klart = lv_classtype.
            ls_ausp-adzhl = '0000'.
            ls_ausp-atwrt = ls_item-item_text+00(30).
            ls_ausp-atcod = '1'.
            INSERT INTO ausp VALUES ls_ausp.

          ENDIF.

        ENDIF.
      ENDIF.

    ENDIF.
    APPEND ls_result TO it_result.
  ENDLOOP.

ENDFUNCTION.

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM