文章目录
ABAP Dialog对话框程序
组成:由3部分组成(GUI STATUS,SCREENS,ABAP PROGRAM);
逻辑流:PBO,PAI,POV,POH;前两种最重要;
PROCESS BEFORE OUTPUT.“输出之前执行,相当初始化,在初始化的时候要写入一些初始数据;
PROCESS AFTER INPUT.”你输入一些东西,你做了一些操作之后执行,比如写到数据库里;
PROCESS ON HELP-REQUEST.
PROCESS ON VALUE-REQUEST.
创建程序
事务代码:SE38
输入标题,选择类型,点击“保存”:
点击“本地对象”:
点击这个按钮,显示对象列表:
右击,点击“创建”,点击“屏幕”:
输入屏幕号,一般从9000开始,点击“确定”按钮:
绘制屏幕:
输入两个单选按钮,点击第一个单选按钮,输入名称和文本:
选中两个按钮,右击选择“单选按钮组”,点击“定义”:
绘制一个按钮,输入名称和功能码:
输入表名,点击“从字典获取”,选择一个字段,点击确定:
点击“激活”:
测试屏幕
选择屏幕,点击“执行”按钮,点击“确定”:
屏幕的效果如下:
这个修改Listbox类型的下拉框:
效果如下:
GUI Status
1、 创建 GUI TITLE
输入标题代码,输入标题,点击确定:
GUI STATUS
右击程序名,点击“创建”,点击“GUI 状态”:
输入状态名,输入短文本,点击确定:
增加按钮
点击“应用程序工具栏”,输入ZSAVE,双击:
选择“静态文本”:
填写以下信息:
选择快捷键:
填写信息,点击保存:
点击保存,并激活:
点击“功能键”,为按钮取名字,再设置功能类型是E退出:
点击确定:
ENDCHAIN.
将屏幕上的字段依次循环一遍
```js
LOOP AT SCREEN.
MODIFY SCREEN. ”更新屏幕;
ENDLOOP.
SET CURSOR FIELD XXX. ”将鼠标光标放到哪个字段上。
下面这两个的写法有点不一样,它们都是针对某个字段的,所以要用ON指定是哪一个的处理块;
PROCESS ON HELP-REQUEST. ”F1
MODULE “模块名称” ON “屏幕上的元素字段名称”.
PROCESS ON VALUE-REQUEST. ”F4
MODULE “模块名称” ON “屏幕上的元素字段名称”.
注意:在MOULE生成代码后在里面最好使用PERFORM,样可以避免和其它地方冲突;
选择“主程序”,点击确定:
FIELD XXX MODULE XXXX [ON INPUT|ON REQUEST].
ON INPUT:只有在字段不为空时进行校验;
ON REQUEST:只有在字段被修改之后才进行校验;
CHAIN. ”组合校验,多字段同时满足时才进行校验;
FIELD XXX.
FIELD XXX.
MODULE XXXX [ON CHAIN-INPUT |ON CHAIN-REQUEST].
ENDCHAIN.
将屏幕上的字段依次循环一遍
LOOP AT SCREEN.
MODIFY SCREEN. ”更新屏幕;
ENDLOOP.
SET CURSOR FIELD XXX. ”将鼠标光标放到哪个字段上。
查看SCREEN这个表的字段
事务代码:SE11
输入数据库名,点击显示:
部分组件的解释:
创建TAB(标签)
进入布局,点击这个绘制标签的按钮:
点击“继续”按钮:
输入名称,必须是英文的,点击继续:
填写三个标签:
自动创建的子标签:
点击“完成”:
效果如下:
这个是创建TAB之后创建的代码:
创建子窗体,只是创建了一个区域,为子窗体预留的一个区域;
表控件,可以绑定我们的数据表;
屏幕操作
SET SCREEN:设置下一个屏幕,(执行下一个屏幕,不会返回上一屏幕);
CALL SCREEN:在代码执行到这里时,程序会去执行新的屏幕,执行完之后再返回继续往下执行,(执行下一个屏幕,会返回上一屏幕);
LEAVE SCREEN:离开当前屏幕,执行系统指定的下一屏幕;
实例
实例用到的几个表:
1、 航线表SCARR
通过航线表的CARRID找到航班明细信息;
2、 航班 SFLIGHT
航班预定信息表SBOOK
1、 做一个屏幕,放一个按钮,点击按钮在另一个屏把结果展示出来;
2、 A、要变量的申明;
B、 要考虑REPORT这种程序的事件申明;
C、 PBA,PAI代码块;
先创建子程序:对程序进行分块编写;
INCLUDE ZTEXT_DIA_TOP_LHY. "将申明的变量放在ZTEXT_DIA_TOP_LHY里面;
程序如下:
*&---------------------------------------------------------------------*
*& Include ZTEXT_DIA_TOP_LHY
*&---------------------------------------------------------------------*
DATA: g_carrid type SCARR-CARRID."申明一个航线ID变量;
"定义两个内表,一个航班信息内表,一个航班预定信息表;
DATA: gt_sflght TYPE TABLE OF SFLIGHT,
gs_sflght type SFLIGHT."给它定义一个结构;
DATA: gt_sbook TYPE TABLE OF SBOOK,
gs_sbook TYPE SBOOK."给它定义一个结构;
ZDEMOE01程序:
*&---------------------------------------------------------------------*
*& Include ZDEMOE01
*&---------------------------------------------------------------------*
START-OF-SELECTION. "输入开始事件并创建屏幕;
CALL SCREEN 9100."在事件块里面我们第一个屏幕直接调用9100;
创建屏幕
输入屏幕号:
输入描述,点击保存按钮进行保存:
双击这四个变量,点击“是”按钮:
状态,测试程序,点击保存:
点击本地对象:
双击之后生成的:
点击“激活”:
点击确定:
给9100屏幕设置OK_CODE:
定义ok_code和save_ok变量;
屏幕做的操作,功能码一定会传递给ok_code,然后再清空ok_code,在save_ok里面去操作,一般人都是这样去做的;
在9100屏幕里的PAI里面输入退出方法;
双击这些方法让系统自动生成代码:
这个STATUS_9100放在 用于PBO模块的程序(ZDEMOO01)里面:
结果如下,在ZDEO001中生成了下列代码:
还有两个模块类似,但是是放在ZDEMOI01里:
ZDEMOO01程序如下:
*&---------------------------------------------------------------------*
*& 包含 ZDEMOO01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module STATUS_9100 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_9100 OUTPUT.
* SET PF-STATUS 'xxxxxxxx'.
* SET TITLEBAR 'xxx'.
ENDMODULE.
ZDEMOI01程序如下:
*&---------------------------------------------------------------------*
*& 包含 ZDEMOI01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_9100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_9100 INPUT.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module USER_EXIT_9100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_exit_9100 INPUT.
ENDMODULE.
设置9100屏幕的事件
创建TITLE 标题;
创建STATUS工具栏;
设置好标题和工具栏:
设置save_ok代码:
完整程序:
*&---------------------------------------------------------------------*
*& 包含 ZDEMOI01 PAI
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_9100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_9100 INPUT.
save_ok = ok_code. "之后用save_ok来操作
CLEAR ok_code.
CASE save_ok.
WHEN 'BACK'.
LEAVE PROGRAM. "离开程序
WHEN ''.
WHEN OTHERS.
ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module USER_EXIT_9100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_exit_9100 INPUT.
"对SAVE_OK做一些操作
CASE save_ok.
WHEN 'EXIT'.
LEAVE PROGRAM. "离开程序
WHEN 'CANCEL'.
LEAVE PROGRAM. "离开程序
WHEN OTHERS.
ENDCASE.
ENDMODULE.
设置标题代码:
状态是ST01,标题是T01:
这里是将屏幕号放在标题里:
给屏幕指定OK_CODE:
保存并激活:
点击进行测试:
注意在ZDEMOTOP中要写上这两句:
运行效果如下:
绘制屏幕
我们直接从数据表里拿出航线ID:
设置这个输入框为必填:
创建一个按钮,输入名称和文本,功能码:
更新对应的按钮事件代码:
创建屏幕9101
屏幕号是9101,点击确定:
输入简短描述:
设OK_CODE:
调用逻辑流代码并双击自动创建代码、输入退出方法:
选择ZDEMOO01
两个屏幕使用同一个状态即可:
PAI和PBO共用:
绘制控件
绘制第二屏幕9101的控件:
点击“继续”:
标签文本:
一直点击“继续”,直到完成:
整理代码
将申明部分移到TOP里:
将PBO的部分移到O01里:
将PAI的部分移到I01里:
增加取出数据语句:
添加另外两屏的控件
在TAB里面增加数据展示控件;
增加数据显示控件:
点击这个按钮:
表控制名称:
选择字段,点击继续:
同样,在9103把SOOK用类似的方法绘制控件:
选择SBOOK相关的:
自动生成代码:
PBO部分:
TOP部分:
设置文本框数据与变量同步:
修改代码
给gt_scarr-carrid一个默认值:LH:
在ZDEMOO01中的9100的PBO添加下面的语句:
在9100的PAI里面,在显示下一屏之前,将数据放入对应的表:
效果如下:
点击“显示下一屏”:
附录
完整代码:
主程序,ZTEXT_DIALOG_LHY的代码如下:
主程序代码
*&---------------------------------------------------------------------*
*& Report ZTEXT_DIALOG_LHY
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZTEXT_DIALOG_LHY.
INCLUDE ZDEMOtop."将申明的变量放在ZDEMOtop里面;
INCLUDE ZDEMOo01."将PBO放在ZDEMOo01里面;
INCLUDE ZDEMOi01."将PAI放在ZDEMOi01里面;
INCLUDE ZDEMOe01."将事件放在ZDEMOe01里面;
ZDEMOE01代码部分
*&---------------------------------------------------------------------*
*& Include ZDEMOE01
*&---------------------------------------------------------------------*
START-OF-SELECTION. "输入开始事件并创建屏幕;
CALL SCREEN 9100."在事件块里面我们第一个屏幕直接调用9100;
ZDEMOI01代码部分(PAI)
*&---------------------------------------------------------------------*
*& 包含 ZDEMOI01 PAI
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_9100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_9100 INPUT.
save_ok = ok_code. "之后用save_ok来操作
CLEAR ok_code.
CASE save_ok.
WHEN 'BACK'.
LEAVE PROGRAM. "离开程序
WHEN 'DISP'.
select * from sflight into table gt_sflght where carrid = gt_scarr-CARRID. "表中的carrid
select * from sbook into table gt_sbook where carrid = gt_scarr-CARRID. "表中的carrid
call screen 9101. "用户点击按钮时调用9101屏幕
WHEN OTHERS.
ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module USER_EXIT_9100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_exit_9100 INPUT.
"对SAVE_OK做一些操作
CASE save_ok.
WHEN 'EXIT'.
LEAVE PROGRAM. "离开程序
WHEN 'CANCEL'.
LEAVE PROGRAM. "离开程序
WHEN OTHERS.
ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_9101 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_9101 INPUT.
save_ok = ok_code. "之后用save_ok来操作
CLEAR ok_code.
CASE save_ok.
WHEN 'BACK'.
call screen 9100. "用户点击BACK按钮时调用9100屏幕
WHEN ''.
WHEN OTHERS.
ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module USER_EXIT_9101 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_exit_9101 INPUT.
"对SAVE_OK做一些操作
CASE save_ok.
WHEN 'EXIT'.
LEAVE PROGRAM. "离开程序
WHEN 'CANCEL'.
LEAVE PROGRAM. "离开程序
WHEN OTHERS.
ENDCASE.
ENDMODULE.
*&SPWIZARD: INPUT MODULE FOR TS 'USERINFOR'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: GETS ACTIVE TAB
MODULE USERINFOR_ACTIVE_TAB_GET INPUT.
OK_CODE = SY-UCOMM.
CASE OK_CODE.
WHEN C_USERINFOR-TAB1.
G_USERINFOR-PRESSED_TAB = C_USERINFOR-TAB1.
WHEN C_USERINFOR-TAB2.
G_USERINFOR-PRESSED_TAB = C_USERINFOR-TAB2.
WHEN C_USERINFOR-TAB3.
G_USERINFOR-PRESSED_TAB = C_USERINFOR-TAB3.
WHEN OTHERS.
*&SPWIZARD: DO NOTHING
ENDCASE.
ENDMODULE.
*&SPWIZARD: INPUT MODULE FOR TS 'FLIGHT_TABS'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: GETS ACTIVE TAB
MODULE FLIGHT_TABS_ACTIVE_TAB_GET INPUT.
OK_CODE = SY-UCOMM.
CASE OK_CODE.
WHEN C_FLIGHT_TABS-TAB1.
G_FLIGHT_TABS-PRESSED_TAB = C_FLIGHT_TABS-TAB1.
WHEN C_FLIGHT_TABS-TAB2.
G_FLIGHT_TABS-PRESSED_TAB = C_FLIGHT_TABS-TAB2.
WHEN OTHERS.
*&SPWIZARD: DO NOTHING
ENDCASE.
ENDMODULE.
ZDEMOO01代码部分(PBO)
*&---------------------------------------------------------------------*
*& 包含 ZDEMOO01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module STATUS_9100 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_9100 OUTPUT.
SET PF-STATUS 'ST01'.
SET TITLEBAR 'T01' WITH sy-dynnr.
SELECT * FROM scarr INTO TABLE gt_scarr."
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module STATUS_9101 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_9101 OUTPUT.
SET PF-STATUS 'ST01'.
SET TITLEBAR 'T01' WITH sy-dynnr.
ENDMODULE.
*&SPWIZARD: OUTPUT MODULE FOR TS 'FLIGHT_TABS'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: SETS ACTIVE TAB
MODULE FLIGHT_TABS_ACTIVE_TAB_SET OUTPUT.
FLIGHT_TABS-ACTIVETAB = G_FLIGHT_TABS-PRESSED_TAB.
CASE G_FLIGHT_TABS-PRESSED_TAB.
WHEN C_FLIGHT_TABS-TAB1.
G_FLIGHT_TABS-SUBSCREEN = '9102'.
WHEN C_FLIGHT_TABS-TAB2.
G_FLIGHT_TABS-SUBSCREEN = '9103'.
WHEN OTHERS.
*&SPWIZARD: DO NOTHING
ENDCASE.
ENDMODULE.
*&SPWIZARD: OUTPUT MODULE FOR TS 'USERINFOR'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: SETS ACTIVE TAB
MODULE USERINFOR_ACTIVE_TAB_SET OUTPUT.
USERINFOR-ACTIVETAB = G_USERINFOR-PRESSED_TAB.
CASE G_USERINFOR-PRESSED_TAB.
WHEN C_USERINFOR-TAB1.
G_USERINFOR-SUBSCREEN = '9001'.
WHEN C_USERINFOR-TAB2.
G_USERINFOR-SUBSCREEN = '9002'.
WHEN C_USERINFOR-TAB3.
G_USERINFOR-SUBSCREEN = '9003'.
WHEN OTHERS.
*&SPWIZARD: DO NOTHING
ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module STATUS_9000 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_9000 OUTPUT.
* SET PF-STATUS 'xxxxxxxx'.
* SET TITLEBAR 'xxx'.
ENDMODULE.
*&SPWIZARD: OUTPUT MODULE FOR TC 'SFLIGHT'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: UPDATE LINES FOR EQUIVALENT SCROLLBAR
MODULE SFLIGHT_CHANGE_TC_ATTR OUTPUT.
DESCRIBE TABLE GT_SFLGHT LINES SFLIGHT-lines.
ENDMODULE.
*&SPWIZARD: OUTPUT MODULE FOR TC 'SBOOK'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: UPDATE LINES FOR EQUIVALENT SCROLLBAR
MODULE SBOOK_CHANGE_TC_ATTR OUTPUT.
DESCRIBE TABLE GT_SBOOK LINES SBOOK-lines.
ENDMODULE.
ZDEMOTOP代码部分
*&---------------------------------------------------------------------*
*& 包含 ZDEMOTOP
*&---------------------------------------------------------------------*
DATA: g_carrid TYPE scarr-carrid."申明一个航线ID变量;
"定义两个内表,一个航班信息内表,一个航班预定信息表;
DATA: gt_sflght TYPE TABLE OF sflight,
gs_sflght TYPE sflight."给它定义一个结构;
DATA: gt_sbook TYPE TABLE OF sbook,
gs_sbook TYPE sbook."给它定义一个结构;
DATA: ok_code TYPE sy-ucomm, "定义变量来存储屏幕的操作;
save_ok TYPE sy-ucomm.
DATA:gt_scarr TYPE TABLE OF scarr WITH HEADER LINE.
gt_scarr-carrid = 'LH'.
*&SPWIZARD: FUNCTION CODES FOR TABSTRIP 'USERINFOR'
CONSTANTS: BEGIN OF c_userinfor,
tab1 LIKE sy-ucomm VALUE 'USERINFOR_FC1',
tab2 LIKE sy-ucomm VALUE 'USERINFOR_FC2',
tab3 LIKE sy-ucomm VALUE 'USERINFOR_FC3',
END OF c_userinfor.
*&SPWIZARD: DATA FOR TABSTRIP 'USERINFOR'
CONTROLS: userinfor TYPE TABSTRIP.
DATA: BEGIN OF g_userinfor,
subscreen LIKE sy-dynnr,
prog LIKE sy-repid VALUE 'ZTEXT_DIALOG_LHY',
pressed_tab LIKE sy-ucomm VALUE c_userinfor-tab1,
END OF g_userinfor.
"DATA: OK_CODE LIKE SY-UCOMM.
*&SPWIZARD: FUNCTION CODES FOR TABSTRIP 'DETAILINFO'
CONSTANTS: BEGIN OF c_detailinfo,
tab1 LIKE sy-ucomm VALUE 'DETAILINFO_FC1',
tab2 LIKE sy-ucomm VALUE 'DETAILINFO_FC2',
END OF c_detailinfo.
*&SPWIZARD: DATA FOR TABSTRIP 'DETAILINFO'
CONTROLS: detailinfo TYPE TABSTRIP.
DATA: BEGIN OF g_detailinfo,
subscreen LIKE sy-dynnr,
prog LIKE sy-repid VALUE 'ZDEMO01',
pressed_tab LIKE sy-ucomm VALUE c_detailinfo-tab1,
END OF g_detailinfo.
*&SPWIZARD: FUNCTION CODES FOR TABSTRIP 'FLIGHT_TABS'
CONSTANTS: BEGIN OF c_flight_tabs,
tab1 LIKE sy-ucomm VALUE 'FLIGHT_TABS_FC1',
tab2 LIKE sy-ucomm VALUE 'FLIGHT_TABS_FC2',
END OF c_flight_tabs.
*&SPWIZARD: DATA FOR TABSTRIP 'FLIGHT_TABS'
CONTROLS: flight_tabs TYPE TABSTRIP.
DATA: BEGIN OF g_flight_tabs,
subscreen LIKE sy-dynnr,
prog LIKE sy-repid VALUE 'ZTEXT_DIALOG_LHY',
pressed_tab LIKE sy-ucomm VALUE c_flight_tabs-tab1,
END OF g_flight_tabs.
*DATA: OK_CODE LIKE SY-UCOMM.
*&SPWIZARD: DECLARATION OF TABLECONTROL 'SFLIGHT' ITSELF
CONTROLS: sflight TYPE TABLEVIEW USING SCREEN 9102.
*&SPWIZARD: DECLARATION OF TABLECONTROL 'SBOOK' ITSELF
CONTROLS: sbook TYPE TABLEVIEW USING SCREEN 9103.
维护事务
事务代码:SE93
输入事务代码,点击创建按钮:
输入短文本,选择“程序和dynpro对话框事务”,点击“确定”:
输入屏幕号和程序名:
点击保存: