Сейчас ИИ это очень модная тема и вайб-кодинг в частности. Я решил пробовать использовать ИИ при программировании на Python или PHP в среде VSCode и в целом мне понравилось. Использовался Gemini и код освобождал от рутинные операций.
На мой взгляд VSCode не очень удобен для программирования на ABAP и я хотел попробовать другие инструменты. Недавно SAP проводил презентацию по использованию SAP Joule для программирования, но, насколько я понял, использование доступно только в SAP Cloud. Для on-premise систем нашел только инструменты в Eclipse.
Решил начать с Copilot. Для этого с Eclipse Marketplace установил GitHub Copilot. Для этого в меню Help выбираем Eclipse Marketplace и в строке поиска ввел Copilot. На сегодня была доступна версия 0.11.0
После установки и подключения в меню появилась возможность открывать чат

Для теста решил сделать программу, которая анализирует строку и возвращает результат. Создал новую программу и добавил на экран параметр P_KOSTL типа KOSTL. Далее я старался не править код программ, доверил все ИИ-помощнику.
Затем отправил промпт:
нужна проверка с помощью регулярного выражения. если p_kostl заканчивается на OS, то переменная lv_sel = 1. Если p_kostl заканчивается на PA, PY или VS, то lv_sel =2
Сначала он предлагал код на Java, но потом добился кода на ABAP
1 2 3 4 5 6 7 8 9 |
DATA: lv_sel TYPE i. IF p_kostl CP '*OS'. lv_sel = 1. ELSEIF p_kostl CP '*PA' OR p_kostl CP '*PY' OR p_kostl CP '*VS'. lv_sel = 2. ELSE. lv_sel = 0. ENDIF. |
Был и другой вариант
1 2 3 4 5 6 7 8 9 |
DATA: lv_sel TYPE i. IF p_kostl MATCHES REGEX 'OS$'. lv_sel = 1. ELSEIF p_kostl MATCHES REGEX '(PA|PY|VS)$'. lv_sel = 2. ELSE. lv_sel = 0. ENDIF. |
Работоспособности которого я не добился. Какой-то момент он предложил вариант без ошибок, но желательного результата я добиться не смог
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
DATA: lv_sel TYPE i. IF p_kostl IS NOT INITIAL. FIND REGEX 'OS$' IN p_kostl. IF sy-subrc = 0. lv_sel = 1. ELSE. FIND REGEX '(PA|PY|VS)$' IN p_kostl. IF sy-subrc = 0. lv_sel = 2. ELSE. lv_sel = 0. ENDIF. ENDIF. ELSE. lv_sel = 0. ENDIF. WRITE: / lv_sel. |
Далее решил остановиться на первом варианте программы, благо он работал корректно.
Новый промпт был следующим:
ок. вернул к этому варианту. оформи проверку p_kostl в виде метода класса lcl_main
ИИ вернул такой код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
CLASS lcl_main DEFINITION. PUBLIC SECTION. METHODS: check_kostl IMPORTING p_kostl TYPE string RETURNING VALUE(rv_sel) TYPE i. ENDCLASS. CLASS lcl_main IMPLEMENTATION. METHOD check_kostl. IF p_kostl CP '*OS'. rv_sel = 1. ELSEIF p_kostl CP '*PA' OR p_kostl CP '*PY' OR p_kostl CP '*VS'. rv_sel = 2. ELSE. rv_sel = 0. ENDIF. ENDMETHOD. ENDCLASS. |
И отдельно его применение
1 2 3 |
DATA(lo_main) = NEW lcl_main( ). DATA(lv_result) = lo_main->check_kostl( p_kostl ). WRITE: / lv_result. |
Это уже было неплохо. Добавим unit-test — по моему мнению, это наиболее перспективное применение
отлично. теперь сделай unit-test для полного покрытия класса lcl_main
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 |
CLASS ltc_main DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. PRIVATE SECTION. DATA: lo_main TYPE REF TO lcl_main. METHODS: setup, test_os FOR TESTING, test_pa FOR TESTING, test_py FOR TESTING, test_vs FOR TESTING, test_unknown FOR TESTING, test_empty FOR TESTING. ENDCLASS. CLASS ltc_main IMPLEMENTATION. METHOD setup. CREATE OBJECT lo_main. ENDMETHOD. METHOD test_os. cl_abap_unit_assert=>assert_equals( act = lo_main->check_kostl( 'ABCOS' ) exp = 1 msg = 'Should return 1 for suffix OS' ). ENDMETHOD. METHOD test_pa. cl_abap_unit_assert=>assert_equals( act = lo_main->check_kostl( '123PA' ) exp = 2 msg = 'Should return 2 for suffix PA' ). ENDMETHOD. METHOD test_py. cl_abap_unit_assert=>assert_equals( act = lo_main->check_kostl( 'XYZPY' ) exp = 2 msg = 'Should return 2 for suffix PY' ). ENDMETHOD. METHOD test_vs. cl_abap_unit_assert=>assert_equals( act = lo_main->check_kostl( 'Q2-OS-VS' ) exp = 2 msg = 'Should return 2 for suffix VS' ). ENDMETHOD. METHOD test_unknown. cl_abap_unit_assert=>assert_equals( act = lo_main->check_kostl( 'SOMETHING' ) exp = 0 msg = 'Should return 0 for unmatched suffix' ). ENDMETHOD. METHOD test_empty. cl_abap_unit_assert=>assert_equals( act = lo_main->check_kostl( '' ) exp = 0 msg = 'Should return 0 for empty input' ). ENDMETHOD. ENDCLASS. |
На следующий промпт сделал уже неплохой вариант кода
сделай OS AD и UNKNOWN в виде публичных констант в классе lcl_main и используй их в тестах
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 88 89 90 |
CLASS lcl_main DEFINITION. PUBLIC SECTION. CONSTANTS: c_os TYPE i VALUE 1, c_ad TYPE i VALUE 2, c_unknown TYPE i VALUE 0. METHODS: check_kostl IMPORTING p_kostl TYPE string RETURNING VALUE(rv_sel) TYPE i. ENDCLASS. CLASS lcl_main IMPLEMENTATION. METHOD check_kostl. IF p_kostl CP '*OS'. rv_sel = c_os. ELSEIF p_kostl CP '*PA' OR p_kostl CP '*PY' OR p_kostl CP '*VS'. rv_sel = c_ad. ELSE. rv_sel = c_unknown. ENDIF. ENDMETHOD. ENDCLASS. CLASS ltc_main DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. PRIVATE SECTION. DATA: lo_main TYPE REF TO lcl_main. METHODS: setup, test_os FOR TESTING, test_pa FOR TESTING, test_py FOR TESTING, test_vs FOR TESTING, test_unknown FOR TESTING, test_empty FOR TESTING. ENDCLASS. CLASS ltc_main IMPLEMENTATION. METHOD setup. CREATE OBJECT lo_main. ENDMETHOD. METHOD test_os. cl_abap_unit_assert=>assert_equals( act = lo_main->check_kostl( 'ABCOS' ) exp = lcl_main=>c_os msg = 'Should return OS constant for suffix OS' ). ENDMETHOD. METHOD test_pa. cl_abap_unit_assert=>assert_equals( act = lo_main->check_kostl( '123PA' ) exp = lcl_main=>c_ad msg = 'Should return AD constant for suffix PA' ). ENDMETHOD. METHOD test_py. cl_abap_unit_assert=>assert_equals( act = lo_main->check_kostl( 'XYZPY' ) exp = lcl_main=>c_ad msg = 'Should return AD constant for suffix PY' ). ENDMETHOD. METHOD test_vs. cl_abap_unit_assert=>assert_equals( act = lo_main->check_kostl( 'Q2-OS-VS' ) exp = lcl_main=>c_ad msg = 'Should return AD constant for suffix VS' ). ENDMETHOD. METHOD test_unknown. cl_abap_unit_assert=>assert_equals( act = lo_main->check_kostl( 'SOMETHING' ) exp = lcl_main=>c_unknown msg = 'Should return UNKNOWN constant for unmatched suffix' ). ENDMETHOD. METHOD test_empty. cl_abap_unit_assert=>assert_equals( act = lo_main->check_kostl( '' ) exp = lcl_main=>c_unknown msg = 'Should return UNKNOWN constant for empty input' ). ENDMETHOD. ENDCLASS. |
В результате получился класс со покрытием тестами 100%.
В целом, на первый взгляд ИИ-помощника можно использовать для разработки на языке ABAP.