2019-12-25 abap遇到耍流氓的增强 启用异步调用解决

2019-12-25 abap遇到耍流氓的增强 启用异步调用解决,第1张

需求是当系统更改了mm02 的长文本的时候做一个增强,找了半天,值是读到了,可长文本的条目也太多了,根本没法确定哪条是对的
这个时候怎么办,先找个隐式增强,保证mm01 和 mm02 *** 作都会经给找个地方
SELECT SINGLE CLASSNAME

                FROM  RZLLITAB

                INTO  G_CLASSNAME  "Server Group Name

              WHERE  APPLSERVER = G_APPLSERVER

                AND  GROUPTYPE = 'S'  "S:服务器组,空:登陆组

LV_MATNR = WMARA-MATNR

CALL FUNCTION 'ZFM_SAP_SRM_011' STARTING NEW TASK LV_MATNR

  DESTINATION IN GROUP G_CLASSNAME

  PERFORMING FRM_SAP_CRM ON END OF TASK

  EXPORTING

    IV_MATNR = LV_MATNR
FORM FRM_SAP_CRM USING NAME

  RECEIVE RESULTS FROM FUNCTION 'ZFM_SAP_SRM_011'

ENDFORM
DATA : GNAME LIKE SEQG3-GNAME VALUE 'MARA',

        GARG        LIKE  SEQG3-GARG,

        GUNAME      LIKE  SEQG3-GUNAME,

        LT_ITAB    TYPE ZFM_SAP_SRM_007_INS,

        LS_ITAB    LIKE LINE OF LT_ITAB,

        IM_JSON_STR TYPE STRING,

        EX_JSON_STR TYPE STRING,

        LT_OUTS    TYPE ZFM_SAP_SRM_007_OUTS,

        LS_OUTS    LIKE LINE OF LT_OUTS,

        LV_KEY01    TYPE ZKEY01,

        RAW_ENQ    LIKE  SEQG7 OCCURS 0 WITH HEADER LINE

  CONCATENATE SY-MANDT IV_MATNR INTO GARG

  BREAK GB05

  DO 10 TIMES

    CALL FUNCTION 'ENQUE_READ2'

      EXPORTING

        GNAME  = GNAME

        GARG  = GARG

        GUNAME = GUNAME

      TABLES

        ENQ    = RAW_ENQ

    IF RAW_ENQ[] IS INITIAL

      EXIT

    ELSE

      WAIT UP TO 1 SECONDS

    ENDIF

  ENDDO

  IF RAW_ENQ[] IS NOT INITIAL

    ZTYPE = 'E'

    CONCATENATE '物料号码' IV_MATNR '被锁定,请稍后处理!' INTO ZMESSAGE

    EXIT

  ENDIF
最终结果 
原理是启用异步调用后,你程序执行 我和你是并行的,但是我读取物料号是否被你原来程序锁止了,如果你锁止放开了,我这个程序拿到物料号,当然完成一个长文本读取是so easy

你耍流氓我也来,哈哈  等你mm01 或者mm02跑完了 我再去抓你保存好的数据,然后再进行 *** 作

1、cmod首先进入的是项目的编辑界面,要么创建一个新项目,要么修改原有的项目,然后将项目分配给增强文件rsap0001和激活出口函数以后,才能通过出口函数进入到function module界面进行abap代码编辑,而smod直接进入的就是增强文件rsap0001的输入界面,无需再次进行项目编辑,然后点进去以后可以双击相应的出口函数,直接进入到function module界面进行abap代码编辑,完成功能增强的 *** 作。
2、权限问题,smod的权限很大,通常情况下在项目上我们只有cmod的权限,而没有smod的权限,虽然smod和cmod都可以调用增强文件rsap0001,最终也都可以实现功能增强的 *** 作,但是smod是对所有的出口函数的 *** 作,而cmod只可以为部分特定的出口函数做一个项目,也就是说在一个建立好的项目中所用到的出口函数就不能再被另外一个项目用了,比如我再建立一个新项目,用到rsap0001的时候,就会提示一行德文,它的意思是已经被某某项目用掉了。

ABAP增强里面是有限制的,具体要看增强的位置。有些增强不能报MESSAGE,有可能是增强对应的函数或接口方法有消息传出参数
如:IF_EX_LE_SHP_DELIVERY_PROC->DELIVERY_FINAL_CHECK这个接口方法的参数CT_FINCHDEL就是用来将消息传出给标准程序的,这样添加进来的消息就会以标准的形式报给用户
还有的增强是在CALL FUNCTION IN UPDATE TASK中的,在这种增强中报I或者W等非错误的消息是会被忽略的,而报E、A等错误类的消息则会导致一个更新失败,是因为它是异步触发的,它会在CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'的时候才去执行这些更新功能的。所以会出现这种情况。而且这种增强里面打的断点也不会有效,实际上它是执行的,但是不能调试。
所以增强里面报MESSAGE要看具体的增强点,不能随意去写。
希望对你有帮助!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13385299.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-26
下一篇 2023-07-26

发表评论

登录后才能评论

评论列表(0条)

保存