原因就是在屏幕设计界面中,命名时写成了小写了: 所以屏幕字段命名时一定要大写(好像小写时,如果不在屏幕逻辑流中使用时也是可行的,但一旦用在屏幕逻辑流中进,就会出问题),正确的做法是在输入名称之后,回车一下,则名称会自动转换为大小: 示例:屏幕元素自动参考数据词典(或程序)中的表或结构字段 如果屏幕上的元素字段参考的是数据词典的字段(屏幕元素的名称为表名-字段名的形式)时,必须在ABAP程序里使用TABLES语句来定义这个表接口,这样就可以通过这个表接口在屏幕与ABAP程序之间自动的进行数据传递: 另外,也可以是只引用一个或几个数据词典中某个表中一个或几个字段,不一定要引用整张表。再次,这些参照词典中的字段需要将以下钩上: 当给某个屏幕字段命名时,如果这个字段的名称为“表名(或结构)-字段名”形式时,回车时系统会提示: 注:由于Airline配置了Check Table,如果输入的Airline不合法,则不会执行PAI事件,所以在执行PAI事件前,数据词典中所设置的数据有效性会先进行检查。 当用户在对话屏幕上触发一个命令时,会将命令所对应的Function Code复制到对话屏幕上一个特殊的隐藏字段OK_CODE中,如果在ABAP中具有一个与对话屏幕这个隐藏字段同名的OK_CODE时,则在屏幕字段向内存字段进行同名拷贝时,屏幕上的这个隐藏字段OK_CODE的值也将会被自动拷贝到程序中的这个字段中,然后就可以在PAI事件块里调用ABAP中的Module中使用此隐藏字段 注意,此图还有点问题,如果是针对回车键(命令行中未输入内容时回车)是对的,但如果按的是屏幕中的未分配Function Code的按钮时,虽然不会重置OK_CODE,但还是会重置SYST- UCOMM 与 SY-UCOMM。 为什么要将ok_code拷贝一次? 在程序中你应该使用OK_CODE来代替SY-UCOMM,这有两种原因:第一,ABAP程序可以完全控制在它里面定义的变量,第二,你不应该修改ABAP系统变量的值。然而,你必须在ABAP程序中清空OK_CODE,因为以下几个原因:如果一个屏幕中的某个按钮未设置Function Code时也是可以触发PAI事件时,并且由于其Function Code。所以一般情况下在使用OK_CODE之前,先将OK_CODE拷贝到S***E_OK变量中,并随后将OK_CODE清空,以便为下一次PAI事件所使用做准备(比如下一屏幕直接在屏幕上按回车时,Function UCOMM 与 SY-UCOMM也不会被重新设置为空。 每个屏幕的OK字段都可以用不同的名字,但是,最好的做法是每个屏幕中的OK字段都叫OK_CODE,这样的话ABAP程序中只需要定义一个名称为OK_CODE的变量即可以接受所屏幕中的OK字段值(即Function Code) 2、 菜单条:包含了可扩展的菜单,其中每个子菜单项都指向一个应用程序的功能,其中“System”、“Help”两个菜单项不能被应用程序更改和扩展,因此这类菜单荋以及其中的子菜单项将出现在每一个应用的屏幕中。 每个屏幕都会有系统标准工具条(Standard Toolbar),包含的按钮代表了所有屏幕中都会用到的系统功能,如保存、回退、取消等。可以为菜单项和工具条项分配功能键(FunctionKeys),这样当用户在屏幕按下相应的功能键时,相当于执行了已经分配了这个功能的菜单项。 应用工具条(ApplicationToolbar)是与特定应用相关的工具条,集成了当前屏幕常用的功能。 若为ABAP屏幕分配一个GUI Status、GUI Title,则该屏幕的所有后续屏幕缺省都有了该Status、Title,如果想在后续的子屏幕中更换成另外一个不同的Title,则需要重新设置 除开“System”与“Help”菜单,最多还可以创建6个菜单项 此种类型的Status用在如下类型的普通屏幕中: 通过Menu Bar可以创建新的菜单,在创建时不需要分配键盘快捷键,但可以在Function Keys设置部分中的Freely Assigned Function Keys(此类型的Function Key——快捷键,可由用户自己自由分配)中为菜单设置一个键盘快捷键,这样不需要通过鼠标点击菜单而是通过所设置的快捷键来代替鼠标; 通过Application Toolbar创建应用工具条件上的按钮的过程中,会弹出一个设置快捷键的对话框要求设置快捷键,所以创建自定义应用工具条时一定要分配一个键盘快捷键; Function Keys中的Standard Toolbar不需要设置快捷键(正是因为这些为标准工具条,已经为这些固有的图标绑定了快捷键,并且这些快捷键被系统所保留使用),因为这些是预设的标准工具条(因为标准工具条上有哪些功能图标是不能再由我们自己定义了,只能使用上面预设的那几个,如果要使用,只需要输入相应的Function 具体的内置快捷键可以通过以下方式来查看: 另外,也可以设置一个与菜单或工具条按钮无关的纯粹的快捷键,如上面的Function Code为 SHORTCUT 的快捷键。 不管是菜单、工具条按钮、还是快捷键最终都会触发PAI事件,并且会将所对应的Function Code会存储到SY-UCOMM系统变量中。 上面的Recommended Function Key Setting(此类型的Function Key——快键捷,已经被系统推荐使用,所以最好不要另作其它用途,如F2为查看详情,相当于鼠标双击)部分的为推荐部分,当不输入FunctionCode时,相应的功能不会被激活,只要输入了Function code则会激活相应功能,Function Code可以任意,相应功能不需要我们写代码去实现了,因为系统已具备这样的功能。 (F12)中的一个功能,并实现相应代码,以便用户能够离开屏幕(如果将 设置为BREAK时(具体什么值与屏幕的类型有关系:选择屏幕、List列表输出屏幕、对话屏幕都是不一样,如要使用系统提供的默认实现,则一定要按要求值给出,具体值请参考后面),会自动的leave Code传递给SY-UCOMM或OK_CODE(在Screen中)字段(如果未输入,则不会输入到SY-UCOMM或OK_CODE中,但会触发PAI事件) F2(鼠标双击):在预设中,F2已经与鼠标的双击关联起来了,F2已具有了鼠标双击的功能。当用户按了F2或在屏幕上双击了鼠标都会触发PAI事件,所以F2是一个很特别的键,一般不要拿来作其他功能使用。 Shift + F10(鼠标右键):该组合键已经被分配给了鼠标右击功能,不能再用于其他用途。注意:有时鼠标右键弹不出右键菜单,这是因为选中了快捷剪切和粘贴功能了,去掉即可,否则只能使用Shift + F10快捷键或者使用Shift+鼠标右击才能弹出右键菜单: 选择屏幕与List列表输入屏幕上的标准工具按钮FunctionCode需要如下输入才能使用系统提供的默认的功能(不需要我们再实现): 此种类型的Status用在如下类型模态屏幕中: Toolbar部分进行了分配,这些功能图标将会在对话框屏幕下方出现,如: (但不知为什么上面红色字体的 ENTER 没有显示??后来找到原因了:是因为Function Code被去激活了: 该类型的Status用作右键菜单 当需要为ALV报表或普通程序绘制Status时,我们先可以拷贝标准的Status,则在此基础上修改即可: 如果不是ALV,是Write输入时,拷贝: 两种方式创建屏幕字段 从词典中获取 对话屏幕与程序之间的数据传输 在ABAP对话屏幕编程中,对话屏幕与程序之间的数据自动传输发生在:屏幕字段名与程序中定义的同名的全局变量之间,此变量一般可以是普通的类型的单变量,但更多是定义成结构体变量。下面以结构体变量为传输体来了解数据传输过程。 使用TABLE语句来定义一个内存结构体变量,该结构中的字段与对话屏幕上的各输入字段是一一对应的,即名称与类型都相同。TABLE后面的数据类型可以是词典中的结构类型或透明表类型,具定义出来的结构体变量名与后面指定的词典结构类型及透明表类型一致,例如: 因为结构体变量中的各字段与对话屏幕上的各输入字段具有对应关系,因此,该结构体变量被用作屏幕与程序之间的数据传输通道: 上图中,使用了词典中的结构体类型sdyn_conn定义了一个内存变量sdyn_conn,而对话屏幕100上的各个字段的定义也是来自于结构体类型sdyn_conn,因此,内存变量sdyn_conn将作为屏幕100与调用它的程序之间的数据传输通道:即在屏幕100的PBO事件完成后,内存变量sdyn_conn中的各字段值将自动传输给对应的屏幕字段;当用户在屏幕上点击确认结束输入后,在触发PAI事件之前,各屏幕的字段的值将自动传输给内存变量sdyn_conn相应各同名字段中,因此,可以在PAI事件块中对结构体变量sdyn_conn进行处理。 工具栏中按键之间的分隔符 其中“分隔符”的插入方法为:在需要插入分隔符的方框内选择菜单“Edit—>Insert——>Separator line”即可插入分隔符
仅只有未出现在FIELD语句中的屏幕字段才会在PAI事件块处理前传输到ABAP程序中去。所以当某个屏幕字段出现在FIELD语句中,并且在该 FIELD语句未执行完之前,不要在PAI dialog modules中使用该屏幕字段(该屏幕字段相关的FIELD语句执行完成之后才可以在后续的PAI dialog
modules调用中使用),否则,ABAP程序同名字段中的值使用的是前一次对话屏幕中所设置的值。 注意:要使鼠标双击屏幕输入元素时AT CURSOR-SELECTION生效,还必须在GUI Status里设置:将F2(一般使用F2,不要使用别的快捷键,因为F2本来就是系统预设的鼠标功能)所对应的Function Code为CS,并且Function Type为S,此时才能激活鼠标双击功能: 也可以在Domain中指定一个值表(Value Table)作为字段取值范围的限制,但是与指定固定值的方式不同的是,为一个Domain简单地指定一个取值表不会导致用户的输入被自动校验,也不会自动出现F4 Help。只有通过表外键 按钮将该Value Table指定为主表之后,一个值表才能真正成为Check Table。所以要想成为真正有效的Check Table,必须要做两个操作: 一是要为字段对应的Domain设置Value Table(即主表,其实这一步不是必须的,在通过 按钮指定主表时,可以不用指定为字段所参照的元素所对应Domain所设置的Value Table,而是指定其他的主表也是可以的—— 但最好不要这样做,Value Check时会出其他问题), 注:命中清单中的ID列即CARRID背景色不是蓝色,所以选择一条时,不会自动填充屏幕字段P_CARID,原因是对应的Search Help中的CARRID参数对应的EXP没有打上钩: 如果将这个钩打上,则会相应列背景色会为蓝色,且会自动填充,达到联动效果。 一般当某个外键所参照主表的主键上如果设置了搜索帮助(如上面COUNTER外键所引用的主表主键字段SCOUNTER-COUNTNUM已分配搜索“SCOUNTER_CARRIER_AIRPORT”: ),则这个主表主键上的搜帮助会带到从表中相应外键上来,请看上面的SBOOK-COUNTER外键字段的搜索帮助也为“SCOUNTER_CARRIER_AIRPORT”,该搜索帮助决定了整个F4 Help处理及显示过程(如联动查询及自动填充效果)。另外,虽然主表主键上的搜索帮助会带到相应外键上来,但带过来后还可以修改,比如上面示例中带过来的搜索帮助中,CARRID参数所对应的EXP没有钩上,所以示例中的屏幕字段P_CARID不能使用命中清单中的ID列来自动填中,所以我们可以新建一个搜索帮助,并将CARRID搜索参数所对应的EXP钩上,则可达到自动上屏幕的效果; 另外,有些外键所参照的主表主键没有指定搜索帮助,此时参考的从表(或主表)屏幕字段的F4 Help就只有一个简单的字段了,如上面SBOOK-LOCCURKEY字段: 创建搜索帮助时,搜索帮助的数据源可以来于:表/视图(通过“选择方法”指定)、ABAP程序(通过“搜索帮助出口”指定)。下面以视图为源来创建搜索帮助。 SE11中,SAP提供了一种“帮助视图”,专门为维护搜索帮助设立的,该类视图提供表的关联信息,不会在数据库服务器上占用实际的物理空间。 创建交货订单信息相关视图: 需要在帮助视图中显示的字段有:LIKP-VBELN交货单号;LIKP-KUNNR货物送达方的编码;KNA1-NAME1送达方的名称;VBUK-WBSTK交货单状态,“C”表示已交货 基本索引帮助:最基本也是“集合搜索帮助”组成部分的帮助,如果按F4后显示条件限制对话框,则只会有一个限制条件页面; 集合搜索帮助(collective search help):是由多个基本索引帮助组成的,中可以包含多个search help,这个也就是我们看到的选择界面有多个tab的那种情况。如果按F4后显示条件限制对话框,则会有多个条件限制页面TAB标签,即可以选择不同的“基本索引帮助”来筛选数据 l 简短描述:设置的简短描述不是限制对话框中的标题。限制对话框中的标题如何设置??? l 选择方法(selecttion method):可以是选数据表,或者是视图。当所选择的表有text table时,会自动填充下面的“文本表”标签,并且search help会根据用户登录语言自动选择相应的text。 l 限制对话框行为:按F4后是否弹出条件过滤对话框,有以下三种选择: 2 立即显示值:在按F4后立即显示命中清单,不会弹出限制对话框,通常如果命中清单记录很少时则建议使用该选项。 2 具有值限制的对话:立即显示限制值的对话框。如果正常情况下可能条目的清单非常大,则选择该选项。 2 根据值集合的对话:如果命中清单包含的条目小于100个,那么立即显示该命中清单。如果其包含的条目多余100个,那么显示限制值用的对话框。 l 快捷键:此键只在该基本搜索帮助包括到某个集合搜索帮助里时,才可使用(有意义)??作用是在集合搜索帮助的限制对话框中,出现了多个限制TAB标签页面,所以可以使用此处设置的键快速切换到相应的TAB标签页面???? HOT KEY是用来做多个search help合并时用到的,决定出现的顺序。 l 搜索帮助出口(search help exit):可以用作此搜索帮助的增强函数,对搜索出来的数据进一步进行处理。如下面出口中,在命中清单显示之前,对数据进行过滤处理: (代码中STRING+3(4)取的是搜索帮助的第一个参数,但如果是在 CALLCO***OL-STEP = RETURN时间点时,STRING+0(4)才是第一个搜索帮助参数,因RECORD_TAB在不同时间点可能是变化着的,具体请参照后面IMP、EXP参数详细说明) l 搜索帮助参数:来自于数据库表或视图中的字段 2 IMP:输入参数。表示屏幕上相应字段是否作为搜索帮助的过滤条件(即报表选择屏幕上的字段的值是否从报表选择屏幕上传递到搜索帮助中去) 如果是F4字段时,屏幕字段中的值包含“*”时,才会将F4字段传递到Search Help中。除开F4屏幕字段外,而其他只要是Link到了相应的Search Help参数的屏幕字段,则不管IMP是否钩选上,只要相应屏幕字段中有值,则会传入到搜索中作为过滤条件。所以IMP是否钩选上,只会影响该参数所Link到的F4屏幕字段值是否传入到搜索帮助,而其他非F4屏幕字段,只要与搜索帮助相应参数Link过,不管IMP参数是否钩先,则屏幕字段值都会传入到搜索帮助中。 另外,如果要对已传入的屏幕字段值进行再次修改,则可以将搜索帮助的“对话框性为—对话类型”设为“C 具有值限制的对话”,传入的屏幕字段值会在弹出限制对话框中相应字段中显示,此时就可以对这些值做进一步修改;如果没有弹出限制对话框,则屏幕上传入的值不会再次被修改的可能,会直接传入到搜索帮助作为过滤条件 注:上图中只有屏幕字段是参照表或结构字段而非通过编程来绑定Help时,在搜索帮助查询时,除了可以将F4屏幕字段传入到搜索帮助中(前提是值中有“*”,且IMP被钩选过了)作为搜索帮助的过滤条件,其他非F4屏幕字段(与搜索参数有Link关系的屏幕字段)的值也会传入到搜索帮助中作为搜索条件;在返回时,会将相应的命中清单中的列(这些列与屏幕字段是有映射关系)自动填充到相应的屏幕字段中。另外,如果是通过程序方式 MATCHCODE绑定(或其通过Data Element绑定)时,则在查询时不会将其他非F4屏幕字段传入到搜索帮助时,也不会在返回时填充其他非F4屏幕字段,在返回时,会默认返回 EXP中第一个钩选列到F4屏幕字段中。 2 EXP:输出参数,表示搜索帮助的此列会从搜索帮助中传递到报表选择屏幕上(表示F4选中一条记录后显示到屏幕上文本框中的值——背景字段为浅蓝色的列的数据会被输出,输出的数据可能是多列。注:只有当EXP钩上且相应字段出现在了屏幕上,才会自动填充到相应屏幕字段,如果没有钩上——没钩上的字段背景色为白色,即使出现在了屏幕上,选择命中清单时也不会自动填充),且F4字段一定要将EXP钩上(否则选择后F4字段不能上屏)。可以通过return_tab(具体可以参考自定义对话屏幕字段F4中相应代码解释)参数接收用户所选择的数据。 Help时,即使EXP有多列被钩选,也只有最前面被钩选的列的背景色为浅蓝色,如果此时也要使被钩选的所有EXP列背景色为浅蓝色,则可以通过修改内表中SHLPOUTPUT字段的值来达此目的,因为调试发现在CALLCO***OL-STEP= DISP 时间点之前时,如果此时SHLPOUTPUT的值为X,则显示出来的命中清单相应列背景色就是浅蓝色的: (注:此内表实质上就是用来存储“搜索帮助参数”属性列表的。刚进入F4IF_SHLP_EXIT_EXAMPLE时,搜索帮助参数EXP列中只要是被钩选的列,它所对应此内表的 SHLPOUTPUT列都会是 X ——上图就是首次进入出口函数时SHLP-FIELDPROP内表的内存状态,但运行到CALLCO***OL-STEP= DISP时间点之后,存储的是搜索帮助所有命中的记录(如从数据库中搜索出来的所有数据);如果是在CALLCO***OL-STEP= RETURN时间点时,存储的则是用户选中的记录。下面就来在这两个时间点来看看RECORD_TAB内表数据: 上面两个时间点来看,RECORD_TAB内表中STRING字段存储的就是命中清单与用户选中记录的数据,并且是将这些数据的多列拼接起来之后存储在此字段中的(注:不管搜索帮助参数中的LPOS是否设置为0或留空时,所有搜索帮助的参数还是都会被拼接起来存储在此字段中,与LPOS设置无关),这些拼接在一起的数据是通过F4IF_SHLP_EXIT_EXAMPLE的SHLP-FIELDDESCR内表参数中的OFFSET(按字节来计算的)及INTLEN(内部长度,按字节来计算的)来划分的,并且在不同的CALLCO***OL-STEP时间点时,OFFSET的取值是变化的,且时间与上面两种是相对应的: l LPOS(列表):命中清单中各列的显示顺序,如果为0或留空的列则不会显示。位置编号不能在列中出现多次,但是允许有间隔。另外,在基本搜索帮助中,至少在命中清单中出现一个参数 l SPOS:搜索帮助的过滤条件,对搜索结果进行过滤。如果在命中清单显示之前,弹出限制对话框,则还可以进一步修改那些从选择屏幕上带过来的条件值。此数字就是限制搜索帮助选择条件屏幕字段摆放顺序,如果为0或留空的列则不会出在限制条件页中 l SDis:如果勾选了,则在弹出的限制对话框中对应的字段用户不可输入,是只读的。下面是前面创建的Search Help,其中搜索参数WBSTK的SDis钩上了,所以弹出的限制对话框中所对应的屏幕字段不能进行修改: 以上面搜索帮助为例,运行报表程序,并在出口函数中设置断点,来理解一下F4IF_SHLP_EXIT_EXAMPLE出口函数各参数: 2 INTERFACE 包含了Help中的所有参数,当前使用哪个参数为F4屏幕字段,屏幕字段与Help参数映射信息(映射关系是通过SHLPFIELD与VALFIELD两列来映射),以及传入的F4屏幕字段的值(其他非F4屏幕字段的值不会在这里存储,而是在SHLP-SELOPT存储的) 2 SELOPT存储了选择屏幕与限制对话框屏幕上所有与此Help Link过的字段值,即这些会作为搜索帮助的过滤条件
如果带有函数模块F4UT_LIST_EXIT的命中列表包含了更深一层的按钮,那么也会介入这些时间点。当用户单击相应的按钮时,就能访问这些时间点。 在搜索帮助参数中,这里输入搜索参数一般都来源于包含的所有基本搜索帮助的参数(注:包含进来的这些参数要在基本搜索帮助里要么是IMP参数,要么是EXP参数,否则加进来激活时会报错,比如这里的WBSTK,由于在两个基本搜索帮助中都没有钩选IMP与EXP,所以这里不能加进来),这里的 IMP(导入)、EXP(导出)与基本搜索帮助里的IMP EXP作用是一样的,但这里的IMP EXP会覆盖基本搜索中的IMP EXP,输入输出参数以此集合帮助中设置的为准,除开IMP、EXP以集合搜索帮助中的为准外,其他的LPos、SPos、SDis则以各自的基本元素搜索帮助中的设置为准: 然后再将ZH_VBELN与ZH_VBELN_01两个基本搜索帮助包含进来,并分配参数: 然后再将集合搜索帮助绑定到自定的结构上面: 注:发现集合搜索帮助在屏幕字段中输入“*”后,发现如果本应该是输出字段的,最后在命中清单中却不是输出字段(背景色不是浅蓝色的了),如果含有“*”还是正常,这是系统的一个bug吗?? 表/结构字段绑定搜索帮助的两种方式 首先必须要创建一个Search Help,然后将表字段链接到这SH也有两种方法 注:绑定的搜索参数MSEHI一定要是输出参数,但可以不是输入参数,所以IMP不必选中,但EXP一定要选中。所以Data Element中绑定的搜索参数可能是搜索帮助的输入参数(屏蔽字段可以传入到搜索帮助),但一定是输出参数 Check Table即主表,引用此Check Table的表即从表,为某个表字段设置Check Table的过程实质上就是为某个表字段设置外键的过程,所以Check Table与外键是同一概念 如果搜索帮助的EXP参数被分配到了表字段,则当用户在命中清单上选择一条数据时,此参数的内容会返回到相应屏幕字段;如果搜索帮助的IMP分配到了表字段,则F4屏幕字段的值会传入到搜索帮助中 此种测试方式是在没有写报表程序的情况下,也可以对Help进行测试,不同的是这里的选择屏幕是动态生成的,且模拟的是那种通过表或结构字段绑定的Search Help(非程序绑定),所以通过此种方式模拟具有联动效果(屏幕字段可以传入到搜索帮助中作为过滤条件,从命中清单返回的结果可以自动填充到相应的屏幕字段中) 通过程序绑定表字段中的搜索帮助、动态生成搜索帮助(绑定到某个内表)并联动 help是程序在运行时,通过F4IF_FIELD_VALUE_REQUEST(另一个与此函数相似的函数为:F4_FIELD_ON_VALUE_REQUEST——描述:该功能模块完成对于屏幕上的字段,增加F4帮助功能,通过输入的表名、字段名、检索帮助名来绑定,从而获取输入值)函数绑定到一个表字段上(该表字段上已绑定过搜索帮助);下面实例中CONNECT的Search H_T001W才是最终的基本元素搜索帮助: 在P_WERKS屏幕字段上按F4键,弹出的搜索帮助效果如下(可以看出弹出的限制对话框中的屏幕字段都是由H_T001W基本元素帮助的SPos一起决定的): 下图中将Search Help参数分配给表字段: 只要在上图中的命中清单中选择一数据后,会将选中记录的相应列自动填充相应屏幕字段(Help参数里打上钩的EXP列——如果EXP列没有打钩,就不会自动填充到相应字段中?且这些列所分配的表字段在程序中被Link到屏幕字段),达到联动效果(搜索与返回都会产生联动:搜索SO_CONN时,会将SO_CARR与SO_FROM屏幕字段一起传入到搜索帮助里,并且从命中清单返回到屏幕时,SO_CARR与SO_FROM屏幕字段也会使用选中命中清单的相应列来自动填充) 此种方式不需要使用SE11来创建真正的Search Help,只需要为相应的表字段指定外键,则会自动为此表字段设置Check Table,一旦表字段有Check Table后,不需为该表字段绑定Search Help,所有Link具有Check Table约束的表字段屏幕字段时都会自动拥有Search Help。 Check Table实质上就是一种给从表字段设置外键的过程,Search Help的数据来源于主表。 设置Check Table后,表的相关信息如下: 另外,使用Check Table实现Search Table时,好像对限制框是否弹出来不能进行设置? 此种方式只是将第一种方式的表换成了结构,在程序中Link此结构就可以了,其绑定帮助的过程与表字段是一样的。 选中not possible时,表示只显示,不能输入:
1,则此时ACTIVE 相当于 0(其实则此时ACTIVE设置任何值都会被忽略,即使设置为1也不会有效果)。ACTIVE属性的唯一目的是,让你能够通过一个单独的属性就能将屏幕字段inactive掉。 LIST-PROCESSING之后,控制权从屏幕转向了输出列表,所有的Write输出结果都会写到输出列表中(否则这些Write语句会输入到对话屏幕中),如果此时不想显示屏幕200,则可以使用此语句来过路此屏幕,当然这可以使用LE***E SCREEN.语句来代替此语句,但LE***E SCREEN需要放在PBO的最后面(因为LE***E 如果是通过屏幕编辑器创建的子屏幕是,则在创建子屏幕时,需要指定屏幕的类型为子屏幕类型: 并且Next Screen一定要设置成自己。子屏幕需要放在子屏幕区域,且不能超过区域大小。 另外,除了像上面那样通过屏幕编辑器来创建子屏幕外,还可以通过通过SELECTION-SCREEN BEGIN OF SCREEN dynnr AS SUBSCREEN语句在ABAP程序代码中来定义子屏幕,定义后也可能通过下面的CALL SUBSCREEN语句来调用,而不一定要使用屏幕绘制器绘制的屏幕 所以,每一个Tab page是由一个Tab Title(实质上就是一个按钮,Tab title与按钮具有一样的属性)、一个子屏幕区域(用来Include子屏幕)组成的: 功能代码类型设置为“P”表示当用户按下这个TAB页按钮时,不触发主屏幕后台的PAI事件,如果FctType留空,则会触发 Ref.Field表示该TAB页按钮与其对应的要显示的子屏幕的连接,在PBO流逻辑中将使用这个“Ref.Field”调用对应的子屏幕 静态的Tabstrip(多个子屏幕区域) 必须为每一个Tab title分配一个单独的子屏幕区域,并且tabe title的Funcode的类型为P,还需在主屏幕的PBO块中加载所有的subscreens,以及在主屏幕的PAI块中调用每个subscreens的PAI事件。 当切换Tab page时,主屏幕的PAI事件不会触发(但子屏幕事件是否触PAI发看是否满足以下两个条件:一是在主屏幕的PAI块中调用了子屏幕的PAI事件了,即调用了CALL SUBSCREEN: <area>这样的语句;二是子屏幕中的元素确是触发了PAI事件,如点击了子屏幕中的某个按钮),所以在切换期间是不会对子屏幕中进行input code类型不指定,因此当每次进行切换时,会触发主屏幕的PAI事件,这样如果主屏幕的PAI块中调用了子屏幕的PAI事件,则子屏幕的PAI事件也会被调用。另外,在切换到其他Tab page之前会进行当前子屏幕的input checks数据检测动作,只有通过了input checks数据检测动作后才能切换到其他Tab 这个示例是将上面静态的改成了动态的,基本上一样 输入每个Tab标签的标题,输入的个数也决定了Tab标签的个数: 每个Tab标签页面需要单独分配一个子屏幕,定义好页面后,系统将自动分配功能代码并为每个页面自动分配一个子屏幕: 输入生成的代码所存放的Include文件名: 完成后屏幕绘制上会生成名为TAB01的Tab标签控件: checks检测是在事件处理方法调用之后才进行;这类事件的缺点是:有可能屏幕字段的内容不会传递到ABAP程序中,这就会造成下一屏幕显示的数据为过时数据,但我们可以在事件处理方法中通过cl_gui_cfw=>set_new_ok_code手动设置Function code ,让PAI事件触发,则屏幕字段内容肯定会被传递到ABAP程序中去,所以这样可以避免这个问题。 在Screen Painter中,Table的每一列都是一个文本框控件,也需要为每一个列统一命名: 在设计时,如果要给表格增加列头或列体时,在表格控件所在的以外区域先将文本框与标签创建好,再托入到表格控件相应位置。 另外,如果表格中的列都是来自于词典中的透明表时或结构时,可以这样来做:首先画一个表格控件,并将透明表或词典结构作为表格控件的命: 然后从词典中引用字段: 并将选择的字段拖入到表格控件中: 如果需要让表格中的项可以选择的话,需要在设计表格控件时,指定透明表或词典结构中的某个字段作为选择列: ,并在屏幕上拖动,系统将会弹出表控件向导初始页面: 表格控件的数据源可以是物理表,也可以是程序中的内表(但只能为标准内表),这里我们引用程序中的标准内表YSPFLI作为数据源: 选择表格控件中需要展示的表字段: 指定用来存放表格向导产生的代码的INCLUDE文件名: 双击表格控件,在表格控件属性框中还可以进一步设置表格属性(从弹出的表格控件属性框可以看到,与非向导的表格控件是一样的) 完成后可以看到生成的代码,代码与上面程序创建表格控件: 但向导创建完后,但运行是没有数据的: 下面将数据从SPFLI表中查出来,并将所获取的数据存放到YSPFLI中,且查询代码需要放在CALL SCREEN之前: 从上图可以看出,“保存”与“退出”按钮都还未激活,原因就是还没有给对话屏幕程序加上GUI,下面给设置: 工具栏中新增保存按钮: 在开发前,先讲讲长文本: 在以前,使用过READ_TEXT函数读取过各种各样的长文本,比如物料长文本、销售长文本等,在读取里时,一般需要传递长文本对象名、长文本ID、及长文本名称,READ_TEXT函数参数如下: 与读取函数READ_TEXT对应的是写函数S***E_TEXT,它是将长文本以固有的格式存储到相应的物理表中,其中有一个重要的入参HEADER,其类型参照了THEAD结构(实质上为STXH表结构),用于存储长文本相关的各种属性: 长文本最后都存储到了STXH、STXL两个物理表中。在使用READ_TEXT与S***E_TEXT时,都需要指定长文本对象以及文本ID,这些是通过SE75来维护的: 上面看到的物料长文本对象及文本ID,在物料维护时可以看到: SAP中的长文本都是以文本对象和文本ID分类别类存储到STXH、STXL两个物理表中,所以想将长字符串,比如这里编辑器中的文本以长文本形式存储到表中,则需要先定义对应的文本对象及文本ID,并且在定义文本对象时,可以指定长文本的格式:如每行的字符个数,这里我们创建需要在下面程序使用的文本对象Z001: 当运行后面程序后,文本编辑器中的文本会以长文本的形式存储到STXH与STXL两个物理表中,STXH表存储的为长文本相关头信息,STXL存储的是真正的数据,但长文本是以LRAW类型存储的,在屏幕上不能直接显示出来: 最后程序运行结果如下: |
先说下自己日常觉得比较实用的几个技巧:
,对于一些不提供这功能或者站内搜索效果不佳的网站相当实用, 比如[site:
巴塞罗那], 就能搜到知乎里所有关于巴塞罗那的***. (吐槽下这比知乎自带的搜索好用多了…)
多图预警。很久没来知乎了。。居然这么多赞。这些图是很老的图了,感谢
,还有那些翻译的人。————————————————分割线———————————————————看了以下图片后你就会玩啦 这下子,基本上你所有的英雄都了解…