ABAP语法详解教材第205章修改屏幕.docx
《ABAP语法详解教材第205章修改屏幕.docx》由会员分享,可在线阅读,更多相关《ABAP语法详解教材第205章修改屏幕.docx(14页珍藏版)》请在冰豆网上搜索。
ABAP语法详解教材第205章修改屏幕
第五章a修改屏幕
概览
运行时可以用许多不同的方式修改屏幕:
内容
修改屏幕
设置屏幕字段属性
用功能“字段选择”更改屏幕字段属性
字段选择-概述
调用字段选择
属性的组合规则
屏幕制作器属性
生成字段选择
字段选择的功能模块
链接字段
搾示属性‘激活⁾
字段选择掀权
使用子屏幕
使攨ᅉ标
_在动态程序中设置字段属性
可以在对话程序中临时♴改字段属性(例如输入/输出孓段,强ሶ字段)。
也可以临时禁用字段。
使用该技末动态修改屏幕通常意味着可以避免定้附加屏幕。
_可以在功能孇段选择的帮助上更改字段属性。
刟能字段选择攭持用户动态修改屏幕的属性。
_圠运行时显示子尌幕
为了在运行时增强现有的屏幕,可以显示子屏幕。
䭐屏展用于有选择地显示某些字段。
例如,可以有两个子屏幕,一个包含“牨料名称”和“剩料数目”字段,另一个包含“客户名称”和“客户数盤”字段。
根据用䈷在上一个屏幕中的输入选定两个子屏幕之一。
_选择光标位置
根据用户的输入,可以在对话程序中将光标放在屏幕上的特定字段中。
圈下面的窠节中可以找到详细信息:
设置屏幕字段属性(页5–2)
用力能“字段选择”更改屏幕字段属性(页5–4)
使用子屏幕(頵5–16)
使用光标(页5–17)
a讼繮屏幕字殱属性
每个屏幕字段都有用户在定义屏幕时在屏幕制作器中设置的属性。
在运行时,根据用户在上一个屏幕中请求的功能,可能需要更改这些属性。
在运行时,每个屏幕字段的属性存储在名为SCREEN的内存表格中。
不必在程序中声明该表格,系统内部维护该表格并且在每次屏幕更改时更新它。
内存表格SCREEN包括下列字段:
名称
长度
说明
NAME
30
屏幕字段的名称
GROUP1
3
属于字段组1的字段
GROUP2
3
属于字段组2的字段
GROUP3
3
属于字段组3的字段
GROUP4
3
属于字段组4的字段
ACTIVE
1
可见并准备输入的字段
REQUIRED
1
字段输入是强制的
INPUT
1
字段准备输入
OUTPUT
1
字段仅用于显示
INTENSIFIED
1
高亮显示字段
INVISIBLE
1
禁用字段
LENGTH
1
减少字段输出长度
DISPLAY_3D
1
以三维框架显示字段
VALUE_HELP
1
显示有值帮助的字段
要激活字段属性,则将它的值设置为1。
要使它无效,则将它设置为0。
将ACTIVE属性设置为0时,系统禁用字段并取消准备输入属性。
用户不能查看字段也不能对它输入值。
用户可以在屏幕制作器字段列表中的“1个字段的属性”部分中为每个属性定义值。
如果需要关于属性含义的详细信息,参见ABAP/4开发工作台:
工具(页Error!
Notavalidlink.)。
动态修改屏幕的示例,从事务tz50开始(开发级别SDWA)。
事务包含两个屏幕。
在第一个屏幕中,用户可以输入航班标识符以及请求航班详情(按“显示”按钮)或按“更改”按钮来更改屏幕200的数据。
现在根据选定了“显示”按钮还是“更改”按钮,动态设置字段属性。
在两种情况下都调用同一屏幕,但有不同的字段属性。
如果需要同时为多个字段更改相同的属性,则可以将这些字段组合在一起。
例如,为了在屏幕200中动态更改字段,我们将这些在屏幕制作器中的字段分配给组MOD。
用户可以为每个字段最多指定四个修改组。
“组”字段的内容存储在SCREEN表格中。
可以在PBO模块中实现对该组中字段属性的更改:
MODULEMODIFY_SCREENOUTPUT.
CHECKMODE=CON_SHOW.
LOOPATSCREEN.
CHECKSCREEN-GROUP1='MOD'.
SCREEN-INPUT='0'.
MODIFYSCREEN.
ENDLOOP.
ENDMODULE.
内存表格SCREEN包含当前屏幕的每个字段和它的属性。
LOOPATSCREEN语句将该信息放在该系统表格的表头行中。
在事务tz50的该示例中,如果用户选择“显示”,则将SCREEN-INPUT设置为‘0’,并且所有属于MOD组的字段因此而成为只显示字段。
由于属性已更改,MODIFYSCREEN语句用于将表头行写回表格。
b用功能“字段选择”更改屏幕字段属性
本主题描述特殊功能“字段选择―(事务SIAW和一些功能模块如何_支⌁动态更改屏幕字段属性。
b字段选择-概述
功能“字段选择”允许用户在运行时动态更改屏幕字段的属性。
但只有在由于技术原因需要经常将不同字段属性分配给相同屏幕时才使用该选项。
在这种情况下,所有字段使用相同的规则,因此任何孇段修改都怯清楚的。
基本规则应用如下:
_字段选择进程中涉及的所有字段在字段选择表格中组合在一起并用“字段选择”功能廴护。
_维护通常是通过模块池和屏幕组进行的ဂ
__在属于屏幕组“空格”(‘_‑)的屏幕上没有动态字段选⋩。
_由于屏幕字段属性SCREEN-GROUP1是为中心字段选择而保留的,因此不能同时将它用于兖它目的。
_如果正在使用特殊的袄定义规则使任何更┹等同于程序更攩,则不要使用该功能,而在程序本身中更改。
用字段选择可以在运行时激活或撤消下列属性:
_输入
_输出
_强制
_激活
_高亮显示
_不可见
用户也可以确定有关更改的条件和类型。
在事件PROCESSBEFOREOUTPUT中可以调用功能模块来检查条件和更改属性(如果必要的话)。
字段选择区分有影响的字段和修改的字段。
当然修改的字段必须是屏幕字段。
所有字段应该在数据词典中定义,并且应该用TABLES语句在模块池中全局声明相应的表格。
在运行时,功能模块分析影响字段的内容,然后相应设置修改字段的属性。
在屏幕组中组合屏幕
用户可以将逻辑上相关的屏幕组合在屏幕组中,而不是为程序的每个屏幕单独维护字段选择。
要将屏幕分配给屏幕组,请在屏幕制作器属性屏幕上的字段“屏幕组”中输入组。
c调用字段选择
要调用字段选择,选定“工具->ABAP/4工作台->开发->其它功能->字段选择”。
维护是通过程序和屏幕组进行的。
首先必须声名有关字段的表格名。
选择“将表格分配给屏幕组”并输入表格,例如:
保存条目并选择“有影响的字段”将所需的影响字段输入到列表中,并有选择地指定NOT条件、默认值以及字段“客户”,例如:
NOT条件理解为预选择。
如果字段之一满足NOT条件,则它与下列屏幕的修改是不相关的。
使用NOT条件可以提高性能。
有影响的字段:
SPFLI-CARRID
NOT条件:
NELH
仅当SPFLI-CARRID的内容在运行时与LH相同时它与字段选择才是相关的。
在运行时,如果系统在维护值的列表中找不到影响字段的当前值,则使用默认值。
用户必须自己定义默认值。
该选项允许用户维护影响字段的所有格式,这些格式有相同的影响,带有单个条目。
用字段“客户”,用户可以决定是否允许客户使用字段选择的相应字段。
如果标记为“客户”,那么客户也可以使用该字段来影响其它字段。
然后选择“修改的字段”将所有可修改的字段输入到列表中,例如:
如果想允许客户修改字段,则再次标记字段“客户”。
每个有影响的和可修改的字段都有每个程序唯一的内部号。
当按F16生成时,内部号将自动放入适当屏幕的SCREEN-GROUP1中并且不能在屏幕制作器中更改它。
这就允许系统在字段名和SCREEN-GROUP1之间建立一对一的关系。
最后创建两个列表的有影响的和可修改字段之间的链接:
指定有影响的字段中影响可修改字段的内容和方式。
要链接字段,请用“选择”从列表中选定字段或双击它。
如果选定一个有影响的字段,则出现可修改字段的列表,反之亦然。
从该列表中选定所需的链接。
出现可以在其中输入相关条件的列表,例如:
上面的条目导致禁止在这些屏幕上显示字段SPFLI-AIRPFROM,在这些屏幕的PBO中调用相应的字段选择功能模块,并且如果调用SPFLI-CARRID则包含‘LH’(参见字段选择的功能模块(页5–10))。
“激活”属性的功能在显示属性‘激活’(页5–16)中说明。
c属性的组合规则
如果多个有影响字段影响同一个修改的字段,则必须有组合规则来确定如何链接这些影响。
如果由不同的影响激活或解除激活,则使用下面的表格了解如何设置单个字段属性。
屏幕处理器控制多个属性的组合。
输入
字段1
'_'
'X'
字段2
'_'
'_'
'_'
'X'
'_'
'X'
输出
字段1
'_'
'X'
字段2
'_'
'_'
'_'
'X'
'_'
'X'
激活
字段1
'_'
'X'
字段2
'_'
'_'
'_'
'X'
'_'
'X'
强制
字段1
'_'
'X'
字段2
'_'
'_'
'X'
'X'
'X'
'X'
高亮显示
字段1
'_'
'X'
字段2
'_'
'_'
'X'
'X'
'X'
'X'
不可见
字段1
'_'
'X'
字段2
'_'
'_'
'X'
'X'
'X'
'X'
字符说明:
_=关闭(off),X=打开(on)
如果字段1使某个屏幕字段不可见(X),则字段2不能更改。
d屏幕制作器属性
用屏幕制作器,系统不仅考虑在字段选择期间制作的条目,而且考虑在屏幕制作器中制作的任何条目。
意思是根据在属性的组合规则(页c)中所述的相同链接规则将上面组合的结果链接到屏幕字段属性。
要利用全部的动态修改范围,应该在屏幕制作器中使用下列属性:
Input='X'
Output='X'
Mandatory='_'
Invisible='_'
Highlighted='_'.
相反地,用户不能以下列方式更改在屏幕上定义的值:
Input='_'
Output='_'
Mandatory='X'
Invisible='X'
Highlighted='X'
假设输入了影响的下列组合,但因为组合规则规定其它的有影响字段(或者屏幕)不能更改指定的显示属性,所以它实际上不是有效的组合。
Input='X'
Output='X'
Active='X'
Mandatory='_'
Highlighted='_'
Invisible='_'
再次进入字段选择时不显示这样的无效影响,除非已经为影响字段定义了默认值;此处,显示和维护这样的影响是有用的。
e生成字段选择
如果确实更改了已修改字段的列表,则必须生成字段选择。
这将在相关模块池的屏幕中为修改的SCREEN-GROUP1字段产生连续号。
为此,在事务SFAW中选择“生成”。
e字段选择的功能模块
要激活屏幕的字段选择,可以在PROCESSBEFOREOUTPUT事件中调用FIELD_SELECTION_MODIFY_ALL或FIELD_SELECTION_MODIFY_SINGLE。
两个功能模块都决定有影响字段的内容,如果需要的话,参见组合规则并执行屏幕修改。
FIELD_SELECTION_MODIFY_ALL自己执行LOOPATSCREEN语句。
但是如果用FIELD_SELECTION_MODIFY_SINGLE,用户必须自己编码并且在该循环中调用功能模块。
因此用户可以在LOOP中执行自己的附加屏幕修改。
在事件PBO中调用功能模块示例:
CALLFUNCTION'FIELD_SELECTION_MODIFY_ALL'
EXPORTINGMODULEPOOL=MODULEPOOL
SCREENGROUP=SCRGRP.
或
LOOPATSCREEN.
IFSCREEN_GROUP1NESPACEAND
SCREEN-GROUP1NE'000'.
CALLFUNCTION'FIELD_SELECTION_MODIFY_SINGLE'
EXPORTINGMODULEPOOL=MODULEPOOL
SCREENGROUP=SCRGRP.
*Separatespecialrules
MODIFYSCREEN.
ENDIF.
ENDLOOP.
或
与a)一样,但为特殊规则包括自己的LOOPATSCREEN。
在每个单独的情况下,用户必须决定哪个选项b)或c)将获得最佳性能。
由于“模块池”和“屏幕组”参数决定字段选择,因此必须为它们维护影响。
“模块池”参数定义在主存中用于搜索影响字段当前值的已加载模块池。
调用功能模块时,必须直接包括系统字段SY-REPID和SY-DYNGR。
将它们的内容直接传输到其它字段的适当代码位置,例如:
MODULEPOOL=SY-REPID.
SCRGRP=SY-DYNGR
有些时候,“模块池”的值与当前SY-REPID值可能不同。
如果“屏幕组”参数为空,则系统使用SY-DYNGR的当前内容。
这对于“模块池”参数是不可能的,因为值“_”(空白)禁止修改任何字段。
注意在开发级别SDWA中与TZ50类似的事务(参见设置屏幕字段属性(页a))。
假设第二个屏幕的动态程序包含PBO事件中的下列模块调用:
PROCESSBEFOREOUTPUT.
...
MODULEMODIFY_SCREEN.
假设模块MODIFY_SCREEN包含下列函数调用:
MODULEMODIFY_SCREENOUTPUT.
CALLFUNCTION'FIELD_SELECTION_MODIFY_ALL'
EXPORTING
SCREENGROUP='SCREEN'
MODULEPOOL='SAPMTXXX'
EXCEPTIONS
OTHERS=1.
假设对于屏幕组SCREEN和模块池SAPMTXXX,按调用字段选择(页c)中图表所示维护事务SFAW中的影响。
调用事务后,假设已经制作了这些条目:
选择“更改”后,出现下列屏幕:
但是,如果输入‘AA’航空公司代替‘LH’,则显示下列屏幕:
当输入‘LH’时,字段SPFLI-AIRPFROM是不可见的。
当输入‘AA’时,它显示为“机场部门”。
f链接字段
每个有影响字段可以影响那些忽略其它字段而进行修改的字段。
在某些情况下需要有影响字段的链接,但只有通过帮助字段的定义才有可能实现链接,必须在调用功能模块之前在应用程序中设置帮助字段(参见属性的组合规则(页c))。
该限制有助于字段选择的透明度。
链接示例
假设下列字段:
有影响字段:
F4711,F4712
可以修改的字段:
M4711
下列情况只能通过迂回的方式实现:
OR条件和“输入准备”
如果F4711='A'ORF4712='B',
那么M4711准备输入。
解决
在SFAW中将H4711定义为有影响字段,
在SFAW中定义下列条件:
如果H4711='AB'
那么M4711可以输入(也就是说,输入='X')
在应用程序中,必须在调用功能模块前进行下列编程:
IFF4711='A'ORF4712='B'.
H4711='AB'.
ENDIF.
AND条件和“强制”
如果F4711='A'ANDF4712='B',
那么必须M4711。
解决:
在字段选择中维护:
如果H4711='AB',
那么M4711是所需的条目字段
(H4711='AB'仅在上面的AND条件下才精确)。
在应用程序中,编程:
IFF4711='A'ANDF4712='B'
H4711='AB'
ELSE.
H4711=....
ENDIF.
另一方面,可以直接表现下列情况:
AND条件和“输入准备”
如果F4711='A'ANDF4712='B',
那么M4711准备输入。
因此:
如果F4711<>'A'ORF4712<>'B'
解决:
屏幕:
M4711准备输入
字段选择:
有影响字段F4711值'A'输入='X'
值'A1'输入=''
值'AX'输入=''
有影响字段F4712值'B'Input='X'
值'B1'输入=''
值'BX'输入=''
OR条件和“强制”
如果F4711='A'ORF4712='B',
那么M4711是所需的条目字段。
解决:
屏幕:
关闭了强制
有影响字段F4711值'A',
强制='X'
有影响字段F4712值'B',
强制='X'
为有影响字段而定义NOT条件的可能性提供了字段选择定义的更多变体。
h显示属性‘激活’
目前该显示属性只有一种结果。
如果在ABAP/4程序中SCREEN-ACTIVE='0',则用MODIFYSCREEN语句在运行时发生下列结果:
SCREEN-INPUT='0'
SCREEN-OUTPUT='0'
SCREEN-INVISIBLE='1'
如果SCREEN-ACTIVE='1',则不发生任何事情。
另一方面,如果SCREEN-INPUT='0'、SCREEN-OUTPUT='0'并且SCREEN-INVISIBLE='1',则内部结果将是SCREEN-ACTIVE='0'(无后继步骤)。
甚至当SCREEN-ACTIVE='0'时,在屏幕流逻辑中用相关FIELD语句指定的模块总在运行。
但是不运行有撤消激活字段的模块。
如果不想这么做,可以用句号分隔FIELD和MODULE语句。
如果非活动字段有附加的规范,如ONINPUT、ONREQUEST...,则屏幕模块不运行,通常处理没有附加规范的模块。
h字段选择授权
“字段选择”的授权对象是“中心字段选择”(S-FIELDSEL)。
该对象包含一个活动和一个程序授权组。
后者是从程序授权中获得的。
允许下列活动:
'02'=更改
'03'=显示
'14'=在屏幕上生成字段选择信息
'15'=将相关表格分配给字段选择
i使用子屏幕
子屏幕是显示在另一个(“主”)屏幕区域中的独立屏幕。
用户可能想使用子屏幕来改变主屏幕中的某些字段。
例如,根据用户在上一个屏幕中的输入,可以在出现补充字段的主屏幕中定义一个区域。
按下列方式创建子屏幕:
1.在“主”屏幕中调整子屏幕的框架直到它的大小符合需要。
在“字段名”字段中命名子屏幕。
2.用屏幕类型“子屏幕”创建屏幕。
3.在子屏幕中排列字段使它们显示在主屏幕中所要求的地方。
如果定义的子屏幕比主屏幕中的可用区域大,则只有与可用区域相当大小的部分子屏幕可见(从左上角计)。
要使用子屏幕,必须在主屏幕的流逻辑(PBO和PAI)中调用它。
CALLSUBSCREEN语句告诉系统将子屏幕的PBO和PAI事件作为主屏幕的PBO和PAI事件的一部分执行。
就象为主屏幕编程一样为子屏幕编码ABAP/4模块。
主程序的流逻辑如下所示:
PROCESSBEFOREOUPTPUT.
...
CALLSUBSCREENINCLUDING.
...
PROCESSAFTERINPUT.
...
CALLSUBSCREEN.
...
“区”是在主屏幕中定义的子屏幕区域的名称。
该名称最多可有十个字符。
“程序”是子屏幕所属程序的名称,“屏幕”是子屏幕的编号。
在单个屏幕中可能有多个子屏幕。
也可以在运行时动态指定子屏幕。
子屏幕有几个限制。
它们不能:
_设置它们自己的GUI状态
_有已命名的“确定代码”
_调用其它屏幕
_包含ATEXIT-COMMAND模块
_支持光标位置。
i使用光标
在PBO事件中,可以告诉系统将光标放在某些屏幕字段上。
光标的放置是一种使事务更友好的方式。