Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Clone a program which uses a logical database, programmatically

Tags:

abap

I have a report, let's call it REPORT_A, and I'd like to clone it to REPORT_B, execute REPORT_B, and then come back.

I'm doing the following:

  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.

The syntax-check statement is returning sy-subrc = 4, and lv_message contains:

PERNR is not defined for the current logical database

This is the issue -> REPORT_A uses PNP logical database and has a get pernrstatement, so it fails the syntax-check.

Detail: REPORT_A is working just fine, tables pernr is declared in it. If I run it alone in SE38, it executes perfectly.

But, due to this weird error, I am always failing to generate REPORT_B.

Even if I skip the IF condition, it will then DUMP in the submit line, pointing a syntax error referring to the same error, "pernr is not defined for the current logical database".

Is there a way around it?

Can I call get pernr dynamically, so it doesn't fail the syntax check?

like image 439
Pedro Accorsi Avatar asked Feb 02 '26 09:02

Pedro Accorsi


1 Answers

First of all, be careful, INSERT REPORT and GENERATE REPORT are statements for internal use (reserved to SAP).

If you still want to use the internal statements, see the rest of my answer.

Otherwise the workaround is to use 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, or use eventual user exits proposed by SAP in this particular program (if any). There might be other options, but it depends on your exact goal, which you didn't share (yet).


The statement INSERT REPORT creates a source code module with a program entry (in table TRDIR) which by default corresponds to an Executable program (A.K.A. "report"), and so can be executed with SUBMIT.

But in your case, the program you want to generate is a program using a Logical Database, so you must assign the program attribute Logical database (TRDIR-LDBNAME).

The program attributes are to be passed via the words DIRECTORY ENTRY in the following statements:

  • SYNTAX-CHECK ... DIRECTORY ENTRY ls_trdir
  • INSERT REPORT ... DIRECTORY ENTRY ls_trdir

An easy solution for copying an existing program is to read its program attributes from the table TRDIR, change the name of the program (TRDIR-NAME) that you are creating, and pass them after the words DIRECTORY ENTRY.

Additional comments:

  • COMMIT WORK should be placed after GENERATE REPORT as explained in the documentation.
  • SY-SUBRC should be checked after INSERT REPORT and GENERATE REPORT.

Consequently, the following code will work:

  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.
like image 62
Sandra Rossi Avatar answered Feb 05 '26 08:02

Sandra Rossi



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!