- •Часть 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 подпрограммы в runtime
Так же существует возможность в RUNTIME сгенерировать ABAP программу и вызвать из нее процедуру.
DATA:
PROGRAM_NAME LIKE SY-CPROG,
RESULT TYPE STRING,
S TYPE STRING,
S50(50),
LIN TYPE I,
STR(255),
SOURCE_TABLE LIKE TABLE OF STR.
STR = 'REPORT Z_TEMP_POOL_CHK. '.
APPEND STR TO SOURCE_TABLE.
APPEND 'TYPES: ZSF TYPE /BI0/OICS_TRN_GC.' TO SOURCE_TABLE.
APPEND 'FORM ZWRITE USING F TYPE ZSF CHANGING STR50.' TO SOURCE_TABLE. APPEND 'DATA:' TO SOURCE_TABLE. APPEND 'C50 TYPE CHAR50,' TO SOURCE_TABLE. APPEND 'C(1),' TO SOURCE_TABLE. APPEND 'I TYPE I,' TO SOURCE_TABLE. APPEND 'L TYPE I.' TO SOURCE_TABLE. APPEND 'STR50 = ''''.' TO SOURCE_TABLE. APPEND 'WRITE F DECIMALS 0 EXPONENT 0 NO-GAP LEFT-JUSTIFIED TO STR50.' TO SOURCE_TABLE. APPEND 'CONDENSE STR50 NO-GAPS.' TO SOURCE_TABLE. APPEND 'L = STRLEN( STR50 ).' TO SOURCE_TABLE. APPEND 'L = L - 1.' TO SOURCE_TABLE. APPEND 'C = STR50+L(1).' TO SOURCE_TABLE. APPEND 'IF C = ''-''.' TO SOURCE_TABLE. APPEND 'CONCATENATE ''-'' STR50+0(L) INTO STR50.' TO SOURCE_TABLE. APPEND 'ENDIF.' TO SOURCE_TABLE. APPEND 'C50 = STR50.' TO SOURCE_TABLE. APPEND 'STR50 = ''''.' TO SOURCE_TABLE. APPEND 'L = STRLEN( C50 ).' TO SOURCE_TABLE. APPEND 'I = 0.' TO SOURCE_TABLE. APPEND 'WHILE I < L.' TO SOURCE_TABLE. APPEND 'C = C50+I(1).' TO SOURCE_TABLE. APPEND 'IF C NE ''.''.' TO SOURCE_TABLE. APPEND 'CONCATENATE STR50 C INTO STR50.' TO SOURCE_TABLE. APPEND 'ENDIF.' TO SOURCE_TABLE. APPEND 'I = I + 1.' TO SOURCE_TABLE. APPEND 'ENDWHILE.' TO SOURCE_TABLE. APPEND 'ENDFORM.' TO SOURCE_TABLE.
GENERATE SUBROUTINE POOL SOURCE_TABLE NAME PROGRAM_NAME MESSAGE RESULT LINE LIN.
S = 'ZWRITE'.
PERFORM (S) IN PROGRAM (PROGRAM_NAME) USING '50.1' CHANGING S50.
Создание пользовательского средства поиска
Часто заказчик просит отфильтровать доступные значения признака, отображаемые по F4. Пример использования: на ABAP реализован отчет, отображающий статус загрузок данных в разрезе подразделений и месяцев. Необходимо ограничить отображаемые по F4 на экране выбора значения подразделений только теми, которые относятся к компании пользователя, запускающего отчет. Сделать это можно путем создания пользовательского средства поиска.
Это делается в транзакции SE11.
Рисунок 56
В параметрах средства поиска указываем поля, отображаемые на экране справки по вводу. Напротив поля, значение которого должно подставляться, устанавливаем галку в столбце «EXP». Функция ZS_F4IF_SHLP_EXIT_SFORM реализует механизм вывода значений. Её исходный текст приведен ниже:
FUNCTION ZS_F4IF_SHLP_EXIT_SFORM.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*" TABLES
*" SHLP_TAB TYPE SHLP_DESCT
*" RECORD_TAB STRUCTURE SEAHLPRES
*" CHANGING
*" VALUE(SHLP) TYPE SHLP_DESCR
*" VALUE(CALLCONTROL) LIKE DDSHF4CTRL STRUCTURE DDSHF4CTRL
*"----------------------------------------------------------------------
IF CALLCONTROL-STEP = 'SELECT'.
DATA:
LI_SFORM TYPE /BIC/OISFORM,
LT_SFORM TYPE TABLE OF ZSFORMT,
LS_SFORM TYPE ZSFORMT,
L_SFORM TYPE /BIC/TSFORM,
L_SFORMSET TYPE /BIC/OISFORMSET.
DATA:
LT_TSF TYPE TABLE OF /BIC/TSFORM,
LS_TSF TYPE /BIC/TSFORM,
LT_IT TYPE DDSHIFACES,
LS_IT TYPE LINE OF DDSHIFACES.
DATA:
BEGIN OF LS_RES,
/BIC/SFORM TYPE /BIC/TSFORM-/BIC/SFORM,
/BIC/SFORMSET TYPE /BIC/PSFORM-/BIC/SFORMSET,
TXTLG TYPE /BIC/TSFORM-TXTLG,
END OF LS_RES,
LT_RES LIKE TABLE OF LS_RES.
* LT_IT[] = SHLP-INTERFACE[].
* READ TABLE LT_IT INTO LS_IT WITH KEY SHLPFIELD = 'SFORMSET'.
* IF SY-SUBRC IS INITIAL.
* L_SFORMSET = LS_IT-VALUE.
* ENDIF.
CLEAR: L_SFORMSET, LI_SFORM.
GET PARAMETER ID 'SFORMSET' FIELD L_SFORMSET.
IF L_SFORMSET IS INITIAL.
GET PARAMETER ID 'SFORM' FIELD LI_SFORM.
IF LI_SFORM IS NOT INITIAL.
SELECT SINGLE /BIC/SFORMSET FROM /BIC/PSFORM INTO L_SFORMSET WHERE
/BIC/SFORM = LI_SFORM AND
OBJVERS = 'A'.
ENDIF.
ENDIF.
IF L_SFORMSET IS NOT INITIAL.
SELECT /BIC/SFORM /BIC/SFORMSET INTO CORRESPONDING FIELDS OF TABLE LT_RES
FROM /BIC/PSFORM
WHERE
OBJVERS = 'A' AND
/BIC/SFORMSET = L_SFORMSET.
ELSE.
SELECT /BIC/SFORM /BIC/SFORMSET INTO CORRESPONDING FIELDS OF TABLE LT_RES
FROM /BIC/PSFORM
WHERE
OBJVERS = 'A'.
ENDIF.
SELECT * FROM /BIC/TSFORM INTO TABLE LT_TSF WHERE
DATETO >= SY-DATUM AND
DATEFROM <= SY-DATUM.
LOOP AT LT_RES INTO LS_RES.
READ TABLE LT_TSF INTO LS_TSF WITH KEY /BIC/SFORM = LS_RES-/BIC/SFORM LANGU = SY-LANGU.
IF SY-SUBRC IS INITIAL.
LS_RES-TXTLG = LS_TSF-TXTLG.
MODIFY LT_RES FROM LS_RES.
ENDIF.
ENDLOOP.
LOOP AT LT_RES INTO LS_RES.
LS_SFORM-SFORM = LS_RES-/BIC/SFORM.
LS_SFORM-TXTLG = LS_RES-TXTLG.
APPEND LS_SFORM TO LT_SFORM.
ENDLOOP.
CALL FUNCTION 'F4UT_RESULTS_MAP'
EXPORTING
SOURCE_STRUCTURE = 'ZSFORMT'
APPLY_RESTRICTIONS = 'X'
TABLES
SHLP_TAB = SHLP_TAB
RECORD_TAB = RECORD_TAB
SOURCE_TAB = LT_SFORM
CHANGING
SHLP = SHLP
CALLCONTROL = CALLCONTROL
EXCEPTIONS
ILLEGAL_STRUCTURE = 1
OTHERS = 2.
CALL FUNCTION 'F4UT_OPTIMIZE_COLWIDTH'
EXPORTING
PARAMETER_OPTIMIZE = 'SFORM'
TABLES
SHLP_TAB = SHLP_TAB
RECORD_TAB = RECORD_TAB
CHANGING
SHLP = SHLP
CALLCONTROL = CALLCONTROL.
IF SY-SUBRC IS INITIAL.
CALLCONTROL-STEP = 'DISP'.
ELSE.
EXIT.
ENDIF.
EXIT. "Don't process STEP DISP additionally in this call.
ENDIF.
ENDFUNCTION.