【采购订单】利用BAPI创建PO后丢失消息输出

本文探讨了使用BAPI批量创建采购订单(PO)时,无法通过ME23N进行打印预览的问题。原因在于缺少自动创建的消息数据,导致在批量打印时无法选择显示。文中提供了一个解决方案,即更新NAST表,并附上了参考代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:有一些公司采购订单的创建不是单纯通过手动ME21N进行的,而是批量通过BAPI(BAPI_PO_CREATE1)来创建,这个时候会有一个问题,PO成功创建之后利用显示功能(ME23N)无法打印预览后台配置的格式,提示如下消息:“没有发现信息(请检查输入)”,详见下图所示:

原因则是“消息”里面没有自动创建消息数据。

以至于批量打印的时候无法进行选择显示(ME9F)。

检查后台配置均无任何问题(SPRO-物料管理-采购-消息-输出控制),这里不做详述。

检查后台配置没有发现问题,手动处理也没有问题,BAPI中也暂时没有找到相应的参数。

暂定处理方案——更新NAST表

参考代码:

REPORT ZTEST_PO.
DATA:
  HEAD           LIKE BAPIMEPOHEADER,                             "采购订单抬头数据
  HEADX          LIKE BAPIMEPOHEADERX,                            "采购订单抬头数据(更改参数)
  LT_HEADER_TEXT LIKE TABLE OF BAPIMEPOTEXTHEADER WITH HEADER LINE,
  ITEM           LIKE TABLE OF BAPIMEPOITEM WITH HEADER LINE,     "采购订单项目
  ITEMX          LIKE TABLE OF BAPIMEPOITEMX WITH HEADER LINE,    "采购订单项目数据(更改参数)
  POACCOUNT      LIKE TABLE OF BAPIMEPOACCOUNT WITH HEADER LINE,  "采购订单的帐户分配字段
  POACCOUNTX     LIKE TABLE OF BAPIMEPOACCOUNTX WITH HEADER LINE, "采购订单的帐目分配字段 (更改工具条)
  POCOND         LIKE BAPIMEPOCOND OCCURS 0 WITH HEADER LINE,     "价格条件
  POCONDX        LIKE BAPIMEPOCONDX    OCCURS 0 WITH HEADER LINE,
  POSERVICES     TYPE TABLE OF BAPIESLLC WITH HEADER LINE,
  POSRVACCVS     TYPE TABLE OF BAPIESKLC WITH HEADER LINE,
  LT_POPARTNER   TYPE TABLE OF   BAPIEKKOP WITH HEADER LINE,
  DOCUMENT       LIKE BAPIMEPOHEADER-PO_NUMBER,
  RETURN         LIKE TABLE OF BAPIRET2 WITH HEADER LINE.                   "采购凭证号
DATA: L_EBELP TYPE EKPO-EBELP,     "采购凭证的项目编号
      L_STNO  TYPE STUNR.
DATA:GS_WAERS TYPE LFM1-WAERS,
     GS_MEINS TYPE MARA-MEINS.
DATA:LW_GCJZNQ TYPE ZMM_GCJZNQ.
DATA:LS_VBFA TYPE VBFA.
DATA : E_MESSAGE TYPE CHAR255.
DATA : I_HEAD TYPE ZVS_LD.

I_HEAD-LIFNR = '0000200001'.
I_HEAD-EKORG = '1001'.
I_HEAD-BUKRS = '1010'.
I_HEAD-VEDAT = SY-DATUM.
I_HEAD-TXT_K01 = '测试PO'.
I_HEAD-ZZCGKH = '00000231'.
I_HEAD-WAERS = 'CNY'.

CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
  EXPORTING
    INPUT  = I_HEAD-LIFNR
  IMPORTING
    OUTPUT = I_HEAD-LIFNR.

IF GS_WAERS = ''.
  SELECT SINGLE WAERS
    FROM LFM1
    INTO GS_WAERS
    WHERE LIFNR = I_HEAD-LIFNR
      AND EKORG = I_HEAD-EKORG.
ENDIF.

HEAD-DOC_TYPE  = 'ZNB1'.
HEADX-DOC_TYPE  = 'X'.

HEAD-PURCH_ORG = I_HEAD-EKORG.
HEADX-PURCH_ORG = 'X'.

HEAD-CREAT_DATE = SY-DATUM.
HEADX-CREAT_DATE = 'X'.

HEAD-CREATED_BY = SY-UNAME.
HEADX-CREATED_BY = 'X'.

HEAD-PUR_GROUP = '000'.
HEADX-PUR_GROUP = 'X'.

HEAD-COMP_CODE = I_HEAD-BUKRS.
HEADX-COMP_CODE = 'X'.

HEAD-CURRENCY  = GS_WAERS.
HEADX-CURRENCY  = 'X'.

HEAD-DOC_DATE = I_HEAD-VEDAT.
HEADX-DOC_DATE = 'X'.

HEAD-VENDOR = I_HEAD-LIFNR.
HEADX-VENDOR = 'X'.

HEAD-PO_REL_IND = 'X'.
HEADX-PO_REL_IND = 'X'.

HEAD-LANGU = SY-LANGU.
HEADX-LANGU = 'X'.

HEAD-STATUS = 'I'.
HEADX-STATUS = 'X'.

SELECT SINGLE ZTERM
      INTO HEAD-PMNTTRMS
      FROM LFM1
     WHERE LIFNR = HEAD-VENDOR
       AND EKORG = HEAD-PURCH_ORG.
HEADX-PMNTTRMS = 'X'.

IF I_HEAD-TXT_K01 <> ''.
  LT_HEADER_TEXT-TEXT_FORM = '*'.
  LT_HEADER_TEXT-TEXT_ID =   'F01'.
  LT_HEADER_TEXT-TEXT_LINE = I_HEAD-TXT_K01.
  APPEND LT_HEADER_TEXT.
  CLEAR LT_HEADER_TEXT.
ENDIF.

LT_POPARTNER-PARTNERDESC = 'C1'.
LT_POPARTNER-LANGU = '1'.
LT_POPARTNER-BUSPARTNO = I_HEAD-ZZCGKH.
APPEND LT_POPARTNER.

DATA:LT_WYT3 LIKE TABLE OF WYT3 WITH HEADER LINE.
SELECT *
  FROM WYT3"合作伙伴功能
  INTO TABLE LT_WYT3
  WHERE LIFNR = I_HEAD-LIFNR
    AND EKORG = I_HEAD-EKORG
    AND PARVW = 'C1'.
LOOP AT LT_WYT3 WHERE PERNR <> I_HEAD-ZZCGKH.
  LT_POPARTNER-PARTNERDESC = 'C1'.
  LT_POPARTNER-LANGU = '1'.
  LT_POPARTNER-BUSPARTNO = LT_WYT3-PERNR.
  LT_POPARTNER-DELETE_IND = 'X'.
  APPEND LT_POPARTNER.
ENDLOOP.

L_STNO = 0.
DATA : IT_ITEM TYPE ZVS_LDITEM.

*LOOP AT IT_ITEM.
IT_ITEM-MATNR = '21040230001'.
IT_ITEM-EBELP = '10'.
IT_ITEM-WERKS = '1011'.
IT_ITEM-LGORT = 'ZF00'.
IT_ITEM-MENGE = 10.
IT_ITEM-NETPR = 4500.

IF IT_ITEM-MATNR IS NOT INITIAL.
  CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
    EXPORTING
      INPUT        = IT_ITEM-MATNR
    IMPORTING
      OUTPUT       = IT_ITEM-MATNR
    EXCEPTIONS
      LENGTH_ERROR = 1
      OTHERS       = 2.
ENDIF.
"物料主数据默认计量单位
CLEAR : GS_MEINS.
SELECT SINGLE MEINS FROM MARA INTO GS_MEINS
  WHERE MATNR = IT_ITEM-MATNR.

ITEM-PO_ITEM    = IT_ITEM-EBELP.
ITEMX-PO_ITEM = IT_ITEM-EBELP.
ITEMX-PO_ITEMX = 'X'.

ITEM-MATERIAL = IT_ITEM-MATNR.
ITEMX-MATERIAL = 'X'.

ITEM-PLANT    = IT_ITEM-WERKS. "工厂
ITEMX-PLANT = 'X'.   "工厂

*ITEM-ITEM_CAT = 'L'.
*ITEMX-ITEM_CAT = 'X'.

ITEM-STGE_LOC = IT_ITEM-LGORT.
ITEMX-STGE_LOC = 'X'.

ITEM-TAX_CODE   = 'J2'."税代码
ITEMX-TAX_CODE = 'X'.   "税代码

ITEM-QUANTITY   = IT_ITEM-MENGE.
ITEMX-QUANTITY = 'X'.

ITEM-PO_UNIT    = GS_MEINS.
ITEMX-PO_UNIT = 'X'.

ITEM-NET_PRICE = IT_ITEM-NETPR.
ITEMX-NET_PRICE = 'X'.

ITEM-PRICE_UNIT = 1.
ITEMX-PRICE_UNIT = 'X'.

ITEM-INFO_UPD = ''. "标识: 更新信息记录
ITEMX-INFO_UPD = 'X'.

ITEM-AGREEMENT  = '4600000347'.
ITEMX-AGREEMENT  = 'X'.

ITEM-AGMT_ITEM  = IT_ITEM-EBELP.
ITEMX-AGMT_ITEM  = 'X'.

APPEND: ITEM,ITEMX.
CLEAR: ITEM,ITEMX.
*      价格条件
ADD 1 TO L_STNO.
POCOND-ITM_NUMBER = IT_ITEM-EBELP.
POCONDX-ITM_NUMBER = IT_ITEM-EBELP.
POCONDX-ITM_NUMBERX = 'X'.
POCOND-COND_ST_NO = L_STNO.
POCONDX-COND_ST_NO = 'X'.
POCOND-COND_TYPE  = 'PB00'.
POCONDX-COND_TYPE  = 'X'.
POCOND-COND_VALUE = IT_ITEM-NETPR.
POCONDX-COND_VALUE = 'X'.
POCOND-CURRENCY = I_HEAD-WAERS.
POCONDX-CURRENCY = 'X'.
POCOND-COND_UNIT = GS_MEINS.
*      POCOND-COND_UNIT = <ITAB>-BPRME.
POCONDX-COND_UNIT = 'X'.
POCOND-COND_P_UNT = 1.
POCONDX-COND_P_UNT = 'X'.
POCOND-NUMCONVERT = 1."<ITAB>-NUMCONVERT.
POCONDX-NUMCONVERT = 'X'.
POCOND-DENOMINATO = 1."<ITAB>-DENOMINATO.
POCONDX-DENOMINATO = 'X'.
POCOND-CHANGE_ID = 'U'.
POCONDX-CHANGE_ID = 'X'.
APPEND POCOND.
APPEND POCONDX.

CLEAR: POCOND,POCONDX,ITEM,ITEMX,POACCOUNT,POACCOUNTX,POSERVICES.
SORT POCOND BY ITM_NUMBER.
SORT POCONDX BY ITM_NUMBER.

CALL FUNCTION 'BAPI_PO_CREATE1'
  EXPORTING
    POHEADER          = HEAD
    POHEADERX         = HEADX
*   no_price_from_po  = 'X'
    NO_MESSAGING      = 'X'
    NO_MESSAGE_REQ    = 'X'
    TESTRUN           = ''
  IMPORTING
    EXPPURCHASEORDER  = DOCUMENT
  TABLES
    RETURN            = RETURN
    POITEM            = ITEM[]
    POITEMX           = ITEMX[]
    POACCOUNT         = POACCOUNT[]
    POACCOUNTX        = POACCOUNTX[]
    POSERVICES        = POSERVICES[]
    POSRVACCESSVALUES = POSRVACCVS[]
    POCOND            = POCOND
    POCONDX           = POCONDX
*   POPARTNER         = LT_POPARTNER
    POTEXTHEADER      = LT_HEADER_TEXT.
LOOP AT RETURN WHERE TYPE = 'E' OR TYPE = 'A'.
  EXIT.
ENDLOOP.
IF SY-SUBRC = 0.
  CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  LOOP AT RETURN WHERE TYPE = 'E' OR TYPE = 'A'.
    IF RETURN-ID = 'BAPI' AND RETURN-NUMBER = '001'.
    ELSEIF RETURN-ID = 'MEPO' AND RETURN-NUMBER = '000'.
    ELSE.
      CONCATENATE E_MESSAGE RETURN-MESSAGE
             INTO E_MESSAGE.
    ENDIF.
  ENDLOOP.
  WRITE : / E_MESSAGE.
ELSE.
  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    EXPORTING
      WAIT = 'X'.
  WRITE : / 'PO:' , DOCUMENT.
  "更新消息输出
  DATA : LW_NAST TYPE NAST.
  LW_NAST-KAPPL = 'EF'.
  LW_NAST-OBJKY = DOCUMENT.
  LW_NAST-KSCHL = 'NEU'.
  LW_NAST-SPRAS = SY-LANGU.
  LW_NAST-PARNR = I_HEAD-LIFNR.
  LW_NAST-PARVW = 'LF'.
  LW_NAST-ERDAT = SY-DATUM.
  LW_NAST-ERUHR = SY-UZEIT.

  LW_NAST-NACHA = '1'."打印输出
  LW_NAST-VSZTP = '4'."立即发送
  LW_NAST-LDEST = 'LP01'."输出设备
  LW_NAST-DIMME = 'X'."立即打印
  LW_NAST-DELET = 'X'."打印后删除
  LW_NAST-OBJTYPE = 'BUS2012'."对象类型
  LW_NAST-DATVR = SY-DATUM.
  LW_NAST-UHRVR = SY-UZEIT.
  LW_NAST-USNAM = SY-UNAME.
  LW_NAST-VSTAT = '1'.

  IF LW_NAST IS NOT INITIAL.
*    insert nast FROM TABLE lt_nast ACCEPTING DUPLICATE KEYS.
    MODIFY NAST FROM LW_NAST.
    IF SY-SUBRC = 0 .
      WRITE : / 'Output Create OK'.
    ENDIF.
  ENDIF.
ENDIF.

CLEAR:L_EBELP,ITEM[],ITEM,ITEMX[],ITEMX,POCOND[],POCONDX,
      POACCOUNT,POACCOUNT[],POACCOUNTX[],POACCOUNTX,
      POSERVICES[],POSRVACCVS[],RETURN[],
      DOCUMENT,HEAD,HEADX.

创建完成后可以满足现有需求,但是方法比较蠢,希望有别的好方法的朋友可以告知一下,拜谢。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SAP剑客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值