Knobelaufgabe zum Wochenende / Wochenbeginn Thema ist als GELÖST markiert

Alles Rund um SAP®.
15 Beiträge Seite 1 von 1
15 Beiträge Seite 1 von 1

Knobelaufgabe zum Wochenende / Wochenbeginn

Beitrag von black_adept (Top Expert / 3268 / 55 / 588 ) » 23. Aug 2019 08:46

Moin allerseits,

da wir längere Zeit kein Rätsel / Knobelaufgabe mehr hatten habe ich mal wieder eins erstellt.
Kurze Regeln. Damit die Spannung ein wenig steigt bitte zunächst nur posten, ob ihr eine Lösung gefunden habt und - um den Wettbewerb ein wenig anzustacheln - wie viele Variablen/Befehle/Wörter eure Lösung benötigt (wobei eine kurze Lösung nicht unbedingt ein Qualitätsmerkmal sein muss ). Ich hoffe, dass man hier im Forum seine Posts nachträglich immer noch modifizieren kann, so dass ihr bei einer Verbesserung dann einfach die neuen Werte eintragen könnt.
_____________________________________________________________________

Aufgabe: Es soll für eine Menge von Tabellen angezeigt werden, für welche Sprachen eine Übersetzung vorhanden ist. Dafür wurde folgendes Programm geschrieben welches das eine oder andere Verbesserungpotential aufweist 😇

Die Knobelaufgabe besteht jetzt darin eine kürzere/performantere/elegantere/ oder einfach bessere Lösung zu geben, indem der Code innerhalb der FORM-Routine GET_TRANSLATION_INFO durch eure Version ausgetauscht wird, so dass sich die Programmausgabe nicht ändert ( Reihenfolge des Ergebnisses ist also egal, da die Rückgabetabelle vor der Ausgabe sortiert wird ).

Code: Alles auswählen.

REPORT zknobelei.
TABLES: dd02l.
TYPES: BEGIN OF gts_data,
         tabname            TYPE dd02l-tabname,
         spras              TYPE t002-spras,
         translation_exists TYPE flag,
       END OF gts_data,
       gtt_data TYPE STANDARD TABLE OF gts_data WITH NON-UNIQUE DEFAULT KEY.

DATA: gt_data TYPE gtt_data,
      gs_data TYPE gts_data.
SELECT-OPTIONS: s_table FOR dd02l-tabname DEFAULT 'T006A'.


END-OF-SELECTION.

  PERFORM GET_TRANSLATION_INFO CHANGING gt_data.

  SORT gt_data BY tabname spras.
  LOOP AT gt_data INTO gs_data.
    WRITE:/ gs_data-tabname,
            gs_data-spras.
    IF gs_data-translation_exists = 'X'.
      WRITE 'Übersetzung vorhanden' COLOR 5.
    ELSE.
      WRITE 'ÜBersetzung fehlt' COLOR 7.
    ENDIF.
  ENDLOOP.



FORM get_translation_info CHANGING ct_data TYPE gtt_data.


  DATA: lt_sprachen TYPE STANDARD TABLE OF t002,
        ls_sprache  LIKE LINE OF lt_sprachen,
        lt_tabellen TYPE STANDARD TABLE OF dd02l,
        ls_tabelle  LIKE LINE OF lt_tabellen,

        ls_data     LIKE LINE OF ct_data,
        ls_dd02t    TYPE dd02t.

  SELECT *
    INTO TABLE lt_sprachen
    FROM t002.

  SELECT *
    INTO TABLE lt_tabellen
    FROM dd02l
    WHERE tabname IN s_table
      AND as4local = 'A'.

  LOOP AT lt_tabellen INTO ls_tabelle.
    LOOP AT lt_sprachen INTO ls_sprache.
      CLEAR ls_data.
      ls_data-tabname            = ls_tabelle-tabname.
      ls_data-spras              = ls_sprache-spras.
      SELECT SINGLE *
        INTO ls_dd02t
        FROM dd02t
        WHERE tabname    = ls_data-tabname
          AND ddlanguage = ls_data-spras
          AND as4local   = 'A'.
      IF sy-subrc = 0.
        ls_data-translation_exists = 'X'.
      ELSE.
        ls_data-translation_exists = ' '.
      ENDIF.

      APPEND ls_data TO ct_data.
    ENDLOOP.
  ENDLOOP.

ENDFORM.


Zusätzliche Schwierigkeit für die Obernerds: Ja - ich hätte noch eine weitere Verschärfung der Aufgabe in petto. Wer mir ihre/seine aktuelle Lösung via PM zuschickt und ich sehe, dass diese korrekt ist bekommt die Zusatzschwierigkeit zugeschickt ( oder die Info dass die eingesendete Lösung diese schon erfüllt )

Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag (Insgesamt 3):
ewx (23. Aug 2019 12:47) • a-dead-trousers (23. Aug 2019 21:17) • qyurryus (26. Aug 2019 09:35)

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de


Re: Knobelaufgabe zum Wochenende / Wochenbeginn

Beitrag von black_adept (Top Expert / 3268 / 55 / 588 ) » 23. Aug 2019 08:51

Beispiellösung die von euch ja verbessert werden soll:
Wörter : 109 ( mit MS-Word gezählt, alles zwischen FORM get_translation_info CHANGING ct_data TYPE gtt_data. und ENDFORM )
Befehle : 22 ( manuell gezählt )
Variablen: 6
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Knobelaufgabe zum Wochenende / Wochenbeginn

Beitrag von ewx (Top Expert / 4024 / 169 / 388 ) » 23. Aug 2019 12:37

Wörter: 78 ( woerter-zaehlen.de)
Befehle: 4
Variablen: 2
Performance: deutlich schneller ;)
Zuletzt geändert von ewx am 23. Aug 2019 13:22, insgesamt 1-mal geändert.

Re: Knobelaufgabe zum Wochenende / Wochenbeginn

Beitrag von schick (ForumUser / 43 / 5 / 12 ) » 23. Aug 2019 12:55

Mit minimalen Änderungen:

Wörter: 91
Befehle: 12
Variablen: 5

Edit:
Neuer Anlauf
Wörter: 80
Befehle: 9
Variablen: 4
Zuletzt geändert von schick am 23. Aug 2019 14:42, insgesamt 1-mal geändert.

Re: Knobelaufgabe zum Wochenende / Wochenbeginn

Beitrag von masterhash (ForumUser / 9 / 2 / 0 ) » 23. Aug 2019 14:08

kurz und knapp:

edit nach dem Wochenende:

73 Wörter
5 Anweisungen
0 Variablen
Performance: HANA ready :)

https://pastebin.com/LQzQQwii
Zuletzt geändert von masterhash am 29. Aug 2019 08:12, insgesamt 2-mal geändert.

Re: Knobelaufgabe zum Wochenende / Wochenbeginn

Beitrag von a-dead-trousers (Top Expert / 3253 / 84 / 820 ) » 23. Aug 2019 21:15

Wörter 36
Befehle 1
Variablen 0

Ich musste aber die Ausgabe etwas modifizieren. Konkret die Abfrage auf 'X'. In der neuen Syntax ginge es auch ohne diese Modifikation, aber dann benötige ich für den Befehl auch etwas mehr Wörter. Ich finde also, ein guter Kompromiss 😉

EDIT:
Okay, ich konnte noch ein Wort einsparen und bin damit auf 35.
Wir haben HANA im Einsatz daher kann ich jetzt nicht sagen wie meine Lösung auf anderen Datenbanken performt. Bei mir war es jedenfalls "pfeilschnell".

EDIT 2:
Grundaufgabe mit Anpassungen https://pastebin.com/ZQuYtEP7 (34 Wörter)
Grundaufgabe ohne Anpassungen https://pastebin.com/aXKyAiLC (42 Wörter)
Zusatzaufgabe 1 https://pastebin.com/kVChsWjj (48 Wörter)
Spezialaufgabe "alte Syntax" https://pastebin.com/Ye2sc5xX
Zuletzt geändert von a-dead-trousers am 28. Aug 2019 09:39, insgesamt 1-mal geändert.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.07
Basis: 7.40

Re: Knobelaufgabe zum Wochenende / Wochenbeginn

Beitrag von Tron (Top Expert / 1057 / 10 / 215 ) » 24. Aug 2019 14:16

Moin.
Wörter : 117
Befehle : 11
Variablen : 4

Neuer Versuch .
Wörter :109
Befehle : 12
Variablen : 4

Finale Vers. (jetzt auch mit DD02L) 😁
Wörter :122
Befehle : 12
Variablen : 4


Result : https://pastebin.com/1aM2YSvs
Zuletzt geändert von Tron am 30. Aug 2019 10:06, insgesamt 2-mal geändert.
<:: XING-Gruppe Tricktresor::>
Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen –
Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

Re: Knobelaufgabe zum Wochenende / Wochenbeginn

Beitrag von qyurryus (ForumUser / 34 / 26 / 9 ) » 27. Aug 2019 09:18

Wörter: 50
Befehle: 3
Variablen: 1

Grundaufgabe: https://pastebin.com/vcDpWQ34

Zusatzaufgabe (nach Veröffentlichung der Lösung): https://pastebin.com/dTA5Ldph
Zuletzt geändert von qyurryus am 29. Aug 2019 15:46, insgesamt 2-mal geändert.

Re: Knobelaufgabe zum Wochenende / Wochenbeginn

Beitrag von abuma (ForumUser / 98 / 28 / 12 ) » 27. Aug 2019 15:11

huhu,

Wörter 37
Befehle 1
Variablen 0

ohne sonstige Anpassung.

EDIT:
Wörter 45
Befehle 1
Variablen 0

hatte Bedingungen vergessen 😣

https://pastebin.com/EavaGVEH
Zuletzt geändert von abuma am 30. Aug 2019 09:59, insgesamt 1-mal geändert.

Re: Knobelaufgabe zum Wochenende / Wochenbeginn

Beitrag von ewx (Top Expert / 4024 / 169 / 388 ) » 27. Aug 2019 16:23

Was haltet ihr davon, die Lösungen auf pastebin.com zu posten und einen Link dahin einzustellen?
Dann kann jeder, der neugierig ist, gucken.
Es wird aber niemand "behindert", der noch mitmachen möchte.

Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag (Insgesamt 2):
a-dead-trousers (28. Aug 2019 09:40) • black_adept (29. Aug 2019 14:04)


Re: Knobelaufgabe zum Wochenende / Wochenbeginn

Beitrag von masterhash (ForumUser / 9 / 2 / 0 ) » 28. Aug 2019 07:51

so eine [/spoiler] Funktion wäre jetzt super :)

Re: Knobelaufgabe zum Wochenende / Wochenbeginn

Beitrag von ewx (Top Expert / 4024 / 169 / 388 ) » 28. Aug 2019 09:02

<Spoiler>
mit color=white könnte man die Lösung nicht ganz so offensichtlich posten...
Leider nicht mit code-Tags... :(

</spoiler>

Re: Knobelaufgabe zum Wochenende / Wochenbeginn

Beitrag von schick (ForumUser / 43 / 5 / 12 ) » 28. Aug 2019 09:22

ewx hat geschrieben:
27. Aug 2019 16:23
Was haltet ihr davon, die Lösungen auf pastebin.com zu posten und einen Link dahin einzustellen?
Dann kann jeder, der neugierig ist, gucken.
Es wird aber niemand "behindert", der noch mitmachen möchte.
Ich bin dafür!
Die Lösungen von anderen im Nachgang zu sehen war für mich die Hauptmotivation mitzumachen, ich will ja was lernen ;-)

Re: Knobelaufgabe zum Wochenende / Wochenbeginn

Beitrag von black_adept (Top Expert / 3268 / 55 / 588 ) » 29. Aug 2019 14:00

Hallo allerseits,

ich möchte an dieser Stelle eine Zusammenfassung der (via PM eingeschickten ) Lösungen zum Besten geben und zumindest erwähnen welche Zusatzkomplikationen für die Obernerds zu lösen waren. Aber zuerst wollte ich allen die mich via PM hierzu angefunkt hatten danken - 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.

Aber hier nur zur Zusammenfassung:

Zunächst einmal war die grundlegende Lösung der Aufgabe auf den ersten Blick scheinbar in Ordnung. Es wurde kein geschachtelter SELECT gemacht sondern sauber in interne Tabellen vorselektiert und dann wurde ein LOOP über alle gewählten Tabellen und alle vorhandenen Sprachen gemacht um das Kreuzprodukt ( je ein Eintrag kombiniert aus der Sprachen als auch der Tabellentabelle ) zu bilden und dann für jeden Eintrag zu entscheiden ob eine Übersetzung vorhanden ist oder nicht.

Wenn man an dieser grundsätzlichen Vorgehensweise nichts ändern wollte ( weil diese z.B. recht verständlich ist, gut debugbar und gut erkennbar ist was hier passieren soll und die Geschwindigkeit per se ausreichend ist ) sind folgende Sachen moniert bzw in den Lösungen geändert worden:
  • Statt SELECT * wirklich nur die benötigten Felder selektieren
  • Ein geschachtelter LOOP innerhalb dessen dann noch ein weitere SELECT auftritt wurde entschärft indem der SELECT auf die DD02T blockweise erfolgt und nicht mehr für jede Tabelle/Sprache einzeln
Aber das eigentliche Hauptziel dieser Knobelaufgabe war eigentlich zu versuchen möglichst viel des Codes an die Datenbank abzugeben um mit einem geschickt gewählten JOIN das Selbe zu erreichen.
Hier tauchten bei der Lösungssuche im Wesentlichen folgende Punkte auf
  • Wie erzeuge ich das Kreuzprodukt / JOIN wenn die beiden Tabellen keine gemeinsamen Felder haben ( selbst kein MANDT )
  • Wie bekomme ich das "X" in die Spalte, dass eine Übersetzung vorhanden ist
Fangen wir mal mit dem Kreuzprodukt an, weil der Ansatz hier stark releaseabhängig ist:
Wer auf einem wirklich neuen System unterwegs ist ( Release 7.51 aufwärts ) darf den neuen CROSS JOIN ( Kreuproduktbildung) verwenden welcher keine ON-Bedingung mehr erfordert: https://blogs.sap.com/2016/10/26/abap-n ... -abap-cds/

Code: Alles auswählen.

select ... 
  FROM t002 CROSS JOIN dd02l
Für ältere Releases muss man sich klar machen, dass man für ein Kreuzprodukt eine ON-Bedingung verwenden sollte, die immer "wahr" ist um alle Kombinationen zu erhalten. Einige Releases erlauben, dass in der ON-Bedingung keine der Tabellen auftaucht. Hier wäre "1 = 1 oder 'X' = 'X'". Ältere Releases hätten gerne, dass eine der beiden Tabellen in der ON-Bedingung auftaucht. Hier könnte z.B. ein "T002~SPRAS LIKE '%'" helfen. Einige Releases erlauben kein LIKE in der ON-Bedingung. Hier könnte ein T002~SPRAS <> '!' zum Ziel führen....

Code: Alles auswählen.

ON 1 = 1
ON T002~SPRAS LIKE '%'
ON T002~SPRAS <> '!'
..
Letztlich solltet ihr mitnehmen, dass die ON-Bedingung nicht immer wie

Code: Alles auswählen.

ON tabelle1~feld1 = tabelle2~feld2 AND
... aussehen muss sondern dass man hier durchaus kreativ werden kann wenn die Umstände es nötig machen.


Aber wie bekomme ich das "X" in die Spalte "Übersetzung vorhanden".
Fast alle Einsendungen sind hier den Weg über den LEFT JOIN gegangen. Die Methoden wie man dann aus dem "LEFT-Gejointen" Wert, wie auch immer ein "X" macht und umgekehrt waren unterschiedlich ( Folgendes habe ich gesehen: COALESCE, CASE, CONCAT ) so dass ich hier folgenden Ansatz als für mich klarsten erkoren habe:

Code: Alles auswählen.

  SELECT dd02l~tabname,
         t002~spras,
         CASE WHEN dd02t~tabname IS NOT NULL THEN 'X' END AS translation_exists
.
Aber gibt es auch Ansätze außerhalb des LEFT JOIN? Eine Einsendung hat das Kreuzprodukt über die Tabellen T002 und D002T gemacht ( ohne D002L ! ) und anschließend die Duplikate in einem 2. Statment via DELETE ADJACENT DUPLICATES entsorgt ( ich hoffe dass die Lösung bei pastebin hochgeladen wird - einfach ein anderer Ansatz ) und niemand hat den von mir eigentlich erwarteten Lösungsvorschlag bei dem die Aufgabe in einen JOIN (für die "X") und einen JOIN mit WHERE NOT EXISTS (für die "" ) aufgeteilt und dann mittels UNION diese beiden zusammenfügt.



Und jetzt noch der Hinweis, was diejenigen als Zusatzaufgaben erhalten hatten, die mich via PM mit ihrer Lösung kontaktiert hatten.
1.) Nur 1 SELECT ( was von einigen schon erfüllt wurde )
2.) Dieser SELECT soll so geschrieben sein, dass die Rückgabetabelle via INLINE-Deklaration erzeugt wird und de facto typgleich mit der Vorgabetabelle ist
3.) Einige bekamen noch die Aufgabe zu prüfen, ob das auch auf einem SEHR alten Release ( 7.01) möglich ist ( siehe pastebin von ADT ) da hier diverse Einschränkungen beim JOIN gelten
4.) Einige bekamen noch den Hinweis zu überlegen, ob es auch mit einem einzigen Befehl ohne LEFT JOIN funktionieren könnte.


Fazit: Mir hat es sehr viel Spaß gemacht . Ich war erstaunt in welchen Punkten die meisten Lösungen überein gestimmt hatten ( obwohl die Aufgabe das gar nicht vorgab) und wo dann doch im Detail bzw. nach Releasestand Abweichungen auftauchten.


P.S. Das Forum scheint eine Fuzzy-Logic eingebaut zu haben wo denn genau die Codingblöcke auftauchen. Wenn also ein Codingblock erscheint bitte selbständig überlegen wo ich den wohl wirklich eingebaut hatte bevor die Forumsanzeige den auf eine andere Zeile verschoben hat.

Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag (Insgesamt 8):
qyurryus (29. Aug 2019 15:15) • schick (29. Aug 2019 15:20) • abuma (29. Aug 2019 16:01) • Thomas R. (30. Aug 2019 06:46) • a-dead-trousers (30. Aug 2019 07:28) • Tron (30. Aug 2019 08:28) • masterhash (2. Sep 2019 11:02) • IHe (12. Sep 2019 08:09)

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de


Seite 1 von 1

Aktuelle Forenbeiträge

SELECT-OPTIONS: NO INTERVALS auch in Fenster Mehrfachselekti
vor 37 Minuten von DeathAndPain 7 / 7180
Lookup Tabelle in Methode lesen und erweitern
vor 46 Minuten von DeathAndPain 7 / 138
ABAP Editor gelöst
vor einer Stunde von DeathAndPain 7 / 124
Fehler bei F4-Hilfe
vor einer Stunde von DeathAndPain 5 / 103

Unbeantwortete Forenbeiträge

Mini-SAP Einstiegs Logo ändern
vor 21 Stunden von Tron 1 / 85
Absenderland in Transaktion BP setzen
Gestern von SAP_ENTWICKLER 1 / 73
Funktionsbaustein QPMK_MSTCHA_VERS_CREATE
vor einer Woche von SAP_ENTWICKLER 1 / 105
OLE 2 Excel Datum konvertieren
vor einer Woche von Kerstin 1 / 95