Есть такая особенность(баг) у визарда таблиц. Когда делал сам первую, то решил воспользоваться им. Дело оказалось в неправильном расчете индексов - первая выводимая запись таблицы и т.д. Исследовал сам и правил сгенерированный код. Щас точно не помню что именно, ниже код работающего экрана с обработкой добавления, удаления строк по кнопке. Добавление по одной. Далее ключевое поле(поля) становятся недоступны для редактирования.
Code:
PROGRAM ZAUTO MESSAGE-ID ZAUTO LINE-SIZE 132.
tables: zaumd, zaumd_str.
....
***INCLUDE ZAUTOT102 .
*&spwizard: type for the data of tablecontrol 'MDRV'
types: begin of t_MDRV,
MANDT like ZAUMD_STR-MANDT,
TBNM like ZAUMD_STR-TBNM,
FIO like ZAUMD_STR-FIO,
PROF like ZAUMD_STR-PROF,
CTGR like ZAUMD_STR-CTGR,
WTCH like ZAUMD_STR-WTCH,
CITY like ZAUMD_STR-CITY,
NPROF like ZAUMD_STR-NPROF,
flag, "flag for mark column
end of t_MDRV.
*&spwizard: internal table for tablecontrol 'MDRV'
data: g_MDRV_itab type t_MDRV occurs 0,
g_MDRV_new type t_MDRV occurs 0,
g_MDRV_del type t_MDRV occurs 0,
g_MDRV_wa type t_MDRV. "work area
data: g_MDRV_copied. "copy flag
types: begin of t_PROF,
PROF like ZAUMD_STR-PROF,
NPROF like ZAUMD_STR-NPROF,
end of t_PROF.
data: g_PROF_itab type t_PROF occurs 0,
g_PROF_wa type t_PROF.
data: g_PROF_copied. "copy flag
*&spwizard: declaration of tablecontrol 'MDRV' itself
controls: MDRV type tableview using screen 0102.
*&spwizard: lines of tablecontrol 'MDRV'
data: g_MDRV_lines like sy-loopc.
data: g_MDRV_topline like sy-loopc.
data: OK_CODE like sy-ucomm.
...
*----------------------------------------------------------------------*
***INCLUDE ZAUTOI102 .
*----------------------------------------------------------------------*
module MDRV_user_command INPUT.
OK_CODE = sy-ucomm.
perform user_ok_tc using 'MDRV'
'G_MDRV_ITAB'
'G_MDRV_DEL'
'FLAG'
changing OK_CODE.
sy-ucomm = OK_CODE.
endmodule.
module MDRV_modify input.
move-corresponding ZAUMD_STR to g_MDRV_wa.
read table g_PROF_itab into g_PROF_wa
with key PROF = g_MDRV_wa-PROF.
if sy-subrc = 0.
g_MDRV_wa-NPROF = g_PROF_wa-NPROF.
else.
clear g_MDRV_wa-NPROF.
endif.
modify g_MDRV_itab
from g_MDRV_wa
index MDRV-current_line.
if sy-subrc <> 0.
append g_MDRV_wa to g_MDRV_itab.
endif.
endmodule.
module MDRV_mark input.
if MDRV-line_sel_mode = 1 and
g_MDRV_wa-flag = 'X'.
loop at g_MDRV_itab into g_MDRV_wa
where flag = 'X'.
g_MDRV_wa-flag = ''.
modify g_MDRV_itab
from g_MDRV_wa
transporting flag.
endloop.
g_MDRV_wa-flag = 'X'.
endif.
modify g_MDRV_itab
from g_MDRV_wa
index MDRV-current_line
transporting flag.
endmodule.
module user_command_0102 input.
OK_CODE = sy-ucomm.
case OK_CODE.
when 'BACK'.
refresh: g_MDRV_itab, g_PROF_itab.
clear: g_MDRV_copied, g_PROF_copied.
set screen 101.
leave screen.
when 'SAVE'.
perform save_MDRV_data.
endcase.
endmodule.
module MDRV_tbnm_check input.
read table g_MDRV_itab into g_MDRV_wa
with key TBNM = ZAUMD_STR-TBNM.
if sy-subrc = 0.
message E002 with g_MDRV_wa-tbnm g_MDRV_wa-fio.
endif.
endmodule.
...
*----------------------------------------------------------------------*
***INCLUDE ZAUTOO102 .
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module STATUS_0102 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE STATUS_0102 OUTPUT.
SET PF-STATUS 'S0102'.
SET TITLEBAR 'T0102'.
ENDMODULE. " STATUS_0102 OUTPUT
*&spwizard: output module for tc 'MDRV'. do not change this line!
*&spwizard: copy ddic-table to itab
module MDRV_init output.
if g_MDRV_copied is initial.
*&spwizard: copy ddic-table 'ZAUMD'
*&spwizard: into internal table 'g_MDRV_itab'
select * from ZAUMD
into corresponding fields
of table g_MDRV_itab.
g_MDRV_copied = 'X'.
refresh control 'MDRV' from screen '0102'.
refresh g_MDRV_del.
endif.
if g_PROF_copied is initial.
select * from ZAUMPT
into corresponding fields
of table g_PROF_itab
where lang = sy-langu.
loop at g_MDRV_itab into g_MDRV_wa.
read table g_PROF_itab into g_PROF_wa
with key PROF = g_MDRV_wa-PROF.
if sy-subrc = 0.
g_MDRV_wa-NPROF = g_PROF_wa-NPROF.
else.
clear g_MDRV_wa-NPROF.
endif.
modify g_MDRV_itab from g_MDRV_wa transporting NPROF.
endloop.
g_PROF_copied = 'X'.
endif.
endmodule.
*&spwizard: output module for tc 'MDRV'. do not change this line!
*&spwizard: move itab to dynpro
module MDRV_move output.
if MDRV-current_line GT MDRV-lines.
EXIT FROM STEP-LOOP.
endif.
move-corresponding g_MDRV_wa to ZAUMD_STR.
if not ZAUMD_STR-TBNM is initial.
loop at screen.
if screen-name = 'ZAUMD_STR-TBNM'.
screen-input = 0.
modify screen.
endif.
endloop.
endif.
endmodule.
*&spwizard: output module for tc 'MDRV'. do not change this line!
*&spwizard: get lines of tablecontrol
module MDRV_get_lines output.
g_MDRV_lines = sy-loopc.
endmodule.
...
***INCLUDE ZAUTOF102 .
*----------------------------------------------------------------------*
* INCLUDE TABLECONTROL_FORMS *
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form USER_OK_TC *
*&---------------------------------------------------------------------*
FORM USER_OK_TC USING P_TC_NAME TYPE DYNFNAM
P_TABLE_NAME
P_TABLE_DEL
P_MARK_NAME
CHANGING P_OK LIKE SY-UCOMM.
*-BEGIN OF LOCAL DATA--------------------------------------------------*
DATA: L_OK TYPE SY-UCOMM,
L_OFFSET TYPE I.
*-END OF LOCAL DATA----------------------------------------------------*
L_OK = P_OK.
* 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 'DELE'. "delete row
PERFORM FCODE_DELETE_ROW USING P_TC_NAME
P_TABLE_NAME
P_TABLE_DEL
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 '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.
ENDCASE.
ENDFORM. " USER_OK_TC
*&---------------------------------------------------------------------*
*& Form FCODE_INSERT_ROW *
*&---------------------------------------------------------------------*
FORM fcode_insert_row
USING P_TC_NAME TYPE DYNFNAM
P_TABLE_NAME .
*-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.
*-END OF LOCAL DATA----------------------------------------------------*
ASSIGN (P_TC_NAME) TO <TC>.
* 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
* get looplines of TableControl
CONCATENATE 'G_' P_TC_NAME '_LINES' INTO L_LINES_NAME.
ASSIGN (L_LINES_NAME) TO <LINES>.
* 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 and new cursor line *
if l_selline > <lines>.
<tc>-top_line = l_selline - <lines>.
else.
<tc>-top_line = 1.
endif.
else. " insert line into table
l_selline = <tc>-top_line + l_selline.
l_lastline = <tc>-top_line + <lines> - 1.
endif.
*&SPWIZARD: set new cursor line *
l_line = l_selline - <tc>-top_line + 1.
* insert initial line
INSERT INITIAL LINE INTO <TABLE> INDEX L_SELLINE.
<TC>-LINES = <TC>-LINES + 1.
* 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_TABLE_DEL
P_MARK_NAME .
*-BEGIN OF LOCAL DATA--------------------------------------------------*
DATA L_TABLE_NAME LIKE FELD-NAME.
DATA CURR_INDEX LIKE SY-TABIX.
FIELD-SYMBOLS <TC> TYPE cxtab_control.
FIELD-SYMBOLS <TABLE> TYPE STANDARD TABLE.
FIELD-SYMBOLS <DELTAB> TYPE STANDARD TABLE.
FIELD-SYMBOLS <WA>.
FIELD-SYMBOLS <MARK_FIELD>.
*-END OF LOCAL DATA----------------------------------------------------*
ASSIGN (P_TC_NAME) TO <TC>.
* 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
* get the del table *
CONCATENATE P_TABLE_DEL '[]' INTO L_TABLE_NAME. "table body
ASSIGN (L_TABLE_NAME) TO <DELTAB>. "not headerline
* delete marked lines *
DESCRIBE TABLE <TABLE> LINES <TC>-LINES.
LOOP AT <TABLE> ASSIGNING <WA>.
CURR_INDEX = SYST-TABIX.
* access to the component 'FLAG' of the table header *
ASSIGN COMPONENT P_MARK_NAME OF STRUCTURE <WA> TO <MARK_FIELD>.
IF <MARK_FIELD> = 'X'.
APPEND <WA> TO <DELTAB>.
DELETE <TABLE> INDEX CURR_INDEX.
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.
*-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.
*-END OF LOCAL DATA----------------------------------------------------*
ASSIGN (P_TC_NAME) TO <TC>.
* get looplines of TableControl
CONCATENATE 'G_' P_TC_NAME '_LINES' INTO L_TC_LINES_NAME.
ASSIGN (L_TC_LINES_NAME) TO <LINES>.
* is no line filled? *
IF <TC>-LINES = 0.
* yes, ... *
L_TC_NEW_TOP_LINE = 1.
ELSE.
* 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.
* 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.
* set actual column *
SET CURSOR FIELD L_TC_FIELD_NAME LINE 1.
ENDIF.
ENDIF.
* 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.
*-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>.
*-END OF LOCAL DATA----------------------------------------------------*
ASSIGN (P_TC_NAME) TO <TC>.
* 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
* mark all filled lines *
LOOP AT <TABLE> ASSIGNING <WA>.
* 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 .
*-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>.
*-END OF LOCAL DATA----------------------------------------------------*
ASSIGN (P_TC_NAME) TO <TC>.
* 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
* demark all filled lines *
LOOP AT <TABLE> ASSIGNING <WA>.
* 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
*&---------------------------------------------------------------------*
*& Form SAVE_DATA
*&---------------------------------------------------------------------*
* Save data to DDIC table
*----------------------------------------------------------------------*
form save_MDRV_data.
* data del_items like g_MDRV_itab with header line.
* select * into corresponding fields of table del_items from ZAUMD.
* loop at del_items.
* read table g_MDRV_itab into g_MDRV_wa from del_items.
* if sy-subrc = 0.
* delete del_items.
* endif.
* endloop.
delete ZAUMD from table g_MDRV_del.
refresh g_MDRV_del.
modify ZAUMD from table g_MDRV_itab.
commit work.
endform.
Вроде ничего не забыл.
Насколько помню, стоит обратить внимание на формы USER_OK_TC,
fcode_insert_row, fcode_delete_row