Typprüfung auf ein Feld in einer Struktur

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

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

Typprüfung auf ein Feld in einer Struktur

Beitrag von NLengner (ForumUser / 31 / 7 / 2 ) »
Hallo Zusammen,

ich spiele eine CSV ein, diese wandel ich in eine ITAB um und will diese eine Struktur anbinden. Dass ich die Daten ins richtige Feld der Struktur anbinde, nutze ich:

Code: Alles auswählen.

ASSIGN COMPONENT header[ sy-tabix ] OF STRUCTURE <structure> TO FIELD-SYMBOL(<cell>).
Soweit so gut, die Daten werden Theoretisch ins richtige Struktur Feld angebunden. Praktisch aber nicht, weil Währungsfelder so aussehen: "0,00". Das gibt einen Dumb.
Richtig sollte es so sein: "0.00"
Dafür nutze ich:

Code: Alles auswählen.

TRANSLATE field->* USING ',.'.
Das TRANSLATE soll nur bei Währungsfeldern, oder ähnliche Felder, ausgeführt werden.
Meine bisherigen Wege sind gewesen: DESCRIBE FIELD, FuBa: Numeric_check und (aktuelle Lage) die Methode applies_to_data im Datadescr siehe Code:

Code: Alles auswählen.

   LOOP AT lt_csv_tab REFERENCE INTO DATA(input).
      IF sy-tabix = 1.
        SPLIT input->* AT ';' INTO TABLE DATA(header).
        DATA(idx) = line_index( header[ table_line = 'SPRPS' ] ).
      ELSE.
        SPLIT  input->* AT ';' INTO TABLE DATA(fields).

        CHECK idx IS NOT INITIAL.
        READ TABLE fields INDEX idx ASSIGNING FIELD-SYMBOL(<test>).
        CHECK <test> IS INITIAL.

        structdescr ?= cl_abap_structdescr=>describe_by_data( <structure> ).

        LOOP AT fields REFERENCE INTO DATA(field).
          ASSIGN COMPONENT header[ sy-tabix ] OF STRUCTURE <structure> TO FIELD-SYMBOL(<cell>).

          datadescr ?= structdescr->get_component_type( header[ sy-tabix ] ).

          IF abap_true = datadescr->applies_to_data( currency_6 )
             OR abap_true = datadescr->applies_to_data( currency_8 )
             OR abap_true = datadescr->applies_to_data( currency_13 )
             OR abap_true = datadescr->applies_to_data( dezimals ).
            TRANSLATE field->* USING ',.'.
          ELSEIF abap_true = datadescr->applies_to_data( datum ).
            IF cl_abap_matcher=>matches( pattern = '\d\d\.\d\d.\d\d\d\d' text = field->* ).
              <cell> = |{ field->*+6(4) }{ field->*+3(2) }{ field->*(2) }|.
            ENDIF.
          ELSE.
            <cell> = field->*.
          ENDIF.

        ENDLOOP.
        INSERT <structure> INTO TABLE <infty>.
        CLEAR <structure>.
      ENDIF.

    ENDLOOP.
Dieser Code Funktioniert, für einen Speziellen Infotyp, weil ich mehrere Variablen erstellt habe und darauf Prüfe. Ich weiß aber nicht ob beim nächsten Infotyp die selben Currency felder mit 8 / 9 / 10 / ... / 13 zeichen sind. Und 30 variablen erstellen und darauf Prüfen ist in meinen Augen auch viel zu aufwendig. Habt ihr irgendwelche Tipps, wie ich das besser Prüfen kann?

Mit vielen Grüßen
NLengner :)

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


Re: Typprüfung auf ein Feld in einer Struktur

Beitrag von Somani (ForumUser / 81 / 12 / 20 ) »
Hallo

Du könntest die Ersetzung mittels Regex machen.
In diesem Fall: Ersetze alle , durch . wenn davor und danach eine Zahl ist. In Texten bleibt das , also erhalten.

Code: Alles auswählen.

REPLACE ALL OCCURRENCES OF REGEX '(\d),(\d)' IN field->* WITH '$1.$2'. 
Prinzipiell kannst das Regex auch gleich auf die ganze Tabelle los jagen, bevor dus in Zeilen und Felder zerlegst.

Grüsse

Re: Typprüfung auf ein Feld in einer Struktur

Beitrag von black_adept (Top Expert / 3943 / 105 / 886 ) »
Moin NLengner,
in datadescr hast du ja schon eine Typbeschreibung des Zielfeldes. Aber anstatt applies_to_data(...) kannst du alternativ den "TYPEKIND" der Beschreibung abprüfen und bei allen Zahlentypen die Umwandlung machen.

Code: Alles auswählen.

CASE datadescr->TYPE_KIND.
WHEN CL_ABAP_DATADESCR=>TYPEKIND_DECFLOAT
  OR CL_ABAP_DATADESCR=>TYPEKIND_DECFLOAT16
  OR CL_ABAP_DATADESCR=>TYPEKIND_DECFLOAT34
  OR CL_ABAP_DATADESCR=>TYPEKIND_FLOAT
  OR CL_ABAP_DATADESCR=>TYPEKIND_INT
  OR CL_ABAP_DATADESCR=>TYPEKIND_INT1
  OR CL_ABAP_DATADESCR=>TYPEKIND_INT2
  OR CL_ABAP_DATADESCR=>TYPEKIND_NUM
  OR CL_ABAP_DATADESCR=>TYPEKIND_PACKED.
   
Umwandlungscode


ENDCASE.

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

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Typprüfung auf ein Feld in einer Struktur

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
Dann frage doch den CL_ABAP_DATADESCR->GET_DATA_TYPE_KIND ab.

Code: Alles auswählen.

abap_typekind       type c length 1, " check CL_ABAP_TYPEDESCR for values

Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
NLengner


Re: Typprüfung auf ein Feld in einer Struktur

Beitrag von NLengner (ForumUser / 31 / 7 / 2 ) »
Manchmal ist man näher dran als man glaubt..

Danke euch vielmals!

@Somani,

das mit dem Regex über die ganze Tabelle möchte ich vermeiden, da Felder verändert werden könnten, die es gar nicht betreffen soll.

Stumpfes Beispiel: Infospalte mit dem Inhalt: "Die Inhalte von 1, 2, 3, 4 haben ....".
Am ende würde es so aussehen "Die Inhalte von 1. 2. 3. 4. haben ..".

Es soll wirklich nur auf currency Felder oder Dezimal Felder passieren, ohne das ich 100 variablen erstellen muss. :)

VG

Re: Typprüfung auf ein Feld in einer Struktur

Beitrag von Somani (ForumUser / 81 / 12 / 20 ) »
NLengner hat geschrieben:
19.11.2019 13:45
Stumpfes Beispiel: Infospalte mit dem Inhalt: "Die Inhalte von 1, 2, 3, 4 haben ....".
Am ende würde es so aussehen "Die Inhalte von 1. 2. 3. 4. haben ..".

Es soll wirklich nur auf currency Felder oder Dezimal Felder passieren, ohne das ich 100 variablen erstellen muss. :)
Du hast sicher recht, dass es nicht narrensicher ist. In dem Fall würde aber 1, 2, 3 bleiben wegen des Spaces :)

Seite 1 von 1

Vergleichbare Themen

0
Antw.
690
Views
Typprüfung von DB-Tabellen zur Compile-Zeit
von Bert84 » 18.05.2007 11:24 • Verfasst in ABAP® Core
2
Antw.
1678
Views
Struktur Feld vom Typen Type ref to
von JohnLocklay » 20.07.2018 15:09 • Verfasst in ABAP Objects®
3
Antw.
276
Views
Finden einer Variable/Feld/Struktur
von BecomingAnAbapGuru » 08.02.2022 19:45 • Verfasst in ABAP® für Anfänger
2
Antw.
6689
Views
Wie kann ich Feld einer tiefen Struktur füllen???
von c oco » 24.02.2011 16:29 • Verfasst in ABAP® für Anfänger
0
Antw.
1589
Views
FuBa für Konvert. einer Struktur (UNICODE) in ein Char-Feld
von ernst » 17.06.2005 14:13 • Verfasst in ABAP® Core

Über diesen Beitrag


Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

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

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.