Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
пособие авар.doc
Скачиваний:
62
Добавлен:
02.09.2019
Размер:
2.34 Mб
Скачать

Динамическое программирование

Программирование на ABAP под SAP BW отличается от программирования в ERP большим количеством Z объектов, созданных пользователями. Если в ERP обычно все данные хранятся в нескольких поставленных SAP таблицах с фиксированной структурой, то в BW необходимо использовать таблицы, меняющиеся в процессе разработки системы. В качестве примера задачи: необходимо разработать тип функции планирования, распределяющий данные по базе распределения, которая хранится в объекте DSO. Структура базы может меняться, так же может понадобиться использовать несколько баз распределения с разной структурой.

Такую задачу целесообразно реализовать универсально, что б один и тот же код можно было использовать для всех однотипных потребностей. Примеры подхода к динамическому программированию приведены ниже.

Определение полей таблицы в runtime

При программировании в SAP BI часто необходимо читать данные DSO объектов без привязки к конкретным техническим именам полей (например, если DSO содержит большое количество признаком и показателей или его структура может меняться). Пример такой реализации:

  TYPE-POOLS SYDES.   DATA:

        TD TYPE SYDES_DESC,

DATA_LINE TYPE /BIC/AS06_D1300,         LR_NAMES TYPE SYDES_NAMEINFOS,         LS_NAMES LIKE LINE OF LR_NAMES,         LR_TYPES TYPE SYDES_TYPEINFOS,         LS_TYPES LIKE LINE OF LR_TYPES.

  DATA:         LT_MAPPING TYPE TABLE OF /BIC/AS06_D1300,         LS_MAPPING TYPE /BIC/AS06_D1300.

FIELD-SYMBOLS:                  <CHAVAL> TYPE ANY.

ОПРЕДЕЛЕНИЕ ПОЛЕЙ

  DESCRIBE FIELD DATA_LINE INTO TD.   LR_NAMES[] = TD-NAMES[].   LR_TYPES[] = TD-TYPES[].   LOOP AT LR_TYPES INTO LS_TYPES WHERE IDX_NAME NE 0.     READ TABLE LR_NAMES INTO LS_NAMES INDEX LS_TYPES-IDX_NAME.     S = LS_NAMES-NAME.     CASE S.       WHEN '/BIC/SCOLNAME'.       WHEN '/BIC/SROWNAME'.       WHEN '/BIC/SPCOLNAME'.       WHEN '/BIC/SPROWNAME'.       WHEN '/BIC/SPFORM'.       WHEN 'RECORDMODE'.       WHEN '/BIC/SMANDCELL'.       WHEN '/BIC/SDOPANA1'.       WHEN '/BIC/SDOPANA2'.       WHEN '/BIC/SNULLANA'.       WHEN 'AEDAT'.       WHEN 'USERNAME'.       WHEN OTHERS.         LS_CHANAME-CHANAME = S.         APPEND LS_CHANAME TO LT_ALLANA.     ENDCASE.   ENDLOOP.

ЧТЕНИЕ ДАННЫХ ИЗ DSO S06_D13   SELECT * FROM /BIC/AS06_D1300 INTO TABLE LT_MAPPING WHERE     /BIC/SFORM = 'N01_1'.

LOOP AT LT_MAPPING INTO LS_MAPPING.

LOOP AT LT_ALLANA INTO LS_ALLANA.

ASSIGN COMPONENT LS_ALLANA-CHANAME OF STRUCTURE LS_MAPPING TO <CHAVAL>.

ENDLOOP.

ENDLOOP.

Создание динамической таблицы в runtime

При необходимости сформировать внутреннюю таблицу в RUNTIME можно воспользоваться следующим примером:

  DATA:         XFC TYPE LVC_S_FCAT,         IFC TYPE LVC_T_FCAT.

DATA:

EID_TABLE TYPE REF TO DATA.

FIELD-SYMBOLS:                <DYN_TABLE> TYPE STANDARD TABLE,                <DYN_WA> TYPE ANY.

XFC-FIELDNAME = 'FIELD1'.   XFC-DATATYPE = 'C'.   XFC-INTTYPE = 'C'.   XFC-INTLEN = 10.   XFC-DECIMALS = 0.   APPEND XFC TO IFC.

XFC-FIELDNAME = 'FIELD2'.   XFC-DATATYPE = 'I'.   XFC-INTTYPE = 'I'.   XFC-INTLEN = 8.   XFC-DECIMALS = 0.   APPEND XFC TO IFC.

  CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE     EXPORTING       IT_FIELDCATALOG = IFC     IMPORTING       EP_TABLE        = EID_TABLE.   ASSIGN EID_TABLE->* TO <DYN_TABLE>.   CREATE DATA DY_LINE LIKE LINE OF <DYN_TABLE>.   ASSIGN DY_LINE->* TO <DYN_WA>.