Interne Tabelle Sortierung

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

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

Interne Tabelle Sortierung

Beitrag von abap_frischling (ForumUser / 31 / 12 / 0 ) »
Hallo Zusammen,
leider sitze ich schon seit Stunden vor meinem PC und komme einfach nicht mehr weiter. Ich versuche meine Interne Tabelle so zu verändern, dass meine grüne Zeile immer zu erst aufgezeigt wird und dann erst die darauffolgenden Zeilen. Wenn ich sortiere habe ich nur Probleme. Mit meinem INNER JOIN hole ich mir die erste Zeile, welche mir so zu sagen Datensätze zum jetzigen Standpunkt liefert. Alles was danach folgt, wird über Unterprogramme selektiert bzw. ausgerechnet.
In meinem LOOP wo ich meine lv_requr und lv_aquis ausrechne, füge ich die ls_outtab per INSERT meiner lt_outtab hinzu. Leider macht er das immer über die Stand-Zeile. Kann mir jemand weiterhelfen? Ich finde einfach nicht den Fehler.
Vielen Dank!

Code: Alles auswählen.

*INNER JOIN für die Aufnahme der Datensätze aus verschiedenen Datenbanken
CLEAR lt_outtab.
SELECT
  a~matnr,
  a~werks,
  a~ekgrp,
  b~matkl,
  b~mtart,
  b~meins,
  c~maktx,
  d~lbkum,
  f~preis
  FROM marc AS a
  INNER JOIN mara AS b
  ON a~matnr = b~matnr
  INNER JOIN makt AS c
  ON a~matnr = c~matnr
  INNER JOIN mbew AS d
  ON a~matnr = d~matnr
  AND a~werks = d~bwkey
  INNER JOIN @lt_preis AS f
  ON a~matnr = f~matnr
  WHERE a~matnr IN @so_matnr
  AND a~werks IN @so_werks
  AND a~ekgrp IN @so_ekgrp
  AND b~matkl IN @so_matkl
  AND b~mtart IN @so_mtart
  AND c~spras = @sy-langu
  INTO CORRESPONDING FIELDS OF TABLE @lt_outtab.


*Berechnung für den höchsten Nettopreis für die MATNR aus der Datenbank EKPO
LOOP AT lt_outtab INTO ls_outtab.
  SELECT MAX( netpr ) INTO @DATA(lv_netpr)
    FROM ekpo
    WHERE matnr = @ls_outtab-matnr
    AND   werks = @ls_outtab-werks.
  ls_outtab-netpr = lv_netpr.
  SELECT SINGLE * FROM ekpo INTO ls_ekpo
    WHERE matnr = ls_outtab-matnr
    AND werks = ls_outtab-werks
    AND netpr = lv_netpr.
  ls_outtab-peinh = ls_ekpo-peinh.
  MODIFY lt_outtab FROM ls_outtab.
ENDLOOP.

*Aktuelle Gesamtbestand wird aus der Datenbank MBEW selektiert
LOOP AT lt_outtab INTO ls_outtab.
  SELECT SINGLE * INTO @DATA(ls_salk)
    FROM mbew
    WHERE matnr = @ls_outtab-matnr
    AND bwkey = @ls_outtab-werks.
  ls_outtab-salk3 = ls_salk-salk3.
  MODIFY lt_outtab FROM ls_outtab.
ENDLOOP.

*Berechung der Bedarfe/Zugänge und des Auswirkung auf den Gesamtbestand am Ende des Monats (EOMSTK)
LOOP AT lt_outtab INTO ls_outtab.
  LOOP AT lt_rdate INTO ls_rdate.
    CLEAR: lv_requr, lv_aquis, lv_eomstk, lv_salk.
    SELECT SINGLE * FROM mdkp INTO ls_mdkp     "Zunächst wird die DTNUM aus der Datenbank MDKP selektiert
      WHERE matnr = ls_outtab-matnr
      AND plwrk = ls_outtab-werks.
    lv_dtnum = ls_mdkp-dtnum.
    PERFORM calculate-plumi.                   "In Abhängigkeit zu der ersten DTNUM sollen alle Bedarfe/Zugänge aus der Datenbank MDTB ausgelesen werden
    SELECT * INTO TABLE lt_mdkpdb FROM mdkpdb  "Alle DTNUM aus MDKPDB für die MATNR werden selektiert
      WHERE matnr = ls_outtab-matnr
      AND plwrk = ls_outtab-werks.
    LOOP AT lt_mdkpdb INTO ls_mdkpdb.          "Für jede DTNUM werden die Bedarfe und Zugänge aus der Datenbank MDTB ausgerechnet
      lv_dtnum = ls_mdkpdb-dtnum.
      PERFORM calculate-plumi.
    ENDLOOP.
    ls_outtab-requr = lv_requr.                "Die Summe aus den vorherigen Berechnungen für Bedarf werden übergeben
    ls_outtab-aquis = lv_aquis.                "Die Summe aus den vorherigen Berechnungen für Zugang werden übergeben
    PERFORM calculate_month_year.              "Berechnung der Zeitspannen in das Format MM.YYYY (Bsp. 02.2022
    ls_outtab-period = lv_date.                "Übergabe der formatierten Zeitspanne an die Struktur
    PERFORM get_eomstk.                        "Berechnung des Bestandes zum Monatsende (EOMSTK)
    ls_outtab-eomstk = lv_eomstk.              "Übergabe des Bestandes zum Monatsende (EOMSTK) an die Struktur
    PERFORM salk.                              "Berechnung des Gesamtwertes im Bezug auf den Bestand zum Monatsende (EOMSTK)
    ls_outtab-salk3 = lv_salk.
    ls_outtab-lbkum = 0.
    INSERT ls_outtab INTO lt_outtab.           "Einfügen der Datensätze für jede MATNR in die interne Tabelle LT_OUTTAB
  ENDLOOP.
ENDLOOP.

*SORT: lt_outtab BY period.
*SORT: lt_outtab BY matnr.

LOOP AT lt_outtab INTO ls_outtab.              "Formartierung von MM.YYYY in z. B. FEB 2022 (Kombination aus Buchstaben und Zahl)
  PERFORM get_minit.
  ls_outtab-period = lv_date.
  MODIFY lt_outtab FROM ls_outtab.
ENDLOOP.

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


Re: Interne Tabelle Sortierung

Beitrag von abap_frischling (ForumUser / 31 / 12 / 0 ) »

Code: Alles auswählen.

SORT: lt_outtab BY period,
          lt_outtab BY matnr. 
Klappt leider nicht. Ich bekomme dann nämlich folgendes raus.
Wenn ich vorhin in meinen SELECT OPTIONS nur eine Materialnummer eingebe funktioniert die Sortierung einwandfrei.
Sobald ich zwei hinzunehme und meine Periodenzahl erhöhe kommt sowas raus nach meiner Sortierung:

Re: Interne Tabelle Sortierung

Beitrag von a-dead-trousers (Top Expert / 4399 / 223 / 1182 ) »
Du kannst auch zwei Sortierkriterien auf einmal angeben. Ich glaub das fehlt dir.

Code: Alles auswählen.

SORT lt_outtab BY period matnr.
Nach deiner Periode zu sortieren, halte ich aber trotzdem für einen Fehler, weil DEZ z.b. immer vor JAN kommen wird.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Interne Tabelle Sortierung

Beitrag von abap_frischling (ForumUser / 31 / 12 / 0 ) »
Nach deiner Periode zu sortieren, halte ich aber trotzdem für einen Fehler, weil DEZ z.b. immer vor JAN kommen wird.
Mein Code ist länger, das was man nicht sieht ist, das im calculate_month_year die Periode im Format 202202 (also 2022.02) steht. Dementsprechend kann sie dann auch sortiert werden.

Das Ergebnis von SORT lt_outtab BY period matnr:

Re: Interne Tabelle Sortierung

Beitrag von a-dead-trousers (Top Expert / 4399 / 223 / 1182 ) »
Schau dir den SORT mal genauer an.
Ich hab einfach nur darauf hingewiesen, dass du mit beiden Felder in einem Schritt sortieren musst. Nicht, dass die Sortierung die du gewählt hast richtig ist.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Interne Tabelle Sortierung

Beitrag von ewx (Top Expert / 4849 / 313 / 642 ) »
Was sind denn das für Zahlen, die in der grünen Zeile stehen? von der Darstellung her müsste das die Summe der einzelnen Perioden sein. Ist es aber nicht, weil die Perioden keine Werte haben. Sollte es trotzdem so sein, solltest du dich mal mit Zwischensummen beschäftigen:

Berater-wiki
SAP-Hilfe

Die würde ich dann auch nicht programmieren, sondern die Anwendenden festlegen lassen und als Layout speichern.

Ansonsten, wenn die Perioden absteigend sortiert sein sollen, dann muss eben der Wert in deiner grünen Zeile größer sein, als die Periodenwerte (31.12.9999).

Re: Interne Tabelle Sortierung

Beitrag von abap_frischling (ForumUser / 31 / 12 / 0 ) »
Ich habe das Problem folgendermaßen gelöst bekommen. Ich habe in meine Tabelle eine Spalte mit dem Namen SORT und dem Typ int4. Dann habe ich in meinem LOOP über meine interne Tabelle das SORT Feld auf 1 gesetzt (bzw. das passiert für jeden ersten Eintrag einer Matnr.).
Für alle weitern Einträge wird SORT + 1 gerechnet.
Danach wird die Tabelle nach Matnr. und SORT sortiert und alles passt.

Code: Alles auswählen.

*INNER JOIN für die Aufnahme der Datensätze aus verschiedenen Datenbanken
CLEAR lt_outtab.
SELECT
  a~matnr,
  a~werks,
  a~ekgrp,
  b~matkl,
  b~mtart,
  b~meins,
  c~maktx,
  d~lbkum,
  f~preis
  FROM marc AS a
  INNER JOIN mara AS b
  ON a~matnr = b~matnr
  INNER JOIN makt AS c
  ON a~matnr = c~matnr
  INNER JOIN mbew AS d
  ON a~matnr = d~matnr
  AND a~werks = d~bwkey
  INNER JOIN @lt_preis AS f
  ON a~matnr = f~matnr
  WHERE a~matnr IN @so_matnr
  AND a~werks IN @so_werks
  AND a~ekgrp IN @so_ekgrp
  AND b~matkl IN @so_matkl
  AND b~mtart IN @so_mtart
  AND c~spras = @sy-langu
  INTO CORRESPONDING FIELDS OF TABLE @lt_outtab.


*Berechnung für den höchsten Nettopreis für die MATNR aus der Datenbank EKPO
LOOP AT lt_outtab INTO ls_outtab.
  SELECT MAX( netpr ) INTO @DATA(lv_netpr)
    FROM ekpo
    WHERE matnr = @ls_outtab-matnr
    AND   werks = @ls_outtab-werks.
  ls_outtab-netpr = lv_netpr.
  SELECT SINGLE * FROM ekpo INTO ls_ekpo
    WHERE matnr = ls_outtab-matnr
    AND werks = ls_outtab-werks
    AND netpr = lv_netpr.
  ls_outtab-peinh = ls_ekpo-peinh.
  SELECT SINGLE * INTO @DATA(ls_salk)
  FROM mbew
  WHERE matnr = @ls_outtab-matnr
  AND bwkey = @ls_outtab-werks.
  ls_outtab-salk3 = ls_salk-salk3.
  ls_outtab-sort = 1.                           " <===== SORT Setzung für alle neuen Einträge zur MATNR
  MODIFY lt_outtab FROM ls_outtab.
ENDLOOP.


*Berechung der Bedarfe/Zugänge und des Auswirkung auf den Gesamtbestand am Ende des Monats (EOMSTK)
LOOP AT lt_outtab INTO ls_outtab.
  LOOP AT lt_rdate INTO ls_rdate.
    CLEAR: lv_requr, lv_aquis, lv_eomstk, lv_salk.
    SELECT SINGLE * FROM mdkp INTO ls_mdkp     "Zunächst wird die DTNUM aus der Datenbank MDKP selektiert
      WHERE matnr = ls_outtab-matnr
      AND plwrk = ls_outtab-werks.
    lv_dtnum = ls_mdkp-dtnum.
    PERFORM calculate-plumi.                   "In Abhängigkeit zu der ersten DTNUM sollen alle Bedarfe/Zugänge aus der Datenbank MDTB ausgelesen werden
    SELECT * INTO TABLE lt_mdkpdb FROM mdkpdb  "Alle DTNUM aus MDKPDB für die MATNR werden selektiert
      WHERE matnr = ls_outtab-matnr
      AND plwrk = ls_outtab-werks.
    LOOP AT lt_mdkpdb INTO ls_mdkpdb.          "Für jede DTNUM werden die Bedarfe und Zugänge aus der Datenbank MDTB ausgerechnet
      lv_dtnum = ls_mdkpdb-dtnum.
      PERFORM calculate-plumi.
    ENDLOOP.
    ls_outtab-requr = lv_requr.                "Die Summe aus den vorherigen Berechnungen für Bedarf werden übergeben
    ls_outtab-aquis = lv_aquis.                "Die Summe aus den vorherigen Berechnungen für Zugang werden übergeben
    PERFORM calculate_month_year.              "Berechnung der Zeitspannen in das Format MM.YYYY (Bsp. 02.2022
    ls_outtab-period = lv_date.                "Übergabe der formatierten Zeitspanne an die Struktur
    PERFORM get_eomstk.                        "Berechnung des Bestandes zum Monatsende (EOMSTK)
    ls_outtab-eomstk = lv_eomstk.              "Übergabe des Bestandes zum Monatsende (EOMSTK) an die Struktur
    PERFORM salk.                              "Berechnung des Gesamtwertes im Bezug auf den Bestand zum Monatsende (EOMSTK)
    ls_outtab-salk3 = lv_salk.
    ls_outtab-lbkum = 0.
    ls_outtab-sort = ls_outtab-sort + 1.       " <===== SORT Setzung für alle weiteren Einträge zur MATNR
    INSERT ls_outtab INTO lt_outtab.           "Einfügen der Datensätze für jede MATNR in die interne Tabelle LT_OUTTAB
  ENDLOOP.
ENDLOOP.

SORT lt_outtab BY matnr sort.

Seite 1 von 1

Vergleichbare Themen

2
Antw.
2629
Views
DB Abfrage in interne Tabelle - Sortierung
von Eddi » 09.03.2007 09:47 • Verfasst in ABAP® Core
4
Antw.
1145
Views
5
Antw.
2145
Views
Inhalt interne Tabelle an andere interne Tabelle übergeben
von L0w-RiDer » 30.01.2020 16:28 • Verfasst in ABAP® für Anfänger
9
Antw.
5545
Views
Sortierung der internen Tabelle nach SELECT
von cali » 04.10.2006 15:02 • Verfasst in ABAP® Core
2
Antw.
2095
Views
Sortierung einer Tabelle klappt nicht...
von Lamerman » 06.06.2006 15:38 • Verfasst in Web-Dynpro, BSP + BHTML

Über diesen Beitrag



Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

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

Aktuelle Forenbeiträge

Regex in where
Gestern von tar 8 / 536
Daten an Tabelle binden
vor 2 Tagen von Bright4.5 3 / 1768
Programm anlegen mit Vorlage
vor 3 Tagen von DeathAndPain 2 / 424
IT0024 Qualifikationen CP-ID
vor 3 Tagen von DeathAndPain 2 / 661

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

Regex in where
Gestern von tar 8 / 536
Daten an Tabelle binden
vor 2 Tagen von Bright4.5 3 / 1768
Programm anlegen mit Vorlage
vor 3 Tagen von DeathAndPain 2 / 424
IT0024 Qualifikationen CP-ID
vor 3 Tagen von DeathAndPain 2 / 661

Unbeantwortete Forenbeiträge

BUSOBJEKT zu CMIS PHIO ermitteln
vor 3 Tagen von snooga87 1 / 343
aRFC im OO-Kontext
letzen Monat von ralf.wenzel 1 / 3533
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 10077