在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大模型,还需要自己调试。

 

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐