检查报告是否使用分层 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> 中。