*Markus: (ABAP) Wie einen INNER JOIN ausgeben lassen?

Hallo,

also eines muss man der Firma SAP lassen. Sie verstehen es mit ABAP wohl, die einfachsten Dinge unnötig zu verkomplizieren. Ich hoffe, dass mir jemand erklären kann, wie man einfach nur einen einfachen JOIN aus zwei Tabellen während eines Interaktiven Reportings (was für die Abfrage ohnehin irrelevant ist) ausgeben kann. Ich will es nicht zwischenspeichern, ich will es nicht mit INTO irgendwo anders hinschreiben (das System lässt keine SELECTs ohne INTO zu!), ich will es einfach nur ausgeben! Mittlerweile versuche ich schon über eine interne Tabelle zu gehen, aber die Felder bleiben stets leer. Zur Probe schrieb ich 'Test' bei der "LOOP AT"-Angabe, um zu sehen, ob wich überhaupt etwas tut, und immerhin bekomme ich "Test" so oft ausgegeben, wie Werte in den Tabellen sind, nur die Werte fehlen!

Es gibt 2 Tabellen:  ZZ6QBINS_CD1, ZZ6QBINS_CDLAND.

In ZZ6QBINS_CD1 befindet sich CD_NR als Primarschlüssel, der in ZZ6QBINS_CDLAND gleichzeitig Fremdschlüssel (CDL_CD_NR) ist. Aus ZZ6QBINS_CD1 will ich ZZ6QBINS_CD1-CD_INTERPRET ausgeben, aus ZZ6QBINS_CDLAND will ich ZZ6QBINS_CDLAND-CDL_HERKUNFT ausgeben.

Ich poste gleich mal den ganzen Report. Der erste SELECT von unten ist der, an dem ich mir die Zähne ausbeiße (Mit vielen Sternchen markiert):

REPORT  ZZ6QBINS07_05_UEBUNG_TEST1 NO STANDARD PAGE HEADING.

TABLES: ZZ6QBINS_CD1, ZZ6QBINS_CDLAND.
*Für die JOIN-Ausgabe muss eine Tabellenschablone definiert werden?

DATA: cursorfeld(30) TYPE C,
      BEGIN OF ausgabetabelleSchablone,
          interpret TYPE ZZ6QBINS_CD1-CD_INTERPRET,
          land TYPE ZZ6QBINS_CDLAND-CDL_HERKUNFT,
       END OF ausgabetabelleSchablone,
       itab LIKE TABLE OF ausgabetabelleSchablone.

*************STARTBILDSCHIRM********************
SELECTION-SCREEN BEGIN OF BLOCK eins WITH FRAME TITLE text-ue1.
* Die Select-Options festlegen, dh diese Variablen mit den Werten der
* Ausgabe "befüllen".
SELECT-OPTIONS: so_cdnr FOR ZZ6QBINS_CD1-CD_NR.

SELECTION-SCREEN END OF BLOCK eins.
*************STARTBILDSCHIRM ENDE***************

**********Programmstart ab hier, Liste ausgeben***************
START-OF-SELECTION.

WRITE: / 'Klicke auf den Interpreten um sein Herkunftsland anzeigen'.
WRITE: 'zu lassen'.
ULINE.
SELECT * FROM ZZ6QBINS_CD1 WHERE CD_NR IN so_cdnr.
     WRITE: /(20) ZZ6QBINS_CD1-CD_NR,
             (30) ZZ6QBINS_CD1-CD_INTERPRET,
             (30) ZZ6QBINS_CD1-CD_TITEL.
* Auch CDL_Herkunft muss "reserviert" werden, damit es im 2. Schirm
* verwendet werden kann.
     HIDE: ZZ6QBINS_CD1-CD_NR,
           ZZ6QBINS_CDLAND-CDL_HERKUNFT.

ENDSELECT.
**********Liste ausgeben beendet******************************
AT LINE-SELECTION.
* IS INITIAL ist der Anfangswert, z.B. blank
* IS NOT INITIAL MUSS GESETZT SEIN, DAMIT MAN DIE WERTE ANKLICKEN KANN!
IF NOT ( ZZ6QBINS_CD1-CD_NR IS INITIAL ) .
*sy-lsind ist die REPORT-NR!
    IF sy-lsind = 1.
       GET CURSOR FIELD cursorfeld.
       IF cursorfeld EQ 'ZZ6QBINS_CD1-CD_INTERPRET'.
*...Abfragen, ob die in so_cdnr hinterlegte CD_NR gleich der CD_NR der
* Tabelle CDLAND ist. Gleichzeitig die Select-Option "befüllen".
         WRITE: / 'Klicke auf das Land um alle Interpreten dieses'.
         WRITE: 'Landes aufzulisten.'.
         SELECT * FROM ZZ6QBINS_CDLAND WHERE
                  CDL_CD_NR = ZZ6QBINS_CD1-CD_NR.
          WRITE:  /(20) ZZ6QBINS_CDLAND-CDL_CD_NR,
                   (30) ZZ6QBINS_CDLAND-CDL_HERKUNFT.

ENDSELECT.
       ENDIF.
    ENDIF.
* Das ist der 2. Anzeigeschirm "in der Tiefe".
    IF sy-lsind = 2.
       GET CURSOR FIELD cursorfeld.
       IF cursorfeld EQ 'ZZ6QBINS_CDLAND-CDL_HERKUNFT'.
           WRITE: / 'Alle Interpreten des geklickten Landes.'.
*************Dieser SELECT tut nicht, was er soll******************************************************
           SELECT A~CD_INTERPRET B~CDL_HERKUNFT
           INTO CORRESPONDING FIELDS OF TABLE itab
           FROM ZZ6QBINS_CD1 AS A INNER JOIN ZZ6QBINS_CDLAND AS B
           ON A~CD_NR = B~CDL_CD_NR.
*************ausgabeTabelle bleibt leer!
           LOOP AT itab INTO ausgabetabelleSchablone.
               WRITE: / ausgabetabelleSchablone-interpret,
                        ausgabetabelleSchablone-land,
                        'Test'.

ENDLOOP.
       ENDIF.
    ENDIF.
ENDIF.
* CLEAR MUSS DORT GESETZT SEIN, WO WERTE HINTERLEGT SIND
* DA SONST DIE ALTEN WERTE DRIN STEHEN?
*CLEAR: ZZ6QBINS_CD1-CD_NR,
*       ZZ6QBINS_CD1-CD_INTERPRET.

Markus

  1. Habe es jetzt mit Umwegen über eine Interne Tabelle geschafft.
    *&---------------------------------------------------------------------*
    *& Report  ZZ6QBINS07_05_UEBUNG_TEST1                                  *
    *&                                                                     *
    *&---------------------------------------------------------------------*
    *&                                                                     *
    *&                                                                     *
    *&---------------------------------------------------------------------*

    REPORT  ZZ6QBINS07_05_UEBUNG_TEST1 NO STANDARD PAGE HEADING.

    TABLES: ZZ6QBINS_CD1, ZZ6QBINS_CDLAND.
    *Für die JOIN-Ausgabe muss eine Tabellenschablone definiert werden?
    TYPES: BEGIN OF ausgabetabelleSchablone,
              interpret TYPE ZZ6QBINS_CD1-CD_INTERPRET,
              land TYPE ZZ6QBINS_CDLAND-CDL_HERKUNFT,
           END OF ausgabetabelleSchablone.

    DATA: cursorfeld(30) TYPE C,
          antwort(20) TYPE C,
          interneTab TYPE STANDARD TABLE OF ausgabetabelleSchablone,
          itab LIKE LINE OF interneTab.

    *************STARTBILDSCHIRM********************
    SELECTION-SCREEN BEGIN OF BLOCK eins WITH FRAME TITLE text-ue1.
    * Die Select-Options festlegen, dh diese Variablen mit den Werten der
    * Ausgabe "befüllen".
    SELECT-OPTIONS: so_cdnr FOR ZZ6QBINS_CD1-CD_NR.

    SELECTION-SCREEN END OF BLOCK eins.
    *************STARTBILDSCHIRM ENDE***************

    **********Programmstart ab hier, Liste ausgeben***************
    START-OF-SELECTION.

    WRITE: / 'Klicke auf den Interpreten um sein Herkunftsland anzeigen'.
    WRITE: 'zu lassen'.
    ULINE.
    SELECT * FROM ZZ6QBINS_CD1 WHERE CD_NR IN so_cdnr.
         WRITE: /(20) ZZ6QBINS_CD1-CD_NR,
                 (30) ZZ6QBINS_CD1-CD_INTERPRET,
                 (30) ZZ6QBINS_CD1-CD_TITEL.
    * Auch CDL_Herkunft muss "reserviert" werden, damit es im 2. Schirm
    * verwendet werden kann.
         HIDE: ZZ6QBINS_CD1-CD_NR.

    ENDSELECT.
    **********Liste ausgeben beendet******************************
    AT LINE-SELECTION.
    * IS INITIAL ist der Anfangswert, z.B. blank
    * IS NOT INITIAL MUSS GESETZT SEIN, DAMIT MAN DIE WERTE ANKLICKEN KANN!
    IF NOT ( ZZ6QBINS_CD1-CD_NR IS INITIAL ) .
    *sy-lsind ist die REPORT-NR!
        IF sy-lsind = 1.
           GET CURSOR FIELD cursorfeld.
           IF cursorfeld EQ 'ZZ6QBINS_CD1-CD_INTERPRET'.
    ***************************POPUP*******************************
    CALL FUNCTION 'POPUP_TO_CONFIRM'
      EXPORTING
    *   TITLEBAR                    = ' '
    *   DIAGNOSE_OBJECT             = ' '
        TEXT_QUESTION               = 'Soll der Inhalt angezeigt werden?'
        TEXT_BUTTON_1               = 'Ja'(001)
    *   ICON_BUTTON_1               = ' '
        TEXT_BUTTON_2               = 'Nein'(002)
    *   ICON_BUTTON_2               = ' '
    *   DEFAULT_BUTTON              = '1'
    *   DISPLAY_CANCEL_BUTTON       = 'X'
    *   USERDEFINED_F1_HELP         = ' '
    *   START_COLUMN                = 25
    *   START_ROW                   = 6
    *   POPUP_TYPE                  =
    *   IV_QUICKINFO_BUTTON_1       = ' '
    *   IV_QUICKINFO_BUTTON_2       = ' '
      IMPORTING
       ANSWER                      = antwort
    * TABLES
    *   PARAMETER                   =
    * EXCEPTIONS
    *   TEXT_NOT_FOUND              = 1
    *   OTHERS                      = 2
              .
    IF SY-SUBRC <> 0.
    * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
    *         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ENDIF.

    ***************************POPUP ENDE**************************
    *****FALLS Antwort JA war, wird folgender Teil ausgeführt
              IF antwort EQ 1.
    *...Abfragen, ob die in so_cdnr hinterlegte CD_NR gleich der CD_NR der
    * Tabelle CDLAND ist. Gleichzeitig die Select-Option "befüllen".
             WRITE: / 'Klicke auf das Land um alle Interpreten mit'.
             WRITE:   'ihren Ländern zu sehen'.
             SELECT * FROM ZZ6QBINS_CDLAND WHERE
                      CDL_CD_NR = ZZ6QBINS_CD1-CD_NR.
              WRITE:  /(20) ZZ6QBINS_CDLAND-CDL_CD_NR,
                       (30) ZZ6QBINS_CDLAND-CDL_HERKUNFT.

    ENDSELECT.
    * Das erste ist das ENDIF der ANTWORT des POPUPS.
             ENDIF.
           ENDIF.
        ENDIF.
    * Das ist der 2. Anzeigeschirm "in der Tiefe".
        IF sy-lsind = 2.
           GET CURSOR FIELD cursorfeld.
           IF cursorfeld EQ 'ZZ6QBINS_CDLAND-CDL_HERKUNFT'.
    * Interne Tabellen löschen, da alles sonst doppelt drin steht.
               CLEAR interneTab.
               REFRESH interneTab.
               WRITE: / 'Alle Interpreten mit ihren Ländern.'.
               SELECT A~CD_INTERPRET B~CDL_HERKUNFT
               FROM ZZ6QBINS_CD1 AS A INNER JOIN ZZ6QBINS_CDLAND AS B
               ON A~CD_NR = B~CDL_CD_NR
               INTO itab.
               APPEND itab TO interneTab.
               ENDSELECT.
    * Ausgabe dieser Misttabelle.....
               LOOP AT interneTab INTO itab.
                   WRITE: / itab-interpret,
                            itab-land.

    ENDLOOP.
           ENDIF.
        ENDIF.
    ENDIF.

    Markus