关于标准PO/PR批量修改功能MEMASSPO/MEMASSRQ中不能进行修改字段的浅析

关于标准PO/PR批量修改功能MEMASSPO/MEMASSRQ中不能进行修改字段的浅析

作者:袁云飞(AlbertYuan)- 微信号yuanalbert

以下内容均为原创,希望对初学者有一些辅助作用,本人主要从事MM/QM/WM的相关工作,不专业处请多多指点,十足干货,码字不易,且行且珍惜,加入粉丝您将能看到更多相关主题文章,你们的关注就是我努力的动力,转载请引用出处,感激不尽;

批量PO的修改是小伙伴们常常需要使用到的功能,这也是国内目前的现状(无奈之举),小伙伴们应该常常遇到过这种情形,用户将大量的PO中某个字段值输错了,等发现的时候其需要修改的数量大大超过了单个ME22N修改的可承受程度,或者时间比较紧急了,临近入库了;再或者处于继承测试阶段的时候需要去大批量的修改某个PO字段的值,等等;

遇到这种情况下小伙伴们常常可以使用MEMASSPO这个事务代码来完成相关的工作(MASS里使用对象类型BUS2012也能达到类似效果);

但有些小伙伴们常常会遇到这样的问题,明明使用MEMASSPO修改某个字段,最后保存的结果,反馈的消息却是06 022没有进行任何数据的更改;
在这里插入图片描述
是不是觉得非常的疑惑,我曾经也经常碰到这种情况,经过从代码级别上分析后发现,这种批量修改PO的功能,其本质还是通过调用PO更改的BAPI来实现的,但该功能在此基础上增加了一些限制条件,导致某些字段是受限字段,使用MEMASSPO是无法完成对其的修改的;

在函数MASS_CHANGE_PURCHASE_ORD_BAPI里我们能看到其调用的更改PO的BAPI过程;
在这里插入图片描述
那么我们怎么找到那些被受限而不能更改的字段有哪些呢?其实分析标准代码就能很容易了解;该程序调用了一个函数ME_LIMIT_FIELDS_PO_BAPI,里面就是存放的不允许完成修改的字段;

LOOP AT all_fields.
    IF ( all_fields-tabname = 'MASSEKKO' ).
      IF ( all_fields-fieldname = 'BSTYP' ) OR
         ( all_fields-fieldname = 'BSAKZ' ) OR
         ( all_fields-fieldname = 'STATU' ) OR              "v_1669053
         ( all_fields-fieldname = 'AEDAT' ) OR
         ( all_fields-fieldname = 'ERNAM' ) OR
         ( all_fields-fieldname = 'PINCR' ) OR              "^_1669053
         ( all_fields-fieldname = 'LPONR' ) OR
         ( all_fields-fieldname = 'BWBDT' ) OR
         ( all_fields-fieldname = 'ANGDT' ) OR
         ( all_fields-fieldname = 'BNDDT' ) OR
         ( all_fields-fieldname = 'AUSNR' ) OR
         ( all_fields-fieldname = 'ABGRU' ) OR
         ( all_fields-fieldname = 'AUTLF' ) OR
         ( all_fields-fieldname = 'LBLIF' ) OR
         ( all_fields-fieldname = 'KNUMV' ) OR
         ( all_fields-fieldname = 'KALSM' ) OR
         ( all_fields-fieldname = 'STAFO' ) OR
         ( all_fields-fieldname = 'EXNUM' ) OR
         ( all_fields-fieldname = 'STAKO' ) OR
         ( all_fields-fieldname = 'FRGGR' ) OR
         ( all_fields-fieldname = 'FRGSX' ) OR
         ( all_fields-fieldname = 'FRGRL' ) OR
         ( all_fields-fieldname = 'LANDS' ) OR
         ( all_fields-fieldname = 'LPHIS' ) OR
         ( all_fields-fieldname = 'ADRNR' ) OR
         ( all_fields-fieldname = 'STCEG' ) OR
         ( all_fields-fieldname = 'ADDNR' ) OR
         ( all_fields-fieldname = 'KORNR' ) OR
         ( all_fields-fieldname = 'MEMORY' ) OR
         ( all_fields-fieldname = 'PROCSTAT' ) OR
         ( all_fields-fieldname = 'RLWRT' ) OR
         ( all_fields-fieldname = 'REVNO' ).
        DELETE all_fields.
*     new with park&hold TS
      ELSEIF all_fields-fieldname = 'MEMORYTYPE'.
        IF cl_parkhold_active=>parkhold_is_active( ) = cl_mmpur_constants=>yes.
          all_fields-displ_only = 'X'.
          MODIFY all_fields TRANSPORTING displ_only.
        ELSE.
          DELETE all_fields.
        ENDIF.
      ENDIF.
    ELSEIF ( all_fields-tabname = 'MASSEKPO' ).
      IF ( all_fields-fieldname = 'STATU' ) OR
         ( all_fields-fieldname = 'AEDAT' ) OR
         ( all_fields-fieldname = 'BUKRS' ) OR
         ( all_fields-fieldname = 'KTMNG' ) OR
         ( all_fields-fieldname = 'UMREZ' ) OR
         ( all_fields-fieldname = 'UMREN' ) OR
         ( all_fields-fieldname = 'NETPR' ) OR
         ( all_fields-fieldname = 'NETWR' ) OR
         ( all_fields-fieldname = 'BRTWR' ) OR
         ( all_fields-fieldname = 'AGDAT' ) OR
         ( all_fields-fieldname = 'MAHNZ' ) OR
         ( all_fields-fieldname = 'BWTTY' ) OR
         ( all_fields-fieldname = 'ABSKZ' ) OR
         ( all_fields-fieldname = 'AGMEM' ) OR
         ( all_fields-fieldname = 'KZVBR' ) OR
         ( all_fields-fieldname = 'ABDAT' ) OR
         ( all_fields-fieldname = 'ABFTZ' ) OR
         ( all_fields-fieldname = 'ETFZ1' ) OR
         ( all_fields-fieldname = 'ETFZ2' ) OR
         ( all_fields-fieldname = 'KZSTU' ) OR
         ( all_fields-fieldname = 'NOTKZ' ) OR
         ( all_fields-fieldname = 'LMEIN' ) OR
         ( all_fields-fieldname = 'ZWERT' ) OR
         ( all_fields-fieldname = 'NAVNW' ) OR
         ( all_fields-fieldname = 'ABMNG' ) OR
         ( all_fields-fieldname = 'BSTYP' ) OR
         ( all_fields-fieldname = 'EFFWR' ) OR
         ( all_fields-fieldname = 'XOBLR' ) OR
         ( all_fields-fieldname = 'ADRNR' ) OR
         ( all_fields-fieldname = 'STAFO' ) OR
         ( all_fields-fieldname = 'ETDRK' ) OR
         ( all_fields-fieldname = 'SOBKZ' ) OR
         ( all_fields-fieldname = 'ARSNR' ) OR
         ( all_fields-fieldname = 'ARSPS' ) OR
         ( all_fields-fieldname = 'INSNC' ) OR
         ( all_fields-fieldname = 'ZGTYP' ) OR
         ( all_fields-fieldname = 'EAN11' ) OR
         ( all_fields-fieldname = 'KO_GSBER'  ) OR
         ( all_fields-fieldname = 'KO_PARGB'  ) OR
         ( all_fields-fieldname = 'KO_PRCTR'  ) OR
         ( all_fields-fieldname = 'KO_PPRCTR' ) OR
         ( all_fields-fieldname = 'VORAB' ) OR
         ( all_fields-fieldname = 'PACKNO' ) OR
         ( all_fields-fieldname = 'FPLNR'  ) OR
         ( all_fields-fieldname = 'GNETWR' ) OR
         ( all_fields-fieldname = 'STAPO' ) OR
         ( all_fields-fieldname = 'SATNR' ) OR
         ( all_fields-fieldname = 'ATTYP' ) OR
         ( all_fields-fieldname = 'ADRN2' ) OR
         ( all_fields-fieldname = 'CUOBJ' ) OR
         ( all_fields-fieldname = 'EILDT' ) OR
         ( all_fields-fieldname = 'DRDAT' ) OR
         ( all_fields-fieldname = 'DRUHR' ) OR
         ( all_fields-fieldname = 'DRUNR' ) OR
         ( all_fields-fieldname = 'ABELN' ) OR
         ( all_fields-fieldname = 'ABELP' ) OR
         ( all_fields-fieldname = 'MLMAA' ) OR
         ( all_fields-fieldname = 'KZKFG' ) OR
         ( all_fields-fieldname = 'USEQU' ) OR
         ( all_fields-fieldname = 'UMSOK' ) OR
         ( all_fields-fieldname = 'MTART' ) OR
         ( all_fields-fieldname = 'UPVOR' ) OR
         ( all_fields-fieldname = 'KZWI1' ) OR
         ( all_fields-fieldname = 'KZWI2' ) OR
         ( all_fields-fieldname = 'KZWI3' ) OR
         ( all_fields-fieldname = 'KZWI4' ) OR
         ( all_fields-fieldname = 'KZWI5' ) OR
         ( all_fields-fieldname = 'KZWI6' ) OR
         ( all_fields-fieldname = 'SIKGR' ) OR
         ( all_fields-fieldname = 'MFZHI' ) OR
         ( all_fields-fieldname = 'FFZHI' ) OR
         ( all_fields-fieldname = 'LFRET' ) OR
         ( all_fields-fieldname = 'MFRGR' ) OR
         ( all_fields-fieldname = 'NRFHG' ) OR
         ( all_fields-fieldname = 'ABUEB' ) OR
         ( all_fields-fieldname = 'NLABD' ) OR
         ( all_fields-fieldname = 'NFABD' ) OR
         ( all_fields-fieldname = 'KZBWS' ) OR
         ( all_fields-fieldname = 'BONBA' ) OR
         ( all_fields-fieldname = 'FABKZ' ) OR
         ( all_fields-fieldname = 'MPROF' ) OR
         ( all_fields-fieldname = 'KZFME' ) OR
         ( all_fields-fieldname = 'RDPRF' ) OR
         ( all_fields-fieldname = 'TECHS' ) OR
         ( all_fields-fieldname = 'CHG_SRV' ) OR
         ( all_fields-fieldname = 'CHG_FPLNR' ) OR
         ( all_fields-fieldname = 'MFRPN' ) OR
         ( all_fields-fieldname = 'MFRNR' ) OR
         ( all_fields-fieldname = 'EMNFR' ) OR
         ( all_fields-fieldname = 'TZONRC' ) OR
         ( all_fields-fieldname = 'LEBRE' ) OR
         ( all_fields-fieldname = 'BERID' ) OR
         ( all_fields-fieldname = 'XCONDITIONS' ) OR
         ( all_fields-fieldname = 'APOMS' ) OR
         ( all_fields-fieldname = 'CCOMP' ) OR
         ( all_fields-fieldname = 'GRANT_NBR' ) OR
         ( all_fields-fieldname = 'FKBER' ) OR
         ( all_fields-fieldname = 'STATUS' ) OR
         ( all_fields-fieldname = 'REFSITE' ).
        DELETE all_fields.
      ENDIF.

上面代码里的字段,分别就代表了EKKO/EKPO里不能通过该事务代码进行修改的字段清单了;

但请小伙伴们注意,除了这些字段,下面这几个字段也是无法进行修改的(这就是特例);
Material number (EKPO-EMATN)
Material short text (EKPO-TXZ01)
Order quantity (EKPO-MENGE) 注:ECC高版本和S/4里已经可以修改了
Order unit (EKPO-MEINS) 注:ECC高版本和S/4里已经可以修改了
Net order price (EKPO-NETPR)
Purchase order price unit (EKPO-BPRME)
Plant (EKPO-WERKS)

那么问题来了,不能通过MEMASSPO修改的字段,有些是可以在ME22N里进行修改的,如何“曲线救国”呢,其实用BAPI BAPI_PO_CHANGE就能做出批量修改的程序,哪些不能修改的字段用这个办法进行替代处理,也不失于一种办法;写不来程序?不用担心,这个更改PO的BAPI也支持使用IDOC ALE方式调用的(ALE消息类型PORDCH),配置一下,使用LSMW加载进入就能使用了,非常方便,关于这个后面我们单独篇幅进行讨论;

讲到这里,细心的小伙伴们就要问了,你说了半天PO,那PR呢,是否存在同样的限制字段?恭喜你,答案是肯定的;类似的代码分析来看,批量修改PR的事务代码MEMASSRQ也有限制修改的字段清单;其函数是ME_LIMIT_FIELDS_RQ;

  LOOP AT all_fields.
    IF ( all_fields-TABNAME = 'EBAN' ).
      IF ( all_fields-FIELDNAME = 'BSART' ) OR
         ( all_fields-FIELDNAME = 'BSTYP' ) OR
         ( all_fields-FIELDNAME = 'BSAKZ' ) OR
         ( all_fields-FIELDNAME = 'STATU' ) OR
         ( all_fields-FIELDNAME = 'ESTKZ' ) OR
         ( all_fields-FIELDNAME = 'FRGKZ' ) or
         ( all_fields-FIELDNAME = 'FRGZU' ) OR
         ( all_fields-FIELDNAME = 'FRGST' ) OR
         ( all_fields-FIELDNAME = 'ERNAM' ) OR
         ( all_fields-FIELDNAME = 'ERDAT' ) OR
         ( all_fields-FIELDNAME = 'BUMNG' ) OR
         ( all_fields-FIELDNAME = 'PSTYP' ) OR
         ( all_fields-FIELDNAME = 'KZVBR' ) OR
         ( all_fields-FIELDNAME = 'KFLAG' ) OR
         ( all_fields-FIELDNAME = 'VRTYP' ) OR
         ( all_fields-FIELDNAME = 'ZUGBA' ) OR
         ( all_fields-FIELDNAME = 'QUNUM' ) OR
         ( all_fields-FIELDNAME = 'QUPOS' ) OR
         ( all_fields-FIELDNAME = 'DISPO' ) OR
         ( all_fields-FIELDNAME = 'SERNR' ) OR
         ( all_fields-FIELDNAME = 'BVDAT' ) OR
         ( all_fields-FIELDNAME = 'BVDRK' ) OR
         ( all_fields-FIELDNAME = 'EBELN' ) OR
         ( all_fields-FIELDNAME = 'EBELP' ) OR
         ( all_fields-FIELDNAME = 'BEDAT' ) OR
         ( all_fields-FIELDNAME = 'BSMNG' ) OR
         ( all_fields-FIELDNAME = 'LBLNI' ) OR
         ( all_fields-FIELDNAME = 'BWTAR' ) OR
         ( all_fields-FIELDNAME = 'XOBLR' ) or
         ( all_fields-FIELDNAME = 'EBAKZ' ) OR
         ( all_fields-FIELDNAME = 'RSNUM' ) OR
         ( all_fields-FIELDNAME = 'SOBKZ' ) OR
         ( all_fields-FIELDNAME = 'ARSNR' ) OR
         ( all_fields-FIELDNAME = 'ARSPS' ) OR
         ( all_fields-FIELDNAME = 'VORAB' ) OR
         ( all_fields-FIELDNAME = 'PACKNO' ) OR
         ( all_fields-FIELDNAME = 'KANBA' ) OR
         ( all_fields-FIELDNAME = 'BPUEB' ) OR
         ( all_fields-FIELDNAME = 'CUOBJ' ) OR
         ( all_fields-FIELDNAME = 'FRGGR' ) OR
         ( all_fields-FIELDNAME = 'FRGRL' ) OR
         ( all_fields-FIELDNAME = 'UMSOK' ) OR
         ( all_fields-FIELDNAME = 'KZKFG' ) OR
         ( all_fields-FIELDNAME = 'SATNR' ) OR
         ( all_fields-FIELDNAME = 'MNG02' ) OR
         ( all_fields-FIELDNAME = 'DAT01' ) OR
         ( all_fields-FIELDNAME = 'ATTYP' ) OR
         ( all_fields-FIELDNAME = 'ADRNR' ) or
         ( all_fields-FIELDNAME = 'ADRN2' ) OR
         ( all_fields-FIELDNAME = 'KZBWS' ) OR
         ( all_fields-FIELDNAME = 'GSFRG' ) OR
         ( all_fields-FIELDNAME = 'MPROF' ) OR
         ( all_fields-FIELDNAME = 'KZFME' ) OR
         ( all_fields-FIELDNAME = 'SPRAS' ) OR
         ( all_fields-FIELDNAME = 'TECHSO' ) OR
         ( all_fields-FIELDNAME = 'MEMORY' ) OR                   "park&hold TS
         ( all_fields-FIELDNAME = 'PLIFZ' ).
         DELETE all_fields.

以上为本章全部内容,希望小伙伴们能够喜欢;

发布了33 篇原创文章 · 获赞 0 · 访问量 895

猜你喜欢

转载自blog.csdn.net/weixin_44853659/article/details/103988057