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