在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据

这是 Jerry 2021 年的第 59 篇文章,也是汪子熙公众号总共第 336 篇原创文章。

Jerry 之前曾经给大家分享过,如何使用各种工具和编程语言,消费 SAP API Business Hub 上罗列的 API.

在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据
在 SAP API Business Hub 网站上,SAP 这些 API,分为 SOAP,OData 和 REST 三类。

在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据
Jerry 的文章 SAP Cloud for Customer 如何直接消费 S/4HANA API 介绍了如何在 SAP Cloud for Customer 里通过 Restful API 工具库,消费 SAP S/4HANA 暴露的 Restful API:

在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据

而下面这几篇文章,介绍了 SAP OData API 的开发与消费:

OData 协议基于 HTTP,在使用 OData 服务进行业务数据的创建或者修改时,需要开发人员在 HTTP 层面操作 POST 请求的 body 内容,步骤繁琐且容易出错。

比如下图是 Jerry 2019 年一个项目中使用 Java 消费 SAP C4C OData 服务创建销售订单的测试代码片段,其中第88行变量 body,包含的就是手动拼接 HTTP Post 请求的负载内容,代码可读性很差且不易维护。

在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据
为了避免这些缺点,提高开发人员使用 SAP S/4HANA OData 进行集成的开发效率,SAP 发布了 SAP S/4HANA Cloud SDK.

在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据

借助 SAP S/4HANA Cloud SDK,开发人员无需了解 S/4HANA OData 服务的设计细节,可以采用类似自然语言的代码风格,调用 S/4HANA OData 服务,实现数据的增删改查。

下图的例子使用 S/4HANA Cloud SDK 读取BusinessPartnerCategory 字段值为 2 的前20条 BusinessPartner 数据,并且只返回这些数据的 Partner Name, FullName 和 Customer 等字段。代码采用 Declarative 即声明式的方式编写,可读性大大优于直接操作 HTTP Post 负载的做法。

在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据

关于 SAP Cloud SDK 的更多细节,请参考我的文章:SAP S/4HANA Cloud SDK 入门介绍

而另一大类 SAP SOAP API 的消费方式,请参考 Jerry 之前的文章:如何在 SAP BTP 平台 ABAP 编程环境里消费基于 SOAP 的 Web Service.

除了 SAP API Business Hub 上提到的这三种 API 之外,Jerry 之前的文章:在 SAP BTP 上体验 SAP HANA Cloud 试用版本,还提到过使用 HANA Client 工具库,直接把待执行的 SQL 语句发送给 SAP HANA Cloud 实例;后者执行完毕后,将结果返回给 HANA Client:

在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据

这种方式类似 ADBC 和 JDBC,细节可以参考 Jerry 这篇文章:在 SAP BTP 上体验 SAP HANA Cloud 试用版本

在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据
本文介绍一种类似的数据消费方式:Open Database Connectivity 即 ODBC,开放数据库互连。

ODBC 提供了一种标准的 API 方法来访问数据库管理系统即 DBMS. ODBC API 利用 SQL 来完成绝大多数数据库操作。

下面我们通过一个实际的例子来了解 ODBC 的用法。这个例子的场景是,在 SAP BTP 平台 ABAP 运行环境里,创建数据库表和对应的 CDS view,然后使用本地的 Excel 文件,通过 ODBC 访问 CDS view 的内容。

首先在 SAP BTP ABAP 运行环境里创建两个简单的数据库表,存放订单抬头和行项目信息:

在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据

在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据
插入一些测试数据:

在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据

然后创建对应的 CDS view:
在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据

在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据

下面我们需要通过 Service Definition 将这两个 CDS view 的数据暴露给外部消费者。

Jerry 之前的文章 30分钟用 Restful ABAP Programming 模型开发一个支持增删改查的 Fiori应用,曾经介绍过如何基于 RAP 模型,快速基于 CDS view 创建出一个 Fiori 应用出来。

  • Service Definition
  • Service Binding
  • Communication Scenario
  • Communication Arrangement

而通过 ODBC 将 CDS view 暴露给外部消费者,仍然需要按照上述顺序创建对应的开发对象。

首先创建 Service Definition,将之前创建的两个 CDS view 通过关键字 expose 暴露出去,通过 as 关键字设置别名为 Orders 和 OrderItems:
在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据

基于这个 Service Definition 创建一个新的 Service Binding:
在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据

Binding 类型,从下拉菜单里选择 SQL1,以支持 ODBC:
在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据

Service Binding 的名称起名为 ZORDERS,在文章最后通过 Excel 消费这个 Service 时,能在 Excel 里看到同名的节点,其下包含了通过 Service Definition 暴露出来的 OrderItems 和 Orders 两个视图:

在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据

创建新的 Communication Scenario:
在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据

在该 Scenario 的 Inbound 标签页里,分配标准的 Inbound Service S_PRIVILEGED_SQL1,用于支持对 CDS view 的 SQL 访问操作。

在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据

切换到 Authorization 标签页,添加新的 Authorization 对象 S_SQL_VIEW,并分别维护其三个字段的值:

  • SQL_SCHEMA: ZORDERS,即我们要授予访问权限的 Service Binding 名称。
  • SQL_VIEW: *. 这个值意味着允许访问 Service Binding ZORDERS 关联的 Service Definition 中,通过 expose 关键字暴露的所有 CDS view.
  • SQL_VIEWOP: SELECT,只读访问。

在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据

点击 Publish Locally:
在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据

创建一个新的 Communication System,取名 SQL_ACCESS:
在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据

在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据

给其分配一个新建的 Communication User. 稍后我们在 Excel 里使用 ODBC 读取 CDS View 数据时,会要求输入该用户的访问密码。

在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据

最后,创建 Communication Arrangement,把生成的 Service URL 即下图黄色高亮区域的字段抄下来,后续创建 Data Source 时,会填写该值。

在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据

在本地安装 ABAP ODBC Driver,访问 SAP Support Portal,输入关键字 ODBC DRIVER FOR ABAP 进行搜索:

https://launchpad.support.sap.com/#/softwarecenter

根据操作系统的类型下载对应版本的驱动:

在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据

同时下载 SAPCRYPTOLIB:

在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据

安装完下载的驱动后,启动操作系统的 ODBC Data Source Administrator 应用,添加一条新的 User Data Source Name(简称为 User DSN):

在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据

ABAP ODBC 驱动安装成功后,在新建向导里能看到新的驱动类型:ODBC driver for ABAP.

在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据

在 DSN 创建向导中维护 Data Source 的明细。其中 Hostname 字段,来自 Communication Arrangement 的 Service Url 字段值。Crypto Library 字段,为前文从 SAP Support Portal 下载的 SAPCRYPTOLIB 解压到本地后的绝对路径:

在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据

Data Source 创建好之后,新建 Excel 文件,选择 From ODBC 进行导入:

在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据

选择刚刚建好的名为 Jerry-ABAP 的 Data Source,输入 Communication Scenario 里维护的用户名和密码:

在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据

在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据

点击 Connect,即可预览 SAP BTP ABAP 环境里 Service Definition 暴露出来的 CDS view 的数据:
在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据

点击 Load 按钮,将这些数据导入到 Excel 中。

在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据

在 Advanced options 里,我们可以*编写 SQL 语句,将 Excel 当成一个简单的 SQL 控制台使用:

在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据

上图编写的 SQL 语句,将订单行项目的数量进行求和,并显示结果到 Excel 里:
在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据

相信通过本文的例子,大家能对如何通过 ODBC 消费 SAP BTP 平台 ABAP 环境的 CDS view 数据有了一个直观的认识,感谢阅读。

更多阅读

更多Jerry的原创文章,尽在:"汪子熙":
在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据

上一篇:OData – Query to Expression


下一篇:OData – How It Work