Code: Alles auswählen.
REPORT zss_knobel_2021_06 LINE-SIZE 1000.
CLASS lcl DEFINITION FINAL.
PUBLIC SECTION.
TYPES: BEGIN OF ts_result,
offset TYPE i,
tier TYPE string,
END OF ts_result.
TYPES: tt_results TYPE STANDARD TABLE OF ts_result WITH EMPTY KEY.
METHODS:
constructor,
main,
your_analysis IMPORTING iv_order TYPE string
RETURNING VALUE(rt_results) TYPE tt_results.
DATA: mt_tiere TYPE STANDARD TABLE OF string WITH EMPTY KEY.
ENDCLASS.
PARAMETERS: p_order TYPE string LOWER CASE DEFAULT '32 Pfannkuchen mit Apfelmus und 3x Schlemmerplatte rot/weiß'.
END-OF-SELECTION.
NEW lcl( )->main( ).
CLASS lcl IMPLEMENTATION.
METHOD your_analysis.
APPEND VALUE #( offset = 3 tier = 'Pfau' ) TO rt_results.
APPEND VALUE #( offset = 20 tier = 'Pferd' ) TO rt_results.
APPEND VALUE #( offset = 24 tier = 'Muschel' ) TO rt_results.
APPEND VALUE #( offset = 35 tier = 'Schwein' ) TO rt_results.
APPEND VALUE #( offset = 38 tier = 'Lemming' ) TO rt_results.
APPEND VALUE #( offset = 51 tier = 'Rotkehlchen' ) TO rt_results.
APPEND VALUE #( offset = 55 tier = 'Weinbergschnecke' ) TO rt_results.
ENDMETHOD.
METHOD main.
DATA(lt_suspects) = me->your_analysis( p_order ).
LOOP AT lt_suspects ASSIGNING FIELD-SYMBOL(<ls_suspect>).
AT FIRST.
WRITE:/ 'Verdächtige Bestellung :', p_order.
ENDAT.
NEW-LINE.
POSITION 20.
IF <ls_suspect>-offset > 0.
WRITE p_order(<ls_suspect>-offset) NO-GAP.
ENDIF.
WRITE p_order+<ls_suspect>-offset(3) COLOR 6 NO-GAP.
DATA(lv_offset_plus_3) = <ls_suspect>-offset + 3.
IF lv_offset_plus_3 < strlen( p_order ).
WRITE p_order+lv_offset_plus_3 NO-GAP.
ENDIF.
WRITE AT 120 <ls_suspect>-tier COLOR 7.
ENDLOOP.
ENDMETHOD.
METHOD constructor.
DATA: lv_tiere TYPE string.
lv_tiere = 'Aal;Bandwurm;Coyote;Eber;Fasan;Gans;Hahn;Igel;Kabeljau;Lama;Made;Nacktmull;Panda;Rabe;Sardelle;Tarantel;Wal;Yak'
&& ';Adler;Bär;Dachs;Echse;Faultier;Geier;Hai;Iltis;Käfer;Nashorn;Ratte;Säbelzahntiger;Waran;Zander'
&& ';Affe;Barsch;Delfin;Eichhörnchen;Flamingo;Gemse;Hamster;Impala;Kamel;Nilpferd;Papagei;Raupe;Salamander;Tausendfüßler;Zebra'
&& ';Aguti;Beluga;Dodo;Eisbär;Floh;Gepard;Heilbutt;Ibis;Känguruh;Laus;Makrele;Ochse;Pelikan;Reh;Thunfisch;Wasserbüffel;Ziege'
&& ';Alligator;Biber;Dogge;Elch;Flunder;Giraffe;Hering;Jaguar;Karpfen;Leguan;Manta;Okapi;Pfau;Rentier;Tiger;Weinbergschnecke;Zitronenfalter'
&& ';Ameisenbär;Biene;Dompfaff;Emu;Forelle;Goldfisch;Hirsch;Katze;Lemming;Marabu;Orang-Utan;Pferd;Riesenkrake;Seeadler;Tintenfisch;Wespe'
&& ';Amöbe;Bison;Dorsch;Ente;Frosch;Gorilla;Holzwurm;Klapperschlange;Leopard;Maulwurf;Otter;Pinguin;Robbe;Silberfisch;Trampeltier;Wiesel'
&& ';Amsel;Blattlaus;Drossel;Esel;Fuchs;Grizzlybär;Hornisse;Koala;Libelle;Pottwal;Rochen;Spatz;Truthahn;Windhund'
&& ';Assel;Grauwal;Eule;Guppy;Huhn;Kranich;Löwe;Meerschwein;Puma;Rotkehlchen;Specht;Tsetsefliege;Wolf'
&& ';Auster;Bonobo;Hummer;Kröte;Luchs;Mistkäfer;Pute;Spinn;Uhu;Wombat'
&& ';Büffel;Hund;Kuh;Lurch;Milbe;Qualle;Stachelschwein;Vielfraß;Wurm;Bussard;Hyäne;Mondfisch;Stör;Vogelspinne;Motte;Schwein;Möwe;Mungo;Mücke;Murmeltier;Muschel'.
SPLIT lv_tiere AT ';' INTO TABLE me->mt_tiere.
ENDMETHOD.
ENDCLASS.
Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag (Insgesamt 3):
qyurryus • Haubi • christianguenter
Code: Alles auswählen.
Pseudocode:
LOOP AT 3-buchstabie Teilstrings
LOOP AT 3-buchstabige Schlüsselwörter WHERE 3-buchstabiges-Schlüsselwort = 3-
buchstabiger Teilstring.
Add entry to returntable.
ENDLOOP
ENDLOOP
Code: Alles auswählen.
Pseudocode:
LOOP AT 3-buchstabige Schlüsselwörter
LOOP AT 3-buchstabige Teilstrings WHERE 3-buchstabiger-Teilstring= 3-
buchstabiges Scjhlüsselwort.
Add entry to returntable.
ENDLOOP
ENDLOOP
Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
christianguenter
Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag (Insgesamt 2):
christianguenter • black_adept
Folgende Benutzer bedankten sich beim Autor christianguenter für den Beitrag (Insgesamt 4):
black_adept • ewx • a-dead-trousers • qyurryus
Code: Alles auswählen.
METHOD your_analysis.
TYPES:
BEGIN OF ty_tiere,
key TYPE c LENGTH 3,
tier TYPE string,
END OF ty_tiere.
TYPES ty_tiere_t TYPE HASHED TABLE OF ty_tiere WITH UNIQUE KEY key.
DATA tier_map TYPE ty_tiere_t.
LOOP AT mt_tiere REFERENCE INTO DATA(tier).
INSERT VALUE #( key = to_upper( tier->*(3) ) tier = tier->* ) INTO TABLE tier_map.
ENDLOOP.
DATA(offset) = 2.
DATA(word_key) = VALUE string( ).
word_key = to_upper( | { p_order+0(2) }| ).
DO.
TRY.
DATA(char) = to_upper( p_order+offset(1) ).
CATCH cx_sy_range_out_of_bounds.
EXIT.
ENDTRY.
word_key = |{ word_key+1(2) }{ char }|.
DATA(_tier) = VALUE #( tier_map[ key = word_key ] OPTIONAL ).
IF _tier IS NOT INITIAL.
APPEND VALUE #( offset = offset - 2 tier = _tier-tier ) TO rt_results.
ENDIF.
offset = offset + 1.
ENDDO.
ENDMETHOD.
Folgende Benutzer bedankten sich beim Autor qyurryus für den Beitrag (Insgesamt 3):
ewx • black_adept • christianguenter
Code: Alles auswählen.
METHOD your_analysis.
CLEAR rt_results.
LOOP AT me->mt_tiere ASSIGNING FIELD-SYMBOL(<ld_tier>).
FIND ALL OCCURRENCES OF CONV char3( <ld_tier> ) IN iv_order IGNORING CASE RESULTS DATA(lt_match).
LOOP AT lt_match ASSIGNING FIELD-SYMBOL(<ls_match>).
APPEND VALUE #( offset = <ls_match>-offset tier = <ld_tier> ) TO rt_results.
ENDLOOP.
ENDLOOP.
SORT rt_results BY offset.
ENDMETHOD.
Code: Alles auswählen.
METHOD your_analysis.
* Initialisierungscode ************************************************
DATA(ld_regex) = shift_left( val = REDUCE string( INIT str TYPE string FOR <ld_tier> IN me->mt_tiere NEXT str = str && '|' && CONV char3( <ld_tier> ) ) places = 1 ).
* Eigentliche Suche ***************************************************
CLEAR rt_results.
IF ld_regex IS NOT INITIAL.
FIND ALL OCCURRENCES OF REGEX ld_regex IN iv_order IGNORING CASE RESULTS DATA(lt_match).
LOOP AT lt_match ASSIGNING FIELD-SYMBOL(<ls_match>).
FIND FIRST OCCURRENCE OF iv_order+<ls_match>-offset(<ls_match>-length) IN TABLE me->mt_tiere IGNORING CASE MATCH LINE DATA(ld_line).
IF sy-subrc EQ 0.
APPEND VALUE #( offset = <ls_match>-offset tier = me->mt_tiere[ ld_line ] ) TO rt_results.
ENDIF.
ENDLOOP.
SORT rt_results BY offset.
ENDIF.
ENDMETHOD.
Code: Alles auswählen.
METHOD your_analysis.
* Initialisierungscode ************************************************
DATA(ld_regex) = shift_left( val = REDUCE string( INIT str TYPE string FOR <ld_tier> IN me->mt_tiere NEXT str = str && '|' && CONV char3( <ld_tier> ) ) places = 1 ).
* Eigentliche Suche ***************************************************
CLEAR rt_results.
IF ld_regex IS NOT INITIAL.
DATA(ld_offset) = 0.
WHILE ld_offset GE 0.
ld_offset = find( val = iv_order regex = ld_regex case = abap_false off = ld_offset ).
IF ld_offset GE 0.
FIND FIRST OCCURRENCE OF REGEX |^{ iv_order+ld_offset(3) }| IN TABLE me->mt_tiere IGNORING CASE MATCH LINE DATA(ld_line).
IF sy-subrc EQ 0.
APPEND VALUE #( offset = ld_offset tier = me->mt_tiere[ ld_line ] ) TO rt_results.
ENDIF.
ADD 3 TO ld_offset.
ENDIF.
ENDWHILE.
SORT rt_results BY offset.
ENDIF.
ENDMETHOD.
Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag (Insgesamt 3):
ewx • black_adept • christianguenter
a-dead-trousers hat geschrieben: ↑25.06.2021 16:56Aber nachdem ich jetzt den Ansatz von christianguenter gesehen hab [...] ist das was, was ich mir mit Sicherheit für das eine oder andere Projekt noch abkupfern werde. Vielen Dank. Man lernt wahrlich nie aus.
Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag (Insgesamt 2):
christianguenter • qyurryus