搜索
您的当前位置:首页实战SAP程序开发从实例学SAPABAP编程第六章实战屏幕S

实战SAP程序开发从实例学SAPABAP编程第六章实战屏幕S

来源:飒榕旅游知识分享网
版权归原作者所有 仅供学习交流之用,请勿用于他途

第六章 实战屏幕SCREEN设计

屏幕(Screen)是ABAP设计最重要的工作之一,SAP的单据、主数据维护等业务功能都使用屏幕,一个程序可以包含多个屏幕。 本章主要介绍:

(1)安装时注意的问题;

(2)第一个“HELLO WORLD”Screen程序; (3)工具条和菜单设计; (4)屏幕对象;

(5)数据字典关联字段; (6)逻辑流;

(7)下拉框设计; (8)修改屏幕;

(9)子窗口(Subscreen); (10)表条目控制;

(11)定制控制,上载图片和在屏幕上显示图片实例; (12)文本编辑器;

(13)列表和屏幕相互调用。

6.1 安装时注意的问题

在安装GUI(客户端)时,需要把屏幕设计的功能选上,如图6-1所示。

1

版权归原作者所有 仅供学习交流之用,请勿用于他途

图6-1

如果没有安装正确,在启动屏幕设计界面时提示“No response from Graphical Screen Painter-Exiting.”的错误。

6.2 第一个“HELLO WORLD”Screen程序

本节将建立一个屏幕,屏幕包含一个“HELLO WORLD!”的文本字段和一个“退出”按钮,单击“退出”按钮时退出整个程序。步骤如下:

(1)建立一个新程序;

(2)设计Screen,处理控件、逻辑流; (3)调整程序,调用新建立的Screen。

6.2.1 建立一个新程序

输入TCODE:SE38,输入程序名,单击“创建”按钮,如图6-3所示。

2

版权归原作者所有 仅供学习交流之用,请勿用于他途

图6-3

输入标题,程序类型等信息后,单击“保存”按钮,如图6-4所示。

图6-4

3

版权归原作者所有 仅供学习交流之用,请勿用于他途 程序不需要传输至其他环境,因而保存时选“本地对象”,如图6-5所示。

图6-5

系统进入程序设计界面,直接保存后退回,如图6-6所示。

图6-6

6.2.2 设计Screen

输入TCODE:SE51,进入Screen设计界面,输入刚建立的程序名“YTEST007”,输入屏幕编号100后单击“创建”按钮,如图6-7所示。

4

版权归原作者所有 仅供学习交流之用,请勿用于他途

图6-7 在属性页输入描述后,直接保存,如图6-8所示。

5

版权归原作者所有 仅供学习交流之用,请勿用于他途 图6-8 单击工具条上的“格式”按钮,进入设计界面,添加一个文本字段控件,输入名称和文本,如果控件显示红色的表示未正确设置属性,如图6-9所示。

图6-9

“退出”按钮属性如图6-10所示。

6

版权归原作者所有 仅供学习交流之用,请勿用于他途

图6-10 注意属性中功能码为EXIT,函数类型“E”,表示退出函数。 设计窗口上的按钮说明: 文本元素

输入框 复选框 单选按钮 按钮

多页表条目控制制作 表条目控制制作向导 对象面板

子窗口、包含其他窗口 表格

表格制作导航 其他对象 状态图标

控制用屏幕输入输出事件,如在启动屏幕时使用的菜单、工具条,在输入后

7

版权归原作者所有 仅供学习交流之用,请勿用于他途 对输入框的检查,对按钮事件的控制等。

窗口的属性。

窗口上所有对象的列表,属性等。

单击

,出现如图6-11所示窗口。

图6-11

PROCESS BEFORE OUTPUT(PBO):屏幕显示前的调用模块。

PROCESS AFTER INPUT(PAI):响应用户输入后的调用模块,如单击按钮,输入字段后回车等事件。

写入代码“MODULE CANCEL AT EXIT-COMMAND.”。表示在退出事件时执行CANCEL模块,这和退出按钮的函数类型属性对应。

6.2.3 从程序中调用Screen

编辑程序YTEST007,调整后程序:

REPORT YTEST007 . *直接调用窗口 CALL SCREEN 100.

*---------------------------------------------------------------------* * MODULE cancel INPUT

*---------------------------------------------------------------------*

8

版权归原作者所有 仅供学习交流之用,请勿用于他途

*

*---------------------------------------------------------------------* *CANCEL MODULE与屏幕逻辑流对应 MODULE CANCEL INPUT. LEAVE PROGRAM.

ENDMODULE. \"cancel INPUT

执行程序,输出结果如图6-12所示。

图6-12

单击“退出”按钮,退出程序。

6.3 工具条和菜单设计

在“HELLO WORLD!”程序基础上,在屏幕上建立菜单,工具条按钮、系统按钮、添加编辑框;在程序启动时,将程序中的变量传递到窗口的编辑框中;在单击菜单、工具条按钮、系统按钮时,将选中对象的功能码传递到文本框;离开屏幕时,将两个编辑框内容输出,表示窗口变量正确传递回主程序。 学习本章后,会对屏幕布局及相关控制有一个完整的了解,并且有融会贯通的感觉,所以本节非常重要,主要介绍:菜单编辑器,应用工具条设计,菜单设计,系统按钮设计,逻辑流程设计,加班编辑框,加入OK_CODE,代码设计,输出结果。

9

版权归原作者所有 仅供学习交流之用,请勿用于他途

6.3.1 菜单编辑器

工具条和菜单设计,需要用菜单编辑器功能(TCODE:SE41),可以在屏幕设计的通过单击工具条按钮进入。单击工具条的“其他对象”按钮,如图6-13所示。

图6-13

在“GUI”状态名称后,单击创建按钮(

),如图6-14所示。

10

版权归原作者所有 仅供学习交流之用,请勿用于他途

图6-14

输入短文本,如图6-15所示。

图6-15

11

版权归原作者所有 仅供学习交流之用,请勿用于他途

6.3.2 应用工具条设计

展开“应用工具条”,在项目1输入“BIN1”,并双击它,如图6-16所示。

图6-16

选“静态文本”,继续,如图6-17所示。

图6-17 输入函数文本,可以选择图标,但在选择图标后,该按钮仅显示图标,文本做提示,如图6-18所示。

12

版权归原作者所有 仅供学习交流之用,请勿用于他途

图6-18

继续,为按钮分配一个功能键,如图6-19所示。

图6-19

输入图标文字,如图6-20所示。

13

版权归原作者所有 仅供学习交流之用,请勿用于他途

图6-20

以同样的方式添加第2个按钮,如图6-21所示。

图6-21

完成后单击工具条上的

按钮,输出结果如图6-22所示。

14

版权归原作者所有 仅供学习交流之用,请勿用于他途

图6-22

6.3.3 菜单设计

单击“菜单栏”,展开它,输入主菜单后双击它,输入相应的菜单项,如图6-23所示。

图6-23

单击测试按钮,输出界面如图6-24所示。

15

版权归原作者所有 仅供学习交流之用,请勿用于他途

图6-24

6.3.4 系统按钮设计

与菜单和工具条按钮设计一样,单击“功能键”,如图6-25所示。

图6-25

在标准工具条输入功能代码,测试界面如图6-26所示。

图6-26

16

版权归原作者所有 仅供学习交流之用,请勿用于他途

设计完成保存后,单击工具条上的

单击

按钮,激活状态条。

按钮设计逻辑流。

按钮回到Screen设计界面,单击

6.3.5 逻辑流设计

将默认的PAI和PBO两个MODULE设为有效(去掉*注释),如图6-27所示。

图6-27 在MODULE STATUS_0100调用设计的状态条,在MODULE USER_COMMAND_0100中处理各类按钮事件。

6.3.6 输入字段

进入屏幕设计界面,添加两个文本字段和两个输入字段。选择输入字段时,设定属性为输入输出字段,如图6-28所示。

17

版权归原作者所有 仅供学习交流之用,请勿用于他途

图6-28

6.3.7 OKCODE

单击按钮,定义OK_CODE变量来处理屏幕交互,如图6-29所示。

图6-29

18

版权归原作者所有 仅供学习交流之用,请勿用于他途 保存并激活该屏幕。

6.3.8 程序设计

REPORT YTEST007 .

DATA: FORINPUT(20) TYPE C VALUE '初始值', FORCODE(20) TYPE C. *功能码返回值

DATA: OK_CODE TYPE SY-UCOMM, SAVE_OK TYPE SY-UCOMM.

*直接调用窗口 CALL SCREEN 100. *输出返回变量

WRITE: FORINPUT, / FORCODE.

*---------------------------------------------------------------------* * MODULE status_0100 OUTPUT

*---------------------------------------------------------------------* * PBO输入前控制

*---------------------------------------------------------------------* MODULE STATUS_0100 OUTPUT.

*定义状态条、包括菜单、工具条按钮、系统按钮等 SET PF-STATUS 'TESTSTA1'. *将变量值输出至屏幕字段 FORCODE = SAVE_OK.

ENDMODULE. \"STATUS_0100 OUTPUT

*---------------------------------------------------------------------* * MODULE cancel INPUT

*---------------------------------------------------------------------* * CANCEL MODULE与屏幕逻辑流对应

*---------------------------------------------------------------------* MODULE CANCEL INPUT. LEAVE PROGRAM.

ENDMODULE. \"cancel INPUT

*---------------------------------------------------------------------* * MODULE user_command_0100 INPUT

*---------------------------------------------------------------------* * PAI输入后控制

*---------------------------------------------------------------------* MODULE USER_COMMAND_0100 INPUT. SAVE_OK = OK_CODE. CLEAR OK_CODE.

19

版权归原作者所有 仅供学习交流之用,请勿用于他途

*分析功能码,如果是工具条上的第2个按钮,则退出当前屏幕 CASE SAVE_OK. WHEN 'BIN2'.

LEAVE TO SCREEN 0. ENDCASE.

ENDMODULE. \"user_command_0100 INPUT

6.3.9 屏幕输出

屏幕输出如图6-30所示。

图6-30

单击“测试二”按钮,退出设计屏幕,系统输出输入框内容如图6-31所示。

(由于我做的时候没有安装中文,所以会出现乱码的情况)

图6-31

20

版权归原作者所有 仅供学习交流之用,请勿用于他途

6.4 屏幕对象功能

6.4.1 单选按钮组的定义

单选按钮组是多个单选按钮()的组合操作。选中多个单选按钮,单击右键选菜单

“单选按钮组”—>“定义”,如图6-32所示。

图6-32 取消多个单选按钮组合单击“分解”菜单。

6.4.2 输入输出字段的属性

输入输出字段的属性如图6-33所示。

图6-33

“输出字段” “输入输出” “强制性输入”

“只输出”

21

版权归原作者所有 仅供学习交流之用,请勿用于他途

“不可见”设计界面

6.4.3 数据字典关联字段

在Screen设计过程中,数据字典关联字段可以根据数据字典中定义的透明表、结构等信息,方便地在屏幕上建立与字典关联的文本、输入输出字段。 例如使用航班计划表(SPFLI),在屏幕上定义相关该表字段,并根据输入的主关键字检索其他字段的信息,并显示到输入输出字段。 航班计划表结构,如图6-34所示。

图6-34

MANDT字段表示集团,在登录时已默认,本节通过CARRID和CONNID两个关键字检索数据。

新建一个程序并建立一个屏幕后,单击图6-35中所示的“字典字段窗口”按钮(

)。

22

版权归原作者所有 仅供学习交流之用,请勿用于他途

图6-35 输入表“SPFLI”后,回车,系统显示该表所有字段,选择需要输出的字段,如图6-36所示。

图6-36

定位输出位置后,所有字段自动输出,如图6-37所示。

23

版权归原作者所有 仅供学习交流之用,请勿用于他途

图6-37

定义非关键字为只读,即非输入字段,如图6-38所示。

24

版权归原作者所有 仅供学习交流之用,请勿用于他途

图6-38

定义逻辑流,如图6-39所示。

25

版权归原作者所有 仅供学习交流之用,请勿用于他途

图6-39

保存后,屏幕设计完成。 程序:

REPORT YTEST008. * 功能码返回值

DATA: OK_CODE TYPE SY-UCOMM, SAVE_OK TYPE SY-UCOMM. *使用航班表 TABLES SPFLI. *直接调用窗口 CALL SCREEN 120.

*&---------------------------------------------------------------------* *& Module CANCEL INPUT

*&---------------------------------------------------------------------* * 与屏幕逻辑流对应,退出程序

*----------------------------------------------------------------------* MODULE CANCEL INPUT. LEAVE PROGRAM.

ENDMODULE. \" CANCEL INPUT

*&---------------------------------------------------------------------* *& Module STATUS_0120 OUTPUT

*&---------------------------------------------------------------------* * 定义状态条、包括菜单,工具条按钮、系统按钮等

*----------------------------------------------------------------------* MODULE STATUS_0120 OUTPUT. SET PF-STATUS 'STATUS1'.

ENDMODULE. \" STATUS_0120 OUTPUT

*&---------------------------------------------------------------------* *& Module USER_COMMAND_0120 INPUT

*&---------------------------------------------------------------------* * 在输入字段或单击按钮事件后处理

*----------------------------------------------------------------------* MODULE USER_COMMAND_0120 INPUT. SAVE_OK = OK_CODE. CLEAR OK_CODE. CASE SAVE_OK. WHEN 'EXIT'. LEAVE PROGRAM. ENDCASE.

*将SELECT数据赋给SPFLI记录,SPFLI记录关联屏幕字段 SELECT SINGLE *

INTO CORRESPONDING FIELDS OF SPFLI FROM SPFLI

26

版权归原作者所有 仅供学习交流之用,请勿用于他途

WHERE CARRID = SPFLI-CARRID AND CONNID = SPFLI-CONNID. IF SY-SUBRC NE 0. CLEAR SPFLI. ENDIF.

ENDMODULE. \" USER_COMMAND_0120 INPUT 输出:

CARRID处输入“AA”,CONNID处输入“64”。请先查SPFLI表,不要输入错误数据。回车后屏幕显示如图6-40所示。

图6-40

6.5 逻辑流

6.5.1 顺序执行逻辑流

系统是按照逻辑流的顺序执行的,例如下面的逻辑流(PAI): PROCESS AFTER INPUT。 MODULE USER_COMMAND_TEST. MODULE CANCEL AT EXIT-COMMAND. MODULE USER_COMMAND_0100.

如果单击退出键,那么“MODULE USER_COMMAND_0100”是不会执行的。

27

版权归原作者所有 仅供学习交流之用,请勿用于他途

6.5.2 字段检查与逻辑流的控制

相关语法: z 单个字段检查

FIELD MODULE .

z 单个字段多个MODULE检查,如FLD1有两个MODULE检查

FIELD MODULE . MODULE . z 检查多字段,使用CHAIN

CHAIN.

FIELD .

FIELD ,,. MODULE . MODULE . ENDCHAIN.

表示FLD1,FLD2,FLD3,FLD4有MDL1与MDL2检查。 z 不是初始值检查

FIELD MODLE ON INPUT. ON INPUT表示是初始值改变时执行. 有一个特殊情况: FIELD MODULE ON *-INPUT.

表示用户输入字段首字输入’*’,并且输入字段属性

,MODULE无效。

z 有改变检查

FIELD MODULE ON REQUEST. z CHAIN中有字段不是初始值检查

CHAIN.

FIELD . FIELD ,,. MODULE ON CHAIN-INPUT. MODULE . ENDCHAIN.

.注意,CHAIN_INPUT表示FLD1,FLD2,FLD3,FLD4不是初始值时执行MDL1检查。

6.5.3 发布消息

消息的类型见表6-1。

表6-1

消息类型 E:错误 W:警告

I:信息(弹出窗口) A:异常终止

后继操作

所有字段重新输入,重新启动PAI处理,所有字段重新输入 所有字段允许输入,在未输入新值回车,也会继续PAI处理 中断当前操作 返回

28

版权归原作者所有 仅供学习交流之用,请勿用于他途 S:成功

处理PAI

建立的消息类(TCODE:SE91)YMESS下的消息005、006、007,如图6-41所示。

图6-41

建立一个程序“YTEST12”,建立Screen,加入退出按钮,并在主程序中设计退出程序。在主屏幕中加入4个文本字段和4个输入字段,如图6-42所示。

图6-42

29

版权归原作者所有 仅供学习交流之用,请勿用于他途

其中FLD2为,进入逻辑流设计。

调整程序:

PROCESS BEFORE OUTPUT. MODULE STATUS_0100. *检查FLD1、FLD2

PROCESS AFTER INPUT. CHAIN.

FIELD: FLD1,FLD2. MODULE CHECK1. ENDCHAIN. *检查FLD3、FLD4 CHAIN.

FIELD: FLD3,FLD4. MODULE CHECK2. ENDCHAIN.

*当FLD2的首字符是*时执行CHECK3检查 FIELD FLD2 MODULE CHECK3 ON *-INPUT. MODULE CANCEL AT EXIT-COMMAND. MODULE USER_COMMAND_0100. 调整主程序: REPORT YTEST12. *功能码返回值

DATA: OK_CODE TYPE SY-UCOMM, SAVE_OK TYPE SY-UCOMM. *定义输入字段变量

DATA: FLD1(20) TYPE C, FLD2(20) TYPE C, FLD3(20) TYPE C, FLD4(20) TYPE C, ACTION(50) TYPE C. *直接调用窗口 CALL SCREEN 100.

*&---------------------------------------------------------------------* *& Module CANCEL INPUT

*&---------------------------------------------------------------------* * CANCEL MODULE 与屏幕逻辑流对应,退出程序

*----------------------------------------------------------------------* MODULE CANCEL INPUT. LEAVE PROGRAM.

ENDMODULE. \" CANCEL INPUT

*&---------------------------------------------------------------------* *& Module STATUS_0100 OUTPUT

*&---------------------------------------------------------------------*

30

版权归原作者所有 仅供学习交流之用,请勿用于他途

* 定义状态条,包括菜单、工具条按钮、系统按钮等

*----------------------------------------------------------------------* MODULE STATUS_0100 OUTPUT. SET PF-STATUS 'STATUS1'.

ENDMODULE. \" STATUS_0100 OUTPUT

*&---------------------------------------------------------------------* *& Module USER_COMMAND_0100 INPUT

*&---------------------------------------------------------------------* * 如果能执行PAI,把FLD1、FLD2、FLD3、FLD4合并到ACTION输入字段

*----------------------------------------------------------------------* MODULE USER_COMMAND_0100 INPUT. SAVE_OK = OK_CODE. CLEAR OK_CODE. CASE SAVE_OK. WHEN 'EXIT'. LEAVE PROGRAM. ENDCASE. ACTION = ''.

CONCATENATE FLD1 FLD2 FLD3 FLD4 INTO ACTION.

ENDMODULE. \" USER_COMMAND_0100 INPUT

*&---------------------------------------------------------------------* *& Module CHECK1 INPUT

*&---------------------------------------------------------------------* * 输入FLD1、FLD2 时检查

*----------------------------------------------------------------------* MODULE CHECK1 INPUT.

*当输入FLD1 = 'FLD1' 时提示错误,而且不执行PAI IF FLD1 = 'FLD1'.

MESSAGE E005(YMESS) WITH 'FLD1 ERROR'. ENDIF.

*当输入FLD1 = 'FLD11' 时弹出窗口提示,执行PAI IF FLD1 = 'FLD11'.

MESSAGE I005(YMESS) WITH 'FLD1 WARNING'. ENDIF.

*当输入FLD1 = 'FLD111' 时输出成功信息,执行PAI IF FLD1 = 'FLD111'.

MESSAGE S005(YMESS) WITH 'FLD1 OK'. ENDIF.

ENDMODULE. \" CHECK1 INPUT

*&---------------------------------------------------------------------* *& Module CHECK2 INPUT

*&---------------------------------------------------------------------* * 输入FLD3、FLD4 时检查

31

版权归原作者所有 仅供学习交流之用,请勿用于他途

*----------------------------------------------------------------------* MODULE CHECK2 INPUT. IF FLD3 = 'FLD3'.

MESSAGE E005(YMESS) WITH 'FLD3 ERROR'. ENDIF.

IF FLD3 = 'FLD33'.

MESSAGE I005(YMESS) WITH 'FLD3 WARNING'. ENDIF.

IF FLD3 = 'FLD333'.

MESSAGE S005(YMESS) WITH 'FLD3 OK'. ENDIF.

ENDMODULE. \" CHECK2 INPUT

*&---------------------------------------------------------------------* *& Module CHECK3 INPUT

*&---------------------------------------------------------------------* *当FLD2第一个字符是'*'时,执行该MODULE,弹出信息提示

*----------------------------------------------------------------------* MODULE CHECK3 INPUT.

MESSAGE I005(YMESS) WITH 'FLD2 * WARNING'. ENDMODULE. \" CHECK3 INPUT

输出如图6-43所示。

图6-43

当输入FLD1 = ‘FLD1’时,提示错误,并且变量ACTION不会更改,

当输入FLD1 = ‘FLD11’时,弹出提示框,确认后变量ACTION更改,如图6-44所示。

32

版权归原作者所有 仅供学习交流之用,请勿用于他途

图6-44

当FLD2首字符为“*”时,出现提示框,如图6-45所示。

图6-45

变量ACTION会更新。

6.6 Listbox下拉框设计

在屏幕上建立一个输入输出FIELD,设定属性下拉:Listbox,如图6-46所示。

图6-46

程序:

REPORT YTEST13. *功能码返回值

DATA: OK_CODE TYPE SY-UCOMM, SAVE_OK TYPE SY-UCOMM. *VRM类型定义接口 TYPE-POOLS VRM.

DATA: FLD1(20) TYPE C. *内表、记录,字段变量定义 DATA: FNAME TYPE VRM_ID, VVA TYPE VRM_VALUES, LVVA LIKE LINE OF VVA. *直接调用窗口 CALL SCREEN 100.

*&---------------------------------------------------------------------*

33

版权归原作者所有 仅供学习交流之用,请勿用于他途

*& Module STATUS_0100 OUTPUT

*&---------------------------------------------------------------------* * 定义状态条,包括菜单、工具条按钮、系统按钮等 * 直接在PBO中将值填入内表,再设定下拉框

*----------------------------------------------------------------------* MODULE STATUS_0100 OUTPUT. SET PF-STATUS 'STATUS1'. *加两条记录

FNAME = 'FLD1'. LVVA-KEY = '1'. LVVA-KEY = '广州'. APPEND LVVA TO VVA. CLEAR LVVA. FNAME = 'FLD1'. LVVA-KEY = '上海'. APPEND LVVA TO VVA.

CALL FUNCTION 'VRM_SET_VALUES' EXPORTING

ID = FNAME VALUES = VVA * EXCEPTIONS

* ID_ILLEGAL_NAME = 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.

ENDMODULE. \" STATUS_0100 OUTPUT

*&---------------------------------------------------------------------* *& Module CANCEL INPUT

*&---------------------------------------------------------------------* * CANCEL MODULE 与屏幕逻辑流对应,退出程序

*----------------------------------------------------------------------* MODULE CANCEL INPUT. LEAVE PROGRAM.

ENDMODULE. \" CANCEL INPUT

*&---------------------------------------------------------------------* *& Module USER_COMMAND_0100 INPUT

*&---------------------------------------------------------------------* * PAI

*----------------------------------------------------------------------* MODULE USER_COMMAND_0100 INPUT.

34

版权归原作者所有 仅供学习交流之用,请勿用于他途

SAVE_OK = OK_CODE. CLEAR OK_CODE. CASE SAVE_OK. WHEN 'EXIT'. LEAVE PROGRAM. ENDCASE.

ENDMODULE. \" USER_COMMAND_0100 INPUT

输出结果如图6-47所示。

图6-47

6.7 修改屏幕状态

可以在程序运行时动态地设置对象的属性,如设置一个字段是否有效,在Screen设计时,可以将字段分组,在PBO事件中设置属性。 本节在屏幕上建立一个CHECKBOX、若干输入字段,将字段分成两个组,每一个组有一个BUTTOM,单击组BUTTON,根据CHECKBOX的值更改字段组的属性,设计界面如图6-48所示。

图6-48

1-1和1-2为NO1组,2-1和2-2为NO2组。 程序:

REPORT YTEST14. *功能码返回值

DATA: OK_CODE TYPE SY-UCOMM, SAVE_OK TYPE SY-UCOMM.

DATA: SGRP(20) TYPE C, SMOD(1) TYPE C. *是否修改

35

版权归原作者所有 仅供学习交流之用,请勿用于他途

DATA: CANMOD(1) TYPE C. *默认可以修改 CANMOD = 'X'. *直接调用窗口 CALL SCREEN 100.

*&---------------------------------------------------------------------* *& Module STATUS_0100 OUTPUT

*&---------------------------------------------------------------------* * 定义状态条、包括菜单、工具条按钮、系统按钮

*----------------------------------------------------------------------* MODULE STATUS_0100 OUTPUT. SET PF-STATUS 'STATUS1'. *根据按钮确定字段组 SGRP = ''.

IF SAVE_OK = 'BTN1'. SGRP = 'NO1'. ELSE.

SGRP = 'NO2'. ENDIF.

*CHECKBOX转换

IF CANMOD = 'X'. SMOD = '1'. ELSE.

SMOD = '0'. ENDIF.

*逐个扫描屏幕元素 LOOP AT SCREEN.

*如果是需要修改的组,更改变量,其他组不考虑,如果正式考虑先存储到变量 IF SCREEN-GROUP1 = SGRP. SCREEN-INPUT = SMOD. *更新到窗口元素变量 MODIFY SCREEN. ENDIF. ENDLOOP.

ENDMODULE. \" STATUS_0100 OUTPUT

*&---------------------------------------------------------------------* *& Module CANCEL INPUT

*&---------------------------------------------------------------------* * CANCEL MOUDLE 与屏幕逻辑流对应,退出程序

*----------------------------------------------------------------------* MODULE CANCEL INPUT. LEAVE PROGRAM.

ENDMODULE. \" CANCEL INPUT

*&---------------------------------------------------------------------*

36

版权归原作者所有 仅供学习交流之用,请勿用于他途

*& Module USER_COMMAND_0100 INPUT

*&---------------------------------------------------------------------* * PAI

*----------------------------------------------------------------------* MODULE USER_COMMAND_0100 INPUT. SAVE_OK = OK_CODE. CLEAR OK_CODE. CASE SAVE_OK. WHEN 'EXIT'. LEAVE PROGRAM. ENDCASE.

ENDMODULE. \" USER_COMMAND_0100 INPUT

输出结果如图6-49所示。

图6-49

当选择不更改,单击设定组1按钮时,测试组1状态变为不能编辑。

6.6 子窗口

一个程序可以有多个窗口,通过子窗口,可以把若干个子窗口放在一个窗口上,这样,既保持了整体性,又方便对单个屏幕的维护。在SAP业务程序中,大量地使用了子窗口设计。

窗口对象子屏幕范围(

)对象用来定义一个子窗口在主窗口上的大小、位

置等属性,通过逻辑流和主程序将对象关联到子窗口。

例如:建立一个主窗口和两个子窗口,在主窗口上再创建一个子窗口范围,增加两个按钮,单击按钮时切换子窗口,设计界面如图6-50所示。

37

版权归原作者所有 仅供学习交流之用,请勿用于他途

图6-50

38

版权归原作者所有 仅供学习交流之用,请勿用于他途

图6-51

图6-52

定义好子屏幕300。

回到主屏幕,定义逻辑流: PROCESS BEFORE OUTPUT. MODULE STATUS_0100.

*SUBSCR是定义的子屏幕范围的名称

CALL SUBSCREEN: SUBSCR INCLUDING SY-REPID SID1.

PROCESS AFTER INPUT.

MODULE CANCEL AT EXIT-COMMAND. MODULE USER_COMMAND_0100. *使子屏幕显示

CALL SUBSCREEN SUBSCR.

主程序:

REPORT YTEST15 . *功能码返回值

DATA: OK_CODE TYPE SY-UCOMM, SAVE_OK TYPE SY-UCOMM. *子窗口默认用200子窗口

39

版权归原作者所有 仅供学习交流之用,请勿用于他途

DATA: SID1(4) TYPE N VALUE '200'. *直接调用窗口 CALL SCREEN 100.

*&---------------------------------------------------------------------* *& Module STATUS_0100 OUTPUT

*&---------------------------------------------------------------------* * text

*----------------------------------------------------------------------* MODULE STATUS_0100 OUTPUT. SET PF-STATUS 'STATUS1'.

ENDMODULE. \" STATUS_0100 OUTPUT

*&---------------------------------------------------------------------* *& Module CANCEL INPUT

*&---------------------------------------------------------------------* * text

*----------------------------------------------------------------------* MODULE CANCEL INPUT. LEAVE PROGRAM.

ENDMODULE. \" CANCEL INPUT

*&---------------------------------------------------------------------* *& Module USER_COMMAND_0100 INPUT

*&---------------------------------------------------------------------* * text

*----------------------------------------------------------------------* MODULE USER_COMMAND_0100 INPUT. SAVE_OK = OK_CODE. CLEAR OK_CODE. CASE SAVE_OK.

*当单击第一个按钮,显示200子窗口 WHEN 'BTN1'. SID1 = '200'.

*当单击第二个按钮,显示300子窗口 WHEN 'BTN2'. SID1 = '300'. WHEN 'EXIT'. LEAVE PROGRAM. ENDCASE.

ENDMODULE. \" USER_COMMAND_0100 INPUT

输出结果如图6-53所示。

40

版权归原作者所有 仅供学习交流之用,请勿用于他途

图6-53

当单击“显示子窗口2”按钮时,显示子窗口300,如图6-54所示。

图6-54

41

版权归原作者所有 仅供学习交流之用,请勿用于他途

6.9 表条目控制

表条目控制是实现将多个子屏幕以页面形式切换的控件,有手工制作和向导生成两种,在本节中,不再重复子屏幕创建操作,只表达操作上的特殊性,手工制作的图标是“

”向导制作的图标是“

”。

6.9.1 手工制作

进入屏幕设计,单击

按钮,创建一个表条目控制,如图6-55所示。

图6-55

图6-55中控件显示粉红色表示其属性未设置完成。

逐页设置名称、文本、功能码属性,接着选中“子屏幕范围”按钮,在第一页创建该对象,设定好子屏幕的属性后,第一页就设置完成,不再显示粉红色,如图6-56所示的“表1”。

42

版权归原作者所有 仅供学习交流之用,请勿用于他途

6.9.2 向导制作

在设计屏幕上创建“表条目控制制作向导”对象,启动向导程序,如图6-58所示。

图6-58

输入名称后继续,如图6-59所示。

43

版权归原作者所有 仅供学习交流之用,请勿用于他途

图6-59

输入需要建立页面的名称,继续,如图6-60所示。

44

版权归原作者所有 仅供学习交流之用,请勿用于他途

图6-60

向导产生页面子屏幕编号和每页功能码,可以在此基础上调整,继续,如图6-61所示。

默认调用主屏幕的主程序名称,继续,如图6-62所示。

45

版权归原作者所有 仅供学习交流之用,请勿用于他途

图6-62

系统提示所示设定参数信息,单击“完全”按钮,如图6-63所示。

46

版权归原作者所有 仅供学习交流之用,请勿用于他途

图6-63 打开设计界面,系统自动建立完成全部页面、逻辑流和主程序代码,如图6-64所示。

图6-64

6.10 通过定制控制在屏幕上显示图片

可以通过“定制”对象在屏幕上显示各种控件,如图片、Tree Control、ALV、编辑器等,后面的实例将会用到这个控件。先介绍在一个定制控制对象内显示图片。

6.10.1 图片的上载

通过TCODE:SMW0上载图片,选择应用程序的二进制数据,单击查找

按钮,

如图6-65所示。

图6-65

开发类选择“SLIS”(系统中已存在的开发类),如图6-66所示。

47

版权归原作者所有 仅供学习交流之用,请勿用于他途

图6-66

屏幕显示已有对象,单击新增按钮(

),如图6-67所示。

图6-67

输入对象名称,单击输入按钮(

),如图6-68所示。

图6-68

48

版权归原作者所有 仅供学习交流之用,请勿用于他途

选择开发类后,单击保存按钮,如图6-70所示。

图6-70

产生传输入请求,单击按钮(

),如图6-71所示。

图6-71

上传成功,屏幕显示新产生的对象行,如图6-72所示。

49

版权归原作者所有 仅供学习交流之用,请勿用于他途

图6-72

相关信息在数据表“WWWDATA”可以查询到,如图6-73所示。

图6-73

50

版权归原作者所有 仅供学习交流之用,请勿用于他途

6.10.2 屏幕设计定义对象

在屏幕设计界面添加定制控制对象和“退出”按钮,如图6-74所示。

图6-74

6.10.3 图片显示程序

程序:

REPORT YTEST17 .

DATA:OK_CODE TYPE SY-UCOMM, SAVE_OK TYPE SY-UCOMM. *定义控制和图像对象定义

DATA CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER. DATA PICTURE TYPE REF TO CL_GUI_PICTURE. *初始标志字段定义 DATA INIT.

CALL SCREEN 100.

*&---------------------------------------------------------------------* *& Module USER_COMMAND_0100 INPUT

*&---------------------------------------------------------------------* * text

*----------------------------------------------------------------------* MODULE USER_COMMAND_0100 INPUT. *用户交互

SAVE_OK = OK_CODE.

51

版权归原作者所有 仅供学习交流之用,请勿用于他途

CLEAR OK_CODE. CASE SAVE_OK. WHEN 'EXIT'. LEAVE PROGRAM. ENDCASE.

ENDMODULE. \" USER_COMMAND_0100 INPUT

*&---------------------------------------------------------------------* *& Module STATUS_0100 OUTPUT

*&---------------------------------------------------------------------* * 定义状态条、包括菜单、工具条按钮、系统按钮等

*----------------------------------------------------------------------* MODULE STATUS_0100 OUTPUT. SET PF-STATUS 'STATUS1'. *如果还未创建定制对象 IF INIT IS INITIAL. *图片地址字段定义 DATA URL(255). CLEAR URL. *创建对象

CREATE OBJECT CONTAINER

EXPORTING CONTAINER_NAME = 'P1'.

CREATE OBJECT PICTURE

EXPORTING PARENT = CONTAINER EXCEPTIONS ERROR = 1. IF SY-SUBRC NE 0. ENDIF.

*定义通用函数取得图片地址

PERFORM LOAD_PIC_DB CHANGING URL. *显示图片

CALL METHOD PICTURE->LOAD_PICTURE_FROM_URL EXPORTING URL = URL. IF SY-SUBRC NE 0. ENDIF.

*置标志位已初始 INIT = 'X'.

ENDIF.

ENDMODULE. \" STATUS_0100 OUTPUT

*&---------------------------------------------------------------------* *& Form LOAD_PIC_DB

*&---------------------------------------------------------------------* * 获取图片地址通用函数

52

版权归原作者所有 仅供学习交流之用,请勿用于他途

*----------------------------------------------------------------------* * <--P_URL text

*----------------------------------------------------------------------* FORM LOAD_PIC_DB CHANGING P_URL.

DATA QUERY_TABLE LIKE W3QUERY OCCURS 1 WITH HEADER LINE. DATA HTML_TABLE LIKE W3HTML OCCURS 1. DATA RETURN_CODE LIKE W3PARAM-RET_CODE. DATA CONTENT_TYPE LIKE W3PARAM-CONT_TYPE. DATA CONTENT_LENGTH LIKE W3PARAM-CONT_LEN. DATA PIC_DATA LIKE W3MIME OCCURS 0. DATA PIC_SIZE TYPE I.

REFRESH QUERY_TABLE. *查询对象数据

QUERY_TABLE-NAME = '_OBJECT_ID'. *图片对象名称

QUERY_TABLE-VALUE = 'TESTPIC'. APPEND QUERY_TABLE.

*读取WWWDATA表,取得图片对象信息

CALL FUNCTION 'WWW_GET_MIME_OBJECT' TABLES

QUERY_STRING = QUERY_TABLE HTML = HTML_TABLE MIME = PIC_DATA CHANGING

RETURN_CODE = RETURN_CODE CONTENT_TYPE = CONTENT_TYPE CONTENT_LENGTH = CONTENT_LENGTH EXCEPTIONS

OBJECT_NOT_FOUND = 1 PARAMETER_NOT_FOUND = 2 OTHERS = 3. IF SY-SUBRC EQ 0.

PIC_SIZE = CONTENT_LENGTH. ENDIF.

*创建图片URL地址

CALL FUNCTION 'DP_CREATE_URL' EXPORTING

TYPE = 'image'

SUBTYPE = CNDP_SAP_TAB_UNKNOWN SIZE = PIC_SIZE * DATE = * TIME = * DESCRIPTION =

53

版权归原作者所有 仅供学习交流之用,请勿用于他途

LIFETIME = CNDP_LIFETIME_TRANSACTION * CACHEABLE = TABLES

DATA = PIC_DATA * FIELDS = * PROPERTIES = CHANGING

URL = URL EXCEPTIONS

DP_INVALID_PARAMETER = 1 DP_ERROR_PUT_TABLE = 2 DP_ERROR_GENERAL = 3 OTHERS = 4 .

IF SY-SUBRC <> 0.

* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF.

ENDFORM. \" LOAD_PIC_DB

6.10.4 程序输出

程序运行输出结果如图6-75所示。

54

版权归原作者所有 仅供学习交流之用,请勿用于他途

图6-75 在此基础上,可以添加图片双击等事件。

6.11 通过定制控制文本编辑器

在SAP业务系统中,大量用到文本编辑器,用文本编辑器处理内表,所以本书在屏幕上创建文本编辑器,输入相关内容后,在屏幕退出时输出编辑器内容。

6.11.1 屏幕设计定义对象

在屏幕设计界面定义控制对象,退出按钮。

6.11.2 文本编辑器程序

程序:

REPORT YTEST18.

DATA: OK_CODE TYPE SY-UCOMM, SAVE_OK TYPE SY-UCOMM. *初始标志字段定义

*定制控制和编辑对象定义 DATA: INIT,

CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER, EDITOR TYPE REF TO CL_GUI_TEXTEDIT.

DATA: M1(256) TYPE C OCCURS 0, LINE(256) TYPE C. *输入初始值

LINE = '请输入'. APPEND LINE TO M1.

CALL SCREEN 100.

REFRESH M1.

CALL METHOD EDITOR->GET_TEXT_AS_R3TABLE IMPORTING TABLE = M1. *逐行输出

LOOP AT M1 INTO LINE. WRITE / LINE. ENDLOOP.

*&---------------------------------------------------------------------*

55

版权归原作者所有 仅供学习交流之用,请勿用于他途

*& Module USER_COMMAND_0100 INPUT

*&---------------------------------------------------------------------* * text

*----------------------------------------------------------------------* MODULE USER_COMMAND_0100 INPUT. SAVE_OK = OK_CODE. CLEAR OK_CODE. CASE SAVE_OK. WHEN 'EXIT'.

LEAVE TO SCREEN 0. ENDCASE.

ENDMODULE. \" USER_COMMAND_0100 INPUT

*&---------------------------------------------------------------------* *& Module STATUS_0100 OUTPUT

*&---------------------------------------------------------------------* * text

*----------------------------------------------------------------------* MODULE STATUS_0100 OUTPUT. SET PF-STATUS 'STATUS1'. *如果还未创建定制对象 IF INIT IS INITIAL. INIT = 'X'.

CREATE OBJECT: CONTAINER EXPORTING CONTAINER_NAME = 'P1'.

CREATE OBJECT EDITOR EXPORTING

PARENT = CONTAINER

WORDWRAP_MODE = CL_GUI_TEXTEDIT=>WORDWRAP_AT_FIXED_POSITION WORDWRAP_POSITION = 256

WORDWRAP_TO_LINEBREAK_MODE = CL_GUI_TEXTEDIT=>TRUE. ENDIF.

*读入初始数据

CALL METHOD EDITOR->SET_TEXT_AS_R3TABLE EXPORTING TABLE = M1.

ENDMODULE. \" STATUS_0100 OUTPUT

6.11.3 输出

程序运行后,屏幕显示文本编辑器,在编辑框内输入文字,如图6-76所示。

56

版权归原作者所有 仅供学习交流之用,请勿用于他途

图6-76

单击“cancel”按钮,退出文本编辑器屏幕,输出内表记录,如图6-77所示。

图6-77

57

版权归原作者所有 仅供学习交流之用,请勿用于他途

6.12 列表和屏幕相互调用

6.12.1 从屏幕输入条件,列表输出数据

以SPFLI表(航空表)为例,建立一个输入字段和一个查询按钮的屏幕,当单查询按钮时,根据该输入字段检索,将数据通过列表输出。

首先建立一个程序“YTEST019”,然后建立窗口,输入TCODE:SE51,输入程序名和屏幕编号,单击“创建”按钮,如图6-78所示。

图6-78

输入描述后保存,单击

按钮,如图6-79所示。

58

版权归原作者所有 仅供学习交流之用,请勿用于他途

图6-79

添加一个文本字段,并定义名称和文本,如图6-80所示。

59

版权归原作者所有 仅供学习交流之用,请勿用于他途

图6-80

然后建立输入框,字段属性为输入输出字段,再添加“确认”按钮和“取消”按钮,如图6-81所示。

图6-81

设计逻辑流程序,如图6-82所示。

图6-82

去掉程序“MODULE USER_COMMAND_0100.”前的符号“*”,使该行生效,加入程

60

版权归原作者所有 仅供学习交流之用,请勿用于他途

序“MODULE CANCEL AT EXIT-COMMAND.”表示单击退出按钮时执行CANCEL模块。 切换到元素清单页面,加入返回变量“OK_CODE”,如图6-83所示。

图6-83

主程序:

REPORT YTEST19.

DATA: OK_CODE TYPE SY-UCOMM, SAVE_OK TYPE SY-UCOMM, SCARRID(20) TYPE C. TABLES SPFLI.

CALL SCREEN 100.

*&---------------------------------------------------------------------* *& Module CANCEL INPUT

*&---------------------------------------------------------------------* * text

*----------------------------------------------------------------------* MODULE CANCEL INPUT. LEAVE PROGRAM.

ENDMODULE. \" CANCEL INPUT

*&---------------------------------------------------------------------* *& Module USER_COMMAND_0100 INPUT

*&---------------------------------------------------------------------* * text

*----------------------------------------------------------------------*

61

版权归原作者所有 仅供学习交流之用,请勿用于他途

MODULE USER_COMMAND_0100 INPUT. SAVE_OK = OK_CODE. CLEAR OK_CODE.

IF SAVE_OK EQ 'BTN1'.

LEAVE TO LIST-PROCESSING AND RETURN TO SCREEN 0. SUPPRESS DIALOG. SELECT *

FROM SPFLI WHERE CARRID = SCARRID. WRITE: / SPFLI-CARRID,SPFLI-CONNID, SPFLI-CITYFROM,SPFLI-CITYTO. ENDSELECT. ENDIF.

WRITE: / 'DONE'.

ENDMODULE. \" USER_COMMAND_0100 INPUT

输出结果如图6-84所示,在输入框输入条件,单击“确认”按钮。

图6-84

系统输出如图6-85所示。

62

版权归原作者所有 仅供学习交流之用,请勿用于他途

图6-85

6.12.2 从列表调用屏幕

以SPFLI表(航班表)为例,在屏幕上输出列表,当双击某一行时,调用屏幕显示数据明细。

首先建立程序YTEST20,然后建立显示屏幕。

输入TCODE:SE51,建立编号100的屏幕,单击“字典字段”按钮,输入航班表后,屏幕显示表字段,选择字段,确认,如图6-86所示。

63

版权归原作者所有 仅供学习交流之用,请勿用于他途

图6-86

选择输出位置,单击后,系统自动创建输入文本和输入字段,添加退出按钮,如图6-87所示。

图6-87

单击

按钮,定义逻辑流程序,如图6-88所示。

64

版权归原作者所有 仅供学习交流之用,请勿用于他途

图6-88

切换到元素清单页面,定义变量“OK_CODE”,如图6-89所示。

图6-89

单击保存按钮,屏幕建立完成。

65

版权归原作者所有 仅供学习交流之用,请勿用于他途

主程序:

REPORT YTEST20 . TABLES SPFLI.

START-OF-SELECTION. SELECT * FROM SPFLI.

WRITE: / SPFLI-CARRID, (15) SPFLI-CONNID,

(15) SPFLI-COUNTRYTO, (15) SPFLI-CITYFROM, (15) SPFLI-AIRPFROM.

HIDE: SPFLI-CARRID,SPFLI-CONNID,SPFLI-COUNTRYFR, SPFLI-CITYFROM,SPFLI-AIRPFROM,SPFLI-COUNTRYTO, SPFLI-CITYTO,SPFLI-AIRPTO. ENDSELECT.

AT LINE-SELECTION.

CHECK NOT SPFLI-CARRID IS INITIAL. CALL SCREEN 100.

*&---------------------------------------------------------------------* *& Module CANCEL INPUT

*&---------------------------------------------------------------------* * text

*----------------------------------------------------------------------* MODULE CANCEL INPUT. LEAVE PROGRAM.

ENDMODULE. \" CANCEL INPUT

*&---------------------------------------------------------------------* *& Module USER_COMMAND_0100 INPUT

*&---------------------------------------------------------------------* * text

*----------------------------------------------------------------------* MODULE USER_COMMAND_0100 INPUT.

ENDMODULE. \" USER_COMMAND_0100 INPUT 执行结果如图6-90所示。

66

版权归原作者所有 仅供学习交流之用,请勿用于他途

图6-90 当选择某一行,输出结果如图6-91所示。

图6-91

67

因篇幅问题不能全部显示,请点此查看更多更全内容

Top