【问题标题】:Best practice instead of hard-coded RFC destinations?最佳实践而不是硬编码的 RFC 目标?
【发布时间】:2020-04-08 15:02:03
【问题描述】:

有没有使用非硬编码 RFC 目标的好方法?

现在我们的解决方案是检查使用哪个系统,然后将目标分配给一个变量

IF cl_role EQ 'P'.
      p_dest = 'ESW300'.
   ELSE.
      p_dest = 'EAW300'.
   ENDIF.

我们在调用目标函数时使用。

CALL FUNCTION 'XYZ' DESTINATION p_dest

有没有不使用硬编码目的地的好方法?

感谢您的帮助!

【问题讨论】:

  • 将其存储在每个系统中正确维护的表中?
  • 何必呢?只需将名称更改为不包含似乎是系统 ID 和客户端并且对其功能有意义的功能。然后实际目的地保存在 SM50 中。

标签: abap saprfc hardcoded


【解决方案1】:

RFC 目标已经是端点的抽象,所以我不建议再次抽象它。出于这个原因,我建议在系统中使用相同的名称作为主要实践,而不是将它们更改为特定于实例。

否则,如果您真的想跨系统使用不同的 RFC 目标名称(我不会),我建议您动态确定 RFC 目标,而不是硬编码。如果您查看一些 SAP 标准程序,它们使用特定格式来确定预期的 RFC 目标名称,例如 SolMan 使用 <hostname>_<systemname>_<system number>,但是如果您查看可以找到的标准 RFC 目标,则有很多示例。

我还建议作为最佳实践,任何硬编码值永远不要像您的示例所示那样内联填充,而是在标题常量中填充。

我意识到你可能只是想把注意力集中在你的问题上,而不是为了其他阅读这篇文章的人。

【讨论】:

  • 您能否解释一下 SAP 解决方案管理器如何对“直接目标”(hostname_sysid_sysnr) 进行硬编码?它无法知道要连接的客户系统,客户必须在某个地方定义它们。如果你做一个系统副本呢?你能提供更多信息吗?请注意,SAP CRM 为 ERP 的 RFC 目标定义了一个抽象(FM CRM0_READ_RFC_DESTSMOF_READ_SMOFERPSH 后面的表)。注意:请注意,SM59 中未定义这些“直接目标”,必须定义受信任的关系 (STRUST),否则需要手动登录。
  • Sandra,抱歉,可能不清楚,解决方案管理器中的某些程序中的编码使用我记录的模式动态确定要使用的 RFC 目标,一个简单的示例,我不知道该程序,但是例如,当您在解决方案管理器中定义一个实例和客户端,然后去开发信任关系时,它会使用类似于我展示的生成 RFC 目标的模式生成 RFC 目标,它将自动创建
  • 我无法在第一条评论中完整评论,但实际上需要 CRM0_READ_RFC_DEST,因为在连接到外部系统之前有一些属性是必需的。例如,FM 检查加载类型、下载类型等,因此抽象是必要的,以便您可以在这种情况下根据能力选择目标。考虑到基于无法存储在 RFC 目标 (SM59) 中的属性选择多个 RFC 目标之一的要求,我可能会以相同的方式处理它
  • 所以,我的理解是,SolMan 将所有三个主机名、sysid、sysnr 存储在一个表中,无论如何都会通过STRUST 自动创建 RFC 目标。所以,关于 OP 问题,我知道您也建议创建一个自定义表。
  • 对于抽象/别名,表SSM_RFC/UI2/SYSALIASMAP 也可用。 blogs.sap.com/2015/06/01/configuring-remote-systems-in-sm59 的更多信息 一个用例是将 SAP_CRM(或类似的通用别名)映射到 D、Q、P 中的特定实例。非常类似于在 Gateway 或旧 Portal 中完成的方式。
【解决方案2】:

我看到每家公司都创建了自己的自定义表,其中包含 RFC 目标(管理员在每个 SAP 系统中以不同方式维护;最终它可以是标准表 TVARVC 中的自定义条目),但没有人发布任何关于它的信息。最终这 blog post 但这是一个非常复杂的解决方案,仅记录在案,但未提供代码。

一种更简单(也足够?)的方法是为每个系统创建一个逻辑系统(事务代码BD54),并分配一个 RFC 目标(事务代码BD97)。

在你的程序中,做这样的事情:

SELECT SINGLE rfcdest
    FROM tblsysdest
    WHERE logsys = 'CRM' 
    INTO @DATA(crm_system).

CALL FUNCTION 'RFC_PING' DESTINATION crm_system
    EXCEPTIONS OTHERS = 1.

PS:更喜欢抽象事物,例如使用一个方法 GET_CRM_SYSTEM 创建一个全局类,而不是在每个程序中硬编码 SELECT。

【讨论】:

  • 知道并提到 BD97 的人... +1 当然,如果目的地是注册的外部程序,我们有不同的游戏。但对我来说也像是 BD64/BD97 逻辑系统/标准目的地类型问题。
猜你喜欢
  • 2018-08-19
  • 1970-01-01
  • 2013-04-22
  • 1970-01-01
  • 1970-01-01
  • 2015-02-11
  • 2014-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多