Jeweils aktuellste Belegnummer zur Belegposition selektieren

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

Jeweils aktuellste Belegnummer zur Belegposition selektieren

Beitrag von bwlstudent (ForumUser / 5 / 0 / 0 ) »
Hallo zusammen,

ich möchte gerne jeweils den Datensatz mit der jeweils aktuellsten Belegnummer und Belegposition aus der Tabelle "EKBE" (Historie zum Einkaufsbeleg) selektieren. Die Tabelle EKBE enthält z. B. folgende Einträge (Auszug):

EBELN EBELP ZEKKN BUDAT

0045000018 00001 00 23.04.2011
0045000018 00001 01 29.04.2011
0045000018 00001 01 12.07.2011
0045000018 00002 00 23.06.2011
0045000018 00002 01 11.09.2011
0045000018 00003 00 15.07.2011
0045000018 00003 01 20.10.2011
0045000018 00004 00 14.01.2011
0045000018 00004 01 17.08.2011

Aus dem obigen Auszug brauche ich immer zu jeder Belegnummer (=EBELN) und Belegposition (=EBELP) den aktuellsten Datensatz, der sich aus dem Buchungsdatum (=BUDAT) ergibt. Das perfekte Ergebnis würde also folgendermaßen aussehen:

EBELN EBELP ZEKKN BUDAT

0045000018 00001 01 12.07.2011 (für Belegposition 1)
0045000018 00002 01 11.09.2011 (für Belegposition 2)
0045000018 00003 01 20.10.2011 (für Belegposition 3)
0045000018 00004 01 17.08.2011 (für Belegposition 4)

Kennt jemand eine Select-Anweisung bzw. einen Ansatz, der zum obigen Ergebnis führt? Ich komme leider nicht auf das Ergebnis.

Mein Beispielprogramm (Auszug) sieht folgendermaßen aus:

TABLES: ekbe.

DATA: it_ekbe TYPE TABLE OF ekbe WITH HEADER LINE,
wa_ekbe LIKE LINE OF it_ekbe,

SELECT-OPTIONS:

ebeln FOR ekbe-ebeln,
ebelp FOR ekbe-ebelp.

SELECT * FROM ekbe

INTO it_ekbe (ich habe bereits einige Möglichkeiten in der Select-Anweisung ausprobiert, komme aber nicht auf das Ergebnis)

WHERE ebeln IN ebeln AND ebelp IN ebelp.

ENDSELECT.

Hintergrund ist, dass ich mit dem jeweils aktuellsten Datensatz die Wareneingangsmenge und andere Rechnungen vornehmen möchte.

Ich bitte deshalb um eure Hilfe.

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


Re: Jeweils aktuellste Belegnummer zur Belegposition selekti

Beitrag von wreichelt (Top Expert / 1060 / 31 / 192 ) »
Hallo,

hast du es schon mal mit dem Paramter MAX im Select-Befehl versucht. Bitte mal ein F1 auf den Select setzen.

Gruß
Wolfgang

Re: Jeweils aktuellste Belegnummer zur Belegposition selekti

Beitrag von casman (Specialist / 420 / 1 / 63 ) »
Hi bwlstudent,

mir fallen spontan folgende Ansätze ein:

1. SELECT in Kombination mit GROUP BY und Aggregatfunktion MAX
(findest du alles in der F1-Hilfe wenn der Cursor auf SELECT steht - irgendwas Richtung SELECT MAX( BUDAT) EBELN EBELP FROM EKBE WHERE irgendwas GROUP BY EBELN EBELP). Leider grad kein System zur Hand.

2. SELECT mit Sub-Query (kuck mal in die Hilfe wegen Syntax, hab ich grad nich im Kopf)

Code: Alles auswählen.

SELECT EBELN EBELP BUDAT FROM EKBE 
             WHERE BUDAT = ( SELECT MAX ( BUDAT ) 
                                        WHERE EBELN = EKBE~EBELN AND 
                                                    EBELP = EKBE~EBELP. )
    
3. Selektieren aller Einträge, dann SORT nach EBELN EBLP ASCENDING BUDAT DESCENDING und ein folgendes DELETE ADJACENT DUPLICATES COMPARING EBELN EBLP.

Kritisch kann die Performance sein. Wenn du eine bestimmte Anzahl von Belegen hast und auf diese einschränken kannst, dann ist 3. sicher schneller. Wenn du aber ALLE Belege lesen willst, könnte 1. oder 2. vorteilhafter sein, obwohl die den SAP-Puffer umgehen.

Re: Jeweils aktuellste Belegnummer zur Belegposition selekti

Beitrag von bwlstudent (ForumUser / 5 / 0 / 0 ) »
Hallo zusammen,

vielen Dank für eure schnelle Hilfe. Ich werde es gleich im Verlauf des Tages ausprobieren und mich dann noch mal melden.

Beste Grüße

Re: Jeweils aktuellste Belegnummer zur Belegposition selekti

Beitrag von bwlstudent (ForumUser / 5 / 0 / 0 ) »
Noch mal hallo zusammen,

ich habe jetzt eine Anweisung, die mich der Lösung schon sehr nahe bringt:

SELECT ebeln ebelp MAX( budat ) FROM ekbe INTO CORRESPONDING FIELDS OF it_ekbe
WHERE ebeln IN ebeln AND ebelp IN ebelp GROUP BY ebeln ebelp.

Das Ergebnis sieht dann folgendermaßen aus:

45000018 00001 00 0000 00.00.0000
45000018 00002 00 0000 00.00.0000
45000018 00003 00 0000 00.00.0000
45000018 00004 00 0000 00.00.0000

Dadurch habe ich zwar alle eindeutigen Belegnummern und -positionen, aber die anderen Daten aus den anderen Spalten fehlen mir noch. Ich könnte zwar noch mal mit Hilfe der Ergebnismenge aus der internen Tabelle it_ekbe über die Tabelle EKBE selektieren, hätte dann aber wieder ein Ergebnis wie z. B.:

EBELN EBELP ZEKKN BUDAT

0045000018 00001 00 23.04.2011
0045000018 00001 01 29.04.2011
0045000018 00001 02 12.07.2011

Damit ich eine eindeutige Zeile in meiner internen Tabelle hätte, würde der Einbezug der Spalte ZEKKN (=Laufende Nummer der Kontierung) zu den Spalten EBELN und EBELP genügen. Ich hatte erst die Hoffnung, dass folgender Ansatz die Lösung bringt:

SELECT ebeln ebelp zekkn MAX( budat ) FROM ekbe INTO CORRESPONDING FIELDS OF it_ekbe
WHERE ebeln IN ebeln AND ebelp IN ebelp GROUP BY ebeln ebelp zekkn.

Ergebnis dieser Abfrage ist:

EBELN EBELP ZEKKN
45000018 00001 00 0000 00.00.0000 (diese hier brauche ich nicht, sondern nur den Datensatz mit der höchsten ZEKKN-Nr (hier "01")).
45000018 00001 01 0000 00.00.0000 (ich brauche nur diese Zeile).

Die Anweisung:

DELETE ADJACENT DUPLICATES FROM it_ekbe COMPARING ebeln ebelp.

löscht leider diese 1. Zeile nicht raus, sondern gar keine und lässt beide Zeilen bestehen für diese Position.

Weiß jemand Rat?
Zuletzt geändert von bwlstudent am 07.11.2011 22:28, insgesamt 1-mal geändert.

Re: Jeweils aktuellste Belegnummer zur Belegposition selekti

Beitrag von ewx (Top Expert / 4871 / 314 / 644 ) »
SELECT ebeln ebelp MAX( budat ) FROM ekbe INTO CORRESPONDING FIELDS OF it_ekbe
Ein beliebter Fehler... ;)
=> ... MAX( budat ) as budat ...

Re: Jeweils aktuellste Belegnummer zur Belegposition selekti

Beitrag von casman (Specialist / 420 / 1 / 63 ) »
Ein beliebter Fehler...
Shice, der geht wohl auf meine Kappe... :(

Re: Jeweils aktuellste Belegnummer zur Belegposition selekti

Beitrag von bwlstudent (ForumUser / 5 / 0 / 0 ) »
Danke für den Hinweis von ewx.

Meine Anweisung sieht jetzt folgendermaßen aus:

SELECT ebeln ebelp zekkn MAX( budat ) AS budat FROM ekbe INTO CORRESPONDING FIELDS OF it_ekbe WHERE ebeln IN ebeln AND ebelp IN ebelp GROUP BY ebeln ebelp zekkn.

Ich beziehe mich in der obigen Anweisung auf die Spalten ebeln, ebelp und zekkn, damit ich einen eindeutigen Datensatz bekommen kann, dennoch selektiert diese ABAP-Anweisung wieder über sämtliche Datensätze der Tabelle und gibt mir leider nicht den Datensatz mit der höchsten budat aus.

Falsches Ergebnis dieser Anweisung ist wieder:

EBELN EBELP ZEKKN
45000018 00001 00 0000
45000018 00001 01 0000
45000018 00001 02 0000 (nur diesen Datensatz brauche ich, da hier budat und zekkn zur Belegnummer und -position am höchsten sind)

Wie bekommt man das in ABAP hin, wenn nur die Kombination aus drei Spalten (EBELN EBELP ZEKKN) eindeutig ist und diese nun nach dem höchsten Buchungsdatum (budat) selektiert werden sollen?

Re: Jeweils aktuellste Belegnummer zur Belegposition selekti

Beitrag von wreichelt (Top Expert / 1060 / 31 / 192 ) »
Hallo,
warum nimmst du nicht die logische DB: EBM und machst dort bei der Belegnummer/Position den Befehl
'Get Last'.

Gruß
Wolfgang

Re: Jeweils aktuellste Belegnummer zur Belegposition selekti

Beitrag von bwlstudent (ForumUser / 5 / 0 / 0 ) »
Guten Tag zusammen,

die logische DB: EBM über die Transaktion SE36 möchte ich nur ungern modifizieren, da ich nicht der einzige bin, der auf das System zugreift.
ich konnte meine Problemstellung jetzt mit eurer Hilfe teilweise lösen, zumindest sahen meine Stichproben bisher sehr gut aus. Meine Select-Anweisung ging in die Richtung, die casman vorgeschlagen hatte:

SELECT *
FROM ekbe INTO CORRESPONDING FIELDS OF it_ekbe
WHERE ebeln in ebeln and ebelp in ebelp
AND zekkn IN (
SELECT MAX( zekkn ) AS zekkn FROM ekbe WHERE ebeln in ebeln and ebelp in ebelp GROUP BY ebeln ebelp
).

ENDSELECT.

Mithilfe dieser Anweisung kann ich nun über sämtliche Belegnummern selektieren und bekomme zu jeder Belegposition nur den aktuellsten Eintrag für jede Position, um mit diesen dann weiter rechnen zu können. Ich bekomme auch durch das Select * sämtliche Einträge zu dieser Tabelle und bin nicht mehr auf wenige Spalten beschränkt. Wichtig ist hierbei, dass das "GROUP BY ebeln ebelp" nur auf ebeln und ebelp zeigt und man hier nicht noch zekkn einbezieht, dann funktioniert das Ganze schon nicht mehr.

Problem ist hierbei, wenn in der Selektion ein Datensatz auftaucht, wo zekkn nicht mehr eindeutig ist, selektiert ABAP wieder komplett über alle Einträge und gibt sie komplett aus.

Ich habe in der Tabelle EKBE festgestellt, die bei uns gut 700.000 Einträge hat, dass manche Datensätze erst eindeutig durch die Kombination aus 5 oder 6 Spalten werden. Gebe es dieses Problem nicht, wäre obige Anweisung perfekt für diese Problemstellung. Weitere SELECT MAX-Anweisungen in die WHERE-Bedingung zu bringen, funktioniert zwar, schränkt aber in Kombination die Selektion zu stark ein (zumindest in meinen Versuchen) und das Ergebnis wird nicht eindeutig.

Ich werde es mal versuchen, die Daten in eine Struktur zu kippen und in dieser Struktur eine zusätzliche Indexspalte anzulegen und diese automatisiert hochzählen zu lassen und mir dann über Select MAX die höchste Indexnummer zu der jeweiligen Belegposition der jeweiligen Belegnummer ausgeben zu lassen. Dann sollte man einen eindeutigen Datensatz haben, der zu jeder Belegnummer alle aktuellsten Belegpositionen ausgibt. So weit der Plan.

Leider haben in meinen Fall auch Anweisungen wie z. B.,

DELETE ADJACENT DUPLICATES FROM it_ekbe COMPARING ebeln ebelp oder SELECT DISTINCT keine Abhilfe geschaffen, so dass man wohl einen Umweg gehen muss.

Vielleicht hat ja jemand noch einen anderen, einfacheren Vorschlag?

Re: Jeweils aktuellste Belegnummer zur Belegposition selekti

Beitrag von casman (Specialist / 420 / 1 / 63 ) »
Hallo bwlstudent,

das Statement kann so nicht ganz funktionieren, da du im Subselect ja immer über deine ganzen Belege gehst und das MAX bestimmst. Du müsstest es also zerrupfen, oder folgendes versuchen:

Code: Alles auswählen.

SELECT *
FROM ekbe INTO CORRESPONDING FIELDS OF it_ekbe
WHERE ebeln in ebeln and ebelp in ebelp
AND zekkn = (
SELECT MAX( zekkn ) AS zekkn FROM ekbe WHERE ebeln = ekbe~ebeln and ebelp = ekbe~ebelp ).

Seite 1 von 1

Vergleichbare Themen

1
Antw.
410
Views
Die aktuellste Datensätze behalten
von HH_ABAP » 23.05.2023 14:46 • Verfasst in ABAP® für Anfänger
2
Antw.
784
Views
3
Antw.
2133
Views
Adobe Forms: 2 Tabellen ausgeben, mit jeweils den gleichen Positionen auf einer Seite
von dpz » 04.12.2019 19:16 • Verfasst in ABAP® Core
1
Antw.
3691
Views
Substitution FI-Belegposition
von JürgenFFM » 11.10.2008 18:41 • Verfasst in Financials
2
Antw.
2639
Views
Substitution einer FI -Belegposition
von JürgenFFM » 06.02.2007 18:21 • Verfasst in Financials

Über diesen Beitrag


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

Aktuelle Forenbeiträge

Mahnung erstellen
vor 2 Stunden von wreichelt 2 / 20
Absprung VA02 Position
vor 5 Stunden von gs3rr4 gelöst 3 / 34
OPD Druck im SPOOL
vor 6 Stunden von Manfred K. 1 / 19

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.

Aktuelle Forenbeiträge

Mahnung erstellen
vor 2 Stunden von wreichelt 2 / 20
Absprung VA02 Position
vor 5 Stunden von gs3rr4 gelöst 3 / 34
OPD Druck im SPOOL
vor 6 Stunden von Manfred K. 1 / 19

Unbeantwortete Forenbeiträge

OPD Druck im SPOOL
vor 6 Stunden von Manfred K. 1 / 19
Export von Spools in XLSX
vor 5 Tagen von abapamateur 1 / 401
Feldberechnung ME32K
vor einer Woche von ZF_SAPler 1 / 1000