SAP与AI大模型-SE38工作台集成AI
第一步,在SE38中右键添加选项,经过DEBUG发现,会经过类CL_GUI_SOURCEEDIT,在方法DISPATCH中会调用方法DISPLAY_CONTEXT_MENU,进入到该方法发现实际是,调用了类CL_CTXMNU_MGR中的方法CREATE_PROXY。第二步,如果新加的选项没有注册事件的话,调用会报错,定位到报错点的代码函数USERCOM_INPUT,会在MESSAGE s598 W
·
在SAP中的开发工作台很难使用像其他开发工具一样的插件来集成AI编程助手,那SAP中怎么在SE38中集成AI大模型呢?
程序实现:
第一步,在SE38中右键添加选项,经过DEBUG发现,会经过类CL_GUI_SOURCEEDIT,在方法DISPATCH中会调用方法DISPLAY_CONTEXT_MENU,进入到该方法发现实际是,调用了类CL_CTXMNU_MGR中的方法CREATE_PROXY。
在这里显示隐式增强,创建一个新的隐式增强点,输入代码即可。
IF sy-tcode = 'SE38'.
DATA:lo_sub_menu TYPE REF TO cl_ctmenu.
"创建子菜单对象
CREATE OBJECT lo_sub_menu.
"在子菜单中添加菜单项
call method lo_sub_menu->add_function
EXPORTING
fcode = 'ZAI1'
TEXT = '通义千问'.
"添加分隔符
call METHOD menu->ADD_SEPARATOR.
"将子菜单添加到主菜单
call METHOD menu->ADD_SUBMENU
EXPORTING
menu = lo_sub_menu
text = 'AI生成'.
ENDIF.
第二步,如果新加的选项没有注册事件的话,调用会报错,定位到报错点的代码函数USERCOM_INPUT,会在MESSAGE s598 WITH rcode。检验功能码不存在。发现该函数中不能创建隐式增强,只能修改源代码增加功能事件,在报错前添加代码即可。
**********************************************************************ADD BY AI 调用
IF fcode(3) = 'ZAI'.
TRY .
IF edit-app_disp = 'A'.
IF fcode = 'ZAI1'.
DATA:text_from_line TYPE i,
text_end_line TYPE i.
DATA:line_text TYPE string,
lv_input TYPE string,
lv_output TYPE string.
DATA:ls_output LIKE zint_ai_post_out,
lt_output LIKE TABLE OF zint_ai_post_out.
DATA:abapref TYPE REF TO cl_gui_abapedit.
"获取光标选中的请求信息
IF c_editor IS INSTANCE OF cl_gui_abapedit.
abapref ?= c_editor.
ENDIF.
abapref->get_selection_pos( IMPORTING from_line = text_from_line to_line = text_end_line ).
LOOP AT content INTO DATA(ls_contect) FROM text_from_line TO text_end_line.
line_text = ls_contect.
IF line_text(1) = '*'.
SHIFT line_text BY 1 PLACES LEFT.
ENDIF.
lv_input = lv_input && line_text.
ENDLOOP.
"调用本地大模型
CALL FUNCTION 'ZINT_AI_POST'
EXPORTING
abap_flg = 'Y'
input_str = lv_input
IMPORTING
output_str = lv_output
TABLES
lt_output = lt_output.
"将输入信息返回到界面上
LOOP AT lt_output INTO ls_output.
APPEND ls_output-text TO content.
ENDLOOP.
CALL FUNCTION 'EXECUTE_FUNCTION'
EXPORTING
c_editor = c_editor
fcode_i = 'SETT'
TABLES
content = content.
content_c[] = content[].
ELSEIF fcode = 'ZAI2'.
MESSAGE '该AI暂未接入' TYPE 'S'.
ENDIF.
ELSE.
MESSAGE '当前编辑器为只读状态' TYPE 'S'.
ENDIF.
CATCH cx_root INTO DATA(lx_root).
DATA(lv_message) = lx_root->get_text( ).
MESSAGE lv_message && '调用AI失败' TYPE 'S'.
ENDTRY.
ELSE.
**********************************************************************ADD BY AI 调用
rcode = fcode.
CLEAR fcode.
MESSAGE s598 WITH rcode.
EXIT.
ENDIF.

效果展示:


返回的代码质量取决于所集成的AI大模型,还需要自己调试。
更多推荐


所有评论(0)