Как извлечь динамический ключ таблицы из поля таблицы CDPOS TABKEY в структуру?

Мне нужно получить соответствующие поля из cdpos-tabkey динамически. Скажем, например, мне нужно получить растение, материал и т. Д. Из tabkey.

До сих пор я пробовал использовать приведенный ниже код, но при использовании оператора MOVE получаю ошибку конфликта типов. Когда я использую оператор ASSIGN, значения присваиваются точно так же, как переменные, а не как формат структуры, и я не могу получить точное поле из структуры.

FIELD-SYMBOLS <table> TYPE any.
DATA ls_data TYPE REF TO data.
CREATE DATA ls_data TYPE (t_cdpos-tabname).
ASSIGN ls_data->* TO <table>.
*MOVE-CORRESPONDING t_cdpos-tabkey TO <table>.
*<table> = t_cdpos-tabkey.
ASSIGN t_cdpos-tabkey to <table>.

кто-нибудь, пожалуйста, помогите мне решить.


person Archana Palani    schedule 12.06.2017    source источник
comment
Вы хотите переместить ключевые поля?   -  person    schedule 12.06.2017
comment
@lausek Да, мое требование - преобразовать ключевые поля в формат структуры, смещение не рекомендуется, потому что имя вкладки будет динамически изменяться.   -  person Archana Palani    schedule 12.06.2017


Ответы (2)


Для этой задачи вы можете использовать конструкцию CASTING TYPE. Вот пример решения на основе RTTS:

DATA: handle        TYPE REF TO data,
      lref_struct TYPE REF TO cl_abap_structdescr.

SELECT DISTINCT * UP TO 100 ROWS
  FROM cdpos
  INTO TABLE @DATA(t_cdpos)
  WHERE tabname NOT LIKE '/%'.

LOOP AT t_cdpos ASSIGNING FIELD-SYMBOL(<fs_cdpos>).
  lref_struct ?= cl_abap_structdescr=>describe_by_name( <fs_cdpos>-tabname ).

* get key fields
  DATA(key_fields) = VALUE ddfields( FOR line IN lref_struct->get_ddic_field_list( ) WHERE ( keyflag NE space ) ( line ) ).

* filling key field components
  DATA(key_table) = VALUE abap_component_tab( FOR ls_key IN key_fields
                                              ( name = ls_key-fieldname
                                                type = CAST #( cl_abap_datadescr=>describe_by_name( ls_key-domname ) )
                                               )
                                            ).
* create key fields type handle
  TRY.
      DATA(r_type_struct) = cl_abap_structdescr=>create( key_table ).
    CATCH cx_sy_struct_creation .
  ENDTRY.

* create key type
  CHECK r_type_struct IS NOT INITIAL.
  CREATE DATA handle TYPE HANDLE r_type_struct.
  ASSIGN handle->* TO FIELD-SYMBOL(<structure>).

* assigning final key structure
  ASSIGN <fs_cdpos>-tabkey TO <structure> CASTING TYPE HANDLE r_type_struct.
ENDLOOP.

UPD: Что касается вопроса OP об адресе структуры результата, нельзя обращаться к его компонентам по имени (например, WERKS), так как нельзя заранее знать его тип, поскольку он изменяется динамически. Вы должны получить доступ к таким компонентам структуры, как:

ASSIGN COMPONENT 1 OF STRUCTURE <table> TO <component>.

Другой, более надежный вариант будет использовать дескриптор типа r_type_struct, который содержит все поля components[] таблицы:

LOOP AT r_type_struct->components[] ASSIGNING FIELD-SYMBOL(<fs_comp>).
  ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <table> TO <component>.
  IF <COMPONENT> IS ASSIGNED.
  "do smth
  ENDIF.
ENDLOOP.
person Suncatcher    schedule 29.07.2017
comment
спасибо за пример, как получить значение структуры ‹table›, например, я хочу получить werks из структуры, когда я пишу ‹table› -werks, я получаю в программе, например, Объект данных ‹TABLE› не имеет структуры и, следовательно, нет компонента под названием WERKS. называется WERKS. - person Archana Palani; 03.08.2017
comment
@ArchanaPalani, посмотрите обновление, которое отвечает на ваш вопрос. - person Suncatcher; 03.08.2017
comment
Большое спасибо за такой умный ответ :-) он решает мою проблему, узнал что-то новое :-) - person Archana Palani; 07.08.2017

Вы можете найти код, который собирает ключ в функциональном модуле CHANGEDOCU_KEY_ANY2CHAR. Функциональный модуль CHANGEDOCU_KEY_CHAR2ANY выполняет противоположную операцию. Другие функциональные модули из функциональной группы SCD8 также могут иметь значение - проверьте встроенную документацию.

person vwegert    schedule 12.06.2017
comment
Я прошел через функциональный модуль, чтобы быть более ясным, мне нужно отобразить документ об изменениях с точки зрения завода, у меня есть все данные, единственное горлышко бутылки отделяет растение и другие детали от tabkey без использования метода смещения. - person Archana Palani; 13.06.2017