Variable mit 0 auffüllen

Getting started ... Alles für einen gelungenen Start.
4 Beiträge • Seite 1 von 1
4 Beiträge Seite 1 von 1

Variable mit 0 auffüllen

Beitrag von Murdock (Specialist / 129 / 60 / 11 ) »
Ich möchte eine Variable, in der eine Seriennummer steht, mit 0 auffüllen, sofern die Länge < 10 ist. Wenn sie < 6 ist, dann auf 6 Stellen, ansonsten auf 10 Stellen auffüllen.

Der Code unten funktioniert und macht nun das was er soll. Anfangs jedoch nicht...

Das "Problem" war, dass ich als ABAP Anfänger :? zuerst die Var. lv_snr vom gleichen Typ gemacht habe, wie pi_snr (sprich c(24)).
Alle Abfragen auf die Länge mittels strlen lieferten dass, was ich erwartete. Die extra eingefügte Längenabfrage nach dem SHIFT lieferte auch 6 oder 10. Die F1-Hilfe zu Overlay sagt: "Falls die Längen von text1 und text2 unterschiedlich sind, wird text1 nur über die kleinere Länge bearbeitet. "

In meiner ABAP-mässigen Naivität bin ich also davon ausgegangen, dass etwas was laut ABAP Funktion (strlen) die Länge von 6 Stellen hat (' 1'), überlagert mit etwas 10 stelligem ('0000000000'), etwas 6 stelliges als Ergebnis liefern muss, nämlich '000001'.
Das Ergebnis war aber '0000010000'. :(

Dass es am Datentyp von lv_snr (c(24)) lag, ist mir ja klar. Was aber so verwirrend ist, dass ABAP mir sagt, die Variable sei nur mit 6 Stellen gefüllt, behandelt sie dann aber doch so, als ob sie 24 Stellen hätte... Kann da jemand mal ein, zwei klärende Worte zu sagen? :|

Danke.


Code: Alles auswählen.

* pi_snr ist vom Typ c(24) und beinhaltet die Seriennummer

  DATA: lv_snr          TYPE string,
        lv_laenge_snr   TYPE i, " Länge SNr
        lv_anz_stellen  TYPE i  " Anzahl Stellen, die die SNR verschoben werden soll
        .

*     Die Seriennr soll auf 6 oder 10 Stellen aufgefüllt werden
      lv_snr = pi_snr.
      lv_laenge_snr = strlen( lv_snr ).

      CLEAR lv_anz_stellen.

* Seriennr auf 6 oder 10 Stellen erweitern
      IF lv_laenge_snr < 6.
        lv_anz_stellen = 6 - lv_laenge_snr.
      ELSEIF lv_laenge_snr > 6 AND lv_laenge_snr < 10.
        lv_anz_stellen = 10 - lv_laenge_snr.
      ENDIF.

      IF lv_anz_stellen IS NOT INITIAL.
        SHIFT lv_snr BY lv_anz_stellen PLACES RIGHT.
        lv_laenge_snr = strlen( lv_snr ). " Debug
      ENDIF.

      OVERLAY lv_snr WITH '0000000000'.


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


Re: Variable mit 0 auffüllen

Beitrag von black_adept (Top Expert / 4134 / 131 / 956 ) »
Hallo Murdock,

es gibt da mindestens 2 recht einfache lkösungen für dein Problem. Und beide benutzen andere Befehle als OVERLAY.

Möglichkeit 1: Falls deine Seriennummer tatsächlich immer rein nummerisch ist schiebe deine Integerzahl in ein Feld vom Typ N in der korrekten Länge.
Möglichkeit 2: Alternativ und wenn auch Buchstaben vorkommen können ist die verwendung des FuBa "CONVERSION_EXIT_ALPHA_INPUT" mit einem Zielfeld der gewünschten Länge.

Meine Lieblingslösung ist Möglichkeit 2. Verwendung von Konvertierungsexits - insbesondere die ALPHA-Konvertierung braucht man immer wieder.

Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
Murdock

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Variable mit 0 auffüllen

Beitrag von Murdock (Specialist / 129 / 60 / 11 ) »
Hallo black_adept,

danke für die Antwort und die Hinweise auf alternative Lösungsmöglichkeiten. Eventuell werde ich davon eine benutzen :wink:
Aber meine Lösung funktioniert ja schon (und immerhin bin ich selbst drauf gekommen :D ). Worum es mir hier hauptsächlich geht, ist dass für mich etwas verwirrende Verhalten von ABAP.
Murdock hat geschrieben: Dass es am Datentyp von lv_snr (c(24)) lag, ist mir ja klar. Was aber so verwirrend ist, dass ABAP mir sagt, die Variable sei nur mit 6 Stellen gefüllt, behandelt sie dann aber doch so, als ob sie 24 Stellen hätte... Kann da jemand mal ein, zwei klärende Worte zu sagen? :|
Gruß,
Murdock.

Re: Variable mit 0 auffüllen

Beitrag von edwin (Specialist / 306 / 11 / 68 ) »
Hi,
das hat mit den verschiedenen Typen zu tun, die Definition Data ... C(24). bedeutet - es wird ein 24 Char langer Bereich reserviert, mit STRLEN( ...) wird dabei nur der gefüllte Bereich berechnet, die Gesamtlänge ist aber weiterhin 24 Stellen ! Overlay betrachtet den gesamten 24-stelligen Bereich und nicht nur den gefüllten. Bei Data ... type String wird dynamisch der Bereich reserviert, bei der Zuordnung String = '000001' ist dann der gefüllte Bereich UND die Länge 6 und Overlay wird dann auch nur auf diese 6 Stellen angewendet.

/Edwin

Folgende Benutzer bedankten sich beim Autor edwin für den Beitrag:
Murdock


Seite 1 von 1

Vergleichbare Themen

3
Antw.
2300
Views
Auffüllen mit Nullen
von nachtfalkeBS » 25.04.2008 14:36 • Verfasst in ABAP® für Anfänger
5
Antw.
14170
Views
Führende Nullen auffüllen
von ChrissixD » 24.03.2017 12:59 • Verfasst in ABAP® für Anfänger
3
Antw.
2124
Views
Parameter automatisch auffüllen
von made » 26.07.2005 10:30 • Verfasst in ABAP® für Anfänger
2
Antw.
1523
Views
Initial-Felder auffüllen
von knut » 05.07.2005 11:58 • Verfasst in ABAP® Core
4
Antw.
7226
Views
numc - Feld mit 0 auffüllen
von MarkusW » 18.04.2007 17:40 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

RFC vs. ODATA
vor 5 Tagen von DeathAndPain 8 / 1994
FUBA 'HR_INFOTYPES_OPERATION'
vor 5 Tagen von DeathAndPain 2 / 1173
Frage zur redefinierten Methode
vor einer Woche von ralf.wenzel 12 / 2398

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.