REDUCE? ABAP 740 Features

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

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

REDUCE? ABAP 740 Features

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
Hallo!

ich versuche mich gerade an den 740er-Features und klemme an folgender Stelle:
Aus der Tabelle SFLIGHT wollte ich alle Fluggesellschaften reduzieren, die mit A beginnen und in eine eigene Tabelle schreiben.
Der folgende Code liefert mir zwar eine Tabelle, aber nur eine Eintrag (AZ) obwohl ich zwei erwarte (AA + AZ).

Code: Alles auswählen.

    TYPES: BEGIN OF ty_airline,
             carrid TYPE s_carr_id,
             carrnm TYPE string,
           END OF ty_airline,
           ty_airlines TYPE SORTED TABLE OF ty_airline WITH UNIQUE KEY carrid.

    select * from sflights into table @data(flights).

    DATA(my_airlines) =  REDUCE ty_airlines(
                           INIT airlines = VALUE #( )
                            FOR flight IN flights
                          WHERE ( carrid(1) = 'A' )
                           NEXT airlines = VALUE #( ( carrid = flight-carrid
                                                      carrnm = SWITCH #( flight-carrid
                                                                 WHEN 'AA' THEN 'American Airlines'
                                                                 WHEN 'AZ' THEN 'All Italia' ) ) ) ).

    cl_demo_output=>display_data( my_airlines ).
Ich kann aber nicht "INIT AIRLINE" angeben, weil ich ja eine Tabelle als Ergebnis zurück haben möchte.

Der folgende Code liefert das gewünschte Ergebnis, aber ich dachte, es müsste auch mit REDUCE mit einem Ausdruck funktionieren...

Code: Alles auswählen.

    LOOP AT flights INTO DATA(airline) WHERE carrid(1) = 'A'
                    GROUP BY ( carrid = airline-carrid ).
      INSERT VALUE ty_airline( carrid = airline-carrid
                      carrnm = SWITCH #( airline-carrid
                                 WHEN 'AA' THEN 'American Airlines'
                                 WHEN 'AZ' THEN 'All Italia' ) ) INTO TABLE my_airlines.
    ENDLOOP.
Komme ich mit dem REDUCE-Befehl also weiter oder wenn ja wie und wenn nein warum nicht??

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


Re: REDUCE? ABAP 740 Features

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
Ein Schritt weiter:
REDUCE ist wohl dafür nicht die richtige Wahl, sondern eher "Table Comprehensions":

Code: Alles auswählen.

    DATA(my_airlines) = value ty_airlines(
                              FOR GROUPS carrid of flight IN flights
                              GROUP BY flight-carrid
                                ( carrid = carrid
                                  carrnm = get_carrid_name( carrid ) )
                                ).
Allerdings kann ich hier nicht mit WHERE arbeiten...

Re: REDUCE? ABAP 740 Features

Beitrag von black_adept (Top Expert / 3944 / 105 / 886 ) »
Probier mal folgendes:

Code: Alles auswählen.

DATA(my_airlines) = VALUE ty_airlines( FOR flight_line IN flights WHERE ( carrid = 'AA' OR carrid = 'AZ' ) ( flight_line)  ).
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: REDUCE? ABAP 740 Features

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
hmpf - jaaa - neee...

in MY_AIRLINES sollen ja nur CARRID und CARRNAME auftauchen. Ich darf das also nicht für jeden Eintrag in SFLIGHT machen, da bekomme ich sonst die Ausnahme CX_SY_ITAB_DUPLICATE_KEY:

Code: Alles auswählen.

    DATA(my_airlines) = VALUE ty_airlines(
                          FOR flight_line IN flights
                          WHERE ( carrid = 'AA' OR carrid = 'AZ' )
                               ( carrid = flight_line-carrid ) ).
Allerdings natürlich auch bei meinem anfänglichen Versuch. in dem "VALUE" oder "NEW" bräuchte ich sowas wie "IF ENTRY NOT EXIST" oder "COLLECT"... :)

Wahrscheinlich müsste ich den GROUP-Ansatz nutzen und dann mithilfe von FILTER die gewünschten Einträge berücksichtigen.
Aber FILTER habe ich auch noch nicht verstanden... :D

Re: REDUCE? ABAP 740 Features

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
jau. gut, dass wir drüber geredet haben... ;)
So funktioniert's:

Code: Alles auswählen.

  DATA ty_carrid_t TYPE SORTED TABLE OF s_carr_id WITH UNIQUE DEFAULT KEY.
  DATA(my_airlines) = FILTER ty_airlines(
                        VALUE ty_airlines(
                          FOR GROUPS carrid OF flight IN flights
                              GROUP BY flight-carrid
                                ( carrid = carrid
                                  carrnm = get_carrid_name( carrid ) )
                                )
                             IN VALUE ty_carrid_t(
                                       ( 'AA ' )
                                       ( 'AZ ' ) )
                             WHERE carrid = table_line  ).
Folgendes funktioniert leider nicht:

Code: Alles auswählen.

...                           IN VALUE #(
                                       ( 'AA ' )
                                       ( 'AZ ' ) )
                             WHERE carrid = table_line  ).
Fehlermeldung: Für den Operator "VALUE" kann kein Typ aus dem Kontext hergeleitet werden.

Folgendes funktioniert leider auch nicht:

Code: Alles auswählen.

WHERE carrid = 'AA '  or carrid = 'AZ ' ).
OR ist hier nicht erlaubt.

Folgendes funktioniert auch nicht:

Code: Alles auswählen.

WHERE carrid(1) = 'A' 
Folgendes funktioniert auch nicht:

Code: Alles auswählen.

WHERE carrid CP 'A*' 
Auch lustig: Obwohl ich den Typ TY_CARRID_T nun sauber definiert habe, muss ich "AA " angeben (mit Leerzeichen, damit CARRID dreistellig ist). "AA" wird quittiert mit: "'AA'" und der Zeilentyp von "TY_CARRID_T" sind nicht kompatibel. funktioniert auch nicht, dafür aber wieder

Re: REDUCE? ABAP 740 Features

Beitrag von black_adept (Top Expert / 3944 / 105 / 886 ) »
ewx hat geschrieben:
Folgendes funktioniert leider auch nicht:

Code: Alles auswählen.

WHERE carrid = 'AA '  or carrid = 'AZ ' ).
OR ist hier nicht erlaubt.

Folgendes funktioniert auch nicht:

Code: Alles auswählen.

WHERE carrid(1) = 'A' 
Folgendes funktioniert auch nicht:

Code: Alles auswählen.

WHERE carrid CP 'A*' 
]
Müssen nicht die Bedingungen hinter einer WHERE-Bedingung in diesem Kontext immer in Klammern gesetzt werden?
Also

Code: Alles auswählen.

WHERE ( carrid = 'AA '  or carrid = 'AZ ' ) ).
WHERE ( carrid(1) = 'A'  )
WHERE ( carrid CP 'A*'  )
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de


Re: REDUCE? ABAP 740 Features

Beitrag von black_adept (Top Expert / 3944 / 105 / 886 ) »
Viellelicht doch. In dem Blog scheint es ja zu gehen - aber in deinen Beispielen sehe ich Konstanten. Und ich bin mir zwar nicht 100% sicher - aber ich schätze, dass die damit unter die Bezeichnung "statische Bedingung" fällt.
Und hier stehen folgende beiden Aussagen
The syntax and semantics are exactly the same as in LOOP AT itab, apart from the fact that a statically specified logical expression log_exp in the WHERE condition must always be placed in parentheses.

In the expression FOR ... IN GROUP group, only static WHERE conditions can be specified for cond.
--> probiere es doch noch mal aus, aber mit Klammern um die Bedingung. Gerade die Meldung "OR nicht erlaubt" scheint auf die fehlende Klammerung hinzuweisen.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: REDUCE? ABAP 740 Features

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
Was meinst du, was ich stundenlang tue?!? :D

Re: REDUCE? ABAP 740 Features

Beitrag von black_adept (Top Expert / 3944 / 105 / 886 ) »
Vielleicht so?

Code: Alles auswählen.

    DATA(my_airlines) = VALUE ty_airlines(
                            FOR GROUPS airline OF <flight> IN flights
                                WHERE ( carrid = 'AA' OR carrid = 'AZ' )
                            GROUP BY ( key1 = <flight>-carrid key2 = get_carrid_name( <flight>-carrid ) )
                              ( airline ) ).
Ist allerdings ohne REDUCE oder FILTER, da gar nicht erst zu viel aufgebaut wird.

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

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: REDUCE? ABAP 740 Features

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
ja, cool!
Danke!

Seite 1 von 1

Vergleichbare Themen

4
Antw.
809
Views
Reduce ignoriert nackommastellen
von Margolwes » 15.01.2021 11:03 • Verfasst in ABAP® Core
2
Antw.
2958
Views
Ungeliebte SMARTFORM Features
von SAP_ENTWICKLER » 30.11.2013 14:46 • Verfasst in ABAP® Core
2
Antw.
1813
Views
Welche new Features EHP6.0 für Entwicklung ?
von mnd » 09.01.2013 14:25 • Verfasst in ABAP® für Anfänger
5
Antw.
10027
Views
Kundeneigene ABAP-Muster Vorlage im ABAP-Editor anlegen
von Stentor » 19.07.2005 11:10 • Verfasst in Basis
3
Antw.
15656
Views
ABAP 7.02 - Neues Feature - Pragmas in ABAP
von foessleitnerj » 09.01.2013 17:02 • Verfasst in Tips + Tricks & FAQs

Ü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

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