ABAP программа загрузки данных из EXCEL в SAP систему. Разберу на примере загрузку Excel файла, проверку и преобразование данных, полученных при загрузке ABAP.
Это полезная и часто используемая задача.
Рассмотрим один из вариантов загрузки данных из Excel на примере программы ABAP. Подробно разберу каждый блок программы для лучшего понимания.
Селекционный экран ABAP для выбора файла
Создаю селекционный экран ABAP на который добавлю одно поле для выбора файла из которого будут загружаться данные.
1 |
PARAMETERS p_file TYPE string LOWER CASE. |

Средство поиска ABAP для файла
Так же в этой части кода добавляю средство поиска ABAP для поля файла через использование события AT SELECTION-SCREEN ON VALUE-REQUEST.
1 2 |
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file. cl_salv_test_data=>select_file( IMPORTING filename = p_file ). |

Код ABAP программы загрузки Excel файла
Определяю тип для внутренней таблицы результата
Я определил локальный тип структуры результата для большей наглядности в статье, но на его месте может быть и тип ABAP словаря.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
START-OF-SELECTION. TYPES: BEGIN OF ts_data, carrid TYPE s_carr_id, connid TYPE s_conn_id, fldate TYPE s_date, price TYPE s_price, currency TYPE s_currcode, planetype TYPE s_planetye, seatsmax TYPE s_seatsmax, seatsocc TYPE s_seatsocc, gjahr TYPE gjahr, monat TYPE monat, END OF ts_data. |
Внутренняя таблица lt_sflight это таблица в которую будет помещён итоговый уже преобразованный результат загрузки. А таблица lt_intern это внутренняя таблица abap в которую изначально будут помещены данные из Excel для дальнейшей обработки.
1 2 3 |
DATA: lt_sflight TYPE STANDARD TABLE OF ts_data, lt_intern TYPE TABLE OF alsmex_tabline. |

ФМ ALSM_EXCEL_TO_INTERNAL_TABLE
Сама загрузка происходит при вызове функционального метода ALSM_EXCEL_TO_INTERNAL_TABLE, разберём подробно его параметры:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE' EXPORTING filename = CONV rlgrap-filename( p_file ) i_begin_col = 1 i_begin_row = 2 i_end_col = 10 i_end_row = 10000 TABLES intern = lt_intern EXCEPTIONS inconsistent_parameters = 1 upload_ole = 2 OTHERS = 3. |
- filename – путь к файлу Excel. Использование конструкции CONV в этом случае преобразует параметр p_file к нужному типу.
- i_begin_col – номер колонки с которой начинать загрузку
- i_begin_row – номер строки с которой начинаем загрузку. В нашем случае установил значение 2 так как мне не нужно обрабатывать первую строку заголовка.
- i_end_col – сколько колонок нам нужно анализировать при загрузке
- i_end_row – сколько записей максимум берётся для анализа.
- intern – внутренняя таблица в которую будут загружаться данные из файла.
Обработка результата загрузки данных из Excel
С использованием конструкции нового синтаксиса LOOP AT GROUP BY обходим таблицу сгруппировав её по столбцу row, в котором расположен номер строки. И после обработки всей группы с одинаковым номером строки мы добавляем запись в таблицу результата и переходим к следующей группе.
Более подробно загрузка и обработка данных после разбирается в видео и не забывайте подписаться на мой канал YouCoder.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
LOOP AT lt_intern INTO DATA(ls_intern) GROUP BY ( row = ls_intern-row ) REFERENCE INTO DATA(lr_grp). DATA(ls_alv) = VALUE ts_data( ). LOOP AT GROUP lr_grp REFERENCE INTO DATA(lr_item). CHECK lr_item->value IS NOT INITIAL. CASE lr_item->col. WHEN 1. ls_alv-carrid = lr_item->value. WHEN 2. ls_alv-connid = lr_item->value. WHEN 3. ls_alv-fldate = |{ lr_item->value+6(4) }{ lr_item->value+3(2) }{ lr_item->value(2) }|. " 29.04.2015 20150429 WHEN 4. lr_item->value = replace( val = lr_item->value regex ='[\,]' with = '.' occ = 0 ). " 427,94 ls_alv-price = lr_item->value. WHEN 5. ls_alv-currency = lr_item->value. WHEN 6. ls_alv-planetype = lr_item->value. WHEN 7. ls_alv-seatsmax = lr_item->value. WHEN 8. IF strlen( lr_item->value ) > 10. ls_alv-seatsocc = lr_item->value. ENDIF. WHEN 9. IF lr_item->value CO |0123456789| AND lr_item->value >= 1 AND lr_item->value <= 9999. ls_alv-gjahr = lr_item->value. ENDIF. WHEN 10. IF lr_item->value CO |0123456789| AND lr_item->value >= 1 AND lr_item->value <= 12 . ls_alv-monat = lr_item->value. ENDIF. WHEN OTHERS. CONTINUE. ENDCASE. ENDLOOP. APPEND ls_alv TO lt_sflight. ENDLOOP. |
Конструкции языка ABAP используемые в коде выше:
- replace – замена символа в строке ABAP
- strlen – длина строки ABAP
- LOOP AT GROUP – группировка в цикле ABAP
Быстрый вывод внутренней таблицы ABAP на экран для тестирования:
1 |
cl_demo_output=>display( lt_sflight ). |
Шаблон программы ABAP загрузки данных из Excel.
Ниже привёл полный код программы загрузки для удобства копирования и тестирования:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
START-OF-SELECTION. TYPES: BEGIN OF ts_data, carrid TYPE s_carr_id, connid TYPE s_conn_id, fldate TYPE s_date, price TYPE s_price, currency TYPE s_currcode, planetype TYPE s_planetye, seatsmax TYPE s_seatsmax, seatsocc TYPE s_seatsocc, gjahr TYPE gjahr, monat TYPE monat, END OF ts_data. DATA: lt_sflight TYPE STANDARD TABLE OF ts_data, lt_intern TYPE TABLE OF alsmex_tabline. IF p_file IS NOT INITIAL. CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE' EXPORTING filename = CONV rlgrap-filename( p_file ) i_begin_col = 1 i_begin_row = 2 i_end_col = 10 i_end_row = 10000 TABLES intern = lt_intern EXCEPTIONS inconsistent_parameters = 1 upload_ole = 2 OTHERS = 3. IF sy-subrc = 0. LOOP AT lt_intern INTO DATA(ls_intern) GROUP BY ( row = ls_intern-row ) REFERENCE INTO DATA(lr_grp). DATA(ls_alv) = VALUE ts_data( ). LOOP AT GROUP lr_grp REFERENCE INTO DATA(lr_item). CHECK lr_item->value IS NOT INITIAL. CASE lr_item->col. WHEN 1. ls_alv-carrid = lr_item->value. WHEN 2. ls_alv-connid = lr_item->value. WHEN 3. ls_alv-fldate = |{ lr_item->value+6(4) }{ lr_item->value+3(2) }{ lr_item->value(2) }|. " 29.04.2015 20150429 WHEN 4. lr_item->value = replace( val = lr_item->value regex ='[\,]' with = '.' occ = 0 ). " 427,94 ls_alv-price = lr_item->value. WHEN 5. ls_alv-currency = lr_item->value. WHEN 6. ls_alv-planetype = lr_item->value. WHEN 7. ls_alv-seatsmax = lr_item->value. WHEN 8. IF strlen( lr_item->value ) > 10. ls_alv-seatsocc = lr_item->value. ENDIF. WHEN 9. IF lr_item->value CO |0123456789| AND lr_item->value >= 1 AND lr_item->value <= 9999. ls_alv-gjahr = lr_item->value. ENDIF. WHEN 10. IF lr_item->value CO |0123456789| AND lr_item->value >= 1 AND lr_item->value <= 12 . ls_alv-monat = lr_item->value. ENDIF. WHEN OTHERS. CONTINUE. ENDCASE. ENDLOOP. APPEND ls_alv TO lt_sflight. ENDLOOP. ENDIF. cl_demo_output=>display( lt_sflight ). ENDIF. |
Зарегистрировался, а код не копируется.
И зачем такие мучения с защитой?
Если не хотите делиться кодом, так и не шарьте код вообще
Вот картинка на которой показал как в два нажатия скопировать код
.
Код просто размещён с помощью специального плагина и там исключено копирование напрямую.
Это сделано для корректного анализа текста статьи поисковыми роботами.
Если будут ещё вопросы, пишите.
Спасибо за информацию!!!
Рад, что статья оказалась полезна! Спасибо за обратную связь!)
К сожалению не дает создать таблицу с указанными именами, у меня Develeper версия.
Пишет: ROW is a reserved word (Select another field name). Message no. DT205
Есть вариант использовать отличные от ROW и COL имена?
К сожалению с ходу не подскажу и проверить вариантов нету, поскольку на моей версии отработало корректно.
И еще пожалуйста выкладывай экселевский документ =)
Да, я хотел выложить, но забылось и документ потерялся, извините))