Zugriff auf dynamisch erzeugte Spaltennamen einer ITAB

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

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

Zugriff auf dynamisch erzeugte Spaltennamen einer ITAB

Beitrag von Akatash (ForumUser / 18 / 3 / 0 ) »
Hallo zusammen,

ich habe folgendes Problem. Ich generiere eine dynamische Tabelle (Siehe Screenshot), in welcher die Spaltennamen abhängig von der Eingabe im Selectionscreen aufgebaut werden. Das funktioniert auch alles wunderbar nur wenn ich für eine Berechnung auf die einzelnen Spalten zugreifen will, erhalte ich immer nur den Wert des Feldes. Ich benötige aber sogesehen die Spaltenbeschriftung als Wert um diese dann wieder weiter vergleichen zu können. In dem Feldsymbol <zmonth> müsste dann die jeweilige Spaltenbeschriftung als Wert übergeben werden.
Habe schon etliche Dinge versucht über Index usw., da ich natürlich erst während der Laufzeit weiß wie die Spalten letztendlich beschriftet sind. Fix sind immer nur die ersten 3 Spalten und danach hängt es ab von der Selektion. Vielleicht weiß da ja jemand wie man das schnell lösen kann, denn ich mir ziemlich sicher, dass es wahrscheinlich zwei Zeilen Code sind und ich komme nur nicht darauf. Danke für euere Hilfe schon mal !

Code: Alles auswählen.

        CALL METHOD go_alv_grid->get_selected_rows
          IMPORTING
            et_index_rows = lt_row.

        LOOP AT lt_row ASSIGNING <sel_rows>.
          READ TABLE <t_dyn_table> ASSIGNING <out> INDEX <sel_rows>-index.
          ASSIGN COMPONENT 'VBELN' OF STRUCTURE <out> TO <vbeln>.
          ASSIGN COMPONENT 'LABNK' OF STRUCTURE <out> TO <labnk>.
          ASSIGN COMPONENT 'ABRDT' OF STRUCTURE <out> TO <abrdt>.
*          ASSIGN COMPONENT '2016_10' OF STRUCTURE <out> TO <zmonth>.
*          ASSIGN COMPONENT spaltenname OF STRUCTURE <out> TO <zmonth>.
*          ASSIGN COMPONENT 'ZMONTH' OF STRUCTURE <out> TO <zmonth>.
          LOOP AT gt_res INTO ls_res WHERE labnk = <labnk>.
            IF ls_res-zmonth NE <zmonth>.
              ls_res-zmonth = <zmonth>.
              ls_res-vbeln = <vbeln>.
              ls_res-labnk  = <labnk>.
              ls_res-abrdt = <abrdt>.
              ls_res-wmeng = 0.
              MOVE-CORRESPONDING ls_res TO ls_abw.
              APPEND ls_abw TO lt_abw.

            ELSE.
              MOVE-CORRESPONDING ls_res TO ls_abw.
              APPEND ls_abw TO lt_abw.
            ENDIF.
          ENDLOOP.
        ENDLOOP.
Zuletzt geändert von Akatash am 15.09.2017 22:17, insgesamt 1-mal geändert.

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


Re: Zugriff auf dynamisch erzeugte Spaltennamen einer ITAB

Beitrag von black_adept (Top Expert / 4086 / 126 / 940 ) »
Es gibt eine dynamische Variante des Assign.

Code: Alles auswählen.

spaltenname = '2016_10'.  Assign component spaltenname of structure <out> to <abrdt>
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Zugriff auf dynamisch erzeugte Spaltennamen einer ITAB

Beitrag von ewx (Top Expert / 4844 / 311 / 640 ) »
Ein andere Möglichkeit wäre noch die Verwendung von feststehenden Feldnamen und einer Mappingtabelle.
Deine Tabelle hat fest die Felder
MONAT_01
MONAT_02
MONAT_03
usw.

Dann merkst du dir in einer Mappingtabelle, welcher Feldname zu welchem Monat gehört.
Die Beschriftung der Feldnamen kannst du im Feldkatalog anhand der Mappingtabelle machen.
Nicht benötigte Feldnamen kannst du über den Feldkatalog ausblenden.

Funktioniert natürlich nur, wenn du eine absehbare Anzahl von Spalten hast.

Re: Zugriff auf dynamisch erzeugte Spaltennamen einer ITAB

Beitrag von DeathAndPain (Top Expert / 1939 / 257 / 412 ) »
black_adept hat anscheinend Deinen Beispielcode nicht gelesen, sonst hätte er gesehen, dass Du so weit schon warst.

Wenn ich das richtig verstehe, ist Dein Problem, dass Du nicht weißt, wie die weiteren Spalten Deiner internen Tabelle überhaupt heißen, so dass Du nicht weißt, was Du hinter ASSIGN COMPONENT angeben sollst.

Es gibt einen Funktionsbaustein, der zu einer Struktur oder Tabelle die ganzen Spalten zurückliefert, aber den Aufwand musst Du gar nicht treiben. Du kannst nämlich hinter ASSIGN COMPONENT auch eine Integerzahl angeben, die die Nummer der gewünschten Spalte angibt.

Also machst Du einfach:

Code: Alles auswählen.

DO 100 TIMES. " die 100 sind willkürlich; Hauptsache mehr, als es jemals Spalten geben wird
  ASSIGN COMPONENT SY-INDEX OF STRUCTURE <out> TO <x>.
  IF SY-SUBRC <> 0. " Der ASSIGN dumpt nicht bei ungültiger Spaltennummer, sondern bringt einen SY-SUBRC <> 0
    EXIT. " DO
  ENDIF.

  PERFORM SPALTE_AUSGEBEN USING <x>.
ENDDO.

Re: Zugriff auf dynamisch erzeugte Spaltennamen einer ITAB

Beitrag von Akatash (ForumUser / 18 / 3 / 0 ) »
Erstmal danke an alle.

Ja das mit der Schleife über den Index habe ich auch schon gemacht, dann nen Assign anhand des Index in das Feldsymbol. Da die ersten 3 Spalten fix sind fängt also mein index bei 4 und und wird dann immer um eines erhöht. Mein Problem wo ich aber damit habe ist, dass in <zmonth> dann eben z.B.: der Wert 0 steht und nicht so wie ich es brauche 2016_10.
Ich brauch den Monat um dann in der If Anweisung abzufragen ob für diesen Monat Werte vorhanden sind und wenn nicht, dann soll er mir einfach eine Zeile mit dem Monat richtiger VBELN LABNK und ABRDT und WMENG = 0 anfügen. Deswegen ist es notwendig, dass ich eben den Monat aus jeder Spalte auslesen kann und zwar zur Laufzeit.
Evtl. habt ihr ja noch weiter Vorschläge...

Re: Zugriff auf dynamisch erzeugte Spaltennamen einer ITAB

Beitrag von DeathAndPain (Top Expert / 1939 / 257 / 412 ) »
Das Problem ist also, dass Du Nutzdaten im Namen der Spalte abgelegt hast statt in der Spalte selber. :-D

Da wirst Du nach meinem Dafürhalten über die Klasse CL_ABAP_TABLEDESCR gehen müssen. Unglaublicherweise hat diese Klasse sogar eine recht gut gepflegte Onlinedokumentation in der SE24. Damit holst Du Dir die Spaltennamen Deiner internen Tabelle, und damit machste dann weiter.

Re: Zugriff auf dynamisch erzeugte Spaltennamen einer ITAB

Beitrag von ewx (Top Expert / 4844 / 311 / 640 ) »
DeathAndPain hat geschrieben:Das Problem ist also, dass Du Nutzdaten im Namen der Spalte abgelegt hast statt in der Spalte selber. :-D

Da wirst Du nach meinem Dafürhalten über die Klasse CL_ABAP_TABLEDESCR gehen müssen. Unglaublicherweise hat diese Klasse sogar eine recht gut gepflegte Onlinedokumentation in der SE24. Damit holst Du Dir die Spaltennamen Deiner internen Tabelle, und damit machste dann weiter.
Das ist ja quatsch! Er baut doch seine Tabelle selbst auf. Also kann er sich auch selbst merken, welches Feld verwendet wird.
Nach diesem Muster wird das dann ein extrem umständliches Programm, weil man meint, alles dynamisch aufbauen und verwalten und dynamisch darauf zugreifen zu müssen. Was aber definitiv nicht sein muss.

Wenn du mit Index arbeitest, dann guckst du in deinen Feldkatalog oder die zur Generierung verwendeten Tabelle und siehst, dass bei Index 4 der Feldname 2016_05 heißt.
Oder du loopst gleich deinen Feldkatalog ab und machst Spalte für Spalte (anstelle von Index) den von black_adept vorgeschlagenen Assign, den du ja bereits in deinem Coding stehen hast.

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


Seite 1 von 1

Vergleichbare Themen

2
Antw.
6780
Views
describe_by_name für dynamisch erzeugte ITAB
von Der Formulator » 12.11.2021 15:07 • Verfasst in ABAP® Core
8
Antw.
4174
Views
Select/Endselect in dynamisch erzeugte itab
von nickname8 » 20.07.2015 13:15 • Verfasst in ABAP® für Anfänger
2
Antw.
3210
Views
Dynamisch erzeugte ITAB, ASSIGN, wie kriege ich die Struktur
von enneos » 12.07.2007 16:10 • Verfasst in ABAP® Core
1
Antw.
724
Views
Beim Loop dynamisch den Spaltennamen setzen
von kaim77 » 13.09.2019 17:30 • Verfasst in ABAP® Core
2
Antw.
4163
Views
Dynamisch erzeugte Tabelle erweitern
von ewx » 18.01.2007 14:57 • Verfasst in ABAP Objects®

Ü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.

Unbeantwortete Forenbeiträge

Daten an Tabelle binden
vor 10 Stunden von Bright4.5 1 / 216
aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 1858
Hilfe bei SWEC/SWE2
letzen Monat von retsch 1 / 8460