Einfacher (?) Gruppenwechsel, ich stecke fest.

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

Einfacher (?) Gruppenwechsel, ich stecke fest.

Beitrag von Michael.Nett (ForumUser / 17 / 0 / 0 ) »
Hallo Community,

ich stecke derzeit in einem (evtl. einfachen) Gruppenwechsel fest. Ich hab auch bereits hier im Forum gesucht, leider bekomm ich die geannten Beispiele nicht umgebogen.

Die Befehle AT und ON sind mir sicherlich ein Begriff, aber die bringen mich nur bedingt weiter. Ich möchte also gerne einen Gruppenwechsel über eigene Kennzeichen realisieren.

Es geht mir nur um den Gruppenwechsel, es sollen danach auch bestimmte Werte addiert werden, aber das sollte jetzt erstmal keine Rolle spielen.

Ich habe mittels "SORT" meine interne Tabelle nach Land und Materialnummer sortiert.

Jetzt möchte ich gerne bei einem Länderwechsel und im selben Land die Materialnummer gruppieren.

Ich möchte also zum Schluß eine Liste habe die folgendermaßen aussieht:

Bild

Hab natürlich auch ein wenig Code geschrieben, der auch nur bedingt funktioniert, aber vielleicht kann mir aber jemand einen Tipp geben, wo ich einen Denkfehler habe.

Der Code steht innerhalb einen LOOP - ENDLOOP.
tmpRegion, tmpMatNr und tmpMaxWert sind meine Hilfskennzeichen.

Code: Alles auswählen.

    IF tmpRegion NE wa_vbrk-land1.
      tmpRegion = wa_vbrk-land1.
      WRITE: / wa_vbrk-land1.

      IF NOT tmpMatNr IS INITIAL.
        tmpMatNr = '*****'.                   "Wert ungültig machen

        IF tmpMatNr NE wa_vbrk-matnr.
          WRITE: /  wa_vbrk-matnr.
          IF NOT tmpMaxWert IS INITIAL.
            tmpMaxWert = '0.00'.              "Wert ungültig machen
            tmpMatNr = wa_vbrk-matnr.

            IF tmpMaxWert LT varEinzelpreis.
             tmpMaxWert = varEinzelpreis.
            ENDIF.

          ELSE.
            tmpMaxWert = varEinzelpreis.
          ENDIF.

        ENDIF.

      ELSE.
        tmpMatNr = wa_vbrk-matnr.
        WRITE: / wa_vbrk-matnr.
      ENDIF.

    ELSE.
    ENDIF.
Ich muss mich vielleicht jetzt schon für mein grausiges Coding entschuldigen, bin aber im Selbststudium und noch ziemlich am Anfang.

Mit freundlichem Gruß

Michael
"3 Haie? Das macht 4810 Zähne!" (Findet Nemo)

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


Re: Einfacher (?) Gruppenwechsel, ich stecke fest.

Beitrag von Andreas G (Specialist / 175 / 0 / 0 ) »
Michael.Nett hat geschrieben:Ich muss mich vielleicht jetzt schon für mein grausiges Coding entschuldigen, bin aber im Selbststudium und noch ziemlich am Anfang.
Mit freundlichem Gruß
Michael
Hallo Mike.

Ich glaube mit dem Befehl AT bist du vielleicht doch besser beraten!?
Das einzige worauf du achten musst ist, dass du die Werte die du ausgeben willst, vor dem AT speichern musst. Da diese eventuell nicht mehr verfügbar sind.

Code: Alles auswählen.

l_matnr = wa_vbrk-matnr 
AT new wa_vbrk-land
... hier ist wa_vbrk-matnr = *********
write l_matnr.
... drum vorher speichern
...
ENDAT.
Alles was rechts von der Spalte land steht ist bei Gruppenwechsel mit AT nicht mehr verfügbar.
Wenn du genaueres über 'AT' wissen willst => SAP - Hilfe(F1) AT(Gruppenwechsel)
:wink:
mfg Andi
Hauptsoch: HAUPTSOCH!

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
dazu noch ein kleiner Tipp:
wenn man den LOOP mit ASSIGNING <fs> benutzt, hat man alle Felder im Zugriff, weil das FS ja direkt auf die Tabellenzeile verweist.
Das heißt im Besonderen, dass dann keines der Felder mit '*..*' maskiert ist!

Code: Alles auswählen.

LOOP AT itab ASSIGNING <wa_itab>.
  AT NEW land.
* in <wa_itab>-matnr steht die Materialnummer zur Verfügung
  ENDAT.
ENDLOOP.
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von Asaph (Expert / 580 / 6 / 1 ) »
Hallo Michael,

versuch's mal so
(sortiere deine Tab. nach Land und Artikel)

Code: Alles auswählen.

SORT itab BY land1 matnr.
LOOP AT itab.
*GW Land
  AT NEW land1.
    WRITE: / itab-land1.
    ULINE.
  ENDAT.

*GW Artikel-Nr.
  AT NEW matnr.
    WRITE: / itab-matnr.
  ENDAT.

  WRITE: / itab-ebeln, itab-menge, itab-netpr.

*Summe pro Artikel
  AT END OF matnr.
    SUM.
    WRITE : / '*' , itab-menge UNDER itab-menge.
  ENDAT.
  ...
ENDLOOP.

Andreas

Beitrag von black_adept (Top Expert / 3944 / 105 / 886 ) »
Weiterer Tipp:

Wenn man nicht mit "ASSIGNING" arbeiten kann ( etwa weil man "SUM" benutzen möchte ) geht auch folgendes Konstrukt

Code: Alles auswählen.

LOOP AT itab INTO wa.
  wa_save = wa.
  AT NEW ...
...
  ENDAT
...
ENDLOOP.
Ich dachte früher immer, dass "AT FIRST" am Anfang der üblichen Schleifenverarbeitung stehen muss , vor den "AT NEW ..."-Zeitpunkten. Dem ist aber nicht so, auch wenn alle Demobeispiele so aussehen.

Auszug Sap-Bibliothek http://help.sap.com/saphelp_46c/helpdat ... ameset.htm
LOOP AT <itab>.
AT FIRST.... ENDAT.
AT NEW <f1>....... ENDAT.
AT NEW <f2>....... ENDAT.
.......
<Einzelsatzverarbeitung>
.......
AT END OF <f2>.... ENDAT.
AT END OF <f1>.... ENDAT.
AT LAST..... ENDAT.
ENDLOOP.
Es ist z.B. durchaus möglich in einem Loop vor "AT FIRST" ABAP-Befehle einzubauen ( die Sternchen der Workarea werden erst bei Eintritt in AT FIRST gefüllt - vorher ist die Workarea vollständig) oder auch hinter "AT LAST" noch ein paar Befehle abzusetzen.
Und ich für beide Versionen schon Situationen gehabt, wo dieses Vorgehen sinnvoll einsetzbar war.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Beitrag von Michael.Nett (ForumUser / 17 / 0 / 0 ) »
ereglam hat geschrieben:dazu noch ein kleiner Tipp:
wenn man den LOOP mit ASSIGNING <fs> benutzt, hat man alle Felder im Zugriff, weil das FS ja direkt auf die Tabellenzeile verweist.
Das heißt im Besonderen, dass dann keines der Felder mit '*..*' maskiert ist!

Code: Alles auswählen.

LOOP AT itab ASSIGNING <wa_itab>.
  AT NEW land.
* in <wa_itab>-matnr steht die Materialnummer zur Verfügung
  ENDAT.
ENDLOOP.
Hallo ereglam,

vielen Dank für den Tipp, das mit Fieldsymbol war mir noch nicht bekannt, das scheint ja schonmal zu klappen.

Werd mir mal die Definition von Fieldsymbol ansehen, das scheinen tolle Helfer zu sein. ;)

Jetzt aber zu einem weiteren Problem, ich benutze jetzt "AT NEW LAND1" (hab auch mal testweise <wa_itab>-land1 getestet, hat aber den selben Effekt) das IMMER ein neuer Gruppenwechsel angezeigt werden, auch wenn zweimal z.B. "DE" folgt.

Mein Code:

Code: Alles auswählen.

field-symbols: <wa_vbrk> LIKE LINE OF itab_vbrk.
LOOP AT itab_vbrk ASSIGNING <wa_vbrk>.
    AT NEW <wa_vbrk>-LAND1.
      WRITE: / 'Neues Land'.
    ENDAT.
ENDLOOP.
Ergebnis: er schreibt über jede Zeile nun "Neues Land". Offensichtlich hab ich AT doch nicht wirklich verstanden.

Kann mir jemand nochmal unter die Arme greifen, ich habe natürlich die F1-Hilfe gelesen, aber grundsätzlich sollte es doch so funktionieren.

Gruß Michael

//Edit:
@Asaph
Danke, auch Deine Lösung schaue ich mir nochmal an.

@black_adept
vielen Dank für diesen Tipp in der Tat muss ich später Gruppenspezifisch etwas summieren. Dann fällt auch Fieldsymbol weg, dann werd ich mal Deine Aussage testen. Besten Dank!
"3 Haie? Das macht 4810 Zähne!" (Findet Nemo)

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
Hallo Michael,

bei der Verwendung von AT gibt es zwei wichtige Aspekte, die man unbedingt beachten sollte:
  1. keine WHERE-Klausel:
    SAP schreibt dazu, dass dadurch bestimmte Events nicht korrekt ausgelöst werden (können), weil die internen Prüffelder (wahrscheinlich) bei jedem Durchlauf (ohne Beachtung der WHERE-Klausel) geprüft werden und dann erst entschieden wird, ob die Zeile überhaut in die Bedingung passt.
  2. Die Tabelle muss in der Spaltenreihenfolge korrekt aufgebaut sein:
    Ein 'AT NEW Spalte 3' bedeutet immer auch, dass sich etwas in Spalte 1 und/oder 2 geändert haben kann, damit dieses Ereignis ausgelöst wird.
    Das bedeutet z.B. auch, dass bei neu eingefügten Datensätzen ein eventueller Mandant auch korrekt gepflegt sein muss.
//edit:
um sowohl die Summierung als auch Feldsymbole zu benutzen, kann man dann Folgendes machen:

Code: Alles auswählen.

LOOP AT itab INTO itab. 
* Feldsymbol setzen
  READ TABLE itab ASSIGNING <wa_itab> INDEX sy-tabix.

  AT NEW land1. 
* in <wa_itab>-matnr steht die Materialnummer zur Verfügung 
  ENDAT. 

  AT LAST land1.
    SUM.
...
  ENDAT.
ENDLOOP.
Zuletzt geändert von ereglam am 23.11.2005 13:40, insgesamt 1-mal geändert.
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von Michael.Nett (ForumUser / 17 / 0 / 0 ) »
ereglam hat geschrieben:
  • Die Tabelle muss in der Spaltenreihenfolge korrekt aufgebaut sein:
    Ein 'AT NEW Spalte 3' bedeutet immer auch, dass sich etwas in Spalte 1 und/oder 2 geändert haben kann, damit dieses Ereignis ausgelöst wird.
Oh, das wird wohl das Problem sein.
War mir so in der Form nicht bewußt, ich werde die Struktur mal umändern.

Vielen Dank aber für die rasche und kompetente Hilfe!

Gruß Michael

//Edit:
Soll es wirklich LOOP AT itab INTO itab heißen? Mach mein ABAP-Bild nicht kaputt...

Ein Loop muss doch in einen Arbeitsbereich geschoben werden, oder?
"3 Haie? Das macht 4810 Zähne!" (Findet Nemo)

Beitrag von meinrad (ForumUser / 67 / 0 / 0 ) »
Hallo,
Für den Fall, dass du den SAP-Gruppenwechsel nicht verwenden kannst, weil z.B. die Reihenfolge der Felder in der internen Tabelle nicht angepasst werden kann, bzw. du nicht viele interne Tabellen anlegen und Daten umschaufen willst oder weil eine WHERE-Klausel verwendet wird, schlage ich folgende Logik vor:
1. Zwei Gruppenwechsel-Strukturen definieren
ALT/NEU
* Gruppen-Wechsel-Feld
TYPES: BEGIN OF TY_GRUWE,
BEGIN OF GRU1,
FELD1 TYPE ...,
END OF GRU1,
FELD2 TYPE ...,
END OF TY_VBELN_LFD.
* Gruppen-Wechsel-Feld
DATA WA_GRUWE_NEU TYPE TY_GRUWE.
DATA WA_GRUWE_ALT TYPE TY_GRUWE.

2. Programm-Logik.
...
CLEAR WA_GRUWE_NEU, WA_GRU_ALT.
SORT ITAB BY ...
LOOP AT ITAB WHERE ... .
MOVE ITAB-xxxx TO WA_GRUWE_NEU-xxx.
IF WA_GRUWE_NEU <> WA_GRUWE_ALT.
PERFORM GRUPPENWECHSEL.
ENDIF.
MOVE-CORRESPONDING GRUWE_ALT TO GRUWE_NEU.
ENDLOOP.
PERFORM GRUWE. "letzte Zeile

...
FORM GRUPPENWECHSEL.
PERFORM GRUWE_ENDE_VERARB.
PERFORM GRUWE_ANF_VERARB.
IF WA_GRUWE_NEU-GRU1 <> WA_GRUWE_ALT.
PERFORM GRUWE_OBERGRUPPE. "Mehrstufig
ENDIF.
ENDFORM.

FORM GRUWE_ANF_VERARB.
PERFORM CLEAR_SUMMEN. "usw.
ENDFORM.
FORM GRUWE_END_VERARB.
CHECK GRUWE_ALT IS INITIAL: " 1. Zeile
PERFORM AUSGABE_SUMMEN. "usw.
ENDFORM.

Wenn man diese Logik noch erweitert, kann man daraus
noch eine Zusammen-Mischlogik für verschiedene Interne Tabellen basteln.

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
Michael.Nett hat geschrieben:...
//Edit:
Soll es wirklich LOOP AT itab INTO itab heißen? Mach mein ABAP-Bild nicht kaputt...

Ein Loop muss doch in einen Arbeitsbereich geschoben werden, oder?
Das ist nur die vollständige Form für die Kurzform 'LOOP AT itab.'.
Da ich es i.d.R. vermeide, implizite Kopfzeilen zu verwenden, dokumentiere ich dadurch das Ziel eindeutig.

Ich bin mir jetzt aber nicht sicher, ob die Maskierung bzw. Summierung in einem expliziten Arbeitsbereich dort auch funktioniert. QED.
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von Michael.Nett (ForumUser / 17 / 0 / 0 ) »
So, wollte nur mal ein kleines Feedback geben und mich für die Hilfe und vorallem für die Geduld bedanken.

Es funktioniert wunderbar mit field-symbols, Summen- und Durchschnittsberechnungen führe ich manuell durch, funktioniert auf jeden Fall.

Gruß Michael
"3 Haie? Das macht 4810 Zähne!" (Findet Nemo)

Seite 1 von 1

Vergleichbare Themen

2
Antw.
1119
Views
Fest Vorgelänge bei Abfragen in SAP
von Kojak » 12.09.2006 13:43 • Verfasst in ABAP® Core
3
Antw.
942
Views
Drucker druckt nicht auf fest hinterlegtem aus
von L0w-RiDer » 19.02.2021 10:25 • Verfasst in ABAP® für Anfänger
5
Antw.
2490
Views
Einfacher Subquery wirft Fehlermeldung
von stefanb » 05.12.2012 17:48 • Verfasst in ABAP® für Anfänger
2
Antw.
2618
Views
Drucktastenleiste in einfacher Listenausgabe anzeigen
von bliss » 16.04.2012 16:15 • Verfasst in ABAP® für Anfänger
4
Antw.
4507
Views
Unterschiede zwischen ALV TableControl und einfacher Liste
von OnkelSAP » 31.05.2010 22:43 • Verfasst in ABAP® Core

Aktuelle Forenbeiträge

RFC FuBa Call - Korrupte Daten
vor einer Stunde von der_neuling 3 / 33
SELECT CHAR16 in CHAR12-Feld
vor 9 Stunden von Shortcut IT 3 / 38
alv_grid aktualisieren
vor 9 Stunden von a-dead-trousers gelöst 3 / 75

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

RFC FuBa Call - Korrupte Daten
vor einer Stunde von der_neuling 3 / 33
SELECT CHAR16 in CHAR12-Feld
vor 9 Stunden von Shortcut IT 3 / 38
alv_grid aktualisieren
vor 9 Stunden von a-dead-trousers gelöst 3 / 75

Unbeantwortete Forenbeiträge

Zwischensumme Adobe Forms
vor 4 Wochen von Lucyalison 1 / 134
Group Items auf einer Filterbar
vor 5 Wochen von Bright4.5 1 / 168