:AMDP語法實例與TaoToken配置骨架)
1. AMDP 開發(fā)環(huán)境搭建與 AI 輔助工具接入SAP AMDPABAP Managed Database Procedures是 ABAP 層管理 HANA 數據庫存儲過程的一套機制允許開發(fā)者在 ADTABAP Development Tools里用 SQLScript 編寫數據庫過程由 ABAP 類統(tǒng)一管理生命周期。它適合誰適合已經在做 SAP HANA 項目、需要在數據庫層直接跑應用邏輯的 ABAP 開發(fā)者尤其是那些發(fā)現 CDS View 表達力不夠、又不想脫離 ABAP 傳輸體系去單獨維護 HANA 存儲過程的人。我試過在純 SAP GUI 里翻 AMDP 源碼只能只讀瀏覽改不了。真正寫代碼必須用 ADTEclipse 插件。而 ADT 本身沒有 AI 補全寫 SQLScript 時經常要來回查函數名、查$ABAP.type()的寫法。所以這篇除了講 AMDP 語法實例還會給出一套本地 AI 輔助開發(fā)工具的配置骨架——用統(tǒng)一的 Key/API 通道把代碼補全接進你的編輯器讓寫 AMDP 時少翻文檔。核心檢索詞先明確AMDP 語法實例、AMDP 數據庫存儲過程、SAP HANA SQLScript。下面從環(huán)境準備開始一步步給出可復制的配置和可運行的 AMDP 代碼。1.1 前置條件清單在動手之前確認這幾項SAP NetWeaver 7.40 SP08 以上底層是 HANA 數據庫HDB。安裝好 ADT版本建議 3.20 以上能連到你的 ABAP 項目。有一個可傳輸的開發(fā)包Package比如ZAMDP_DEMO。本地裝了 VS Code 或 Cursor 之類的編輯器用來接 AI 補全。AMDP 類只能在 ADT 里開發(fā)SAP GUI 里用SE24打開只能看不能編輯。這一點先記住后面排障會用到。1.2 為什么要在本地接 AI 輔助寫 AMDP 的痛點很集中SQLScript 的函數名和 ABAP 不一樣DECLARE的類型引用要用$ABAP.type( ... )這種字符串寫法游標循環(huán)的語法也和普通 ABAP 不同。每次寫都要查效率低。把 AI 補全接進編輯器后你可以在寫DECLARE CURSOR或record_count()時直接得到提示減少上下文切換。接入方式是用一個統(tǒng)一的 API 通道把模型能力接到編輯器的補全插件里。下面給出配置骨架。2. TaoToken 前置準備與統(tǒng)一 Key 通道TaoToken 在這里的角色是一個統(tǒng)一的模型 API 通道你申請一個 Key就能在本地編輯器、命令行工具里調用模型做代碼補全和問答不用為每個工具單獨配一套憑證。官網入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 基址是 https://taotoken.net/api 。2.1 申請 Key 與確認模型 ID登錄后進控制臺創(chuàng)建 API Key地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 。創(chuàng)建完復制那串 Key只顯示一次。模型 ID 在文檔里能查到常用的編碼模型直接填對應 ID 即可文檔地址 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。三個要素記牢后面所有配置都圍繞它們Base URLhttps://taotoken.net/apiAPI Key你創(chuàng)建的那串Model ID文檔里對應的模型標識2.2 驗證 Key 是否可用在正式寫配置前先用一條命令確認 Key 通。打開終端curl https://taotoken.net/api/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer 你的KEY \ -d { model: 你的模型ID, messages: [{role: user, content: 用一句話說明AMDP是什么}] }返回里如果choices數組有內容說明通道正常。如果返回 401先檢查 Key 有沒有復制全、有沒有多余空格。這一步過了再往下配編輯器能省很多排查時間。3. 可復制配置骨架settings.json 與 config.toml這一節(jié)給兩份可直接復制的配置。VS Code 系含 Cursor用settings.json命令行編碼工具用config.toml。兩份都遵循同一套 Base URL Key Model ID 三件套。3.1 VS Code / Cursor 的 settings.json如果你用的是支持 OpenAI 兼容接口的補全插件在用戶設置里加這段。路徑CtrlShiftP→ 輸入Open Settings (JSON)→ 在打開的settings.json里追加{ aiAssistant.provider: openai-compatible, aiAssistant.baseUrl: https://taotoken.net/api, aiAssistant.apiKey: 你的KEY, aiAssistant.model: 你的模型ID, aiAssistant.completion.enable: true, aiAssistant.completion.languageOverrides: { abap: true, sql: true } }注意baseUrl結尾不要帶/v1插件一般會自己拼。languageOverrides里把abap和sql打開寫 AMDP 時補全才會觸發(fā)。3.2 命令行工具的 config.toml如果你用命令行編碼助手配置放在~/.config/你的工具/config.tomlWindows 在%USERPROFILE%\.config\下[provider] name taotoken base_url https://taotoken.net/api api_key 你的KEY model 你的模型ID [completion] enabled true max_tokens 2048 temperature 0.2 [context] include_extensions [abap, sql, cds]temperature設低一點代碼補全要的是穩(wěn)定不是發(fā)散。include_extensions把.abap、.sql、.cds都納入上下文寫 AMDP 時模型能看到你項目里的相關文件。3.3 配置生效驗證改完配置重啟編輯器。新建一個.abap文件敲DECLARE CURSOR看有沒有補全彈出。如果沒有先看插件日志里請求有沒有發(fā)出去再對照第 5 節(jié)的報錯排查。4. AMDP 語法實例與調用驗證配置就緒后進入正題。AMDP 的本質是一個實現了標記接口if_amdp_marker_hdb的 ABAP 類方法上用特定關鍵字修飾方法體里寫 SQLScript。4.1 定義 AMDP 類骨架在 ADT 里新建 ABAP 類ZCL_AMDP_DEMO定義部分CLASS zcl_amdp_demo DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. INTERFACES if_amdp_marker_hdb. CLASS-METHODS get_flydatas FOR TABLE FUNCTION ztest_tablef. PROTECTED SECTION. PRIVATE SECTION. ENDCLASS.if_amdp_marker_hdb是標記接口實現它才表明這是 AMDP 類。FOR TABLE FUNCTION說明這個方法對應一個 CDS 表函數。4.2 實現方法體變量聲明與游標循環(huán)實現部分方法用BY DATABASE FUNCTION FOR HDB LANGUAGE SQLSCRIPT修飾CLASS zcl_amdp_demo IMPLEMENTATION. METHOD get_flydatas BY DATABASE FUNCTION FOR HDB LANGUAGE SQLSCRIPT OPTIONS READ-ONLY USING spfli. DECLARE lv_index INT; DECLARE lt_return TABLE ( MANDT $ABAP.TYPE( MANDT ), CARRID $ABAP.TYPE( s_carr_id ), CONNID $ABAP.TYPE( s_conn_id ) ); DECLARE CURSOR lt_spfli FOR ( SELECT * FROM spfli ); lv_index : 1; FOR ls_spfli AS lt_spfli DO lt_return.mandt [:lv_index] : :ls_spfli.mandt; lt_return.carrid[:lv_index] : :ls_spfli.carrid; lt_return.connid[:lv_index] : :ls_spfli.connid; lv_index : :lv_index 1; END FOR; RETURN SELECT mandt, carrid, connid FROM :lt_return; ENDMETHOD. ENDCLASS.幾個關鍵點變量用DECLARE類型引用用$ABAP.type( ... )字符串形式賦值用:游標用DECLARE CURSOR ... FOR ( SELECT ... )循環(huán)用FOR ... DO ... END FOR內表按角標賦值lt_return.mandt[:lv_index]。4.3 條件判斷與常用函數條件判斷和普通 ABAP 類似IF lv_index 1 THEN -- 處理第一行 ELSEIF lv_index 2 THEN -- 處理第二行 ELSE -- 其他 END IF;常用函數記幾個record_count( :lt_table )算行數MOD( :lv_line, 2 )取余CURRENT_DATE/CURRENT_TIME取當前日期時間DAYS_BETWEEN( d1, d2 )算天數差HOUR()/MINUTE()/SECOND()從時間取值。4.4 定義 CDS 表函數并調用新建 CDS 表函數ZTEST_TABLEFEndUserText.label: TEST TABLE FUNCTION define table function ZTEST_TABLEF returns { key mandt : abap.clnt; key carrid : s_carr_id; key connid : s_conn_id; } implemented by method zcl_amdp_demoget_flydatas;然后在 ADT 里用Data Preview打開這個表函數或者寫一段 ABAP 調用SELECT * FROM ztest_tablef INTO TABLE DATA(lt_result). cl_demo_outputdisplay( lt_result ).跑通后能看到SPFLI表里的航班數據被游標處理后返回。這一步成功說明 AMDP 從定義到調用整條鏈路通了。5. 常見報錯排查寫 AMDP 和配 AI 通道時報錯集中在幾個地方。下面按真實報錯對照排查。5.1 401 Unauthorized請求返回 401說明 Key 沒被接受。檢查三處Key 有沒有復制完整、Authorization頭是不是Bearer 你的KEY格式、Base URL 有沒有寫錯。如果 Key 里帶了換行或空格也會 401。重新在控制臺復制一次粘貼時注意別帶首尾空白。5.2 local proxy failed編輯器插件報local proxy failed通常是本地代理端口沒起來或者baseUrl填成了帶/v1的地址導致拼接重復。把baseUrl改回https://taotoken.net/api重啟插件。如果還不行看插件日志里實際請求的 URL 是什么多半是路徑拼錯了。5.3 reading choices 報錯返回體解析時報reading choices相關錯誤一般是響應結構和你用的插件預期不一致。先確認請求里model字段填的是文檔里存在的模型 ID不是隨便寫的名字。模型 ID 錯了返回體里沒有choices插件解析就崩。對照文檔核對模型 ID。5.4 OAuth 相關報錯如果插件走的是 OAuth 流程而不是 API Key報 OAuth 錯誤說明認證方式選錯了。在插件設置里把認證方式切成 API Key填 Base URL Key Model ID 三件套。OAuth 那套不適用于這種直連 API 的場景。5.5 AMDP 側常見錯誤METHOD ... is not an AMDP method檢查類有沒有實現if_amdp_marker_hdb方法有沒有加BY DATABASE ...修飾。Table SPFLI is not usedUSING后面沒聲明用到的表。AMDP 方法里訪問的表必須在USING里列出。Syntax error in SQLScript多半是$ABAP.type()的引號寫錯或者變量引用忘了加冒號:lv_var。SQLScript 里引用 ABAP 變量要加冒號。6. 繼續(xù)深入的方向AMDP 的BY DATABASE PROCEDURE和BY DATABASE FUNCTION兩種模式用途不同前者標記為存儲過程可以寫更復雜的邏輯后者標記為表函數主要給 CDS 消費。方法嵌套調用時被調用的 AMDP 方法也要在USING里聲明方法名大寫。如果你要把這套 AI 輔助長期用在日常編碼里可以考慮 Coding Plan地址 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 適合需要持續(xù)補全和 Agent 輔助的場景。只想先驗證模型對話效果用模型對話入口 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 試幾句。Key 管理和接入文檔分別在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 和 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。最后給個實操建議AMDP 調試時先在 ADT 里用Data Preview單獨跑表函數確認 SQLScript 邏輯對了再接到 ABAP 程序里調用。這樣出錯時能快速定位是 SQLScript 的問題還是 ABAP 調用的問題。寫游標循環(huán)時lv_index的初始化和自增別漏漏了會死循環(huán)或者只處理一行。