MIGO期初库存导入(移动类型:561,特征值的值设置)
业务需求
- 物料数据批次创建,以及对应批次特性值的值修改。
- 用户导入前进行数据校验,如果有一条数据错误,提示错误并全部数据不导入。
需求分析
先根据前台操作,查看涉及到哪些BAPI以及函数。
前台操作
T-CODE:MIGO A01收货 R10其他 移动类型561 (物料 工厂 存储地点等输入)
批次设置 TEST220621
批次分类属性设置 最近的收货日期 供应商账户号 挂账方式
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
修改批次特性值的时候,当特性值有附加属性的时候 通过这个函数无法修改。
比如最近的收货日期做修改,在前台MSC3N进行修改,将收货日期改为2021.06.21.
保存再返回的时候也是空值。
后面发现最近收货日期有附加数据,无法这样直接修改,要在基础数据做修改才可以生效。
所以在修改批次属性的时候就涉及到了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货物移动
- 修改批次基础数据
- 修改批次-分类特征值
如果不打断点 第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
文章版权归作者所有,未经允许请勿转载。

共有 0 条评论