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

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 传递:

复制现有程序的一个简单解决方案是从 table TRDIR 中读取其程序属性,更改您正在创建的程序 (TRDIR-NAME) 的名称,并在 DIRECTORY ENTRY.

之后传递它们

补充意见:

  • COMMIT WORK 应放在 GENERATE REPORT 之后,如文档中所述。
  • SY-SUBRC应该在INSERT REPORTGENERATE 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.