還在寫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(https://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分支。

如需使用這些示例代碼,可以從碼雲獲取:https://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。如需使用這個工程,可以從碼雲獲取:https://gitee.com/GrapeCity/lowcode_demo_hana_via_sap_rfc

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

討論

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章