关于SAP控件TABLE Control的用法,近期研究得到的几点如下:
1、使用向导创建table control时,提示“specify the work area of the table or a table with a header line”。检查系统定义,所绑定的内表已很明确地定义了内表的具有表头。后来摸索到,一个屏幕只允许使用向导创建一个table control,如果手工创建则不受限制。
2、 系统提示:Cannot currently edit include Repeat step?想了好久,在SAP论坛上发现老外也存在同样的问题待解决,http://forums.sdn.sap.com/thread.jspa?threadID=1195809
重复了几次,后来仔细想想,include是一个包,screen与程序绑定的,会不会是因为正在打开绑定的程序呢,于时在SE38中退出正在编辑的程序,重新操作则成功。
3、关于这个控件很好的学习资料。见http://blog.chinaunix.net/space.php?uid=150062&do=blog&id=2780070
4、table control配套按钮的设计。今年6月在使用时,为了设计配套按钮(如翻页、全选、全不选、新增、删除等)费了好多时间,还背了一段代码,而如果采用向导创建table Control,系统会自动帮我们设置,具体操作如下
一般情况下配置选择列。定义内表时,增加一列用于标记当前行是否被选中,该列的数据类型为 c,长度为 1, 在“line selectability”中勾选“line selection col”,并指定列名,同时可以指定是否允许选中 多行。如:
TABLES:SPFLI.
* 创建带有选择列的内表
TYPES:BEGIN OF SP1_TYPE,
ISSEL TYPE C,
CARRID LIKE SPFLI-CARRID,
CONNID LIKE SPFLI-CONNID,
COUNTRYFR LIKE SPFLI-COUNTRYFR,
CITYFROM LIKE SPFLI-CITYFROM,
AIRPFROM LIKE SPFLI-AIRPFROM,
COUNTRYTO LIKE SPFLI-COUNTRYTO,
CITYTO LIKE SPFLI-CITYTO,
AIRPTO LIKE SPFLI-AIRPTO,
END OF SP1_TYPE.
DATA:OK_CODE TYPE SY-UCOMM,
SP1 TYPE STANDARD TABLE OF SP1_TYPE WITH HEADER LINE,
SP2 TYPE STANDARD TABLE OF SP1_TYPE WITH HEADER LINE.
配置实现可编辑的table control。
1、在input/output attributes选项面板中,勾选“input control”。
2、在维护函数选项中,勾选“SCROLL”,“Insert/delete line”,“select/deselect all”选项,系统自动配套设计好相关操作按钮。
3、在屏幕被调用前,指定table control的长度。 如:
TBL2-LINES = 1000.
CALL SCREEN 100.
表格控制的行数固定为1000行,如果内表不足一千行,用空行代替,当从屏幕更新数据到内表时,系统会跳过为空的行,所以不用担心这样做会造成内表有很多空行. 一般情况下,当要求可编辑时,要求预留空行,否则,用TBL2_CHANGE_TC_ATTR控制.如果用户不允许空行的存在,则按以下方式
* 如果表格不允许空行的存在,则取消此处的注析,系统在显示前都会告知系统要显示的行数.
*&SPWIZARD: OUTPUT MODULE FOR TC ‘TBL2’. DO NOT CHANGE THIS LINE!
*&SPWIZARD: UPDATE LINES FOR EQUIVALENT SCROLLBAR
MODULE TBL2_CHANGE_TC_ATTR OUTPUT.
* DESCRIBE TABLE SP1 LINES TBL2-lines.
ENDMODULE.
自动录入功能增强。为了提高用户的友好性,提高用户的录入效率,有时候会根据用户录入的某些内容,自动带出其它相关的内容,只要监控相关列的值是否改变,如果有改变,即对其它相关列进行赋值。(table control中改变了界面的值后,只有按了enter键才会触发更改)。代码如:
流逻辑中监控字段的值是否改变
PROCESS AFTER INPUT.
*&SPWIZARD: PAI FLOW LOGIC FOR TABLECONTROL ‘TBL2’
LOOP AT SP1.
CHAIN.
FIELD SP1-ISSEL.
FIELD SP1-CARRID.
FIELD SP1-CONNID.
FIELD SP1-COUNTRYFR.
FIELD SP1-CITYFROM.
FIELD SP1-AIRPFROM.
FIELD SP1-COUNTRYTO.
FIELD SP1-CITYTO.
FIELD SP1-AIRPTO.
MODULE TBL2_MODIFY ON CHAIN-REQUEST.
ENDCHAIN.
ENDLOOP.
在程序中自动赋值:
* 当用户更改表格中的数据后,触发该事件
* 第一个SP1是内表,第二个SP1是表工作区,这个工作区和SP1表格控制绑定,在流逻辑中指定
* 在这里可以实现信息提示,根据之前输入的字段内容,确定后面的字段内容,
MODULE TBL2_MODIFY INPUT.
IF SP1-COUNTRYFR = ‘US’.
SP1-COUNTRYTO = ‘CHI’.
ENDIF.
IF SP1-COUNTRYFR = ‘CHI’.
SP1-COUNTRYTO = ‘US’.
ENDIF.
MODIFY SP1 FROM SP1 INDEX TBL2-CURRENT_LINE.
ENDMODULE.
这两天自已做的一个案例的全部内容如下:
*&———————————————————————*
*& Report ZTABCON_HX_01_04
*&
*&———————————————————————*
*&
*&
*&———————————————————————*
REPORT ZTABCON_HX_01_04.
TABLES:SPFLI.
* 创建带有选择列的内表
TYPES:BEGIN OF SP1_TYPE,
ISSEL TYPE C,
CARRID LIKE SPFLI-CARRID,
CONNID LIKE SPFLI-CONNID,
COUNTRYFR LIKE SPFLI-COUNTRYFR,
CITYFROM LIKE SPFLI-CITYFROM,
AIRPFROM LIKE SPFLI-AIRPFROM,
COUNTRYTO LIKE SPFLI-COUNTRYTO,
CITYTO LIKE SPFLI-CITYTO,
AIRPTO LIKE SPFLI-AIRPTO,
END OF SP1_TYPE.
DATA:OK_CODE TYPE SY-UCOMM,
SP1 TYPE STANDARD TABLE OF SP1_TYPE WITH HEADER LINE,
SP2 TYPE STANDARD TABLE OF SP1_TYPE WITH HEADER LINE.
* SP1 TYPE STANDARD TABLE OF SPFLI WITH HEADER LINE.”采用这种方式创建的表格控件是没有选择列的,因为选择列还需要有额外的一个标记
SELECT * INTO CORRESPONDING FIELDS OF TABLE SP1
FROM SPFLI.
* 表格控件控件
* &SPWIZARD: DECLARATION OF TABLECONTROL ‘TBL2’ ITSELF
CONTROLS: TBL2 TYPE TABLEVIEW USING SCREEN 0100.
* &SPWIZARD: LINES OF TABLECONTROL ‘TBL2’
DATA: G_TBL2_LINES LIKE SY-LOOPC.
* 表格控制的行数固定为1000行,如果内表不足一千行,用空行代替,当从屏幕更新数据到内表时,系统会跳过为空的行,所以不用担心这样做会造成内表有很多空行.
* 一般情况下,当要求可编辑时,要求预留空行,否则,用TBL2_CHANGE_TC_ATTR控制.
TBL2-LINES = 1000.
CALL SCREEN 100.
* 监控用户触发的事件
MODULE USER_COMMAND_0100 INPUT.
CASE OK_CODE.
WHEN ‘EXIT’.
LEAVE PROGRAM.
WHEN OTHERS.
ENDCASE.
ENDMODULE.
* 当用户更改表格中的数据后,触发该事件
* 第一个SP1是内表,第二个SP1是表工作区,这个工作区和SP1表格控制绑定,在流逻辑中指定
* 在这里可以实现信息提示,根据之前输入的字段内容,确定后面的字段内容,
MODULE TBL2_MODIFY INPUT.
IF SP1-COUNTRYFR = ‘US’.
SP1-COUNTRYTO = ‘CHI’.
ENDIF.
IF SP1-COUNTRYFR = ‘CHI’.
SP1-COUNTRYTO = ‘US’.
ENDIF.
MODIFY SP1 FROM SP1 INDEX TBL2-CURRENT_LINE.
ENDMODULE.
* 如果表格不允许空行的存在,则取消此处的注析,系统在显示前都会告知系统要显示的行数.
*&SPWIZARD: OUTPUT MODULE FOR TC ‘TBL2’. DO NOT CHANGE THIS LINE!
*&SPWIZARD: UPDATE LINES FOR EQUIVALENT SCROLLBAR
MODULE TBL2_CHANGE_TC_ATTR OUTPUT.
* DESCRIBE TABLE SP1 LINES TBL2-lines.
ENDMODULE.
*&SPWIZARD: OUTPUT MODULE FOR TC ‘TBL2’. DO NOT CHANGE THIS LINE!
*&SPWIZARD: GET LINES OF TABLECONTROL
MODULE TBL2_GET_LINES OUTPUT.
G_TBL2_LINES = SY-LOOPC.
ENDMODULE.
*&SPWIZARD: INPUT MODULE FOR TC ‘TBL2’. DO NOT CHANGE THIS LINE!
*&SPWIZARD: PROCESS USER COMMAND
MODULE TBL2_USER_COMMAND INPUT.
OK_CODE = SY-UCOMM.
PERFORM USER_OK_TC USING ‘TBL2’
‘SP1’
‘ISSEL’
CHANGING OK_CODE.
SY-UCOMM = OK_CODE.
ENDMODULE.
*———————————————————————-*
* INCLUDE TABLECONTROL_FORMS *
*———————————————————————-*
*&———————————————————————*
*& Form USER_OK_TC 这是系统标准的表格控制代码,相关控件按钮是按以下规定命名的:表格的名称_操作名,如本程序的名称为SP1_INSR,表示插入一行,
*& DEL:删除
*& P–:第一页
*& P-:前一页
*& P+:下一页
*& P++:最后一页
*& L-:左移一页
*& L–:左边第一页
*& ……
*& 所以当想实现左移时,只需要在界面中按规定添加按钮,并按相应的规则命名,就可以了.
*&
*&———————————————————————*
FORM USER_OK_TC USING P_TC_NAME TYPE DYNFNAM
P_TABLE_NAME
P_MARK_NAME
CHANGING P_OK LIKE SY-UCOMM.
*&SPWIZARD: BEGIN OF LOCAL DATA—————————————-*
DATA: L_OK TYPE SY-UCOMM,
L_OFFSET TYPE I.
*&SPWIZARD: END OF LOCAL DATA——————————————*
*&SPWIZARD: Table control specific operations *
*&SPWIZARD: evaluate TC name and operations *
SEARCH P_OK FOR P_TC_NAME.
IF SY-SUBRC <> 0.
EXIT.
ENDIF.
L_OFFSET = STRLEN( P_TC_NAME ) + 1.
L_OK = P_OK+L_OFFSET.
*&SPWIZARD: execute general and TC specific operations *
CASE L_OK.
WHEN ‘INSR’. “insert row
PERFORM FCODE_INSERT_ROW USING P_TC_NAME
P_TABLE_NAME.
CLEAR P_OK.
WHEN ‘DEL’. “delete row
PERFORM FCODE_DELETE_ROW USING P_TC_NAME
P_TABLE_NAME
P_MARK_NAME.
CLEAR P_OK.
WHEN ‘P–‘ OR “top of list
‘P-‘ OR “previous page
‘P+’ OR “next page
‘P++’. “bottom of list
PERFORM COMPUTE_SCROLLING_IN_TC USING P_TC_NAME
L_OK.
CLEAR P_OK.
* WHEN ‘L–‘. “total left
* PERFORM FCODE_TOTAL_LEFT USING P_TC_NAME.
*
* WHEN ‘L-‘. “column left
* PERFORM FCODE_COLUMN_LEFT USING P_TC_NAME.
*
* WHEN ‘R+’. “column right
* PERFORM FCODE_COLUMN_RIGHT USING P_TC_NAME.
*
* WHEN ‘R++’. “total right
* PERFORM FCODE_TOTAL_RIGHT USING P_TC_NAME.
*
WHEN ‘MARK’. “mark all filled lines
PERFORM FCODE_TC_MARK_LINES USING P_TC_NAME
P_TABLE_NAME
P_MARK_NAME .
CLEAR P_OK.
WHEN ‘DMRK’. “demark all filled lines
PERFORM FCODE_TC_DEMARK_LINES USING P_TC_NAME
P_TABLE_NAME
P_MARK_NAME .
CLEAR P_OK.
* WHEN ‘SASCEND’ OR
* ‘SDESCEND’. “sort column
* PERFORM FCODE_SORT_TC USING P_TC_NAME
* l_ok.
ENDCASE.
ENDFORM. ” USER_OK_TC
*&———————————————————————*
*& Form FCODE_INSERT_ROW *
*&———————————————————————*
FORM fcode_insert_row
USING P_TC_NAME TYPE DYNFNAM
P_TABLE_NAME .
*&SPWIZARD: BEGIN OF LOCAL DATA—————————————-*
DATA L_LINES_NAME LIKE FELD-NAME.
DATA L_SELLINE LIKE SY-STEPL.
DATA L_LASTLINE TYPE I.
DATA L_LINE TYPE I.
DATA L_TABLE_NAME LIKE FELD-NAME.
FIELD-SYMBOLS <TC> TYPE CXTAB_CONTROL.
FIELD-SYMBOLS <TABLE> TYPE STANDARD TABLE.
FIELD-SYMBOLS <LINES> TYPE I.
*&SPWIZARD: END OF LOCAL DATA——————————————*
ASSIGN (P_TC_NAME) TO <TC>.
*&SPWIZARD: get the table, which belongs to the tc *
CONCATENATE P_TABLE_NAME ‘[]’ INTO L_TABLE_NAME. “table body
ASSIGN (L_TABLE_NAME) TO <TABLE>. “not headerline
*&SPWIZARD: get looplines of TableControl *
CONCATENATE ‘G_’ P_TC_NAME ‘_LINES’ INTO L_LINES_NAME.
ASSIGN (L_LINES_NAME) TO <LINES>.
*&SPWIZARD: get current line *
GET CURSOR LINE L_SELLINE.
IF SY-SUBRC <> 0. ” append line to table
L_SELLINE = <TC>-LINES + 1.
*&SPWIZARD: set top line *
IF L_SELLINE > <LINES>.
<TC>-TOP_LINE = L_SELLINE – <LINES> + 1 .
ELSE.
<TC>-TOP_LINE = 1.
ENDIF.
ELSE. ” insert line into table
L_SELLINE = <TC>-TOP_LINE + L_SELLINE – 1.
L_LASTLINE = <TC>-TOP_LINE + <LINES> – 1.
ENDIF.
*&SPWIZARD: set new cursor line *
L_LINE = L_SELLINE – <TC>-TOP_LINE + 1.
*&SPWIZARD: insert initial line *
INSERT INITIAL LINE INTO <TABLE> INDEX L_SELLINE.
<TC>-LINES = <TC>-LINES + 1.
*&SPWIZARD: set cursor *
SET CURSOR LINE L_LINE.
ENDFORM. ” FCODE_INSERT_ROW
*&———————————————————————*
*& Form FCODE_DELETE_ROW *
*&———————————————————————*
FORM fcode_delete_row
USING P_TC_NAME TYPE DYNFNAM
P_TABLE_NAME
P_MARK_NAME .
*&SPWIZARD: BEGIN OF LOCAL DATA—————————————-*
DATA L_TABLE_NAME LIKE FELD-NAME.
FIELD-SYMBOLS <TC> TYPE cxtab_control.
FIELD-SYMBOLS <TABLE> TYPE STANDARD TABLE.
FIELD-SYMBOLS <WA>.
FIELD-SYMBOLS <MARK_FIELD>.
*&SPWIZARD: END OF LOCAL DATA——————————————*
ASSIGN (P_TC_NAME) TO <TC>.
*&SPWIZARD: get the table, which belongs to the tc *
CONCATENATE P_TABLE_NAME ‘[]’ INTO L_TABLE_NAME. “table body
ASSIGN (L_TABLE_NAME) TO <TABLE>. “not headerline
*&SPWIZARD: delete marked lines *
DESCRIBE TABLE <TABLE> LINES <TC>-LINES.
LOOP AT <TABLE> ASSIGNING <WA>.
*&SPWIZARD: access to the component ‘FLAG’ of the table header *
ASSIGN COMPONENT P_MARK_NAME OF STRUCTURE <WA> TO <MARK_FIELD>.
IF <MARK_FIELD> = ‘X’.
DELETE <TABLE> INDEX SYST-TABIX.
IF SY-SUBRC = 0.
<TC>-LINES = <TC>-LINES – 1.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM. ” FCODE_DELETE_ROW
*&———————————————————————*
*& Form COMPUTE_SCROLLING_IN_TC
*&———————————————————————*
* text
*———————————————————————-*
* –>P_TC_NAME name of tablecontrol
* –>P_OK ok code
*———————————————————————-*
FORM COMPUTE_SCROLLING_IN_TC USING P_TC_NAME
P_OK.
*&SPWIZARD: BEGIN OF LOCAL DATA—————————————-*
DATA L_TC_NEW_TOP_LINE TYPE I.
DATA L_TC_NAME LIKE FELD-NAME.
DATA L_TC_LINES_NAME LIKE FELD-NAME.
DATA L_TC_FIELD_NAME LIKE FELD-NAME.
FIELD-SYMBOLS <TC> TYPE cxtab_control.
FIELD-SYMBOLS <LINES> TYPE I.
*&SPWIZARD: END OF LOCAL DATA——————————————*
ASSIGN (P_TC_NAME) TO <TC>.
*&SPWIZARD: get looplines of TableControl *
CONCATENATE ‘G_’ P_TC_NAME ‘_LINES’ INTO L_TC_LINES_NAME.
ASSIGN (L_TC_LINES_NAME) TO <LINES>.
*&SPWIZARD: is no line filled? *
IF <TC>-LINES = 0.
*&SPWIZARD: yes, … *
L_TC_NEW_TOP_LINE = 1.
ELSE.
*&SPWIZARD: no, … *
CALL FUNCTION ‘SCROLLING_IN_TABLE’
EXPORTING
ENTRY_ACT = <TC>-TOP_LINE
ENTRY_FROM = 1
ENTRY_TO = <TC>-LINES
LAST_PAGE_FULL = ‘X’
LOOPS = <LINES>
OK_CODE = P_OK
OVERLAPPING = ‘X’
IMPORTING
ENTRY_NEW = L_TC_NEW_TOP_LINE
EXCEPTIONS
* NO_ENTRY_OR_PAGE_ACT = 01
* NO_ENTRY_TO = 02
* NO_OK_CODE_OR_PAGE_GO = 03
OTHERS = 0.
ENDIF.
*&SPWIZARD: get actual tc and column *
GET CURSOR FIELD L_TC_FIELD_NAME
AREA L_TC_NAME.
IF SYST-SUBRC = 0.
IF L_TC_NAME = P_TC_NAME.
*&SPWIZARD: et actual column *
SET CURSOR FIELD L_TC_FIELD_NAME LINE 1.
ENDIF.
ENDIF.
*&SPWIZARD: set the new top line *
<TC>-TOP_LINE = L_TC_NEW_TOP_LINE.
ENDFORM. ” COMPUTE_SCROLLING_IN_TC
*&———————————————————————*
*& Form FCODE_TC_MARK_LINES
*&———————————————————————*
* marks all TableControl lines
*———————————————————————-*
* –>P_TC_NAME name of tablecontrol
*———————————————————————-*
FORM FCODE_TC_MARK_LINES USING P_TC_NAME
P_TABLE_NAME
P_MARK_NAME.
*&SPWIZARD: EGIN OF LOCAL DATA—————————————–*
DATA L_TABLE_NAME LIKE FELD-NAME.
FIELD-SYMBOLS <TC> TYPE cxtab_control.
FIELD-SYMBOLS <TABLE> TYPE STANDARD TABLE.
FIELD-SYMBOLS <WA>.
FIELD-SYMBOLS <MARK_FIELD>.
*&SPWIZARD: END OF LOCAL DATA——————————————*
ASSIGN (P_TC_NAME) TO <TC>.
*&SPWIZARD: get the table, which belongs to the tc *
CONCATENATE P_TABLE_NAME ‘[]’ INTO L_TABLE_NAME. “table body
ASSIGN (L_TABLE_NAME) TO <TABLE>. “not headerline
*&SPWIZARD: mark all filled lines *
LOOP AT <TABLE> ASSIGNING <WA>.
*&SPWIZARD: access to the component ‘FLAG’ of the table header *
ASSIGN COMPONENT P_MARK_NAME OF STRUCTURE <WA> TO <MARK_FIELD>.
<MARK_FIELD> = ‘X’.
ENDLOOP.
ENDFORM. “fcode_tc_mark_lines
*&———————————————————————*
*& Form FCODE_TC_DEMARK_LINES
*&———————————————————————*
* demarks all TableControl lines
*———————————————————————-*
* –>P_TC_NAME name of tablecontrol
*———————————————————————-*
FORM FCODE_TC_DEMARK_LINES USING P_TC_NAME
P_TABLE_NAME
P_MARK_NAME .
*&SPWIZARD: BEGIN OF LOCAL DATA—————————————-*
DATA L_TABLE_NAME LIKE FELD-NAME.
FIELD-SYMBOLS <TC> TYPE cxtab_control.
FIELD-SYMBOLS <TABLE> TYPE STANDARD TABLE.
FIELD-SYMBOLS <WA>.
FIELD-SYMBOLS <MARK_FIELD>.
*&SPWIZARD: END OF LOCAL DATA——————————————*
ASSIGN (P_TC_NAME) TO <TC>.
*&SPWIZARD: get the table, which belongs to the tc *
CONCATENATE P_TABLE_NAME ‘[]’ INTO L_TABLE_NAME. “table body
ASSIGN (L_TABLE_NAME) TO <TABLE>. “not headerline
*&SPWIZARD: demark all filled lines *
LOOP AT <TABLE> ASSIGNING <WA>.
*&SPWIZARD: access to the component ‘FLAG’ of the table header *
ASSIGN COMPONENT P_MARK_NAME OF STRUCTURE <WA> TO <MARK_FIELD>.
<MARK_FIELD> = SPACE.
ENDLOOP.
ENDFORM. “fcode_tc_mark_lines
*&———————————————————————*
*& Module STATUS_0100 OUTPUT
*&———————————————————————*
* text
*———————————————————————-*
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS ‘STATUS’.
* SET TITLEBAR ‘xxx’.
ENDMODULE. ” STATUS_0100 OUTPUT
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/20073.html