Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- *&---------------------------------------------------------------------*
- *& Report ZZ_DIGIT_GROUPS
- *&---------------------------------------------------------------------*
- *& Zeichenfolge von rechts in Fünferblöcke gruppieren
- *& (wie in ESR-Einzahlungsscheinen die Referenznummern)
- *&---------------------------------------------------------------------*
- *& Es ist gut, sich in Übungsaufgaben dieser Art zu erproben,
- *& nicht weil es eine konkrete Arbeitsaufgabe wäre,
- *& sondern um sich an ihr zu fragen:
- *& • Was hat man für Möglichkeiten (Ideen für Algorithmen finden)?
- *& • Wird es besser unter Zuhilfenahme neuerer ABAP-Funktionen?
- *& • Wie lesbar wird der Code?
- *& • Wie lesbar bekommt man ihn überhaupt hin?
- *& • Und was für Vor- und Nachteile haben die Alternativen?
- *&---------------------------------------------------------------------*
- *& Ideen für Algorithmen
- *&---------------------------------------------------------------------*
- *& CONVERT_WITH_OFFSET :
- *& Offset-Zeiger wandert von rechts in Fünferschritten durch den String
- *& Dies ist die natürlichste Implementierungs-Idee
- *& CONVERT_WITH_SHIFT :
- *& Die Funktion shift_right( ) schiebt Fünferblöcke nach rechts
- *& CONVERT_WITH_REGEX :
- *& Globaler Replace des Ausdrucks `(\S{1,5})` durch `$1 `,
- *& dabei die Gruppierung mit einer Vorausschau-Bedingung kontrollieren
- *&---------------------------------------------------------------------*
- report zz_digit_groups.
- field-symbols: <p_digits> type c.
- " Nur für Algorithmen, die ein Typ-C-Feld benötigen
- " Unterprogramm to_char generiert ein C-Feld dynamischer Länge
- parameters: p_digits type string
- default '212190109010077040007'
- lower case. "(Es dürfte auch alles mit Buchstaben funktionieren)
- selection-screen comment /35(82) result.
- selection-screen skip.
- parameters:
- p_shift radiobutton group 001 default 'X',
- p_regex radiobutton group 001,
- p_offset radiobutton group 001.
- at selection-screen output.
- perform convert.
- at selection-screen.
- condense p_digits no-gaps.
- form convert.
- if p_offset eq 'X'.
- perform convert_with_offset.
- elseif p_regex eq 'X'.
- perform convert_with_regex.
- elseif p_shift eq 'X'.
- perform convert_with_shift.
- endif.
- endform.
- form convert_with_offset.
- clear result.
- * Idee: ein Zeiger wandert den String rückwärts in Fünferschritten
- data(lv_offset) = strlen( p_digits ) - 5.
- while lv_offset >= 0.
- result = p_digits+lv_offset(5) && ` ` && result.
- subtract 5 from lv_offset.
- endwhile.
- result = condense(
- substring( val = p_digits off = 0 len = 5 + lv_offset )
- && ` ` && result
- ).
- endform.
- form convert_with_shift.
- clear result.
- * Idee: iterativ mit SHIFT 5 Stellen nach rechts schieben
- * Dieser Algorithmus konsumiert den Input
- data(lv_input) = p_digits.
- while count_any_not_of( val = lv_input sub = ` ` ) >= 5.
- result = substring_before(
- val = lv_input
- regex = `$`
- len = 5 )
- && ` ` && result.
- lv_input = shift_right( val = lv_input places = 5 ).
- endwhile.
- result = condense( lv_input && ` ` && result ).
- endform.
- form convert_with_regex.
- result = p_digits.
- * Fünfergruppen mit dem Muster (\S{1,5}) finden und durch `$1 ` ersetzen
- * Die Vorausschau-Zusicherung kontrolliert die Gruppierung
- replace all occurrences of regex
- `(\S{1,5})(?=(\S{5})+\s*$)`
- in result
- with `$1 `.
- endform.
- * Falls für einen Algorithmus nötig, die eingegebene Ziffernfolge in ein Typ C-Feld der nötigen Länge verwandeln
- * War in den drei hier vorgestellten Lösungen nicht nötig
- form to_char.
- data: lv_char type ref to data,
- lv_len type i.
- lv_len = strlen( p_digits ).
- create data lv_char type c length lv_len.
- assign lv_char->* to <p_digits>.
- <p_digits> = p_digits.
- endform.
Add Comment
Please, Sign In to add comment