Dialog程序(Online程序、M类型程序)
一、Dialog程序的主要对象
- 界面(Screen)
- 模块池(Module Pool) 全局字段(Global Data):声明模块池中所有模块都可使用的数据 – TOP PBO模块(PBO Modules):屏幕输出前调用的模块 – O01 PAI模块(PAI Modules):相应用户输入而调用的模块 – I01 子程序(Subroutines):可以在模块中任何位置调用的子程序 – F01
- 菜单(GUI Status)
- 标题(GUI TITLE)
- 事务代码(Transaction Code )
1.1界面
- SAP的屏幕开发 ABAP List代码实现(例:选择界面的创建),Report程序直接执行即可以显示查询界面或结果界面.
- Dialog Screen绘制:较复杂,界面丰富.Dialog程序想要显示查询或结果界面必须建立Screen事件驱动程序(Event-Driven)
屏幕绘制的创建
SE38进入程序, 点击程序名右键->创建->屏幕,如下,输入屏幕编号,界面编号的选取0000~9999,其中1000和1010之间的屏幕编号为ABAP字典表的维护屏幕以及可执行程序的标准选择屏幕而预留。点击可以进入Screen Layout Designer。
- 属性(Attributes),设定屏幕基本属性
- 元素清单(Element List),包含界面中定义的所有构成元素,可编辑元素属性,OK_CODE(要定义接收变量)
- 流逻辑(Flow Logic)代码定义部分
元素清单(Element List)
名称 | 名称 | 说明 |
Text Field | 文本字段 | 只能显示,不能修改 |
Input/Output Field | 输入域 | 显示或输入数据 |
Checkbox | 复选框 | X:选中;空:未选中 |
Radio Button | 单选按钮 | 必须分组,组内只能选定一个 |
Pushbutton | 按钮 | 必须定义Function Code |
Tabstrip Control / Tabstrip Control (with Wizard) | TAB分页控制/创建向导 | 一个界面中显示多个标签页/标签 页创建向导(自动生成代码) |
Box | 框架控件 | 将关联元素组成一个组 |
Subscreen Area | 子屏幕区域 | 可以在子界面区域连接其他界面 |
Table Control / Table Control (with Wizard) | 数据表格控件/创建向导 | 以表单形式显示数据列表/表格创建 向导(自动生成代码) |
Custom Control | 用户定义控件 | 类的容器,实现ABAP Object使用 |
Status Icon | 状态图标 | 显示Icon |
Pushbutton
如图,直接点击 Pushbutton 拖到界面,,按钮界面长度可直接拖拽修改大小,填写名称和文本信息,双击按钮,设置按钮功能代码和功能类型。
元如图
新建事务代码执行程序界面如图
此时点击按钮未设置功能,需要到逻辑流下进行功能设置。
添加代码如下,此时再次执行程序,点击退出,此时直接退出程序。
Text Field / Input/Output Field
Text控件,在适宜的位置定义,定义名称、描述、显示长度,As label on left
Input/Output控件,显示效果是否可输入/必输项设置,2D/3D显示,下拉框设置/可接受负数值设置,必输校验等等
这里添加输入框也可选择从程序或标准表中导入
运行效果如下:
数据检查
回车或者保存按钮触发检查
"单一字段数据检查
FIELD gv_input03 MODULE check_school ON REQUEST.
MODULE check_school INPUT.
IF gv_input03 IS INITIAL.
MESSAGE '学校名称不能为空!' TYPE 'E'.
ELSE.
SELECT SINGLE * INTO @DATA(ls_student) FROM ztint_student WHERE school = @gv_input03.
IF ls_student IS NOT INITIAL.
MESSAGE '学校名称存在!' TYPE 'I'.
ELSE.
MESSAGE '学校名称不存在!' TYPE 'I'.
ENDIF.
ENDIF.
CLEAR ls_student.
ENDMODULE.
"多字段检查
PROCESS AFTER INPUT.
MODULE exit AT EXIT-COMMAND."强制退出功能按钮一般放在PAI里面第一个
CHAIN.
FIELD gv_code.
FIELD gv_name.
FIELD gv_school.
MODULE check_student_inf on chain-REQUEST.
ENDCHAIN.
MODULE check_student_inf INPUT.
SELECT SINGLE * INTO @ls_student FROM ztint_student
WHERE school = @gv_school AND code = @gv_code AND name = @gv_name.
IF ls_student IS NOT INITIAL.
MESSAGE '存在符合的学生信息!' TYPE 'I'.
ELSE.
SET CURSOR FIELD 'GV_SCHOOL'."放置光标位置
MESSAGE '不存在符合的学生信息!' TYPE 'E'.
ENDIF.
CLEAR ls_student.
ENDMODULE.
Radio Button/CheckBox
首先top里定义三个长度为1的变量接受屏幕单选按钮选择值接受,进入layout,选择从程序中导入,将属性设置为单选按钮,为对应按钮田间文本标签,鼠标选中全部按钮右键,选择按钮组定义,给其中任意按钮定义function code,其他单选按钮function code会同时被附上相同值(不设置function code值选择触发事件需要回车才会触发,设置后则点击选择框时自动触发)复选框同理
DATA gv_rb01 TYPE char1.
DATA gv_rb02 TYPE char1.
DATA gv_rb03 TYPE char1.
data gv_out1 type char15.
DATA gv_check TYPE char1.
PROCESS BEFORE OUTPUT.
MODULE status_0100.
MODULE set_elements.
MODULE set_elements OUTPUT.
IF gv_check EQ 'X'.
ELSE.
LOOP AT SCREEN.
IF screen-group3 EQ 'SEX'.
screen-invisible = '1'.”不可见
screen-input = '0'.“不可输入
MODIFY SCREEN.
ENDIF.
ENDLOOP.
ENDIF.
ENDMODULE.
PROCESS AFTER INPUT.
MODULE exit AT EXIT-COMMAND."强制退出功能按钮一般放在PAI里面第一个
MODULE set_sex_value.
MODULE set_sex_value INPUT.
gv_out1 = COND #( WHEN gv_rb01 EQ 'X' THEN '性别为男'
WHEN gv_rb02 EQ 'X' THEN '性别为女'
WHEN gv_rb03 EQ 'X' THEN '性别保密' ).
ENDMODULE.
Tabstrip控件
子界面与主界面主屏幕逻辑流子界/主界面屏幕逻辑界面/主界面屏幕逻辑流
创建步骤:
- 首先点击layout进入屏幕绘画界面,选择Tabstrip Control (with Wizard),在界面中拖一个区域,会自动进入创建向导,输入创建表单名称,(Tabstrip Name),Tab title definition,直接输入需要新建分页签描述,点击下一步,分配分页签屏幕编号,直接下一步,定义对应包含程序名称,最后点击完成,激活程序后,可以查看到程序中增加了子界面的编号,可以依次进入界面,修改界面格式,设置方式与主界面相同,但不能设置GUI Status和GUI TITLE,按钮可以隐藏SET PF-STATUS EXCLUDING ......。
- 分页签减少与增加:进入layout选中标签页切换位置(Pushbutton),点击删除,在数据定义/PBO/PAI中做相应变更,也可不变更,选择Pushbotton控件,在标签页旁边增加一个页面,修改控件属性Fct CODE,Ref. FIELD,可参考前面分页签,之后增加数据定义/PBO/PAI处代码,可以直接参考复制。
Table Control表格控件
当界面中查询多条数据时,可以使用Table Control控件来进行表单输出。
创建步骤 :
1、首先在TOP里声明表格需要使用的内表及结构,点击layout进入屏幕绘制界面,选择Table Control (with Wizard)使用向导创建Table Control,在界面中拖一个区域,会自动进入创建向导,输入表单名称(Name of Table Control),点击下一步,使用Internal Program Table创建,选择程序中的内表,点击下一步选择显示列,进入下一步设定属性:(Output only:只显示,不可输入,Input Control:可输入With column header:带标题,Line selection col.:行可选中Single:只能选中一行,Multiple:可以选中多行),点击下一步,设定按钮Scroll:设定滚动条,Insert/delete line:插入/删除行按钮,Select/deselect all:选中所有/不选中按钮,设定选中列的字段,在点击下一步,设定各部分代码进入的Include程序。
这里选择对应生成文件名称,点击继续,最后点击完成,则表格控件界面元素创建完成
可根据需要拖动调整列表宽度及设置表头名称
Table Control列的修改
•减少:选中input/output field,直接删除,将PAI中的Chain部分,相应字段进行注释
•增加:内表中增加字段,使用Input/Output Field增加列,Text控件增加描述,在PAI的Chain部分,增加相应字段。
- 属性修改:将Input/Output Field设成不可输入
控件属性的临时修改
如设置当点选某个按钮是,某个单元格或行可修改,如下当点选按钮时实现班级单元格修改属性的控制,如下:
操作不走,首先在界面中新增一个按钮,function code 设置为‘EDIT'
接着在界面PAI部分新增MODULE user_command,创建对应MODULE,如下
PROCESS AFTER INPUT. ”PAI部分
MODULE user_command_0130.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0130 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0130 INPUT.
ok_code = sy-ucomm. “判断点选按钮,单点选编辑按钮时修改列属性
CASE ok_code.
WHEN 'EDIT'.
PERFORM edit_col.
ENDCASE.
sy-ucomm = ok_code.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form EDIT_COL
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM edit_col .
DATA ls_col LIKE LINE OF tc_ctrl3-cols. "tc_ctrl3为我添加的表控件名称
LOOP AT tc_ctrl3-cols INTO ls_col.
IF ls_col-index EQ '6'. ”根据列索引判断修改对应列属性,这里第六列为班级列
IF ls_col-screen-input EQ '1'.
ls_col-screen-input = '0'.
ELSE.
ls_col-screen-input = '1'.
ENDIF.
ENDIF.
MODIFY tc_ctrl3-cols FROM ls_col.
CLEAR ls_col.
ENDLOOP.
ENDFORM.
当选中某行时,设置选中行某个单元格看修改,如下实现当选中行名字单元格可修改,代码如下:
PROCESS BEFORE OUTPUT. “PBO部分使用向导自动创建的代码
MODULE get_data.
*&SPWIZARD: PBO FLOW LOGIC FOR TABLECONTROL 'TC_CTRL3'
MODULE tc_ctrl3_change_tc_attr.
*&SPWIZARD: MODULE TC_CTRL3_CHANGE_COL_ATTR.
LOOP AT gt_student1
INTO gs_student1
WITH CONTROL tc_ctrl3
CURSOR tc_ctrl3-current_line.
MODULE tc_ctrl3_get_lines.
MODULE tc_ctrl3_change_field_attr. ”将单元格属性修改的MODULE注释拿开,创建对应MODULE
ENDLOOP.
*&---------------------------------------------------------------------*
*& Module TC_CTRL3_CHANGE_FIELD_ATTR OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE tc_ctrl3_change_field_attr OUTPUT.
IF gs_student1-box EQ 'X'. “BOX为创建时我添加的选中列,当BOX为X则为选中行
LOOP AT SCREEN.
IF screen-name = 'GS_STUDENT1-NAME'.”判断当屏幕名称为姓名单元格名称时,修改屏幕属性
screen-input = '1'.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
ENDIF.
ENDMODULE.
Tabstrip Control 分页签
Tabstrip可以实现在某个界面中,通过tab页的形式来显示多个界面,有按钮及子界面区域构成
创建步骤:
进入界面,点选使用向导创建tab按钮,拖入界面如下,点击继续
输入标签页名称,点击继续
输入需要新增tab页名称,点击继续
选择对应生成的包含文件,最后点击完成,如下
•激活程序后,可以查看到程序中增加了子界面的编号,可以依次进入界面,修改界面格式
标签页的修改
GUI Status/GUI Title
在DIALOG中,标准工具栏只能在主屏幕中设置,子屏幕不能设置,如下实现切换不同分页签,按钮不同的功能,点击新建和修改tab页时保存按钮可用,显示时不可用,如下:
在主屏幕设置STAUS及TITLE
DATA gt_status TYPE TABLE OF sy-ucomm WITH DEFAULT KEY.
DATA gv_title TYPE char10.
PROCESS BEFORE OUTPUT.
MODULE status_0100.
MODULE status_0100 OUTPUT.
SET PF-STATUS '0100' EXCLUDING gt_status.
SET TITLEBAR 'TITLE'WITH gv_title.
ENDMODULE.
PROCESS AFTER INPUT.
*&SPWIZARD: PAI FLOW LOGIC FOR TABSTRIP 'TS_CTRL'
CALL SUBSCREEN ts_ctrl_sca.
MODULE ts_ctrl_active_tab_get.
MODULE ts_ctrl_active_tab_get INPUT.
IF gv_ucomm IS NOT INITIAL.
g_ts_ctrl-pressed_tab = c_ts_ctrl-tab4.
CLEAR gv_ucomm.
ELSE.
ok_code = sy-ucomm."根据点选按钮,给全局参数赋值
CLEAR gt_status[].
CASE ok_code.
WHEN c_ts_ctrl-tab1.
g_ts_ctrl-pressed_tab = c_ts_ctrl-tab1.
gv_title = '新建'.
WHEN c_ts_ctrl-tab2.
g_ts_ctrl-pressed_tab = c_ts_ctrl-tab2.
gv_title = '修改'.
WHEN c_ts_ctrl-tab3.
g_ts_ctrl-pressed_tab = c_ts_ctrl-tab3.
gv_title = '修改'.
WHEN c_ts_ctrl-tab4.
g_ts_ctrl-pressed_tab = c_ts_ctrl-tab4.
gt_status = VALUE #( BASE gt_status ( 'SAVE' ) ).
gv_title = '显示'.
WHEN OTHERS.
*&SPWIZARD: DO NOTHING
ENDCASE.
ENDIF.
ENDMODULE.
*&---------------------------------------------------------------------*
界面的切换
搜索帮助F4的实现
•静态实现Search Help:数据字典中创建Search Help,Data Element中设置关联,Input/Output Field中设置关联,Domain的固定值/数据库表的check table等也会实现F4帮助
操作步骤:
1、事务码SE11进入界面,创建搜索帮助
这里Lpos为F4清单中列的位置,Spos为限制条件框中位置
在进入屏幕绘制界面,找到对应输入框,搜索帮助里添加新建的搜索帮助
•动态实现Search Help:定义内表实现,PROCESS ON VALUE-REQUEST部分定义,FIELD <field> MODULE <module> .使用函数F4IF_INT_TABLE_VALUE_REQUES
1、首先界面中增加POV( PROCESS ON VALUE-REQUEST. )事件,创建对应MODULE,
定义一个内表获取F4数据,调用函数F4IF_INT_TABLE_VALUE_REQUEST实现如下:
PROCESS ON VALUE-REQUEST.
FIELD gv_name MODULE f4_name.
*&---------------------------------------------------------------------*
*& Module F4_NAME INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE f4_name INPUT.
TYPES:BEGIN OF ty_stuinf,
code TYPE ztint_student-code,
name TYPE ztint_student-name,
END OF ty_stuinf.
DATA lt_stu TYPE STANDARD TABLE OF ty_stuinf WITH DEFAULT KEY.
SELECT code name INTO CORRESPONDING FIELDS OF TABLE lt_stu FROM ztint_student.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
* DDIC_STRUCTURE = ' '
retfield = 'NAME' “返回字段
* PVALKEY = ' '
dynpprog = 'YTEST_ZJJ10 ' ”程序名
dynpnr = '0100' “界面
dynprofield = 'GV_NAME ' ”屏幕控件名
* STEPL = 0
* WINDOW_TITLE =
* VALUE = ' '
value_org = 'S'
* MULTIPLE_CHOICE = ' '
* DISPLAY = ' '
* CALLBACK_PROGRAM = ' '
* CALLBACK_FORM = ' '
* CALLBACK_METHOD =
* MARK_TAB =
* IMPORTING
* USER_RESET =
TABLES
value_tab = lt_stu “内表
* FIELD_TAB =
* RETURN_TAB =
* DYNPFLD_MAPPING =
* EXCEPTIONS
* PARAMETER_ERROR = 1
* NO_VALUES_FOUND = 2
* OTHERS = 3
.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDMODULE.
执行效果如下
下拉菜单
•界面控件定义为下拉菜单:Listbox (只显示描述) Listbox with key(显示描述及关键字),在PBO部分增加Module设置给下拉菜单增加内容,调用函数VRM_SET_VALUES,ID = (返回界面中的字段名称)VALUES = (下拉菜单内容所在内表,要参照VRM_VALUES定义)
如下:数据表字段建域,界面表格控件下拉选择Listbox
执行结果如下:
PROCESS BEFORE OUTPUT.
MODULE status_0200.
MODULE f4_help.
*&---------------------------------------------------------------------*
*& Module F4_HELP OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE f4_help OUTPUT.
data lt_SCHOOL type VRM_VALUES.
SELECT SCHOOLcode as key,school as text
INTO CORRESPONDING FIELDS OF TABLE @lt_SCHOOL from ztint_student.
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = 'GV_NAME'
values = lt_SCHOOL
EXCEPTIONS
ID_ILLEGAL_NAME = 1
OTHERS = 2
.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDMODULE.
执行效果如下:
•日期类型的F4:–函数:F4_DATE,–界面中的控件定义为D类型
•文件路径的F4,函数:F4_FILENAME
PROCESS ON VALUE-REQUEST.
FIELD gv_date MODULE f4_date.
FIELD gv_FILE MODULE f4_FILE.
*&---------------------------------------------------------------------*
*& Module F4_DATE INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE f4_date INPUT.
CALL FUNCTION 'F4_DATE'
* EXPORTING
* DATE_FOR_FIRST_MONTH = SY-DATUM
* DISPLAY = ' '
* FACTORY_CALENDAR_ID = ' '
* GREGORIAN_CALENDAR_FLAG = ' '
* HOLIDAY_CALENDAR_ID = ' '
* PROGNAME_FOR_FIRST_MONTH = ' '
* DATE_POSITION = ' '
IMPORTING
select_date = gv_date
* SELECT_WEEK =
* SELECT_WEEK_BEGIN =
* SELECT_WEEK_END =
EXCEPTIONS
calendar_buffer_not_loadable = 1
date_after_range = 2
date_before_range = 3
date_invalid = 4
factory_calendar_not_found = 5
holiday_calendar_not_found = 6
parameter_conflict = 7
OTHERS = 8.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module F4_FILE INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE f4_file INPUT.
CALL FUNCTION 'F4_FILENAME'
EXPORTING
program_name = syst-cprog
dynpro_number = syst-dynnr
field_name = 'GV_FILE '
IMPORTING
file_name = gv_file.
ENDMODULE.
执行结果如下:
CSDN-Ada助手: 推荐 Java 技能树:https://edu.csdn.net/skill/java?utm_source=AI_act_java
哈哈~haha: 哈哈哈哈哈,我听的是塞依的
lmszsd: 哥们你是不是也是学的立讯的abap教程