Abfrage von Daten im Bezug auf RANGES Tabelle

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

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

Abfrage von Daten im Bezug auf RANGES Tabelle

Beitrag von abap_frischling (ForumUser / 31 / 12 / 0 ) »
Hallo Zusammen,

ich versuche für bestimmte Zeitspannen (welche ich mir in eine RANGE itab geholt habe) Datensätze zu beschaffen. Leider schaffe ich das nicht so wie ich es gern hätte. Es sollen zu einer bestimmten Nummer (dtum) für die verschiedenen Zeitspannen in Zeilen die Zugänge und Abgänge (lv_requr und lv_aquis) selektieren. Leider kommen ich mit meinem Code nicht mehr weiter. Kann mir jemand vielleicht auf die richtige Fährte bringen oder Tipps geben was ich falsch gemacht habe. Wenn ich ein SELECT mit einer WHERE Klausel mache, wo ich sage dass dat01 in der RANGE Zeile 1 (2,3 usw.) sein soll rechnet er es einfach nur zusammen.

Code: Alles auswählen.

lv_first_day = sy-datum.
TRY.
    CALL METHOD cl_bs_period_toolset_basics=>get_last_day_in_month
      EXPORTING
        iv_date = lv_first_day
      RECEIVING
        rv_date = lv_last_day.
  CATCH cx_bs_period_toolset_basics.
ENDTRY.

CLEAR lt_rdate.
ls_rdate-sign = 'I'.
ls_rdate-option = 'BT'.
ls_rdate-low = lv_first_day.
ls_rdate-high = lv_last_day.
APPEND ls_rdate TO lt_rdate.

DO.
  CLEAR lv_first_day.
  lv_first_day = lv_last_day + 1.
  TRY.
      CALL METHOD cl_bs_period_toolset_basics=>get_last_day_in_month
        EXPORTING
          iv_date = lv_first_day
        RECEIVING
          rv_date = lv_last_day.
    CATCH cx_bs_period_toolset_basics.
  ENDTRY.
  ls_rdate-sign = 'I'.
  ls_rdate-option = 'BT'.
  ls_rdate-low = lv_first_day.
  ls_rdate-high = lv_last_day.
  APPEND ls_rdate TO lt_rdate.
  IF sy-tabix = p_pdate.
    EXIT.
  ENDIF.
ENDDO.

LOOP AT lt_test INTO ls_test.
    SELECT SINGLE * FROM mdkp INTO ls_mdkp
      WHERE matnr = ls_test-matnr
      AND plwrk = ls_test-werks.
    lv_dtnum = ls_mdkp-dtnum.
    PERFORM calculate_plumi.
    ls_test-lv_requr = lv_requr.
    ls_test-lv_aquis = lv_aquis.
    INSERT ls_test INTO lt_test.
ENDLOOP.


SORT lt_test BY date.
SORT lt_test BY matnr.



FORM calculate_plumi.
  SELECT * INTO TABLE lt_mdtb
    FROM mdtb
    WHERE dtnum = lv_dtnum
    AND dat01 IN lt_rdate.
  IF sy-subrc = 0.
    LOOP AT lt_mdtb INTO ls_mdtb.
      CASE ls_mdtb-plumi.
        WHEN '+'.
          lv_aquis = lv_aquis + ls_mdtb-mng01.
        WHEN '-'.
          lv_requr = lv_requr + ls_mdtb-mng01.
        WHEN OTHERS.
      ENDCASE.
    ENDLOOP.
  ENDIF.
ENDFORM.



lt_test ist meine Interne Tabelle, welche zum Schluss auch ausgegeben wird. Meine RANGE Tabelle lt_rdate zeigt alle Zeitspannen auf, für die die Zugänge und Abgänge ausgerechnet werden sollen. Die erste Spanne die ausgerechnet wird ist immer vom aktuellen Datum bis zum Monatsende, danach wird immer vom ersten bis zum letzten Tag des Monats gerechnet. In meinem Unterprogramm calculate_plumi werden die Zugänge und Abgänge in Abhängigkeit von dtnum und Zeilen von der RANGE Tabelle ausgerechnet.

Danke für eure Hilfe im Voraus :)

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


Re: Abfrage von Daten im Bezug auf RANGES Tabelle

Beitrag von PeterPaletti (Specialist / 348 / 32 / 97 ) »
Wenn ich den Quellcode so überfliege würde ich tippen, dass in deiner Range alle Monats Perioden bis zu P_PDATE versammelt sind. Beim SELECT bekommst du dann alle Einträge zwischen SY-DATUM und dem Monatsletzten deiner letzten Monatsperiode.
Vom Gefühl her würde ich sagen, ist dein Quellcode etwas overdressed, eigentlich müsste ein geschickter JOIN aus der MDKP und MDTB in eine passende interne Tabelle reichen, samt einem LOOP mit Berechnung der Zu- und Abgänge.

Re: Abfrage von Daten im Bezug auf RANGES Tabelle

Beitrag von abap_frischling (ForumUser / 31 / 12 / 0 ) »
Meine Aufgabenstellung ist für jede Periode Zu- und Abgänge auszurechnen. Da hilft mir ein JOIN wenig. Mir gehts nur darum wie ich für eine RANGE-Zeile etwas ausrechnen kann, mit LOOP funktioniert das nicht, weil ich in meiner WHERE Klausel immer ein dat01 IN lt_rdate eintragen muss und hier rechnet er immer für die gesamte Spanne die Zu- und Abgänge aus.

RANGE tab:
INDEX1 sy-datum - 28.02.2022
INDEX2 01.03.2022 - 31.03.2022
INDEX3 01.04.2022 - 30.04.2020

jetzt will ich mit meiner selektierten mkdp-dtnum (=lv_dtnum) für jeden INDEX aus der MDTB alle Zu- und Abgänge berechnen, welche in dieser Zeitspanne liegen. Diese würde ich dann an meine interne Tabelle (lt_test) dranhängen und dann zum nächsten INDEX gehen und so weiter.

Re: Abfrage von Daten im Bezug auf RANGES Tabelle

Beitrag von a-dead-trousers (Top Expert / 4399 / 223 / 1182 ) »
In diesem Fall darfst du nicht mit IN arbeiten sondern musst über die Tabelle lt_rdate loopen und das Feld DAT01 mit BETWEEN ls_rdate-low AND ls_rdate-high abfragen. Natürlich muss das dann auch noch außerhalb beim INSERT INTO lt_test berücksichtigt werden damit du je Periode einen Eintrag in deiner Ergebnistabelle hast.

Aber wie PeterPaletti schon angemerkt hat, wäre es effizienter die Datenbeschaffung mit einer einzigen SELECT-Abfrage zu erledigen und dann im Programm die Gruppierung nach Monaten zu erledigen.

Theoretisch wäre es auch möglich das Ganze in einem einzigen SELECT direkt auf der Datenbank zu ermöglichen, nur weiß ich jetzt leider auf die Schnelle keinen Kniff für eine "Gruppierung nach Monat". Ein GROUP BY mit Teilfeldzugriff DAT01+4(2) ist ja, soweit ich weiß, nicht möglich. Eventuell gibt es aber Funktionen die den Monatsanteil herausrechnen und darauf lässt sich dann Gruppieren. Das würde ich aber bei großen Datenmengen nur einer InMemory Datenbank (HANA) antun wollen.
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: Abfrage von Daten im Bezug auf RANGES Tabelle

Beitrag von a-dead-trousers (Top Expert / 4399 / 223 / 1182 ) »
Mir hat das Ganze mal wieder keine Ruhe gelassen.

Code: Alles auswählen.

SELECT mdkp~matnr, mdkp~plwrk, mdtb~dat01,
  SUM( CASE mdtb~plumi WHEN '+' THEN mdtb~mng01 ELSE 0 END ) AS aquis,
  SUM( CASE mdtb~plumi WHEN '-' THEN mdtb~mng01 ELSE 0 END ) AS requr
  FROM mdkp INNER JOIN mdtb
    ON mdkp~dtnum EQ mdtb~dtnum
  INTO TABLE @DATA(lt_result)
  WHERE mdkp~matnr IN @lt_matnr
    AND mdkp~plwrk IN @lt_werks
    AND mdtb~dat01 IN @lt_rdate
  GROUP BY mdkp~matnr, mdkp~plwrk, mdtb~dat01.
Ohne Garantie auf Funktionalität (hab leider keine Testdaten), solltest du damit, gruppiert nach Material, Werk und Datum die Summe der positiven und negativen Werte herausbekommen.
Was fehlt ist, das Ganze nach Monaten zusammenzufassen.

EDIT:
Die völlig crazy alles-in-eins Variante. Hochgradig spekulativ, aber syntaktisch korrekt (SAP-Basis 7.50):

Code: Alles auswählen.

SELECT mdkp~matnr, mdkp~plwrk, substring( mdtb~dat01, 5, 2 ) AS month,
  SUM( CASE mdtb~plumi WHEN '+' THEN mdtb~mng01 ELSE 0 END ) AS aquis,
  SUM( CASE mdtb~plumi WHEN '-' THEN mdtb~mng01 ELSE 0 END ) AS requr
  FROM mdkp INNER JOIN mdtb
    ON mdkp~dtnum EQ mdtb~dtnum
  WHERE mdkp~matnr IN @lt_matnr
    AND mdkp~plwrk IN @lt_werks
    AND mdtb~dat01 IN @lt_rdate
  GROUP BY mdkp~matnr, mdkp~plwrk, substring( mdtb~dat01, 5, 2 )
  INTO TABLE @DATA(lt_result).
EDIT 2:
Der Index in OpenSQL ist nicht null-terminiert daher im Gegansatz zum Offset in ABAP bei 1 beginnen.

EDIT 3:
Hier noch der Vollständigkeit halber die fehlenden Datendeklarationen:

Code: Alles auswählen.

DATA:
  lt_rdate TYPE RANGE OF d,
  lt_matnr TYPE RANGE OF matnr,
  lt_werks TYPE RANGE OF werks_d.
Zuletzt geändert von a-dead-trousers am 22.02.2022 12:05, insgesamt 3-mal geändert.

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
abap_frischling

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: Abfrage von Daten im Bezug auf RANGES Tabelle

Beitrag von a-dead-trousers (Top Expert / 4399 / 223 / 1182 ) »
Vielleicht sollte der SUBSTRING-Teil besser doch auf

Code: Alles auswählen.

substring( mdtb~dat01, 1, 6 )
lauten, damit man die Berechnung auch über mehrere Jahre hinweg durchführen kann. 😉

EDIT: Auch hier mit Index 1 beginnen
Zuletzt geändert von a-dead-trousers am 22.02.2022 12:02, insgesamt 1-mal geändert.

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
abap_frischling

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: Abfrage von Daten im Bezug auf RANGES Tabelle

Beitrag von black_adept (Top Expert / 4099 / 128 / 941 ) »
Fehlpost
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Abfrage von Daten im Bezug auf RANGES Tabelle

Beitrag von abap_frischling (ForumUser / 31 / 12 / 0 ) »
Ein riesen Dankeschön an alle! Dieses Forum und euch Experten helfen mir wirklich jedes Mal so gut und ich kann soviel lernen daraus, das finde ich wirklich wirklich schön!! :)
Danke an a-dead-trousers, das mit dem BETWEEN hat vollkommen ausgereicht. Aber auch die Mühe mit dem Coding, sehr sehr nett!

Seite 1 von 1

Vergleichbare Themen

2
Antw.
4722
Views
Bezug auf Daten, die nur im Kontext sind
von LGiesken » 24.01.2018 08:17 • Verfasst in Java & SAP®
7
Antw.
4563
Views
Performance beim Löschen in interner Tabelle mit Ranges
von ernst » 12.01.2006 17:50 • Verfasst in ABAP® Core
17
Antw.
5227
Views
Daten einer Tabelle über Daten aus einer internen Tabelle selektieren
von Sonne1234 » 09.12.2019 08:54 • Verfasst in ABAP® für Anfänger
4
Antw.
3317
Views
ALV-liste-Daten mit der DB-Tabelle-Daten vergleichen
von Nadine_2706 » 31.08.2011 11:57 • Verfasst in ABAP® für Anfänger

Ü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
vor einer Stunde von tar 8 / 176
Daten an Tabelle binden
Gestern von Bright4.5 3 / 1488

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
vor einer Stunde von tar 8 / 176
Daten an Tabelle binden
Gestern von Bright4.5 3 / 1488

Unbeantwortete Forenbeiträge

aRFC im OO-Kontext
vor 5 Wochen von ralf.wenzel 1 / 3261
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9822