本人诚心接ABAP远程开发任务,价格公道,有需要的联系我,欢迎个人,甲方爸爸,乙方私信联系。
这次的用户是一家启用了序列号管理的客户。
客户比较懒。所以在盘点的时候,只用MI10去一步做完盘点。
查阅资料发现,MI10没有标准的bapi 去调用,
但是MI10其实就是MI01(创建盘点凭证)+MI04(盘点数量)+MI07(差异过账)的一个集合事务代码。
那么我们的批导程序就可以分步骤调用三个bapi
分别是:MI01-->BAPI_MATPHYSINV_CREATE
MI04-->BAPI_MATPHYSINV_COUNT
MI07-->BAPI_MATPHYSINV_POSTDIFF
其中遇到一个问题就是客户是车企,启用的序列号管理,所以 MI04的时候输入完数量之后,要根据数量,输入相应数量的不同的序列号
下面简单列一下代码。
"MI01 对应参数DATA:LS_HEAD TYPE BAPI_PHYSINV_CREATE_HEAD.DATA:LT_ITEMS TYPE STANDARD TABLE OF BAPI_PHYSINV_CREATE_ITEMS.DATA:LS_ITEMS TYPE BAPI_PHYSINV_CREATE_ITEMS.DATA:LT_RETURN TYPE STANDARD TABLE OF BAPIRET2 .DATA:LS_RETURN TYPE BAPIRET2 ."MI04 对应参数DATA:LT_COUNT TYPE STANDARD TABLE OF BAPI_PHYSINV_COUNT_ITEMS.DATA:LS_COUNT TYPE BAPI_PHYSINV_COUNT_ITEMS.DATA:LT_SERNR TYPE STANDARD TABLE OF BAPI_PHYSINV_SERIALNUMBERS.DATA:LS_SERNR TYPE BAPI_PHYSINV_SERIALNUMBERS.DATA:LV_LINES TYPE DZEILE."MI07 对应参数DATA:LT_POST TYPE STANDARD TABLE OF BAPI_PHYSINV_POST_ITEMS.DATA:LS_POST TYPE BAPI_PHYSINV_POST_ITEMS."创建盘点凭证BAPI 参数封装
*-------------------------------------------------------------CLEAR: LS_HEAD,LS_ITEMS,LT_ITEMS,LT_RETURN,LS_RETURN,LV_LINES,LS_COUNT,LT_COUNT,LS_SERNR,LT_SERNR,LS_POST, LT_POST.LS_HEAD-PLANT = P_WERKS. "工厂LS_HEAD-STGE_LOC = P_LGORT. "库存地点LS_HEAD-DOC_DATE = P_BUDAT. "凭证中的凭证日期LS_HEAD-PLAN_DATE = P_COUNT. "库存盘点的计划日期LT_TEMP = GT_DATA.
"首先根据物料号去重去创建盘点凭证SORT LT_TEMP BY MATNR.DELETE ADJACENT DUPLICATES FROM LT_TEMP COMPARING MATNR.LOOP AT LT_TEMP INTO LS_TEMP."创建盘点凭证BAPI 参数封装
*-------------------------------------------------------------LS_ITEMS-MATERIAL = LS_TEMP-MATNR. "物料号LS_ITEMS-STOCK_TYPE = LS_TEMP-BSTAR. "库存类型APPEND LS_ITEMS TO LT_ITEMS.CLEAR LS_ITEMS.
"MI04的时候传入序列号 盘点数量
"凭证数量盘点BAPI 参数封装
*-------------------------------------------------------------LV_LINES = LV_LINES + 1.LS_COUNT-ITEM = LV_LINES. "行号LS_COUNT-MATERIAL = LS_TEMP-MATNR. "物料编码LS_COUNT-ENTRY_UOM = LS_TEMP-MEINS. "计量单位LS_COUNT-ZERO_COUNT = LS_TEMP-XNULL."差异过账BAPI 参数封装
*-------------------------------------------------------------LS_POST-ITEM = LV_LINES. "行号LS_POST-MATERIAL = LS_TEMP-MATNR. "物料编码APPEND LS_POST TO LT_POST.CLEAR: LS_POST.LOOP AT GT_DATA INTO GS_DATA WHERE MATNR = LS_TEMP-MATNR."这里是累计同一个物料号有多少数量LS_COUNT-ENTRY_QNT = GS_DATA-MENGE + LS_COUNT-ENTRY_QNT. "录入系统实盘数"这里是将序列号一一对应传入LS_SERNR-ITEM = LV_LINES.LS_SERNR-SERIALNO = GS_DATA-SERNR.APPEND LS_SERNR TO LT_SERNR.CLEAR LS_SERNR.ENDLOOP.APPEND LS_COUNT TO LT_COUNT.CLEAR: LS_COUNT.ENDLOOP.CALL FUNCTION 'BAPI_MATPHYSINV_CREATE'EXPORTINGHEAD = LS_HEADTABLESITEMS = LT_ITEMSRETURN = LT_RETURN.READ TABLE LT_RETURN INTO LS_RETURN WITH KEY TYPE = 'E'.IF SY-SUBRC = 0 .CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' .LOOP AT LT_RETURN INTO LS_RETURN WHERE TYPE = 'E'.CONCATENATE LV_MESSAGE LS_RETURN-MESSAGE ',' INTO LV_MESSAGE.ENDLOOP.LOOP AT GT_DATA INTO GS_DATA .GS_DATA-ICONS = ICON_RED_LIGHT.GS_DATA-MESSAGE = LV_MESSAGE.MODIFY GT_DATA FROM GS_DATA.ENDLOOP.ELSE."提交并 盘点凭证数量CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'EXPORTINGWAIT = 'X'.READ TABLE LT_RETURN INTO LS_RETURN INDEX 1.IF SY-SUBRC = 0.LV_IBLNR = LS_RETURN-MESSAGE_V1.CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'EXPORTINGINPUT = LV_IBLNRIMPORTINGOUTPUT = LV_IBLNR.ENDIF.LV_MESSAGE = 'Counting voucher created successfully!'.
*----------------------------------------------------------盘点凭证数量CLEAR:LT_RETURN.LV_GJAHR = P_COUNT+0(4).CALL FUNCTION 'BAPI_MATPHYSINV_COUNT'EXPORTINGPHYSINVENTORY = LV_IBLNR "盘点凭证号FISCALYEAR = LV_GJAHRCOUNT_DATE = P_COUNTTABLESITEMS = LT_COUNTRETURN = LT_RETURNSERIALNUMBERS = LT_SERNR .READ TABLE LT_RETURN INTO LS_RETURN WITH KEY TYPE = 'E'.IF SY-SUBRC = 0 .CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' .LOOP AT LT_RETURN INTO LS_RETURN WHERE TYPE = 'E'.CONCATENATE LV_MESSAGE LS_RETURN-MESSAGE ',' INTO LV_MESSAGE.ENDLOOP.LOOP AT GT_DATA INTO GS_DATA .GS_DATA-IBLNR = LV_IBLNR.GS_DATA-ICONS = ICON_RED_LIGHT.GS_DATA-MESSAGE = LV_MESSAGE.MODIFY GT_DATA FROM GS_DATA.ENDLOOP.ELSE."提交并 盘点凭证数量CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'EXPORTINGWAIT = 'X'.CLEAR:LT_RETURN,LS_RETURN.CONCATENATE LV_MESSAGE 'Quantity counting succeeded!' INTO LV_MESSAGE.CALL FUNCTION 'BAPI_MATPHYSINV_POSTDIFF'EXPORTINGPHYSINVENTORY = LV_IBLNRFISCALYEAR = LV_GJAHR
* PSTNG_DATE =
* THRESHOLD_VALUE =TABLESITEMS = LT_POSTRETURN = LT_RETURN .READ TABLE LT_RETURN INTO LS_RETURN WITH KEY TYPE = 'E'.IF SY-SUBRC = 0 .CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' .LOOP AT LT_RETURN INTO LS_RETURN WHERE TYPE = 'E'.CONCATENATE LV_MESSAGE LS_RETURN-MESSAGE ',' INTO LV_MESSAGE.ENDLOOP.LOOP AT GT_DATA INTO GS_DATA .GS_DATA-ICONS = ICON_RED_LIGHT.GS_DATA-MESSAGE = LV_MESSAGE.MODIFY GT_DATA FROM GS_DATA.ENDLOOP.ELSE."差异过账成功CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'EXPORTINGWAIT = 'X'.CONCATENATE LV_MESSAGE 'Variance posting succeeded!' INTO LV_MESSAGE.READ TABLE LT_RETURN INTO LS_RETURN INDEX 1.IF SY-SUBRC = 0.LV_BELNR = LS_RETURN-MESSAGE_V2.ENDIF.LOOP AT GT_DATA INTO GS_DATA .GS_DATA-IBLNR = LV_IBLNR.GS_DATA-BELNR = LV_BELNR.GS_DATA-ICONS = ICON_GREEN_LIGHT.GS_DATA-MESSAGE = LV_MESSAGE.MODIFY GT_DATA FROM GS_DATA.ENDLOOP.ENDIF.ENDIF.ENDIF.