1、界面展示
前面的一篇文章我们分享了SAP对接Deepseek的核心的代码,我们根据昨天分享的代码,写成一个对话框的展示方式更加的直观
在SAP中进行Deepseek的回答。
2、代码分享
*&---------------------------------------------------------------------*
*& Report ZDEEP
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZDEEP.
CONSTANTS: C_LINE_LENGTH TYPE I VALUE 150.
TYPES: BEGIN OF ST_TEXT,
LINE TYPE C LENGTH C_LINE_LENGTH,
END OF ST_TEXT.
TYPES: TT_TEXT TYPE STANDARD TABLE OF ST_TEXT .
CONSTANTS :
C_100 TYPE RS37A-FNUM VALUE '100',
C_200 TYPE RS37A-FNUM VALUE '200'.
CONSTANTS :
C_SQL_EDITOR TYPE C LENGTH 10 VALUE 'SQL_EDITOR' .
CONSTANTS :
C_MSG01 TYPE STRING VALUE
'Error while instantiating ABAP proxy of TextEdit control',
C_MSG02 TYPE STRING VALUE
'Error in flush',
C_MSG03 TYPE STRING VALUE
'Error while retrieving text form TextEdit control',
C_MSG04 TYPE STRING VALUE
'Error while sending text into TextEdit control',
C_MSG05 TYPE STRING VALUE
'Error while destroying TextEdit control'.
DATA :
IT_TEXT TYPE TT_TEXT,
GS_TEXT TYPE ST_TEXT,
G_EDITOR TYPE REF TO CL_GUI_TEXTEDIT,
G_EDITOR1 TYPE REF TO CL_GUI_TEXTEDIT,
G_GRID TYPE REF TO CL_GUI_ALV_GRID,
G_SPLITTER TYPE REF TO CL_GUI_EASY_SPLITTER_CONTAINER,
G_SPLITTER1 TYPE REF TO CL_GUI_EASY_SPLITTER_CONTAINER,
G_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
"g_exception TYPE tt_exception,
G_UCOMM TYPE SY-UCOMM,
G_REPID TYPE SY-REPID,
G_FILE TYPE C LENGTH 50,
START-OF-SELECTION.
CALL SCREEN C_100.
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS 'SCREEN100'.
SET TITLEBAR 'TITLE100'.
ENDMODULE. " status_0100 OUTPUT
*&---------------------------------------------------------------------*
*& Module INITIAL_SCREEN OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE INITIAL_SCREEN OUTPUT.
* SET PF-STATUS 'xxxxxxxx'.
* SET TITLEBAR 'xxx'.
DATA : L_ORIENTATION TYPE I,
L_MODE TYPE I.
IF G_EDITOR IS NOT INITIAL.
IF IT_text IS NOT INITIAL.
CALL METHOD G_EDITOR->SET_TEXT_AS_R3TABLE
EXPORTING
TABLE = IT_text
EXCEPTIONS
OTHERS = 1.
ENDIF.
ENDIF.
CHECK G_EDITOR IS INITIAL.
G_REPID = SY-REPID.
PERFORM CREATE_CONTAINER_OBJECT USING G_CONTAINER
C_SQL_EDITOR.
L_ORIENTATION = 1 .
PERFORM CREATE_SPLITTER_OBJECT USING G_SPLITTER1
G_CONTAINER
L_ORIENTATION .
PERFORM CREATE_EDITOR_OBJECT USING G_EDITOR1
G_SPLITTER1->BOTTOM_RIGHT_CONTAINER .
L_ORIENTATION = 0 .
PERFORM CREATE_SPLITTER_OBJECT USING G_SPLITTER
G_SPLITTER1->TOP_LEFT_CONTAINER
L_ORIENTATION.
PERFORM CREATE_EDITOR_OBJECT USING G_EDITOR
G_SPLITTER->TOP_LEFT_CONTAINER .
PERFORM SET_COMMENT_MODE USING G_EDITOR .
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form create_container_object
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> G_CONTAINER
*& --> C_SQL_EDITOR
*&---------------------------------------------------------------------*
FORM CREATE_CONTAINER_OBJECT USING P_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER
P_SQL_EDITOR.
CREATE OBJECT P_CONTAINER
EXPORTING
CONTAINER_NAME = P_SQL_EDITOR
EXCEPTIONS
CNTL_ERROR = 1
CNTL_SYSTEM_ERROR = 2
CREATE_ERROR = 3
LIFETIME_ERROR = 4
LIFETIME_DYNPRO_DYNPRO_LINK = 5.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form create_editor_object
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> G_EDITOR
*& --> G_CONTAINER
*&---------------------------------------------------------------------*
FORM CREATE_EDITOR_OBJECT USING P_EDITOR TYPE REF TO CL_GUI_TEXTEDIT
P_CONTAINER TYPE REF TO CL_GUI_CONTAINER.
CREATE OBJECT P_EDITOR
EXPORTING
PARENT = P_CONTAINER
WORDWRAP_MODE = CL_GUI_TEXTEDIT=>WORDWRAP_AT_FIXED_POSITION
WORDWRAP_POSITION = C_LINE_LENGTH
WORDWRAP_TO_LINEBREAK_MODE = CL_GUI_TEXTEDIT=>TRUE
EXCEPTIONS
OTHERS = 1.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form set_comment_mode
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> G_EDITOR
FORM SET_COMMENT_MODE USING P_EDITOR TYPE REF TO CL_GUI_TEXTEDIT .
CALL METHOD P_EDITOR->SET_COMMENTS_STRING.
CALL METHOD P_EDITOR->SET_HIGHLIGHT_COMMENTS_MODE.
ENDFORM .
*&---------------------------------------------------------------------*
*& Form create_splitter_object
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> G_SPLITTER1
*& --> G_CONTAINER
*& --> L_ORIENTATION
*&---------------------------------------------------------------------*
FORM CREATE_SPLITTER_OBJECT USING P_SPLITTER TYPE REF TO CL_GUI_EASY_SPLITTER_CONTAINER
P_CONTAINER
P_ORIENTATION TYPE I .
DATA : L_POSITION TYPE I VALUE 100 .
CREATE OBJECT P_SPLITTER
EXPORTING
PARENT = P_CONTAINER
ORIENTATION = P_ORIENTATION.
PERFORM SET_SPLITTER_POSTION USING P_SPLITTER
L_POSITION .
ENDFORM .
FORM SET_SPLITTER_POSTION USING P_SPLITTER TYPE REF TO CL_GUI_EASY_SPLITTER_CONTAINER
P_POSTION TYPE I .
*& Set Splitter Postion
CALL METHOD P_SPLITTER->SET_SASH_POSITION
EXPORTING
SASH_POSITION = P_POSTION.
ENDFORM .
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
DATA : L_START TYPE I,
L_END TYPE I,
IT_TEMP TYPE TT_TEXT,
L_NUMBER TYPE I.
*& Initial Serval Global Variant
CLEAR : L_NUMBER .
GET RUN TIME FIELD L_START.
CASE G_UCOMM.
WHEN 'EXIT' OR 'BACK' OR 'BREAK'.
PERFORM EXIT_PROGRAM.
WHEN 'EXEC'.
PERFORM SAVE_TEXT_TO_TABLE USING G_EDITOR
CHANGING IT_TEXT.
PERFORM execute_POST USING IT_TEXT
CHANGING L_NUMBER.
"CALL SCREEN C_100.
WHEN 'CONF'.
" CALL SCREEN c_200 STARTING AT 30 5 .
ENDCASE.
*& Set Runtime
GET RUN TIME FIELD L_END.
" PERFORM set_runtime_and_lines USING l_start
" l_end
" l_number.
CLEAR : G_UCOMM .
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form exit_program
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM EXIT_PROGRAM .
*& Free All Memory Located By Objects
PERFORM DESTROY_ALV_OBJECT CHANGING G_GRID .
PERFORM DESTROY_EDITOR_OBJECT CHANGING G_EDITOR .
PERFORM DESTROY_EDITOR_OBJECT CHANGING G_EDITOR1 .
PERFORM DESTROY_SPLITTER_OBJECT CHANGING G_SPLITTER .
PERFORM DESTROY_SPLITTER_OBJECT CHANGING G_SPLITTER1 .
PERFORM DESTROY_CONTAINER_OBJECT CHANGING G_CONTAINER .
*& Finally Flush
CALL METHOD CL_GUI_CFW=>FLUSH
EXCEPTIONS
OTHERS = 1.
LEAVE PROGRAM.
ENDFORM.
DEFINE DESTROY_CONTROL_OBJECT.
CHECK &1 IS NOT INITIAL .
CALL METHOD &1->FREE
EXCEPTIONS
OTHERS = 1.
FREE : &1 .
END-OF-DEFINITION.
FORM DESTROY_ALV_OBJECT CHANGING P_GRID TYPE REF TO CL_GUI_ALV_GRID.
DESTROY_CONTROL_OBJECT P_GRID .
ENDFORM .
FORM DESTROY_EDITOR_OBJECT CHANGING P_EDITOR TYPE REF TO CL_GUI_TEXTEDIT.
DESTROY_CONTROL_OBJECT P_EDITOR .
ENDFORM .
FORM DESTROY_SPLITTER_OBJECT CHANGING P_SPLITTER TYPE REF TO CL_GUI_EASY_SPLITTER_CONTAINER.
DESTROY_CONTROL_OBJECT P_SPLITTER .
ENDFORM .
FORM DESTROY_CONTAINER_OBJECT CHANGING P_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER.
DESTROY_CONTROL_OBJECT P_CONTAINER .
ENDFORM .
*&---------------------------------------------------------------------*
*& Form save_text_to_table
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> G_EDITOR
*& <-- IT_TEXT
*&---------------------------------------------------------------------*
FORM SAVE_TEXT_TO_TABLE USING P_EDITOR TYPE REF TO CL_GUI_TEXTEDIT
CHANGING P_TEXT TYPE TT_TEXT .
DATA : L_FLAG TYPE I .
PERFORM GET_SELECTION_INDEX USING G_EDITOR L_FLAG.
IF L_FLAG = 0 .
CALL METHOD P_EDITOR->GET_TEXT_AS_R3TABLE
IMPORTING
TABLE = P_TEXT
EXCEPTIONS
OTHERS = 1.
ELSE .
CALL METHOD P_EDITOR->GET_SELECTED_TEXT_AS_R3TABLE
IMPORTING
TABLE = P_TEXT
EXCEPTIONS
OTHERS = 1.
ENDIF .
IF SY-SUBRC NE 0.
PERFORM SHOW_MESSAGE USING C_MSG03 .
ENDIF.
CALL METHOD CL_GUI_CFW=>FLUSH
EXCEPTIONS
OTHERS = 1.
IF SY-SUBRC NE 0.
PERFORM SHOW_MESSAGE USING C_MSG02 .
ENDIF.
ENDFORM.
FORM GET_SELECTION_INDEX USING P_EDITOR TYPE REF TO CL_GUI_TEXTEDIT
P_RETURN TYPE I .
DATA : L_FROM TYPE I,
L_TO TYPE I.
CALL METHOD P_EDITOR->GET_SELECTION_INDEXES
IMPORTING
FROM_INDEX = L_FROM
TO_INDEX = L_TO
EXCEPTIONS
ERROR_CNTL_CALL_METHOD = 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.
P_RETURN = L_TO - L_FROM .
ENDFORM .
*&---------------------------------------------------------------------*
*& Form show_message
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> C_MSG03
*&---------------------------------------------------------------------*
FORM SHOW_MESSAGE USING P_MESSAGE TYPE STRING .
CALL FUNCTION 'POPUP_TO_INFORM'
EXPORTING
TITEL = G_REPID
TXT2 = SPACE
TXT1 = P_MESSAGE.
ENDFORM. "Show_Message
*&---------------------------------------------------------------------*
*& Form execute_POST
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> IT_TEXT
*& <-- L_NUMBER
*&---------------------------------------------------------------------*
FORM execute_POST USING PT_TEXT
CHANGING P_L_NUMBER.
DATA:
LV_JSON_REQUEST TYPE STRING .
DATA LV_CONT TYPE STRING.
DATA LV_CONT1 TYPE STRING.
LOOP AT PT_TEXT INTO GS_TEXT .
LV_CONT = LV_CONT && GS_TEXT-LINE.
ENDLOOP.
LV_CONT1 = '你是一个专家'.
* 构建JSON请求体
LV_JSON_REQUEST = '{"model":"deepseek-chat",'
&& '"messages":['
&& ' {"role":"system","content":"' && LV_CONT1 && '"},'
&& ' {"role":"user","content":"' && LV_CONT && '"}'
&& '],'
&& '"stream":false}'.
DATA GV_OK TYPE C LENGTH 6.
DATA LV_STR TYPE STRING.
DATA LV_RET TYPE STRING.
PERFORM FRM_TEST USING LV_JSON_REQUEST CHANGING LV_RET.
ENDFORM.
FORM FRM_TEST USING UV_JSON_REQUEST CHANGING CV_RET.
DATA: LV_STATUS TYPE I,
LV_ERROR_OCCURRED TYPE FLAG,
LV_ERROR_MSG TYPE STRING,
LV_RESPONSE_BODY TYPE STRING.
CLEAR CV_RET.
DO 1 TIMES.
PERFORM SEND_JSON USING
'https://api.deepseek.com/chat/completions' "
UV_JSON_REQUEST " JSON报文
CHANGING LV_STATUS
LV_RESPONSE_BODY
LV_ERROR_OCCURRED
LV_ERROR_MSG.
ENDDO.
TYPES: BEGIN OF ST_CON,
ROLE TYPE STRING,
CONTENT TYPE STRING,
END OF ST_CON.
TYPES: BEGIN OF ST_RET,
INDEX TYPE STRING,
MESSAGE TYPE ST_CON,
LOGPROBS TYPE STRING,
END OF ST_RET.
DATA: LS_RET TYPE ST_RET.
DATA: LT_RET TYPE TABLE OF ST_RET.
TYPES: BEGIN OF ST_RESULT,
ID TYPE STRING,
objeCT TYPE STRING,
MODEL TYPE STRING,
CHOICES LIKE LT_RET,
END OF ST_RESULT.
DATA: LS_RESULT TYPE ST_RESULT.
"DATA: LT_choices TYPE TABLE OF ST_RET.
/UI2/CL_JSON=>DESERIALIZE( EXPORTING JSON = LV_RESPONSE_BODY
PRETTY_NAME = /UI2/CL_JSON=>PRETTY_MODE-CAMEL_CASE CHANGING DATA = LS_RESULT ).
DATA(LT_choices) = LS_RESULT-CHOICES.
DATA: LT_TEXT TYPE TT_TEXT.
GS_TEXT-LINE = '===================================================='.
APPEND GS_TEXT TO IT_TEXT.
GS_TEXT-LINE = '以下为DeepSeek返回结果:'.
APPEND GS_TEXT TO IT_TEXT.
GS_TEXT-LINE = '===================================================='.
APPEND GS_TEXT TO IT_TEXT.
LT_RET = LT_choices.
DATA: LV_content TYPE STRING.
LOOP AT LT_RET INTO LS_RET.
CLEAR: LT_TEXT.
LV_content = LS_RET-MESSAGE-CONTENT.
CALL FUNCTION 'CONVERT_STRING_TO_TABLE'
EXPORTING
I_STRING = LV_content
I_TABLINE_LENGTH = 150
* I_UNICODE =
TABLES
ET_TABLE = LT_TEXT.
APPEND LINES OF LT_TEXT TO iT_TEXT.
ENDLOOP.
* Show result
FORMAT COLOR COL_HEADING.
* WRITE: / 'Response status:', LV_STATUS.
* WRITE: / '调用成功次数:', GV_OK.
* IF LV_ERROR_OCCURRED = 'X'.
* FORMAT COLOR COL_NEGATIVE.
* WRITE: / 'Error occurred:', LV_ERROR_MSG.
* ENDIF.
* FORMAT COLOR COL_NORMAL.
* WRITE: / 'Response:', LV_RESPONSE_BODY.
*
* IF LV_RESPONSE_BODY CS `"content":"`.
* PERFORM FRM_CUT USING LV_RESPONSE_BODY
* `"content":"`
* `"},"logprobs":`
* CHANGING CV_RET.
*
*
*
* ENDIF.
ENDFORM. "start
FORM SEND_JSON USING IV_URL TYPE STRING
IV_JSON_DATA TYPE STRING
CHANGING CV_STATUS TYPE I
CV_RESPONSE_BODY TYPE STRING
CV_ERROR_OCCURRED TYPE FLAG
CV_ERROR_MSG TYPE STRING.
STATICS: LO_CLIENT TYPE REF TO IF_HTTP_CLIENT.
CLEAR: CV_ERROR_MSG,
CV_STATUS,
CV_ERROR_OCCURRED,
CV_ERROR_MSG.
IF IV_URL IS INITIAL.
MESSAGE E349(SBDS) INTO CV_ERROR_MSG.
CV_ERROR_OCCURRED = 'X'.
RETURN.
ENDIF.
STATICS SV_BEGIN TYPE C LENGTH 1.
IF SV_BEGIN IS INITIAL.
CALL METHOD CL_HTTP_CLIENT=>CREATE_BY_URL
EXPORTING
URL = IV_URL
IMPORTING
CLIENT = LO_CLIENT
EXCEPTIONS
ARGUMENT_NOT_FOUND = 1
PLUGIN_NOT_ACTIVE = 2
INTERNAL_ERROR = 3
OTHERS = 4.
IF SY-SUBRC NE 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4
INTO CV_ERROR_MSG.
CV_ERROR_OCCURRED = 'X'.
RETURN.
ENDIF.
SV_BEGIN = 'X'.
LO_CLIENT->REQUEST->SET_CONTENT_TYPE( 'application/json' ).
LO_CLIENT->REQUEST->SET_METHOD( 'POST' ).
* 自定义参数
LO_CLIENT->REQUEST->SET_HEADER_FIELD( NAME = 'Authorization' VALUE = 'Bearer sk-68309d8815e2c9c5' ). "换算成自己的密钥吧。
ENDIF.
LO_CLIENT->REQUEST->SET_CDATA( IV_JSON_DATA ).
CALL METHOD LO_CLIENT->SEND
EXCEPTIONS
HTTP_COMMUNICATION_FAILURE = 1
HTTP_INVALID_STATE = 2
HTTP_PROCESSING_FAILED = 3
OTHERS = 4.
IF SY-SUBRC NE 0.
LO_CLIENT->GET_LAST_ERROR( IMPORTING MESSAGE = CV_ERROR_MSG ).
CV_ERROR_OCCURRED = 'X'.
RETURN.
ENDIF.
LO_CLIENT->RECEIVE( EXCEPTIONS OTHERS = 1 ).
IF SY-SUBRC NE 0.
LO_CLIENT->GET_LAST_ERROR( IMPORTING MESSAGE = CV_ERROR_MSG ).
CV_ERROR_OCCURRED = 'X'.
RETURN.
ENDIF.
CV_RESPONSE_BODY = LO_CLIENT->RESPONSE->GET_CDATA( ).
LO_CLIENT->RESPONSE->GET_STATUS( IMPORTING CODE = CV_STATUS ).
* CALL METHOD LO_CLIENT->CLOSE( )."如果多开需要关闭。
* GV_OK = GV_OK + 1.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CUT
*&---------------------------------------------------------------------*
*& 截取AB中间的保留到C。
*&---------------------------------------------------------------------*
FORM FRM_CUT USING UV_INPUT
P_A
P_B
CHANGING CV_RET.
DATA LV_TMP TYPE STRING.
SPLIT UV_INPUT AT P_A INTO LV_TMP CV_RET.
CLEAR LV_TMP.
SPLIT CV_RET AT P_B INTO CV_RET LV_TMP.
ENDFORM.
注意在如下图所示的地方需要替换成我们自己的KEY
3、操作步骤
- 1、创建程序—SE38
新建一个程序名:自定义即可,我们这里用ZDEEP1.点击创建
- 2、标题自定义即可,类型选择可执行程序,点击保存
- 3、直接将所有代码贴入程序中,然后点击激活按钮(需要注意维护好自己的KEY)
- 4、点击执行按钮
然后输入内容后点击执行即可。
通过本文,我们了解了 SAP 的[SAP接入Deepseek_界面展示代码分享]的基本概念和应用方法。希望这些信息能帮助您在实际工作中更好地使用 SAP 系统,提高工作效率和管理水平。
感谢阅读,希望本文对您有所帮助,并期待在未来的文章中继续探讨 SAP 的更多功能和应用。
更多SAP文章请点击
更多SAP文章更新,大家一起学习进步!
原创不易,如果本文对您有所帮助,请点赞!!!
文章中如有错误。敬请指正!
搜索公众号:SAP资料文库
微信号:SPRO_PP
时间:2025-03-06