【转自】http://blog.****.net/lhx20/article/details/3039909
Table control用于在screen上以表格的形式显示数据,在table control中,可以使用table elements,keywords,,templates,radio buttons,radio button groups和pushbuttons。一行可以有255个columns。每个column可以有一个title。Table control可以用来显示single structured lines。Table control的特点:
l Resizable table for displaying and editing data
l 用户或者程序可以改变列的宽度和位置并可以保存下来用于下次调用
l Check column for marking lines,marked lines are highlighted in a different color
l Line selection single lines multiple lines all lines and deselection
l Column headings double as pushbuttons for marking columns
l Scroll bars for horizontal and vertical scrolling
l Any number of key columns can be set
l Cell attributes are variable at runtime
Table control可以存储display variants
完全在客户端运行的table control action有:
l Horizontal scrolling
l Swapping columns
l Changing column width
l Selecting columns
l Selecting lines
Scroll vertically或者save user configuration都会trigger PAI processing block
除了name start poison on screen和static size,table control还有很多特殊的属性,这些属性决定了table control的table type,display options以及用户是否可以配置table control。Structure syst的loopc和stepl字段记录了table control的loop处理信息,如果table control用来输入数据应当把table type设为entry table。如果用来选择或传输数据或只有显示模式,table type可以设为selection table。要创建table control必须创建table control area和table control fields。创建table control area的步骤:
l 在screen中把table control area object拖动到screen中
l 在name属性中维护table control的name,在abap程序中定义一个同样名字的structure,通过controls,type为TABLEVIEW(对应于type group中的CXTAB_CONTROL)声明一个复杂的data object。运行时,这个变量保存着table control的static attributes
l 你在screen painter中维护initial value,通过USING SCREEN来确定那个screen的initial values会被使用。可以通过语句REFRESH CONTROL <ctrl> FROM SCREEN <scr> 来初始化table control,<scr>可以不是table control的initial screen
可以通过Dict/Program fields来创建table control fields,主要步骤如下:
l 选择你要显示的fields所在的structure
l 在filed列表中选择你要显示的fields
l 然后把他们拖到table control area中即可,如果field有data element texts,那么他就会作为column heading。
也可以把单独的input/output field拖到table control area作为一列。
当创建table control时,系统会为自动propose一个selection column,selection column跟check box的功能一样,这个field必须是类型为CHAR,长度为1。这个field的名字需要在table control name属性中输入。Selection column用于在screen和abap program之间传递选择信息。Table control attributes存储在abap program中用control语句声明的structure中,这些属性可以被分为general attributes和column attributes。General attributes包含了table control的整体信息,比如fixed columns的个数。Column attributes存储在一个internal table中,每一列都包含了完整的screen structure的属性同时还用column position,selection indicator,visibility indicator和visible length。可以通过修改程序中声明的table control structure的fields的内容来动态修改table control的属性。Table control structure的字段还包括用户交互的信息,比如用户选定的特定列。
处理table control的原理:
从性能方面的考虑应当把table control要显示的内容一次性的从database中取出放到internal table中,系统把internal table中的内容填充到table control中。在可以把一个internal table中的内容显示到table control之前应当先从数据库中把要显示的内容取出,但是注意,不应当每次PBO都取数据库中取数,当key fields发生变化时采取database中取数。为了处理table control系统需要知道垂直方向可以滚动的高度,可以通过DESCRIBE语句来得到internal table中记录的个数,然后把这个属性赋给table control。只有一个work area来处理table control中的记录,在PBO,PAI中每一个table control都需要LOOP…ENDLOOP STRUCTURE。在PBO,每次loop都要把internal table中相应的记录填充到table control中。同理,在PAI中,你需要把通过table control修改后的记录传回到internal table中对应的每条记录。在处理过程中,你必须清楚哪些是针对table control的每一行的那些是针对整个SCREEN的。
PBO
MODULE fill_itab.
LOOP ….
Read line by line from the internal table
ENDLOOP.
PAI
LOOP…
Update the internal table line by line.
ENDLOOP.
MODULE fill_itab OUTPUT.
IF wa_spfli-carrid NEW key_scarr-carrid.
MOVE-CORRESPONDING wa_spfli TO key_scarr.
SELELCT … INTO TABLE itab_spfli
WHERE …
DESCRIBE TABLE itab_spfli
LINES my_control-lines.
ENDIF.
ENDMODULE.
在table control上显示内表数据的三个步骤:
l 系统循环screen上table control的每一行
l 对于每一行系统会把相应internal table中的一行读出来放到work area中
l 对于每一行系统会把work area中的内容copy到table control中对应的行
PROCESS BEFORE OUTPUT
LOOP AT itab_spfli INTO wa_spfli
WITH CONTROL my_control.
MODULE move_to_tc.
ENDLOOP.
PROCESS AFTER INPUT.
MODULE move_to_tc OUTPUT.
MOVE-CORRESPONDING wa_spfli TO sdyn_conn.
ENDMODULE.
如果work area与table control area fields的structure相同,work area中的内容就会自动传到table control的fields,否则需要在LOOP ENDLOOP之间加一个module用来把work area中的值传到table control fields的structure。当你scroll table control时,系统会计算<ctrl>-TOP_LINE。在screen上使用了table control后,screen和program之间field transport的顺序就会改变。在PBO PROCESSING BLOCK中,每个loop process,数据都会从ABAP program传到screen。剩下的screen fields跟通常一样,都是在PBO最后传递的。通过table control修改后的数据传回到program的internal table也分为三步:
l 系统loop table control的每一行
l 对于每一行,系统把该行的内容传回给internal table的work area
l 必须通过编写代码把work area的内容写回到internal table
程序块LOOP AT <itab> ENDLOOP.用来处理table control中的每一行
如果table control的structure name与internal table的work area一样,则需要把work area中的内容更新到internal table中相应的行,可以通过my_tabcontrol-current_line得到对应的行。如果其与internal table的work area没有相同的名字,首先要把table control的structure copy到internal table的work area中。Field transport sequence in PAI:
不属于table control和field statement的screen fields首先会被传送到abap program中。Table control中的内容会在相应的loop中一行一行的传送到work area中。和通常一样,field语句的screen fields会在该语句之前传送到abap program中。
货币型的数据由screen向ABAP program传送时系统程序会进行额外的格式化处理,系统会指向相应的reference field的内容,同时也会指向相应的ABAP field,如果reference field没有相应currency,就会产生错误。Data transport的顺序与其在screen上的位置有关。不必要考虑data transport的具体技术细节。在flow logic代码中一定要保证feidl传送的顺序是正确的(amounts在reference field之后传送)。为了做到这点儿,可以通过field语句来延缓amount field的传送。
可以通过table control wizard来创建table control。通过wizard创建的所有对象都处于inactive状态。
可以通过修改control语句创建的structure来改变table control的属性。如果想临时改变table control某个单元格的属性,可以在PBO的LOOP ENDLOOP中,修改该行的screen table的内容。在LOOP中,系统会得到table control在screen painter中的静态属性集,通过在LOOP中调用Module来临时修改这些属性。可以通过selected field来确定用户是否是否选定了某一列。如果想改变table control中某一列的属性,必须改变<table_control>-cols内表中对应行的值,这个internal table没有header line所以必须定义work area。这里面也包含与用户交互的信息。
PBO or PAI
MODULE change_table_control_2.
DATA;wa LIKE LINE OF my_control-cols.
MODULE change_table_control_2.
LOOP AT my_control-cols INTO wa.
IF wa-index BETWEEN 1 AND 3.
Wa-screen-intensified = 1.
ELSE.
Wa-screen-intensified = 0.
ENDIF
MODIFY my_control-cols FROM wa..
ENDLOOP.
ENDMODULE.
在PBO中table control的loop processing中,系统会把table control structure的一些属性copy到系统表screen中,table control中一行的所有字段都会被copy。Table ocntrol所显示的每一行都会被copy,(行数由当前screen的大小决定)。可以临时改变table control fields的属性,这一改变只在当前处理有效,可以在table control的loop处理中改变当前行的属性,
LOOP AT itab INTOD sdyn_conn.
MODULE mdodify_screen.
ENDLOOP.
MODULE modify_screen.
CHECK spfli-mark = ‘X’.
LOOP AT SCREEN.
IF screen-group1 = ‘SEL’.
Screen-intensified = 1.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
ENDMODULE.
可以为table control的内容排序,需要使用table control的以下属性,<wa_cols>-selected和<wa_cols>-screen-name。需要明确的是<wa_cols>-screen-name是screen field的name而不是internal table column的name。
CONTROLS my_control TYPE TABLEVIEW USING SCREEN 200.
DATA wa LIKE LINE OF my_control-cols.
MODULE USER_COMMAND_0200 INPUT.
CASE ok_code.
WHEN ‘STRU’.
READ TABLE my_control-cols
WITH KEY selected = ‘X’ INTO wa.
` IF sy-subrc = 0.
SORT itab BY (wa-screen-name+10).
ELSE.
MESSAGE i055(bc410).
ENDIF.
ENDCASE.
ENDMOUDLE.
确定鼠标所在table control的位置;
可以通过语句GET CURSOR来确定鼠标在table control的位置,SET CUSOR来设置鼠标的位置:SET CURSOR FIELD <field> LINE <line> OFFSET <offset>
得到鼠标的位置:
DATA: selline TYPE sy-stepl,
Tabix TYPE sy-tabix.
GET CUSOR LINE selline.
Tabix = my_control-TOP_LINE + selelin – 1.
READ TABLE spfli_itab INDEX tabix.