我有一个报告,我们称之为REPORT_A
,我想克隆它REPORT_B
,执行REPORT_B
,然后回来。
我正在执行以下操作:
DATA: lv_report_name TYPE c LENGTH 30 VALUE `DEMO_LIST_OUTPUT`,
lv_new_report_name TYPE c LENGTH 30 VALUE `ZZ_DEMO_LIST_OUTPUT`,
lt_report_code TYPE abaptxt255_tab,
lv_message TYPE abaptxt255,
lv_line TYPE i,
lv_word TYPE abaptxt255.
READ REPORT lv_report_name INTO lt_report_code.
SYNTAX-CHECK FOR lt_report_code
MESSAGE lv_message
LINE lv_line
WORD lv_word.
IF sy-subrc = 0.
INSERT REPORT lv_new_report_name FROM lt_report_code STATE 'A'.
GENERATE REPORT lv_new_report_name.
SUBMIT (lv_new_report_name) VIA SELECTION-SCREEN AND RETURN.
ENDIF.
syntax-check
语句返回sy-subrc = 4
,lv_message
包含:
未为当前逻辑数据库定义 PERNR
这就是问题 ->REPORT_A
使用PNP
逻辑数据库并具有get pernr
语句,因此语法检查失败。
细节:REPORT_A
工作正常,tables pernr
在其中声明。如果我在SE38
中单独运行它,它可以完美执行。
但是,由于这个奇怪的错误,我总是无法生成REPORT_B
。
即使我跳过IF
条件,它也会在submit
行中 DUMP,指向引用同一错误的语法错误,"pernr is not defined for the current logical database"
.
有没有办法解决它?
我可以动态调用get pernr
,这样它就不会通过语法检查吗?
首先,要小心,INSERT REPORT
和GENERATE REPORT
是供内部使用的语句(保留给SAP(。
如果您仍然想使用内部语句,请参阅我的其余答案。
否则,解决方法是使用GENERATE SUBROUTINE POOL
。但它不适用于逻辑数据库。如果您复制标准程序,复制它可能不是一个好主意(在补丁/升级的情况下没有笔记助手可以帮助您(,因此经典的解决方法是添加隐式增强选项,或使用SAP在此特定程序中建议的最终用户退出(如果有的话(。可能还有其他选择,但这取决于您的确切目标,您尚未分享。
该语句INSERT REPORT
创建一个带有程序条目(在表TRDIR
中(的源代码模块,默认情况下对应于可执行程序(又名"报告"(,因此可以使用SUBMIT
执行。
但在您的情况下,要生成的程序是使用逻辑数据库的程序,因此必须将程序属性分配Logical database
(TRDIR-LDBNAME
(。
程序属性将通过以下语句中DIRECTORY ENTRY
的单词传递:
SYNTAX-CHECK ... DIRECTORY ENTRY ls_trdir
INSERT REPORT ... DIRECTORY ENTRY ls_trdir
复制现有程序的一个简单解决方案是从表TRDIR
中读取其程序属性,更改正在创建的程序的名称(TRDIR-NAME
(,并在单词DIRECTORY ENTRY
之后传递它们。
补充说明:
COMMIT WORK
应按照文档中的说明放置在GENERATE REPORT
之后。SY-SUBRC
应在INSERT REPORT
后检查并GENERATE REPORT
。
因此,以下代码将起作用:
DATA: lv_report_name TYPE c LENGTH 30 VALUE `DEMO_LIST_OUTPUT`,
lv_new_report_name TYPE c LENGTH 30 VALUE `ZZ_DEMO_LIST_OUTPUT`,
lt_report_code TYPE abaptxt255_tab,
lv_message TYPE abaptxt255,
lv_line TYPE i,
lv_word TYPE abaptxt255,
ls_trdir TYPE trdir.
READ REPORT lv_report_name INTO lt_report_code.
SELECT SINGLE * FROM trdir INTO ls_trdir WHERE name = lv_report_name.
ls_trdir-name = lv_new_report_name.
SYNTAX-CHECK FOR lt_report_code
MESSAGE lv_message
LINE lv_line
WORD lv_word
DIRECTORY ENTRY ls_trdir.
IF sy-subrc = 0.
INSERT REPORT lv_new_report_name FROM lt_report_code STATE 'A' DIRECTORY ENTRY ls_trdir.
IF sy-subrc = 0.
GENERATE REPORT lv_new_report_name.
IF sy-subrc = 0.
COMMIT WORK.
SUBMIT (lv_new_report_name) VIA SELECTION-SCREEN AND RETURN.
ELSE.
* Handle the error + rollback
ENDIF.
ELSE.
* Handle the error + rollback
ENDIF.
ELSE.
* Handle the error
ENDIF.