Listbox en una celda en ALV OO
mayo 29, 2022
Existe la posibilidad de poder filtrar registros en una vista de mantenimiento por objeto de autorización. Para ello, luego de haber creado la vista correspondiente, y dentro de la sección de eventos, se debe seleccionar el evento ‘AA’, que es el que reemplaza la lectura estandar de la tabla.
Luego, cuando nos aparece la opción para definir el include, y desarrollar el código, debemos copiar lo siguiente (solo hay que adaptar el código que está en color azul, con el objeto de autorización correspondiente y el campo a controlar):
CONSTANTS maxsellines TYPE i VALUE 500.
DATA: tgd_sellist LIKE vimsellist OCCURS 10,
tgd_sel LIKE vimsellist,
tgd_sellangu LIKE vimsellist,
short_sellist LIKE vimsellist OCCURS 10,
short_sel LIKE vimsellist,
tgd_ind TYPE i,
tgd_field LIKE vimnamtab-viewfield,
selnumber TYPE i,
selindex TYPE i,
selcut TYPE i,
selpieces TYPE i,
primtab TYPE REF TO data,
texttab TYPE REF TO data,
w_texttab_save TYPE REF TO data,
w_texttab TYPE REF TO data,
text_keyflds TYPE vim_flds_tab_type,
append_flag(1) TYPE c,
v_tab TYPE /scl/t_agt_not.
FIELD-SYMBOLS: <text_key> TYPE ANY,
<primtab> TYPE STANDARD TABLE,
<texttab> TYPE SORTED TABLE,
<w_texttab> TYPE ANY,
<w_texttab_save> TYPE ANY,
<textline_x> TYPE x.
REFRESH total.
CLEAR total.
IF x_header-selection NE space.
DESCRIBE TABLE dba_sellist LINES selnumber.
IF selnumber GT maxsellines. “fragmentation of too large sellists
CLEAR selpieces.
CLEAR selindex.
CREATE DATA primtab TYPE STANDARD TABLE OF (x_header-maintview).
ASSIGN primtab->* TO <primtab>.
WHILE selindex LT selnumber.
selpieces = selpieces + maxsellines.
REFRESH short_sellist.
CLEAR selcut.
WHILE selcut EQ 0 AND selindex < selnumber.
selindex = selindex + 1.
READ TABLE dba_sellist INTO short_sel INDEX selindex.
APPEND short_sel TO short_sellist.
IF selindex GT selpieces AND short_sel-and_or NE ‘AND’.
selcut = 1.
ENDIF.
ENDWHILE.
CLEAR short_sel-and_or. “last line without logic operation
MODIFY short_sellist FROM short_sel INDEX selindex.
CALL FUNCTION ‘VIEW_FILL_WHERETAB’
EXPORTING
tablename = x_header-maintview
TABLES
sellist = short_sellist
wheretab = vim_wheretab
x_namtab = x_namtab
EXCEPTIONS
no_conditions_for_table = 01.
* read data from database with morer wheretabs……………….*
SELECT * FROM (x_header-maintview) APPENDING TABLE <primtab>
WHERE (vim_wheretab).
CLEAR selcut.
ENDWHILE.
ELSE. “selnumber > maxsellines
CALL FUNCTION ‘VIEW_FILL_WHERETAB’
EXPORTING
tablename = x_header-maintview
TABLES
sellist = dba_sellist
wheretab = vim_wheretab
x_namtab = x_namtab
EXCEPTIONS
no_conditions_for_table = 01.
* read data from database with one wheretab……………………..*
CREATE DATA primtab TYPE STANDARD TABLE OF (x_header-maintview).”UCb
ASSIGN primtab->* TO <primtab>.
SELECT * FROM (x_header-maintview) INTO TABLE <primtab>
WHERE (vim_wheretab).
ENDIF. “if selnumber > maxsellines
ELSE. “if x_header-selection NE space
REFRESH vim_wheretab.
* read data from database without wheretab………………………*
CREATE DATA primtab TYPE STANDARD TABLE OF (x_header-maintview).”UCb
ASSIGN primtab->* TO <primtab>.
SELECT * FROM (x_header-maintview) INTO TABLE <primtab>.
ENDIF. “if x_header-selection NE space
IF x_header-texttbexst EQ space.
* No texttable
LOOP AT <primtab> INTO <vim_total_struc>.
v_tab = <vim_total_struc>.
AUTHORITY-CHECK OBJECT ‘Z_TABU_BUK’
ID ‘ACTVT’ FIELD ’02’
ID ‘BUKRS’ FIELD v_tab-comp_code.
IF sy-subrc = 0.
APPEND total.
ENDIF.
ENDLOOP. “UCe
SORT total BY <vim_xtotal_key>. <status>-alr_sorted = ‘R’.
IF x_header-selection EQ space AND x_header-delmdtflag NE space.
* time dependence
PERFORM build_mainkey_tab_0.
ENDIF.
LOOP AT total.
CLEAR: <action>, <mark>.
MODIFY total.
IF x_header-selection EQ space AND x_header-delmdtflag NE space.
PERFORM build_mainkey_tab_1.
ENDIF.
ENDLOOP.
IF x_header-selection EQ space AND x_header-delmdtflag NE space.
PERFORM build_mainkey_tab_2.
ENDIF.
ELSE.
* texttable exists
PERFORM vim_get_text_keyflds USING x_header-texttab
CHANGING text_keyflds.
CREATE DATA texttab TYPE SORTED TABLE OF (x_header-texttab)
WITH UNIQUE KEY (text_keyflds). “UCb
ASSIGN texttab->* TO <texttab>.
IF x_header-selection NE space.
* get selection for texttable
* READ TABLE dba_sellist INTO dpl_sellist INDEX 1.
DESCRIBE TABLE dba_sellist LINES selnumber.
selindex = 0.
WHILE selindex LT selnumber.
selindex = selindex + 1.
READ TABLE dba_sellist INTO tgd_sel INDEX selindex.
READ TABLE x_namtab WITH KEY
viewfield = tgd_sel-viewfield texttabfld = space. “#EC *
CHECK x_namtab-keyflag = ‘X’. ” key fields for texttab only
tgd_sel-viewfield = x_namtab-txttabfldn.
READ TABLE x_namtab WITH KEY
viewfield = tgd_sel-viewfield texttabfld = ‘X’.
tgd_sel-tabix = sy-tabix.
CLEAR append_flag.
IF sy-subrc EQ 0.”Otherwise keyfld in tab not in txttab HW696310
append_flag = ‘X’.
ENDIF.
IF tgd_sel-and_or NE ‘AND’ OR selindex = 1. “Langufield
READ TABLE x_namtab WITH KEY primtabkey = 0 keyflag = ‘X’.
tgd_sellangu-viewfield = x_namtab-viewfield.
tgd_sellangu-tabix = sy-tabix.
tgd_sellangu-operator = ‘EQ’.
tgd_sellangu-value = sy-langu.
tgd_sellangu-and_or = ‘AND’.
IF tgd_sellangu-value EQ space.
tgd_sellangu-initial = ‘X’.
ENDIF.
tgd_sellangu-cond_kind = dpl_sellist-cond_kind.
CLEAR tgd_sellangu-converted.
APPEND tgd_sellangu TO tgd_sellist.
ENDIF.
IF append_flag EQ ‘X’.
APPEND tgd_sel TO tgd_sellist.
ENDIF.
ENDWHILE.
DESCRIBE TABLE tgd_sellist.
READ TABLE tgd_sellist INDEX sy-tfill INTO tgd_sel.
IF tgd_sel-and_or NE space.
CLEAR tgd_sel-and_or.
MODIFY tgd_sellist INDEX sy-tfill FROM tgd_sel.
ENDIF.
ELSE.
* no selection for primary table: fill selection with langu-field only
LOOP AT x_namtab WHERE keyflag NE space “fill sellist with
AND texttabfld NE space “language condition
AND primtabkey EQ 0.
tgd_sel-viewfield = x_namtab-viewfield.
tgd_sel-tabix = sy-tabix.
tgd_sel-operator = ‘EQ’.
tgd_sel-value = sy-langu.
tgd_sel-and_or = space.
IF tgd_sel-value EQ space.
tgd_sel-initial = ‘X’.
ENDIF.
APPEND tgd_sel TO tgd_sellist.
EXIT.
ENDLOOP.
ENDIF.
DESCRIBE TABLE tgd_sellist LINES selnumber.
IF selnumber GT maxsellines. “fragmentation of too large sellists
CLEAR selpieces.
CLEAR selindex.
WHILE selindex LT selnumber.
selpieces = selpieces + maxsellines.
REFRESH short_sellist.
CLEAR selcut.
WHILE selcut EQ 0 AND selindex < selnumber.
selindex = selindex + 1.
READ TABLE tgd_sellist INTO short_sel INDEX selindex.
APPEND short_sel TO short_sellist.
IF selindex GT selpieces AND short_sel-and_or NE ‘AND’.
selcut = 1.
ENDIF.
ENDWHILE.
CLEAR short_sel-and_or. “last line without logic operation
MODIFY short_sellist FROM short_sel INDEX selindex.
CALL FUNCTION ‘VIEW_FILL_WHERETAB’
EXPORTING
tablename = x_header-texttab
only_cnds_for_keyflds = ‘X’
TABLES
sellist = short_sellist
wheretab = vim_wheretab
x_namtab = x_namtab
EXCEPTIONS
no_conditions_for_table = 01.
* read data from database with morer wheretabs……………….*
SELECT * FROM (x_header-texttab) APPENDING TABLE <texttab>
WHERE (vim_wheretab).
CLEAR selcut.
ENDWHILE.
ELSE. “selnumber > maxsellines
CALL FUNCTION ‘VIEW_FILL_WHERETAB’
EXPORTING
tablename = x_header-texttab
only_cnds_for_keyflds = ‘X’
TABLES
sellist = tgd_sellist
wheretab = vim_wheretab
x_namtab = x_namtab
EXCEPTIONS
no_conditions_for_table = 01.
* read data from database with one wheretab……………………..*
SELECT * FROM (x_header-texttab) INTO TABLE <texttab>
WHERE (vim_wheretab).
ENDIF. “if selnumber > maxsellines
IF x_header-selection EQ space AND x_header-delmdtflag NE space.
PERFORM build_mainkey_tab_0.
ENDIF.
CREATE DATA w_texttab_save TYPE (x_header-texttab).
CREATE DATA w_texttab TYPE (x_header-texttab).
ASSIGN: w_texttab->* TO <w_texttab>,
w_texttab_save->* TO <w_texttab_save>,
<w_texttab_save> TO <textline_x> CASTING.
LOOP AT <primtab> INTO <vim_total_struc>.
* hier aufbauen schlüssel texttabelle in feld text_key
CLEAR <w_texttab>.
PERFORM fill_texttab_key_uc USING <vim_total_struc>
CHANGING <w_texttab>.
IF <w_texttab> NE <w_texttab_save>.
READ TABLE <texttab> INTO <w_texttab_save>
FROM <w_texttab>.
IF sy-subrc = 0.
ELSE.
MOVE <text_initial> TO <w_texttab_save>.
ENDIF.
ENDIF.
MOVE <textline_x> TO <vim_xtotal_text>.
CLEAR: <action>, <mark>, <action_text>.
v_tab = <vim_total_struc>.
AUTHORITY-CHECK OBJECT ‘Z_TABU_BUK’
ID ‘ACTVT’ FIELD ’02’
ID ‘BUKRS’ FIELD v_tab-comp_code.
IF sy-subrc = 0.
APPEND total.
ENDIF.
IF x_header-selection EQ space AND x_header-delmdtflag NE space.
PERFORM build_mainkey_tab_1.
ENDIF.
ENDLOOP.
SORT total BY <vim_xtotal_key>. <status>-alr_sorted = ‘R’.
IF x_header-selection EQ space AND x_header-delmdtflag NE space.
PERFORM build_mainkey_tab_2.
ENDIF.
ENDIF.
*.check dynamic selectoptions (not in DDIC)………………………*
IF x_header-selection NE space.
PERFORM check_dynamic_select_options.
ENDIF.
mayo 29, 2022
mayo 29, 2022
mayo 29, 2022
mayo 29, 2022
mayo 29, 2022