Moin allerseits,
wie bei der letzten Knobelaufgabe möchte ich gerne nach eine Woche ein Fazit ziehen, die Probleme der Aufgabenstellung und die mir ab jetzt bekannten Lösungsmöglichkeiten erläutern. Auch hier wieder "Danke" an alle die mir ihre Lösung via PM ( oder Email ) zugeschickt haben - ich habe wie beim Letzen Mal stelle ich fest: Auch wenn sonst kein weitere was hieraus lernt: Ich habe zumindest den einen oder anderen Anstoß erfahren was ich in meinen eigenen Codings verändern könnte.
Zunächst einmal zur Aufgabenstellung: Diese bestand de facto aus 2 (oder 3 )unterschiedlichen Teilen.
1.) Es musste herausgefunden werden welches einer der am 3.häufgsten vorkommenden Tage ist
2.) Die Ausgabetabelle sollte so geändert werden, dass nur noch solche Einträge drin stehen bleiben die mit der unter 1 ermittelten Häufigkeit vorkommen
[3.)] Falls es in 1) keinen 3. häufigsten Tag gibt muss darauf reagiert werden.
Für 1. gibt es einen Hauptansatz, der von fast allen angewendet wurde. Es wird ein Typ ( Geburtstag/Anzahl ) erstellt und dazu eine Tabelle die für jeden in der Quelltabelle vorkommenden Tag zählt wie häufig er vorkommt.
Für das Zählen wurden die meisten unterschiedlichen Lösungen vorgeschlagen.
Den für mich eleganteste Weg bei den obigen Ansätzen ist für mich der Weg über einen SELECT, da die Zusätze des SELECT es erlauben die angeprochene Tabelle mit Standardmitteln sogar implizit zu erzeugen und auch gleich auf eine Art zu sortieren die nachher benötigt wird. Interessant ist es allemal, da evtl. noch nicht jedem bekannt, dass ABAP
EINE interne Tabelle in einem SELECT zulässt ( ab 7.52 )
Beispielcoding um die Tabelle zu erzeugen:
Code: Alles auswählen.
SELECT birthday,
COUNT( * ) AS cnt FROM @ct_data AS data
GROUP BY birthday
ORDER BY cnt DESCENDING
INTO TABLE @DATA(result).
Nachdem die Tabelle erstellt wurde wird nun einfach der 3. Eintrag herausgesucht falls vorhanden. Und damit kommen wir zum Punkt [3.)]
Auch hier gab es verschiedene Ansätze. Einer war einfach zu schauen ob die Häufigkeitstabelle mindestens 3 Einträge besitzt und wenn nicht einfach eine leere Tabelle zurückzugeben und Punkt 2) auszulassen.
Alternativ wurde mittels fehlschlagendem READ TABLE ... INDEX 3 INTO oder dem Zusatz "OPTIONAL" beim Tabellenzeilenzugriff
VALUE #( Häufikeitstabelle[ 3 OPTIONAL ] ) dafür gesorgt, dass die angebliche Häufigkeit 0 gefunden wurde welche in der Häufigkeitstabelle nicht vorkommen kann ( wenn so aufgebaut wie in 1.) vorgeschlagen )
Der letzte Teil war das Extrahieren derjenigen Einträge aus der Eingabetabelle die den Tagen mit der korrekten Häufigkeit.
Auch hier gab es diverse Ansätze
- LOOP über die Eingabetabelle und Löschen derjenigen Daten via Lookup in Häufikeitstabelle, die eine falsche Häufigkeit haben
- Loop über Häufigkeitstabelle mit der korrekten Häufigkeit und Sammeln aller Zeilen der Eingabetabelle die dem zugehörigen Datum entsprechen in einer Ausgabetabelle
- Verwendung des Befehls FILTER wobei die Filtertabelle die gewünschten Einträge aus 1) enthält
Auch hier möchte ich eine Lösung darbieten, welche ich für recht elegant halte
Code: Alles auswählen.
ct_data = FILTER #( ct_data IN VALUE rsr_ts_datum( FOR res IN result WHERE ( cnt = VALUE #( result[ 3 ]-cnt OPTIONAL ) ) ( res-birthday ) ) WHERE birthday = table_line ).
* Erklärung
* §1 VALUE #( result[ 3 ]-cnt OPTIONAL ) <-- 3. Tabelleneintrag, leer falls nicht vorhanden
* §2 VALUE rsr_ts_datum( FOR res IN result WHERE ( cnt = §1 ) ( res-birthday ) ) <-- Erstellt sortierte Filtertabelle vom Zeilentyp DATUM mit Datümern die dem 3.meisten entsprechen ( leer falls in §1 optional eingetreten ist )
* §3 FILTER #( ct_data IN §2 WHERE birthday = table_line ) <-- Erstellt Tabelle mit den Einträgen aus CT_DATA die in der Filtertabelle §2 stehen
Fazit: Es gibt wie immer sehr viele Wege die nach Rom führen und ich bin durch die mir zugeschickten Einsendungen auf diverse Nebenstrecken geführt worden, die ich vorher immer habe links liegen lassen.
Es war mir vorher recht klar, dass es eine Lösung aus 2 Befehlen geben müsste - aber die finale "elegante" Lösung aus den beiden obigen Codeschnipseln hätte ich vorher nicht für möglich gehalten und war nur durch diverse neue Erkenntnisse aus dem Einsendungen möglich.
Ich hoffe dass diejenigen die mir eine Lösung zugeschickt haben diese wie beim letzten Mal bei pastebin hochladen um auch anderen die vielen Lösungsansätze die einem je nach Releasestand zur Verfügung stehen anzusehen und evtl. selber mal auszuprobieren.
Fazit: Mir hat es wieder sehr viel Spaß gemacht und ich hoffe dass es bis zur nächsten Knobelaufgabe diesmal nicht so lange dauern wird.