За последние годы прошел множество собеседований. Самое интересное в них это то, что задают примерно одни и те же вопросы.
Ниже кратенько разберем наиболее популярные. Обращаю внимание, что это не полное раскрытие тем, а скорее ответы в стиле блиц. Для того чтобы разобраться в вопросах, рекомендую почитать курсы, документацию или отдельные статьи, где тема раскрывается более полно.
1. Типы внутренних таблиц - пожалуй, самый часто встречающийся вопрос на собеседованиях. И так, кратенько. Всего есть три вида внутренних таблиц:
а) Стандартная внутренняя таблица:
- Не уникальный ключ;
- Время доступа к элементам пропорционально количеству строк;
- Можем обойти в цикле. Или обратится к записи по ключу ;
б) Хешированная таблица:
- Уникальный ключ;
- Доступ только по ключу;(никаких доступов по индексу, неполному ключу или не ключевым полям);
- Время доступа одинаково для всех строк таблицы т.к. вычисляется хэш. (Что это такое гуглите сами)
в) Сортированная таблица:
-Ключ может быть уникальным и неуникальным;
- Данные хранятся с сортировкой по этому ключу;(APPEND не лучшее решение для вставки строк);
- Время доступа к данным растет логарифмически. Частенько после этого пункта идет вопрос про бинарный поиск;
- Можно обратиться по неключевым полям или индексу.
2) Виды расширений.
Тут все относительно просто.
a) BADi старые и новые и их отличия.
б) Customer exits - пользовательские выходы, представляющие собой вот такой вызов в коде CALL CUSTOMER-FUNCTION 'XXX' внутри которй есть только Z Include для реализации пользовательской логики. Для работы с данными расширениями существует транзакции SMODE и CMOD;
в) User-exit - просто не реализованный Z* инклуд в коде программы.
г) Enhancement неявные точки расширения - наверное, самые часто встречающийся тип расширения. лепим мы их где надо и где не надо. Читайте тут.
д) Еще есть явные Enhancement - лично мне встречались гораздо реже.
3 ) Чем отличается абстрактный класс от интерфейса.
Действительно, что же еще можно спросить из ООП.
a) У абстрактного класса могут быть реализованные методы. Чаще всего этого ответа хватает с головой. Конечно же отличий больше
б) Множественное наследование возможно с интерфейсом, но не абстрактным классом;
в) У интерфейса все методы public, у абстрактного класса есть варианты.
... может быть что-то упустил, но это основное.
4) Отладка фоновых задач ABAP
а) Читать вот тут;
б) В некоторых случаях возникает вопрос, как отладить IN UPDATE TASK. Смотрите здесь;
5.1) Когда упоминается IN UPDATE TASK сразу же возникает вопрос. Когда запускается выполнение IN UPDATE TASK ?
Ответ: IN UPDATE TASK срабатывает при явном COMMIT
5.2) Типы модулей обновлений
V1 - выполняются в том же LUW
V2 - выполняются в отдельном LUW
5.3) Что такое LUW:
Подробнее.
Еще подробнее.
6) Неявные commit:
а) Когда система открывает экран SAP;
б) Вызов синхронного или асинхронного RFC;
г) Диалоговый Message;д) Вызов транзакций или вызов программы (SUBMIT) Вот тут меня поправили. Действительно, commit не происходит. Но рекомендуется делать его принудительно перед вызовом. Документация для SUBMIT.
Прочитайте все, обратите внимание на этот момент:
SUBMIT does not end the current database LUW, regardless of the addition AND RETURN. A database commit or database rollback in the called program works in exactly the same way as in the current program.
The statement SUBMIT with the addition AND RETURN opens a new SAP LUW, but it does not open a new database LUW. This means that a database rollback in this SAP LUW can roll back all registration entries made by the statements CALL FUNCTION IN UPDATE TASK or CALL FUNCTION IN BACKGROUND TASK in the tables VB… or ARFCSSTATE and ARFCSDATA. Under certain circumstances, the statement ROLLBACK WORK in the called program can also affect the interrupted SAP LUW. To prevent this, an explicit database commit must be executed before the program is called. This problem does not occur in local updates.
If there are still procedures registered in the current SAP LUW in the case of SUBMITs without AND RETURN, the SAP LUW exits without calling or rolling back the procedures. Registered update function modules can no longer be executed. In cases like this, therefore, it is advisable to execute the statement COMMIT WORK or ROLLBACK WORK explicitly before the program call.
Документация для CALL TRANSACTION
Обратите внимание:
CALL TRANSACTION does not end the current database LUW. A database commit or database rollback in the called program works in exactly the same way as in the current program.
The statement CALL TRANSACTION opens a new SAP LUW but it does not open a new database LUW. This means that a database rollback in this SAP LUW can roll back all registration entries made by the statements CALL FUNCTION IN UPDATE TASK or CALL FUNCTION IN BACKGROUND TASK in the tables VB… or ARFCSSTATE and ARFCSDATA. Under certain circumstances, the statement ROLLBACK WORK in the called program can also affect the interrupted SAP LUW. To prevent this, an explicit database commit must be executed before the program is called. This problem does not occur in local updates.
Есть еще случаи:
Документация для коммитов. Правда для синтаксиса 7.52, смотрите сами, насколько это актуально в вашем случае.
7) Особенности FOR ALL ENTRIES:
а) Всегда надо проверять наличие записей в таблице;
б) Указываем полный ключ;
в) Может быть просадка производительности при выборе по нескольким полям;
8) Оптимизация и тест производительности:
Вот тут каждый отвечает, кто во что горазд.
Например:
- типы таблиц, описанные ранее;
- проблемы производительности при использовании select endselect;
- loop в loope по одной таблице;
- замеры производительности программы в SAT;
- ST05;
- Распараллеливание;
- Денормализация таблиц БД
- Индексация таблиц БД.
После упоминания данного пункта, сразу прилетает вопрос: "По каким столбцам стоит делать индексацию?" Есть ли смысл делать индекс для поля Пол.
Пол - это просто самое показательное, здесь проще всего посчитать плотность записей, ведь их всего два(Хотя, конечно, скоро и до нас дойдут современные веяния). Вопрос немного раскрыт тут.
И т.д. и т.п.
Коллега, вы вводите в заблуждение как минимум в двух местах.
1. По хешированным таблицам:loop не исключается, а исключается только доступ по порядковому номеру ключа (т.к. в в случае с хешами это теряет практический смысл). Внутри loop мы не получим значение sy-tabix, на этом неудобства кончаются.Доступ к любым массивам не может не зависеть от их размера (количества данных), растет таблица данных, соответственно, растет таблица хешей, растут затраты на поиск в последней. Можно только сказать, что затраты не зависят от длины ключа, если пренеречь затратами на вычисление хеша, т.к. длина хеша одна на любые ключи.Тем интереснее кстати вопрос про типы внутренних таблиц, каким бы банальным он не казался, ответы могут легко варьироваться от фантазий и домыслов до глубокой теории, вне зависимости от практического опыта.
2. Неявный db commit не сработает при call transaction и submit. Внутри вызываемых программ конечно же могут быть собственные причины явных или неявных commit’ов, но сами по себе ни submit ни call transaction не приводят к db commit, несмотря на раздельные SAP LUW. Тут, возможно, есть смысл не перечислять списком все причины, а начать с базовой причины неявного db commit’а в процессе выполнения программы – это передача управления от процесса к процессу (поскольку DB LUW ассоциирован с процессом, а не с внутренней сессией). И затем уже можно привести частные случаи этого, например, вызов экрана, как передачу управления SAP GUI с отключением от процесса на app сервере, или оператор wait up to, который, согласно описанию, также приводит к переключению процессов.
Да, был не прав. Немного дополнил и поменял формулировки. Спасибо
Давно не ходил по собеседованиям.Что еще могут спросить по ABAP? Критично ли иметь опыт работы с S4/Hana системами для ABAP-ера. У нас как бы стоит HANA система, но я кроме CDS-ок там ничего не создавал (HANA related), ну и новый синксис ABAP. Спрашивают ли какие-нибудь алгоритмы и структуры данных аля leetcode? На каком уровне спрашивают про модули (FI/SD/HR)? Я там знаю основные таблицы, транзакции и т.д. Но в бизнес-процессам не так силен как хотелось бы. Знаю только HR более-менее. Для FI/SD постановка задач шла от консультантов.
Кроме вышеперечисленного спрашивают oData сервисы. Все чаще и чаще ищут фулстека с UI5 или React.
По модулям спрашивают не очень глубоко. По HR, как правило, все ограничивается ЛБД и ФМами для работы с ИТ. По другим модулям, наверное, спросят какие-либо специфические инструменты если они есть. Но даже если не знаете, не страшно.
Как часто требуются CDS не скажу, нет какой-ибо статистики по ним у меня.
Алгоритмы ни разу не спрашивали. Слышал, что кто-то студентов по ним гонял, но это скорее ЧСВ свое потешить. Или от того, что больше спрашивать нечего.
У абстрактного класса вроде бы НЕ могут быть реализованные методы
У абстрактного класса должен быть хотя бы один НЕреализованный метод. Остальные методы вполне можно реализовать при необходимости.
https://ru.stackoverflow.com/questions/235352/%D0%9E%D1%82%D0%BB%D0%B8%D1%87%D0%B8%D1%8F-%D0%B0%D0%B1%D1%81%D1%82%D1%80%D0%B0%D0%BA%D1%82%D0%BD%D0%BE%D0%B3%D0%BE-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0-%D0%BE%D1%82-%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81%D0%B0-abstract-class-and-interface#:~:text=%D0%9A%D0%BE%D1%80%D0%BE%D1%82%D0%BA%D0%BE%D0%B5%20%D1%80%D0%B0%D0%B7%D0%BB%D0%B8%D1%87%D0%B8%D0%B5.,%D0%BF%D1%83%D0%B1%D0%BB%D0%B8%D1%87%D0%BD%D1%8B%D0%B5%20%D0%B8%20%D0%BD%D0%B5%D1%82%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0.
http://zevolving.com/2012/01/abstract-class-vs-interface/