# 基于AIF的接口开发简述
原创 3号技师-小宝 [ 建广技师 ](javascript:void\(0\);)
__ _ _ _ _
声明:本文的一些内容来源Jerry群的一位同学,但是我忘记他叫什么名字了,我努力找了很久也没有找到,特此表示感谢,如果那位同学看到内容请联系我,我将在留言置顶予以署名。如果不想发布相关内容也请联系我,我将予以删除,谢谢。
我们可能经常遇到由于项目中开发的接口较多,多多少遇到遇到这样或那样的问题。
比如:
• 企业使用了PI,并且拥有一个复杂的、异构的系统场景。
• 希望将接口的技术和业务方面解耦,从而使业务用户能够执行错误处理。
• 接口技术实现方案多种多样,且功能和流程复杂。
• * *
为了统一接口开发模式,并且有利于上线后 接口的运维及扩展,本文简要介绍一下使用SAP AIF(Application Interface
Framework)来进行统一的接口管理。
• * *
** 什么AIF? **
一句话解释AIF,它可以减少实现和维护接口的时间和成本,使业务用户也能够实施接口和对错误进行处理。
SAP应用程序接口框架AIF (SAP Application Interface
Framework)允许我们在SAP后端系统的单个框架中开发和监控接口,以及执行错误处理。
**从使用方面来说:**
SAP应用程序接口框架使您能够在SAP后端系统中的单个框架中开发和监控接口以及执行错误处理。
SAP应用程序接口框架的可能需求来源如下:
使用SAP Process Integration,您将拥有复杂、异构的系统环境
您希望将接口的技术和业务方面解耦,从而使业务用户能够执行错误处理
您在执行接口实现指南时遇到困难
为了实现减少实施和维护接口的时间和成本的目标,SAP应用程序接口框架使您能够:
进行功能监控而非技术监控
由于业务用户能够更正相关应用程序中的错误,因此提高了数据质量
通过灵活的授权规则限制接口数据和错误监视器访问
执行接口实施指南
执行大规模错误处理
** 从特性方面来说: **
SAP应用程序接口框架为您提供以下功能:
** 对于业务用户: **
向业务用户通知错误的自动警报
界面监控、错误处理和直接从应用程序系统内更正错误的用户友好事务
SAP GUI和基于Web的用户界面
使用单一工具来监控和处理消息,而不考虑所涉及的接口技术
** 对于IT人员: **
用于实现接口的强大框架
一个可定制的接口框架,用于在多个接口上生成和重用接口构建块
灵活的授权规则可限制对数据的访问以及监控和错误处理
用于系统配置和操作的工具
监视具有不同接口技术的接口,例如ABAP代理和IDocs
** 从集成方面来说: **
下图显示了SAP应用程序接口框架的系统布局:
下图显示了SAP应用程序系统中SAP AIF的系统架构:
** SAP AIF支持的接口技术如下: **
• IDoc (see IDoc Support)
• Proxy (see Proxies)
• Web Service
• File (see File Adapter)
• XML
• Transactional remote function call (tRFC)
• Queued remote function call (qRFC)
• Background remote function call (bgRFC)
• Background processing framework (bgPF) (see Configuring bgPF Monitoring)
• Events (see Event Error Log)
• OData (see Configuring OData Monitoring and OData Support)
SAP AIF支持接口协议全景图
# ** SAP Fiori Apps for SAP Application Interface Framework **
** 以下消息监视应用程序可用于SAP AIF: **
消息监视概述:获取您负责的接口的概述以及每个接口处于不同状态的消息。
消息监视:获取一个接口的概述以及通过该接口处理的消息。
针对集成专家的消息监视:获取界面的概述,查看通过它们处理的所有消息的详细信息,并执行大规模错误处理。
针对管理员的消息监视:获取系统中所有接口、收件人和消息的概述。
消息监视(紧急更正):在紧急情况下编辑消息有效载荷的非自定义字段。
** 以下错误日志应用程序可用于SAP AIF: **
SOAP错误日志:查看和筛选与SOAP web服务相关的错误日志。
OData错误日志:查看和筛选与OData服务相关的错误日志。
事件错误日志:查看和筛选与事件相关的错误日志。
以下管理应用程序可用于SAP应用程序接口框架:
维护跟踪级别:设置和维护特定接口的跟踪级别。
• * *
以下按照不同场景,使用目前项目上实际的开发需求来列举具体的实现方法。
** 1\. 外向发送 **
外向发送即从SAP系统发起,通过AIF框架及PO系统,将信息发送到外围系统。
外向发送根据业务需要大致分为三种:
• 业务对象保存时实时发送至单一系统
• 业务对象保存后定时发送至单一系统
• 实时或定时向多个系统同时发送
**1.1. 业务对象保存时实时发送**
该场景以物料凭证外向发送为例,业务需求为当物料凭证创建时,点击保存或过账后,根据业务需求,将符合条件的数据发送到外围系统。
技术实现为:基于物料凭证的业务对象BUS2017对应的工作流事件CREATED来触发AIF,实现数据的外向发送。
实现步骤:
** 1.1.1. 实施BADI,在BADI中触发工作流 **
** 1.1.2. 使用SWE2配置工作流事件触发的功能 **
该方式可结合实际情况使用,如果实时发送的时间点对状态的依赖较高,例如采购订单审批时触发发送,使用该方式较为合适,本例中也可以直接在BADI中直接调用AIF框架。另外如果有些需求需要基于某些字段变更为条件向外发送,如物料主数据某几个字段变更时才会实时触发外向发送,则使用BTE增强更合适,可以在增强中判断哪些字段发生了变化,总之,根据实际需求来确定具体的触发方式。
在函数中调用AIF触发:
程序中使用的接口在后续步骤中定义。
此处如使用SWE2配置,也可以使用类来替代函数。在类中使用接口BI_EVENT_HANDLER_STATIC。如图(示例在SBX中):
** 1.1.3. 定义AIF命名空间 **
事务/AIF/CUST
** 1.1.4. 定义接口 **
这里定义的接口并不完全是与需求层面的一个接口是一对一关系,可以设计需求,对接口进一步细化,方便日志记录,或基于日志的重新处理等等。
** 1.1.5. 定义结构映射 **
在结构映射中,可以实现字段映射,字段检查,结构填充,字段截取,分配固定值,集成BRF+等,同时可以为接口分配多步操作等。
一旦映射结构发生变化,需使用/AIF/DEL_STRUC_CACHE清理Cache,否则新的结构映射不会生效,导致整个接口不能正常工作。
** 1.1.6.定义读取Log相关的索引表及查询屏幕: **
• * * * * * * * * *
REPORT zmmmrm_aif_selscreen_001.TABLES: mkpf.
SELECTION-SCREEN BEGIN OF SCREEN 9001 AS SUBSCREEN.PARAMETERS: p_mblnr TYPE mkpf-mblnr, p_mjahr TYPE mkpf-mjahr.SELECTION-SCREEN END OF SCREEN 9001.AT SELECTION-SCREEN OUTPUT. /aif/cl_global_tools=>get_value_from_mem( ).
** 1.2.业务对象定时发送 **
定时发送即某些业务对象实时性不是很高,因此可以在一定的时间段内根据条件筛选出需要的数据,集中发送。
其做法与1.1类似,只是不需要启用BADI或Event做为实时触发点,直接在Report中调用配置好的AIF接口即可。
** 1.3. 实时或定时向多个系统发送 **
有时候一些对象与多个系统集成,须同时将对象信息发送到多个系统,这里的实现形式较多,可以结合PO接口一并考虑,例如使用了SWE2基于EVENT触发,则可以通过配置多个接受类型来实现,如果在BADI中调用AIF,可以逐个调用对应的接口,在Report中与在BADI中类似,但是整个AIF的基本配置与1.1相同。
** 1.4. 异步发送 **
异步发送通过AIF配置之后,可以直接使用函数/AIF/SEND_WITH_PROXY,
也可以使用/aif/cl_enabler_xml=>transfer_to_aif,但是需要在操作中配置Action函数调用Proxy。
** 1.5. 同步接口 **
外发的同步接口需要定义两个接口(一个向Proxy传送OUTPUT,一个接收PROXY的INPUT)。
同步也可以直接使用函数/AIF/SEND_WITH_PROXY。
参数SAP_STRUCT用于传输进入AIF的数据,参数RESP_SAP_STRUCT用于接收来自对方系统的RESPONSE信息。
** 2\. 内向接收 **
内向接收即外围系统通过PO系统发布的服务,向SAP系统发送服务请求,SAP在接到服务请求后,根据具体的业务需求进行进一步处理。内向接收与外向发送不同的是,调用AIF在Inbound
Proxy中,又会因为同步和异步而略有差异。
** 1.6. 异步 **
• * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
CALL METHOD /ui2/cl_json=>deserializeEXPORTINGjson = input-mt_bc000101_req_in-req_jsonpretty_name = /ui2/cl_json=>pretty_mode-camel_caseCHANGINGdata = ls_input_sap_stru.
CALL METHOD cl_proxy_access=>get_inbound_message_keyIMPORTINGmessage_id = lv_xi_message_id.
LOOP AT lt_input_sap_stru ASSIGNING <lfs_abap>.<lfs_abap>-xi_guid = lv_xi_message_id.<lfs_abap>-json = input-mt_bc000101_req_in-req_json.ENDLOOP.
TRY.CALL METHOD /aif/cl_enabler_xml=>transfer_to_aifEXPORTINGis_any_structure = lt_input_sap_struiv_queue_ns = 'ZMMMRM'iv_queue_name = 'MRM'iv_use_buffer = 'X'.CATCH /aif/cx_enabler_base.ENDTRY.如果是多条使用:CALL METHOD /ui2/cl_json=>deserializeEXPORTINGjson = input-mt_bc000101_req_in-req_jsonpretty_name = /ui2/cl_json=>pretty_mode-camel_caseCHANGINGdata = lt_input_sap_stru.
CALL METHOD cl_proxy_access=>get_inbound_message_keyIMPORTINGmessage_id = lv_xi_message_id.
LOOP AT lt_input_sap_stru ASSIGNING <lfs_abap>.<lfs_abap>-xi_guid = lv_xi_message_id.<lfs_abap>-json = input-mt_bc000101_req_in-req_json.ENDLOOP.
TRY.CALL METHOD /aif/cl_enabler_xml=>transfer_to_aif_multEXPORTINGit_any_structure = lt_input_sap_struiv_queue_ns = 'ZMMMRM'iv_queue_name = 'MRM'iv_use_buffer = 'X'.CATCH /aif/cx_enabler_base.ENDTRY.**1.7.同步**
AIF框架在处理同步接口时的意义要弱于异步,也分为处理单条和多条:
可以参考SRM供应商创建和修改的接口,类ZPICL_SI_MM000401_SRM2ERP_SYN
为了简化操作步骤,原结构与SAP结构可以使用同一结构,同时为了Log的保存,在接收JSON的结构下添加公用结构:ZAIF_COMMON_STRU_INBOUND_SYNC,同时,为了从AIF中接收返回的Response信息,在该结构中加入同步接口返回信息对应的ABAP结构的表类型结构,字段名约定为SRESP。如果不需要RESPONSE,而使用RETURN返回信息,可以不指定该字段。如图所示:
.textContent = new Date().getFullYear();