Сразу скажу что такая задача возникает крайне редко. Проверить процедуру на существование можно путем ее вызова и анализа последующего исключения. Вызов процедуры осуществляется командой PERFORM (proc) IN PROGRAM (prog), а чтобы при вызове не выполнять ее код, необходимо вызвать ее с заведомо ложной сигнатурой.
Возможные исключения:
Исключение | Интерпретация |
---|---|
cx_sy_dyn_call_illegal_form | Процедура не найдена |
cx_sy_program_not_found | Программа не найдена |
cx_sy_dyn_call_param_not_found | Процедура найдена по имени, но отличается по параметрам |
Ниже приведена реализация статического метода класса, выполняющего данную проверку.
Параметры входа:
1 2 |
PROC TYPE ANY " Название проверяемой процедуры PROG TYPE ANY " Программа, в которой ищем процедуру |
Параметры выхода:
1 |
RESULT TYPE FLAG " Признак существования процедуры |
Код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
METHOD proc_exists. DATA t TYPE STANDARD TABLE OF t100. DATA f TYPE REF TO data. TRY . PERFORM (proc) IN PROGRAM (prog) TABLES t t t t t t t t t t t t t t t t t t t t USING f f f f f f f f f f f f f f f f f f f f CHANGING f f f f f f f f f f f f f f f f f f. CATCH cx_sy_dyn_call_param_not_found. " Не корректная сигнатура result = 'X'. CATCH cx_sy_program_not_found. " Программа не найдена result = ' '. CATCH cx_sy_dyn_call_illegal_form. " Процедура не найдена result = ' '. ENDTRY. ENDMETHOD. |
Пример использования:
1 2 3 4 5 |
IF zcl_helper=>proc_exists( proc = 'FUNC' prog = 'Z_TEST_PROG' ) EQ 'X'. MESSAGE 'Процедура FUNC существует в программе Z_TEST_PROG' TYPE 'S'. ELSE. MESSAGE 'Процедуры FUNC не существует в программе Z_TEST_PROG' TYPE 'E'. ENDIF. |
IF FOUND можно использовать
IF FOUND вызывает процедуру, если она существует. В данном примере происходит проверка без выполнения кода процедуры.
А смысл искать без надобности в вызове?
Например, когда нужно спросить подтверждение пользователя перед выполнением.