Пользовательская логика и BAdI

Эта инструкция служит для вызова любой написанной вами пользовательской ABAP-программы.

Операции

Чтобы вызвать пользовательские ABAP-программы, выполните следующую инструкцию:

*CALL_CUSTOM_LOGIC <filter_value_of_the_BADI>

где filter_value_of_the_BADI является именем фильтра, указанным во время реализации BAdI UJ_CUSTOM_LOGIC BADI.

Пример пользовательской логики

*CALL_CUSTOM_LOGIC COMPLEX_ALLOCATION

Примеры BAdI

*START_BADI / *END_BADI вызывают любую пользовательскую ABAP-программу, написанную с помощью UJ_CUSTOM_LOGIC BADI (транзакция SE19), и позволяют экспортировать параметры в ABAP-кодировки в BAdI.

Синтаксис

*START_BADI <filter_value_of_your_BADI_implementation>

<key1> = <value1>

<key2> = <value2>

*END_BADI

где filter_value_of_your_BADI_implementation является именем фильтра, указанным во время реализации BAdI UJ_CUSTOM_LOGIC BADI.

Пример синтаксиса

Следующий пример показывает, как вызвать реализованный BAdI с CALC_ACCT в качестве значения фильтра, чтобы добавить два счета в счет назначения:

*START_BADI ROUND

DECIMAL = 2

*END_BADI

Параметр DECIMAL отображается во внутренней таблице IT_PARAM в методе EXECUTE. В методе EXECUTE можно написать пользовательский код для изменения входящих переменных данных CT_DATA.

Необязательные параметры

В инструкции *START_BADI / *END_BADI можно использовать следующие необязательные параметры:

  • Query - выполнение запроса по умолчанию. Действительные значения: "Вкл." (On), значение по умолчанию и "Выкл." (Off). Установите для Query значение "Выкл.", чтобы выполнить собственный запрос.

  • Write - автоматическая обратная запись данных. Действительные значения: "Вкл." (On), значение по умолчанию и "Выкл." (Off).

Пример

Реализация кода (в методе EXECUTE реализованного класса) для отклонения амортизации

Примечание

Прежде чем использовать BAdI в логике скрипта, реализуйте UJ_CUSTOM_LOGIC BADI из транзакции SE19. Для получения информации о реализации BAdI см. онлайн-справку ABAP по адресу http://help.sap.com/saphelp_nw70/helpdata/en/32/a83942424dac04e10000000a1550b0/content.htmИнформация, опубликованная на сайте SAP.

METHOD if_uj_custom_logic~execute.

DATA: ls_param TYPE ujk_s_script_logic_hashentry,

l_log TYPE string,

l_ast_acct(16) TYPE c,

l_year(3) TYPE n,

l_percentage(3) TYPE p,

lo_model TYPE REF TO if_uj_model,

lo_dim TYPE REF TO if_uja_dim_data,

ls_dim TYPE uja_s_dim,

time_dim(16) TYPE c,

lr_rec TYPE REF TO data,

lr_result_rec TYPE REF TO data,

l_intermediate_value TYPE uj_sdata,

lt_final TYPE REF TO data.

FIELD-SYMBOLS: <ls_rec> TYPE ANY,

<ls_result_rec> TYPE ANY,

<ls_time> TYPE ANY,

<ls_signed.data> TYPE ANY,

<lt_final> TYPE STANDARD TABLE

* Убедитесь, что все параметры переданы.

CLEAR ls_param.

READ TABLE it_param WITH KEY hashkey = 'YEAR' INTO ls_param.

IF sy-subrc NE 0.

l_log = 'You have not specified the parameter ''YEAR'' which is required.'.

cl_ujk_logger=>log( i_object = l_log ).

RAISE EXCEPTION TYPE cx_uj_custom_logic.

EXIT.

ENDIF.

l_year = ls_param-hashvalue.

CLEAR ls_param.

READ TABLE it_param WITH KEY hashkey = 'PERCENTAGE' INTO ls_param.

IF sy-subrc NE 0.

l_log = 'You have not specified the parameter ''PERCENTAGE'' which is required.'.

cl_ujk_logger=>log( i_object = l_log ).

RAISE EXCEPTION TYPE cx_uj_custom_logic.

EXIT.

ENDIF.

l_percentage = ls_param-hashvalue.

* Вызовите имя измерения счета

cl_uj_model=>get_model( EXPORTING i_appset_id = i_appset_id

RECEIVING ro_model = lo_model ).

CALL METHOD lo_model->get_dim_data_by_type

EXPORTING

i_dim_type = uj00_cs_dim_type-time

i_appl_id

= i_appl_id

RECEIVING

ro_dim_data = lo_dim.

TRY.

CALL METHOD lo_dim->get_info

IMPORTING

es_dim_info = ls_dim.

ENDTRY.

time_dim = ls_dim-dimension. TRANSLATE time_dim TO UPPER CASE.

CREATE DATA lt_final LIKE ct_data.

ASSIGN lt_final->* TO <lt_final>. CREATE DATA lr_result_rec LIKE LINE OF ct_data. ASSIGN lr_result_rec->* TO <ls_result_rec>. CREATE DATA lr_rec LIKE LINE OF ct_data. ASSIGN lr_rec->* TO <ls_rec>.

* Выполните циклический проход по входящим данным и создайте набор результатов

LOOP AT ct_data ASSIGNING <ls_rec>.

<ls_result_rec> = <ls_rec>.

ASSIGN COMPONENT time_dim OF STRUCTURE <ls_result_rec> TO <ls_time>.

<ls_time>+0(4) = is <ls_time>+0(4) + l_year.

ASSIGN COMPONENT 'SIGNEDDATA' OF STRUCTURE <ls_result_rec> TO <ls_signeddata>.

DO l_year TIMES.

l_intermediate_value = l_intermediate_value + ( <ls_signeddata> - l_intermediate_value ) * l_percentage / 100.

ENDDO.

<ls_signeddata> = <ls_signeddata> - l_intermediate_value.

APPEND <ls_result_rec> TO <lt_final>.

ENDLOOP.

* Отправьте данные результатов обратно.

Примечание

В Business Planning and Consolidation существующие значения всегда перезаписываются.

ct_data = <lt_final>.

ENDMETHOD.

Содержимое файла логики скрипта для вызова BAdI:

*START_BADI DECD

QUERY = ON

WRITE = ON

YEAR = 1

PERCENTAGE = 10 *END_BADI

Примечание

ET_MESSAGE в BADI регистрирует сообщения администратору данных.

Если необходимо остановить выполнение, вызовите исключение cx_uj_custom_logic в реализации BAdI.

Любое кодирование программного обеспечения и/или строки текста программы ("Код"), включенные в эту документацию, являются только примерами и не предназначены для использования в среде продуктивной системы. Код предназначен лишь для лучшего объяснения и наглядного представления синтаксиса и правил построения выражений в определенном кодировании. SAP не гарантирует правильность и полноту приведенного здесь Кода. SAP не будет нести ответственность за ошибки и ущерб, возникшие по причине использования этого Кода, за исключением случаев, если такой ущерб нанесен со стороны SAP намеренно или по грубой неосторожности.

Дополнительная информация

Для получения инструкций о создании SAP Business Add-In см. справку по ABAP-модели в библиотеке SAP NetWeaver.