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.