相对于从头构建完整的信息系统,基于成熟的ERP等行业软件进行二次开发是更多大中型企业满足个性化需求的首选软件计划。如何在二次开放模块中可靠地读写成品软件的数据库,满足自动创建文档、自动同步元数据等系统集成需求,是开发者面临的难题。今天,基于SAPHANA在活字型低代码平台技术支持工作中的常见实例,为大家介绍几条典型路线。方案一:直接通过ODBC连接HANA,对原始数据进行操作。SAPHANA客户端程序提供了ODBC数据源,开发团队可以通过ODBC直接连接HANA数据库,对数据库中的原始数据进行SQL语句。读写操作。(通过ODBC操作HANA)首先,我们需要在开发环境、测试环境和生产环境的服务器上配置SAP提供的ODBC数据源。安装好SAPClient(推荐x64)后,打开系统的odbc数据源管理程序(注意64位和32位的区别,需要和SAPClient保持一致)。在“系统DSN”选项卡中点击“添加”,选择HDBODBC,然后按照界面提示输入数据源名称,如“HANA-TestLibrary”、服务器IP地址、用户名和密码。(创建ODBC数据源到HANA)配置完成后,我们就可以像其他数据库一样读写SAPHANA数据了。回到活字格子中,我们使用“连接外部表”功能,将所有需要在HANA中操作的数据表导入。之后就可以通过拖拽的方式完成数据绑定,或者在服务器端拼接执行SQL语句。(在活字格低代码平台引入ODBC数据源)如果只是读取元数据或者一些简单的文档,这个方案确实是一个简单的方案。但是SAP的数据表结构复杂,缺乏有效的数据库脚本跟踪能力。我们很难确定在文档创建过程中需要操作哪些表的哪些字段。因此,在稍微复杂一点的应用场景下,直接通过ODBC操作原始数据的风险更高。(纯代码,通过ODBC操作HANA数据表)根据多年的技术支持经验,我们通常不推荐客户采用该方案。场景二:调用NetWeaverAPI操作业务对象SAP显然意识到开发人员直接连接HANA并操作原始数据所带来的可靠性风险。因此,SAP推出了NetWeaver集成平台,为开发者提供了原厂级的二进制解决方案,“尽可能”保证写入的数据不会对SAP系统的运行造成威胁。但是这个平台的开发成本还是差强人意,以至于大部分开发者在第二个项目开始的时候就放弃了这个方案。不过在NetWeaver中,将对数据表中原始数据的操作封装成了对业务对象的操作,并加入了一些必要的验证逻辑,这对二开来说还是很有意义的。更重要的是,这些封装的接口是开放的。即使采用其他开放方案,我们仍然可以通过RFC协议调用NetWeaver提供的HANA运行能力,避免直接读写原始数据的风险。引入NetWeaver后,二开模块不再可以直接操作HANA数据库,而是通过位于二开服务器上的RFC桥(如果可维护性要求不高,也可以直接集成到二开模块中)和SAP集群在NetWeaver中完成。Erkai模块通过HTTP等协议调用RFC桥,RFC桥通过RFC协议中转NetWeaver,NetWeaver负责直接对应HANA上的SQL语句。我们之所以将RFC调用部分抽象成一个专门的RFC桥接模块,主要是因为这部分使用了第三方组件库(SAP原版.NETSDK名声不好)与二次开放模块隔离,可以有效降低维护风险。由于客户采用低代码开发方式,本RFC桥的实现方式是基于活字格服务端编程接口开发的自定义WebAPI。对于纯代码开发人员,RFC桥通常是ASP.NETMVC或JavaSpringBootWeb服务。在实现逻辑和架构原则上,低代码和纯代码是相似的,都需要通过写代码来完成。(通过RFC+NetWeaver操作HANA)第一步:使用C#开发调用NetWeaverUpdate1的RFC桥)、SAPNetWeaverRFCSDK(截图为7.5)和开源项目SapNwRfc(https://github.com/huysentruitw/SapNwRfc).其中,SAPSDK需要客户使用SAP账号,在SAP官网下载。首先,我们在VS2021中创建一个.NET4.7.2类库项目,引用RFCSDK中lib文件夹下的sapnwrfc.dll;然后通过nuget找到并安装SapNwRfc包和Microsoft.AspNetCore.Http.Abstractions包(可移动类型服务),终端编程接口需要依赖该包);最后,引用活字服务器程序安装目录下的GrapeCity.Forguncy.ServerApi.dll。为了保证RFCSDK的正常运行,简化部署操作,我们建议将RFCSDK的文件直接复制到系统盘下的某个目录下,并将该目录下的lib文件夹添加到系统的PATH变量中以确保运行时能够准确找到引用的sapnwrfc.dll。(Nuget中的SapNwRfc包)然后,我们需要根据SAP文档创建对应RFC传入传出参数的类。SAP为每一个NetWeaver接口都准备了一个Excel文件,里面记录了方法名,传入传出参数的类型和结构。我们只需要找到我们需要调用的接口对应的Excel文件,根据文档的要求创建输入输出参数对应的类即可。需要注意的是,属性的??名称和SapName标签的值必须与文档中的参数名称严格一致。以创建供应商为例,我们需要创建一个传入参数类:CreateVendorParameters和一个传出参数类:createVendorParametersObj。(NetWeaver中创建的供应商接口对应的参数结构)然后,我们在项目中创建WebAPI,继承自ForguncyApi的一个类GetSAPInfo,然后创建POST请求的响应方法CallRFCFunction(方法名和类名的形式URL的路径部分)。在代码中,我们从请求中读取连接字符串、要使用的方法和参数,调用SapConnection类的相应方法进行处理,最后将结果序列化返回给WebAPI的调用方。和属性名一样,调用SapConnection时传入的方法名也必须和文档中的文字严格一致,比如创建provider的方法名就命名为ZLIFNR\_CREATE。(RFCbridge的WebAPI实现)根据以往的经验,为了降低调用RFCbridge的开发者的学习门槛,也可以参考SAP提供的文档直接操作,建议整合所有使用过的接口到一个WebAPI中。代码中通过SAP的方法名进行switch分支。如果需要使用这些示例代码,可以从码云获取:https://gitee.com/GrapeCity/lowcode\_extention\_demo\_hana\_via\_sap\_rfc第二步:调用Mosaic中的RFC桥接使用Mosaic服务终端编程接口开发的WebAPI的用法与纯代码开发的WebAPI完全一样。在使用活字开发业务系统时,可以通过“发送HTTP请求”命令调用。首先,在开发测试环境中,我们通常会连接不同的SAP数据库。因此,我们需要将连接NetWeaver所需的必要信息存储在数据库中,并随程序发布,而不是写在代码或全局配置文件中。中间。(数据库中保存的NetWeaver连接信息)在操作SAP数据时,我们需要使用“设置变量命令”从数据库中读取当前环境使用的HANA数据库的参数拼接成连接字符串;然后通过调用RFC桥的WebAPI使用“发送HTTP请求命令”。根据步骤1中RFC桥的实现,其URL地址为customapi/{类名}/{方法名}。我们还需要在HEAD中设置连接字符串和方法名(来自SAP提供的Excel文档,如ZLIFNR\_CREATE)。(配置NetWeaver的连接字符串和方法名)需要在BODY中设置具体的请求参数,将二次开放系统的业务数据作为参数传递给HANA,并进行相应的数据操作,最终达到系统集成的效果。创建供应商资料,如此处所示。(配置传递给NetWeaver的业务数据)下面是我们在帮助客户进行技术评估时快速搭建的MovableType与SAPNetWeaver集成的demo。如果想使用这个项目,可以从码云获取:https://gitee.com/GrapeCity/lowcode\_demo\_hana\_via\_sap\_rfc(SAPHANA与MovableType集成的效果)讨论中为了帮助开发者做到两点SAP、用友等主流厂商提供了两种开发模式:直连数据库和封装业务接口。在纯代码开发模式下,两种模式最大的区别在于前者的性能上限更高,而后者的可靠性更强。进入低代码时代后,封装业务接口的模式表现出了更强的竞争优势。比如今天的例子,借助RFC桥,业务应用的开发者可以通过可视化的配置轻松实现对HANA数据库的读写操作,而这一切都不需要掌握任何编程语言。专业程序员利用平台的编程接口扩展平台能力,非专业程序员利用这些能力直观地完成系统开发。这种“混合模式”正在成为低代码开发的主流。
