在 Excel 内使用 ODBC 消费 SAP ABAP CDS view
Consuming CDS View Entities Using ODBC-Based Client Tools
本文介紹通過基于 ODBC(Open Database Connectivity) 的 SQL 語句訪問 ABAP 系統 CDS view 數據的方法。
ODBC 是一套標準的訪問數據庫的 API.
Why an ODBC Driver for ABAP?
在某些情況下,您希望對 ABAP 系統擁有的 CDS 對象進行外部 SQL 讀取訪問。對 ABAP 系統底層 SAP HANA 數據庫的直接 SQL 讀取訪問不是一個好的選擇。 SAP Note 2511210 中列出了一些問題。ABAP 數據庫中的名稱和內部結構可能不穩定,因為生命周期由 ABAP 系統管理。類型轉換可能不會按預期執行,例如,NUMC 數據類型可能未正確填充,或者貨幣數據可能未正確移動。只有從 ABAP 系統訪問視圖時,數據庫會話變量才能正確設置。如果直接用底層 SQL 語句查詢,這樣繞過了 ABAP 級別的安全概念。
當您通過使用 ODBC 直接訪問 ABAP 系統將 ABAP 系統本身視為數據庫時,所有這些問題都會消失。在這種情況下,身份驗證和授權是使用 ABAP 用戶完成的。應用完整的 ABAP SQL 語義,甚至可以使用應用程序服務器級別的緩沖以及 ABAP 級別的訪問控制和讀取訪問日志記錄。
與 ODATA 接口相比,ODBC 接口的優勢在于它允許對所有公開的 ABAP CDS 視圖實體進行無限制的 SQL 訪問。來自不同實體的數據可以臨時方式連接起來,并且可以聚合數據以進行分析查詢。
在其當前版本中,“用于 ABAP 的 ODBC 驅動程序”僅支持在 ABAP 系統中使用具有特權訪問權限(無 DCL)的技術用戶。只允許對公開的 ABAP CDS 對象進行讀取訪問。
Overview of Steps and Prerequisites
要通過 ODBC 訪問 ABAP 系統中的 CDS 視圖實體,這些實體首先需要在后端系統中正確被暴露,然后才能通過 ODBC 應用程序中的“用于 ABAP 的 ODBC 驅動程序”訪問它們。
ODBC 應用程序可以是任何能夠加載 ODBC 驅動程序的客戶端工具,也可以是用能夠使用 ODBC 驅動程序的程序語言(例如 C、C++、python、node.js、PHP)編寫的程序。
本文將展示 Windows 上的 Microsoft Excel 用例。
“適用于 ABAP 的 ODBC 驅動程序”本身在 Windows 和 Linux 上可用。
(1) Create and fill some test tables
首先創建兩個測試數據庫表,用于存儲訂單的抬頭和行項目:
@EndUserText.label : 'ORDER ITEMS' @AbapCatalog.enhancement.category : #NOT_EXTENSIBLE @AbapCatalog.tableCategory : #TRANSPARENT @AbapCatalog.deliveryClass : #A @AbapCatalog.dataMaintenance : #RESTRICTED define table zorderitems {key orderid : abap.numc(10) not null;key pos : abap.int4 not null;item : abap.char(100) not null;amount : abap.int4 not null;} @EndUserText.label : 'Jerry ORDERS' @AbapCatalog.enhancement.category : #NOT_EXTENSIBLE @AbapCatalog.tableCategory : #TRANSPARENT @AbapCatalog.deliveryClass : #A @AbapCatalog.dataMaintenance : #RESTRICTED define table zorders {key id : abap.numc(10) not null;creationdate : abap.datn;}創建一個 ABAP class,用于填充數據:
class zcl_fill_orders definitionpublicfinalcreate public.public section.interfaces if_oo_adt_classrun.protected section.private section.endclass.class zcl_fill_orders implementation.method if_oo_adt_classrun~main.data: lt_orders type table of zorders.delete from zorders.lt_orders = value #(( id = '1' creationdate = '20210801' )( id = '2' creationdate = '20210802' )( id = '3' creationdate = '20210803' )).insert zorders from table @lt_orders.out->write( sy-dbcnt ).data: lt_orderitems type table of zorderitems.delete from zorderitems.lt_orderitems = value #(( orderid = '1' pos = '1' item = 'Apple' amount = '5' )( orderid = '1' pos = '2' item = 'Banana' amount = '5' )( orderid = '1' pos = '3' item = 'Orange Juice' amount = '2' )( orderid = '2' pos = '1' item = 'Orange' amount = '10' )( orderid = '2' pos = '2' item = 'Apple' amount = '5' )( orderid = '3' pos = '1' item = 'Bottle Water' amount = '5' )).insert zorderitems from table @lt_orderitems.out->write( sy-dbcnt ).endmethod.endclass.插入的測試數據如下圖所示:
下面給這些數據庫表創建 CDS view,因為只有 CDS view 才能暴露給 ODBC 消費端。
@AccessControl.authorizationCheck: #NOT_REQUIRED @EndUserText.label: 'ORDERS' define view entity ZORDERSVIEW as select from zorders {key id as Id,creationdate as CreationDate } @AccessControl.authorizationCheck: #NOT_REQUIRED @EndUserText.label: 'ORDER ITEMS' define view entity ZORDERITEMSVIEW as select from zorderitems {key orderid as OrderId,key pos as Pos,item as Item,amount as Amount }現在我們需要一個 Service definition 和一個對應的 SQL 類型的 Service binding 來定義新的 CDS 視圖實體, 并通過 SQL 服務公開。
要定義新的服務定義,請右鍵單擊項目資源管理器中的 ZORDERSVIEW 或 ZORDERITEMSVIEW 視圖之一,然后選擇“New Service Definition”并為服務定義命名,例如 Z_SERVICE_DEF_SQL。
@EndUserText.label: 'test SQL service' define service Z_SERVICE_DEF_SQL {expose ZORDERSVIEW as Orders;expose ZORDERITEMSVIEW as OrderItems; }這個新的 service 定義可以用在一個 service binding 里了。選中 service definition,右鍵菜單里創建 service binding:
binding 類型一定要選擇成:SQL1 - Web API
這個 Service Binding 的名稱 ZORDERS,稍后將成為外部 ODBC 消費端使用的 schema 名稱。
由于我們要使用ABAP系統中的技術用戶來訪問服務綁定,我們現在需要在SAP BTP ABAP Environment系統中創建一個通信場景 communication scenario:Z_COMM_SCENARIO_SQL 和一個通信安排 communication arrangement.
在生成的 communication scenario 里,點擊 inbound 標簽頁。Inbound Service ID,選擇 S_PRIVILEGED_SQL1:
S_PRIVILEGED_SQL1 是預配置的服務,用于對 CDS 視圖實體的特權訪問。DCL 代表 Data Control Language,它提供了一種訪問控制機制,根據條件對從數據庫中 CDS 視圖返回的結果進行過濾。
Authentication method 選擇 Basic:
切換到 Authorization 標簽頁,添加新的 Authorization 對象:S_SQL_VIEW
給這個 Authorization object 的三個字段分別維護上對應的值。
SQL_SCHEMA 必須包含我們要授予訪問權限的服務綁定的名稱。 在這種情況下,大寫符號是可以的。
SQL_VIEW 的值“*”意味著我們允許訪問附加到服務綁定 ZORDERS 的服務定義中的所有視圖。
由于當前只允許只讀訪問,因此 SQL_VIEWOP=SELECT 是必需的。
實際上,我們將模式 ZORDERS 中所有視圖的 SELECT 權限授予通信場景的用戶,就像我們在數據庫中發出 GRANT 語句一樣。
點擊 publish locally:
右鍵單擊 ABAP Development Tool 里的 ABAP 項目,選擇屬性,找到該 ABAP 環境的 Fiori url:
創建一個新的 communication system:
勾上 Inbound Only:
創建一個新的 communication user,維護長度為 20 的密碼,比如 S!重復三遍。
最后一步,創建 Communication arrangement,將 ADT 里創建的 Communication scenario 同剛剛創建的 Communication system 連接起來。
輸入 Communication system,可以自動把 user 也帶出來:
把 Service url 抄下來:
https://<guid>.abap.eu10.hana.ondemand.com/sap/bc/sql/sql1/sap/S_PRIVILEGED
Install the ODBC driver on Windows
訪問 SAP support portal 的 software download 區域:
https://launchpad.support.sap.com/#/softwarecenter
搜索關鍵字:ODBC DRIVER FOR ABAP
根據操作系統的不同,下載對應的驅動:
同理,下載 SAPCRYPTOLIB:
擴展名為 .SAR, 需要用專門的解壓工具 SAPCAR 來解壓:
解壓之后的文件列表如下圖所示:
啟動 ODBC data source 應用,這是 Windows10 自帶的應用:
點擊 Add 按鈕:
驅動類型選擇 ODBC driver for ABAP:
新建一條 User Data Source Name:
最后就可以在 Excel 等客戶程序里通過 ODBC 消費 CDS view 數據了:
選擇剛剛創建的 User DataSource Name:
輸入之前創建的 technical user credential:
點擊 Connect 按鈕之后,我們能在 excel 里看到 service binding ZORDERS 暴露的全部數據:
我們也可以在 Excel From ODBC 的 Advanced Options 里,指定我們想要執行的 SQL 語句:
可以直接在 Excel 里看到執行結果:
更多Jerry的原創文章,盡在:“汪子熙”:
總結
以上是生活随笔為你收集整理的在 Excel 内使用 ODBC 消费 SAP ABAP CDS view的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: esn是什么意思_IMEI MEID
- 下一篇: 使用 Excel 读取 SAP ABAP