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.
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.
Folgende Benutzer bedankten sich beim Autor jensschladitz für den Beitrag: 
			sapdepp
			
 das gleiche, was du mit Znnn machst, brauchst du doch nur mit Wnnn zu machen?!
 das gleiche, was du mit Znnn machst, brauchst du doch nur mit Wnnn zu machen?!
 )
)Müsste das nicht jeweils so heißen ( Runde Klammern um das fs )sapdepp und jensschladitz hat geschrieben:Code: Alles auswählen.
... CONCATENATE 'z' COUNTER INTO fs. ASSIGN fs to <l_var>. ...
Code: Alles auswählen.
  CONCATENATE 'z' COUNTER INTO fs.
  ASSIGN (fs) to <l_var>. 
 black_adept hat geschrieben:Siehe F1-Doku zu ASSIGN...COMPONENT...
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

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

Code: Alles auswählen.
Mache 100-mal:
move z<index> to w<index>.
Nach den 100 Schleifendurchläufen:
APPEND wa TO excel.
Sorry, wenn über Name gearbeitet wird muss bei ASSIGN COMPONETE ohne Klammer der Name per CHAR-Variable übergeben werden.sapdepp hat geschrieben:Das mit der runden Klammer wird nix, und die zweite Zeile meine ich anders.
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.