Tabelle füllen

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).
18 Beiträge • Seite 1 von 2 (current) Nächste
18 Beiträge Seite 1 von 2 (current) Nächste

Tabelle füllen

Beitrag von pohlmann-schwarza (ForumUser / 91 / 0 / 0 ) »
Hallo Leute,

ich habe zwei Datenbanktabellen mittels TABLES deklariert. ZMOD und ZMOD2.
Beide Tabellen sind über ihren Key MATNR, LIFNR und WERKS verbunden.
Nun möchte ich eine interne Tabelle G_T_Change mit dem Inhalt der Datenbanktabellen füllen.
Mit meiner 2. SELECT Anweisung überschreibe ich allerdings die Einträge die durch die 1. SELECT Anweisung eingetragen werden.
Ich möchte aber, dass die Einträge der 2. SSELECT Anweisung zu denen der 1. Ergänzt werden.
Hier mein Code:

[code]
SELECT * FROM ZMOD INTO CORRESPONDING FIELDS OF TABLE
G_T_CHANGE WHERE MATNR = ZMOD-MATNR AND
LIFNR = ZMOD-LIFNR AND
WERKS = ZMOD-WERKS.
SELECT * FROM ZMOD2 INTO CORRESPONDING FIELDS OF TABLE
G_T_CHANGE WHERE MATNR = ZMOD-MATNR AND
LIFNR = ZMOD-LIFNR AND
WERKS = ZMOD-WERKS.
[quote]

Wie macht man so was am besten?

Viele Grüße
Michael
[/quote][/code]

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Beitrag von black_adept (Top Expert / 4103 / 128 / 945 ) »
Nimm für den 2. Select statt
SELECT ... INTO ...
einfach
SELECT ... APPENDING ...
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Beitrag von pohlmann-schwarza (ForumUser / 91 / 0 / 0 ) »
Das würde die Informationen von ZMOD2 anhängen.
Die Informationen gehören aber (verknüpft über den Schlüssel) zu denen aus ZMOD.
Sie müssten also zu den gefüllten Zeilen des 1. SELECT zugeordnet werden.

Sozusagen soll in G_T_Change eine Tabelle entstehen die vereinfacht so aussehen würde:

zmod-matnr ; zmod-lifnr ; zmod-name ; zmod2-link ; zmod2-bemerkung
zmod-matnr ; zmod-lifnr ; zmod-name ; zmod2-link ; zmod2-bemerkung
usw. (je nachdem wie viele Einträge es für den Key gibt)

Der Vorschlag mit Append führt zu:

zmod-matnr ; zmod-lifnr ; zmod-name ; ; ;
zmod-matnr ; zmod-lifnr ; zmod-name ; ; ;
; ; ; zmod2-link ; zmod2-bemerkung
; ; ; zmod2-link ; zmod2-bemerkung

Bin leider noch nicht so tief in die Datenbankabfragen eingetaucht.
Ich hoffe Ihr könnt mir helfen.

Viele Grüße
Michael

Beitrag von uh (Specialist / 158 / 0 / 1 ) »
Hi,

mach doch einen Select und dabei einen join auf beide Tabellen...

Beitrag von pohlmann-schwarza (ForumUser / 91 / 0 / 0 ) »
Der Tipp war schon mal Gold wert!
Leider bekomme ich es noch nicht ganz hin.

[code]
SELECT *
FROM ZMOD INNER JOIN ZMOD2 ON ZMOD2~MATNR = ZMOD~MATNR
AND ZMOD2~LIFNR = ZMOD~LIFNR
AND ZMOD2~WERKS = ZMOD~WERKS
INTO CORRESPONDING FIELDS OF TABLE G_T_CHANGE
WHERE MATNR = ZMOD-MATNR AND
LIFNR = ZMOD-LIFNR AND
WERKS = ZMOD-WERKS.
ENDSELECT.
[/code]

ABAP sagt nun das der Spaltenname MATNR zweideutig ist.
Das liegt offensichtlich an meiner WHERE Bedingung.
Aber warum ist da was zweideutig?


Viele Grüße
Michael

Beitrag von uh (Specialist / 158 / 0 / 1 ) »
Ich weiß ja nicht, was du genau selektieren willst aber ich würde mir _das_ WHERE einfach sparen.

Dann kannst du dir auch das ENDSELECT sparen, da du sowieso "INTO TABLE" nutzt.

Beitrag von babap (Expert / 681 / 1 / 1 ) »
Hallo,

mach einfach eine Datenbankview im DDIC: V_ZMOD.

Die liest Dir alle Daten zusammen, die in beiden Tabellen die gleichen Schlüssel bzw. Fremdschlüssel haben.

Gruß
babap
P.S. da sparst Du Dir das "gejoine" im Coding.

Beitrag von Martin8703 (ForumUser / 12 / 0 / 0 ) »
pohlmann-schwarza hat geschrieben:Der Tipp war schon mal Gold wert!
Leider bekomme ich es noch nicht ganz hin.

ABAP sagt nun das der Spaltenname MATNR zweideutig ist.
Das liegt offensichtlich an meiner WHERE Bedingung.
Aber warum ist da was zweideutig?
l
Vielleicht hilft dir der folgende Beispielcode (entliehen von http://www.4ap.de/pages/abap/syntax/inner-join.php):

Code: Alles auswählen.

SELECT SINGLE mbew~lbkum mbew~vmkum mara~meins
    FROM mbew inner join mara on mara~matnr = mbew~matnr
    into corresponding fields of alv_output
         WHERE  mbew~mandt  = sy-mandt
         AND    mbew~matnr  = it_daten-matnr
         AND    mbew~bwkey  = it_daten-werks
         AND    mbew~bwtar  = ''.
Achte auf die ~ in der Where-Bedingung. Deine Syntax scheint da fehlerhaft.

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
pohlmann-schwarza hat geschrieben:Der Tipp war schon mal Gold wert!
Leider bekomme ich es noch nicht ganz hin.

Code: Alles auswählen.

  SELECT *
  FROM ZMOD INNER JOIN ZMOD2 ON ZMOD2~MATNR = ZMOD~MATNR
                            AND ZMOD2~LIFNR = ZMOD~LIFNR
                            AND ZMOD2~WERKS = ZMOD~WERKS
  INTO CORRESPONDING FIELDS OF TABLE G_T_CHANGE
  WHERE MATNR = ZMOD-MATNR AND
                 LIFNR = ZMOD-LIFNR AND
               WERKS = ZMOD-WERKS.
  ENDSELECT.
ABAP sagt nun das der Spaltenname MATNR zweideutig ist.
Das liegt offensichtlich an meiner WHERE Bedingung.
Aber warum ist da was zweideutig?


Viele Grüße
Michael
es ist deshalb zweideutig, weil die Spalte MATNR (und andere) in beiden Tabellen vorkommt. Deshalb musst Du angeben, auf welches der beiden Tabellen das Feld basiert, welches Du in der WHERE-Bedingung genannt hast. Deshalb muss die betroffene Tabelle mittels ~ dem Feld vorangestellt werden.

Code: Alles auswählen.

  SELECT *
    FROM ZMOD 
      INNER JOIN ZMOD2 
        ON  ZMOD2~MATNR = ZMOD~MATNR
        AND ZMOD2~LIFNR = ZMOD~LIFNR
        AND ZMOD2~WERKS = ZMOD~WERKS
    INTO CORRESPONDING FIELDS OF TABLE G_T_CHANGE
    WHERE zmod~MATNR = ZMOD-MATNR
    AND   zmod~LIFNR = ZMOD-LIFNR
    AND   zmod~WERKS = ZMOD-WERKS.
PS:
die WHERE-Bedingung in dieser Form ist sinnlos, da Du dich auf der rechten Seite auf die Feldleiste ZMOD beziehst, die Du mit der TABLES-Anweisung deklariert hast und wahrscheinlich leer ist....
Wegen des INTO TABLE ist ein ENDSELECT falsch.
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von pohlmann-schwarza (ForumUser / 91 / 0 / 0 ) »
Hallo zusammen, erstmal vielen Dank für die Hilfe!

Vor dem SELECT wird über ein Dynpro der Key: MATNR, LIFNR und WERKS mittels Ein/Ausgabefeld mit Dictionary-Bezug in die Feldleiste von ZMOD geschrieben. Daher die WHERE-Bedingung.

Ergänzen musste ich noch das Feld ZINDEX welches eine Laufende-Nummer der jeweiligen Kombination darstellt und auch zum Key gehört.
Soweit so gut, gibt es in beiden Datenbanktabellen einen Datensatz zum eingegebenen Key, funktioniert es prima.

Gibt es die Kombination aus MATNR, LIFNR, WERKS und ZINDEX in ZMOD2 nicht, wird allerdings auch der Inhalt von ZMOD nicht angezeigt.
Das ist nicht so gut! Wenn es Felder vom Key in ZMOD gibt müssen Sie angezeigt werden, auch wenn es dazu keinen Passenden Datensatz in ZMOD2 gibt.

Diese Abfrage wird in einem Table-Control dargestellt. Es soll dazu dienen die Datenbestände zu ändern.

Viele Grüße
Michael

Beitrag von pohlmann-schwarza (ForumUser / 91 / 0 / 0 ) »
Hab den SELECT zu einem Left Outer Join umgeschrieben und es sieht schon viel besser aus:

Code: Alles auswählen.

  SELECT *
    FROM ZMOD
      LEFT OUTER JOIN ZMOD2
        ON  ZMOD2~MATNR  = ZMOD~MATNR
        AND ZMOD2~LIFNR  = ZMOD~LIFNR
        AND ZMOD2~WERKS  = ZMOD~WERKS
        AND ZMOD2~ZINDEX = ZMOD~ZINDEX
    INTO CORRESPONDING FIELDS OF TABLE G_T_CHANGE
    WHERE zmod~MATNR = ZMOD-MATNR
    AND   zmod~LIFNR = ZMOD-LIFNR
    AND   zmod~WERKS = ZMOD-WERKS.
Es gibt nur ein Problem bei dem Feld ZINDEX. Es wird hierfür der Inhalt aus ZMOD2 verwendet. Bei den Datensätzen die es nicht in ZMOD2 gibt bleibt das Feld also leer, obwohl in ZMOD etwas in dem Feld steht.

Viele Grüße
Michael

Beitrag von pohlmann-schwarza (ForumUser / 91 / 0 / 0 ) »
Hab noch eine Ergänzung:

Alle im JOIN verwendeten FELDER bleiben leer, bzw. sie werden mit 0 gefüllt.
Hab im Buch ABAP OBJECTS gelesen:

Beim Left Outer Join werden die Spalten jeder Zeile der rechten Seite,
welche die ON-Bedingung nicht erfüllt, mit Null-Werten gefüllt und mit den Spalten der linken Seite verknüpft.


Kann ich es irgendwie einrichten das anstelle der Null-Werte, der Inhalt von ZMOD übernommen wird. Das wäre doch auch generell viel Sinnvoller. Ich versteh sowie so nicht warum da ein Null-Wert geschrieben wird.

Viele Grüße
Michael

Beitrag von babap (Expert / 681 / 1 / 1 ) »
Hallo,

wenn es darum geht, mit JOIN Erfahrungen zu sammeln, und dann will ich nicht länger stören.

Aber hast Du schon mal die View ausprobiert ??

Gruß
babap

Beitrag von pohlmann-schwarza (ForumUser / 91 / 0 / 0 ) »
Nein noch nicht, ich dachte ich wäre der Lösung sehr nahe und habs bisher nur mit dem Join probiert. Leider weiß ich auch noch nicht wie das mit einem VIEW funktioniert. Ich wollte eigentlich nicht extra etwas im Dictionary für meine Anzeige/Änderung anlegen.

Hintergrund der Sache ist übrigens, dass die Tabelle ZMOD2 ergänzend zur ZMOD dazu kommt. Meine Aufgabe ist es nun, eine bestehende Transaktion so anzupassen das auch beide zusammen Angezeigt/Geändert werden können. In der bestehenden Transaktion wurde einfach mit SELECT auf ZMOD zugegriffen. Da ich so wenig wie möglich an dem Programm ändern wollte, dachte ich es wäre Ideal nur den SELECT anzupassen.

Bitte noch mal zurück zu JOIN, geht es denn wirklich nicht das die Felder der ON-Bedingung, bei denen nix in ZMOD2 steht, einfach von ZMOD gefüllt werden? Dann wäre das Problem vom Tisch! Ansonsten funktioniert der JOIN ja schon prima.

Viele Grüße
Michael

Beitrag von pohlmann-schwarza (ForumUser / 91 / 0 / 0 ) »
So, ich habe jetzt einen VIEW : ZMODZMOD2 und es passiert genau das gleiche! :?
Er lässt die Zeilen bei denen nix in der rechten Tabelle komplett weg. Ich brauch quasi so was wie einen Left Outer View.

Es soll doch einfach so sein, dass die Zeilen der linken Tabelle auch angezeigt werden wenn die Zeile der rechten Tabelle leer ist.

HILFE HILFE

Viele Grüße
Michael

Vergleichbare Themen

6
Antw.
4255
Views
Range Tabelle vom Typ RRRANGESID in eine DB-Tabelle füllen
von kaim77 » 15.09.2014 12:32 • Verfasst in ABAP® Core
2
Antw.
1770
Views
dyn. Tabelle füllen
von Thorsten » 09.03.2005 16:46 • Verfasst in ABAP® Core
4
Antw.
1170
Views
Tabelle füllen
von berater1234 » 11.10.2021 12:28 • Verfasst in ABAP® für Anfänger
2
Antw.
11407
Views
Füllen von Range Tabelle
von ulli952 » 22.06.2007 13:08 • Verfasst in ABAP® Core
1
Antw.
2237
Views
tabelle mit unterstruktur füllen
von dawns » 15.02.2007 08:38 • Verfasst in ABAP® für Anfänger

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.