Maximale Anzahl der Einträge in einem internen Tabelle Thema ist als GELÖST markiert

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

Maximale Anzahl der Einträge in einem internen Tabelle

Beitrag von msentaburlar (ForumUser / 16 / 2 / 0 ) » 23.02.2020 01:12
Hallo,

ich hab jetzt eine kleine Frage und zwar ich habe eine interne Tabelle und es hat mehrere Spalten. Für mich ist aber nur eine Spalte (siehe unten Spalte 2) wichtig.

Spalte 1 Spalte 2 Spalte 3 .....
Berlin
Madrid
Frankfurt
Wien
Berlin
Berlin
Paris
Wien
.
.
.
Wie man in der Spalte 2 sieht, gibt es da verschieden Städte. Ich möchte jetzt hier folgendes finden und zwar welche Stadt und wie oft steht in dieser Tabelle?
Ich freue mich für die Rückmeldung

Viele Grüße
msentaburlar



Re: Maximale Anzahl der Einträge in einem internen Tabelle

Beitrag von msentaburlar (ForumUser / 16 / 2 / 0 ) » 23.02.2020 11:16
Hallo wreichelt,

danke für die Antwort, aber ich bin neue in Abap und brauche konkrete Beispiel Code. Ich habe schon über Hilfe Abap vieles gelesen, aber ich konnte es trotzdem nicht bis jetzt nicht schaffen.

Viele Grüße
msentaburlar

Re: Maximale Anzahl der Einträge in einem internen Tabelle

Beitrag von ewx (Top Expert / 4199 / 193 / 436 ) » 23.02.2020 15:54
Das beste wäre es, wenn du es direkt über den Select machen könntest:

Code: Alles auswählen.

SELECT city1, COUNT( * ) AS cnt 
  FROM adrc 
  INTO TABLE @DATA(t) 
 GROUP BY city1 
 ORDER BY cnt DESCENDING.
cl_demo_output=>display_data( t ).
Wenn die interne Tabelle gegeben ist: In dem Link von Wolfgang sind ja jede Menge Codebeispiele vorhanden...

eine andere Möglichkeit wäre, mit einem LOOP über die Tabelle alle vorkommenden Orte in einer anderen Tabelle zu sammeln.

Code: Alles auswählen.

LOOP at itab.

Lies Tabelle ORTE mit itab-ort.
Eintrag vorhanden?
-> nein: neuer Eintrag 
  orte-ort = itab-ort
  orte-anzahl = 1.
-> ja: orte-anzahl + 1
ENDLOOP.

Re: Maximale Anzahl der Einträge in einem internen Tabelle

Beitrag von msentaburlar (ForumUser / 16 / 2 / 0 ) » 23.02.2020 19:50
Hallo,

es hat geklappt. Danke dir

VG

msentaburlar

Re: Maximale Anzahl der Einträge in einem internen Tabelle

Beitrag von DeathAndPain (Top Expert / 1358 / 146 / 319 ) » 24.02.2020 13:14
Das klingt wie eine Herausforderung für black_adept: Löse dieses Problem einzeilig mit dem REDUCE-Befehl unter der Maßgabe, dass die am häufigsten auftretende Stadt nebst der Anzahl ihres Auftretens als zweispaltige Struktur zurückgeliefert wird, wobei vorher nicht bekannt ist, welche Stadt das sein wird. (Für Typisierungen sind natürlich weitere, vorhergehende Programmzeilen erlaubt.)

Auf die Schnelle weiß ich nicht, wie das bewerkstelligt werden kann, aber mein Gefühl sagt mir, dass solch REDUCE möglich ist, und die Erfahrung sagt mir, dass black_adept ihn finden kann. 😁

Wenn ich es selbst machen müsste, würde ich wahrscheinlich versuchen, zwei REDUCEs ineinander zu schachteln: Der innere erzeugt eine zweispaltige Tabelle (Stadt;Auftretensanzahl) und der äußere zieht daraus die am häufigsten auftretende Stadt nebst deren Auftretensanzahl. Das ist, wie gesagt, noch nicht zu Ende gedacht und nicht notwendigerweise der richtige oder einfachste Ansatz.

Re: Maximale Anzahl der Einträge in einem internen Tabelle

Beitrag von ewx (Top Expert / 4199 / 193 / 436 ) » 24.02.2020 13:46
Bin mir nicht sicher, ob ich weiß, was ich da tue...
Scheint aber zu funktionieren...

Code: Alles auswählen.

  SELECT * FROM adrc INTO TABLE @DATA(adr).

  TYPES: BEGIN OF ts_city,
           city TYPE ad_city1,
           cnt  TYPE i,
         END OF ts_city,
         tt_cities TYPE sorted TABLE OF ts_city
            WITH UNIQUE KEY city
            WITH NON-UNIQUE SORTED KEY count components cnt.

  DATA(t) = VALUE tt_cities( FOR GROUPS <city> OF address
                             IN adr GROUP BY ( city = address-city1 )
             ( city = <city> cnt = REDUCE i(
                                    INIT count = 0 FOR adrline IN adr
                                    WHERE ( city1 = <city>-city )
                                    NEXT count = count + 1 ) ) ) .

  cl_demo_output=>display_data( t ).
Ist das nicht schön?
Ja, das ist nicht schön!

/edit: und definitiv ist das nicht die schnellste Variante.

Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
DeathAndPain (24.02.2020 14:01)


Re: Maximale Anzahl der Einträge in einem internen Tabelle

Beitrag von DeathAndPain (Top Expert / 1358 / 146 / 319 ) » 24.02.2020 14:11
Mir gefällt die Lösung! 😁 Wobei ich REDUCE i( INIT count = 0 nicht so mag. Ich finde es schöner, den Typ der INIT-Variable explizit anzugeben, was nebenbei den Effekt hat, dass man vorne eine Raute nutzen kann, also REDUCE #( INIT count TYPE i

"Schön" oder "nicht schön" ist eine Frage der Gewohnheit, glaube ich. Wir empfinden die Syntax als "nicht schön", weil wir sie nicht gewohnt sind. Ich kann mich noch erinnern, als ich zum ersten Mal den SWITCH-Befehl gesehen habe. Meine reflexartige Reaktion war: "Wer braucht denn sowas?" Später wollte ich ihn nicht mehr missen, aber FOR war mir definitiv zu kompliziert.

Was soll ich sagen, mittlerweile nutze ich FOR sehr gerne, hatte bis vor kurzem aber noch gehörigen Respekt vor REDUCE. An den gewöhne ich mich jetzt gerade, und Dein nettes Beispiel ist eine Anregung für mich, mich auch mal mit dem GROUPS des FOR auseinanderzusetzen, das ich bislang noch nicht auf dem Schirm habe.

Je mehr man aber selber in dieser neuen Syntax programmiert, desto besser kann man sie lesen, und ich behaupte, wer das in sein geistiges Repertoire aufgenommen hat und bei jeder sich bietenden Gelegenheit nutzt, der liest Deine Lösung einfach runter und versteht auf Anhieb, wie sie funktioniert. Es ist also nicht so, dass Deine Lösung nicht schön wäre, sondern unser Auge muss geschult werden, ihre Schönheit zu sehen. Wer dazu nicht bereit ist (und das sind leider viele), der wird natürlich immer auf dem Standpunkt beharren, dass früher alles besser gewesen ist.

Re: Maximale Anzahl der Einträge in einem internen Tabelle

Beitrag von ewx (Top Expert / 4199 / 193 / 436 ) » 24.02.2020 14:19
ich finde es nach wie vor unglaublich schwer zu erkennen, was sich wann worauf bezieht und wann wo welche Werte in welcher Form gesetzt werden können.

Bsp: "address"
wofür benötige ich das?
Warum reicht nicht:

Code: Alles auswählen.

...FOR GROUPS <city> IN adr GROUP BY ( city = adr-city )...?

Re: Maximale Anzahl der Einträge in einem internen Tabelle

Beitrag von DeathAndPain (Top Expert / 1358 / 146 / 319 ) » 24.02.2020 15:47
Das wird ein syntaktisches Zugeständnis an den Umstand sein, dass man GROUPS mit oder ohne Gruppenvariable (Gruppenschlüsselbindung oder Repräsentantenbindung) angeben kann. In beiden Fällen wird wohl der Einheitlichkeit halber die Workarea hinter dem GROUP BY referenziert. In Deinem Alternativbeispiel referenzierst Du stattdessen den Tabellennamen selbst. Bedenke aber, dass die Workarea nicht identisch, sondern nur konvertierbar typisiert werden muss wie eine Zeile der internen Tabelle! Das gleiche gilt auch bei LOOP AT .. GROUP BY. Ich persönlich finde es sogar redundant, wie von Dir vorgeschlagen den Tabellennamen anzugeben; beim GROUP BY eines SELECTs macht man das ja auch nicht. Von mir aus könnte man also sogar schreiben:

Code: Alles auswählen.

...FOR GROUPS <city> IN adr GROUP BY ( city )...
Aber dann würdest Du nach der Tabellenspalte gruppieren, obwohl Du bei der Repräsentantenbindung im nachfolgenden Code mit der Workarea-Spalte als Gruppenspalte arbeitest, die womöglich ganz anders heißt! Das wird der SAP nicht gefallen haben. Deshalb (so meine Vermutung) haben sie gesagt, die GROUP BY-Klausel muss sich immer auf die Spaltennamen der Workarea-Variable beziehen, aus der Dein Gruppenfeld dann Spaltennamen und Typisierung erbt. Und daraus folgt, dass die Workarea-Variable immer angegeben werden muss, auch wenn ihr Wert bei der Gruppenschlüsselbindung stets initial ist.

Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
ewx (24.02.2020 16:01)


Seite 1 von 1