- •Часть 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, недоступных для ведения
- •Оптимизация выборки данных
- •Справочник транзакций
Загрузка данных из файлов Excel с помощью ole
Данные из файлов Excel можно загружать напрямую в SAP BI с помощью технологии OLE. Необходимо помнить, что OLE объекты – это библиотеки операционной системы Windows, поэтому на использование технологии есть следующие ограничения:
Операционная система Windows;
Необходимые библиотеки должны присутствовать в системе (т.е. должны быть установлены приложения, которые их предоставляют);
Проблематично запускать в фоновом режиме на сервере приложений.
Можно воспользоваться следующим примером, отредактировав его под свои нужды:
Загрузка сообщений (tcode se91) из файла Excel
REPORT Z_S_LOAD_FORMULA. INCLUDE OLE2INCL. TABLES: T100. TYPES: TIR_LINE TYPE TABLE OF TLINE. DATA: S TYPE STRING, SS1 TYPE STRING, SS2 TYPE STRING, SS3 TYPE STRING, SS4 TYPE STRING, S3(3), L TYPE I, I TYPE I, J TYPE I, TT100 TYPE TABLE OF T100, LT100 TYPE T100, C(1), CL TYPE /BIC/OISMSGCLS, T_LINE LIKE T100, TR_LINE LIKE TABLE OF T_LINE, HEADER LIKE THEAD. DATA: EXCEL TYPE OLE2_OBJECT, WB TYPE OLE2_OBJECT, SHEETS TYPE OLE2_OBJECT, SHEET TYPE OLE2_OBJECT, CELL TYPE OLE2_OBJECT. DATA: IR_LINE TYPE TIR_LINE, IS_LINE LIKE LINE OF IR_LINE, SC TYPE I. DATA: FILENAME TYPE C LENGTH 256, LT_IT_TAB TYPE FILETABLE, FNAME LIKE LINE OF LT_IT_TAB, LV_SUBRC TYPE I, USER_ACTION TYPE I. CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG EXPORTING WINDOW_TITLE = 'SELECT FILE' DEFAULT_EXTENSION = 'XLS' FILE_FILTER = 'Таблица Excel (*.xls)|*.xls' MULTISELECTION = ' ' CHANGING FILE_TABLE = LT_IT_TAB USER_ACTION = USER_ACTION RC = LV_SUBRC. IF USER_ACTION IS INITIAL. READ TABLE LT_IT_TAB INTO FNAME INDEX 1. FILENAME = FNAME. CREATE OBJECT EXCEL 'EXCEL.APPLICATION'. SET PROPERTY OF EXCEL 'VISIBLE' = 'TRUE'. CALL METHOD OF EXCEL 'WORKBOOKS' = WB. CALL METHOD OF WB 'OPEN' EXPORTING #1 = FILENAME. CALL METHOD OF EXCEL 'SHEETS' = SHEETS. GET PROPERTY OF SHEETS 'COUNT' = SC. I = 0. DO SC TIMES. I = I + 1. CALL METHOD OF EXCEL 'WORKSHEETS' = SHEET EXPORTING #1 = I. CALL METHOD OF SHEET 'ACTIVATE'. GET PROPERTY OF SHEET 'NAME' = S. J = 2. SS1 = 'X'. WHILE SS1 NE ''. PERFORM GETCELLVAL USING J 2 SHEET CHANGING SS1. PERFORM GETCELLVAL USING J 3 SHEET CHANGING SS2. PERFORM GETCELLVAL USING J 4 SHEET CHANGING SS3. PERFORM GETCELLVAL USING J 1 SHEET CHANGING SS4. L = SS2. SS2 = L. CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' EXPORTING INPUT = SS2 IMPORTING OUTPUT = S3. J = J + 1. DELETE FROM T100 WHERE ARBGB = SS1 AND MSGNR = S3. T_LINE-SPRSL = 'RU'. T_LINE-ARBGB = SS1. T_LINE-MSGNR = S3. CONCATENATE SS4 SS1 S3 INTO SS4 SEPARATED BY '->'. L = STRLEN( SS4 ). IF L >= 60. T_LINE-TEXT = SS4(60). ELSE. T_LINE-TEXT = SS4. ENDIF. INSERT T100 FROM T_LINE. HEADER-TDOBJECT = 'DOKU'. CONCATENATE SS1 S3 INTO HEADER-TDNAME. HEADER-TDID = 'NA'. HEADER-TDSPRAS = 'R'. HEADER-TDFORM = 'S_DOCU_SHOW'. HEADER-TDSTYLE = 'S_DOCUS1'. HEADER-TDVERSION = '00001'. HEADER-TDFUSER = SY-UNAME. HEADER-TDFRELES = '700'. HEADER-TDFDATE = SY-DATUM. HEADER-TDFTIME = SY-UZEIT. HEADER-TDLUSER = SY-UNAME. HEADER-TDLRELES = '700'. HEADER-TDLDATE = SY-DATUM. HEADER-TDLTIME = SY-UZEIT. HEADER-TDLINESIZE = '072'. HEADER-TDTXTLINES = '00000'. HEADER-TDTRANSTAT = '0'. PERFORM FILLLINE2 USING SS3 CHANGING IR_LINE. CALL FUNCTION 'DOCU_UPDATE' EXPORTING * ACTCLASS = ' ' HEAD = HEADER * NO_MASTERLANG = ' ' STATE = 'R' TYP = 'E' VERSION = '0001' TABLES LINE = IR_LINE. ENDWHILE. ENDDO. CALL METHOD OF EXCEL 'QUIT'. LEAVE PROGRAM. ENDIF. *&---------------------------------------------------------------------* *& Form FILLLINE2 *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->S text * -->IR_LINE text *----------------------------------------------------------------------* FORM FILLLINE2 USING S TYPE STRING CHANGING IR_LINE TYPE TIR_LINE. DATA: X TYPE X LENGTH 2, SL TYPE TABLE OF STRING, SEP(1), S1 TYPE STRING, S2 TYPE STRING, S3 TYPE STRING, IR_LINE1 TYPE TIR_LINE. FIELD-SYMBOLS: <FS1> TYPE X, <FS2> TYPE X. CLEAR IR_LINE. REFRESH IR_LINE. X = 10. ASSIGN X TO <FS1> CASTING. ASSIGN SEP TO <FS2> CASTING. <FS2> = <FS1>. CLEAR SL. REFRESH SL. SPLIT S AT SEP INTO TABLE SL. LOOP AT SL INTO S3. PERFORM FILLLINE USING S3 CHANGING IR_LINE1. APPEND LINES OF IR_LINE1 TO IR_LINE. ENDLOOP. ENDFORM. "FILLLINE2 *&---------------------------------------------------------------------* *& Form FILLLINE *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->S text * -->IR_LINE text *----------------------------------------------------------------------* FORM FILLLINE USING S TYPE STRING CHANGING IR_LINE TYPE TIR_LINE. DATA: S1 TYPE STRING, S2 TYPE STRING, L TYPE I, I TYPE I, IS_LINE LIKE LINE OF IR_LINE. S1 = S. L = STRLEN( S1 ). CLEAR IR_LINE. REFRESH IR_LINE. I = 0. WHILE L > 0. IF L >= 72. L = L - 72. S2 = S1+0(72). S1 = S1+72(L). IF I = 0. IS_LINE-TDFORMAT = '/'. ELSE. IS_LINE-TDFORMAT = ''. ENDIF. IS_LINE-TDLINE = S2. APPEND IS_LINE TO IR_LINE. ELSE. L = 0. S2 = S1. S1 = ''. IF I = 0. IS_LINE-TDFORMAT = '/'. ELSE. IS_LINE-TDFORMAT = ''. ENDIF. IS_LINE-TDLINE = S2. APPEND IS_LINE TO IR_LINE. ENDIF. I = I + 1. ENDWHILE. ENDFORM. "FILLLINE *&---------------------------------------------------------------------* *& Form GETCELLNUM *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->I text * -->J text * -->CN text *----------------------------------------------------------------------* FORM GETCELLNUM USING I TYPE I J TYPE I CHANGING CN TYPE I. DATA: T1 TYPE I. T1 = I - 1. T1 = T1 * 256. CN = T1 + J. ENDFORM. "GETCELLNUM *&---------------------------------------------------------------------* *& Form GETCELLVAL *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->I text * -->J text * -->SHEET text * -->VAL text *----------------------------------------------------------------------* FORM GETCELLVAL USING I TYPE I J TYPE I SHEET TYPE OLE2_OBJECT CHANGING VAL TYPE STRING. DATA: CELL TYPE OLE2_OBJECT, CN TYPE I. PERFORM GETCELLNUM USING I J CHANGING CN. CALL METHOD OF SHEET 'CELLS' = CELL EXPORTING #1 = CN. GET PROPERTY OF CELL 'VALUE' = VAL. FREE OBJECT CELL. ENDFORM. "SETCELLVAL