最佳实践而不是硬编码 RFC 目的地?

Best practice instead of hard-coded RFC destinations?

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

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

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

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

CALL FUNCTION 'XYZ' DESTINATION p_dest

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

感谢您的帮助!

我看到每家公司都创建自己的自定义 table,其中包含 RFC 目标(管理员在每个 SAP 系统中以不同方式维护;最终它可以是标准 table [=11= 中的自定义条目]), 但没有人发表任何关于它的文章。最终这个 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创建全局class而不是在每个程序中硬编码SELECT。

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

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

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

我知道你可能只是想专注于你的问题,而不是为了其他阅读这篇文章的人。