- •Часть 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, недоступных для ведения
- •Оптимизация выборки данных
- •Справочник транзакций
Выполнение расчетов в параллельных (фоновых) задачах
Некоторые вычислительные задачи можно выполнять параллельно, в несколько потоков. Это позволяет существенно сократить время выполнения программы.
Для реализации механизма необходимо определить функциональный модуль, выполняющий распараллеливаемую задачу, как дистанционный.
Рисунок 51
Необходимо помнить, что дистанционный модуль не может работать со ссылочными переменными: необходимо установить флаг «Перенос значений».
Рисунок 52
Вызов модуля осуществляется следующим образом:
* Счетчик количества параллельных процессов. Если количество не ограничивать, то
* появляется большая вероятность «повесить» сервер приложений.
I_TK = 0. LOOP AT LR_HEADER_DATA INTO LS_HEADER_DATA. * Ограничиваем кол-во параллельных процессов WAIT UNTIL I_TK < 3. * Определяем имя задачи S = LS_HEADER_DATA-LOGNUMBER. CONCATENATE 'FUNC' S INTO S. * Вызов функции в фоновом режиме. При вызове в функцию передаются только
* экспортные параметры. Параметры возврата получаются в форме SET_FUNC_DONE CALL FUNCTION 'Z_S_GET_MSG_LOG_PAR' STARTING NEW TASK S PERFORMING SET_FUNC_DONE ON END OF TASK EXPORTING LR_HEADER_DATA = LR_HEADER_DATA LR_MESSAGES = LR_MESSAGES LR_CONTEXTS = LR_CONTEXTS I_LOGNUMBER = LS_HEADER_DATA-LOGNUMBER. * увеличение счетчика активных процессов I_TK = I_TK + 1. ENDLOOP. WAIT UNTIL I_TK = 0. RECNUM = 0.
Форма, получающая параметры функции выглядит так:
FORM SET_FUNC_DONE USING TASKNAME. DATA: LR_RESREC_TMP1 LIKE LR_RESREC_TMP. * получение параметров импорта функции RECEIVE RESULTS FROM FUNCTION 'Z_S_GET_MSG_LOG_PAR' CHANGING LR_RESREC_TMP = LR_RESREC_TMP1. APPEND LINES OF LR_RESREC_TMP1 TO LR_RESREC_TMP.
* уменьшение счетчика активных процессов I_TK = I_TK - 1. ENDFORM. "SET_FUNC_DONE
Подпрограмма преобразования
Подпрограмма преобразования – это две программы, выполняющиеся при вводе данных в систему и при выводе пользователю. Пример подпрограммы преобразования - это ALPHA (встречается на вкладке «Общее» при изменении признака, если используется тип данных CHAR). Алгоритм её работы: при вводе/загрузке строки если строка является числом, то она дополняется нулями слева до максимальной длинны строки; при выводе/отображении ведущие нули убираются, если строка является числом. Использование ALPHA позволяет делать для системы строки типа «1» и «01» идентичными. Иногда полезно определить свою подпрограмму преобразования. Делается это путем создания двух функциональных модулей, имя которых задается по следующей маске:
«CONVERSION_EXIT_{имя подпрограммы преобразования}_INPUT» - ФМ, преобразующий данные при загрузке в BW.
«CONVERSION_EXIT_{имя подпрограммы преобразования}_OUTPUT» - ФМ, преобразующий данные BW при отображении пользователю.
Пример подпрограммы ALPHA можно посмотреть в любой системе BW.
Пример подпрограммы, преобразующей русские буквы к аналогичным английским:
FUNCTION CONVERSION_EXIT_TRRUS_INPUT. *"---------------------------------------------------------------------- *"*"Локальный интерфейс: *" IMPORTING *" VALUE(INPUT) TYPE CLIKE *" EXPORTING *" VALUE(OUTPUT) TYPE CLIKE *"---------------------------------------------------------------------- DATA: S TYPE STRING, S1 TYPE STRING, I TYPE I, L TYPE I, C(1). S = INPUT. L = STRLEN( S ). IF L > 0. S1 = ''. I = 0. WHILE I < L. C = S+I(1). CASE C. WHEN 'А'. C = 'A'. WHEN 'В'. C = 'B'. WHEN 'Е'. C = 'E'. WHEN 'К'. C = 'K'. WHEN 'М'. C = 'M'. WHEN 'Н'. C = 'H'. WHEN 'О'. C = 'O'. WHEN 'Р'. C = 'P'. WHEN 'С'. C = 'C'. WHEN 'Т'. C = 'T'. WHEN 'У'. C = 'Y'. WHEN 'Х'. C = 'X'. ENDCASE. CONCATENATE S1 C INTO S1. I = I + 1. ENDWHILE. OUTPUT = S1. ELSE. OUTPUT = ''. ENDIF. ENDFUNCTION.
FUNCTION CONVERSION_EXIT_TRRUS_OUTPUT. *"---------------------------------------------------------------------- *"*"Локальный интерфейс: *" IMPORTING *" VALUE(INPUT) TYPE CLIKE *" EXPORTING *" VALUE(OUTPUT) TYPE CLIKE *"---------------------------------------------------------------------- DATA: S TYPE STRING, S1 TYPE STRING, I TYPE I, L TYPE I, C(1). S = INPUT. L = STRLEN( S ). IF L > 0. S1 = ''. I = 0. WHILE I < L. C = S+I(1). CASE C. WHEN 'А'. C = 'A'. WHEN 'В'. C = 'B'. WHEN 'Е'. C = 'E'. WHEN 'К'. C = 'K'. WHEN 'М'. C = 'M'. WHEN 'Н'. C = 'H'. WHEN 'О'. C = 'O'. WHEN 'Р'. C = 'P'. WHEN 'С'. C = 'C'. WHEN 'Т'. C = 'T'. WHEN 'У'. C = 'Y'. WHEN 'Х'. C = 'X'. ENDCASE. CONCATENATE S1 C INTO S1. I = I + 1. ENDWHILE. OUTPUT = S1. ELSE. OUTPUT = ''. ENDIF. ENDFUNCTION.