MIGO期初库存导入(移动类型:561,特征值的值设置)

业务需求

  • 物料数据批次创建,以及对应批次特性值的值修改。
  • 用户导入前进行数据校验,如果有一条数据错误,提示错误全部数据不导入

需求分析

先根据前台操作,查看涉及到哪些BAPI以及函数。

前台操作

MIGO期初库存导入(移动类型:561,特征值的值设置)插图T-CODE:MIGO   A01收货  R10其他 移动类型561   (物料 工厂 存储地点等输入)


MIGO期初库存导入(移动类型:561,特征值的值设置)插图1

批次设置  TEST220621  


MIGO期初库存导入(移动类型:561,特征值的值设置)插图2

批次分类属性设置    最近的收货日期  供应商账户号   挂账方式


BAPI&函数

  • 物料数据以及批次的创建
    • BAPI_GOODSMVT_CREATE 货物移动
  • 批次的特性值设置
    • BAPI_BATCH_CHANGE  批次基础数据修改
    • VB_BATCH_2_CLASS_OBJECT 获取批次相关信息
    • VB_CHANGE_BATCH 批次特性值的值修改

代码思路

功能分析

  • EXCEL 下载上载
  • ALV展示
  • 针对数据的校验
  • MIGO货物移动(移动类型为561)
  • 特性值的值创建

代码实现

MIGO货物移动(移动类型为561)

*&---------------------------------------------------------------------*
* 定义
*----------------------------------------------------------------------* 
*BAPI数据定义
DATA: wa_header  TYPE bapi2017_gm_head_01,
        wa_code    TYPE bapi2017_gm_code,
        wa_headret TYPE bapi2017_gm_head_ret.
*临时数据定义
 DATA: lt_item   TYPE TABLE OF bapi2017_gm_item_create WITH HEADER LINE.
*&---------------------------------------------------------------------*
* 填充BAPI数据
*----------------------------------------------------------------------*
*凭证日期  过账日期
  CLEAR: wa_header.
  wa_header-pstng_date = p_erdat.  "凭证日期   选择屏幕元素
  wa_header-doc_date   = p_docdat.  "过账日期   选择屏幕元素

*移动类型 为 BAPI 货物移动分配事务代码
  CLEAR: wa_code.
  wa_code-gm_code = '05'."收货其他

*工厂 库存地点 物料编码 批次 数量 计量单位 库存金额的填充
LOOP AT it_data INTO wa_data.
	CLEAR: lt_item.   "清楚临时BAPI数据
*"填充基本数据 移动类型 移动表示
	 lt_item-move_type   = '561' .   "移动类型561
   	 lt_item-mvt_ind     = ' '.      " XXX
*"填充BAPI  EXCEL数据
        lt_item-plant         =    wa_data-werks   .      " 工厂
        lt_item-stge_loc      =    wa_data-lgort   .      " 库存地点
        lt_item-material      =    wa_data-matnr   .      " 物料编码
        lt_item-batch         =    wa_data-charg   .      " 批次
        lt_item-entry_qnt     =    wa_data-menge   .      " 数量
        lt_item-entry_uom     =    wa_data-meins   .      " 计量单位
        lt_item-amount_lc     =    wa_data-exbwr   .      " 库存金额
        lt_item-STCK_TYPE     =    ''   .      " 库存金额
*"针对特殊库存进行判断
*这里导入数据有要求做区分
    CASE wa_data-sobkz.
      WHEN 'O'.
        lt_item-vendor  = wa_data-lifnr .     "供应商
           lt_item-SPEC_STOCK = wa_data-sobkz .   "特殊库存类型
      WHEN 'E'.
        lt_item-val_sales_ord  = wa_data-kunnr. "销售订单
        lt_item-val_s_ord_item  = wa_data-kunnr1. "销售行项目
          lt_item-SPEC_STOCK = wa_data-sobkz .   "特殊库存类型
*销售定单号 前导零处理
CALL  FUNCTION  'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
            input    =  lt_item-val_sales_ord
        IMPORTING
            output  =  lt_item-val_sales_ord .
*销售行项目 前导零处理
CALL  FUNCTION  'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
            input    =  lt_item-val_s_ord_item
        IMPORTING
            output  =  lt_item-val_s_ord_item .
ENDCASE.

    APPEND lt_item.

CLEAR: lt_return[].
      CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
        EXPORTING
          goodsmvt_header  = wa_header
          goodsmvt_code    = wa_code
        IMPORTING
          goodsmvt_headret = wa_headret
        TABLES
          goodsmvt_item    = lt_item
          return           = lt_return.
*判断是否有错误信息 有的话回滚  没有的话 执行
      LOOP AT lt_return WHERE type = 'E' OR type = 'A'.
      ENDLOOP.

      IF sy-subrc = 0.
        ROLLBACK WORK. 
      ELSE.
        COMMIT WORK AND WAIT.
      ENDIF.
    ENDIF.

  ENDLOOP.

上面的代码没有详细写it_data的结构等等

这个BAPI调用起来没什么问题。

特性值的值创建

特性值的创建踩了一些坑,在调用 VB_CHANGE_BATCH 修改批次特性值的时候,当特性值有附加属性的时候 通过这个函数无法修改。

MIGO期初库存导入(移动类型:561,特征值的值设置)插图3

比如最近的收货日期做修改,在前台MSC3N进行修改,将收货日期改为2021.06.21.

MIGO期初库存导入(移动类型:561,特征值的值设置)插图4

保存再返回的时候也是空值。


后面发现最近收货日期有附加数据,无法这样直接修改,要在基础数据做修改才可以生效。

MIGO期初库存导入(移动类型:561,特征值的值设置)插图5

MIGO期初库存导入(移动类型:561,特征值的值设置)插图6

所以在修改批次属性的时候就涉及到了2个步骤。

    1. 修改批次基础数据
    2. 再对批次的分类进行修改

修改批次基础数据

*&---------------------------------------------------------------------* 
* 定义
*----------------------------------------------------------------------*
DATA: ls_bapibatch  TYPE bapibatchatt.
  DATA: ls_bapibatchx TYPE bapibatchattx.
  DATA: lt_return     TYPE STANDARD TABLE OF bapiret2.

*&---------------------------------------------------------------------* 
*填充数据
*----------------------------------------------------------------------*
  ls_bapibatch-lastgrdate = lw_batch-zmm01 . "最近收货日期
  ls_bapibatch-vendor_no = lw_batch-zmm02 ."供应商

  ls_bapibatchx-lastgrdate = 'X'.
  ls_bapibatchx-vendor_no = 'X'.

*&---------------------------------------------------------------------* 
*调用BAPI
*----------------------------------------------------------------------*
  CALL FUNCTION 'BAPI_BATCH_CHANGE'
    EXPORTING
      material         = lw_batch-material
      batch            = lw_batch-batch
      plant            = lw_batch-plant
      batchattributes  = ls_bapibatch
      batchattributesx = ls_bapibatchx
    TABLES
      return           = lt_return.

  IF sy-subrc = 0.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.
  ENDIF.

 

 

修改批次分类

*&---------------------------------------------------------------------* 
* 定义
*----------------------------------------------------------------------*
  DATA:e_objek TYPE CUOBN,
       e_objek1 TYPE BAPI1003_KEY-OBJECT,
       e_obtab TYPE tabelle,
       e_klart TYPE klassenart,
       e_class TYPE klasse_d,
       wa_mcha TYPE mcha.

  DATA BEGIN OF it_char OCCURS 0.
  INCLUDE STRUCTURE clbatch.
  DATA END OF it_char.

  DATA BEGIN OF bapi_return1 OCCURS 0.
  INCLUDE STRUCTURE bapiret2.
  DATA END OF bapi_return1.

  DATA: lt_mcha_chg TYPE TABLE OF mcha WITH HEADER LINE.
*&---------------------------------------------------------------------* 
*获取批次特征值属性
*----------------------------------------------------------------------*
  CALL FUNCTION 'VB_BATCH_2_CLASS_OBJECT'
    EXPORTING
      i_matnr = lw_batch-matnr
      i_charg = lw_batch-batch
      i_werks = lw_batch-plant
    IMPORTING
      e_objek = e_objek
      e_obtab = e_obtab
      e_klart = e_klart
      e_class = e_class.

*&---------------------------------------------------------------------* 
*从MCHA表获取数据
*----------------------------------------------------------------------*
  SELECT SINGLE * INTO wa_mcha FROM mcha WHERE matnr = lw_batch-matnr
      AND werks = lw_batch-plant AND charg = lw_batch-batch.
*&---------------------------------------------------------------------* 
*填充数据
*----------------------------------------------------------------------*
 "特征值属性  一般顾问会给到  或者在批次-分类-特征描述按F1 详细见下图
  it_char-atnam = 'Z_BATCH_GRDATE'. 
  it_char-atwtb = lw_batch-zmm01 .
  "it_char-CHAR_NOT_VALID = 'X'.
  APPEND it_char .
  it_char-atnam = 'Z_BATCH_VENDOR'.
  it_char-atwtb = lw_batch-zmm02 .
  "it_char-CHAR_NOT_VALID = 'X'.
  APPEND it_char .
    it_char-atnam = 'Z_BATCH_ZGZ'.
  it_char-atwtb = lw_batch-zmm03 .
  "it_char-CHAR_NOT_VALID = 'X'.
  APPEND it_char .
*&---------------------------------------------------------------------* 
*调用函数
*----------------------------------------------------------------------*
  CALL FUNCTION 'VB_CHANGE_BATCH'
    EXPORTING
      ymcha                     = wa_mcha
      kzcla                     = '1'
      xkcfc                     = 'X'
      class                     = e_class
      buffer_refresh            = 'X'
      no_change_document        = ''
    IMPORTING
      ymcha                     = wa_mcha
    TABLES
      char_of_batch             = it_char
      changed_batch             = lt_mcha_chg
      return                    = bapi_return1
    EXCEPTIONS
      no_material               = 1
      no_batch                  = 2
      no_plant                  = 3
      material_not_found        = 4
      plant_not_found           = 5
      lock_on_material          = 6
      lock_on_plant             = 7
      lock_on_batch             = 8
      lock_system_error         = 9
      no_authority              = 10
      batch_not_exist           = 11
      no_class                  = 12
      error_in_classification   = 13
      error_in_valuation_change = 14
      OTHERS                    = 15.
  IF sy-subrc = 0 .
    COMMIT WORK AND WAIT.
  ENDIF.

特性值属性的获取-MSC3N-分类-特征值描述-按F1

MIGO期初库存导入(移动类型:561,特征值的值设置)插图7 MIGO期初库存导入(移动类型:561,特征值的值设置)插图8


开发中遇到的问题

批次-分类-特征值修改失败

我的代码思路是

  1. MIGO货物移动
  2. 修改批次基础数据
  3. 修改批次-分类特征值

如果不打断点 第3步就会执行失败且无返回值,如果在执行第三步之前打了断点就能成功执行。

由于没有返回值以及技术有限,具体的原因不知道因为什么。所以在2 3步之间我加了个0.1S的延迟,暂时解决了这个问题。。

希望有知道具体原因的老师 指点一二。

时间延迟代码

FORM ZWAIT USING VALUE(SECOND).

  DATA: d1 TYPE d,

        d2 TYPE d,

        t1 TYPE t,

        T2 TYPE T,

        TSL TYPE TIMESTAMPL,

        S1 TYPE P DECIMALS 6,

        S2 TYPE P DECIMALS 6,

        SEC TYPE P DECIMALS 6.



  GET TIME STAMP FIELD TSL.

  CONVERT TIME STAMP TSL TIME ZONE SY-ZONLO

            INTO DATE D1 TIME T1.

  S1 = FRAC( TSL ).



  WHILE SECOND > SEC.

    GET TIME STAMP FIELD TSL.

    CONVERT TIME STAMP TSL TIME ZONE SY-ZONLO

            INTO DATE D2 TIME T2.

    S2 = FRAC( TSL ).

    SEC = ( ( D2 - D1 ) * 86400 ) + T2 - T1 + S2 -  S1.

  ENDWHILE.

ENDFORM.

 

 

    版权声明:
    作者:FAN
    链接:https://sapboy.com/index.php/2022/06/16/migopckcdrydlx561tzzdzsz/
    来源:SAPBoy
    文章版权归作者所有,未经允许请勿转载。

    THE END
    分享
    MIGO期初库存导入(移动类型:561,特征值的值设置)
    业务需求 物料数据批次创建,以及对应批次特性值的值修改。 用户导入前进行数据校验,如果有一条数据错误,提示错误并全部数据不导入。 需求分析 先根据前台……
    <<上一篇
    下一篇>>
    文章目录
    关闭
    目 录