Abap Liste

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

Abap Liste

Beitrag von mip (ForumUser / 48 / 0 / 2 ) »
Hallo,

ich versuche mit ABAP eine Liste zu erzeugen. Ziel ist es aus der VBAK alle Belege zu einem Kunden anzuzeigen (die Kundennummer ist ein Parameter).
Zum einen soll mit der VBAK-KUNNR in die VBPA gesprungen werden, dort die ADRNR ermittelt werden und mit dieser in die KNA1 und den Namen ermitteln. Zum anderen soll ebenfalls aus der VBPA die ADRNR ermittelt werden mit dem Kennzeichen PARVW = 'YE' und auch hier der Name aus der KNA1. Alles soll dann in einer Liste angezeigt werden. Das Hauptselect und Wegschreiben in eine interne Tabelle sowie ausgeben, bekomme ich noch hin. Nur für die Unterselects auf die anderen Tabellen fehlt mir das KnowHow. Danke für Eure Hilfe.

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


Re: Abap Liste

Beitrag von ralf.wenzel (Top Expert / 3921 / 200 / 280 ) »
Poste doch mal das was du hast und ich schreib dir den Rest dazwischen. *angebot mach



Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Beitrag von mip (ForumUser / 48 / 0 / 2 ) »
Hallo Ralf,

danke fürs Angebot anbei mein Code. Wie bekomme ich jetzt zu dieser Ergebnisliste weitere Spalten aus anderen Tabellen befüllt. Ein Zeilenweises Abarbeiten und für jeden Datensatz weitere Infos hinzuselektieren. Nur ich weiss nicht wie :(

REPORT Y_TEST_MIP.

PARAMETER Kunnr type vbak-kunnr.

TABLES: vbak,
vbuk,
kna1.
* interne Tabelle
data: begin of wa,
vbeln TYPE vbak-vbeln,
audat TYPE vbak-audat,
auart TYPE vbak-auart,
vbtyp TYPE vbak-vbtyp,
waerk TYPE vbak-waerk,
netwr TYPE vbak-netwr,
ernam TYPE vbak-ernam,
kunnr TYPE vbak-kunnr,
parvw TYPE vbpa-parvw,
adrnr TYPE vbpa-adrnr,
posnr TYPE vbpa-posnr,
kna1adrnr TYPE kna1-adrnr,
name1 TYPE kna1-name1,
name1_YE TYPE kna1-name1,
end of wa,
itab LIKE SORTED TABLE OF wa
with non-UNIQUE KEY vbeln kunnr.

SELECT a~audat
a~vbeln
a~vbtyp
a~waerk
a~netwr
a~ernam
a~kunnr
b~parvw
b~adrnr

INTO corresponding fields of table itab
FROM vbak as a
INNER JOIN vbpa as b ON a~vbeln = b~vbeln
AND a~kunnr = b~kunnr.


LOOP AT itab INTO wa.
WRITE: / wa-audat, wa-vbeln, wa-auart, wa-vbtyp, wa-netwr, wa-waerk, wa-ernam, wa-kunnr, wa-parvw, wa-name1, wa-kna1adrnr.
ENDLOOP.

Beitrag von ralf.wenzel (Top Expert / 3921 / 200 / 280 ) »
mip hat geschrieben:SELECT a~audat
a~vbeln
a~vbtyp
a~waerk
a~netwr
a~ernam
a~kunnr
b~parvw
b~adrnr

INTO corresponding fields of table itab
FROM vbak as a
INNER JOIN vbpa as b ON a~vbeln = b~vbeln
AND a~kunnr = b~kunnr.
Ich werde heute mit Arbeit erschlagen, also Coding dazwischenschreiben geht leider nicht. Aber ein paar Tipps kann ich dir geben:

1. Da fehlt die WHERE-Bedingung komplett (where b~parvw = 'YE').

2. Der Join zieht keine eindeutigen Sätze, darum hast du pro VBAK-Satz mehrere Einträge (VBPA funktioniert auf Positionsebene!)

3. Warum erweiterst du den Join nicht um eine dritte Tabelle KNA1? Das würd ich spontan am einfachsten finden.

4. "into corresponding fields" ist ein Laufzeitfresser! Lass das weg und achte darauf dass die Felder in der SELECT-Feldliste denen in der itab entsprechen. Dann hast du auch kein Problem mit kollidierenden Namen, die in deinem Falle auftreten.


Ralf

Ohne Witz: Vorgestern im Büro sitzt ein Programmiererkollege vor seinem Rechner und murmelte 'Hmmm, ich brauche wohl einen Join' -- ich spontan: 'Du Nase, hättest du mir das zeitig gesagt, hätte ich dir heute morgen einen mitgebracht' ;)
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Beitrag von mip (ForumUser / 48 / 0 / 2 ) »
Hallo,

alleine mit InnerJoin bekomme ich nicht das gewünschte Ergebnis, da es ja sein kann, dass in der VBPA auch nur ein DS pro Belegnummer der VBAK steht.
Um es ein wenig klarer darzustellen, hier mal die gefakten Inhalte der Tabellen.

VBAK
BelegNr
100
103
116

VBPA
BelegNr ParVW AdrNr
100 YE 1000
100 RE 1005
103 YE 1013
103 RE 1020
116 RE 1000

KNA1
AdrNr Name
1000 Tausend
1005 Tausen-Fünf
1013 Tausend-Dreizehn
1020 Tausend-Zwanzig

Ziel sollte eine Zeile pro Beleg sein:
BELEGNR PA ADRNR NAME PA ADRNR NAME
---------- -- ---------- ---------------- -- ---------- ----------------
100 RE 1005 Tausend-Fünf YE 1000 Tausend
103 RE 1020 Tausend-Zwanzig YE 1013 Tausend-Dreizehn


Mein bisheriges Select (dies hab ich auf dem SQL-Server nachgestellt, bitte nicht wundern)

*****SELECT*****
SELECT A.BelegNr,
B1.ParVW AS ParVW_RE, C1.AdrNr AS Adr_RE, C1.Name AS Name_RE,
B2.ParVW AS ParVW_YE, C2.AdrNr AS Adr_YE, C2.Name AS Name_YE FROM VBAK as A

INNER JOIN VBPA AS B1
ON A.BelegNr = B1.BelegNr
INNER JOIN KNA1 AS C1
ON C1.AdrNr = B1.AdrNr

INNER JOIN VBPA AS B2
ON B1.BelegNr = B2.BelegNr
INNER JOIN KNA1 AS C2
ON C2.AdrNr = B2.AdrNr

WHERE A.BelegNr = 103
AND (B1.ParVw = 'RE' AND B2.ParVw = 'YE')

Problem macht die Belegnummer 116 :-(

Für Hilfe wäre ich dankbar.

Viele Grüsse
mip

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
Hallo mip,

das ruft doch nach einem LEFT OUTER JOIN für b1 bzw. b2. Wobei ich mir jetzt aber nicht sicher bin, ob SAP das so zuläßt.

Code: Alles auswählen.

*****SELECT*****
SELECT a.BelegNr,
       b1.ParVW AS ParVW_RE, 
       c1.AdrNr AS Adr_RE, 
       c1.Name  AS Name_RE,
       b2.ParVW AS ParVW_YE, 
       c2.AdrNr AS Adr_YE, 
       c2.Name  AS Name_YE 
FROM vbak AS a

LEFT OUTER JOIN vbpa AS b1
  ON  b1.BelegNr = a.BelegNr
  AND b1.ParVW = 'YE'
    INNER JOIN kna1 AS c1
      ON c1.AdrNr = b1.AdrNr

LEFT OUTER JOIN vbpa AS b2
  ON  b2.BelegNr = a.BelegNr
  AND b2.ParVW = 'YE'
    INNER JOIN kna1 AS c2
      ON c2.AdrNr = b2.AdrNr

WHERE a.BelegNr = 103
Gruß
Ereglam


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

Beitrag von mip (ForumUser / 48 / 0 / 2 ) »
Hallo,

leider klappt dies so nicht. Als Ergebnis erhält man z.B. für die Belegnummer 103 folgende Zeile:
BelegNr ParVW_RE Adr_RE Name_RE ParVW_YE Adr_YE Name_YE
103 YE 1013 Tausend-Dr. YE 1013 Tausend-Dr.

richtig wäre:

103 RE 1020 Tausen-Zwanzig YE 1013 Tausend-Dr.

Bei 116 wird auch mit den Left Outer Joins kein Ergebnis gebracht. :cry:

Beitrag von JHM (Top Expert / 1197 / 1 / 197 ) »
mip hat geschrieben:Hallo,

leider klappt dies so nicht. Als Ergebnis erhält man z.B. für die Belegnummer 103 folgende Zeile:
BelegNr ParVW_RE Adr_RE Name_RE ParVW_YE Adr_YE Name_YE
103 YE 1013 Tausend-Dr. YE 1013 Tausend-Dr.

richtig wäre:

103 RE 1020 Tausen-Zwanzig YE 1013 Tausend-Dr.
Da hat sich bei Ereglam wohl der Fehlerteufel eingeschlichen:

Code: Alles auswählen.

LEFT OUTER JOIN vbpa AS b1 
  ON  b1.BelegNr = a.BelegNr 
* ParVW von YE auf RE geändert
  AND b1.ParVW = 'RE' 
    INNER JOIN kna1 AS c1 
      ON c1.AdrNr = b1.AdrNr 

LEFT OUTER JOIN vbpa AS b2 
  ON  b2.BelegNr = a.BelegNr 
  AND b2.ParVW = 'YE' 
    INNER JOIN kna1 AS c2 
      ON c2.AdrNr = b2.AdrNr 
mip hat geschrieben: Bei 116 wird auch mit den Left Outer Joins kein Ergebnis gebracht. :cry:
Wie ist VBPA gefüllt? Du greifst ohne POSNR auf VBPA zu obohl POSNR zum Schlüssel gehört.

Gibt es einen Eintrag in KNA1 zur AdrNr?
Wieso greifst du mit der AdressNummer auf die KNA1zu?
Key ist KUNNR. Wird eine abweichende Adresse manuell erfasst, wird die manuelle Adresse in ADRNR abgespeichert. In solch einem Fall hat die ADRNR keine Verknüofung mit der KNA1.
Gruß Hendrik

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
JHM hat geschrieben:...
Da hat sich bei Ereglam wohl der Fehlerteufel eingeschlichen:

Code: Alles auswählen.

LEFT OUTER JOIN vbpa AS b1 
  ON  b1.BelegNr = a.BelegNr 
* ParVW von YE auf RE geändert
  AND b1.ParVW = 'RE' 
    INNER JOIN kna1 AS c1 
      ON c1.AdrNr = b1.AdrNr 

LEFT OUTER JOIN vbpa AS b2 
  ON  b2.BelegNr = a.BelegNr 
  AND b2.ParVW = 'YE' 
    INNER JOIN kna1 AS c2 
      ON c2.AdrNr = b2.AdrNr 
:cry:
JHM hat geschrieben: ...Gibt es einen Eintrag in KNA1 zur AdrNr?
Wieso greifst du mit der AdressNummer auf die KNA1zu?
Key ist KUNNR. Wird eine abweichende Adresse manuell erfasst, wird die manuelle Adresse in ADRNR abgespeichert. In solch einem Fall hat die ADRNR keine Verknüofung mit der KNA1.
stimme ich zu (hatte vor leider irgendwie nicht darauf geachtet... *pfeif*)
Gruß
Ereglam


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

Beitrag von mip (ForumUser / 48 / 0 / 2 ) »
Wo sind denn die Partnerrollen zu einem Beleg hinterlegt, wenn nicht bei den Positionen? Ich versuche nämlich eine SAP-Query abzulösen und hier wird auch auf die VBPA zugegriffen und per single Select ein Zusatzfeld befüllt. Wenn man das ganze auf z.B. Position 10 einschränken würde, bekommt man auch zwei Zeilen aus der VBPA (RE und YE), würde das Problem also nicht vereinfachen.
Die Lösung bekommt man auf dem SQL-Server mit dem Union-Befehl hin. Gibt es etwas analoges auch im ABAP?

Seite 1 von 1

Vergleichbare Themen

6
Antw.
1129
Views
abap Liste formatieren zu PDF
von Juri » 06.12.2021 17:02 • Verfasst in ABAP® für Anfänger
11
Antw.
6089
Views
ABAP Liste mit Bilder?
von MisterB » 28.06.2013 15:29 • Verfasst in ABAP® für Anfänger
2
Antw.
1787
Views
ABAP-Liste generieren
von chatty » 05.08.2005 13:10 • Verfasst in ABAP® Core
0
Antw.
1245
Views
Layout ABAP Liste bei F4-Hilfe
von cali » 08.06.2006 10:16 • Verfasst in Dialogprogrammierung
3
Antw.
923
Views
ABAP-Liste in modalem Fenster
von Margolwes » 06.05.2021 06:39 • Verfasst in ABAP® Core

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

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.

Unbeantwortete Forenbeiträge

aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 1661
Hilfe bei SWEC/SWE2
letzen Monat von retsch 1 / 8263