- •Часть I. Основы языка 5
- •Часть II. Расширенные приемы программирования в sap bw 37
- •Часть III. Полезные советы 85
- •Вступление
- •Задание атрибутов программы
- •Составление исходного текста программы
- •Локальные данные программы Определение полей с помощью элементарных типов и ссылок
- •Записи и внутренние таблицы
- •Объявление составных неэлементарных типов и объектов
- •Область определения данных
- •Глобальные таблицы словаря Dictionary
- •Отображение определения
- •Отображение содержимого таблицы
- •Создание таблицы или структуры
- •Использование таблиц и структур в программе
- •Создание доменов
- •Работа с данными Копирование полей с помощью команд Move и Compute
- •Преобразования содержимого полей
- •Копирование структурированных объектов
- •Арифметические выражения и математические функции
- •Операции со строками текста Конкатенация и разделение строк
- •Замена и преобразование символов в строке
- •Поиск символьных строк в полях или внутренних таблицах
- •Символ «Перенос каретки»
- •Запись данных
- •Простой формат вывода
- •Использование символов и пиктограмм
- •Использование цветов
- •Интерфейсы форм
- •Подпрограммы и функции Глобальные функции
- •Функциональные группы
- •Создание функций
- •Вызов функции
- •Чтение таблиц базы данных Построение простейшего запроса
- •Использование конструкции where
- •Чтение единственного элемента таблицы
- •Извлечение ограниченного числа полей
- •Упорядочение результатов запроса
- •Динамическая выборка данных
- •Вложенные циклы select
- •Часть II. Расширенные приемы программирования в sap bw Тип функции планирования
- •Создание класса
- •Определение нового типа функции планирования
- •Разработка класса Считывание значений управляющих параметров
- •Определение ссылочных данных
- •Добавление сообщений в спул вывода
- •Обработка данных для изменения
- •Badi для консолидации (перенос данных)
- •Чтение данных инфо-провайдера
- •Формирование структуры признаков из настроечной таблицы
- •Отправка e-mail сообщения из abap на внешний адрес
- •Выполнение расчетов в параллельных (фоновых) задачах
- •Подпрограмма преобразования
- •Вызов транзакции через web интерфейс
- •Передача параметров
- •Загрузка данных из 1с 8
- •Загрузка справочников
- •Загрузка транзакционных данных
- •Загрузка данных из файлов Excel с помощью ole
- •Загрузка сообщений (tcode se91) из файла Excel
- •Программа загрузки данных из файла csv в таблицу бд
- •Вызов последовательности планирования из abap
- •Динамическое программирование
- •Определение полей таблицы в runtime
- •Создание динамической таблицы в runtime
- •Генерирование abap подпрограммы в runtime
- •Создание пользовательского средства поиска
- •Часть III. Полезные советы Создание abap программы без ключа разработчика
- •Поиск внутренних таблиц
- •Редактирование данных в таблицах sap, недоступных для ведения
- •Оптимизация выборки данных
- •Справочник транзакций
Динамическое программирование
Программирование на 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>.