文章目录
- 前言
- 01、案例介绍/笔者需求
- 02、自定义弹窗
- 03、标准 复杂的 确认 弹框--->POPUP_TO_CONFIRM
- 04、标准 简单的 确认 弹框--->POPUP_TO_CONFIRM_STEP
- 05、标准 复选 / 单选 弹框--->POPUP_TO_DECIDE_LIST
- 06、标准 输入框获取值 弹框--->POPUP_GET_VALUES
- 07、标准 多条消息报错 弹框--->C14Z_MESSAGES_SHOW_AS_POPUP
- 08、标准 消息提示 弹框--->POPUP_TO_DISPLAY_TEXT
- 09、标准 下拉列表选择年月(YYYYMM) 弹框--->POPUP_TO_SELECT_MONTH
- 10、标准 选择年月日(YYYYMMDD) 弹框--->F4_DATE
- 11、标准 表格选择项目 弹框--->POPUP_WITH_TABLE_DISPLAY
- 12、标准 显示文档对象 弹框--->POPUP_DISPLAY_TEXT_WITH_PARAMS
- 13、标准 显示长文本 弹框--->ADA_POPUP_WITH_TABLE
- 14、标准 ALV报表 弹框--->CL_SALV_TABLE
- END、总结
前言
本文目前1w字+,这篇文章会持续更新,先 点赞 关注 收藏
制作不易 谢谢🤞
这篇文章给大家介绍一下SAP ABAP日常开发中常用必会的一些弹窗如何实现。弹窗这个东西在我们在各种软件开发中都是很常见的,SAP为我们也提供了多种弹窗的实现方式,这些弹窗的用途功能以及实现方式也是不同的。
01、案例介绍/笔者需求
下面这些弹窗的功能用途大家可以根据自己目前的需求选择,如果标准弹窗能实现建议还是用标准弹窗,虽然自定义弹窗能实现复杂的需求但是步骤还是相对来说繁琐一点,但是标准弹窗能实现的需求我们用自定义弹窗也都能实现。下面我直接先介绍自定义弹窗,它虽然复杂但是学会了也就一劳永逸嘛!
02、自定义弹窗
自定义弹窗说白了它就是另外一个屏幕,只不过通过 CALL SCREEN 的扩展语法把这个屏幕以弹窗的形式显示了出来,所以自定弹窗我们要去创建屏幕 根据需求画屏幕上面的控件然后编写此屏幕的逻辑流,再到程序相应地方 CALL 这个屏幕就可以了。如果对屏幕开发没基础的小伙伴可以去看笔者之前的几篇文章:SAP屏幕开发基础 、SAP屏幕调用切换方式 。
a.
创建屏幕绘制控件
以下的操作都是在一些简单程序基础上操作,程序创建 alv显示 等等都会忽略。
1.创建 屏幕
2.根据需求绘制控件
由于是测试我就随便绘制一点常用的控件。重点是这些控件名称 ,FUNCODE 之类用的时候别写错。如果绘制输入框最好是先在程序中把变量定义好,然后绘制的时候用绘制器带出来比较好。根据编号1234567操作就行,双击控件可以设置控件属性。在笔者另外一篇文章有详细介绍各种控件的绘制以及属性设置。
3.测试调整屏幕
1、 测试查看屏幕能看到屏幕效果是可以的,但是没有设置 status 菜单栏按钮都不能用,让我们这一步设置好。
2、 status 的创建步骤我就忽略了,我一般都是从其他程序复制过来的。下面有一个特殊的地方我刻意的把退出按钮写为了返回功能而不是退出到SAP主界面,下面会解释为什么这样写。现在这个屏幕大致功能没问题了也能正常返回。
b.
以弹窗模式呼叫屏幕
这里为了这个弹窗显示效果比较明显我就做在ALV界面弹出来。
1.设置9000调用方式
如下图所示当我们点击ALV回退按钮的时候就会使用语法 CALL SCREEN ‘9000’ STARTING AT 60 10 ENDING AT 110 21. 来调用我们创建的屏幕,并且弹窗的效果也是出来了。
2.特殊的关闭按钮
这里就解释我们上面为什么把退出按钮写为了返回上一个屏幕功能的原因。当你把屏幕以弹窗形式呼叫出来的时候它其中对应的按钮与status中对应如下图所示。 所以只有当我们把&F12设置为返回上个屏幕的功能才符合弹窗的逻辑。
c.
弹窗位置与大小
这里介绍弹窗的位置大小如何设置。主要看那个等比调整。
1.STARTING AT 20 5
指定了屏幕在屏幕上的起始位置,第一个数字20表示屏幕的横向位置(水平位置),第二个数字5表示屏幕的纵向位置(垂直位置)。
2.ENDING AT 100 16
指定了屏幕在屏幕上的结束位置,第一个数字100表示屏幕的宽度,第二个数字16表示屏幕的高度。
3.等比调整
什么叫做等比调整,就是如果你把屏幕位置向下调整了20个,那么屏幕的高度也会缩小20,当你向下调整位置20的时候屏幕的高度相应要增加20,这样才能保证屏幕的大小不变。同样的当你把屏幕位置向上调整了20那么屏幕高度也会增加20所以你高度要减少20才能保持原始大小。位置向右调宽度缩小,向左调宽度增加,位置向上调高度增加,向下调高度缩小。
d.
项目中的实际需求案例
这里大概展现一下这个自定义弹窗在实际项目中都有哪些案例。
1.deom1
当用户点击修改按钮的时候获取对应行把数据赋值给输入框变量,然后呼叫弹窗这样数据就被带到输入框了。当用户点击保存的时候 校验数据有没有变动 或者 是否符合数据要求,然后执行保存功能把数据库表和内表都更新,记得刷新ALV。
2.deom2
03、标准 复杂的 确认 弹框—>POPUP_TO_CONFIRM
这个弹框跟下面的 POPUP_TO_CONFIRM_STEP 比起来参数功能更丰富定制化相对更高。可以定义弹框的图标、按钮文本 和 按钮图标。Copy代码在下面,参数也都有详细注释。
popup_type 参数 弹框图标对应效果如下:
1、问号: ICON_MESSAGE_QUESTION
2、信息: ICON_MESSAGE_INFORMATION
3、警告: ICON_MESSAGE_WARNING
4、错误: ICON_MESSAGE_ERROR
5、停止: ICON_MESSAGE_CRITICAL
6、没有: NO_ICON
DATA l_answer TYPE c.
DATA parameter TYPE TABLE OF spar WITH HEADER LINE."这个参数没试出来效果
parameter-param = 'PARAM1'.
parameter-value = 'VALUE1'.
APPEND parameter.CALL FUNCTION 'POPUP_TO_CONFIRM'EXPORTINGtitlebar = '我是标题' "左上角标题diagnose_object = 'POPUP' "文档对象 SE61 去创建text_question = '我是消息文本' "提示消息text_button_1 = '确认' "按钮1icon_button_1 = 'ICON_CHECKED' "按钮1图标 事务码ICON 随便找text_button_2 = ''(001) "按钮2 这样是使用程序中的文本icon_button_2 = 'ICON_COLUMN_LEFT'"按钮2图标 事务码ICON 随便找default_button = '1' "光标默认定位在哪个按钮上display_cancel_button = 'X' "X 显示"取消关闭"按钮 、空 不显示取消关闭"按钮 (默认X)userdefined_f1_help = 'X' "X 显示"信息"按钮 、空 不显示信息"按钮 (默认空)start_column = 25 "距离左侧距离start_row = 6 "距离顶部距离popup_type = '' "指定提示图标 默认为 ICON_MESSAGE_QUESTION 是一个问号iv_quickinfo_button_1 = '鼠标悬停按钮1提示'iv_quickinfo_button_2 = '鼠标悬停按钮2提示'IMPORTINGanswer = l_answer "取消关闭 = A 按钮1 = 1 按钮2 = 2TABLESparameter = parameter "好像是动态显示提示文本 但是没试出来效果EXCEPTIONStext_not_found = 1OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
你们可以给 diagnose_object 参数传入 DMS-OLDTRANSACTIONS 试试,这个参数传输对象好像不是SE61创建,先留个坑吧 等我搞明白再回来填坑
这个参数我搞明白了,如下图所示,是我在做 “12、标准 显示文档对象 弹框” 案例的时候搞明白了,具体SE61如何创建文档对象请移步12。同时我附上最新代码,但是这个文档对象你们自己去创建哈。或者你们在SE61根据搜素帮助随便找一个标准的吧。
DATA l_answer TYPE c.DATA parameter TYPE TABLE OF spar WITH HEADER LINE."这个参数没试出来效果parameter-param = 'S1'.parameter-value = '变量1'.APPEND parameter.parameter-param = 'V2'.parameter-value = '变量2'.APPEND parameter.parameter-param = 'V3'.parameter-value = '变量3'.APPEND parameter.CALL FUNCTION 'POPUP_TO_CONFIRM'EXPORTINGtitlebar = '我是标题' "左上角标题diagnose_object = 'ZGLYN1' "文档对象 SE61 去创建text_question = '我是消息文本' "提示消息text_button_1 = '确认' "按钮1icon_button_1 = 'ICON_CHECKED' "按钮1图标 事务码ICON 随便找text_button_2 = ''(001) "按钮2 这样是使用程序中的文本icon_button_2 = 'ICON_COLUMN_LEFT'"按钮2图标 事务码ICON 随便找default_button = '1' "光标默认定位在哪个按钮上display_cancel_button = 'X' "X 显示"取消关闭"按钮 、空 不显示取消关闭"按钮 (默认X)userdefined_f1_help = 'X' "X 显示"信息"按钮 、空 不显示信息"按钮 (默认空)start_column = 25 "距离左侧距离start_row = 6 "距离顶部距离popup_type = '' "指定提示图标 默认为 ICON_MESSAGE_QUESTION 是一个问号iv_quickinfo_button_1 = '鼠标悬停按钮1提示'iv_quickinfo_button_2 = '鼠标悬停按钮2提示'IMPORTINGanswer = l_answer "取消关闭 = A 按钮1 = 1 按钮2 = 2TABLESparameter = parameter "好像是动态显示提示文本 但是没试出来效果EXCEPTIONStext_not_found = 1OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
04、标准 简单的 确认 弹框—>POPUP_TO_CONFIRM_STEP
这类确认弹框很常用 使用起来也很方便快捷,并且这个函数的参数也都很好理解,但是S4HANA用的时候会提示已经被淘汰,不过不影响我们的使用。
DATA lv_user_res TYPE char1. "string类型也可以CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'EXPORTINGdefaultoption = 'Y' "Y 光标定位到"是"按钮 、N 光标定位到"否"按钮 (默认Y)textline1 = '第一行文本'textline2 = '第二行文本'titel = '左上角标题'start_column = 50 "距离左侧位置start_row = 10 "距离顶部位置cancel_display = 'X' "X 显示"取消关闭"按钮 、空 不显示取消关闭"按钮 (默认X)IMPORTINGanswer = lv_user_res."是=J 否=N 取消=A
05、标准 复选 / 单选 弹框—>POPUP_TO_DECIDE_LIST
复制代码的话在下面,代码中的所有参数都做了详细注解。
DATA: BEGIN OF spoplist OCCURS 15.INCLUDE STRUCTURE spopli.DATA: END OF spoplist.DATA: antwort TYPE c.spoplist-varoption = '选项1'.APPEND spoplist.spoplist-varoption = '选项2'.APPEND spoplist.spoplist-varoption = '选项3'."选项描述spoplist-selflag = 'X' ."默认选中spoplist-inactive = 'X' ."选项不可用APPEND spoplist.CALL FUNCTION 'POPUP_TO_DECIDE_LIST'EXPORTINGcursorline = 1 "初始光标定位在哪个选项上mark_flag = 'X' "单选还是复选 (默认为复选 传空为单选)mark_max = 0 "限制用户选择数量 传0不限制 传1如果选择项超过1个会抛异常=3start_col = 50 "距离顶部距离start_row = 10 "距离左侧距离textline1 = '第一行文本' "弹框大小会随着字符长度变化而变化textline2 = '第二行文本'textline3 = '第三行文本'titel = '左上角标题'display_only = '' "是否显示全选反选按钮 (默认显示 传X不显示)IMPORTINGanswer = antwort "对号 = 3 、错号/关闭 = ATABLESt_spopli = spoplist "控制选项数量的内表EXCEPTIONSnot_enough_answers = 1too_much_answers = 2too_much_marks = 3OTHERS = 4.IF sy-subrc = 2.WRITE: 'Too many answers chosen.'.ENDIF.IF antwort = 'A'.WRITE: '用户关闭了弹窗'.ELSE.LOOP AT spoplist WHERE selflag = 'X'.WRITE / spoplist-varoption.ENDLOOP.ENDIF.
06、标准 输入框获取值 弹框—>POPUP_GET_VALUES
完整代码在下面,详解还请看代码中的注释,注意点是 不能重复添加但是表名前面加一个*
号可以再添加一次,最多显示10个输入框,可以使用 POPUP_GET_VALUES_SET_MAX_FIELD 函数模块修改对话框中字段的最大数目。
DATA returncode TYPE char1.
DATA fields TYPE TABLE OF sval WITH HEADER LINE.
fields-tabname = 'KNB1' ."表名
fields-fieldname = 'KUNNR' ."字段名
fields-value = '6666666666'."默认值
fields-field_obl = 'X' ."是否为必填
fields-fieldtext = '这是KUNNR' ."更改字段描述
fields-novaluehlp = '' ."为X不显示搜索帮助按钮 (默认为空)
fields-field_attr = '01' ."01高亮可输入、02普通亮度不可输入、03高亮不可输入、04不显示 (默认01)"这三个字段没试出来效果,但是参数就是这样填,感觉没啥卵用。意思是对比输入框值在下面这个表中是否存在
fields-comp_code = 'EQ' ."EQ等于、NE不等于、NC无字段检验、LT小于、LE小于或等于、GT大于、GE大于或等于、
fields-comp_tab = 'KNB1' ."对比 比较的表名
fields-comp_field = 'KUNNR' ."对比 比较的字段
APPEND fields.CALL FUNCTION 'POPUP_GET_VALUES'EXPORTINGno_value_check = 'X' "是否关闭对应数据类型的检查popup_title = '左上角标题'start_column = '5'"距离顶部距离start_row = '5'"距离左侧距离IMPORTINGreturncode = returncode "错号/关闭 = ATABLESfields = fieldsEXCEPTIONSerror_in_fields = 1 "fields参数有问题OTHERS = 2.
IF sy-subrc <> 0.
ENDIF.
07、标准 多条消息报错 弹框—>C14Z_MESSAGES_SHOW_AS_POPUP
使用这个弹框必须创建消息类使用,如果消息类不存在显示的文本都会不正常,创建消息类事务码SE91创建即可。并且弹框有丰富的标准按钮可以使用,Copy代码在下面直接改改参数就能用。
DATA:lt_tab TYPE esp1_message_tab_type WITH HEADER LINE.lt_tab-msgid = 'ZGLYN' ."消息类lt_tab-msgty = 'E' ."消息类型 E报错 W警告 S成功lt_tab-msgno = '000' ."消息类对应的消息号lt_tab-msgv1 = '小贱贱'."消息短文本对应传参1lt_tab-msgv2 = '漂亮国'."消息短文本对应传参2
* lt_tab-msgv3 = '' ."消息短文本对应传参3
* lt_tab-msgv4 = '' ."消息短文本对应传参4lt_tab-lineno = '10' ."行项目编号APPEND lt_tab.CLEAR lt_tab.lt_tab-msgid = 'ZGLYN'.lt_tab-msgty = 'S' .lt_tab-msgno = '001' .lt_tab-msgv1 = '嘴炮' .lt_tab-lineno = '20' .APPEND lt_tab.CLEAR lt_tab.CALL FUNCTION 'C14Z_MESSAGES_SHOW_AS_POPUP'
* EXPORTING
* I_MSGID =
* I_MSGTY =
* I_MSGNO =
* I_MSGV1 =
* I_MSGV2 =
* I_MSGV3 =
* I_MSGV4 =
* I_LINENO =TABLESi_message_tab = lt_tab.
08、标准 消息提示 弹框—>POPUP_TO_DISPLAY_TEXT
这玩意就是纯纯一个消息提示弹框,做不了啥功能的,感觉唯一 一点就是能把程序卡住,点了继续或者关闭程序才会继续执行。
CALL FUNCTION 'POPUP_TO_DISPLAY_TEXT'EXPORTINGtitel = '提示消息'"左上角标题textline1 = '恭喜你' "第一行提示文本textline2 = '上传成功'"第二行提示文本start_column = 15 "距离左侧距离start_row = 10. "距离顶部距离
09、标准 下拉列表选择年月(YYYYMM) 弹框—>POPUP_TO_SELECT_MONTH
这个函数也很简单参数也不多,详情看我代码的注释即可,这里要注意一下 FACTORY_CALENDAR 和 HOLIDAY_CALENDAR 参数的作用,这两个参数本来应该是 根据提供的工厂日历和假期日历高亮显示或标记工作日的,但是对于这个函数来说这两个参数并没有实际的效果,因为这个函数只显示年份月份。
你们可以使用事务码 SCAL 去创建查看对应的工厂日历和假期日历的ID,中国的是CH。
DATA:lv_month TYPE isellist-month,lv_subrc TYPE sy-subrc.CALL FUNCTION 'POPUP_TO_SELECT_MONTH'EXPORTINGactual_month = 202408 "必传参数 默认选择的年份月份 如果不存在会抛异常 3 MONTH_NOT_FOUNDfactory_calendar = space "工厂日历holiday_calendar = space "假期日历language = sy-langu"语言代码 会影响下拉框值的描述start_column = 8 "距离左侧距离start_row = 5 "距离顶部距离IMPORTINGselected_month = lv_month"用户选择的年月 YYYYDDreturn_code = lv_subrc"关闭弹框会抛异常 4EXCEPTIONSfactory_calendar_not_found = 1holiday_calendar_not_found = 2month_not_found = 3OTHERS = 4.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
10、标准 选择年月日(YYYYMMDD) 弹框—>F4_DATE
要注意 date_for_first_month 优先级高于 progname_for_first_month 的优先级,它两都是设置默认选择日期的。date_for_first_month 是直接传值,progname_for_first_month 是传一个程序名然后函数会获取光标在此程序位置的日期字段来设置默认值,你们可以选择屏幕声明一个日期字段然后先把日期字段填写 光标再定位到这个字段再按F8执行看看,其实感觉没啥卵用 还贼难试。。。如果要获取周相关信息就要点击周号那一列的数字。
DATA date TYPE workflds-gkday.
DATA week TYPE scal-week.
DATA week_begin TYPE sy-datum.
DATA week_end TYPE sy-datum.CALL FUNCTION 'F4_DATE'EXPORTINGdate_for_first_month = sy-datum "默认选择的日期display = 'X' "默认为空格 如果传 X 就是只能显示不能选择感觉就跟看日历一样factory_calendar_id = ' ' "实在是试不出来效果gregorian_calendar_flag = ' ' "实在是试不出来效果holiday_calendar_id = ' ' "实在是试不出来效果progname_for_first_month = sy-repid "传一个程序名 哎 没啥卵用 反正是设置默认选择日期的date_position = ' ' "控制日历的显示范围 空格 = 默认日期居中 T = 默认日期在顶部 B = 默认日期在底部IMPORTINGselect_date = date "选择的日期select_week = week "选择的第几周 例如202402 就是2024的第2周 一年一共有52周select_week_begin = week_begin"选择的第几周的这周的开始日期select_week_end = week_end "选择的第几周的这周的结束日期EXCEPTIONScalendar_buffer_not_loadable = 1date_after_range = 2date_before_range = 3date_invalid = 4factory_calendar_not_found = 5holiday_calendar_not_found = 6parameter_conflict = 7OTHERS = 8.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
11、标准 表格选择项目 弹框—>POPUP_WITH_TABLE_DISPLAY
感觉不是很实用 具体用法看代码中的注释吧,注释很详细。
DATA lt_tab TYPE TABLE OF char100 WITH HEADER LINE."一个字段的内表DATA choise TYPE sy-tabix.lt_tab = 'item1 我是项目1'.APPEND lt_tab.lt_tab = 'item2 我是项目2'.APPEND lt_tab.lt_tab = 'item3 我是项目3'.APPEND lt_tab.CALL FUNCTION 'POPUP_WITH_TABLE_DISPLAY'EXPORTINGendpos_col = 100 "弹框宽度endpos_row = 20 "弹框高度startpos_col = 30 "距离左侧距离 增减影响弹框宽度 如果要保持原宽度同比增减 endpos_colstartpos_row = 10 "距离顶部距离 增减影响弹框高度 如果要保持原高度同比增减 endpos_rowtitletext = '我是标题' "左上角标题IMPORTINGchoise = choise "用户选择了第几行 是索引值 如果点击取消就是0TABLESvaluetab = lt_tab "表格内容EXCEPTIONSbreak_off = 1OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
12、标准 显示文档对象 弹框—>POPUP_DISPLAY_TEXT_WITH_PARAMS
这个应该都不是很常用它可以显示文档对象,这个文档对象要去事务码 SE61 创建。创建的时候文档类要选择对话框文本。然后具体怎么编辑文档 格式排版如何调整这里不会详细介绍。
SE61创建对话框文档对象
弹框效果
DATA params TYPE TABLE OF spar WITH HEADER LINE.DATA cancelled TYPE c.params-param = 'S1'.params-value = '变量1'.APPEND params.params-param = 'V2'.params-value = '变量2'.APPEND params.params-param = 'V3'.params-value = '变量3'.APPEND params.CALL FUNCTION 'POPUP_DISPLAY_TEXT_WITH_PARAMS'EXPORTINGlanguage = sy-langupopup_title = '我是标题'"左上角标题start_column = 10 "距离左侧距离start_row = 3 "距离顶部距离text_object = 'ZGLYN1' "文档对象 SE61去创建help_modal = 'X'IMPORTINGcancelled = cancelled "用户点击取消或关闭 这个参数就为 XTABLESparameters = params "给文档对象中位置参数设置变量EXCEPTIONSerror_in_text = 1text_not_found = 2OTHERS = 3.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
13、标准 显示长文本 弹框—>ADA_POPUP_WITH_TABLE
这个弹框主要显示一些较长的文本并且有保存为本地txt或者打印的功能。
DATA lt_tab TYPE TABLE OF char100 WITH HEADER LINE."一个字段的内表lt_tab = 'item1 我是项目1'.APPEND lt_tab.lt_tab = 'item2 我是项目2'.APPEND lt_tab.lt_tab = 'item3 我是项目3'.APPEND lt_tab.CALL FUNCTION 'ADA_POPUP_WITH_TABLE'EXPORTINGstartpos_col = 15 "距离左侧距离startpos_row = 5 "距离顶部距离titletext = '左上角标题'
* WORDWRAP_POSITION = 5 "控制每行文本的长度 大于5会换行TABLESvaluetab = lt_tab. "一个字段的内表
14、标准 ALV报表 弹框—>CL_SALV_TABLE
要做弹框 ALV报表 可以使用 SALV 也称为 New ALV,这个我会专门出另外一篇文章做介绍 到时候附上链接。敬请期待。
END、总结
以上就是今天要讲的内容,本文仅仅简单介绍了 SAP里面一些常用的弹框,感觉这篇文章自己有学到东西或者在今后的工作中能派上用场,可以点赞收藏支持!!!如果有说错或者不好的地方还望大家提出来见谅,欢迎大家评论指出不好的地方。谢谢!