Verbesserungsvorschläge?

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

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
10 Beiträge • Seite 1 von 1
10 Beiträge Seite 1 von 1

Verbesserungsvorschläge?

Beitrag von Thomas17 (Specialist / 157 / 17 / 14 ) »
Hallo Zusammen,

was meint Ihr? Was könnte ich hier performanter/eleganter lösen?
Hätter gerne sämtliche Lieferungen / Versandstelle, die noch nicht kommissioniert wurden (WM)
in einer Tabelle, damit ich diese wiederum in einem ALV zur weiteren Bearbeitung verwenden kann.

Code: Alles auswählen.

FORM get_lieferdaten_wm TABLES it_del STRUCTURE zwm_s_ta001
                           "    ir_datum
                         USING iv_vstel.

  TYPES: BEGIN OF lty_likp,
         vbeln TYPE vbeln_vl,
         lprio   TYPE lprio,
         vsbed TYPE vsbed.
  TYPES: END OF lty_likp.

  DATA: ls_del   TYPE zwm_s_ta001,
        lt_likp  TYPE TABLE OF lty_likp,
        ls_likp  TYPE lty_likp.

  FIELD-SYMBOLS: <ls_del> TYPE zwm_s_ta001.

  SELECT * FROM shp_idx_pick
    INTO CORRESPONDING FIELDS OF TABLE it_del
      WHERE vstel = iv_vstel
        AND lvstk <> ' '.

  "Lieferdaten anreichern
  CHECK LINES( it_del ) > 0.

  SELECT vbeln lprio vsbed INTO TABLE lt_likp
    FROM likp
     FOR ALL ENTRIES IN it_del
      WHERE vbeln = it_del-vbeln.

  "Daten abmischen
  LOOP AT it_del ASSIGNING <ls_del>.
    "Anzahl Positionen ermitteln:
    SELECT COUNT(*) FROM lips
      WHERE vbeln = <ls_del>-vbeln.

    <ls_del>-anzpo =   sy-dbcnt.

    "Zusatzdaten übergeben
    READ TABLE lt_likp INTO ls_likp WITH KEY vbeln = <ls_del>-vbeln.
    IF sy-subrc = 0.
      <ls_del>-lprio = ls_likp-lprio.
      <ls_del>-vsbed = ls_likp-vsbed.
      DELETE lt_likp INDEX sy-index.
    ENDIF.
  ENDLOOP.
ENDFORM.  
zwm_s_ta001 = struktur mit .include shp_idx_pick, sowie lprio,vsbed und anzpo

Grüße

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


Re: Verbesserungsvorschläge?

Beitrag von JHM (Top Expert / 1225 / 2 / 204 ) »
Thomas17 hat geschrieben:was meint Ihr? Was könnte ich hier performanter/eleganter lösen?

Code: Alles auswählen.

FORM get_lieferdaten_wm TABLES it_del STRUCTURE zwm_s_ta001
                           "    ir_datum
                         USING iv_vstel.

  SELECT shp_idx_pick~vbeln
         shp_idx_pick~vstel
         shp_idx_pick~kodat
         shp_idx_pick~route
         shp_idx_pick~lvstk
         shp_idx_pick~kostk
         shp_idx_pick~kunnr

         likp~lprio
         likp~vsbed

         COUNT( DISTINCT lips~posnr )
    INTO TABLE gt_data
    FROM shp_idx_pick
    JOIN likp
      ON likp~vbeln = shp_idx_pick~vbeln
    JOIN lips
      ON lips~vbeln = shp_idx_pick~vbeln
    WHERE shp_idx_pick~vstel = iv_vstel
     AND lvstk <> ' '
   GROUP BY shp_idx_pick~vbeln
            shp_idx_pick~vstel
            shp_idx_pick~kodat
            shp_idx_pick~route
            shp_idx_pick~lvstk
            shp_idx_pick~kostk
            shp_idx_pick~kunnr
            likp~lprio
            likp~vsbed.
ENDFORM.  
Verlagert die Last auf die DB. Wenn die nicht zu schwach ist, geht es meist schneller, als in mehreren DB-Zugriffen die Daten abzugreifen und dann im ABAP abzumischen.
Zuletzt geändert von JHM am 03.09.2014 14:21, insgesamt 1-mal geändert.

Folgende Benutzer bedankten sich beim Autor JHM für den Beitrag:
Thomas17

Gruß Hendrik

Re: Verbesserungsvorschläge?

Beitrag von JHM (Top Expert / 1225 / 2 / 204 ) »
doppel Post
Gruß Hendrik

Re: Verbesserungsvorschläge?

Beitrag von Thomas17 (Specialist / 157 / 17 / 14 ) »
Hi Hendrik,

danke für Deine Antwort.

Ich habe bis jetzt immer die Erfahrung bei großen Datenmengen gemacht,
dass Joins mich mehr Zeit/Performance kosten, im Vergleich zu 1mal Daten
einlesen und dann abzuarbeiten.
D.h. das ist generell von der DB abhängig und Du empfiehlst bei schnellen
DB's einen komplexeren Join?

Warum Groupst Du bei so vielen Argumenten und nicht nur bei VBELN?
Grüße

Re: Verbesserungsvorschläge?

Beitrag von JHM (Top Expert / 1225 / 2 / 204 ) »
Thomas17 hat geschrieben:Ich habe bis jetzt immer die Erfahrung bei großen Datenmengen gemacht,
dass Joins mich mehr Zeit/Performance kosten, im Vergleich zu 1mal Daten
einlesen und dann abzuarbeiten.
D.h. das ist generell von der DB abhängig und Du empfiehlst bei schnellen
DB's einen komplexeren Join?
Jein, kommt immer drauf an was genau gelesen werden soll.
Join nur, wenn der Join über Tabellenkey möglich ist, die Tabellen nicht gepuffert sind (Join und Pufferzugriff geht nicht) und sich so entweder die Anzahl der Zugriffe oder die Menge der zu lesenden Daten eingrenzen lässt.

Die DB-Zugriffe bei deiner Lösung hängen von der Anzahl gelesener Lieferungen ab. Sind es nur 100, dann mag es ohne Join schneller sein, sind es 100.000 sollte der Join schneller sein.
Thomas17 hat geschrieben: Warum Groupst Du bei so vielen Argumenten und nicht nur bei VBELN?
Wegen dem Syntaxcheck ;-) Bei Aggregationen müssen alle Felder die nicht aggregiert werden mit in die GROUP BY.
Gruß Hendrik

Re: Verbesserungsvorschläge?

Beitrag von Thomas17 (Specialist / 157 / 17 / 14 ) »
Als was hast Du gt_data deklariert?

Bei mir meckerts: Als Arbeitsbereich ist eine interne Tabelle nicht erlaubt.

Re: Verbesserungsvorschläge?

Beitrag von JHM (Top Expert / 1225 / 2 / 204 ) »
Thomas17 hat geschrieben:Bei mir meckerts: Als Arbeitsbereich ist eine interne Tabelle nicht erlaubt.
INTO TABLE gt_data beim Select?
Gruß Hendrik

Re: Verbesserungsvorschläge?

Beitrag von Thomas17 (Specialist / 157 / 17 / 14 ) »
Moin,

bei nur "INTO Table" bekomme ich Dumps.
Mit
"INTO CORRESPONDING FIELDS OF TABLE"
funktioniert es.

Leider bleibt die Anzahl der Positionen leer.
Hier müsste doch irgendwo noch eine Zuweisung hin,
in welches Feld er die Anzahl übergeben soll.
Oder sehe ich das falsch?
Into kann ich ja nur einmal angeben. Daher bin ich mir
grad ned so sicher, wie das funktionieren soll.
POSNR gibt es in meiner Struktur nicht, habs mal ergänzt,
bleibt trotzdem leer.

Grüße

Re: Verbesserungsvorschläge?

Beitrag von a-dead-trousers (Top Expert / 4485 / 231 / 1205 ) »
Hi!

Gib in deinem Select-Statement dem COUNT einen Alias der dem Feldnamen in deiner Tabelle GT_DATA entspricht wo das Ergebnis rein soll.

Code: Alles auswählen.

COUNT( DISTINCT lips~posnr ) AS posnr.
Dann klappts auch mit dem INTO CORRESPONDING.

lg ADT

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

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: Verbesserungsvorschläge?

Beitrag von Thomas17 (Specialist / 157 / 17 / 14 ) »
:up:

Awesome! Hab zwar in der Hilfe nachgeschaut aber auf AS bin ich nicht gekommen.
Hab bisher nicht so viel mit komplexen SQL-Statements gemacht.
Danke für Deine Geduld. ;)

Wieder was dazugelernt. Merci!
Schönen Tag noch!

Seite 1 von 1

Ü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

SAPGui 8.10
vor 21 Stunden von DeathAndPain 5 / 673

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.