Автор Тема: Динамическое формирование имени поля для записи значения (Dynamic fieldname)  (Прочитано 27394 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Greed

  • Гость
Доброе утро. Подскажите, как оптимально заполнить поля таблицы, если скажем есть такая структура:
Код: You are not allowed to view links. Register or Login
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, что бы не плодить строки кода. Как это сделать? Т.е. примерно так должно выглядеть:
Код: You are not allowed to view links. Register or Login
 do 4 times.
  l_tabl-name(sy-index) = "значение" .
  ENDDO.
« Последнее редактирование: Сентябрь 01, 2010, 12:52:48 pm от Dmitriy »

Greed

  • Гость
Все, сделал, вот так:
Код: You are not allowed to view links. Register or Login
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.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Ну да использование филдсимволов... хотя может Dmitriy-й подскажет есть оператор получения полей структуры, сейчас без системы не подскажу, так вот им тоже можно красиво воспользоваться, особенно если вы знаете что есть поля типа NAME*, но не ясно что дальше после NAME стоит, да и еще не ясно сколько точно этих там полей вида NAME* есть в структуре.
« Последнее редактирование: Сентябрь 01, 2010, 11:39:18 am от Dmitriy »

Оффлайн Dmitriy

  • SAP ECC 6.0
  • Кухня
  • Newbie
  • *
  • Сообщений: 380
  • Репутация: +0/-0
  • Пол: Мужской
  • Embracive Fire
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Код: You are not allowed to view links. Register or Login
 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.
« Последнее редактирование: Сентябрь 01, 2010, 11:03:50 am от Dmitriy »

Greed

  • Гость
а не этот ли имеется ввиду? GET_COMPONENT_LIST - возвращает список полей структуры/внутренней таблицы. ;)

Оффлайн Dmitriy

  • SAP ECC 6.0
  • Кухня
  • Newbie
  • *
  • Сообщений: 380
  • Репутация: +0/-0
  • Пол: Мужской
  • Embracive Fire
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
You are not allowed to view links. Register or Login
Все, сделал, вот так:
Код: You are not allowed to view links. Register or Login
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.
Код: You are not allowed to view links. Register or Login
SELECT SINGLE (fnam) INTO <fval> FROM lfa1 WHERE lifnr = ZTDLNR.Но почему нельзя выбрать все 4 поля сразу же, если известен код кредитора?
« Последнее редактирование: Сентябрь 01, 2010, 12:05:59 pm от Dmitriy »

Оффлайн Dmitriy

  • SAP ECC 6.0
  • Кухня
  • Newbie
  • *
  • Сообщений: 380
  • Репутация: +0/-0
  • Пол: Мужской
  • Embracive Fire
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
You are not allowed to view links. Register or Login
FM 'GET_COMPONENT_LIST' - возвращает список полей структуры/внутренней таблицы.
Не вернёт таблицу компонентов в случае, если fieldname = 'GT_DATA', т.е. таблица без HEADER LINE.
Код: You are not allowed to view links. Register or Login
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. " Пустая
« Последнее редактирование: Сентябрь 01, 2010, 12:36:28 pm от Dmitriy »

Оффлайн A.

  • Newbie
  • *
  • Сообщений: 110
  • Репутация: +1/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
RTTI - Run Time Type Identification

Код: You are not allowed to view links. Register or Login
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

Sapforum.Biz