Knobelaufgabe zum Wochenende/Wochenbeginn

Alles Rund um SAP®.
20 Beiträge • Vorherige Seite 2 von 2 (current)
20 Beiträge Vorherige Seite 2 von 2 (current)

Re: Knobelaufgabe zum Wochenende/Wochenbeginn

Beitrag von black_adept (Top Expert / 3412 / 66 / 656 ) » 11.09.2020 14:04
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.

Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag (Insgesamt 5):
ewxqyurryusDeathAndPaina-dead-trousersmasterhash

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de



Re: Knobelaufgabe zum Wochenende/Wochenbeginn

Beitrag von DeathAndPain (Top Expert / 1425 / 153 / 325 ) » 11.09.2020 15:52
Vielen Dank für die Mühe, die Du Dir gemacht hast!

Re: Knobelaufgabe zum Wochenende/Wochenbeginn

Beitrag von masterhash (ForumUser / 13 / 4 / 0 ) » 14.09.2020 07:39
Danke für die Aufgabe und die Zusammenfassung!

https://pastebin.com/H53f6te6

Re: Knobelaufgabe zum Wochenende/Wochenbeginn

Beitrag von DeathAndPain (Top Expert / 1425 / 153 / 325 ) » 14.09.2020 12:53
Eigentlich ist mir ein SELECT INTO TABLE @DATA deshalb unsympathisch, weil man damit nur Standardtabellen erzeugen kann. Im Regelfall will man mit den Daten aber weiterarbeiten und braucht daher eine suchoptimierte Fassung.

Im vorliegenden Beispiel wird allerdings nur ein einziges Mal in der Tabelle gesucht, nämlich bei

Code: Alles auswählen.

FOR res IN result WHERE ( cnt = VALUE #( result[ 3 ]-cnt OPTIONAL ) )
Hier wäre es zwar vorteilhaft, wenn result nach cnt sortiert wäre. Jedoch würde ein entsprechender Sortiervorgang mindestens so viel Rechenzeit kosten, wie die Tabelle einmalig sequenziell zu durchsuchen (weil man das beim Sortieren ja auch machen muss, und noch mehr). Auf den zweiten Blick ist es damit richtig, speziell in dieser Lösung mit einer Standardtabelle zu arbeiten.

Meist wird das aber anders sein.


Aktuelle Forenbeiträge

itab aus FuBa in Program
vor 30 Minuten von black_adept gelöst 6 / 47
GuiXT Standardtext erfassen bei SD Aufträgen
vor 11 Stunden von dagmard gelöst 3 / 77
Einlesen von XML im Batchmode
vor 12 Stunden von stony007_de gelöst 4 / 106

Vergleichbare Themen

Knobelaufgabe zum Wochenende / Wochenbeginn
von black_adept » 23.08.2019 08:46
FAUF-Terminierung fällt auf das Wochenende
von Thomas17 » 07.09.2012 13:13
Nur Werktage zählen (Ohne Wochenende)
von Dyrdek » 13.12.2016 13:44
Aufgabe zum Wochenende: Zugriff auf PROTECTED Attribut
von ewx » 06.12.2019 15:11
F110 Zahlprogramm - Posten, die am Wochenende fällig werden
von Gast » 14.01.2005 12:36