以编程方式克隆使用逻辑数据库的程序



我有一个报告,我们称之为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 = 4lv_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 REPORTGENERATE 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.

相关内容

  • 没有找到相关文章

最新更新