【问题标题】:How to read ABAP code using a java client如何使用 java 客户端读取 ABAP 代码
【发布时间】:2020-07-13 00:44:30
【问题描述】:

我有一个要求,我需要阅读 SAP 开发人员编写的 ABAP 代码。我想使用 Java/Python 编写自己的客户端,它可以与 SAP 系统集成并获取 ABAP 代码。

据我所知,ABAP 代码存储在 SAP 数据库中,如 HANA、mysql 等。那么 SAP 是否提供了一种方法,我们可以像在 Git/SVN 等中那样读取代码。

【问题讨论】:

  • 一些想法:ABAP源代码存储在数据库表REPOSRC中,但使用内部SAP算法压缩。要提取它,您必须使用语句 READ REPORT 创建一个 ABAP 程序,并使该程序可在外部调用(SAP 协议 RFC,或任何经典方式,如 HTTP)。您还可以通过 ABAP 工具 abapGit 将源代码推送到 HTTP Git 存储库。最终,您可以创建一个您调用的 ABAP 程序,该程序执行 abapGit。使用 abapGit 的好处是可以输出其他 SAP 代码对象。

标签: abap


【解决方案1】:

您可以使用以下技术访问表格:

  • 通过 RFC (RFC_READ_TABLE) 使用 SAP Connectors
  • 使用具有相同功能的 SOAP Web 服务 (RFC_READ_TABLE)
  • 将自定义 Web 服务与现有功能(读取报告、功能等)结合使用。

您可以将 Java 或 Pyhton 用于 RFC,python 的 github 存储库已经存在。

如果你选择直接读取数据库表,你需要知道保存数据的结构。它有自己的 OOP 对象机制。 Daniel Berlin 尝试在 sap-reposrc-decompressor 项目中用 C++ 实现二进制解析器。永远不要忘记这个来源取决于 SAP 版本。

我认为使用 ADT(ABAP 开发工具)插件对更新系统有好处。已经有用于 ADT 的 Eclipse 插件。旧系统中不存在 ADT。

如果您打算在旧系统(7.01 之后)中使用您的解决方案,您可以使用abapGit 和自定义 Web 服务构建您自己的解决方案。

注意:请记住,报表和数据元素(变量、表格、类型)保存在单独的表格中。 Dynpro 对象(屏幕等)、报告(Smartforms)很难反编译。

【讨论】:

    【解决方案2】:

    我通过 perl NWRFC 包装器/库使用 RFC 调用 RPY_FUNCTIONMODULE_READRPY_FUNCTIONMODULE_READ_NEW 来检索 ABAP 代码。

    【讨论】:

      【解决方案3】:

      在重新发明轮子之前,先看看:

      如果您只想要源代码,您可以在 SAP 中公开一个非常简单的休息服务/端点。
      该服务只会读取原始代码并将其作为纯文本返回。 每个 abaper 都可以为你创造这个。 但只是原始来源。完整的开发还有很多 以及为什么存在 ABAPGIT 等工具。

      在 SICF 中,创建一个新的端点/服务。 EG ZCODE_MONKEY 以下面的类为例。

      现在激活服务。

      调用端点 http://server:PORT/zcode_monkey?name=ZCODE_MONKEY

      示例实现

      CLASS zcode_monkey DEFINITION
        PUBLIC
        CREATE PUBLIC .
        PUBLIC SECTION.
        INTERFACES: if_http_extension.
      ENDCLASS.
      CLASS zcode_monkey IMPLEMENTATION.
        METHOD if_http_extension~handle_request.
            DATA: lo_src type ref to CL_OO_SOURCE,
                  l_name TYPE string,
                  l_repname type c length 30,
                  l_clskey type seoclskey ,
                  l_source type rswsourcet,
                  resultcode TYPE string.
            FIELD-SYMBOLS: <line> TYPE LINE OF rswsourcet.
      
          l_name =    server->request->get_form_field(  name    = 'NAME' ).
      
          l_clskey = l_name.
          l_repname = l_name.
      
          create OBJECT lo_src
            EXPORTING
              clskey             = l_clskey
            EXCEPTIONS
              class_not_existing = 1
              others             = 2      .
      
          IF sy-subrc <> 0.
             read REPORT l_repname into l_source.
          else.
            lo_src->read( ).
            lo_src->if_oo_clif_source~get_source(  IMPORTING source = l_source   ).
          ENDIF.
      
      
          LOOP AT l_source ASSIGNING <line>.
      
            CONCATENATE  resultCode
                         cl_abap_char_utilities=>cr_lf
                         <line>
                  INTO   resultCode   RESPECTING BLANKS. " always show respect ;)
      
      
          ENDLOOP.
      
          SErver->response->set_content_type( content_type = 'text/plain' ).
          server->response->set_cdata( EXPORTING  data   = resultcode ).
          server->response->set_status(
            EXPORTING
              code   = 200
              reason = 'this is a 3.50 piece of code. Dont ask...its a demo ' ).
        ENDMETHOD.
      
      ENDCLASS.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-25
        • 2017-09-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多