Denkanstoß bei ASSIGN Field-Symbols

Getting started ... Alles für einen gelungenen Start.
16 Beiträge • Seite 1 von 2 (current) Nächste
16 Beiträge Seite 1 von 2 (current) Nächste

Denkanstoß bei ASSIGN Field-Symbols

Beitrag von sapdepp (Specialist / 218 / 37 / 2 ) »
Hallo,

ich habe ein kleines Denkproblem mit dem Assigning bei FIELD-SYMBOLS.
Ich habe 100 Variablennamen z1 bis z100 aus einem Unterprogramm. Diese Variablen erhalten zur Laufzeit jeweils Zahlen vom Typ P mit 2 Nachkommastellen. Nun möchte ich gern die Variableninhalte per WHILE-Schleife (1 bis 100) in den FuBa ROUND übergeben und kaufmännisch auf einen absoluten Wert runden. So weit, so gut. Ich möchte aber abhängig vom Zähler in der Schleife (1 ... 100) den Wert(!) der Lauf-Variable z1 bis z100 in den FuBa übertragen, nicht den Variablennamen selber. Im u. g. Bsp. wird der Var.namen übergeben z1, z2, z3 ... z100. Wie löse ich das am besten? Mit einer Itab? Ich bitte um hilfreiche Seitentritte. Besten Dank.

Hier ein einfaches Bsp.:

Code: Alles auswählen.

data: counter(3) type c,
      fs(4) TYPE c.

FIELD-SYMBOLS: <l_var> TYPE ANY.

COUNTER = 1.

while counter < 101.

  CONCATENATE 'z' COUNTER INTO fs.

  ASSIGN fs to <l_var>.

  IF <l_var> IS ASSIGNED.

      "Hier muss der Zahlenwert in <l_var> übertragen werden, z. B.
      "<l_var> = 1.34 an statt <l_var> = 'z1'

      CALL FUNCTION 'ROUND'
        EXPORTING
          DECIMALS = 0
          INPUT    = <l_var>
          SIGN     = 'X'
        IMPORTING
          OUTPUT   = <l_var>.

  ENDIF.

  COUNTER = COUNTER + 1.

ENDWHILE.

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


Re: Denkanstoß bei ASSIGN Field-Symbols

Beitrag von jensschladitz (Specialist / 417 / 0 / 56 ) »
sapdepp hat geschrieben:Hallo,

ich habe ein kleines Denkproblem mit dem Assigning bei FIELD-SYMBOLS.
Ich habe 100 Variablennamen z1 bis z100 aus einem Unterprogramm. Diese Variablen erhalten zur Laufzeit jeweils Zahlen vom Typ P mit 2 Nachkommastellen. Nun möchte ich gern die Variableninhalte per WHILE-Schleife (1 bis 100) in den FuBa ROUND übergeben und kaufmännisch auf einen absoluten Wert runden. So weit, so gut. Ich möchte aber abhängig vom Zähler in der Schleife (1 ... 100) den Wert(!) der Lauf-Variable z1 bis z100 in den FuBa übertragen, nicht den Variablennamen selber. Im u. g. Bsp. wird der Var.namen übergeben z1, z2, z3 ... z100. Wie löse ich das am besten? Mit einer Itab? Ich bitte um hilfreiche Seitentritte. Besten Dank.

Hier ein einfaches Bsp.:

Code: Alles auswählen.

data: counter type c,
      fs(4) TYPE c.

FIELD-SYMBOLS: <l_var> TYPE ANY.

COUNTER = 1.

while counter < 101.

  CONCATENATE 'z' COUNTER INTO fs.

  ASSIGN fs to <l_var>.

  IF <l_var> IS ASSIGNED.

      "Hier muss der Zahlenwert in <l_var> übertragen werden, z. B.
      "<l_var> = 1.34 an statt <l_var> = 'z1'

      CALL FUNCTION 'ROUND'
        EXPORTING
          DECIMALS = 0
          INPUT    = <l_var>
          SIGN     = 'X'
        IMPORTING
          OUTPUT   = <l_var>.

  ENDIF.

  COUNTER = COUNTER + 1.

ENDWHILE.

Sali,

also beim Concatenate ein grosses Z rein und dann dein nachfolgender Assign um fs eine Klammer - also assign (fs) to l_var - das bedeutet der Inhalt von Feld Z... wird in das Feldsymbol gestellt (siehe Doku zu assign - da hat es irgendwo ein solches Beispiel)

Gruss Jens

Folgende Benutzer bedankten sich beim Autor jensschladitz für den Beitrag:
sapdepp

thanks Jens

Re: Denkanstoß bei ASSIGN Field-Symbols

Beitrag von sapdepp (Specialist / 218 / 37 / 2 ) »
Besten Dank. Ich sah den Wald vor lauter Bäumen nicht. Mein Username ist hier Programm ... :o

VG
sapdepp

Re: Denkanstoß bei ASSIGN Field-Symbols

Beitrag von sapdepp (Specialist / 218 / 37 / 2 ) »
Habe doch noch eine Frage. Ich möchte nun die 100 gerundeten Werte (z1 ... z100) in derselben Schleife wieder in eine andere Variable zurückschreiben, die da heißt: w1 ... w100, halt je nach Schleifenzähler.
Mit <l_var2> = <l_var1> wird das natürlich nichts, weil <l_var2> den gerundeten Wert enthält.
Aussehen soll es so in der Schleife, wobei die Zahl hinter "w" dem Schleifen-Zähler entspricht:

w1 = <l_var1> "l_var1 des 1. Durchlaufs
w2 = <l_var1> "l_var1 des 2. Durchlaufs
...
w100 = <l_var1> "l_var1 des 100. Durchlaufs

Später werden die Werte w1 bis w100 weiterverwendet.

Gibt es dafür eine elegante Lösung?

Danke und Gruß

Re: Denkanstoß bei ASSIGN Field-Symbols

Beitrag von black_adept (Top Expert / 4099 / 128 / 941 ) »
Siehe F1-Doku zu ASSIGN...COMPONENT...
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Denkanstoß bei ASSIGN Field-Symbols

Beitrag von ewx (Top Expert / 4849 / 313 / 642 ) »
:o das gleiche, was du mit Znnn machst, brauchst du doch nur mit Wnnn zu machen?!
ASSIGN COMPONENT hilft hier ja nicht viel, da die "Wariablen" ja nicht in einer Struktur sind.
Was aber natürlich ändern könnte... 8)

Re: Denkanstoß bei ASSIGN Field-Symbols

Beitrag von black_adept (Top Expert / 4099 / 128 / 941 ) »
@ewx: 100 durchnummerierte Variablen die nicht in einer Struktur sind? Das macht doch keiner. Die w1,...,w100 sind bestimmt Bestandteile einer Struktur und da passt das Assign...component dann doch :o)
@Jens & sapdepp:
sapdepp und jensschladitz hat geschrieben:

Code: Alles auswählen.

...
  CONCATENATE 'z' COUNTER INTO fs.

  ASSIGN fs to <l_var>.
...
Müsste das nicht jeweils so heißen ( Runde Klammern um das fs )

Code: Alles auswählen.

  CONCATENATE 'z' COUNTER INTO fs.

  ASSIGN (fs) to <l_var>.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Denkanstoß bei ASSIGN Field-Symbols

Beitrag von jensschladitz (Specialist / 417 / 0 / 56 ) »
Sali,

nun das mit den Klammern hatte ich doch im Posting drin - denn ist ja korrekt - sonst passt es ja nicht - man bekommt dann nicht den Wert sondern den Namen des Feldes :D

Gruss Jens
thanks Jens

Re: Denkanstoß bei ASSIGN Field-Symbols

Beitrag von sapdepp (Specialist / 218 / 37 / 2 ) »
Nur noch mal vereinfacht: w1 bis w100 sind z. B. Komponenten einer Struktur w. Ich möchte mit ASSIGN die Werte der Variablen w1 bis w100 dynamisch anhand des Schleifenzählers ändern. In z1 bis z100 stehen je nach Schleifen-Index gerundete Zahlenwerte, die ich dann dem jeweiligen w"index" zuweisen möchte, also w-w1 = z1, w-w2 = z2 usw. Ich muss erreichen, dass das in etwa am Ende so aussieht, wobei z1=1,4; z2=1,5; z3=1,3; z4=1,2 ... z100=1,6 ist.

w1 = 1,4
w2 = 1,5
w3 = 1,3
w4 = 1,2
...
w100 = 1,6

Ich möchte mir halt nur die Codingzeilen ersparen und alles dynamisch mit dem Schleifenindex lösen ...

Re: Denkanstoß bei ASSIGN Field-Symbols

Beitrag von ewx (Top Expert / 4849 / 313 / 642 ) »
black_adept hat geschrieben:Siehe F1-Doku zu ASSIGN...COMPONENT...

Re: Denkanstoß bei ASSIGN Field-Symbols

Beitrag von sapdepp (Specialist / 218 / 37 / 2 ) »
Mit dem ASSIGN COMPONENT komme ich nicht richtig weiter ... Mal ein sehr einfaches Codingbsp. meines Anliegens:

Code: Alles auswählen.

DATA: counter(2) type n,
      P_VAR TYPE P DECIMALS 2,
      C_VAR(6) TYPE c,
      fs1 TYPE string.

DATA: BEGIN OF wa,
          Z00(35) type c,
          Z01(30) type c,
          Z02(20) TYPE c,
          Z03(20) type c,
          Z04(20) type c,
          Z05(20) type c,
      END OF wa.

DATA excel LIKE STANDARD TABLE OF wa.

DATA: z00(20) TYPE c,
      z01(20) TYPE c,
      z02 TYPE p DECIMALS 2,
      z03 TYPE p DECIMALS 2,
      z04 TYPE p DECIMALS 2,
      z05 TYPE p DECIMALS 2.

FIELD-SYMBOLS: <wa> TYPE ANY,
               <f1> TYPE ANY,
               <f2> TYPE ANY,
               <f3> TYPE ANY.

"die Werte von z kommen aus einer Perform;
"hier nun Bsp-werte
z00 = 'Müller'.
z01 = 'Axel'.
z02 = '1.34'.
z03 = '1.45'.
z04 = '1.32'.
z05 = '1.56'.

ASSIGN wa to <wa>. "Zuweisen der Zeilenstruktur von wa
ASSIGN C_VAR to <f3>.

COUNTER = 02. "bei 02 anfangen wegen z02

while counter < 06.

  CONCATENATE 'Z' COUNTER INTO fs1.
  ASSIGN (fs1) to <f1>. "Zuweisung Inhalt von z-index

  IF <f1> IS ASSIGNED.

    P_VAR = <f1>. "<f1> muss im FuBa ein Zahlenwert sein, deshalb Typ P

    CALL FUNCTION 'ROUND'
      EXPORTING
        DECIMALS = 1
        INPUT    = P_VAR
        SIGN     = 'X'
      IMPORTING
        OUTPUT   = P_VAR.

    C_VAR = P_VAR. "aus P-Typ einen C-Typ machen wegen div. Anpassungen

    ASSIGN fs1 to <f2>. "Zuweisung Name der Variable

    REPLACE ALL OCCURRENCES OF '.' IN C_VAR WITH ','.
    CONDENSE C_VAR NO-GAPS.

*    ASSIGN COMPONENT <f2> OF STRUCTURE <wa> to ...

  ENDIF.

  COUNTER = COUNTER + 1.

ENDWHILE.

APPEND WA TO EXCEL.

*Listenanzeige soll so aussehen (ohne die Überschriften wa-zxx)

*wa-z00   wa-z01    wa-z02    wa-z03   wa-z04   wa-z05
*
*Müller   Axel      1,3       1,5      1,3      1,6
Dort, wo ASSIGN COMPONENT kommentiert ist, soll quasi das hier in einem Zug dynamisch hinein, sodass ich mir in meinem echten Bsp. Hunderte von Zeilen erspare ...

Schreibe den Inhalt von z02 nach wa-z02
Schreibe den Inhalt von z03 nach wa-z03
Schreibe den Inhalt von z04 nach wa-z04
Schreibe den Inhalt von z05 nach wa-z05

Nach der Schleife werden dann alle wa-z00 bis wa-z05 mit APPEND in die Struktur EXCEL angehängt, und zwar in einer Zeile. Logisch.

Bitte nicht über Sinn oder Unsinn des Beispiels debattieren, es ist wie gesagt nur ein einfaches Coding meines Anliegens ... ;-)

VD
sapdepp

Re: Denkanstoß bei ASSIGN Field-Symbols

Beitrag von JHM (Top Expert / 1197 / 1 / 197 ) »
sapdepp hat geschrieben:Dort, wo ASSIGN COMPONENT kommentiert ist, soll quasi das hier in einem Zug dynamisch hinein, sodass ich mir in meinem echten Bsp. Hunderte von Zeilen erspare ...

Schreibe den Inhalt von z02 nach wa-z02
Schreibe den Inhalt von z03 nach wa-z03

Code: Alles auswählen.

* Bei Namensgleichheit (Quell- zu Zielfeld):
ASSIGN COMPONENT (fs1) OF STRUCTURE <wa> to <fs_irgendwas>.
* oder über Schleifenzähler:
ASSIGN COMPONENT sy-index OF STRUCTURE <wa> to <fs_irgendwas>.
Gruß Hendrik

Re: Denkanstoß bei ASSIGN Field-Symbols

Beitrag von sapdepp (Specialist / 218 / 37 / 2 ) »
Das mit der runden Klammer wird nix, und die zweite Zeile meine ich anders. Ich vermute, ich erkläre es falsch. :-(

Ich möchte ganz einfach zur Laufzeit die Struktur wa mit den Werten aus z füllen. Z ist keine Struktur, die Werte z00 bis z99 liegen einzeln vor. Da es 100 Spalten in wa gibt, und zwar wa-z00 bis wa-z99, dachte ich mir, nimmste 'ne Laufvariable, bildest den Variablennamen wa-z00 bis wa-z99 dynamisch mit wa-z<index> ab, und füllst die 100 wa-z<index>-Felder mit den passenden Werten aus den vorhandenen 100 z<index>-Feldern.

Code: Alles auswählen.

Mache 100-mal:

move z<index> to w<index>.

Nach den 100 Schleifendurchläufen:

APPEND wa TO excel.
Any ideas?

Re: Denkanstoß bei ASSIGN Field-Symbols

Beitrag von ewx (Top Expert / 4849 / 313 / 642 ) »
Ob du nun "Z001" oder WA_IRGENDWAS-FELD001" dynamisch ASSIGNst ist wurscht.
Also CONCAT "Z" + zaehler
oder CONCAT "STRUKTUR-FELD" + zaehler
ASSIGN ('Z001') to <z>.
ASSIGN ('STRUC-F001') to <w>.
<w> = <z>.

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


Re: Denkanstoß bei ASSIGN Field-Symbols

Beitrag von JHM (Top Expert / 1197 / 1 / 197 ) »
sapdepp hat geschrieben:Das mit der runden Klammer wird nix, und die zweite Zeile meine ich anders.
Sorry, wenn über Name gearbeitet wird muss bei ASSIGN COMPONETE ohne Klammer der Name per CHAR-Variable übergeben werden.

kleines Demo:

Code: Alles auswählen.

REPORT  ztest.

TYPES: BEGIN OF ts_data,
         z01 TYPE c LENGTH 10,
         z02 TYPE c LENGTH 10,
         z03 TYPE c LENGTH 10,
         z04 TYPE c LENGTH 10,
         z05 TYPE c LENGTH 10,
       END   OF ts_data.

DATA: gs_data_from TYPE ts_data,
      gs_data_to   TYPE ts_data.

DATA: gv_fieldname TYPE c LENGTH 3,
      gv_counter   TYPE n LENGTH 2.

FIELD-SYMBOLS: <gv_field_from> TYPE ANY.
FIELD-SYMBOLS: <gv_field_to> TYPE ANY.

START-OF-SELECTION.
* From-Daten füllen
  DO 5 TIMES.
*   Dynamischer Zugriff auf die Felder über Schleifenzähler:
    ASSIGN COMPONENT sy-index OF STRUCTURE gs_data_from TO <gv_field_from>.
    WRITE sy-uzeit TO <gv_field_from>.
  ENDDO.

* To-Daten füllen
  DO 5 TIMES.
*   Feldname aus Index bastelen
    WRITE sy-index TO gv_counter RIGHT-JUSTIFIED NO-SIGN. "für CONCATENATE konvertieren
    TRANSLATE gv_counter USING ' 0'.
    CONCATENATE 'Z' gv_counter INTO gv_fieldname .
*  Dynamischer Zugriff auf die Felder über Feldnamen
    ASSIGN COMPONENT gv_fieldname OF STRUCTURE gs_data_to   TO <gv_field_to>.
    ASSIGN COMPONENT gv_fieldname OF STRUCTURE gs_data_from TO <gv_field_from>.

    <gv_field_to> = <gv_field_from>.
  ENDDO.

  WRITE: / gs_data_from,
         / gs_data_to.

Folgende Benutzer bedankten sich beim Autor JHM für den Beitrag:
sapdepp

Gruß Hendrik

Vergleichbare Themen

1
Antw.
2450
Views
Field-symbols Assign-Component
von vincent_36 » 01.12.2005 18:28 • Verfasst in ABAP® Core
3
Antw.
2045
Views
field symbols
von Riceman » 20.03.2006 15:08 • Verfasst in ABAP® Core
13
Antw.
6440
Views
Field Symbols
von Trulchen » 27.06.2014 08:10 • Verfasst in ABAP® für Anfänger
7
Antw.
3090
Views
field symbols
von bohne » 20.10.2006 15:07 • Verfasst in ABAP® für Anfänger
13
Antw.
12214
Views
Field-Symbols
von cschmoel » 23.08.2012 09:21 • Verfasst in ABAP® für Anfänger

Aktuelle Forenbeiträge

Daten an Tabelle binden
vor 4 Stunden von Bright4.5 3 / 1476
Regex in where
vor 6 Stunden von tar 6 / 143
Programm anlegen mit Vorlage
vor 21 Stunden von DeathAndPain 2 / 126
IT0024 Qualifikationen CP-ID
vor 21 Stunden von DeathAndPain 2 / 355

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.

Aktuelle Forenbeiträge

Daten an Tabelle binden
vor 4 Stunden von Bright4.5 3 / 1476
Regex in where
vor 6 Stunden von tar 6 / 143
Programm anlegen mit Vorlage
vor 21 Stunden von DeathAndPain 2 / 126
IT0024 Qualifikationen CP-ID
vor 21 Stunden von DeathAndPain 2 / 355

Unbeantwortete Forenbeiträge

BUSOBJEKT zu CMIS PHIO ermitteln
vor 23 Stunden von snooga87 1 / 86
aRFC im OO-Kontext
vor 5 Wochen von ralf.wenzel 1 / 3261
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9821