检查报告是否使用分层 ALV。如何?
Checking if a report uses hierarchical ALV or not. How?
我找到了导出分层 ALV 的方法 。不幸的是,我不知道报告是否使用分层 ALV。
如果我将上述答案的代码应用到报告 RFSKPL00
,那么我会在 cl_salv_bs_runtime_info=>get_data()
这里得到一个异常:
if t_data_line is requested.
import t_data_line to t_data_line from memory id cl_salv_bs_runtime_info=>c_memid_data_line.
if sy-subrc ne 0.
raise exception type cx_salv_bs_sc_runtime_info <=========
exporting
textid = 'ERROR'.
endif.
endif.
如果报表是否使用分层 ALV,如何签入 ABAP?
您可以使用 TRY / CATCH / ENDTRY 来防止基于可捕获 class 异常的转储:
DATA lx_runtime_info TYPE REF TO cx_salv_bs_sc_runtime_info.
TRY.
cl_salv_bs_runtime_info=>get_data(
IMPORTING
t_data = <lt_data>
t_data_line = <lt_data_line>
).
CATCH cx_salv_bs_sc_runtime_info INTO lx_runtime_info.
DATA(lv_result) = lx_runtime_info->if_message~get_text( ).
DATA(lv_result_long) = lx_runtime_info->if_message~get_longtext( ).
ENDTRY.
(ST22 将始终告诉您必须使用哪个异常 class。)
因为所有例外 classes 都是 classes(sub-subclasses,sub-sub-subclasses,等等)CX_ROOT,因此您可以使用方法 get_text 和 get_longtext 获取有关该问题的更多信息(通过接口 if_message 实现)。
判断ALV是经典ALV还是层次序列列表:
IF cl_salv_bs_runtime_info=>get( )-structure_line IS INITIAL.
"---------------------
" classic ALV
"---------------------
cl_salv_bs_runtime_info=>get_data_ref(
IMPORTING r_data = DATA(lr_data) ).
ELSE.
"---------------------
" hierarchical-sequential list
"---------------------
cl_salv_bs_runtime_info=>get_data_ref(
IMPORTING r_data = lr_data
r_data_line = DATA(lr_data_line) ).
ENDIF.
我想要相同的信息,但 Sandra 的回答没有帮助me/didn无效,因为参数无法填充。但是 cl_salv_bs_runtime_info
有另一个函数 get_metadata
解决了我的问题。它有一个按预期填充的参数 is_hierseq
。
DATA: lr_data TYPE REF TO data,
lr_data_line TYPE REF TO data.
FIELD-SYMBOLS: <lt_data> TYPE ANY TABLE,
<lt_data_line> TYPE ANY TABLE.
" initialising runtime analysis
cl_salv_bs_runtime_info=>set( EXPORTING display = abap_false
metadata = abap_true
data = abap_true ).
* ALV grid / hierarchical output:
CALL TRANSACTION 'MB51'.
* Testing output mode using metadata
DATA(runtime_metadata) = cl_salv_bs_runtime_info=>get_metadata( ).
IF runtime_metadata-is_hierseq IS INITIAL.
cl_salv_bs_runtime_info=>get_data_ref( IMPORTING r_data_descr = DATA(lr_data_descr) ).
CREATE DATA lr_data TYPE HANDLE lr_data_descr.
ASSIGN lr_data->* TO <lt_data>.
cl_salv_bs_runtime_info=>get_data( IMPORTING t_data = <lt_data> ).
ELSE. " hierarchical
cl_salv_bs_runtime_info=>get_data_ref( IMPORTING r_data_descr = lr_data_descr
r_data_line_descr = DATA(lr_data_line_descr) ).
CREATE DATA lr_data TYPE HANDLE lr_data_descr.
CREATE DATA lr_data_line TYPE HANDLE lr_data_line_descr.
ASSIGN lr_data->* TO <lt_data>.
ASSIGN lr_data_line->* TO <lt_data_line>.
cl_salv_bs_runtime_info=>get_data( IMPORTING t_data = <lt_data>
t_data_line = <lt_data_line> ).
ENDIF.
在简单 SALV 网格的情况下 <lt_data>
var 包含输出,在分层 ALV 列表的情况下,结果将在 <lt_data_line>
中。
我找到了导出分层 ALV 的方法
如果我将上述答案的代码应用到报告 RFSKPL00
,那么我会在 cl_salv_bs_runtime_info=>get_data()
这里得到一个异常:
if t_data_line is requested.
import t_data_line to t_data_line from memory id cl_salv_bs_runtime_info=>c_memid_data_line.
if sy-subrc ne 0.
raise exception type cx_salv_bs_sc_runtime_info <=========
exporting
textid = 'ERROR'.
endif.
endif.
如果报表是否使用分层 ALV,如何签入 ABAP?
您可以使用 TRY / CATCH / ENDTRY 来防止基于可捕获 class 异常的转储:
DATA lx_runtime_info TYPE REF TO cx_salv_bs_sc_runtime_info.
TRY.
cl_salv_bs_runtime_info=>get_data(
IMPORTING
t_data = <lt_data>
t_data_line = <lt_data_line>
).
CATCH cx_salv_bs_sc_runtime_info INTO lx_runtime_info.
DATA(lv_result) = lx_runtime_info->if_message~get_text( ).
DATA(lv_result_long) = lx_runtime_info->if_message~get_longtext( ).
ENDTRY.
(ST22 将始终告诉您必须使用哪个异常 class。)
因为所有例外 classes 都是 classes(sub-subclasses,sub-sub-subclasses,等等)CX_ROOT,因此您可以使用方法 get_text 和 get_longtext 获取有关该问题的更多信息(通过接口 if_message 实现)。
判断ALV是经典ALV还是层次序列列表:
IF cl_salv_bs_runtime_info=>get( )-structure_line IS INITIAL.
"---------------------
" classic ALV
"---------------------
cl_salv_bs_runtime_info=>get_data_ref(
IMPORTING r_data = DATA(lr_data) ).
ELSE.
"---------------------
" hierarchical-sequential list
"---------------------
cl_salv_bs_runtime_info=>get_data_ref(
IMPORTING r_data = lr_data
r_data_line = DATA(lr_data_line) ).
ENDIF.
我想要相同的信息,但 Sandra 的回答没有帮助me/didn无效,因为参数无法填充。但是 cl_salv_bs_runtime_info
有另一个函数 get_metadata
解决了我的问题。它有一个按预期填充的参数 is_hierseq
。
DATA: lr_data TYPE REF TO data,
lr_data_line TYPE REF TO data.
FIELD-SYMBOLS: <lt_data> TYPE ANY TABLE,
<lt_data_line> TYPE ANY TABLE.
" initialising runtime analysis
cl_salv_bs_runtime_info=>set( EXPORTING display = abap_false
metadata = abap_true
data = abap_true ).
* ALV grid / hierarchical output:
CALL TRANSACTION 'MB51'.
* Testing output mode using metadata
DATA(runtime_metadata) = cl_salv_bs_runtime_info=>get_metadata( ).
IF runtime_metadata-is_hierseq IS INITIAL.
cl_salv_bs_runtime_info=>get_data_ref( IMPORTING r_data_descr = DATA(lr_data_descr) ).
CREATE DATA lr_data TYPE HANDLE lr_data_descr.
ASSIGN lr_data->* TO <lt_data>.
cl_salv_bs_runtime_info=>get_data( IMPORTING t_data = <lt_data> ).
ELSE. " hierarchical
cl_salv_bs_runtime_info=>get_data_ref( IMPORTING r_data_descr = lr_data_descr
r_data_line_descr = DATA(lr_data_line_descr) ).
CREATE DATA lr_data TYPE HANDLE lr_data_descr.
CREATE DATA lr_data_line TYPE HANDLE lr_data_line_descr.
ASSIGN lr_data->* TO <lt_data>.
ASSIGN lr_data_line->* TO <lt_data_line>.
cl_salv_bs_runtime_info=>get_data( IMPORTING t_data = <lt_data>
t_data_line = <lt_data_line> ).
ENDIF.
在简单 SALV 网格的情况下 <lt_data>
var 包含输出,在分层 ALV 列表的情况下,结果将在 <lt_data_line>
中。