以编程方式克隆使用逻辑数据库的程序
Clone a program which uses a logical database, programmatically
我有一份报告,我们称它为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 is not defined for the current logical database
这就是问题所在 -> REPORT_A
使用 PNP
逻辑数据库并且有一个 get pernr
语句,因此未通过语法检查。
详细信息:REPORT_A
工作正常,其中声明了 tables pernr
。如果我 运行 它单独在 SE38
中,它执行完美。
但是,由于这个奇怪的错误,我总是无法生成 REPORT_B
。
即使我跳过 IF
条件,它也会在 submit
行中转储,指向一个语法错误,指向相同的错误,"pernr is not defined for the current logical database"
.
有解决办法吗?
我可以动态调用 get pernr
,这样语法检查就不会失败吗?
首先要注意,INSERT REPORT
and GENERATE REPORT
是语句供内部使用(保留给SAP)。
如果您仍想使用内部语句,请参阅我的其余回答。
否则,解决方法是使用 GENERATE SUBROUTINE POOL
. But it won't work for a logical database. If you copy a standard program maybe it's not a good idea of copying it (no note assistant to help you in case of patch/upgrade), so the classic workarounds are to add implicit enhancement options,或使用 SAP 在此特定程序中建议的最终用户退出(如果有)。可能还有其他选择,但这取决于您尚未分享的确切目标。
语句INSERT REPORT
创建一个带有程序入口的源代码模块(在tableTRDIR
中)默认对应于Executable program(A.K.A."report"),所以可以用SUBMIT
.
来执行
但是在你的情况下,你要生成的程序是一个program using a Logical Database,所以你必须分配程序属性Logical database
(TRDIR-LDBNAME
).
程序属性将通过以下语句中的单词 DIRECTORY ENTRY
传递:
SYNTAX-CHECK ... DIRECTORY ENTRY ls_trdir
INSERT REPORT ... DIRECTORY ENTRY ls_trdir
复制现有程序的一个简单解决方案是从 table 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.
我有一份报告,我们称它为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 is not defined for the current logical database
这就是问题所在 -> REPORT_A
使用 PNP
逻辑数据库并且有一个 get pernr
语句,因此未通过语法检查。
详细信息:REPORT_A
工作正常,其中声明了 tables pernr
。如果我 运行 它单独在 SE38
中,它执行完美。
但是,由于这个奇怪的错误,我总是无法生成 REPORT_B
。
即使我跳过 IF
条件,它也会在 submit
行中转储,指向一个语法错误,指向相同的错误,"pernr is not defined for the current logical database"
.
有解决办法吗?
我可以动态调用 get pernr
,这样语法检查就不会失败吗?
首先要注意,INSERT REPORT
and GENERATE REPORT
是语句供内部使用(保留给SAP)。
如果您仍想使用内部语句,请参阅我的其余回答。
否则,解决方法是使用 GENERATE SUBROUTINE POOL
. But it won't work for a logical database. If you copy a standard program maybe it's not a good idea of copying it (no note assistant to help you in case of patch/upgrade), so the classic workarounds are to add implicit enhancement options,或使用 SAP 在此特定程序中建议的最终用户退出(如果有)。可能还有其他选择,但这取决于您尚未分享的确切目标。
语句INSERT REPORT
创建一个带有程序入口的源代码模块(在tableTRDIR
中)默认对应于Executable program(A.K.A."report"),所以可以用SUBMIT
.
但是在你的情况下,你要生成的程序是一个program using a Logical Database,所以你必须分配程序属性Logical database
(TRDIR-LDBNAME
).
程序属性将通过以下语句中的单词 DIRECTORY ENTRY
传递:
SYNTAX-CHECK ... DIRECTORY ENTRY ls_trdir
INSERT REPORT ... DIRECTORY ENTRY ls_trdir
复制现有程序的一个简单解决方案是从 table 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.