dynamisch interne Tabelle füllen

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

dynamisch interne Tabelle füllen

Beitrag von LittleT (ForumUser / 48 / 0 / 0 ) »
Hallo alle zusammen,

ich habe ein riesen Problem (zumindest für mich). Ich habe ein Selektionsbildschirm mit dem ich ein Jahresintervall angeben kann. Bsp. von 2005 bis 2007. Daraufhin soll ich den Jahresverbrauch ermitteln und als ALV anzeigen lassen.
Die interne Tabelle bastel ich mir schon dynamisch zusammen (mit generate Report). Aber beim fuellen hab ich noch ein Problem.
Anbei der Code.

Code: Alles auswählen.

do hv_anzahl times varying.

   select gsv01 gsv02 gsv03 gsv04 gsv05 gsv06 gsv07 gsv08 gsv09 gsv10
          gsv11 gsv12 gsv12
     into
     (v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13)
     from mver
     where
     matnr = zzmatnr and
     werks = zzwerks and
     gjahr = year_begin.

     gv = v1 + v2 + v3 + v4 + v5 + v6 + v7 + v8 + v9 + v10 + v11 +
          v12 + v13.

*    Das muss noch dynamisch werden
     alv_ou-(year_begin) = gv.

     year_begin = year_begin + 1.

  endselect.
enddo.
Ich addiere also die ganzen Felder auf (wahrscheinlich gibts da bessere Lösungen). Meine Interne Tabelle hat in obigen Beispiel (2005 - 2007) folgenden Aufbau.
alv_ou-2005
alv_ou-2006
alv_ou-2007

year_begin ist mit 2005 gefüllt. Jetzt müsste ich also die interne Tabelle füllen. Geht das? So wie es im Quelltext ist ( alv_ou-(year_begin) = gv. )
funktioniert es in ABAP nicht.
Ich bin für alles offen. Auch wenn jemand sagt omg das geht viel einfacher. Ich schreib auch gern alles um, obwohl ich kurz vorm Ziel wäre. :lol:

Vielen Dank für Eure mühe schonmal.

Lieben Gruß
LittleT
Es ist nicht schlimm nichts zu wissen, nichts dagegen zu unternehmen ist schlimm.

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


Re: dynamisch interne Tabelle füllen

Beitrag von JHM (Top Expert / 1212 / 2 / 202 ) »
LittleT hat geschrieben: year_begin ist mit 2005 gefüllt. Jetzt müsste ich also die interne Tabelle füllen.
Das ganze ist mit Field-Symbols zulösen:

Code: Alles auswählen.

* Zeiger auf das Feld in der Struktur
FIELD-SYMBOLS: <fs> TYPE any. "besser Type von alv_ou-year.

* Nimmt Feldnamen auf
DATA: g_fieldname type string.

* Feldnamen zusammenbasteln
CONCATENATE 'ALV_OU-' 
                         year_begin 
               INTO g_fieldname.

* Zeiger auf Feld ausrichten
  ASSIGN g_fieldnamen TO <fs> .
 
* Wert zuweisen
  <fs> = gv.
evtl. ginge auch:

Code: Alles auswählen.

ASSIGN COMPONENT <index>   OF STRUCTURE alv_ou   TO <fs>.
<index> ist hierbei die Stelle in der Strucktur. Also erste, zweite, oder 10 Stelle.
Gruß Hendrik

Beitrag von LittleT (ForumUser / 48 / 0 / 0 ) »
Hallo und danke JHM,

aber wenn ich deinen Quelltext dann durchdebugge dann habe ich zwar in <fs> alv_ou-2000 drinnen stehen, doch bei der Zuweisung

Code: Alles auswählen.

<fs> = gv.
steht in <fs> nun der Wert von der Variablen gv und ein append alv_ou bringt nichts mehr.
Mache ich noch was falsch?

Gruß
LittleT
Es ist nicht schlimm nichts zu wissen, nichts dagegen zu unternehmen ist schlimm.

Beitrag von LittleT (ForumUser / 48 / 0 / 0 ) »
Guten morgen alle zusammen,

ich poste jetzt nochmal meinen Quelltext wie ich ihn jetzt hab.

Code: Alles auswählen.

do hv_anzahl times.

*     Feldnamen zusammenbasteln
      CONCATENATE 'ALV_OU-' year_begin INTO g_fieldname.

*     Zeiger auf Feld ausrichten
      ASSIGN g_fieldname TO <fs> .


   select gsv01 gsv02 gsv03 gsv04 gsv05 gsv06 gsv07 gsv08 gsv09 gsv10
          gsv11 gsv12 gsv12
     into
     (v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13)
     from mver
     where
     matnr = zzmatnr and
     werks = zzwerks and
     gjahr = year_begin.

     gv = v1 + v2 + v3 + v4 + v5 + v6 + v7 + v8 + v9 + v10 + v11 +
          v12 + v13.

*    Das muss noch dynamisch werden
     <fs> = gv.
*     alv_ou-(year_begin) = gv.
      

  endselect.
  year_begin = year_begin + 1.
enddo.
  

  alv_ou-mtart = zzmtart.
  alv_ou-maktx = zzmaktx.
  alv_ou-werks = zzwerks.
  alv_ou-beskz = zzbeskz.
  alv_ou-sobsl = zzsobsl.
  alv_ou-herkl = zzherkl.
  alv_ou-matnr = zzmatnr.
  alv_ou-stawn = zzstawn.

  APPEND alv_ou.
Wie kann ich denn jetzt mit dem Feldsymbol ein append machen?

Liebe Grüße
LittleT
Es ist nicht schlimm nichts zu wissen, nichts dagegen zu unternehmen ist schlimm.

Beitrag von TWP (Specialist / 445 / 0 / 1 ) »
Guten Morgen LittleT,

wenn du deinen Append in den Select reinschreibst, dann klappt es auch mit <fs> (APPEND <fs> TO itab). Solltest du im Ergebnis nur eine Zeile pro Material / Werk haben wollen, dann solltest du statt append collect verwenden.

Einen schönen Tag wünscht

Thomas

Beitrag von LittleT (ForumUser / 48 / 0 / 0 ) »
Hallo Thomas,

jetzt bekomm ich einen Kurzdump! Bin ich jetzt zu dämlich :?:

Code: Alles auswählen.

do hv_anzahl times.

*     Feldnamen zusammenbasteln
      CONCATENATE 'ALV_OU-' year_begin INTO g_fieldname.

*     Zeiger auf Feld ausrichten
      ASSIGN g_fieldname TO <fs> .


   select gsv01 gsv02 gsv03 gsv04 gsv05 gsv06 gsv07 gsv08 gsv09 gsv10
          gsv11 gsv12 gsv12
     into
     (v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13)
     from mver
     where
     matnr = zzmatnr and
     werks = zzwerks and
     gjahr = year_begin.

     gv = v1 + v2 + v3 + v4 + v5 + v6 + v7 + v8 + v9 + v10 + v11 +
          v12 + v13.

*    Das muss noch dynamisch werden
     <fs> = gv.
*     alv_ou-(year_begin) = gv.
    alv_ou-mtart = zzmtart.
    alv_ou-maktx = zzmaktx.
    alv_ou-werks = zzwerks.
    alv_ou-beskz = zzbeskz.
    alv_ou-sobsl = zzsobsl.
    alv_ou-herkl = zzherkl.
    alv_ou-matnr = zzmatnr.
    alv_ou-stawn = zzstawn.
    collect <fs> into alv_ou.

    append alv_ou.


  endselect.
  year_begin = year_begin + 1.
enddo.
Mit Feldsymbolen kenn ich mich überhaupt nicht aus. Wozu brauch ich eigentlich das g_fieldname?

Grüße
LittleT
Es ist nicht schlimm nichts zu wissen, nichts dagegen zu unternehmen ist schlimm.

Beitrag von TWP (Specialist / 445 / 0 / 1 ) »
Hallo LittleT,

im collect sollte alv_ou stehen und nicht <fs>.

<fs> ist nur dein Feldname in deinem Falls alv_ou-2005 oder alv_ou-2006 oder alv_ou-2007, je nach dem auf welches Feld du mit assign zeigst.

Viel Erfolg

Thomas

Beitrag von JHM (Top Expert / 1212 / 2 / 202 ) »
LittleT hat geschrieben: jetzt bekomm ich einen Kurzdump!
Thomas hat schon etwas dazu geschrieben. Du mußt den COLLECT mit der ganzen Zeile machen (alv_ou). <fs> "zeigt" nur auf das FELD alv_ou-jahr_begin (Verändert sich also mit jedem Schleifendurchlauf.)
LittleT hat geschrieben: Mit Feldsymbolen kenn ich mich überhaupt nicht aus. Wozu brauch ich eigentlich das g_fieldname?
In g_fieldname steht der Name des Feldes auf den das field-sysmbole <fs> "zeigen" soll. Im ersten Durchlauf auf alv_ou-2005, im zweiten Durchlauf auf alv_ou-2006 und so weiter.

Gruß Hendrik

PS: du brauchst nur COLLECT oder APPEND.
PPS: du selektiesrt zweimal gsv12. Das zweite sollte gsv13 sein.

Beitrag von LittleT (ForumUser / 48 / 0 / 0 ) »
Hallo ihr geduldigen :-)

irgendwie glaube ich will es bei mir nicht funktionieren.

Code: Alles auswählen.

do hv_anzahl times.

*     Feldnamen zusammenbasteln
      CONCATENATE 'ALV_OU-' year_begin INTO g_fieldname.

*     Zeiger auf Feld ausrichten
      ASSIGN g_fieldname TO <fs> .


   select gsv01 gsv02 gsv03 gsv04 gsv05 gsv06 gsv07 gsv08 gsv09 gsv10
          gsv11 gsv12 gsv13
     into
     (v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13)
     from mver
     where
     matnr = zzmatnr and
     werks = zzwerks and
     gjahr = year_begin.

     gv = v1 + v2 + v3 + v4 + v5 + v6 + v7 + v8 + v9 + v10 + v11 +
          v12 + v13.

*    Das muss noch dynamisch werden
*     alv_ou-<fs> = gv.
      <fs> = gv.
*     alv_ou-(year_begin) = gv.

*    collect <fs> into alv_ou.
    alv_ou-mtart = zzmtart.
    alv_ou-maktx = zzmaktx.
    alv_ou-werks = zzwerks.
    alv_ou-beskz = zzbeskz.
    alv_ou-sobsl = zzsobsl.
    alv_ou-herkl = zzherkl.
    alv_ou-matnr = zzmatnr.
    alv_ou-stawn = zzstawn.
    collect alv_ou.
*    append alv_ou.


  endselect.
  year_begin = year_begin + 1.
enddo.
Wenn ich Debugge dann steht in <fs> zwar richtig alv_ou-2000 drinnen, aber bei der Zuweisung dann <fs> = gv. wird mir <fs> mit dem Wert z.B. 12 überschrieben.
Im ALV in der Ausgabe habe ich nur lauter 0 für den Gesamtverbrauch der einzelnen Jahre.

Liebe Grüße an die geduldigen
LittleT
Es ist nicht schlimm nichts zu wissen, nichts dagegen zu unternehmen ist schlimm.

Beitrag von LittleT (ForumUser / 48 / 0 / 0 ) »
Hallo nochmal,

also ich schreibe jetzt noch ein paar Zeilen wie ich es probiert habe, aber leider gescheitert bin.

Code: Alles auswählen.

append gv to alv_ou-<fs>.
so auch nicht:

Code: Alles auswählen.

append gv to <fs>.
Sorry, wenn ich euch auf den wecker geh, aber aus der Hilfe werde ich auch nicht schlau.

LG
LittleT
Es ist nicht schlimm nichts zu wissen, nichts dagegen zu unternehmen ist schlimm.

Beitrag von TWP (Specialist / 445 / 0 / 1 ) »
Hi LittleT,

dein Assign (ASSIGN g_fieldname TO <fs> . ) sollte so aussehen:

ASSIGN (g_fieldname) TO <fs>.

Damit hat <fs> den Feldnamen und nicht den Ihnalt von g_fieldname.


Kopf hoch.

Thomas

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
Hallo LittleT,

für solche Feldsymbol-Zugriffe benutze ich lieber folgende Variante:

Code: Alles auswählen.

ASSIGN COMPONENT year_begin OF STRUCTURE alv_ou TO <fs>.
In year_begin muss der Wert so stehen, das er als Feldname zu interpretieren ist (Typ NUMC, CHAR oder String am besten).
Damit wird auch nebenbei sichergestellt, dass ALV_OU als Struktur im Programm existiert.
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von LittleT (ForumUser / 48 / 0 / 0 ) »
Hallo alle zusammen,

Die Erlösung ist da. Vielen Dank an alle beteiligten vor allem der Vorschlag von TWP hat mich ans Ziel gebracht. Es funktioniert nun.
Den Vorschlag von ereglam werde ich auch noch ausprobieren.

Aber vielen Dank für Eure Geduld.

Ganz liebe Grüße und großes Lob an alle

LittleT
:D :D :D :D :D :D :D :D :D :D :D :D :D :D
Es ist nicht schlimm nichts zu wissen, nichts dagegen zu unternehmen ist schlimm.

Seite 1 von 1

Vergleichbare Themen

3
Antw.
3633
Views
Interne Tabelle dynamisch füllen
von stas » 27.10.2007 10:41 • Verfasst in ABAP® Core
4
Antw.
9300
Views
Dynamisch erzeugte Tabelle füllen
von reinhold_j » 16.05.2006 13:18 • Verfasst in ABAP Objects®
3
Antw.
4832
Views
Dynamisch Struktur und Tabelle generieren und füllen
von Kresiquadratur » 16.07.2007 14:32 • Verfasst in ABAP® für Anfänger
10
Antw.
6224
Views
Interne Tabelle mit Zeilen füllen
von Sonne1234 » 18.12.2019 16:30 • Verfasst in ABAP® für Anfänger
8
Antw.
5266
Views
dynamische interne Tabelle füllen
von cuncon » 20.03.2018 16:04 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag


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

Aktuelle Forenbeiträge

IF mit AND und OR
Gestern von GastX 6 / 2209
Meine Inbox
vor 2 Tagen von Rabea1103 1 / 911
PCL2 Cluster auslesen
vor 4 Tagen von DeathAndPain 2 / 2027
FUBA 'HR_INFOTYPES_OPERATION'
vor 4 Tagen von Bright4.5 3 / 7097

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

IF mit AND und OR
Gestern von GastX 6 / 2209
Meine Inbox
vor 2 Tagen von Rabea1103 1 / 911
PCL2 Cluster auslesen
vor 4 Tagen von DeathAndPain 2 / 2027
FUBA 'HR_INFOTYPES_OPERATION'
vor 4 Tagen von Bright4.5 3 / 7097