Sapforum.Biz
Инструменты => ABAP - Инструментальные средства => Тема начата: Greed от Сентябрь 01, 2010, 10:19:12 am
-
Доброе утро. Подскажите, как оптимально заполнить поля таблицы, если скажем есть такая структура:
TYPES: BEGIN OF str_tabl.
TYPES: name1 TYPE LFA1-NAME1.
TYPES: name2 TYPE LFA1-NAME1.
TYPES: name3 TYPE LFA1-NAME1.
TYPES: name4 TYPE LFA1-NAME1.
TYPES: END OF str_tabl.
DATA: t_tabl TYPE STANDARD TABLE OF str_tabl.
DATA: l_tabl LIKE LINE OF t_tabl.
необходимо в name1, name2... при входи в цикл записывать значение, при каждой итерации менять так сказать индекс у name, что бы не плодить строки кода. Как это сделать? Т.е. примерно так должно выглядеть:
do 4 times.
l_tabl-name(sy-index) = "значение" .
ENDDO.
-
Все, сделал, вот так:
do 5 times.
...
indexforname = sy-index.
CONCATENATE 'l_tabl-name' indexforname INTO fname.
assign (fname) to <fs_pernr>.
SELECT SINGLE NAME1
FROM lfa1
INTO <fs_pernr>
WHERE lifnr = ZTDLNR.
enddo.
-
Ну да использование филдсимволов... хотя может Dmitriy-й подскажет есть оператор получения полей структуры, сейчас без системы не подскажу, так вот им тоже можно красиво воспользоваться, особенно если вы знаете что есть поля типа NAME*, но не ясно что дальше после NAME стоит, да и еще не ясно сколько точно этих там полей вида NAME* есть в структуре.
-
DATA: fnam TYPE fieldname, lv TYPE n.
FIELD-SYMBOLS: <fval> TYPE ANY.
DO 4 TIMES.
lv = sy-index.
CONCATENATE 'NAME' lv INTO fnam.
ASSIGN COMPONENT fnam OF STRUCTURE l_tabl TO <fval>.
IF <fval> IS ASSIGNED.
<fval> = fnam. " Your value/subroutine here
ENDIF.
ENDDO.
-
а не этот ли имеется ввиду? GET_COMPONENT_LIST - возвращает список полей структуры/внутренней таблицы. ;)
-
Все, сделал, вот так:
do 5 times.
...
indexforname = sy-index.
CONCATENATE 'l_tabl-name' indexforname INTO fname.
assign (fname) to <fs_pernr>.
SELECT SINGLE NAME1
FROM lfa1
INTO <fs_pernr>
WHERE lifnr = ZTDLNR.
enddo.
SELECT SINGLE (fnam) INTO <fval> FROM lfa1 WHERE lifnr = ZTDLNR.
Но почему нельзя выбрать все 4 поля сразу же, если известен код кредитора?
-
FM 'GET_COMPONENT_LIST' - возвращает список полей структуры/внутренней таблицы.
Не вернёт таблицу компонентов в случае, если fieldname = 'GT_DATA', т.е. таблица без HEADER LINE.
DATA: ls_main TYPE main_type. " Обработает
DATA: lt_main LIKE ls_main OCCURS 0 WITH HEADER LINE. " Обработает
DATA: gt_data TYPE TABLE OF main_type. " Не подходит
DATA: it_comp TYPE TABLE OF rstrucinfo.
CALL FUNCTION 'GET_COMPONENT_LIST'
EXPORTING
program = sy-repid
fieldname = 'GT_DATA'
TABLES
components = it_comp. " Пустая
-
RTTI - Run Time Type Identification
interface lif_get_name_inn_kpp.
methods:
prepare_uni
importing
reference(i_ref_tab) type table,
* ...
endinterface. "lif_get_name_inn_kpp
*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
class lcl_get_name_inn_kpp definition create public.
public section.
interfaces: lif_get_name_inn_kpp.
* ...
private section.
data: t_vkont_2dat type tt_vkont_2dat.
* ...
endclass. "lcl_get_name_inn_kpp DEFINITION
*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
class lcl_get_name_inn_kpp implementation.
method lif_get_name_inn_kpp~prepare_uni.
data: lo_table_type_s type ref to cl_abap_tabledescr,
lo_struct_type_s type ref to cl_abap_structdescr,
lt_comp_tab_s type cl_abap_structdescr=>included_view,
lo_table_type_t type ref to cl_abap_tabledescr,
lo_struct_type_t type ref to cl_abap_structdescr,
lt_comp_tab_t type cl_abap_structdescr=>included_view,
ls_data type ref to data,
l_index type i.
field-symbols: <comp> like line of lt_comp_tab_s,
<line_s> type any,
<field_s> type any,
<line_t> type any,
<field_t> type any.
data: ls_vkont_2dat type ty_vkont_2dat.
field-symbols: <lfs_dfkk> type t_dfkk_,
<lfs_vkont_2dat> type ty_vkont_2dat.
lo_table_type_s ?= cl_abap_typedescr=>describe_by_data( i_ref_tab ).
lo_struct_type_s ?= lo_table_type_s->get_table_line_type( ).
lt_comp_tab_s = lo_struct_type_s->get_included_view( ).
lo_table_type_t ?= cl_abap_typedescr=>describe_by_data( me->t_vkont_2dat ).
lo_struct_type_t ?= lo_table_type_t->get_table_line_type( ).
lt_comp_tab_t = lo_struct_type_t->get_included_view( ).
create data ls_data type handle lo_struct_type_t.
assign ls_data->* to <line_t>.
loop at i_ref_tab assigning <line_s>.
clear <line_t>.
loop at lt_comp_tab_t assigning <comp>.
assign component <comp>-name of structure <line_t> to <field_t>.
assign component <comp>-name of structure <line_s> to <field_s>.
<field_t> = <field_s>.
endloop.
insert <line_t> into table me->t_vkont_2dat.
endloop.
endmethod.
* ...
endclass. "lcl_get_name_inn_kpp IMPLEMENTATION