我不能使用cl_salv_bs_runtime_info=>get_data_ref
,因为我得到这个语法错误:
方法"GET_DATA_REF"不存在。但是有一种方法可以 相似名称"GET_DATA">
也许我使用的是较新或较旧版本的SAP,还是其他原因?
我的代码:
REPORT ZSAM1.
TYPES: BEGIN OF ty_report,
rec_acc TYPE skont,
vendor TYPE LFA1-LIFNR,
jan_deb TYPE BSEG-WRBTR,
jan_cred TYPE BSEG-WRBTR,
feb_deb TYPE BSEG-WRBTR,
feb_cred TYPE BSEG-WRBTR,
mar_deb TYPE BSEG-WRBTR,
mar_cred TYPE BSEG-WRBTR,
apr_deb TYPE BSEG-WRBTR,
apr_cred TYPE BSEG-WRBTR,
may_deb TYPE BSEG-WRBTR,
may_cred TYPE BSEG-WRBTR,
jun_deb TYPE BSEG-WRBTR,
jun_cred TYPE BSEG-WRBTR,
jul_deb TYPE BSEG-WRBTR,
jul_cred TYPE BSEG-WRBTR,
aug_deb TYPE BSEG-WRBTR,
aug_cred TYPE BSEG-WRBTR,
sep_deb TYPE BSEG-WRBTR,
sep_cred TYPE BSEG-WRBTR,
oct_deb TYPE BSEG-WRBTR,
oct_cred TYPE BSEG-WRBTR,
nov_deb TYPE BSEG-WRBTR,
nov_cred TYPE BSEG-WRBTR,
dec_deb TYPE BSEG-WRBTR,
dec_cred TYPE BSEG-WRBTR,
acc_bal_deb TYPE BSEG-WRBTR,
acc_bal_cred TYPE BSEG-WRBTR,
END OF ty_report,
tt_report TYPE TABLE OF ty_report.
DATA: lt_report TYPE tt_report,
lv_ukurs type tcurr-ukurs,
Tcurr1 type tcurr,
fieldname(4) type c,
fnamedebit(20) type c,
fnamecredit(20) type c.
FIELD-SYMBOLS: <fs_rep> LIKE LINE OF lt_report.
select single ukurs from tcurr
into lv_ukurs
where fcurr = 'EUR'
and tcurr = 'AUD'. "<- your local currency
DATA: lr_pay_data TYPE REF TO data,
lr_pay_data_line TYPE REF TO data,
lr_data_descr TYPE REF TO cl_abap_datadescr,
lr_data_line_descr TYPE REF TO cl_abap_datadescr.
FIELD-SYMBOLS: <lt_pay_data> TYPE ANY TABLE,
<ls_pay_data_line> TYPE ANY TABLE.
cl_salv_bs_runtime_info=>set(
EXPORTING display = abap_false
metadata = abap_false
structure = ''
data = abap_true ).
SUBMIT RFKSLD00 via SELECTION-SCREEN and return.
cl_salv_bs_runtime_info=>get_data_ref(
IMPORTING r_data_descr = lr_data_descr
r_data_line_descr = lr_data_line_descr ).
CREATE DATA lr_pay_data TYPE HANDLE lr_data_descr.
CREATE DATA lr_pay_data_line TYPE HANDLE lr_data_descr.
ASSIGN lr_pay_data->* TO <lt_pay_data>.
ASSIGN lr_pay_data_line->* TO <ls_pay_data_line>.
cl_salv_bs_runtime_info=>get_data(
IMPORTING t_data = <lt_pay_data>
t_data_line = <ls_pay_data_line> ).
LOOP AT <lt_pay_data> ASSIGNING <ls_pay_data_line>.
APPEND INITIAL LINE to lt_report ASSIGNING <fs_rep>.
MOVE-CORRESPONDING <ls_pay_data_line> TO <fs_rep>.
WRITE: / <ls_pay_data_line>.
ENDLOOP.
Write: 'Program End!'.
语法错误告诉您该方法不存在。如果您查看相关类并且没有看到该方法,那么当然这意味着它在您的系统中不存在。
软件不断发展。在新版本中,有时会有新程序,有时会删除其他程序。这就是生活...
PS:请注意,官方不支持类cl_salv_bs_runtime_info
。使用它的风险由您自己承担。
我最近偶然发现了同样的问题。
此错误是由cl_salv_bs_runtime_info版本没有方法GET_DATA_REF引起的。
您可能想尝试阅读本文 https://blogs.sap.com/2011/07/07/gain-programmatic-access-to-data-of-sapgui-alv-reports/.
在近尾的文章中,他们描述了get_data_ref和get_data之间的区别。由于我们没有get_data_ref,如果我们想从提交程序中检索alv数据,我们只能使用get_data报告。您可能已经注意到,在此版本中,有参数结构
cl_salv_bs_runtime_info=>集( 导出显示 = abap_false 元数据 = abap_false 结构 = '' 数据 = abap_true )。
这是因为方法 get_data 不能用于动态表。在检索数据之前,我们需要首先了解其结构。由于您要提交标准程序RFKSLD00,因此可以先搜索其中使用的结构。找到结构后,您可以将结构名称放在结构参数中。
之后,您可以使用上面提交的结构声明一个内部表,并将内部表放入get_data方法中的t_data参数中。
希望这个答案会有所帮助。