事件和功能模块的问题。

2020-08-25 16:15发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好。

我有以下情况:下达订单后,我需要从订单维护中更改日期字段。

发生发布时,我需要从交易IW32获得的红色日期如下所示的字段日期,以获取发布日期。

在Tcode SWETYPV中,对于BOR BUS2007,我创建了一个在发布维护订单时调用ZFM的规则。

ZFM代码:

 FUNCTION ZPM_DATA_BASE。
 *" ------------------------------------------------  ----------------------
 *" *"本地接口:
 *"正在导入
 *" VALUE(OBJTYPE)类型SWETYPECOU-OBJTYPE
 *" VALUE(OBJKEY)类型SWEINSTCOU-OBJKEY
 *" VALUE(事件)类型SWETYPECOU-EVENT
 *" VALUE(RECTYPE)TYPE SWETYPECOU-RECTYPE
 *"表格
 *" EVENT_CONTAINER结构SWCONT可选
 *" ------------------------------------------------  ----------------------


   数据:BAPI_ALM_ORDER_METHOD的T_METHODS类型标准表,
         BAPI_ALM_ORDER_HEADERS_I的T_HEADER类型标准表,
         T_HEADER_UP BAPI_ALM_ORDER_HEADERS_UP的标准表,
         T_return TYPE BAPIRET标准表2。


   数据:类似于T_METHODS的W_METHOD行,
         W_HEADER之类的T_HEADER行,
         W_HEADER_UP像LINE OF T_HEADER_UP,
         w_return像LINE OF T_RETURN,
         V_DATA TYPE JCDS-UDATE,
         V_OBJNR类型AUFK-OBJNR,
         V_AUART TYPE AUFK-AUART,
         V_objkey TYPE aufk-AUFNR。


   将'00'OBJKEY连接到V_OBJKEY。


   W_METHOD-REFNUMBER ='000001'。
   W_METHOD-OBJECTTYPE ='HEADER'。
   W_METHOD-METHOD ='CHANGE'。
   W_METHOD-OBJECTKEY = v_OBJKEY。


   将W_METHOD附加到T_METHODS。
   清除W_METHOD。
   W_METHOD-METHOD ='保存'
   将W_METHOD附加到T_METHODS。
   将'OR00'对象键连接到V_OBJNR中。

   选择日期
        从JCDS
        进入V_DATA
        其中OBJNR = V_OBJNR并且STAT ='I0002'。
   ENDSELECT。


   检查SY-SUBRC = 0。
   W_HEADER-ORDERID = V_OBJKEY。
   W_HEADER-START_DATE = V_DATA。
   将W_HEADER附加到T_HEADER。
   W_HEADER_UP-START_DATE ='X'。


   APPEND W_HEADER_UP到T_HEADER_UP。

   选择AUART
     从AUFK
     进入V_AUART
     AUFNR = OBJKEY。
   ENDSELECT。

     通话功能'BAPI_ALM_ORDER_MAINTAIN'
 *出口
 * IV_MMSRV_EXTERNAL_MAINTENACE =
       桌子
         IT_METHODS = T_METHODS
         IT_HEADER = T_HEADER
         IT_HEADER_UP = T_HEADER_UP
 * IT_HEADER_SRV =
 * IT_HEADER_SRV_UP =
 * IT_USERSTATUS =
 * IT_PARTNER =
 * IT_PARTNER_UP =
 * IT_OPERATION =
 * IT_OPERATION_UP =
 * IT_RELATION =
 * IT_RELATION_UP =
 * IT_COMPONENT =
 * IT_COMPONENT_UP =
 * IT_OBJECTLIST =
 * IT_OBJECTLIST_UP =
 * IT_OLIST_RELATION =
 * IT_TEXT =
 * IT_TEXT_LINES =
 * IT_SRULE =
 * IT_SRULE_UP =
 * IT_TASKLISTS =
 * EXTENSION_IN =
    返回= T_RETURN
 * ET_NUMBERS =
 * IT_REFORDER_ITEM =
 * IT_REFORDER_ITEM_UP =
 * IT_REFORDER_SERNO_OLIST_INS =
 * IT_REFORDER_SERNO_OLIST_DEL =
 * IT_PRT =
 * IT_PRT_UP =
 * IT_REFORDER_OPERATION =
 * IT_SERVICEOUTLINE =
 * IT_SERVICEOUTLINE_UP =
 * IT_SERVICELINES =
 * IT_SERVICELINES_UP =
 * IT_SERVICELIMIT =
 * IT_SERVICELIMIT_UP =
 * IT_SERVICECONTRACTLIMITS =
 * IT_SERVICECONTRACTLIMITS_UP =
 * ET_NOTIFICATION_NUMBERS =
 * IT_PERMIT =
 * IT_PERMIT_UP =
 * IT_PERMIT_ISSUE =
 * IT_ESTIMATED_COSTS =

              。
     使用键类型='E'将表T_RETURN读入W_RETURN。
     如果sy-SUBRC <> 0。
       调用功能" BAPI_TRANSACTION_COMMIT"。
     万一。

 ENDFUNCTION。

当我在SE37中测试FM时,它工作正常。 但是当我下达订单时,一切都会发生。

我们可以在SWEL中看到事件正在调用FM。

我也不知道为什么两次调用FM。 :(

我们在下面的图像中可以看到,该事件已正确调用,但是对象键(在这种情况下为订单号)没有传递给ZFM。

我不知道这是否是唯一的问题。 这是我的第一次。

请帮助我。

问候。

(49.8 kB)

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好。

我有以下情况:下达订单后,我需要从订单维护中更改日期字段。

发生发布时,我需要从交易IW32获得的红色日期如下所示的字段日期,以获取发布日期。

在Tcode SWETYPV中,对于BOR BUS2007,我创建了一个在发布维护订单时调用ZFM的规则。

ZFM代码:

 FUNCTION ZPM_DATA_BASE。
 *" ------------------------------------------------  ----------------------
 *" *"本地接口:
 *"正在导入
 *" VALUE(OBJTYPE)类型SWETYPECOU-OBJTYPE
 *" VALUE(OBJKEY)类型SWEINSTCOU-OBJKEY
 *" VALUE(事件)类型SWETYPECOU-EVENT
 *" VALUE(RECTYPE)TYPE SWETYPECOU-RECTYPE
 *"表格
 *" EVENT_CONTAINER结构SWCONT可选
 *" ------------------------------------------------  ----------------------


   数据:BAPI_ALM_ORDER_METHOD的T_METHODS类型标准表,
         BAPI_ALM_ORDER_HEADERS_I的T_HEADER类型标准表,
         T_HEADER_UP BAPI_ALM_ORDER_HEADERS_UP的标准表,
         T_return TYPE BAPIRET标准表2。


   数据:类似于T_METHODS的W_METHOD行,
         W_HEADER之类的T_HEADER行,
         W_HEADER_UP像LINE OF T_HEADER_UP,
         w_return像LINE OF T_RETURN,
         V_DATA TYPE JCDS-UDATE,
         V_OBJNR类型AUFK-OBJNR,
         V_AUART TYPE AUFK-AUART,
         V_objkey TYPE aufk-AUFNR。


   将'00'OBJKEY连接到V_OBJKEY。


   W_METHOD-REFNUMBER ='000001'。
   W_METHOD-OBJECTTYPE ='HEADER'。
   W_METHOD-METHOD ='CHANGE'。
   W_METHOD-OBJECTKEY = v_OBJKEY。


   将W_METHOD附加到T_METHODS。
   清除W_METHOD。
   W_METHOD-METHOD ='保存'
   将W_METHOD附加到T_METHODS。
   将'OR00'对象键连接到V_OBJNR中。

   选择日期
        从JCDS
        进入V_DATA
        其中OBJNR = V_OBJNR并且STAT ='I0002'。
   ENDSELECT。


   检查SY-SUBRC = 0。
   W_HEADER-ORDERID = V_OBJKEY。
   W_HEADER-START_DATE = V_DATA。
   将W_HEADER附加到T_HEADER。
   W_HEADER_UP-START_DATE ='X'。


   APPEND W_HEADER_UP到T_HEADER_UP。

   选择AUART
     从AUFK
     进入V_AUART
     AUFNR = OBJKEY。
   ENDSELECT。

     通话功能'BAPI_ALM_ORDER_MAINTAIN'
 *出口
 * IV_MMSRV_EXTERNAL_MAINTENACE =
       桌子
         IT_METHODS = T_METHODS
         IT_HEADER = T_HEADER
         IT_HEADER_UP = T_HEADER_UP
 * IT_HEADER_SRV =
 * IT_HEADER_SRV_UP =
 * IT_USERSTATUS =
 * IT_PARTNER =
 * IT_PARTNER_UP =
 * IT_OPERATION =
 * IT_OPERATION_UP =
 * IT_RELATION =
 * IT_RELATION_UP =
 * IT_COMPONENT =
 * IT_COMPONENT_UP =
 * IT_OBJECTLIST =
 * IT_OBJECTLIST_UP =
 * IT_OLIST_RELATION =
 * IT_TEXT =
 * IT_TEXT_LINES =
 * IT_SRULE =
 * IT_SRULE_UP =
 * IT_TASKLISTS =
 * EXTENSION_IN =
    返回= T_RETURN
 * ET_NUMBERS =
 * IT_REFORDER_ITEM =
 * IT_REFORDER_ITEM_UP =
 * IT_REFORDER_SERNO_OLIST_INS =
 * IT_REFORDER_SERNO_OLIST_DEL =
 * IT_PRT =
 * IT_PRT_UP =
 * IT_REFORDER_OPERATION =
 * IT_SERVICEOUTLINE =
 * IT_SERVICEOUTLINE_UP =
 * IT_SERVICELINES =
 * IT_SERVICELINES_UP =
 * IT_SERVICELIMIT =
 * IT_SERVICELIMIT_UP =
 * IT_SERVICECONTRACTLIMITS =
 * IT_SERVICECONTRACTLIMITS_UP =
 * ET_NOTIFICATION_NUMBERS =
 * IT_PERMIT =
 * IT_PERMIT_UP =
 * IT_PERMIT_ISSUE =
 * IT_ESTIMATED_COSTS =

              。
     使用键类型='E'将表T_RETURN读入W_RETURN。
     如果sy-SUBRC <> 0。
       调用功能" BAPI_TRANSACTION_COMMIT"。
     万一。

 ENDFUNCTION。

当我在SE37中测试FM时,它工作正常。 但是当我下达订单时,一切都会发生。

我们可以在SWEL中看到事件正在调用FM。

我也不知道为什么两次调用FM。 :(

我们在下面的图像中可以看到,该事件已正确调用,但是对象键(在这种情况下为订单号)没有传递给ZFM。

我不知道这是否是唯一的问题。 这是我的第一次。

请帮助我。

问候。

(49.8 kB)
付费偷看设置
发送
4条回答
hengyuye
1楼 · 2020-08-25 16:44.采纳回答
将'00'OBJKEY CONCATENATE'00'OBJKEY到V_OBJKEY。

 将" OR00" OBJKEY连接到V_OBJNR。

错误在以上几行中。 objkey的左侧带有" 00"。 因此,第一行是不必要的。 我不再使用V_OBJKEY,仅使用OBJKEY。

在第二行中,我将" OR00"更改为" OR"。

FM正常运行。 但是,当订单被释放并保存时,IW32仍会阻止该订单,因此当我调用BAPI时,会返回错误。 我更正了此问题,将代码"等待最多X秒"放在了BAPI代码上方。

这不是一种优雅的方法,但是它可以工作。

关于。

梦想连接
2楼-- · 2020-08-25 16:50

感谢您的反馈。 您不应该实施工作流来更改已发布的对象。 我很惊讶在下达订单时没有用户退出来修改相关日期(AUFK-SDATE?)。

暮风yp
3楼-- · 2020-08-25 16:44

我想FM BAPI_ALM_ORDER_MAINTAIN也会触发您的事件 。 这就是为什么它触发两次。 如果您可以避免它,这将起作用。