LOOP über führende interne Tabelle + READ TABLE und MODIFY Thema ist als GELÖST markiert

Getting started ... Alles für einen gelungenen Start.
4 Beiträge • Seite 1 von 1
4 Beiträge Seite 1 von 1

LOOP über führende interne Tabelle + READ TABLE und MODIFY

Beitrag von HawkDT (ForumUser / 4 / 3 / 0 ) »
Hallo zusammen,

mein Ziel (Übungsaufgabe) ist es, über eine führende, interne Tabelle (it_mard_dt) zu LOOPen und dazu mittels READ TABLE + MODIFY zwei weitere interne Tabellen (it_makt_dt und it_mara_dt) zu lesen und ein paar Daten (makt-maktx und mara-meins) in die it_mard_dt zu befüllen und auszugeben.

Wie kann ich das mit MODIFY lösen? Siehe unten im Code ist im LOOP ein Fehler bzw. es fehlt etwas. Insbesondere bin ich mir trotz Lesens der Hilfe nicht sicher welche MODIFY-Variante hier zu nutzen ist. Mit INDEX sy-tabix oder doch mit WHERE oder ...

Im folgenden Code wird mir eine Tabelle ausgegeben, doch leider fehlen die Daten aus den beiden internen Tabellen:


DATA: it_makt_dt TYPE TABLE OF zsbestand,
it_mard_dt TYPE TABLE OF zsbestand,
it_mara_dt TYPE TABLE OF zsbestand,
wa_mara_dt TYPE zsbestand,
wa_makt_dt TYPE zsbestand,
wa_mard_dt TYPE zsbestand.

PARAMETERS: pa_matnr TYPE makt-matnr.

SELECT-OPTIONS: so_werk FOR wa_mard_dt-werks,
so_lgort FOR wa_mard_dt-lgort.

SELECT matnr maktx
FROM makt
INTO CORRESPONDING FIELDS OF TABLE it_makt_dt
WHERE matnr = pa_matnr.


SELECT matnr werks lgort labst
FROM mard
INTO CORRESPONDING FIELDS OF TABLE it_mard_dt
WHERE matnr = pa_matnr
AND werks IN so_werk
AND lgort IN so_lgort.

SELECT matnr meins
FROM mara
INTO CORRESPONDING FIELDS OF TABLE it_mara_dt
WHERE matnr = pa_matnr.


IF sy-subrc = 0.

LOOP AT it_mard_dt INTO wa_mard_dt.
READ TABLE it_makt_dt WITH KEY matnr = wa_mard_dt-matnr INTO wa_makt_dt.
IF sy-subrc = 0.
MODIFY it_mard_dt FROM wa_makt_dt

READ TABLE it_mara_dt WITH KEY matnr = wa_mard_dt-matnr INTO wa_mara_dt.
IF sy-subrc = 0.
MODIFY it_mard_dt FROM wa_makt_dt.

WRITE: / wa_mard_dt-matnr,
wa_mard_dt-maktx COLOR COL_NORMAL,
wa_mard_dt-werks,
wa_mard_dt-lgort,
wa_mard_dt-labst COLOR COL_KEY,
wa_mard_dt-meins COLOR COL_KEY.

ENDIF.

ENDIF.

ENDLOOP.


ENDIF.

Vielen Dank im Voraus!
Zuletzt geändert von HawkDT am 23.03.2017 14:27, insgesamt 1-mal geändert.


Re: LOOP über führende interne Tabelle + READ TABLE und MODI

Beitrag von Thanatos82 (Expert / 699 / 32 / 122 ) »
Hi,

zu allererst: sprachenabhängige Tabellen wie die MAKT bitte IMMER mit der Sprache als Selektionskriterum lesen. Ich kann mir nicht vorstellen das du dänisch, chinesisch oder ungarisch brauchst. Daher beim Select auf die MAKT wie folgt selektieren:

Code: Alles auswählen.

SELECT matnr maktx
FROM makt
INTO CORRESPONDING FIELDS OF TABLE it_makt_dt
WHERE matnr = pa_matnr
AND spras = sy-langu.
Damit selektierst du nur die aktuelle Systemsprache in der du angemeldet bist.

Was du da aber machst ist in meinen Augen höchst unsauber. Du selektierst aus 3 verschiedenen DB-Tabellen in 3 verschiedene interne Tabellen, die aber alle die gleiche Struktur haben. Zum einen stört mich iwie das die alle die gleiche Struktur haben und zum anderen wäre ein JOIN wahrscheinlich effektiver und vor allem schneller. ;)

Wie dem auch sei:
Dem MODIFY fehlt noch der INDEX, da du hier nicht mit Tabellen mit unique key arbeitest, kann ABAP das sonst nicht so gut zuordnen.
Du müsstest dir also den SY-TABIX merken (das ist der Index, der aktuellen Tabellenzeile deines LOOPs) und diesen zu deinem MODIFY hinzufügen.

Du könntest allerdings auch bei der it_mard_dt in ein Feldsymbol loopen, welche die gleiche Struktur hat wie wa_mard_dt.
Dann könntest du die gelesenen Inhalte des READ TABLE direkt den einzelnen Feldern zuweisen und bräuchtest gar kein MODIFY mehr.

Folgende Benutzer bedankten sich beim Autor Thanatos82 für den Beitrag:
HawkDT

Gruß,
der Matze

Re: LOOP über führende interne Tabelle + READ TABLE und MODI

Beitrag von JHM (Top Expert / 1148 / 1 / 182 ) »
Nimm Field-Symbols dann sparst du dir das Modify ;-)
Da das wegen dem Übungscharakter keine Option ist, versuch ich dich mal in Richtung Lösung zu schubsen!

Code: Alles auswählen.

LOOP AT it_mard_dt INTO wa_mard_dt.
    READ TABLE it_makt_dt WITH KEY matnr = wa_mard_dt-matnr INTO wa_makt_dt.
    IF sy-subrc = 0.

*    Du sollst doch die Werte in die MARD übernehmen, dann solltest du diese erstmal zuweisen:
     wa_mard_dt-FELD = wa_makt_dt-FELD.

*    Beim READ verwendest du als Schlüssel die MATNR, wieso hier jetzt den TEXT?
*   auch beim MODIFY muss du die MATNR als Schlüssel in der MARD verwenden, denn nur diese Datensätze willst du Ändern:
*   Die WA muss gleich der ITAB sein!
     MODIFY it_mard_dt FROM wa_makt_dt WHERE maktx = wa_mard_dt-maktx. 

*  Hast du die Schachtelung bewusst gewählt? Nur wenn es einen MTEXT gibt sollen auch die MARA übernommen werden?
*  Auch hier fehlt die Übernahme der Werte in die MARD!
      READ TABLE it_mara_dt WITH KEY matnr = wa_mard_dt-matnr INTO wa_mara_dt.
      IF sy-subrc = 0.
        MODIFY it_mard_dt FROM wa_makt_dt.

        WRITE: /     wa_mard_dt-matnr,
                     wa_mard_dt-maktx COLOR COL_NORMAL,
                     wa_mard_dt-werks,
                     wa_mard_dt-lgort,
                     wa_mard_dt-labst COLOR COL_KEY,
                     wa_mard_dt-meins COLOR COL_KEY.

        ENDIF.

        ENDIF.

      ENDLOOP.
BTW: Welche Form des MODIFY du jetzt benötigst hängt von der Aufgabenstellung ab: Änderst du nur einen Satz oder mehrere?

Folgende Benutzer bedankten sich beim Autor JHM für den Beitrag:
HawkDT

Gruß Hendrik

Re: LOOP über führende interne Tabelle + READ TABLE und MODI

Beitrag von HawkDT (ForumUser / 4 / 3 / 0 ) »
Vielen Dank für die Hinweise und Hilfen!

- aktuelle Sprache habe ich für die MAKTX geändert
- die JOIN-Variante funktioniert und hatte ich bereits vorher schon mal so ausprobiert
- die Übungsaufgabe ist mit dem Hinweis schon erfüllt (siehe Screenshot)
- es funktioniert auch mit MOVE CORRESPONDING

Ich freue mich nach und nach auch elegantere Lösungen zu erlernen. Danke!

Seite 1 von 1

Über diesen Beitrag


ABAP & SAP eBook Flatrate von Espresso Tutorials Sponsorlink
Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

SmartForms show table...
vor 2 Tagen von Lucyalison 2 / 2249
Wie groß ist mein DynPro?
vor 2 Tagen von JanR gelöst 3 / 1126

Vergleichbare Themen

Loop zu einem Read Table machen
von cschmoel » 03.09.2012 09:01
LOOP/READ TABLE ... INTO vs REFERENCE INTO vs ASSINGING
von nickname8 » 26.10.2018 13:01
Modify interne Tabelle
von ABAPSunny » 27.03.2008 10:39
Modify auf interne Tabelle
von Ines » 25.10.2006 13:43
Tabelle ohne Kopfzeile ersetzen - Read table
von joester » 19.04.2016 09:25