ABAP学习(18):ABAP弹窗function

时间:2024-03-06 20:25:16

ABAP弹出框

        SAP中可以使用function,显示弹窗。根据不同弹窗类型,SAP对弹出框进行了分组,例如:SPO1,SPO2等。SAP系统中有一些这些分组的函数的样例函数,可以通过 RS+分组+* 进行搜索,例如SPO4的弹窗样例,使用RSSPO4*进行搜索。所有的function源码都在Package:SZP下。

1.SP01类型

        包含一些提示信息,让用户确认的弹窗。

示例1:POPUP_TO_CONFIRM函数使用

"显示弹窗
FORM spo1_pop.
  "接收选择结果
  DATA:ANSWER(1) TYPE C.
  "传入表,没啥用
  DATA:parm LIKE TABLE OF SPAR WITH HEADER LINE.
  "使用popup_to_confirm,一个确认弹窗
  CALL FUNCTION \'POPUP_TO_CONFIRM\'
    EXPORTING
      "弹窗标题
      TITLEBAR                    = \'请确认\'
      "额外文本,可以使用se61维护Dialog Text,
      "示例中使用:TEXT1_ZUM_POPUP_TO_CONFIRM
      DIAGNOSE_OBJECT             = \'\'
      "弹窗显示确认问题文本
      TEXT_QUESTION               = \'这是弹窗显示确认问题\'
      "最左边按钮文本,默认yes
      TEXT_BUTTON_1               = \'yes\'
      "最左边按钮图标:Table:Icon,Tcode:Icon都可以查看图标,传入icon名
      ICON_BUTTON_1               = \'ICON_CHECKED\'
      "中间按钮文本,默认no
      TEXT_BUTTON_2               = \'No\'
      "中间按钮图标
      ICON_BUTTON_2               = \'ICON_INCOMPLETE\'
      "初始选中按钮
      DEFAULT_BUTTON              = \'1\'
      "是否显示cancel按钮
      DISPLAY_CANCEL_BUTTON       = \'X\'
      "显示一个info按钮,帮助信息,但是se61找不到对应值
      USERDEFINED_F1_HELP         = \'TEST_TEXT_ZUR_SPO1\'
      "弹窗开始列
      START_COLUMN                = 25
      "弹窗开始行
      START_ROW                   = 6
      "弹窗文本左边图标
      POPUP_TYPE                  = \'ICON_MESSAGE_INFORMATION\'
      "未知功能
*      IV_QUICKINFO_BUTTON_1       = \'\'
*      IV_QUICKINFO_BUTTON_2       = \'\'
    IMPORTING
      "选择值1:yes;2:no;A:cancel;
      ANSWER                      = ANSWER
    TABLES
      "传入table,源码没使用?
      PARAMETER                   = parm
*   EXCEPTIONS
*     TEXT_NOT_FOUND              = 1
*     OTHERS                      = 2
            .
  IF SY-SUBRC <> 0.
    MESSAGE s000 WITH \'error\'.
  ELSE.
    MESSAGE s000 WITH answer.
  ENDIF.
ENDFORM.
View Code

示例2:POPUP_TO_CONFIRM_STEP使用

FORM spo1_pop1.
  "提示do not use
  "接收选择结果
  DATA:ANSWER(1) TYPE C.
  CALL FUNCTION \'POPUP_TO_CONFIRM_STEP\'
    EXPORTING
      DEFAULTOPTION        = \'Y\'
      "显示两行文本
      TEXTLINE1            = \'textline 1\'
      TEXTLINE2            = \'textline 2\'
      "弹窗标题
      TITEL                = \'popup title\'
      START_COLUMN         = 25
      START_ROW            = 6
      "是否显示cancel按钮
      CANCEL_DISPLAY       = \'\'
    IMPORTING
      "返回值J:yes;N:no;A:cancel
      ANSWER               = ANSWER.
  IF SY-SUBRC <> 0.
    MESSAGE s000 WITH \'error\'.
  ELSE.
    MESSAGE s000 WITH answer.
  ENDIF.
ENDFORM.
View Code

示例3:POPUP_TO_CONFIRM_WITH_VALUE函数使用

FORM spo1_pop2.
  "提示do not use
  "接收选择结果
  DATA:ANSWER(1) TYPE C.
  CALL FUNCTION \'POPUP_TO_CONFIRM_WITH_VALUE\'
    EXPORTING
      "默认按钮
      DEFAULTOPTION        = \'Y\'
      "显示文本
      OBJECTVALUE          = \'100\'
      "文本后缀
      TEXT_AFTER           = \'%\'
      "文本前缀
      TEXT_BEFORE          = \'百分比:\'
      TITEL                = \'title\'
      START_COLUMN         = 25
      START_ROW            = 6
      CANCEL_DISPLAY       = \'X\'
    IMPORTING
      ANSWER               = ANSWER.
  IF SY-SUBRC <> 0.
    MESSAGE s000 WITH \'error\'.
  ELSE.
    MESSAGE s000 WITH answer.
  ENDIF.
View Code

类似还有函数:POPUP_TO_CONFIRM_WITH_MESSAGE,POPUP_TO_CONFIRM_LOSS_OF_DATA,但是都不推荐使用,这种提示信息的直接使用POPUP_TO_CONFIRM就够了。

 

2.SPO2类型

    和SPO1类似,显示一些信息供用户确认。

示例1:POPUP_TO_DECIDE函数使用

"显示三行文本弹窗
FORM spo2_pop1.
  "do not use
  "接收选择结果
  DATA:ANSWER(1) TYPE C.
  "显示弹窗
  CALL FUNCTION \'POPUP_TO_DECIDE\'
    EXPORTING
      "默认按钮
      DEFAULTOPTION     = \'1\'
      "三行文本
      TEXTLINE1         = \'first line\'
      TEXTLINE2         = \'second line\'
      TEXTLINE3         = \'third line\'
      "按钮1,2的文本
      TEXT_OPTION1      = \'yes\'
      TEXT_OPTION2      = \'no\'
      "按钮1,2的图标
*     ICON_TEXT_OPTION1 = \' \'
*     ICON_TEXT_OPTION2 = \' \'
      "弹窗标题
      TITEL             = \'title\'
      "开始行列
      START_COLUMN      = 25
      START_ROW         = 6
      "是否显示cancel按钮
      CANCEL_DISPLAY    = \'X\'
    IMPORTING
      "选择返回1:按钮1;2:按钮2;A:cancel按钮
      ANSWER            = ANSWER.
  IF SY-SUBRC <> 0.
    MESSAGE s000 WITH \'error\'.
  ELSE.
    MESSAGE s000 WITH answer.
  ENDIF.
ENDFORM.
View Code

示例2:POPUP_TO_DECIDE_WITH_MESSAGE函数使用

FORM spo2_pop2.
  "do not use
  "接收选择结果
  DATA:ANSWER(1) TYPE C.
  "显示弹窗
  CALL FUNCTION \'POPUP_TO_DECIDE_WITH_MESSAGE\'
    EXPORTING
      "默认按钮
      DEFAULTOPTION           = \'1\'
      "diagno文本,必须有一个
      DIAGNOSETEXT1           = \'dia1\'
*      DIAGNOSETEXT2           = \'dia2\'
*      DIAGNOSETEXT3           = \'dia3\'
      "text文本行,至少有一个
      TEXTLINE1               = \'text1\'
*      TEXTLINE2               = \'text2\'
*      TEXTLINE3               = \'text3\'
      "按钮文本
      TEXT_OPTION1            = \'yes\'
      TEXT_OPTION2            = \'no\'
      "按钮图标
*       ICON_TEXT_OPTION1       =
*       ICON_TEXT_OPTION2       =
      "标题
      TITEL                   = \'title\'
      START_COLUMN            = 25
      START_ROW               = 6
      CANCEL_DISPLAY          = \'X\'
     IMPORTING
      ANSWER                  = answer.
  IF SY-SUBRC <> 0.
    MESSAGE s000 WITH \'error\'.
  ELSE.
    MESSAGE s000 WITH answer.
  ENDIF.
ENDFORM.
View Code

 

3.SPO4类型

        接收用户输入信息弹窗。

示例1:使用POPUP_GET_VALUES函数

使用table类型参数fields结构:

 

tabname:接收值所在数据库表名

fieldname:字段名

value:值,用户输入或预设

field_obl:是否必输栏位

fieldtext:栏位文本

"显示输入值弹窗
FORM spo4_pop.
  "接收值的字段
  DATA:fileds TYPE TABLE OF sval WITH HEADER LINE.
  DATA:retcode(1) TYPE C.

  "设置字段
  CLEAR fileds.
  fileds-tabname = \'SPFLI\'.
  fileds-fieldname = \'CARRID\'.
  fileds-value = \'02\'.
*  fileds-fieldtext = \'航班id\'.
  APPEND fileds.
  CLEAR fileds.
  fileds-tabname = \'SPFLI\'.
  fileds-fieldname = \'CONNID\'.
  fileds-field_obl =  \'X\'.
  APPEND fileds.

  CALL FUNCTION \'POPUP_GET_VALUES\'
    EXPORTING
      "是否值检查
      NO_VALUE_CHECK        = \'\'
      "标题
      POPUP_TITLE           = \'title\'
      "设置位置
      START_COLUMN          = \'5\'
      START_ROW             = \'5\'
    IMPORTING
      "点击cancel,返回A
      RETURNCODE            = retcode
    TABLES
      "接收值的字段内表
      FIELDS                =  fileds.
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
    MESSAGE s000 WITH retcode.
  ELSE.
    MESSAGE s000 WITH retcode.
    LOOP AT fileds.
      WRITE: / fileds-fieldname,fileds-value.
    ENDLOOP.
  ENDIF.
ENDFORM.
View Code

示例2:POPUP_GET_VALUES_DB_CHECKED函数,填写数据会验证是否在数据库中存在

FORM spo4_pop1.
  "接收值的字段
  DATA:fileds TYPE TABLE OF sval WITH HEADER LINE.
  DATA:retcode(1) TYPE C.
   "设置字段
  CLEAR fileds.
  fileds-tabname = \'SPFLI\'.
  fileds-fieldname = \'CARRID\'.
  APPEND fileds.
  CALL FUNCTION \'POPUP_GET_VALUES_DB_CHECKED\'
    EXPORTING
      "是否检查填写数据是否存在
      CHECK_EXISTENCE       = \'X\'
      "title
      POPUP_TITLE           = \'title\'
      "位置设置
      START_COLUMN          = \'5\'
      START_ROW             = \'5\'
    IMPORTING
      RETURNCODE            = retcode
    TABLES
      FIELDS                = fileds.
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
    MESSAGE s000 WITH retcode.
  ELSE.
    MESSAGE s000 WITH retcode.
    LOOP AT fileds.
      WRITE: / fileds-fieldname,fileds-value.
    ENDLOOP.
  ENDIF.
ENDFORM.
View Code

示例3:POPUP_GET_VALUES_USER_CHECKED函数,可以执行额外程序的子form程序,做栏位输入检查

FORM spo4_pop2.
  "接收值的字段
  DATA:fileds TYPE TABLE OF sval WITH HEADER LINE.
  DATA:retcode(1) TYPE C.
  "设置字段
  CLEAR fileds.
  fileds-tabname = \'SPFLI\'.
  fileds-fieldname = \'CARRID\'.
  APPEND fileds.
  "弹窗获取输入值执行额外form
  CALL FUNCTION \'POPUP_GET_VALUES_USER_CHECKED\'
    EXPORTING      "执行的form名
      FORMNAME                  = \'CHECK_EXIT\'
      POPUP_TITLE               = \'title\'
              "form所在program名
      PROGRAMNAME               = \'TEST_POPUP\'
              "开始行列
      START_COLUMN              = \'5\'
      START_ROW                 = \'5\'
          "???
      NO_CHECK_FOR_FIXED_VALUES = \'\'
    IMPORTING
      RETURNCODE                = retcode
    TABLES
      FIELDS                    = fileds.
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
    MESSAGE s000 WITH retcode.
  ELSE.
    MESSAGE s000 WITH retcode.
  ENDIF.
ENDFORM.

"执行用户自定义检查逻辑,当error有值,显示info弹窗
FORM check_exit TABLES fileds STRUCTURE sval
                  CHANGING error  STRUCTURE svale.
  LOOP AT fileds.
    "自定义检查是否数据库存在
    SELECT SINGLE * FROM SPFLI WHERE CARRID = fileds-value.
    IF sy-subrc <> 0.
      "数据库表
      ERROR-ERRORTAB   = \'SPFLI\'.
      "检查字段
      ERROR-ERRORFIELD = \'CARRID\'.
      "package:SZP下message classes中可以找到对应值
      ERROR-MSGTY      = \'I\'.
      ERROR-MSGID      = \'S4\'.
      ERROR-MSGNO      = \'510\'.
    ENDIF.
  ENDLOOP.
ENDFORM.
View Code

示例4:POPUP_GET_VALUES_USER_HELP函数,可以执行额外程序的子form程序,做栏位输入检查,自定义f1,f4帮助

FORM spo4_pop3.
  "接收值的字段
  DATA:fileds TYPE TABLE OF sval WITH HEADER LINE.
  DATA:retcode(1) TYPE C.
  "设置字段
  CLEAR fileds.
  fileds-tabname = \'SPFLI\'.
  fileds-fieldname = \'CARRID\'.
  APPEND fileds.
  CALL FUNCTION \'POPUP_GET_VALUES_USER_HELP\'
    EXPORTING
      "F1帮助from名
      F1_FORMNAME                     = \'F1_HELP\'
      "F1帮助form所在program
      F1_PROGRAMNAME                  = \'TEST_POPUP\'
      "F4帮助form名
      F4_FORMNAME                     = \'F4_HELP\'
      "F4帮助所在program
      F4_PROGRAMNAME                  = \'Z_TEST_POPUP\'
      "自定义检查form名
*     FORMNAME                        = \' \'
      POPUP_TITLE                     = \'title\'
      "自定义检查form所在program
*     PROGRAMNAME                     = \' \'
      "设置显示位置
*     START_COLUMN                    = \'5\'
*     START_ROW                       = \'5\'
*     NO_CHECK_FOR_FIXED_VALUES       = \' \'
    IMPORTING
      RETURNCODE                      = retcode
    TABLES
      FIELDS                          = fileds.
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
    MESSAGE s000 WITH retcode.
  ELSE.
    MESSAGE s000 WITH retcode.
  ENDIF.
ENDFORM.

FORM f1_help USING TABNAME FIELDNAME.
  MESSAGE s000 WITH TABNAME FIELDNAME \'no f1 help\'.
ENDFORM.

"F4帮助逻辑
FORM f4_help USING TABNAME FIELDNAME DISPLAY
             CHANGING  RETURNCODE VALUE.
  DATA: BEGIN OF F_TAB OCCURS 10.
          INCLUDE STRUCTURE HELP_VALUE.
  DATA: END OF F_TAB,
        BEGIN OF V_TAB OCCURS 200,
          VALUE(40) TYPE C,
        END OF V_TAB.

  "字段表
  F_TAB-TABNAME    = \'SPFLI\'.
  F_TAB-FIELDNAME  = \'CARRID\'.
  F_TAB-SELECTFLAG = \'X\'.
  APPEND F_TAB.
  "填充值
  SELECT * FROM SPFLI.
    V_TAB = SPFLI-CARRID.
    APPEND V_TAB.
  ENDSELECT.
  "显示获取到的值
  CALL FUNCTION \'HELP_VALUES_GET_WITH_TABLE\'
    EXPORTING
*     CUCOL                               = 0
*     CUROW                               = 0
     DISPLAY                             = DISPLAY
     FIELDNAME                           = FIELDNAME
     TABNAME                             = TABNAME
*     NO_MARKING_OF_CHECKVALUE            = \' \'
*     TITLE_IN_VALUES_LIST                = \' \'
*     TITEL                               = \' \'
*     SHOW_ALL_VALUES_AT_FIRST_TIME       = \' \'
*     NO_CONVERSION                       = \' \'
    IMPORTING
      SELECT_VALUE                        = VALUE
    TABLES
      FIELDS                              = F_TAB
      VALUETAB                            = V_TAB.
ENDFORM.
View Code

示例5:POPUP_GET_VALUES_USER_BUTTONS函数,可以执行额外程序的子form程序,自定义f1,f4帮助,多两个功能按钮执行额外逻辑

FORM spo4_pop4.
  "接收值的字段
  DATA:fileds TYPE TABLE OF sval WITH HEADER LINE.
  DATA:retcode(1) TYPE C.
  DATA:ICON_OK_PUSH LIKE ICON-NAME VALUE ICON_OKAY.
  DATA:ICON_CREATE_PUSH LIKE ICON-NAME VALUE ICON_CREATE.
  DATA:ICON_SEARCH_PUSH LIKE ICON-NAME VALUE ICON_SEARCH.
  "设置字段
  CLEAR fileds.
  fileds-tabname = \'SPFLI\'.
  fileds-fieldname = \'CARRID\'.
  APPEND fileds.
  CALL FUNCTION \'POPUP_GET_VALUES_USER_BUTTONS\'
    EXPORTING
      "F1帮助from名,form所在program名
*     F1_FORMNAME                     = \' \'
*     F1_PROGRAMNAME                  = \' \'
      "F4帮助from名,form所在program名
*     F4_FORMNAME                     = \' \'
*     F4_PROGRAMNAME                  = \' \'
      "用户点击按钮响应form,form所在program名
      FORMNAME                        = \'USER_CODE\'
      PROGRAMNAME                     = \'Z_TEST_POPUP\'
      "title
      POPUP_TITLE                     = \'title\'
      "ok按钮文本,图标及提示
      OK_PUSHBUTTONTEXT               = \'ok\'
      ICON_OK_PUSH                    = ICON_OK_PUSH
      QUICKINFO_OK_PUSH               = \'ok\'
      "按钮1文本,图标及提示
      FIRST_PUSHBUTTON                = \'creat\'
      ICON_BUTTON_1                   = ICON_CREATE_PUSH
      QUICKINFO_BUTTON_1              = \'creat something\'
      "按钮2文本,图标及提示
      SECOND_PUSHBUTTON               = \'seach\'
      ICON_BUTTON_2                   = ICON_SEARCH_PUSH
      QUICKINFO_BUTTON_2              = \'search something\'
*     START_COLUMN                    = \'5\'
*     START_ROW                       = \'5\'
*     NO_CHECK_FOR_FIXED_VALUES       = \' \'
    IMPORTING
      RETURNCODE                      = retcode
    TABLES
      FIELDS                          = fileds
*   EXCEPTIONS
*     ERROR_IN_FIELDS                 = 1
*     OTHERS                          = 2
            .
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
    MESSAGE s000 WITH retcode.
  ELSE.
    MESSAGE s000 WITH retcode.
  ENDIF.
ENDFORM.

"响应用户选点击按钮
FORM USER_CODE TABLES   FIELDS STRUCTURE SVAL
               USING    CODE
               CHANGING ERROR  STRUCTURE SVALE SHOW_POPUP.
   CASE CODE.
    "点击ok按钮
    WHEN \'FURT\'.
      MESSAGE s000 WITH \'button ok\' code.
      "按钮响应后,是否弹窗继续显示,为空直接关闭,为X不不关闭
      SHOW_POPUP = \'\'.
    "点击button1
    WHEN \'COD1\'.
      MESSAGE s000 WITH \'button1\' code.
      SHOW_POPUP = \'X\'.
    "点击button2
    WHEN \'COD2\'.
      MESSAGE s000 WITH \'button2\' code.
      SHOW_POPUP = \'X\'.
  ENDCASE.
ENDFORM.
View Code

4.SPO5类型

示例1:POPUP_TO_DECIDE_LIST函数,显示弹窗包含一个选项表,供用户选择,单选或多选。

FORM spo5_pop.
  "选择列表
  DATA:   t_selist LIKE SPOPLI OCCURS 5 WITH HEADER LINE.
  DATA:   answer TYPE C.
  "选择标志
  t_selist-SELFLAG = \'X\'.
  "选项
  t_selist-VAROPTION = \'选项1\'.
  "INACTIVE字段控制是否不可选
*  t_selist-INACTIVE = \'X\'.
  APPEND t_selist.
  t_selist-SELFLAG = \'\'.
  t_selist-VAROPTION = \'选项2\'.
  APPEND t_selist.
  "显示一个选择列表
  CALL FUNCTION \'POPUP_TO_DECIDE_LIST\'
    EXPORTING
      "光标所在选项行
      CURSORLINE   = 1
      "单选按钮,多选框
      "MARK_FLAG不设置,MARK_MAX = 1单选
      "MARK_FLAG="X",MARK_MAX = 0 多选checkbox
*      MARK_FLAG    = \'X\'
      MARK_MAX     = 1
      "设置弹窗位置
*     START_COL    = 0
*     START_ROW    = 0
      TEXTLINE1    = \'text1\'
      TEXTLINE2    = \'text2\'
      TEXTLINE3    = \'text3\'
      "title
      TITEL        = \'title\'
      "仅显示
*      DISPLAY_ONLY = \'X\'
    IMPORTING
      ANSWER       = answer
    TABLES
      T_SPOPLI     = t_selist.
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
    MESSAGE s000 WITH answer.
  ELSE.
    MESSAGE s000 WITH answer.
  ENDIF.
ENDFORM.
View Code

5.SPO6类型

示例1:POPUP_DISPLAY_TEXT函数,显示se61创建文本

FORM spo6_pop.
  DATA: CANCELLED(1) TYPE C.
  "显示文本text,只能是se61创建text
  CALL FUNCTION \'POPUP_DISPLAY_TEXT\'
    EXPORTING
      "语言
*      LANGUAGE             = SY-LANGU
      "标题
      POPUP_TITLE          = \'title\'
      "位置
*     START_COLUMN         = 10
*     START_ROW            = 3
      "文本对象,se61,dialog text类型创建
      TEXT_OBJECT          = \'SPO_EXAMPLE_1\'
      "helpmodal
*     HELP_MODAL           = \'X\'
    IMPORTING
      CANCELLED            = CANCELLED.
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
    MESSAGE s000 WITH CANCELLED.
  ELSE.
    MESSAGE s000 WITH CANCELLED.
  ENDIF.

  "POPUP_DISPLAY_TEXT_WITH_PARAMS函数
  "text_objext = \'SPO_EXAMPLE_2\',可以在se61中找到,参数名规则:"&参数名&"
  "定义参数表,可以在文本中插入参数
  "DATA:params LIKE SPAR OCCURS 0 WITH HEADER LINE.
  "PARAM字段:参数名;VALUE字段:参数值

ENDFORM.
View Code

示例2:POPUP_DISPLAY_TEXT函数,显示se61创建文本,显示自定义按钮button

FORM spo6_pop1.
  DATA:params LIKE SPAR OCCURS 0 WITH HEADER LINE.
  DATA:USER_BUTTONS LIKE SMP_DYNTXT OCCURS 0 WITH HEADER LINE.
  DATA:answer LIKE RSNEWLENG-FCODE.
  params-PARAM = \'V1\'.
  params-VALUE = \'参数1\'.
  APPEND params.
  "设置自定义按钮
  USER_BUTTONS-TEXT      = \'tips1\'.
  USER_BUTTONS-ICON_ID   = ICON_CLOSE.
  USER_BUTTONS-ICON_TEXT = \'exit\'.
  APPEND USER_BUTTONS.
  CALL FUNCTION \'POPUP_DISPLAY_TEXT_USER_BUTTON\'
    EXPORTING
      "语言
*     LANGUAGE                    = SY-LANGU
      "title
      POPUP_TITLE                 = \'title\'
      "位置
*     START_COLUMN                = 5
*     START_ROW                   = 5
*     DOCU_CLASS                  = \'DT\'
      "文本对象,se61建立dialog text类型创建
      TEXT_OBJECT                 = \'SPO_EXAMPLE_2\'
      "是否显示ok,cancel按钮
      DISPLAY_OK_BUTTON           = \'X\'
      DISPLAY_CANCEL_BUTTON       = \'X\'
    IMPORTING
      ANSWER                      = answer
    TABLES
      "用户自定义按钮
      USER_BUTTONS                = USER_BUTTONS
      PARAMETER                   = params.
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
    MESSAGE s000 WITH answer.
  ELSE.
    MESSAGE s000 WITH answer.
  ENDIF.
ENDFORM.
View Code