ein loop

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

Getting started ... Alles für einen gelungenen Start.
35 Beiträge • Seite 1 von 3 (current) Nächste
35 Beiträge Seite 1 von 3 (current) Nächste

ein loop

Beitrag von user2008 (ForumUser / 10 / 10 / 0 ) »
Hallo!
Ich stehe vor meiner Aufgabe seit einem Tag und komme leider nicht weiter.
Ich muss mit nur EINEM Loop die Felder einer Internen Tabelle addieren, wenn zwei Bedingungen erfüllt sind. Ganz genau:
Ich habe eine interne Tabelle:
Matnr Merkm Menge
a x 30
b x 40
a y 50
b x 20
a x 10.

Für die gleichen Matnummer mit gleichen Merkmalen, sollte die Menge addiert werden, Rest bleibt dann so wie er ist. Dafür darf ich nur ein Loop benutzen.
=>
Matnr Merkm Menge
a x 40
a y 50
b x 60.


Danke im Voraus fürs Weiterhelfen!
VG

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


Re: ein loop

Beitrag von black_adept (Top Expert / 4089 / 127 / 940 ) »
Schau dir mal den Befehl "COLLECT" an.
Alternativ könntest du auch "SUM" verwenden - aber wenn man mit Gruppenwechsel arbeiten will muss man vorher das Konzept dahinter und die Vorbedingungen verstanden haben.

Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
user2008

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: ein loop

Beitrag von user2008 (ForumUser / 10 / 10 / 0 ) »
black_adept hat geschrieben:Schau dir mal den Befehl "COLLECT" an.
Alternativ könntest du auch "SUM" verwenden - aber wenn man mit Gruppenwechsel arbeiten will muss man vorher das Konzept dahinter und die Vorbedingungen verstanden haben.
Danke für die schnelle Antwort. Bei mir Matnr und Merkmal nummerisch, wie weiß das System, wann man addieren soll?
Könntest Du vielleicht schreiben, wie Coding aussehen sollte?
Tut mir leid, ich kenne mich schlecht damit aus. Ich habe es früher immer mit zwei mal Loopen gemacht.


Danke!

Re: ein loop

Beitrag von DeathAndPain (Top Expert / 1941 / 257 / 413 ) »
Ich habe es ohne COLLECT gemacht - obwohl richtig ist, dass COLLECT auch ein guter Weg wäre.

Code: Alles auswählen.

*&---------------------------------------------------------------------*
*& Report ZTEST4
*&---------------------------------------------------------------------*
REPORT ZTEST4.

TYPES: BEGIN OF TYPE_T,
         MATNR TYPE C,
         MERKM TYPE C,
         MENGE TYPE I,
       END OF TYPE_T.

DATA: T TYPE STANDARD TABLE OF TYPE_T WITH HEADER LINE,
      RESULT TYPE SORTED TABLE OF TYPE_T WITH UNIQUE KEY MATNR MERKM WITH HEADER LINE.

*** START-OF-SELECTION ***
START-OF-SELECTION.

APPEND VALUE #( MATNR = 'a' MERKM = 'x' MENGE = 30 ) TO T.
APPEND VALUE #( MATNR = 'b' MERKM = 'x' MENGE = 40 ) TO T.
APPEND VALUE #( MATNR = 'a' MERKM = 'y' MENGE = 50 ) TO T.
APPEND VALUE #( MATNR = 'b' MERKM = 'x' MENGE = 20 ) TO T.
APPEND VALUE #( MATNR = 'a' MERKM = 'x' MENGE = 10 ) TO T.

LOOP AT T.
  READ TABLE RESULT WITH KEY MATNR = T-MATNR MERKM = T-MERKM. " automatischer BINARY SEARCH da SORTED TABLE

  CASE SY-SUBRC.
    WHEN 0. " Gibt bereits ein Ergebnis zu dieser Kombination
      ADD T-MENGE TO RESULT-MENGE.
      MODIFY RESULT INDEX SY-TABIX. " SY-TABIX gesetzt durch den READ TABLE
    WHEN OTHERS. " Gibe noch kein Ergebnis zu dieser Kombination; Ergebniszeile erzeugen
      RESULT = T. " Kopfzeilen
      INSERT RESULT INDEX SY-TABIX. " SY-TABIX gesetzt durch den READ TABLE für sortierte Einfügung in die SORTED TABLE
  ENDCASE.
ENDLOOP.

* Hier steht das Ergebnis in der Tabelle RESULT. Der untenstehende LOOP verletzt insofern nicht die Aufgabenbedingung;
* er gibt nur die Tabelle auf dem Bildschirm aus.

LOOP AT RESULT.
  WRITE: / RESULT-MATNR, RESULT-MERKM, RESULT-MENGE.
ENDLOOP.
Bei mir Matnr und Merkmal nummerisch, wie weiß das System, wann man addieren soll?
Na hoffentlich numerisch im Sinne von NUMC und nicht im Sinne von INT (das wäre sonst Pfusch, IMHO). Da NUMC technisch ein Charactertyp ist, wird er bei COLLECT nicht addiert.

Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
user2008


Re: ein loop

Beitrag von user2008 (ForumUser / 10 / 10 / 0 ) »
DeathAndPain hat geschrieben:Ich habe es ohne COLLECT gemacht - obwohl richtig ist, dass COLLECT auch ein guter Weg wäre.

Code: Alles auswählen.

*&---------------------------------------------------------------------*
*& Report ZTEST4
*&---------------------------------------------------------------------*
REPORT ZTEST4.

TYPES: BEGIN OF TYPE_T,
         MATNR TYPE C,
         MERKM TYPE C,
         MENGE TYPE I,
       END OF TYPE_T.

DATA: T TYPE STANDARD TABLE OF TYPE_T WITH HEADER LINE,
      RESULT TYPE SORTED TABLE OF TYPE_T WITH UNIQUE KEY MATNR MERKM WITH HEADER LINE.

*** START-OF-SELECTION ***
START-OF-SELECTION.

APPEND VALUE #( MATNR = 'a' MERKM = 'x' MENGE = 30 ) TO T.
APPEND VALUE #( MATNR = 'b' MERKM = 'x' MENGE = 40 ) TO T.
APPEND VALUE #( MATNR = 'a' MERKM = 'y' MENGE = 50 ) TO T.
APPEND VALUE #( MATNR = 'b' MERKM = 'x' MENGE = 20 ) TO T.
APPEND VALUE #( MATNR = 'a' MERKM = 'x' MENGE = 10 ) TO T.

LOOP AT T.
  READ TABLE RESULT WITH KEY MATNR = T-MATNR MERKM = T-MERKM. " automatischer BINARY SEARCH da SORTED TABLE

  CASE SY-SUBRC.
    WHEN 0. " Gibt bereits ein Ergebnis zu dieser Kombination
      ADD T-MENGE TO RESULT-MENGE.
      MODIFY RESULT INDEX SY-TABIX. " SY-TABIX gesetzt durch den READ TABLE
    WHEN OTHERS. " Gibe noch kein Ergebnis zu dieser Kombination; Ergebniszeile erzeugen
      RESULT = T. " Kopfzeilen
      INSERT RESULT INDEX SY-TABIX. " SY-TABIX gesetzt durch den READ TABLE für sortierte Einfügung in die SORTED TABLE
  ENDCASE.
ENDLOOP.

* Hier steht das Ergebnis in der Tabelle RESULT. Der untenstehende LOOP verletzt insofern nicht die Aufgabenbedingung;
* er gibt nur die Tabelle auf dem Bildschirm aus.

LOOP AT RESULT.
  WRITE: / RESULT-MATNR, RESULT-MERKM, RESULT-MENGE.
ENDLOOP.
Herzlichen Dank!
Du hast Dir so viel Mühe gegeben, danke dafür!! Meine Frage wäre, wenn die Tabelle groß ist und ich die Matnr nicht einzeln abfragen kann (1300 Datensätze hat momentan die Tabelle), gibt es dafür eine alternative Lösung?

Re: ein loop

Beitrag von DeathAndPain (Top Expert / 1941 / 257 / 413 ) »
Wie gesagt, Du kannst es auch mit COLLECT bauen. Aber glaub mir, bei meinem obenstehenden Code lacht sich das System auch noch tot, wenn es 10.000 Einträge sind. Ich habe ja extra auf eine sortierte Tabelle gesetzt, damit der READ TABLE binäroptimiert sucht. Wahrscheinlich könnte man sogar eine HASHED TABLE nehmen (müsste dann aber den Code etwas umbauen, da man dann nicht mehr mit SY-TABIX arbeiten kann).

Die meisten Berater würden das aus Faulheit oder Nachlässigkeit mit einer Standardtabelle ohne Suchoptimierung coden und würde im praktischen Betrieb in aller Regel trotzdem keiner merken (auch wenn mir sowas sehr unsympathisch ist).

Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
user2008


Re: ein loop

Beitrag von user2008 (ForumUser / 10 / 10 / 0 ) »
DeathAndPain hat geschrieben:Wie gesagt, Du kannst es auch mit COLLECT bauen. Aber glaub mir, bei meinem obenstehenden Code lacht sich das System auch noch tot, wenn es 10.000 Einträge sind. Ich habe ja extra auf eine sortierte Tabelle gesetzt, damit der READ TABLE binäroptimiert sucht. Wahrscheinlich könnte man sogar eine HASHED TABLE nehmen (müsste dann aber den Code etwas umbauen, da man dann nicht mehr mit SY-TABIX arbeiten kann).

Die meisten Berater würden das aus Faulheit oder Nachlässigkeit mit einer Standardtabelle ohne Suchoptimierung coden und würde im praktischen Betrieb in aller Regel trotzdem keiner merken (auch wenn mir sowas sehr unsympathisch ist).
Danke Dir! Es freut mich sehr, dass hier so gute Mitglieder wie Du sind!
Meine Tabelle ist ohne Kopfzeile, ist das auch entscheidend?
Es wäre vielleicht Frechheit von mir bei Dir zu fragen, aber wenn Du Zeit hättest, könntest Du mir noch Coding von Collect schreiben? Damit ich noch was dazu lernen kann.

Einen schönen Tag für Dich! Und Entschuldige meine Aufdringlichkeit =-)

Re: ein loop

Beitrag von DeathAndPain (Top Expert / 1941 / 257 / 413 ) »
Danke Dir! Es freut mich sehr, dass hier so gute Mitglieder wie Du sind!
Gern geschehen. Solch Aufgabe macht mir auch Spaß, besonders weil ich halt versuche, sie nicht nur zu erfüllen, sondern noch eine Goldkante dranzuschneidern.
Meine Tabelle ist ohne Kopfzeile, ist das auch entscheidend?
Nein. Kopfzeilen gelten als veraltet, aber ich finde sie extrem nützlich. Das ist ein Glaubenskrieg, der auch mit der EInführung von ABAP Objects zu tun hat. Ohne Kopfzeile wird der Code halt länger, weil man die Arbeitszeile explizit hinschreiben muss. Die offizielle Begründung ist, dass so besser verständlich sei, was eine Tabelle und was eine Feldleiste ist, aber ich persönlich halte dieses Argument für vorgeschoben, da ich Kopfzeilen vom Kontext her wunderbar verständlich finde und ABAP Objects dem Programmierer an anderer Stelle abstraktes Denken in einer Größenordnung abverlangt, an die zu den Glanzzeiten der Kopfzeilen (Release 3.x) nicht zu denken war.

Für die Performance ist es egal.
Es wäre vielleicht Frechheit von mir bei Dir zu fragen, aber wenn Du Zeit hättest, könntest Du mir noch Coding von Collect schreiben? Damit ich noch was dazu lernen kann.
Tatsächlich muss ich einräumen, dass COLLECT der wesentlich einfacherer Ansatz ist. Ich habe halt nicht dran gedacht, da ich ewig nicht mehr damit gearbeitet habe, aber letztlich muss ich zugeben, dass mein Code nur nachprogrammiert, was COLLECT von Hause aus macht.

An Deine Adresse muss hier allerdings auch ein Faulheitsvorwurf gehen, denn ich habe mir gerade mal die F1-Hilfe von COLLECT durchgelesen. Das Beispielprogrämmchen, das da unten drin steht, ist im Prinzip schon die Lösung Deiner Programmieraufgabe.

Aber so sei es denn, hier mein Code, umgebaut auf COLLECT. Und aus der F1-Hilfe habe ich mir die Idee geklaut, für das Ergebnis auch gleich eine HASHED TABLE zu nehmen. Macht vermutlich auch den COLLECT effizienter.

Code: Alles auswählen.

*&---------------------------------------------------------------------*
*& Report ZTEST4
*&---------------------------------------------------------------------*
REPORT ZTEST4.

TYPES: BEGIN OF TYPE_T,
         MATNR TYPE C,
         MERKM TYPE C,
         MENGE TYPE I,
       END OF TYPE_T.

DATA: T TYPE STANDARD TABLE OF TYPE_T WITH HEADER LINE,
      RESULT TYPE HASHED TABLE OF TYPE_T WITH UNIQUE KEY MATNR MERKM WITH HEADER LINE.

*** START-OF-SELECTION ***
START-OF-SELECTION.

APPEND VALUE #( MATNR = 'a' MERKM = 'x' MENGE = 30 ) TO T.
APPEND VALUE #( MATNR = 'b' MERKM = 'x' MENGE = 40 ) TO T.
APPEND VALUE #( MATNR = 'a' MERKM = 'y' MENGE = 50 ) TO T.
APPEND VALUE #( MATNR = 'b' MERKM = 'x' MENGE = 20 ) TO T.
APPEND VALUE #( MATNR = 'a' MERKM = 'x' MENGE = 10 ) TO T.

LOOP AT T.
  COLLECT T INTO RESULT.
ENDLOOP.

* Hier steht das Ergebnis in der Tabelle RESULT. Der untenstehende LOOP verletzt insofern nicht die Aufgabenbedingung;
* er gibt nur die Tabelle auf dem Bildschirm aus.

LOOP AT RESULT.
  WRITE: / RESULT-MATNR, RESULT-MERKM, RESULT-MENGE.
ENDLOOP.

Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
user2008


Re: ein loop

Beitrag von user2008 (ForumUser / 10 / 10 / 0 ) »
DeathAndPain hat geschrieben:
Danke Dir! Es freut mich sehr, dass hier so gute Mitglieder wie Du sind!
Gern geschehen. Solch Aufgabe macht mir auch Spaß, besonders weil ich halt versuche, sie nicht nur zu erfüllen, sondern noch eine Goldkante dranzuschneidern.
Meine Tabelle ist ohne Kopfzeile, ist das auch entscheidend?
Nein. Kopfzeilen gelten als veraltet, aber ich finde sie extrem nützlich. Das ist ein Glaubenskrieg, der auch mit der EInführung von ABAP Objects zu tun hat. Ohne Kopfzeile wird der Code halt länger, weil man die Arbeitszeile explizit hinschreiben muss. Die offizielle Begründung ist, dass so besser verständlich sei, was eine Tabelle und was eine Feldleiste ist, aber ich persönlich halte dieses Argument für vorgeschoben, da ich Kopfzeilen vom Kontext her wunderbar verständlich finde und ABAP Objects dem Programmierer an anderer Stelle abstraktes Denken in einer Größenordnung abverlangt, an die zu den Glanzzeiten der Kopfzeilen (Release 3.x) nicht zu denken war.

Für die Performance ist es egal.
Es wäre vielleicht Frechheit von mir bei Dir zu fragen, aber wenn Du Zeit hättest, könntest Du mir noch Coding von Collect schreiben? Damit ich noch was dazu lernen kann.
Tatsächlich muss ich einräumen, dass COLLECT der wesentlich einfacherer Ansatz ist. Ich habe halt nicht dran gedacht, da ich ewig nicht mehr damit gearbeitet habe, aber letztlich muss ich zugeben, dass mein Code nur nachprogrammiert, was COLLECT von Hause aus macht.

An Deine Adresse muss hier allerdings auch ein Faulheitsvorwurf gehen, denn ich habe mir gerade mal die F1-Hilfe von COLLECT durchgelesen. Das Beispielprogrämmchen, das da unten drin steht, ist im Prinzip schon die Lösung Deiner Programmieraufgabe.

Aber so sei es denn, hier mein Code, umgebaut auf COLLECT. Und aus der F1-Hilfe habe ich mir die Idee geklaut, für das Ergebnis auch gleich eine HASHED TABLE zu nehmen. Macht vermutlich auch den COLLECT effizienter.

Code: Alles auswählen.

*&---------------------------------------------------------------------*
*& Report ZTEST4
*&---------------------------------------------------------------------*
REPORT ZTEST4.

TYPES: BEGIN OF TYPE_T,
         MATNR TYPE C,
         MERKM TYPE C,
         MENGE TYPE I,
       END OF TYPE_T.

DATA: T TYPE STANDARD TABLE OF TYPE_T WITH HEADER LINE,
      RESULT TYPE HASHED TABLE OF TYPE_T WITH UNIQUE KEY MATNR MERKM WITH HEADER LINE.

*** START-OF-SELECTION ***
START-OF-SELECTION.

APPEND VALUE #( MATNR = 'a' MERKM = 'x' MENGE = 30 ) TO T.
APPEND VALUE #( MATNR = 'b' MERKM = 'x' MENGE = 40 ) TO T.
APPEND VALUE #( MATNR = 'a' MERKM = 'y' MENGE = 50 ) TO T.
APPEND VALUE #( MATNR = 'b' MERKM = 'x' MENGE = 20 ) TO T.
APPEND VALUE #( MATNR = 'a' MERKM = 'x' MENGE = 10 ) TO T.

LOOP AT T.
  COLLECT T INTO RESULT.
ENDLOOP.

* Hier steht das Ergebnis in der Tabelle RESULT. Der untenstehende LOOP verletzt insofern nicht die Aufgabenbedingung;
* er gibt nur die Tabelle auf dem Bildschirm aus.

LOOP AT RESULT.
  WRITE: / RESULT-MATNR, RESULT-MERKM, RESULT-MENGE.
ENDLOOP.

Danke, dass Du mir auch die erste Lösung gezeigt hast. Es bringt mich auch in anderen Aufgaben weiter.
Ich wünsche Dir alles Liebe und einen schönen Tag!
Bei nächstem Problem melde ich mich bei Dir wieder, da deine Antworte ausführlich und verständlich sind! =)

Re: ein loop

Beitrag von MrBojangles (Specialist / 367 / 3 / 30 ) »
Hallo zusammen,
vielleicht noch der Vollständigkeit halber das Ganze mit den Gruppenwechsel-Funktionen, die ABAP bietet. Dann hast Du ein Füllhorn an Lösungen...;.)

Code: Alles auswählen.

REPORT ztest.

TYPES: BEGIN OF type_t,
         matnr TYPE c,
         merkm TYPE c,
         menge TYPE i,
       END OF type_t.

DATA: t TYPE STANDARD TABLE OF type_t.
DATA: wa_t TYPE type_t.

START-OF-SELECTION.

  APPEND VALUE #( matnr = 'a' merkm = 'x' menge = 30 ) TO t.
  APPEND VALUE #( matnr = 'b' merkm = 'x' menge = 40 ) TO t.
  APPEND VALUE #( matnr = 'a' merkm = 'y' menge = 50 ) TO t.
  APPEND VALUE #( matnr = 'b' merkm = 'x' menge = 20 ) TO t.
  APPEND VALUE #( matnr = 'a' merkm = 'x' menge = 10 ) TO t.

  SORT t.

  LOOP AT t INTO wa_t.

    FORMAT INTENSIFIED OFF.
    WRITE: / wa_t-matnr, wa_t-merkm, wa_t-menge.
    AT END OF merkm.
      "Gruppenwechsel:
      "hier geht er rein, wenn sich der Inhalt des angegeben Feldes ODER(!)
      "eines Felds links davon (also im vorliegenden Fall MATNR) ändert
      "heisst hier konkret: ändert sich MATNR und/oder MERKM liegt ein Gruppenwechsel vor.
      SUM.
      "SUM stellt die Gruppensumme aller (echt) numerisch deklarierten
      "Felder in den Feldern selbst bereit...
      "d.h. in WA_T-MENGE steht nun die Gruppensumme aller MENGEn.
      FORMAT INTENSIFIED ON.
      WRITE: / 'SUM', wa_t-menge UNDER wa_t-menge.
    ENDAT.

  ENDLOOP.
Ausgabe:

Code: Alles auswählen.

Programm ZTEST
-----------------------------
a x         30
a x         10
SUM         40
a y         50
SUM         50
b x         40
b x         20
SUM         60

Folgende Benutzer bedankten sich beim Autor MrBojangles für den Beitrag:
user2008

Weiterhin viel Freude mit SAP...
Cheers
MrB.

Re: ein loop

Beitrag von user2008 (ForumUser / 10 / 10 / 0 ) »
MrBojangles hat geschrieben:Hallo zusammen,
vielleicht noch der Vollständigkeit halber das Ganze mit den Gruppenwechsel-Funktionen, die ABAP bietet. Dann hast Du ein Füllhorn an Lösungen...;.)

Code: Alles auswählen.

REPORT ztest.

TYPES: BEGIN OF type_t,
         matnr TYPE c,
         merkm TYPE c,
         menge TYPE i,
       END OF type_t.

DATA: t TYPE STANDARD TABLE OF type_t.
DATA: wa_t TYPE type_t.

START-OF-SELECTION.

  APPEND VALUE #( matnr = 'a' merkm = 'x' menge = 30 ) TO t.
  APPEND VALUE #( matnr = 'b' merkm = 'x' menge = 40 ) TO t.
  APPEND VALUE #( matnr = 'a' merkm = 'y' menge = 50 ) TO t.
  APPEND VALUE #( matnr = 'b' merkm = 'x' menge = 20 ) TO t.
  APPEND VALUE #( matnr = 'a' merkm = 'x' menge = 10 ) TO t.

  SORT t.

  LOOP AT t INTO wa_t.

    FORMAT INTENSIFIED OFF.
    WRITE: / wa_t-matnr, wa_t-merkm, wa_t-menge.
    AT END OF merkm.
      "Gruppenwechsel:
      "hier geht er rein, wenn sich der Inhalt des angegeben Feldes ODER(!)
      "eines Felds links davon (also im vorliegenden Fall MATNR) ändert
      "heisst hier konkret: ändert sich MATNR und/oder MERKM liegt ein Gruppenwechsel vor.
      SUM.
      "SUM stellt die Gruppensumme aller (echt) numerisch deklarierten
      "Felder in den Feldern selbst bereit...
      "d.h. in WA_T-MENGE steht nun die Gruppensumme aller MENGEn.
      FORMAT INTENSIFIED ON.
      WRITE: / 'SUM', wa_t-menge UNDER wa_t-menge.
    ENDAT.

  ENDLOOP.
Ausgabe:

Code: Alles auswählen.

Programm ZTEST
-----------------------------
a x         30
a x         10
SUM         40
a y         50
SUM         50
b x         40
b x         20
SUM         60

Vielen Dank für deine Lösung!

Re: ein loop

Beitrag von a-dead-trousers (Top Expert / 4395 / 223 / 1182 ) »
DeathAndPain hat geschrieben:Kopfzeilen gelten als veraltet, aber ich finde sie extrem nützlich. Das ist ein Glaubenskrieg, der auch mit der EInführung von ABAP Objects zu tun hat. Ohne Kopfzeile wird der Code halt länger, weil man die Arbeitszeile explizit hinschreiben muss. Die offizielle Begründung ist, dass so besser verständlich sei, was eine Tabelle und was eine Feldleiste ist, aber ich persönlich halte dieses Argument für vorgeschoben, da ich Kopfzeilen vom Kontext her wunderbar verständlich finde und ABAP Objects dem Programmierer an anderer Stelle abstraktes Denken in einer Größenordnung abverlangt, an die zu den Glanzzeiten der Kopfzeilen (Release 3.x) nicht zu denken war.

Für die Performance ist es egal.
Sorry, aber vorallem den letzten Satz kann ich so nicht unkommentiert stehen lassen:
Beim Arbeiten mit Kopfzeilen, werden die Inhalte von der Tabelle in die Kopzeile KOPIERT. Genau gleich wie bei einer WORKAREA (Feldleiste). Diese Art des Zugriffs hat somit die SCHLECHTESTE Performance. Das beste Ergebnis erreicht man mit FIELD-SYMBOLS und das sowohl bei einem rein lesenden Zugriff als auch bei einem schreibenden. Von der Theorie her sollten REFERENZEN gleich schnell arbeiten, sind aber um eine Tick langsamer als die Field-Symbols.

lg ADT
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: ein loop

Beitrag von black_adept (Top Expert / 4089 / 127 / 940 ) »
a-dead-trousers hat geschrieben:
DeathAndPain hat geschrieben:...
Für die Performance ist es egal.
Sorry, aber vorallem den letzten Satz kann ich so nicht unkommentiert stehen lassen:
Beim Arbeiten mit Kopfzeilen, werden die Inhalte von der Tabelle in die Kopzeile KOPIERT. Genau gleich wie bei einer WORKAREA (Feldleiste). Diese Art des Zugriffs hat somit die SCHLECHTESTE Performance. Das beste Ergebnis erreicht man mit FIELD-SYMBOLS und das sowohl bei einem rein lesenden Zugriff als auch bei einem schreibenden. Von der Theorie her sollten REFERENZEN gleich schnell arbeiten, sind aber um eine Tick langsamer als die Field-Symbols.

lg ADT
@adt: Wie viele Programme mit Laufzeitproblemen hast du denn schon gesehen, bei denen ein Wechsel zu Feldsymbolen oder Referenzen die Laufzeit auf erträgliche Zeiten gedrückt hätte?

Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
DeathAndPain

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: ein loop

Beitrag von Dele (Specialist / 307 / 4 / 47 ) »
Wie viele Programme mit Laufzeitproblemen hast du denn schon gesehen, bei denen ein Wechsel zu Feldsymbolen oder Referenzen die Laufzeit auf erträgliche Zeiten gedrückt hätte?
@black_adept: Denke global, handle lokal.

Bei dem Thema Performance geht es nicht nur um die Laufzeit eines einzelnen Programms, sondern um die Gesamtbelastung eines Systems. Jeder Programmierer muss Aufwand und Ertrag abwägen. Am ehesten kann man die Sinnhaftigkeit von Optimierungen mit der ST03 erkennen, in dem man nach Gesamtverarbeitungszeit absteigend sortiert.
Wir haben vor ein paar Monaten eine Eigenentwicklung getunt. Vorherige durchschnittliche Antwortzeit 510 Millisekunden, was ja eigentlich schon sehr gut ist. Danach 430 Millisekunden. Das hat kein Anwender bemerkt. Aber: die Anwendung hat pro Tag ca.230.000 Dialogschritte.
Ersparnis: ca. 18.400.000 Millisekunden = 18.400 Sekunden = 306 Minuten = 5,11 Stunden

Re: ein loop

Beitrag von Haubi (Expert / 625 / 20 / 30 ) »
black_adept hat geschrieben:
a-dead-trousers hat geschrieben:
DeathAndPain hat geschrieben:...
Für die Performance ist es egal.
Sorry, aber vorallem den letzten Satz kann ich so nicht unkommentiert stehen lassen:
Beim Arbeiten mit Kopfzeilen, werden die Inhalte von der Tabelle in die Kopzeile KOPIERT. Genau gleich wie bei einer WORKAREA (Feldleiste). Diese Art des Zugriffs hat somit die SCHLECHTESTE Performance. Das beste Ergebnis erreicht man mit FIELD-SYMBOLS und das sowohl bei einem rein lesenden Zugriff als auch bei einem schreibenden. Von der Theorie her sollten REFERENZEN gleich schnell arbeiten, sind aber um eine Tick langsamer als die Field-Symbols.

lg ADT
@adt: Wie viele Programme mit Laufzeitproblemen hast du denn schon gesehen, bei denen ein Wechsel zu Feldsymbolen oder Referenzen die Laufzeit auf erträgliche Zeiten gedrückt hätte?
Naja, die gibt es schon, allerdings sind das dann Programme, bei denen die Tabelle via Feldsymbol geändert wird. Da ist der Vorteil gegenüber einer Feldleiste und MODIFY erheblich.

Allerdings gibt es noch einen anderen Haken: bei der ersten Verwendung ist der Zugriff via Feldsymbol extrem langsam (ich vermute, weil da irgendwas initialisiert werden muss). D.h. dass für "schmale" ITabs mit wenigen Einträgen der reine Lesezugriff deutlich schneller mit Feldleisten realisiert werden kann.

Bei meinem Testprogramm (s.u.) kommt der Break-Even bei ca. 1.000 Einträgen in der ITab... :wink:

Grüße,
Haubi

Code: Alles auswählen.

REPORT.

PARAMETERS:
  p_times TYPE i.

DATA:
  gt_test TYPE TABLE OF i.

START-OF-SELECTION.

  DO p_times TIMES.
    APPEND sy-index TO gt_test.
  ENDDO.

  GET RUN TIME FIELD DATA(i1).
  LOOP AT gt_test ASSIGNING FIELD-SYMBOL(<gs_test>).

  ENDLOOP.
  GET RUN TIME FIELD DATA(i2).
  i2 = i2 - i1.
  WRITE: / 'FS:', i2.

  GET RUN TIME FIELD i1.
  LOOP AT gt_test INTO DATA(gs_test).

  ENDLOOP.
  GET RUN TIME FIELD i2.
  i2 = i2 - i1.
  WRITE: / 'Struc:', i2.
Das ABAP Kochbuch ab sofort bei Amazon...

I'd rather write code that writes code than write code...

Vergleichbare Themen

1
Antw.
1454
Views
4
Antw.
3769
Views
LOOP in einem LOOP
von Bjuti » 10.09.2013 15:18 • Verfasst in ABAP® für Anfänger
39
Antw.
7986
Views
Loop
von Kai999 » 27.07.2017 16:15 • Verfasst in ABAP® für Anfänger
52
Antw.
10174
Views
LOOP AT
von cuncon » 01.02.2018 09:28 • Verfasst in ABAP® für Anfänger
7
Antw.
2464
Views
Loop-Problem
von TobiB » 17.12.2007 13:15 • Verfasst in ABAP® Core

Ü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

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 / 2405
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 8995