• 基于 ABAP Fundamental Library 应用支持的几种 Connectivity 方式


    Fundamental Library for ABAP 运行时组件支持下列的 Connectivity Provider 技术:

    Java

    • SAP Java Connector (JCo), SAP closed source, free of charge
    • SAP Cloud Connector, SAP closed source

    NodeJS

    • node-rfc package, SAP open source, based on SAP NWRFC SDK

    Python

    • PyRFC package, SAP open source, based on SAP NWRFC SDK

    SAP NWRFC SDK 是封闭源代码的预构建 C++ 二进制文件,可通过 SAP 客户、合作伙伴或开发人员帐户在 SAP Service Portal 上免费获得。

    上述三种 Connectivity 技术的一个根本区别是,NodeJS 和 Python RFC 客户端连接在默认情况下是有状态的,而 SAP Java 连接器在默认情况下是无状态的,因此如果需要实现有状态的连接(stateful connection),开发人员必须付出一些努力。 因此,NodeJS 和 Python 默认编程模型就像在 ABAP 中一样,调用 Update-BAPI 或其他将中间结果存储在当前用户的 ABAP 会话内存中的 RFM 就行了。例如,NodeJS 或 Python 程序只调用 BAPI 或函数模块,如果成功,只需在同一连接上调用 BAPI_TRANSACTION_COMMIT,在后端的同一用户会话中提交事务即可。
    其中 BAPI_TRANSACTION_COMMIT 和 BAPI_TRANSACTION_ROLLBACK 在 SAP 框架应用的事务处理中使用,用于提交或回滚正在进行的 ABAP 会话。

    SET/GET 参数由 ABAP 事务 SU3 维护,并定义 ABAP 表单输入字段的默认值。打开表单时,如果将 SET/GET 参数分配给输入字段,则该字段会自动预填充 SET/GET 参数值,从而避免用户输入始终相同的输入(即固定销售区代码)。

    因此我们的 Fundamental/ABAP 应用程序应该以相同的方式运行,并自动填充其默认值(SET/GET 参数)在后端维护的字段。

    独立于前端库,我们应用程序的中间件代码可以用 NodeJS、Java 或 Python 实现。 代码看起来差不多,所以让我们以 Python 和 Flask 服务器为例。 备选方案包括用于 Python 的 Pyramid、bottle、tornado 等,或用于 NodeJS 或 Java 中可用的大量其他服务器的 express、Koa 等。

    代码如下:

    import json
    from flask import Flask, Response, jsonify
    from pyrfc import Connection
    
    def to_json(content, simple=False):
        if simple:
            js = simplejson.dumps(content, default=json_serial)
            return Response(js, status=200, mimetype='application/json')
        return jsonify(content)
    
    app = Flask(__name__)
    
    abap_client = Connection(dest="MME)
    
    # Equipment
    @app.route('/equipment/', methods=['POST'])
    def equipment(path):
        try:
            to_abap = json.loads(request.data)
    
            if path == 'get':
                from_abap = abap_client.call('/COE/RBP_PAM_EQUIPMENT_GET', to_abap)
            elif path == 'getlist':
                from_abap = abap_client.call('/COE/RBP_PAM_EQUIPMENT_GETL', to_abap)
            elif path == 'change':
                from_abap = abap_client.call('/COE/RBP_PAM_EQUIPMENT_CHANGE', to_abap)
            elif path == 'install':
                from_abap = abap_client.call('/COE/RBP_PAM_EQUIPMENT_INSTALL', to_abap)
            elif path == 'dismantle':
                from_abap = abap_client.call('/COE/RBP_PAM_EQUIPMENT_DISMTLE', to_abap)
            else:
                raise Exception ('not implemented: %s' % path)
    
            return to_json(from_abap)
    
        except Exception, e:
            return serverError(e), 50
    
    if __name__ == '__main__':
        app.run(host='127.0.0.1', port=8123)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    上面的代码显示了设备的中间件服务器路由。 为 DMS 实现了类似的路由处理程序,并且没有单独的路由用于特征,这是设备 API 的可选部分。

  • 相关阅读:
    零售创新:社交媒体如何改变跨境电商游戏规则?
    JavaScript函数中this的指向问题讨论(普通函数和箭头函数)
    小红书推广怎么做?小红书推广需要注意什么?
    web网页大作业:基于html设计与实现的茶文化网站12页(带psd)
    科技型中小企业认定条件和好处
    单片机之瑞萨RL78 IO输入输出的例子
    WebSocket的优缺点
    番外 2 : LoadRunner 的安装以及配置
    ps显示msvcp140.dll丢失的解决方法,四个解决方法分享
    Vue2实现图片预览功能 -- v-viewer:图片查看器
  • 原文地址:https://blog.csdn.net/i042416/article/details/127833437