自定义逻辑和业务加载项
使用此指令调用您所写的任何自定义 ABAP 编程。
运行下列指令以调用自定义 ABAP 程序:
*CALL_CUSTOM_LOGIC <filter_value_of_the_BADI>
此处 “filter_value_of_the_BADI” 是 UJ_CUSTOM_LOGIC BADI 业务加载项实施期间您提供的过滤器名称。
自定义逻辑示例
*CALL_CUSTOM_LOGIC COMPLEX_ALLOCATION
业务加载项示例
*START_BADI / *END_BADI 调用使用 UJ_CUSTOM_LOGIC BADI(事务 SE19)编写的任何自定义 ABAP 编程,而且可以将参数导出到业务加载项的 ABAP 代码中。
语法
*START_BADI <filter_value_of_your_BADI_implementation>
<key1> = <value1>
<key2> = <value2>
*END_BADI
此处 filter_value_of_your_BADI_implementation 是 UJ_CUSTOM_LOGIC BADI 业务加载项实施期间您提供的过滤器名称。
语法示例
下列示例说明了如何调用已实施的业务加载项,使用 CALC_ACCT 作为过滤器值,把两个科目添加到目标科目:
*START_BADI ROUND
DECIMAL = 2
*END_BADI
在 EXECUTE 方法中,DECIMAL 参数在 IT_PARAM 内部表中可见。在 EXECUTE 方法中,可以写入自定义代码以更改 CT_DATA 的传入事务数据。
可选参数
在 *START_BADI / *END_BADI 指令中,可以使用下列可选参数:
查询 — 执行默认查询。有效值是“启用”、默认值和“禁用”。如果想执行您自己的查询,则把查询设置为“禁用”。
写 — 自动写回数据。有效值是“启用”、默认值和“禁用”。
实施代码(位于已实施类的 EXECUTE 方法中)以降低折旧
在可以使用脚本逻辑中的业务加载项之前,请使用事务 SE19 实施 UJ_CUSTOM_LOGIC BADI。请参阅位于 http://help.sap.com/saphelp_nw70/helpdata/en/32/a83942424dac04e10000000a1550b0/content.htm
的 ABAP 在线帮助,以获取关于如何实施业务加载项的信息。
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.
调用业务加载项的脚本逻辑文件内容:
*START_BADI DECD
QUERY = ON
WRITE = ON
YEAR = 1
PERCENTAGE = 10 *END_BADI
业务加载项中的 ET_MESSAGE 把消息记录到数据管理器中。
如果想停止执行,请在业务加载项实施中建立 cx_uj_custom_logic 例外。
“本文档中包括的任何软件编码和/或代码行/字符串(“代码”)仅为示例,不可用于生产系统环境中。”“代码仅为更好、更直观地解释特定编码的语法和语法规则。”SAP 不担保本文中代码的正确性和完整性,且 SAP 不对因使用代码而造成的错误或损害负责,除非这些损害是由 SAP 故意或因其重大疏忽所造成。
关于创建 SAP 业务加载项的说明,请参阅 SAP NetWeaver Library 中的 ABAP 模型帮助。