Horst Keller выложил очередную порцию нововведений в язык ABAP.
Рубрика: Основы ABAP
Введение в основные понятия необходимые для понимания процессов разработки на языке ABAP
Диаграмма классов UML
При моделировании какой-либо системы, построенной с помощью ООП, широко используется унифицированный язык моделирования UML. Взаимосвязи между классами в такой системе принято отображать в виде диаграммы классов. В данной статье рассмотрены основные взаимосвязи между классами и как они отражаются в ABAP коде.
Взаимосвязь — это особый тип логических отношений между сущностями, показанных на диаграммах классов и объектов.
Существуют следующие виды взаимосвязей:
Тестирование, управляемое данными (Data-Driven Testing)
Методология тестирования, управляемого данными (DDT) применяется в автоматизации тестирования ПО, представляет собой тестирование, выполнение и верификация которого производится на основе данных, которые хранятся в БД или любых других источниках данных.
Обычно сравнивают эталонные данные с теми, что на выходе получает система из метода (функции, программы и т.п.).
Тестирование, управляемое данными подразумевает разделение юнит тестов и данных, которые в них проверяются. Юнит тесты получают эталонные данные из некого источника и сравнивают их с результатами, полученными при тестировании объекта.
Изначально ABAP Unit не предоставляет никакого сервиса для хранения и ведения тестируемых данных, как например это делают другие фреймворки для тестирования: jUnit, nUnit. В статье пойдет речь о том как обойти это недоразумение.
Автоматическая проверка присвоения имен для переменных
Как правило, в ABAP используется венгерская нотация для обозначения переменных.
В разных источниках правила по обозначению переменных могут отличаться, даже внутри кода SAP нет единого подхода. Есть некоторые рекомендации по обозначению, но они так же не являются полными.
С помощью анализатора кода тр. SCI можно унифицировать правила и проверять их соблюдение. Ниже, с помощью этой транзакции, будет рассмотрена проверка тестовой программы на соглашения об именах.
Сделать снимок экрана
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 |
DATA: gv_mime_type TYPE string, gv_image TYPE xstring, gt_tabimg TYPE STANDARD TABLE OF x, gv_path TYPE string, gv_full_path TYPE string, gv_useraction TYPE i, gv_name TYPE string. cl_gui_frontend_services=>get_screenshot( IMPORTING mime_type_str = gv_mime_type image = gv_image EXCEPTIONS access_denied = 1 cntl_error = 2 error_no_gui = 3 not_supported_by_gui = 4 OTHERS = 5 ). IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. cl_gui_frontend_services=>file_save_dialog( EXPORTING window_title = 'Сохранить изображение' default_extension = 'png' default_file_name = 'screenshot' prompt_on_overwrite = 'X' CHANGING path = gv_path filename = gv_name fullpath = gv_full_path user_action = gv_useraction EXCEPTIONS cntl_error = 1 error_no_gui = 2 not_supported_by_gui = 3 invalid_default_file_name = 4 OTHERS = 5 ). IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. IF gv_useraction = cl_gui_frontend_services=>action_ok. CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' EXPORTING buffer = gv_image TABLES binary_tab = gt_tabimg. cl_gui_frontend_services=>gui_download( EXPORTING filename = gv_full_path filetype = 'BIN' CHANGING data_tab = gt_tabimg EXCEPTIONS OTHERS = 99 ). ENDIF. |
Документация по методу.
Доступ к приватному атрибуту класса
Инкапсуляция — механизм языка программирования, ограничивающий доступ к составляющим объект компонентам (методам и свойствам), делает их приватными, то есть доступными только внутри объекта. Является важным инструментом ООП наряду с полиморфизмом, наследованием и абстракцией данных.
Как известно в ABAP можно получить доступ к приватному атрибуту другого класса, если класс запрашивающий атрибут является другом. Кроме этого способа, доступ к приватному атрибуту можно получить если мы сможем получить ссылку на него:
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 |
CLASS lcl_test DEFINITION. PUBLIC SECTION. CLASS-METHODS: get_var_ref RETURNING VALUE(ir_var) TYPE REF TO STRING. PRIVATE SECTION. CLASS-DATA: gv_var TYPE STRING VALUE 'old'. ENDCLASS. CLASS lcl_test IMPLEMENTATION. METHOD get_var_ref. GET REFERENCE OF gv_var INTO ir_var. ENDMETHOD. ENDCLASS. FIELD-SYMBOLS: <gv_var> TYPE STRING. DATA: gr_var TYPE REF TO STRING. START-OF-SELECTION. ASSIGN ('lcl_test=>gv_var') TO <gv_var>. IF <gv_var> IS ASSIGNED. WRITE <gv_var>. ELSE. WRITE 'Доступ к приватному атрибуту нельзя получить через ASSIGN'. ENDIF. gr_var = lcl_test=>get_var_ref( ). ASSIGN gr_var->* TO <gv_var>. CHECK <gv_var> IS ASSIGNED. <gv_var> = 'new'. WRITE: / 'Приватный атрибут получен, значение:', <gv_var>. |
В официальной документации сказано следующее:
If references are set using GET REFERENCE, permission to access the data object in question is only checked at the position of the statement. After that, the references can be passed on to any destination and the associated data objects can be accessed from any position using the references. To prevent access to private and read-only attributes using references outside classes, do not publish references to these attributes externally. A constant or read-only input parameter, however, can never be made modifiable by passing its reference.
Строитель типов
В ABAP редакторе есть весьма удобный генератор (строитель) типов, чтобы воспользоваться им, необходимо сделать следующее:
- Написать в редакторе TYPES
- Нажать Ctrl+Пробел, чтобы вызвать вспомогательное меню
- Щелкнуть два раза по TYPES или нажать Shift+Enter
На экране необходимо указать структуру из словаря и нажать кнопку Preview TYPE, после чего можно будет выбирать необходимые поля для будущей структуры:
В старых версиях редактора подобный инструмент можно было вызвать через вставку кода:
Изменения в языке ABAP 7.40
Демонстрация основных изменений в языке. Более подробно в документации и тут. Обзор изменений 7.40, SP05 тут.
Получение информации о ФМ
6 способов найти место вызова сообщений
Задачу определения места в программе, из которого было вызвано сообщение, можно решить несколькими способами. Ниже будут рассмотрены основные из них.