Abap 检查报表是否使用分层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

我找到了一种导出分层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_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:我的错,你是对的,不需要…(删除)非常感谢。我喜欢这个解决方案。