Abap 通过GUI调用的分层ALV报告有18列,但通过RFC只有6列。为什么?

Abap 通过GUI调用的分层ALV报告有18列,但通过RFC只有6列。为什么?,abap,saprfc,alv,Abap,Saprfc,Alv,我想导出报告RM07MLBS(tcode mb52)。如果我通过SAP-GUI调用此报告,它有18列,如果我使用以下代码调用它,它只返回maktx、werks、matkl、matnr、name1、mtart列: cl_salv_bs_runtime_info=>set( EXPORTING display = abap_false metadata = abap_false data = abap_true ). SUBMIT (IV_REPORT_NAME

我想导出报告
RM07MLBS
(tcode mb52)。如果我通过SAP-GUI调用此报告,它有18列,如果我使用以下代码调用它,它只返回
maktx、werks、matkl、matnr、name1、mtart
列:

cl_salv_bs_runtime_info=>set(
 EXPORTING
   display  = abap_false
   metadata = abap_false
   data     = abap_true
).

SUBMIT (IV_REPORT_NAME)
   WITH SELECTION-TABLE selection_table
  AND RETURN.

DATA: lo_data TYPE REF TO data.

cl_salv_bs_runtime_info=>get_data_ref( IMPORTING r_data = lo_data ).

IF lo_data IS NOT BOUND.
  ev_result_json = '[]'.
  EXIT.
ENDIF.

field-SYMBOLS <lv_data> type any table.
ASSIGN lo_data->* TO <lv_data>.
ev_result_json = /ui2/cl_json=>serialize( data = <lv_data> pretty_name = /ui2/cl_json=>pretty_mode-low_case ).

cl_salv_bs_runtime_info=>clear_all( ).
cl\u salv\u bs\u运行时信息=>set(
出口
显示=abap\U错误
metadata=abap\U false
数据=abap_真
).
提交(IV_报告_名称)
使用选择表选择表
然后返回。
数据:lo_数据类型参考数据。
cl_salv_bs_runtime_info=>get_data_ref(导入r_data=lo_data)。
如果LOU数据未绑定。
ev_结果_json='[]'。
出口
恩迪夫。
字段符号可以键入任何表格。
将lo_数据->*分配给。
ev_result_json=/ui2/cl_json=>serialize(data=pretty_name=/ui2/cl_json=>pretty_mode-low_case)。
cl_salv_bs_runtime_info=>清除所有()。

如何获取所有列?

用户JozsefSzikszai给了我解决此问题所需的提示

这样我就可以读取分层ALV中的所有列

SUBMIT (IV_REPORT_NAME)
   WITH SELECTION-TABLE selection_table
  AND RETURN.

FIELD-SYMBOLS <lt_data>             TYPE ANY TABLE.
FIELD-SYMBOLS <lt_data_line>        TYPE ANY TABLE.

DATA          lr_data               TYPE REF TO data.
DATA          lr_data_line          TYPE REF TO data.

cl_salv_bs_runtime_info=>get_data_ref( IMPORTING r_data_descr      = DATA(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>
       ).

IF <lt_data> IS INITIAL.
  ev_result_json = '[]'.
  EXIT.
ENDIF.

ev_result_json = /ui2/cl_json=>serialize( data = <lt_data_line> pretty_name = /ui2/cl_json=>pretty_mode-low_case ).
cl_salv_bs_runtime_info=>clear_all( ).

ENDFUNCTION.
提交(IV\u报告\u名称)
使用选择表选择表
然后返回。
字段符号可键入任何表格。
字段符号可键入任何表格。
数据lr_数据类型参考数据。
数据lr_数据线类型参考数据。
cl_salv_bs_runtime_info=>get_data_ref(导入r_data_descr=data(lr_data_descr)
r_data_line_descr=数据(lr_data_line_descr))。
创建数据lr_数据类型句柄lr_数据描述。
创建数据lr_数据线类型句柄lr_数据线描述。
将lr_数据->*分配给。
将lr_数据_行->*分配给。
cl_salv_bs_运行时_info=>get_数据(
进口
t_数据=
t_数据线=
).
如果是首字母。
ev_结果_json='[]'。
出口
恩迪夫。
ev_result_json=/ui2/cl_json=>serialize(data=pretty_name=/ui2/cl_json=>pretty_mode-low_case)。
cl_salv_bs_runtime_info=>清除所有()。
ENDFUNCTION。

欢迎反馈和提示如何改进此功能。

启动可执行程序而不是事务代码可能会有不同的行为。如果在没有SALV export模式的情况下执行程序,它不显示6列吗?如果是这样的话,问题不在于SALV,而在于你启动程序的方式。了解其行为不同的原因(通常需要调试)可能很棘手,使其正常工作也是另一个挑战。MB52显示分层ALV(FM REUSE_ALV_HIERSEQ_LIST_display),它使用两个内部表:header和bestand(请参阅EHP8 SP9中的程序RM07MLBS行#2652)。运行时,将显示来自这两个内部表的报告数据(您可以单击“更改布局”并查看标题和位置)。看起来,当您试图捕获内部表(cl_salv_bs_runtime_info=>get_data_ref…)时,它会返回头表。可能您也可以尝试使用上述方法的r_data_line参数,看看会发生什么。@jozsefszikai非常感谢您。你给了我正确的方向。为了支持像我这样有同样问题的新来者,我将在下面为我的问题创建一个答案。@guettli没问题…:)@谢谢你的提示。不幸的是,我现在面临着下一个问题:您的代码可以工作,但只需使用方法
GET\u DATA\u REF
的另外两个参数
R\u DATA
R\u DATA\u LINE
就可以大大简化代码,并且您可以去掉所有使用RTTI类的行(包括两个RTTI参数,两行
CREATE DATA
和调用方法
GET_DATA
的行)