Abap 检查报表是否使用分层ALV。怎么用?
我找到了一种导出分层ALV的方法。不幸的是,我不知道高级报告是否使用分层ALV 如果我将上述答案的代码应用于报告Abap 检查报表是否使用分层ALV。怎么用?,abap,alv,Abap,Alv,我找到了一种导出分层ALV的方法。不幸的是,我不知道高级报告是否使用分层ALV 如果我将上述答案的代码应用于报告RFSKPL00,那么我在cl\u salv\u bs\u runtime\u info=>get\u 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_l
RFSKPL00
,那么我在cl\u salv\u bs\u runtime\u info=>get\u 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.
如果请求t_数据线。
将t_数据线从内存id cl_salv_bs_runtime_info=>c_memid_数据线导入t_数据线。
如果sy subrc ne为0。
引发异常类型cx_salv_bs_sc_runtime_info您可以使用TRY/CATCH/ENDTRY防止基于可捕获类的异常的转储:
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.
DATA lx\u runtime\u info TYPE REF TO cx\u salv\u bs\u sc\u runtime\u info。
尝试
cl_salv_bs_运行时_info=>get_数据(
进口
t_数据=
t_数据线=
).
将cx_salv_bs_sc_runtime_信息捕获到lx_runtime_信息。
数据(lv_结果)=lx_运行时_信息->if_消息~get_文本()。
数据(lv_result_long)=lx_运行时_info->if_message~get_longtext()。
结束。
(ST22将始终告诉您必须使用哪个异常类。)
由于所有异常类都是CX_ROOT的子类(子类、子类等),因此您可以使用方法get_text和get_longtext获取有关问题的更多信息(通过接口if_消息实现) 要确定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.
我想要同样的信息,桑德拉的答案对我没有帮助/没有用,因为参数根本无法填充。但是cl\u salv\u bs\u runtime\u info
有另一个功能解决了我的问题,get\u 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.
数据:lr_数据类型参考数据,
lr_数据线类型参考数据。
字段符号:键入任何表格,
键入任何表格。
“初始化运行时分析
cl\U salv\U bs\U运行时信息=>set(导出显示=abap\U false
元数据=abap\u true
数据=abap_真)。
*ALV网格/分层输出:
调用事务“MB51”。
*使用元数据测试输出模式
数据(运行时元数据)=cl\u salv\u bs\u运行时信息=>get\u元数据()。
如果运行时元数据为,则hierseq为初始值。
cl_salv_bs_runtime_info=>get_data_ref(导入r_data_descr=data(lr_data_descr))。
创建数据lr_数据类型句柄lr_数据描述。
将lr_数据->*分配给。
cl_salv_bs_运行时_info=>get_数据(导入t_数据=)。
“等级制
cl_salv_bs_runtime_info=>get_data_ref(导入r_data_descr=lr_data_descr
r_data_line_descr=数据(lr_data_line_descr))。
创建数据lr_数据类型句柄lr_数据描述。
创建数据lr_数据线类型句柄lr_数据线描述。
将lr_数据->*分配给。
将lr_数据_行->*分配给。
cl_salv_bs_运行时_信息=>get_数据(导入t_数据=
t_data_line=)。
恩迪夫。
在一个简单的SALV网格中,
var包含输出,而在分层ALV列表中,结果将出现在
中。只需捕获异常,大致如下:数据lx\ux。。。键入CX_SALV_BS_SC_RUNTIME_INFO的REF。尝试方法调用。。。将CX\u SALV\u BS\u SC\u运行时\u信息捕获到lx\u。。。ENDTRY@JozsefSzikszai你的评论看起来更像是一个有效的答案,如果你把它转换成一个答案(在另一个问题中也是一样的),它会让其他人受益@JozsefSzikszai是的,捕捉“CX_SALV_BS_SC_RUNTIME_INFO”会有效。但这将捕获许多其他有其他根本原因的错误。如果我能找到一个只检查这个特殊情况的“if语句”,那就太好了。首先做一个get_data
来获取t_data
和t_data_line
(如果它是一个分层顺序列表),如果有错误,请尝试get_data
来获取t_data
(如果这是一个经典的ALV,它应该可以工作),再次失败意味着这是一个未知的原因。为什么需要“IF lx_runtime_info is BOUND”?@guettli:我的错,你是对的,不需要…(删除)非常感谢。我喜欢这个解决方案。