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 / 3943 / 105 / 886 ) »
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

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



Re: Knobelaufgabe zum Wochenende/Wochenbeginn

Beitrag von DeathAndPain (Top Expert / 1795 / 213 / 396 ) »
Vielen Dank für die Mühe, die Du Dir gemacht hast!

Re: Knobelaufgabe zum Wochenende/Wochenbeginn

Beitrag von masterhash (ForumUser / 22 / 6 / 0 ) »
Danke für die Aufgabe und die Zusammenfassung!

https://pastebin.com/H53f6te6

Re: Knobelaufgabe zum Wochenende/Wochenbeginn

Beitrag von DeathAndPain (Top Expert / 1795 / 213 / 396 ) »
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.

Vergleichbare Themen

14
Antw.
3814
Views
Knobelaufgabe zum Wochenende / Wochenbeginn
von black_adept » 23.08.2019 08:46 • Verfasst in SAP - Allgemeines
12
Antw.
979
Views
Knobelaufgabe zum Wochenende/Wochenbeginn ( Dezember 2020 )
von black_adept » 14.12.2020 15:54 • Verfasst in SAP - Allgemeines
5
Antw.
1515
Views
Knobelaufgabe zum Wochenbeginn ( Mai 2021 )
von black_adept » 11.05.2021 16:21 • Verfasst in SAP - Allgemeines
10
Antw.
2019
Views
Knobelaufgabe zum Wochenbeginn ( Juni 2021 )
von black_adept » 21.06.2021 16:29 • Verfasst in SAP - Allgemeines
2
Antw.
4073
Views

Aktuelle Forenbeiträge

Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 64
Interne Tabelle
vor 5 Tagen von black_adept 2 / 133
MaLo-Checker in ABAP
vor einer Woche von A6272 6 / 255

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

Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 64
Interne Tabelle
vor 5 Tagen von black_adept 2 / 133
MaLo-Checker in ABAP
vor einer Woche von A6272 6 / 255

Unbeantwortete Forenbeiträge

Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 64
Group Items auf einer Filterbar
vor einer Woche von Bright4.5 1 / 107
tRFC Transaktionen SM58
vor 4 Wochen von A6272 1 / 140