SAP programming model
Single-screen transaction
l Input screen and data screen组合在一个window中
l Create, change和display模式自由切换
l Direct access to each object
l System retains context after saving
ABAP program types:
l Executable program(type 1)可以通过ABAP EDITOR直接运行,一个processing blocks set按照预先定义好的顺序执行。可以使用标准的selection screen。主要用来显示list。
l Module pool(type M)为了使module pool可以被执行你必须至少定义一个transaction code用来指定initial screen。可以通过screen attributes来静态指定screen的调用顺序或者通过程序代码来动态指定screen的调用顺序
还有一些类型的程序并不能够被直接执行,它们用来作为modularization units的容器,被其他可执行程序调用。只要你调用这些程序中的任一module,系统都会把整个主程序调用到当前的internal session中。
l Function Group(Type F)包括function modules,local data declarations和screens
l Include Program(Type I)可以包括任何ABAP Statements
l Interface Pool (Type J)包括global interfaces和local data declarations
l Class Pool(Type K)包括global classes和local data declarations
为了使程序更容易被理解并提高代码的可复用性,建议在程序中使用include program。Screen用来输入和显示数据,它能够很好的与data dictionary结合在一块儿,可以进行输入数据的一致性检查,screen中又很多组件可以为用户提供友好的交互界面,比如push buttons, tabstrip controls, table controls等等。Screen中的以下动作都会触发screen的PAI,比如:entering data, choosing a menu entry or clicking a pushbutton等。所有的screen elements: text filed, input/output field, status icon, group box, radio button, checkbox和pushbutton都具有general attributes, Dictionary attributes, program attributes和display attributes。对于element: subscreen , tabstrip control和table control具有general attributes和跟它们本身相关的special attributes。可以把一个screen的attributes分为以下几类:
l Statically definable cannot be changed dynamically本能被动态改变的属性
l Statically definable can be changed dynamically 可以被动态改变的属性
l Can only be defined dynamically只能被动态改变的属性
Screen是用户和ABAP program交互的途径。
Screen包括screen image和他的flow logic。严格来说它是控制screen image处理的程序。Screen有四个组件:screen mask,screen attributes,element list和flow logic。Flow logic包含flow logic代码但不是abap语句。Screen是其他screen elements的容器。大于9000的screen number是为sap system customer保留的。Screen number 1000到1010是为dictionary table的maintenance screen和selection screen of executable准备的。Screen type决定了screen的使用目的,其他的一些特殊attributes和components是由这个attribute决定的。Next screen attribute决定了screen执行的固定顺序。
Screen attributes:
l Admin
Program Screen no Short desc. Screen group Changes Generation Status Original lang. Dev Class
l Type
Norma Sub screen Modal dialog box Selection screen
l Size
Static Maintained occupied
Dynamic: Starting at size
l Sequence
Next screen
l Settings
Cursor position Hold data Fixed font Runtime compression Context menu form
创建screen的步骤
l Set the general screen attributes
l Design the screen layout
l Set the field attributes
l Write the flow logic
创建screen的途径:
l 在object navigator中通过右键,选择Create->screen
l 在abap editor写入代码call screen <num>然后双击<num>
可以在next screen field中设置next screen的screen number。如果你把next screen的screen number设为0,当这个screen完成处理后其又会被重新调用。
通常使用ABAP Dictionary中的field description来定义screen element,也可以使用程序中的field description来定义,当然前提条件是这个程序已经创建。你可以把key word texts和templates结合在一起使用或者单独使用。Screen elements的属性在screen painter中有六个视图用来维护。在screen painter中你使用的是external data types。他们与dictionary中的data type相对应,系统在format column中显示external data type。对于没有ABAP dictionary reference的elements必须手工设置external data type。External data type和ABAP internal data type的对应关系:
http://help.sap.com/saphelp_47x200/helpdata/en/d1/801b50454211d189710000e8322d00/frameset.htm
screen在PBO和PAI事件中有自己的keywords。可以在一个屏幕中调用多个module,通过SY-DYNNR来判断当前的screen number。PBO的module必须在MODULE…OUTPUT中定义,PAI的module必须在MODULE INPUT中定义。在screen processing程序中有不同的system processors。ABAP processor控制module中的program flow。DYNP processor控制screen的flow logic并负责准备要在screen上显示的数据。在处理过程中,通过TABLES和DATA定义的数据是可以见的。系统通过screen的element list来识别,取得数据显示在屏幕上并把用户修改后的数据传回去。数据的copy是必需的,因为screen和program是两个不同的processor。一个system program用来专门完成copy过程。在处理过程中ABAP和DYNP同名的字段会被比较。为了使screen和它的program能进行信息交互,他们必须举用相同名字的变量。在所有PBO processing blocks结束后,程序中的字段内容并会被copy到屏幕中相同名字的字段中。在第一个PAI module执行之前,所有的屏幕中的字段内容并会被copy到程序中相同名字的字段中。建议使用自己的结构来作为屏幕和程序之间交互的介质,以保证互相传输的信息正是你想要的。在PBO开始的时候,runtime会把当前screen的静态属性和动态属性写到ABAP的system table中,这个table的line type是screen。下面是screen structure的结构:SCREEN-NAME SCREEN-GROUP1 SCREEN-GROUP2 SCREEN-GROUP3 SCREEN-GROUP4 SCREEN-LENGTH SCREEN-INPUT SCREEN-OUTPUT SCREEN-REQUIRED SCREEN-INTENSIFIED SCREEN-INVISIBLE SCREEN-ACTIVE 动态修改screen elements的属性是暂时的。在screen system table中会为每一个screen element创建一行。Screen system table是在PBO之前初始化的,会有专门的system program把screen element的静态属性copy到screen system table中。你就可以在PBO的一个module中动态修改这些属性了,如下:
LOOP AT SCREEN.
…
MODIFY SCREEN.
ENDLOOP.
‘1’代表属性被设置,’0’代表没有设置。
可以通过SCREEN-NAME和SCREEN-GROUP1到SCREEN-GROUP4来确定要设置那些element的属性。
通过在screen painter中设置modification group可以同时设置多个screen element的属性,可以在element list或者screen painter的layout editor中设置element的modification group。
LOOP AT SCREEN WHERE和READ TABLE SCREEN是不支持的。需要注意的是如果在screen painter中被静态的设置为INVISIBLE那么通过SCREEN-ACTIVE =1不能将其设置为VISIBLE,只能通过INVISIBLE=0。然而如果在screen painter中设置为VISIBLE那么可以通过SCREEN-ACTIVE=0将其设置为INVISIBLE。它与下面的三条语句效果相同SCREEN-INVISIBLE=1 SCREEN-INPUT=0 SCREEN-OUTPUT=0,复杂的transaction有多个screen组成,initial screen是在定义transaction code时定义的,其他的screen的顺序是由客户输入决定的,next screen在screen attributes中静态定义,在程序中可以通过set screen xxx来override。Set screen暂时改变了screen的next screen attribute。Screen必须是同一个
Program的screen。Next screen在当前screen处理结束后或者leave screen语句之后处理,可以使用LEAVE TO SCREEN XXX语句效果同SET SCREEN XXX. LEAVE SCREEN.。可以通过call screen来插入一个screen sequence,相当于把另外一个layer加入到了stack中,需要注意的是通过这种方式创建的layer需要在之后被删除掉。可以在插入的screen sequence之后通过静态设定next screen属性或动态把next screen设为0来实现。为了中断当前screen的处理跳到另外一个新的screen,可以通过call screen <xxx>来实现,<xxx>必须是同一个程序的screen。在程序中,系统创建了一个stack,这个stack必须在程序结束前被destroyed。为了继续执行CALL SCREEN之后的语句可以使用SET SCRENN 0.LEAVE SCREEN或LEAVE TO SCREEN 0来实现。如果你在call chain之外使用上面的语句,程序就会结束,control就会返回到调用它的语句之后。可以通过LEAVE PROGRAM来terminate一个程序。可以通过CALL SCREEN STARTING AT和ENDING AT来设置screen的位置和大小。但是其中的screen必须被设置为modal dialog screen。如果没有ENDING AT语句dialog box的大小就有screen的used size属性确定。如果用ENDING AT指定了screen的大小但是没有足够的空间这个screen就会带有scrollbars。屏幕显示时通常cursor就会被放置在第一个输入字段上,可以通过screen的cursor position属性将其定位到其他不同的字段。可以通过语句SET CURSOR FIELD <object_name> OFFSET <position>在PBO事件中来设置cursor的位置。<object_name>既可以是字段的名称也可以是变量名。