Получение описания поля таблицы программным способом

Я пытаюсь запросить словарь данных SAP через ABAP API ERPConnect. Приведенный ниже код отлично извлекает имена таблиц и различные свойства полей, но не отображает описание поля. Кто-нибудь знает почему?

Спасибо

REPORT  ZSELECTCOMMAND.
TABLES: DD02L,
    DD03L,
    DD02T, DD04T.

DATA: BEGIN OF tb_meta,
    tabname   TYPE  DD02L-tabname,
    fieldname   TYPE  DD03L-fieldname,
    datatype    TYPE  DD03L-datatype,
    leng        TYPE  DD03L-leng,
    decimals    TYPE  DD03L-decimals,
    position    TYPE  DD03L-position,
desc    TYPE  DD04T-ddtext,
    END OF tb_meta.
DATA utb_meta LIKE STANDARD TABLE OF tb_meta.
DATA: ln_meta LIKE LINE OF utb_meta, m1 TYPE i, m2 TYPE i.
SELECT
    tb~tabname
fld~fieldname
    fld~datatype    fld~leng
    fld~decimals    fld~position
x~ddtext
    INTO CORRESPONDING FIELDS OF TABLE utb_meta
FROM
    dd02L AS tb
INNER JOIN dd03L AS fld
    ON tb~tabname = fld~tabname
INNER JOIN DD04T AS x
ON fld~ROLLNAME = x~ROLLNAME
AND x~DDLANGUAGE = 'EN'
WHERE
    CONTFLAG IN ('A', 'C', 'S')  
    AND 
    APPLCLASS <> '' 
    AND 
    tb~TABNAME NOT LIKE '/%' 
    AND 
    tb~TABNAME NOT LIKE '%_BAK'
    AND
   tb~TABNAME = 'BSAK'.
*GET RUN TIME FIELD m1. 
loop at utb_meta into ln_meta.
    write:/ 
    ln_meta-tabname 
    && '>>' && ln_meta-fieldname 
    && '>>' && ln_meta-datatype
    && '>>' && ln_meta-leng
    && '>>' && ln_meta-decimals
    && '>>' && ln_meta-position
    && '>>' && ln_meta-desc.
endloop.

person rodders    schedule 21.07.2015    source источник


Ответы (2)


Существуют разные места, где может храниться текстовая информация поля таблицы или поля структуры. Тексты элементов данных, которые вы выбираете из DD04T, - это только одно место для этих текстов. Вы можете определить компоненты таблицы со встроенными типами данных вместо типов данных словаря, тогда тексты будут храниться в DD03T (например)

По этим причинам (технические подробности DD*tables) я настоятельно рекомендую вам использовать функциональный модуль DDIF_FIELDINFO_GET вместо того, чтобы делать свой собственный DD* select. Просто передайте параметры TABNAME и LANGU, и итоговая внутренняя таблица DFIES_TAB будет содержать всю необходимую информацию, включая тексты.

person rplantiko    schedule 21.07.2015
comment
Этот ответ не может быть более точным. - person Nelson Miranda; 22.07.2015
comment
Спасибо за советы, вся эта злоба ABAP для меня в новинку. Re. использование функции, хотя мой код просто извлекает метаданные BSAK, это только для удобства отладки, на самом деле есть несколько таблиц размером 6k, для которых мне нужны метаданные. Правильно ли я полагаю, что в этом случае будет удобнее запрашивать таблицы напрямую? - person rodders; 22.07.2015
comment
Я только что это проверил. В моей системе для вызова DDIF_FIELDINFO_GET для 39512 таблиц базы данных требуется общее время 878 секунд. Для разового действия (миграция DDIC) это было бы приемлемым показателем в моих глазах. Если вы по-прежнему настаиваете на своем собственном SELECT выражении, проверьте логику, реализованную в этом функциональном модуле (и будьте благодарны за то, что SAP имеет открытый исходный код :-)). Есть еще одна таблица DDFTX, которая помогает определять текст. - person rplantiko; 22.07.2015
comment
Прекрасно, спасибо, сэр! Клиент хочет быстрее, поэтому ему придется выбрать маршрут. - person rodders; 22.07.2015

В дополнение к предложениям @ rplantiko я бы посоветовал использовать RPY_* функциональные модули, которые уже поддерживают RFC и к которым может быть проще получить доступ прямо из коробки.

person vwegert    schedule 21.07.2015