還在寫SQL做SAP二開?通過RFC調用NetWeaver,讓HANA資料庫操作更可靠

相比於從零開始構建全套資訊化系統,基於成熟的ERP等行業軟體做二次開發是更多中大型企業應對個性化軟體需求的首選方案。如何在二開模組中,可靠地對成品軟體的資料庫進行讀寫操作,以滿足單據自動創建、元數據自動同步等系統集成要求,是擺在開發者面前的難題。今天,我們基於活字格低程式碼平台的技術支援工作中較為常見SAP HANA為例,為您介紹幾種典型的路線。

方案1:通過ODBC直連HANA,操作原始數據

SAP HANA的客戶端程式中提供了ODBC的數據源,這就使得開發團隊可以直接通過ODBC連接HANA資料庫,並通過SQL語句對資料庫中的原始數據進行讀寫操作。

(通過ODBC操作HANA)

首先,我們需要在開發環境、測試環境和生產環境的伺服器上,配置SAP提供的ODBC數據源。在安裝有SAP Client(推薦x64)之後,打開系統的odbc數據源管理程式(注意區分64為和32位,需要和SAP Client保持一致)。在”系統DSN”選項卡中點擊”添加”,選擇HDBODBC,之後按照介面提示輸入數據源的名稱,如”HANA-測試庫”、伺服器IP地址、用戶名和密碼就可以了。

(創建到HANA的ODBC數據源)

配置完成後,我們就可以像操作其他資料庫一樣,對 SAP HANA的數據進行讀寫了。回到活字格裡面,我們使用”連接到外聯表”功能,引入HANA中需要操作的所有數據表。之後就可以用拖拽的方式完成數據綁定,或者在服務端拼接和執行SQL語句了。

(在活字格低程式碼平台中引入ODBC數據源)

如果僅僅是讀取元數據或者一些簡單的單據,這種方案確實是一個簡單的辦法。但是,SAP的數據表結構複雜,且缺乏有效的資料庫腳本跟蹤能力,我們很難確定一個單據創建過程需要操作哪幾張表的哪些欄位。所以,在涉及到稍微複雜一點的應用場景時,通過ODBC直接操作原始數據的做法的風險較高。

(純程式碼,通過ODBC操作HANA的數據表)

基於多年的技術支援經驗,我們通常不會推薦客戶採用這個方案。

方案2:調用NetWeaver API,操作業務對象

SAP顯然也清楚開發者直連HANA,操作原始數據帶來的可靠性風險。所以,SAP推出了NetWeaver集成平台,給開發者提供了一個原廠級二開解決方案,”盡量”確保寫入的數據不會對SAP系統運行造成威脅。然而,這個平台的開發成本依然不如人意,以至於大多數開發者在二開項目之初就放棄了這個方案。不過,NetWeaver中對數據表中原始數據的操作封裝成對業務對象的操作,並加入了一些必要的校驗邏輯,這一點對於二開來說還是非常有意義的。更重要的是,這些封裝的介面是開放的,即便我們採用了其他的二開方案,依然可以通過RFC協議,調用NetWeaver提供的HANA操作能力,從而避免直接讀寫原始數據帶來的風險。

引入NetWeaver後,二開模組可以不再直接操作HANA資料庫,而是通過位於二開伺服器上的RFC橋(如果對可維護性要求不高,也可直接集成到二開模組中)和位於SAP集群中的NetWeaver來完成。二開模組通過HTTP等協議調用RFC橋,RFC橋則通過RFC協議轉調NetWeaver,NetWeaver則負責在HANA上直接對應的SQL語句。

之所以我們將RFC調用部分抽象成一個專門的RFC橋模組,主要是考慮到這部分採用了一個第三方組件庫(SAP原廠的.NET SDK口碑不佳),將其與二開模組進行隔離,可有效降低維護風險。因為客戶採用的是低程式碼的開發方式,這個RFC橋的實現方式為基於活字格服務端編程介面開發的自定義WebAPI。對於純程式碼開發者來說,RFC橋通常是一個ASP.NET MVC或Java SpringBoot的Web服務。在實現邏輯和架構原理上,低程式碼與純程式碼大同小異,都需要通過寫程式碼的方式完成。

(通過RFC + NetWeaver操作HANA)

步驟一:使用C#開發調用NetWeaver的RFC橋

在這一步中,我們需要使用到Visual Studio(截屏是VS2021)、活字格服務端編程介面(截屏是活字格V7.0 Update1)、SAP NetWeaver RFC SDK(截屏是7.5)和開源項目SapNwRfc(//github.com/huysentruitw/SapNwRfc)。其中SAP的SDK需要客戶使用SAP帳號,從SAP官網下載。

首先,我們在VS2021中創建.NET 4.7.2的類庫工程,引用RFC SDK中lib文件夾的sapnwrfc.dll;然後通過nuget查找並安裝SapNwRfc包和Microsoft.AspNetCore.Http.Abstractions包(活字格服務端編程介面需要依賴這個包);最後引用活字格伺服器程式安裝目錄中的GrapeCity.Forguncy.ServerApi.dll。為了確保RFC SDK的正常運行,簡化部署操作,我們更建議將RFC SDK的文件直接拷貝到系統盤下的某個目錄,並且在系統的PATH變數中追加這個目錄下面的lib文件夾,以確保運行時可以準確找到所引用的sapnwrfc.dll。

(Nuget中的SapNwRfc包)

然後,我們需要根據SAP的文檔說明,創建RFC的傳入和傳出參數所對應的類。SAP為每一個NetWeaver介面準備一個Excel文件,記錄了方法名,傳入參數和傳出參數的類型和結構。我們只需要找到所需調用的那個介面對應的Excel文件,根據文檔要求創建入參和出參對應的class即可。需要注意的是,屬性的名稱、SapName標籤的值需要和文檔中的參數名嚴格保持一致。以創建供應商為例,我們需要創建傳入參數類:CreateVendorParameters和傳出參數類:createVendorParametersObj。

(NetWeaver中創建供應商的介面所對應的參數結構)

然後,我們在工程中創建WebAPI,一個繼承自ForguncyApi的類GetSAPInfo,然後創建POST請求的響應方法CallRFCFunction(方法名和類名組成了URL的Path部分)。在程式碼中,我們從請求中讀取連接字元串、需要使用的方法和參數,調用SapConnection類的對應方法進行處理,最後把結果序列化後返回給該WebAPI的調用者。和屬性名稱一樣,調用SapConnection時傳入的方法名也需要和文檔中的文字嚴格保持一致,如創建供應商的方法名為ZLIFNR_CREATE。

(RFC橋的WebAPI實現)

根據既往經驗,為了降低調用RFC橋的開發者的學習門檻,讓他們也可以參照SAP提供的文檔直接進行操作,我們推薦將所有用到的介面統合到一個WebAPI中,在程式碼中通過SAP的方法名進行switch分支。

如需使用這些示例程式碼,可以從碼雲獲取://gitee.com/GrapeCity/lowcode_extention_demo_hana_via_sap_rfc

步驟二:在活字格中調用RFC橋

使用活字格服務端編程介面開發出的WebAPI與純程式碼開發出的WebAPI的使用方法完全一致。在使用活字格開發業務系統的時候,都可以通過”發送HTTP請求”命令來調用。

首先,開發和測試的環境下,我們通常會連接不同的SAP資料庫,所以,我們需要將連接NetWeaver所需的必要資訊存儲到資料庫中,隨程式一同發布,而不是寫死在程式碼或全局配置文件中。

(存儲在資料庫中的NetWeaver連接資訊)

在需要操作SAP的數據時,我們需要先使用”設置變數命令”,從資料庫中讀取當前環境所使用的HANA資料庫的參數,拼接成連接字元串;然後使用”發送HTTP請求命令”,通過調用RFC橋的WebAPI。

按照步驟一中RFC橋的實現,其URL地址是customapi/{類名}/{方法名}。我們還需要在HEAD中設置連接字元串和方法名(來自SAP提供的Excel文檔,如ZLIFNR_CREATE)。

(配置NetWeaver的連接字元串和方法名)

而具體的請求參數則需要在BODY中進行設置,將二開系統的業務數據作為參數傳遞給HANA,執行對應的數據操作,最終達到系統集成的效果,如這裡舉例的創建供應商檔案。

(配置傳遞給NetWeaver的業務數據)

下面是我們幫助客戶進行技術評估時,快速構建的活字格與SAP NetWeaver集成的Demo。如需使用這個工程,可以從碼雲獲取://gitee.com/GrapeCity/lowcode_demo_hana_via_sap_rfc

(使用活字格集成SAP HANA的效果)

討論

為了幫助開發者做二次開發,SAP和用友等主流廠商大多提供了直連資料庫和封裝業務介面兩種開發模式。在純程式碼開發方式下,兩種模式最大的差異在於前者性能上限更高,後者可靠性更強。

進入低程式碼時代後,封裝業務介面的模式體現出了更強的競爭優勢。比如今天的例子中,在RFC橋的幫助下,業務應用的開發者能通過可視化配置,輕鬆實現對HANA資料庫的讀取和寫入操作,而這一切,無需掌握任何一門程式語言。專業程式設計師藉助平台的編程介面擴展平台能力,非專業程式設計師通過使用這些能力,可視化完成系統開發,這種”混合模式”正在成為低程式碼開發的主流。