部署DeepSeek模型,进群交流最in玩法!
立即加群
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >SAP GUI编辑器集成AI实操

SAP GUI编辑器集成AI实操

原创
作者头像
用户19990909
修改2025-03-13 22:28:36
修改2025-03-13 22:28:36
410
举报

本文档是关于SAP集成AI的一个实操,集成百炼大模型平台-通义千问,在云平台上注册获取密钥即可调用接口。

本文包括问询平台,F1工具栏集成AI,GUI编辑器集成AI等实操。

1. 问询平台

实现效果

(效果图1)
(效果图1)

实现步骤

  1. 创建输入文本框,设置参数调整文本框大小,在PBO中输出
  2. 创建输出文本框,设置参数调整文本框大小,在PBO中输出
  3. 在SCREEN中创建添加按钮,并在调用的方法中增加查询按钮调用接口方法,通过SET_TEXTSTREAM将接口返回内容写入输出文本框
100屏幕
100屏幕

实现代码

100屏幕逻辑流

代码语言:ABAP
复制
PROCESS BEFORE OUTPUT.
**********************************************************************
* 屏幕显示前
* 设置工具栏,标题
**********************************************************************

MODULE pbo.

 PROCESS AFTER INPUT.
**********************************************************************
* 命令相应
**********************************************************************
** 各屏幕实现

MODULE pai.

**********************************************************************
* Exit 命令相应/
**********************************************************************
**  各屏幕实现
*  MODULE user_exit_9000 AT EXIT-COMMAND.

问询程序实现

代码语言:ABAP
复制
*&---------------------------------------------------------------------*
*& Report ZTEXT_DEMO
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ztext_demo.


DATA: ok_code TYPE sy-ucomm.
DATA: lv_input  TYPE string,
       lv_output TYPE string.

PARAMETERS: p_input1 TYPE string NO-DISPLAY,
             p_input2 TYPE string NO-DISPLAY.

CLASS lcl_hlp DEFINITION.
   PUBLIC SECTION.
     TYPES: BEGIN OF t_source,
              line TYPE char255,
            END OF t_source.
     TYPES: tt_source TYPE STANDARD TABLE OF t_source WITH DEFAULT KEY.

     DATA:
       results       TYPE string,
       source_editor TYPE REF TO cl_gui_textedit,
       dest_editor   TYPE REF TO cl_gui_textedit,
       abap_editor   TYPE REF TO cl_gui_abapedit.
     METHODS: create_source_editor.
     METHODS: create_dest_editor.
     METHODS: f_query.
     METHODS: pai IMPORTING VALUE(i_okcode) TYPE sy-ucomm.

ENDCLASS.

START-OF-SELECTION.
   DATA(hlp) = NEW lcl_hlp( ).

   CALL SCREEN 0100.

*&---------------------------------------------------------------------*
*& Module PBO OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE pbo OUTPUT.
   SET PF-STATUS 'STATUS_0100'.
   SET TITLEBAR 'TITLE' WITH 'AI问询平台'.
   hlp->create_source_editor( ).
   hlp->create_dest_editor( ).
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  PAI  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE pai INPUT.
   hlp->pai( ok_code ).
ENDMODULE.

CLASS lcl_hlp IMPLEMENTATION.

   METHOD create_source_editor.

     IF source_editor IS INITIAL.
       source_editor = NEW #( parent =  NEW cl_gui_docking_container( side = cl_gui_docking_container=>dock_at_top
       no_autodef_progid_dynnr = abap_true
       extension = 150 ) ) .
     ENDIF.

*将输入信息返回倒界面上
     IF p_input1 IS NOT INITIAL.
       CALL METHOD source_editor->set_textstream
         EXPORTING
           text   = p_input1
         EXCEPTIONS
           OTHERS = 1.
     ENDIF.

   ENDMETHOD.

   METHOD create_dest_editor.

     IF dest_editor IS INITIAL.
       dest_editor = NEW #( parent =  NEW cl_gui_docking_container( side = cl_gui_docking_container=>dock_at_bottom
       no_autodef_progid_dynnr = abap_true
       extension = 320 ) ) .
     ENDIF.
     "隐藏输出文本框菜单栏
     CALL METHOD dest_editor->set_toolbar_mode
       EXPORTING
         toolbar_mode           = 0
       EXCEPTIONS
         error_cntl_call_method = 1
         invalid_parameter      = 2
         OTHERS                 = 3.
     IF sy-subrc <> 0.
*     Implement suitable error handling here
     ENDIF.

*将输入信息返回倒界面上
     IF p_input2 IS NOT INITIAL.
       CALL METHOD dest_editor->set_textstream
         EXPORTING
           text   = p_input2
         EXCEPTIONS
           OTHERS = 1.
     ENDIF.


   ENDMETHOD.

   METHOD f_query.


     DATA: source TYPE soli_tab.

     source_editor->get_text_as_stream(
     IMPORTING
       text                   =  source
     EXCEPTIONS
       error_cntl_call_method = 1
       OTHERS                 = 3
       ).
     IF sy-subrc EQ 0.

       IF source IS INITIAL.
         MESSAGE s001(00) WITH '请输入查询信息' DISPLAY LIKE 'E' ##MG_MISSING ##NO_TEXT.
         RETURN.
       ENDIF.

       lv_input = cl_bcs_convert=>txt_to_string( it_soli = source ).
*调用阿里AI接口
       CALL FUNCTION 'ZINT_AI_POST'
         EXPORTING
           pi_input  = lv_input
         IMPORTING
           pe_output = lv_output.
*将接口返回信息返回倒界面上
       CALL METHOD dest_editor->set_textstream
         EXPORTING
           text   = lv_output
         EXCEPTIONS
           OTHERS = 1.
     ENDIF.
   ENDMETHOD.

   METHOD pai.
     i_okcode = sy-ucomm.
     CLEAR sy-ucomm.
     CASE i_okcode.
       WHEN 'BACK' .
         LEAVE TO SCREEN 0. "返回上一个屏幕

       WHEN 'CANCEL'.
         LEAVE TO SCREEN 0.

       WHEN 'EXIT'.
         LEAVE PROGRAM. "返回程序

       WHEN 'BUT1'.
         f_query( ).
     ENDCASE.
     CLEAR: i_okcode.
   ENDMETHOD.
ENDCLASS.

*GUI Texts
*----------------------------------------------------------
* TITLE --> AI问询平台
* TITLE --> AI问询平台

2. 通用AI接口

创建AI接口函数

函数入参
函数入参
函数出参
函数出参
出参-表
出参-表

接口中需要添加AI平台的授权密钥,和正常接口调用是一致的

代码语言:ABAP
复制
 CALL METHOD LC_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD
    EXPORTING
      NAME  = 'Authorization'
      VALUE = 'sk-c8***********************'.

详细代码

代码语言:ABAP
复制
FUNCTION ZINT_AI_POST.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(PI_INPUT) TYPE  STRING OPTIONAL
*"     VALUE(PI_FLAG) TYPE  CHAR1 OPTIONAL
*"  EXPORTING
*"     VALUE(PE_OUTPUT) TYPE  STRING
*"  TABLES
*"      PT_OUTPUT STRUCTURE  ZAIS1001
*"----------------------------------------------------------------------

   DATA: LV_LEN           TYPE I, "发送报文长度
         LV_URL           TYPE STRING, "接口地址
         LC_HTTP_CLIENT   TYPE REF TO IF_HTTP_CLIENT, "http客户端
         LV_AUTHORIZATION TYPE STRING,
         LV_CODE          TYPE I, "HTTP 返回状态
         LV_REASON        TYPE STRING. " HTTP 状态描述

   DATA: L_SYSUBRC    TYPE I,
         L_ERROR_TEXT TYPE STRING.

   DATA: LV_TOKEN    TYPE STRING.
   DATA: L_JSON_DATA TYPE STRING,
         L_MSG       TYPE STRING,
         LV_AUTH     TYPE STRING.
   DATA: I_REQUEST  TYPE STRING,
         E_RESPONSE TYPE STRING.
   CLEAR: LV_URL,I_REQUEST.
   "输入结构
   DATA: BEGIN OF LS_INPUT_MES,
     ROLE    TYPE STRING,
     CONTENT TYPE STRING,
   END OF LS_INPUT_MES.
   DATA: BEGIN OF LS_INPUT,
     MODEL    TYPE STRING,
     MESSAGES LIKE TABLE OF LS_INPUT_MES,
   END OF LS_INPUT.
   DATA: LS_REQ LIKE LS_INPUT_MES.

   "输出结构
   DATA: BEGIN OF T_MESSAGE3,
     ROLE    TYPE STRING,
     CONTENT TYPE STRING,
   END OF T_MESSAGE3.
   DATA: BEGIN OF T_CHOICES2,
     MESSAGE LIKE T_MESSAGE3,
   END OF T_CHOICES2.
   DATA: BEGIN OF LS_OUTPUT,
     CHOICES LIKE TABLE OF T_CHOICES2,
   END OF LS_OUTPUT.

   CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      TEXT    = '正在通过AI获取数据......'.

   LS_INPUT-MODEL = 'qwen-plus'.
   LS_REQ-ROLE = 'user'.
   LS_REQ-CONTENT = PI_INPUT.
   APPEND LS_REQ TO LS_INPUT-MESSAGES.
   I_REQUEST = /UI2/CL_JSON=>SERIALIZE( DATA          = LS_INPUT
         PRETTY_NAME  = 'L' ).

   LV_URL = 'https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions'.

*****创建http服务
   CALL METHOD CL_HTTP_CLIENT=>CREATE_BY_URL
   EXPORTING
     URL                = LV_URL
   IMPORTING
     CLIENT             = LC_HTTP_CLIENT
   EXCEPTIONS
     ARGUMENT_NOT_FOUND = 1
     PLUGIN_NOT_ACTIVE  = 2
     INTERNAL_ERROR     = 3
     OTHERS             = 4.
   IF SY-SUBRC <> 0.
     MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
     INTO L_MSG
     WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
     EXIT.
   ENDIF.

   CALL METHOD LC_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD
   EXPORTING
     NAME  = 'Content-Type'
     VALUE = 'application/JSON; charset=utf-8'.

   LV_AUTH = 'sk-**************************'.
   CALL METHOD LC_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD
   EXPORTING
     NAME  = 'Authorization'
     VALUE = LV_AUTH.

   CALL METHOD LC_HTTP_CLIENT->REQUEST->SET_METHOD( 'POST' ).

   "发送前数据准备
   LV_LEN = STRLEN( I_REQUEST ).
   CALL METHOD LC_HTTP_CLIENT->REQUEST->SET_CDATA
   EXPORTING
   DATA   = I_REQUEST
         OFFSET = 0
         LENGTH = LV_LEN.

*****发送http服务
   CALL METHOD LC_HTTP_CLIENT->SEND
   EXCEPTIONS
     HTTP_COMMUNICATION_FAILURE = 1
     HTTP_INVALID_STATE         = 2
     HTTP_PROCESSING_FAILED     = 3
     HTTP_INVALID_TIMEOUT       = 4
     OTHERS                     = 5.
   IF SY-SUBRC <> 0.
     MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
     INTO L_MSG
     WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
     EXIT.
   ENDIF.

*****接收返回数据
   CALL METHOD LC_HTTP_CLIENT->RECEIVE
   EXCEPTIONS
     HTTP_COMMUNICATION_FAILURE = 1
     HTTP_INVALID_STATE         = 2
     HTTP_PROCESSING_FAILED     = 3
     OTHERS                     = 4.
   CLEAR E_RESPONSE.
   E_RESPONSE = LC_HTTP_CLIENT->RESPONSE->GET_CDATA( ).

   "获取返回的状态信息
   CLEAR:  LV_CODE, LV_REASON.
   CALL METHOD LC_HTTP_CLIENT->RESPONSE->GET_STATUS
   IMPORTING
     CODE   = LV_CODE
     REASON = LV_REASON.

   /UI2/CL_JSON=>DESERIALIZE( EXPORTING JSON = E_RESPONSE
   CHANGING  DATA = LS_OUTPUT ).

   IF LV_CODE = '200'.
     SORT LS_OUTPUT-CHOICES[].
     READ TABLE LS_OUTPUT-CHOICES[] INDEX 1 INTO DATA(LS_OUT) .
     IF SY-SUBRC = 0.
       PE_OUTPUT = LS_OUT-MESSAGE-CONTENT.
     ENDIF.
   ELSE.
     PE_OUTPUT = '调用失败!'.
   ENDIF.
   IF PI_FLAG = 'Y'.
     DATA: ES_OUTPUT LIKE ZAIS1001.
     DATA: LT_TABLE  TYPE TABLE OF STRING.
     DATA: LV_ROW_NUMBER       TYPE I,
           LV_ROW_NUMBER_BEGIN TYPE I,
           LV_ROW_NUMBER_END   TYPE I.
     SPLIT PE_OUTPUT AT CL_ABAP_CHAR_UTILITIES=>NEWLINE INTO TABLE LT_TABLE.
     LV_ROW_NUMBER_BEGIN = 0.
     LV_ROW_NUMBER_END = 0.
     LOOP AT LT_TABLE INTO DATA(LS_TABLE).
       LV_ROW_NUMBER = SY-TABIX.
       IF LS_TABLE CS 'report' OR LS_TABLE CS 'REPORT'.
         LV_ROW_NUMBER_BEGIN  = LV_ROW_NUMBER.
         EXIT.
       ENDIF.
     ENDLOOP.
     LV_ROW_NUMBER_BEGIN = LV_ROW_NUMBER_BEGIN + 1.
     LOOP AT LT_TABLE INTO LS_TABLE FROM LV_ROW_NUMBER_BEGIN.
       ES_OUTPUT-TEXT  = LS_TABLE.
       APPEND ES_OUTPUT TO PT_OUTPUT.
     ENDLOOP.
   ENDIF.
   "关闭接口
   CALL METHOD LC_HTTP_CLIENT->CLOSE.
ENDFUNCTION.

3. 集成F1帮助工具栏

当用户遇到系统报错,经常会拿报错信息(包括对消息类,消息号和消息内容)在网上搜索原因和解决方案,那将AI集成到F1工具栏实现一键查询,是个不错的选择。

实现效果

实现效果
实现效果

获取到的结果

结果
结果

实现步骤

  1. 以下是添加F1工具栏按钮方式
  2. 通过SM30维护表EPSS_TBC1,维护按钮。
表维护1
表维护1
  • 工具栏按钮文本维护,通过SM30维护表EPSS_TBC1T,维护ZH同时DE语言也必须维护否则报错。
表维护2
表维护2
  • 工具栏方法/应用程序类别,通过SM30维护表EPSS_TBC2
表维护3
表维护3
详细信息
详细信息
  • 可以复制CL_EPSS_CUSTOMIZING_SERVICE类别到 ZCL_EPSS_AI_SERVICE,然后进行调整 SE24复制类CL_EPSS_CUSTOMIZING_SERVICE到ZCL_EPSS_AI_SERVICE
ZCL_EPSS_AI_SERVICE
ZCL_EPSS_AI_SERVICE
  • 在SET_BUTTON_STATE方法中添加按钮方法
添加按钮
添加按钮
代码语言:ABAP
复制
METHOD SET_BUTTON_STATE .

   DATA:  L_APPL         TYPE EPSSAPPL,
          L_EPSS_TOOLBAR TYPE REF TO CL_EPSS_TOOLBAR,
          L_INFODOC      TYPE EPSSDOC,
          L_ENABLED      type c.

* Get Toolbar handle
   CALL METHOD  EPSS->GIVE_APPLICATIONS
      EXPORTING
             APPLID = 'TOOLBAR'
      IMPORTING
             CONTROL = L_APPL-REF.
*
   L_EPSS_TOOLBAR ?= L_APPL-REF.
*
   CALL METHOD  EPSS->GIVE_APPLICATIONS
     EXPORTING
            APPLID = 'EPSSHTML'
     IMPORTING
            CONTROL = L_APPL-REF.

*  CHECK SY-SUBRC = 0.
*
*  CALL METHOD L_APPL-REF->('GIVE_ACTUAL_DOCUMENT_INFO')
*       IMPORTING
*        INFODOC = L_INFODOC.
*
*  CALL FUNCTION 'HELP_CUST_CHECK'
*       EXPORTING
*            HELP_INFOS = L_INFODOC-HELP_INFO
*       IMPORTING
*            ENABLED    = L_ENABLED.

   CALL METHOD L_EPSS_TOOLBAR->('SET_BUTTON_STATE')
        EXPORTING
             ENABLED  = 'X'    "L_ENABLED
             CHECKED  = SPACE
             FCODE    = 'ZAI'.
*
ENDMETHOD.
  • 在HANDLE_EVENT方法中调用接口,这里需要获取F1弹框中的消息号等内容,用来作为AI查询问题的内容,对消息内容处理后拼接为AI可以读懂的语言。调用接口后将输入信息和返回信息写入问询平台展示,代码样例如下图。
HANDLE_EVENT方法
HANDLE_EVENT方法
代码语言:ABAP
复制
METHOD handle_event .
*
   DATA: w_appl    TYPE epssappl,
         l_infodoc TYPE epssdoc,
         l_object  TYPE dokil-object.

   DATA: ztcode    TYPE syst_tcode.
   DATA: zmsg      TYPE text300.
   DATA: zmsgtype  TYPE epssmode.
   DATA: lv_query  TYPE string.
   DATA: lv_answer TYPE string.
*
   CALL METHOD epss->give_applications
     EXPORTING
       applid  = 'EPSSHTML'
     IMPORTING
       control = w_appl-ref.
*
   IF sy-subrc EQ 0.

     CALL METHOD w_appl-ref->('GIVE_ACTUAL_DOCUMENT_INFO')
       IMPORTING
         infodoc = l_infodoc.
   ENDIF.

*  CALL FUNCTION 'HELP_CUST_SHOW'
*       EXPORTING
*            HELP_INFOS = L_INFODOC-HELP_INFO.

   IF l_infodoc-help_info-messageid IS NOT INITIAL AND l_infodoc-help_info-messagenr IS NOT INITIAL.

     CALL FUNCTION 'DOCU_OBJECT_NAME_CONCATENATE'
       EXPORTING
         docu_id  = 'NA'
         element  = l_infodoc-help_info-messageid
         addition = l_infodoc-help_info-messagenr
       IMPORTING
         object   = l_object.

     zmsg = l_infodoc-help_info-message.  "<(>输入物料类型(>)
     zmsg = shift_right( val = zmsg sub = |<)>| ).
     zmsg = shift_left( val = zmsg sub = |<(>| ).
     zmsgtype = l_infodoc-msgty.
     ztcode   = sy-tcode.
*    LS_SOURCE_CODE-PROCGRAM_NAME

   ENDIF.
   lv_query = |我是一名SAP顾问,当我在运行事务码{ ztcode }的时候遇到报错,消息类型是:{ zmsgtype },消息号是{ l_object },消息内容是:{ zmsg },请告诉我是什么原因导致的并给出解决方案。|.

*调用阿里AI接口

   CALL FUNCTION 'ZINT_AI_POST'
     EXPORTING
       pi_input  = lv_query
     IMPORTING
       pe_output = lv_answer.

   SUBMIT Z40535_DEMO WITH P_INPUT1 = lv_query WITH P_INPUT2 = lv_answer AND RETURN.

ENDMETHOD.

4. 集成SE38编辑器

  • 在报表中输入需求,通过右键AI生成报表,自动生成的代码可供参考,现阶段对于报表模板和简单的报表有些帮助,质量取决于AI平台能力。
  • 查询内容为鼠标选中的内容,可以多行,第一列的*可有可无。
  • 编辑器集成AI平台开发过程主要分为2步。

实现效果

实现效果1
实现效果1
实现效果2
实现效果2

AI生成结果

代码语言:ABAP
复制
*&---------------------------------------------------------------------*
*& Report ZTEXT_SE38
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT Z40535_SE38.

*用ABAP写一个简单的物料查询报表,输入参数是物料号
*输出ALV字段位物料号,创建日期,基本计量单位

TABLES: mara, makt.

* 定义内部表和工作区
DATA: gt_materials TYPE TABLE OF mara,
       gs_material   TYPE mara,
       gt_makt       TYPE TABLE OF makt,
       gs_makt       TYPE makt,
       gt_final      TYPE TABLE OF zmaterial_list,
       gs_final      TYPE zmaterial_list.

* 定义字段符号
FIELD-SYMBOLS: <fs_final> TYPE zmaterial_list.

* 定义自定义结构类型 (在DD04T中定义)
TYPES: BEGIN OF ty_material_list,
   matnr TYPE mara-matnr,
   ernam TYPE mara-ernam,
   crdat TYPE mara-crdat,
   meins TYPE makt-meins,
END OF ty_material_list.

* 定义参数:物料号
PARAMETERS: p_matnr TYPE mara-matnr OBLIGATORY.

* 选择物料主数据 (MARA)
SELECT * FROM mara INTO CORRESPONDING FIELDS OF TABLE @gt_materials
WHERE matnr = @p_matnr.

* 检查是否有数据
IF sy-subrc = 0.
   LOOP AT gt_materials INTO gs_material.
     " 获取物料描述 (MAKT)
     SELECT SINGLE * FROM makt INTO CORRESPONDING FIELDS OF gs_makt
     WHERE matnr = gs_material-matnr AND spras = sy-langu.

     IF sy-subrc = 0.
       " 填充最终输出表
       CLEAR gs_final.
       gs_final-matnr = gs_material-matnr.
       gs_final-crdat = gs_material-crdat.
       gs_final-meins = gs_makt-meins.
       APPEND gs_final TO gt_final.
     ENDIF.
   ENDLOOP.
ENDIF.

* 如果没有找到物料,则提示错误信息
IF sy-subrc <> 0.
   MESSAGE 'No material found with the given Material Number' TYPE 'E'.
ELSE.
*  * 显示 ALV 报表
   PERFORM display_alv USING gt_final.
ENDIF.

*&---------------------------------------------------------------------*
*&      Form  DISPLAY_ALV
*&---------------------------------------------------------------------*
FORM display_alv USING et_materials TYPE TABLE OF zmaterial_list.

   DATA: lt_fieldcat TYPE lvc_t_fcat,
         ls_fieldcat TYPE lvc_s_fcat.

*  * 创建字段目录
   PERFORM build_fieldcatalog CHANGING lt_fieldcat.

*  * 调用 ALV 函数模块
   CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   EXPORTING
     i_callback_program = sy-repid
     it_fieldcat        = lt_fieldcat[]
   TABLES
     t_outtab           = et_materials
   EXCEPTIONS
     program_error      = 1
     OTHERS             = 2.

   IF sy-subrc <> 0.
     MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
     WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
   ENDIF.

ENDFORM.                    " DISPLAY_ALV

*&---------------------------------------------------------------------*
*&      Form  BUILD_FIELDCATALOG
*&---------------------------------------------------------------------*
FORM build_fieldcatalog CHANGING ct_fieldcat TYPE lvc_t_fcat.

   DATA: ls_fieldcat TYPE lvc_s_fcat.

*  * 物料号
   ls_fieldcat-fieldname = 'MATNR'.
   ls_fieldcat-seltext_l = 'Material Number'.
   APPEND ls_fieldcat TO ct_fieldcat.

*  * 创建日期
   CLEAR ls_fieldcat.
   ls_fieldcat-fieldname = 'CRDAT'.
   ls_fieldcat-seltext_l = 'Creation Date'.
   APPEND ls_fieldcat TO ct_fieldcat.

*  * 计量单位
   CLEAR ls_fieldcat.
   ls_fieldcat-fieldname = 'MEINS'.
   ls_fieldcat-seltext_l = 'Base Unit of Measure'.
   APPEND ls_fieldcat TO ct_fieldcat.

ENDFORM.                    " BUILD_FIELDCATALOG

*### 注意事项:
*1. **自定义结构类型**:确保你已经在数据字典(SE11)中定义了`ZMATERIAL_LIST`结构类型,包含`MATNR`, `CRDAT`, 和`MEINS`字段。
*2. **语言支持**:此示例假设使用当前用户的语言设置(`sy-langu`)。如果你需要支持多语言,请根据需要调整。
*3. **异常处理**:添加适当的异常处理以确保程序的健壮性。
*
*这个程序将允许用户输入一个物料号,并显示与该物料号相关的物料号、创建日期和基本计量单位。如果找不到匹配的物料,则会显示一条错误消息。

实现步骤

  • 编辑器按钮添加,开发思路是DEBUG,看都走过哪些方法和类,是否有增强点,在类CL_CTXMNU_MGR的方法CREATE_PROXY中发现可以做隐式增强,添加鼠标右击菜单,限制SE38显示,定义方法名称ZAI1,ZAI2(CODE为4位,如果超长后面实施方法时读取不到)
按钮添加
按钮添加

增强代码

代码语言:ABAP
复制
*$*$-Start: (1)---------------------------------------------------------------------------------$*$*
ENHANCEMENT 1  ZBC_ADD_AI.    "active version
    PERFORM add_menu IN PROGRAM zabap_sedi_core_prog IF FOUND USING menu.

    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 lo_sub_menu->add_function
       EXPORTING
         fcode = 'ZAI2'
         text  = 'DeepSeek'.
     CALL METHOD lo_sub_menu->add_function
       EXPORTING
         fcode = 'ZAI3'
         text  = 'ChatGPT'.
     "添加分隔符
     CALL METHOD MENU->add_separator.
     "将子菜单添加到主菜单
     CALL METHOD menu->add_submenu
       EXPORTING
         menu = lo_sub_menu
         text = 'AI生成'.
    ENDIF.
ENDENHANCEMENT.
  • 实施按钮方法的过程没有找到增强点,所以通过修改源码的方式找到合适的点。 思路是在第一步完成后,如果ZAI方法未实施,会报不支持功能码的错误,F1点击消息来源查看报错位置,定位到报错位置是函数:USERCOM_INPUT,其他按钮比如右键注释等更改屏幕内容操作也会走该函数,所以在这个位置添加按钮逻辑。
具体实现1
具体实现1
具体实现2
具体实现2
  • 开发代码逻辑,其中需要注意两点
  • 发现编辑器的内容是以内表方式存在CONTENT[]和CONTECT_C[]中,需要在接口中将STRING类型的AI接口返回信息根据换行转换为内表存储方式,然后再LOOP写入CONTENT中
  • 需要调用
代码语言:ABAP
复制
CALLFUNCTION 'EXECUTE_FUNCTION'
                  EXPORTING
                    c_editor = c_editor
                    fcode_i  = 'SETT'
                  TABLES
                    content  = content.

该方法会将后台文本更新到SE38编辑器中显示。

当然这里还添加了一些校验只有可编辑转台可以点代码生成(通过edit-app_disp = 'A'.来判断,DEBUG发现)。

此外还有获取鼠标选中的行文本起始行和结尾行,为读取CONTENT[]拼接后作为AI接口输入请求。可以通过ZINT_AI_POST_OUT->get_selection_pos来获取鼠标选中起始行与结尾行。

ELSE. -> ENDIF. 之间

代码语言:ABAP
复制
*{   INSERT         S4HK907560                                        2
           IF fcode(3) = 'ZAI'.
             TRY.
               IF edit-app_disp = 'A'.
                 IF fcode = 'ZAI1'.
                   DATA: text_from_line TYPE i.
                   DATA: text_end_line  TYPE i.
                   DATA: line_text      TYPE string.
                   DATA: lv_input       TYPE string.
                   DATA: lv_output      TYPE string.
                   DATA: ls_output      LIKE zais1001.
                   DATA: lt_output      LIKE TABLE OF zais1001.
                   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.
                   "调用阿里AI接口
                   CALL FUNCTION 'ZINT_AI_POST'
                    EXPORTING
                      PI_INPUT   = lv_input
                      PI_FLAG    = 'Y'
                    IMPORTING
                      PE_OUTPUT  = lv_output
                     TABLES
                       PT_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.
                 ELSE.
                   MESSAGE '该AI暂未接入' TYPE 'S' DISPLAY LIKE 'W'.
                 ENDIF.
               ELSE.
                 MESSAGE '当前编辑器为只读状态' TYPE 'S' DISPLAY LIKE 'W'.
               ENDIF.
             CATCH CX_ROOT.
               MESSAGE '调用AI失败' TYPE 'S' DISPLAY LIKE 'E'.
             ENDTRY.
*}   INSERT
           rcode = fcode.
           CLEAR fcode.
           MESSAGE s598 WITH rcode.
           EXIT.
*{   INSERT         S4HK907560                                        1
           ENDIF.
*}   INSERT

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 问询平台
    • 实现效果
    • 实现步骤
    • 实现代码
  • 2. 通用AI接口
  • 3. 集成F1帮助工具栏
    • 实现效果
    • 实现步骤
  • 4. 集成SE38编辑器
    • 实现效果
    • 实现步骤
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档