gelöst Wert aus ITAB Spalten einer dynamischen Tabelle zuweisen


Getting started ... Alles für einen gelungenen Start.

Moderatoren: Jan, Steff

gelöst Wert aus ITAB Spalten einer dynamischen Tabelle zuweisen

Beitragvon Akatash » 16.01.2017, 10:21

Hallo zusammen!

Ich hänge nun schon 2 Tage an einem Problem welches einfach nicht in meinen Kopf will, aber vielleicht kann mir ja hier jemand helfen.
Also folgendes ich habe eine interne Tabelle mit der Struktur:
ZMONTH / VBELN / WMENG (kumuliert auf Monatsbasis)

und eine dynamische Tabelle die zur Laufzeit generiert wird je nachdem welchen Betrachtungszeitraum der Anwender eingibt im Selektionsbildschirm, nur um das zu verdeutlichen sagen wir mal 3 Monate Betrachtungszeitraum:
VBELN / 2016_11 / 2016_12 / 2017_1

In dem Feld ZMONTH der internen Tabelle stehen eben genau diese Spaltenbezeichner der dynamischen Tabelle, ich hab schon einiges versucht, aber leider ohne Erfolg. Was ich nun gerne machen würde ist, dass WMENG der richtigen Spalte der dynamischen Tabelle zugewiesen wird, so das ich je VBELN eine Art Lieferabrufhistorie habe die wie folgt aussehen sollte:
VBELN 2016_11 2016_12 2017_1
4711 5.000 6.000 7.500

Danke schonmal im Vorraus für eure Hilfe!
Akatash
ForumUser
 
Beiträge: 14
Registriert: 16.01.2017, 10:09
Dank erhalten: 0 mal
Ich bin: Berater/in

Sponsor

Alte ABAP-Entwicklerweisheit: Weißt du weder aus noch ein, baust du einen BADI ein

Re: Wert aus ITAB Spalten einer dynamischen Tabelle zuweisen

Beitragvon black_adept » 16.01.2017, 10:32

Lies die mal die Doku zum Befehl "ASSIGN... COMPONENT" durch. Das ist das was dir fehlt
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de
black_adept
Top Expert
 
Beiträge: 2574
Registriert: 08.01.2003, 13:33
Wohnort: Lehrte ( bei Hannover )
Dank erhalten: 347 mal
Ich bin: Freiberufler/in

Re: Wert aus ITAB Spalten einer dynamischen Tabelle zuweisen

Beitragvon Akatash » 16.01.2017, 10:37

Ja das mit ASSIGN COMPONENT hab ich schon getestet, aber wohl irgendwie falsch, denn er hat mir die VBELN richtig angefügt und dann die Menge in einer neuen Zeile und in die letzte Spalte nicht in die passende dazu. Evtl hast Du ja nen kleines Codeschnipsel wie das ungefähr aussehen müsste ? Wäre sehr nett...
Akatash
ForumUser
 
Beiträge: 14
Registriert: 16.01.2017, 10:09
Dank erhalten: 0 mal
Ich bin: Berater/in

Re: Wert aus ITAB Spalten einer dynamischen Tabelle zuweisen

Beitragvon black_adept » 16.01.2017, 10:58

Pseudocode:
Code: Alles auswählen
 2 Tabellen:  t_kum mit den kumulierten Werten, t_dyn mit den dynamischen spalten
loop at t_kum assigning <ls_kum>.
  tabelleneintrag in t_dyn zum Beleg finden und in Feldsymbol <ls_dyn> ablegen.  
  Wenn dieser noch nicht existiert einfügen und neuen Eintrag in <ls_dyn> ablegen.
  ASSIGN COMPONENT zmonth of structure <ls_dyn> to <lv_monatsspalte>.  
* Wenn das nicht klappt im Debugger schauen ob zmonth richtig gefüllt ist und es auch wirklich eine Spalte gibt, die genau so heißt.
  add  <ls_kum>-wmeng to <lv_monatsspalte>.
   
endloop.
 
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de
black_adept
Top Expert
 
Beiträge: 2574
Registriert: 08.01.2003, 13:33
Wohnort: Lehrte ( bei Hannover )
Dank erhalten: 347 mal
Ich bin: Freiberufler/in

Re: Wert aus ITAB Spalten einer dynamischen Tabelle zuweisen

Beitragvon Akatash » 16.01.2017, 14:24

Erstmal Danke für Deine schnelle Hilfe, aber wie finde ich die richtige Spalte der dynamischen Tabelle heraus an die ich dann anfügen muss, soviel ich weiß gibt es ja nicht sowas wie einen Spaltenindex in ABAP, weil rein theoretisch müsste das ja sowas sein :

Code: Alles auswählen
If <wa_kum>-zmonth = <lv_spaltenname>
 ASSIGN....WMENG


In <wa_kum>-zmonth steht ja sogesehen der Spaltenname der dynamischen Tabelle, ich weiß nur nicht wie ich den Vergleich des Inhalts von ZMonth mit jeder Spalte der dynamischen Tabelle mache, da von meiner Logik her ja ein Vergleich statt finden müsste und falls dieser erfolgreich ist soll <wa_kum>-wmeng in die Spalte der dynamischen Tabelle die zb: 2016_12 heisst eingetragen werden.

Also steh da ein wenig auf dem Schlauch noch immer, wäre nett wenn mir jemand sagen könnte wie ich die einzelnen Spalten der dynamischen Tabelle abfragen und ansprechen kann.

Code: Alles auswählen
ASSIGN COMPONENT 'VBELN' OF STRUCTURE <wa_dyn_table> to <w_field>.
<w_field> = <wa_res>-vbeln.


also der Teil funktioniert innerhalb des Loops, aber danach weiß ich einfach nicht wie ich anhand von ZMONTH aus <wa_kum> die richtige Spalte finde....
Außerdem glaube hab ich ein weiteres Problem, denn WMENG ist ja vom Typ QUAN und die Spalten meiner dynamischen Tabelle sind logischerweise vom Typ C, da ich ja die Spaltennamen aus ARBDT zusammengebaut hatte, ich denke das wird mich dann noch vor ein weiteres Problem stellen oder mache ich mir da umsonst Sorgen ?
Akatash
ForumUser
 
Beiträge: 14
Registriert: 16.01.2017, 10:09
Dank erhalten: 0 mal
Ich bin: Berater/in

Re: Wert aus ITAB Spalten einer dynamischen Tabelle zuweisen

Beitragvon black_adept » 16.01.2017, 15:55

Schau dir mal dieses "halbdynamische" Beispiel an. Die dyn. Tabelle habe ich hart definiert damit es dir einfacher wird es zu verstehen - aber die Verfahrensweise ist im volldynamischen Fall analog nur etwas schwerer lesbar, da dann auch auf weitere Felder dynamisch zugegriffen werden muss.
Aber zu Demozwecken sollte das hier ausreichen.
Code: Alles auswählen
REPORT.



TYPES: BEGIN OF ts_kum,
         spmon TYPE spmon,
         vbeln TYPE vbeln,
         wmeng TYPE wmeng,
       END OF ts_kum,
       tt_kum TYPE STANDARD TABLE OF ts_kum WITH NON-UNIQUE DEFAULT KEY.

TYPES: BEGIN OF ts_dyn,
         vbeln        TYPE vbeln,
         wmeng_201611 TYPE wmeng,
         wmeng_201612 TYPE wmeng,
         wmeng_201701 TYPE wmeng,
       END OF ts_dyn,
       tt_dyn TYPE STANDARD TABLE OF ts_dyn WITH NON-UNIQUE DEFAULT KEY.

DATA: gt_kum TYPE tt_kum,
      gs_kum TYPE ts_kum,
      gt_dyn TYPE tt_dyn,
      gs_dyn like line of gt_dyn.

FIELD-SYMBOLS: <ls_dyn>   LIKE LINE OF gt_dyn,
               <lv_field> TYPE wmeng.


DEFINE build_testdata.
  gs_kum-spmon = &amp;1.
  gs_kum-vbeln = &amp;2.
  gs_kum-wmeng = &amp;3.
  append gs_kum to gt_kum.
END-OF-DEFINITION.




END-OF-SELECTION.
* Testdaten -
  build_testdata: '201611' '0000011111' 10,
                  '201612' '0000011111' 20,
                  '201701' '0000011111' 40,
                  '201611' '0000022222' 50,
                  '201611' '0000022222' 60,  " 2. Eintrag mit selbem Schlüssel
                  '201612' '0000022222' 70,
                  '201611' '0000033333' 80,
                  '201611' '0000033333' 90,  " 2. Eintrag mit selbem Schlüssel
                  '201611' '0000033333' 100,
                  '201612' '0000033333' 110,
                  '201611' '0000044444' 120,
                  '201701' '0000044444' 130.

  LOOP AT gt_kum INTO gs_kum.
    LOOP AT gt_dyn ASSIGNING <ls_dyn> WHERE ('VBELN = gs_kum-vbeln').
      EXIT.
    ENDLOOP.
    if sy-subrc <> 0.
      clear gs_dyn.
      gs_dyn-vbeln = gs_kum-vbeln.
      append gs_dyn to gt_dyn ASSIGNING <ls_dyn>.
    endif.

    data: spaltenname type string.
    spaltenname = |WMENG_{ gs_kum-spmon }|.
    assign COMPONENT spaltenname of STRUCTURE <ls_dyn> to <lv_field>.
    if sy-subrc = 0.
      add gs_kum-wmeng to <lv_field>.
    endif.
  ENDLOOP.

  break-point.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de
black_adept
Top Expert
 
Beiträge: 2574
Registriert: 08.01.2003, 13:33
Wohnort: Lehrte ( bei Hannover )
Dank erhalten: 347 mal
Ich bin: Freiberufler/in

Re: Wert aus ITAB Spalten einer dynamischen Tabelle zuweisen

Beitragvon Akatash » 16.01.2017, 17:04

Danke DIr für die Mühe und ja ich hab das jetzt so ungefähr verstanden wie es funktioniert, aber muss das ja eh noch ein paarmal machen für Materialverbrauch usw, da werd ich dann noch besser durchsteigen. Mein Code sieht nun so aus:

Code: Alles auswählen
  LOOP AT gt_res INTO wa_res.

    LOOP AT <t_dyn_table> ASSIGNING <wa_dyn_table> WHERE ('VBELN = wa_res-vbeln').
      EXIT.
    ENDLOOP.
    IF sy-subrc <> 0.
      CLEAR <wa_dyn_table>.
      <wa_dyn_table> = wa_res-vbeln.
      APPEND <wa_dyn_table> TO <t_dyn_table> ASSIGNING <wa_dyn_table>.
    ENDIF.

    spaltenname = ( wa_res-zmonth ).
    ASSIGN COMPONENT spaltenname OF STRUCTURE <wa_dyn_table> TO <w_field>.
    IF sy-subrc = 0.
      ADD wa_res-wmeng TO <w_field>.
    ENDIF.


  ENDLOOP.


Also rein von der Logik her müsste das so stimmen, also zumindest kommt das richtige Ergebnis raus, wo ich mir gerade noch ein wenig Sorgen mache ist bei
Code: Alles auswählen
     <wa_dyn_table> = wa_res-vbeln.

Konnte das nur so machen, da ja VBELN in beiden Tabellen die erste Spalte ist, weil wenn ich
Code: Alles auswählen
<wa_dyn_table>-vbeln = wa_res-vbeln.

mache, dann sagt er mir "<wa_dyn_table> besitzt keine Struktur und deswegen auch keine Komponente VBELN"

Wenn Du da noch nen Tipp hast wie ich das komplett richtig machen kann, weil ich weiß das so wie es gerade ist unter Umständen krachen kann, wäre ich Dir dankbar, wenn nicht auch ok, dann wart ich mal auf mehr Testdaten und schau einfach mal was passiert. Auf jeden Fall vielen vielen Danke, wäre ich niemals von alleine darauf gekommen. Aber mir fällt gerade ein es gibt sowieso nur immer einen Lieferplan der historisch betrachtet wird und dann dem Verbrauch gegenübergestellt werden soll, also müsste das an sich so passen.
Akatash
ForumUser
 
Beiträge: 14
Registriert: 16.01.2017, 10:09
Dank erhalten: 0 mal
Ich bin: Berater/in

Re: Wert aus ITAB Spalten einer dynamischen Tabelle zuweisen

Beitragvon black_adept » 16.01.2017, 23:18

1. Möglichkeit mit Assign ( ist die wohl häufiger empfohlene )
Code: Alles auswählen
FIELD-SYMBOLS: <vbeln> type vbeln_va.
Assign component 'VBELN' of structure <wa_dyn_table> to <vbeln>.
if sy-subrc = 0.
  <vbeln> = wa_res-vbeln.
endif.


2. Möglichkeit mit MOVE-CORRESPONDING ( das verwende ich üblicherweise, da hier der Syntaxcheck hilft diverse Schreibfehler direkt zu erkennen )
Code: Alles auswählen
DATA: BEGIN OF ls_known_fields,
        vbeln type vbeln,
      END OF ls_known_fields.

ls_known_fields-vbeln = wa_res-vbeln.
MOVE-CORRESPONDING ls_known_fields TO <wa_dyn_table>.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Für diese Nachricht hat black_adept einen Dank bekommen :
Akatash
black_adept
Top Expert
 
Beiträge: 2574
Registriert: 08.01.2003, 13:33
Wohnort: Lehrte ( bei Hannover )
Dank erhalten: 347 mal
Ich bin: Freiberufler/in

Re: Wert aus ITAB Spalten einer dynamischen Tabelle zuweisen

Beitragvon Akatash » 20.01.2017, 18:41

Danke für die erneute Hilfe und die verspätete Rückmeldung, aber musste in der Zwischenzeit was anderes machen und nun hab ich leider noch eine neue Anforderung zu diesem Thema hierbekommen. Es funktioniert auch halbwegs nur die Zuordnung stimmt nicht, soll jetzt nämlich auch noch die Lieferabrufe bei der Ausgabe mit integrieren und somit hab ich das Problem das er mir nicht 5 Zeilen macht sondern 30 weil es sind nur 5 Lieferabrufe. Er fängt dann immer eine neue Zeile an und ich glaube das liegt daran, dass ich in die WHERE Klausel doch noch das Feld LABNK einbauen muss nur wenn ich das über AND verknüpfe, dann sagt er mir "nur statische Typen sind erlaubt". Hier erstmal der Code so wie er aktuell aussieht, evtl hab ich auch einfach einen Denkfehler bei dem LOOP, evtl kannst Du Dir das ja nochmal kurz anschauen, wäre nett.


Code: Alles auswählen
  field-symbols: <vbeln> type vbeln,
                 <labnk> type labnk.
  create data wa_dyn_table like line of <t_dyn_table>.
  assign wa_dyn_table->* to <wa_dyn_table>.

  loop at gt_res into wa_res.

    loop at <t_dyn_table> assigning <wa_dyn_table> where (('VBELN = wa_res-vbeln') AND ('LABNK = wa_res-LABNK')) * wird zwar hier richtig dargestellt, aber in SAP krieg ich da eine Fehlermeldung.
*      LOOP AT <t_dyn_table> ASSIGNING <wa_dyn_table> WHERE ('LABNK = wa_res-LABNK').
*      EXIT.
*      ENDLOOP.

      exit.
    endloop.

    clear <wa_dyn_table>.
    assign component 'VBELN' of structure <wa_dyn_table> to <vbeln>.
    if sy-subrc = 0.
      <vbeln> = wa_res-vbeln.
    endif.

    assign component 'LABNK' of structure <wa_dyn_table> to <labnk>.
    if sy-subrc = 0.
      <labnk> = wa_res-labnk.
    endif.


    spaltenname = ( wa_res-zmonth ).
    assign component spaltenname of structure <wa_dyn_table> to <w_field>.
    if sy-subrc = 0.
      add wa_res-wmeng to <w_field>.
    endif.
    append <wa_dyn_table> to <t_dyn_table>.

  endloop.


Die Ausgabe sieht jetzt so aus siehe Anhang:

Die Ausgabe sollte aber wie gesagt nur 5 Zeilen haben mit den kumulierten Werten und mir ist aufgefallen, dass ich in der ersten Zeile keine Abrufnummer habe, wenn ich mir das im Debugger anschaue, dann entfernt er komischerweise auch die erste Zeile bei allen anderen stimmt es, also hab ich da wohl auch noch einen Fehler drin...
Was auch noch gut wäre wenn nur in der ersten Zeile die VBELN stehen würde und dann die ganzen Abrufe siehe Anhang, das er jede Zeile die VBELN schreibt ist in meinen Augen ein wenig unübersichtlich.

Wäre für jede Hilfe dankbar...
Akatash
ForumUser
 
Beiträge: 14
Registriert: 16.01.2017, 10:09
Dank erhalten: 0 mal
Ich bin: Berater/in

Re: Wert aus ITAB Spalten einer dynamischen Tabelle zuweisen

Beitragvon Akatash » 21.01.2017, 20:38

So bin schon mal ein Stück weiter gekommen und mir ist klar das durch den APPEND ich immer unten alles angefügt bekomme, deswegen lautet nun meine Frage, wie bekomm ich es hin, das als Resultat nur 5 Zeilen rauskommen ? Ich denke das müsste ich wieder über einen Loop lösen und und irgendeiner Bedingung, aber sitze heute schon die ganze Zeit dran und komm irgendwie auf keinen grünen Zweig. Wäre nett wenn mir da jemand weiterhelfen könnte, weil ich denke ich bin ziemlich nah an der Lösung....
Mittlerweile tendier ich fast dazu, das <wa_dyn_table> komplett aus der gt_res befüllen zu lassen mit ein paar checks und dann mit einem Append am Ende anzufügen, die Frage ist nur wie mach ich das, weil über READ TABLE nach einem bestimmten KEY kann ich es nicht lösen, da die Werte je nach Eingabe des Anwenders dynamisch generiert werden... naja evtl hat ja irgendjemand ne Idee wie man die Problemstellung am schlausten lösen kann.

Aktueller Code:
Code: Alles auswählen
FIELD-SYMBOLS: <vbeln> TYPE vbeln,
                 <labnk> TYPE labnk.
*                 <wa_res> like LINE OF gt_res.
  CREATE DATA wa_dyn_table LIKE LINE OF <t_dyn_table>.
  ASSIGN wa_dyn_table->* TO <wa_dyn_table>.


  SORT gt_res BY zmonth labnk.

  LOOP AT gt_res INTO wa_res.

      IF <wa_dyn_table> IS NOT ASSIGNED.

        APPEND INITIAL LINE TO <t_dyn_table> ASSIGNING <wa_dyn_table>.
      ENDIF.

    CLEAR <wa_dyn_table>.
    IF <vbeln> IS NOT ASSIGNED.
      ASSIGN COMPONENT 'VBELN' OF STRUCTURE <wa_dyn_table> TO <vbeln>.
    ELSE.
        <vbeln> = wa_res-vbeln.
    ENDIF.
    IF sy-subrc = 0.
      <vbeln> = wa_res-vbeln.
    ENDIF.

    ASSIGN COMPONENT 'LABNK' OF STRUCTURE <wa_dyn_table> TO <labnk>.
    IF sy-subrc = 0.
      <labnk> = wa_res-labnk.
    ENDIF.

    spaltenname = ( wa_res-zmonth ).
    ASSIGN COMPONENT spaltenname OF STRUCTURE <wa_dyn_table> TO <w_field>.
    IF sy-subrc = 0.
      ADD wa_res-wmeng TO <w_field>.
    ENDIF.
    APPEND <wa_dyn_table> TO <t_dyn_table>.

  ENDLOOP.


Ergebnis sieht aktuell nun so aus siehe Anhang.... das wäre auch richtig nur die Werte von 2017_2 usw müssten in derselben Zeile stehen wie bei 2017_1:
Akatash
ForumUser
 
Beiträge: 14
Registriert: 16.01.2017, 10:09
Dank erhalten: 0 mal
Ich bin: Berater/in

Re: Wert aus ITAB Spalten einer dynamischen Tabelle zuweisen

Beitragvon hausi » 21.01.2017, 23:57

Hallo aktash,

ich hoffe ich liege jetzt nicht daneben, aber ich denke dein Loop ist eher ungeschickt - vor allem weil du ihn anscheinend wirklich nur zum lesen nutzt und gleich wieder raus gehst...
Versuchs doch lieber mit einem READ TABLE...
Die ganzen Klammern sehe ich ehrlich gesagt auch das erste mal - ich vermute das überträgst du aus einer anderen Sprache? Klärt mich hier gern auf, wenn das in ABAP auch relevant ist.

Code: Alles auswählen
READ TABLE <t_dyn_table> ASSIGNING <wa_dyn_table> WITH KEY vbeln = wa_res-vbeln labnk = wa_res-labnk.


Außerdem glaube ich, dass du dich mit den ganzen FIELD SYMBOLS ein wenig verkünstelst - kannst du nicht einfach normale Strukturen füllen und am Ende zu einer Tabelle zusammensetzen?
Baue dir eine Struktur mit Feldern deiner Ausgabetabelle und schau mal ob das so geht


Code: Alles auswählen
      loop at gt_res into wa_res.

        READ TABLE <t_dyn_table> INTO ls_wa_dyn_table WITH KEY vbeln = wa_res-vbeln labnk = wa_res-labnk.  

        ls_wa_dyn_table-spaltenname = wa_res-zmonth.

        append ls_wa_dyn_table to <t_dyn_table>.

      endloop.
hausi
ForumUser
 
Beiträge: 50
Registriert: 10.07.2015, 15:03
Dank erhalten: 1 mal
Ich bin: Entwickler/in

Re: Wert aus ITAB Spalten einer dynamischen Tabelle zuweisen

Beitragvon Akatash » 22.01.2017, 03:01

Hallo hausi,

ich geh mal von aus Du meinst die <>. Falls ja das kann ich Dir eklären das kommt nicht aus einer anderen Sprache sondern sind Feldsymbole in ABAP und das kommt daher, dasss ich zur Laufzeit eine dynamische Tabelle generiere, welche durch die Benutzereingaben des Anwenders definiert wird. Der Anwender gibt VBELN ein dann ein Stichttagsdatum und einen Betrachtungszeitraum für welchen die Analyse erfolgen soll. Da ich nicht weiß, was der Anwender eingeben wird und somit nie eine feste Struktur habe, muss das alles dynamisch zur Laufzeit generiert werden, d.h. die Feldsymbole zeigen nur auf den Arbeitsspeicher zur Laufzeit wo der Wert steht, das Feldsymbol selbst hat sogesehen keine Struktur die man direkt ansprechen kann.

Das mit dem READ TABLE hab ich mir auch schon überlegt, dass ich aus meiner ITAB über den KEY die dementsprechenden Sätze suche und dann meine WA damit zusammen baue. Das Problem daran ist dann nur, dass ich als KEY ZMONTH und LABNK hätte und ZMONTH eben auch dynamisch erzeugt wird sprich der Wert wird zur Laufzeit anhand der Benutzereingabe in die ITAB geschrieben, also kann ich keinen KEY definieren, da ich die Werte nicht weiß. Der KEY VBELN und LABNK nützt in dem Fall nichts, denn der Anwender gibt nur eine VBELN ein die dann dutzende LABNKs hat, sogesehen ist VBELN immer eindeutig und nur einmal vorhanden, der richtige KEY ist eben ZMONTH + LABNK.

Aber auf jeden Fall mal danke für Deine Anregung, ich werde mal später das trotzdem mit READ TABLE versuchen. Bin auf jeden Fall für jeden weiteren Ratschlag dankbar, denn diese Problemstellung treibt mich langsam in den Wahnsinn...

Gute Nacht :D
Akatash
ForumUser
 
Beiträge: 14
Registriert: 16.01.2017, 10:09
Dank erhalten: 0 mal
Ich bin: Berater/in

Re: Wert aus ITAB Spalten einer dynamischen Tabelle zuweisen

Beitragvon a-dead-trousers » 22.01.2017, 09:21

hi!

Ich würde die "Gruppierung" die du offensichtlich haben möchtest, über deine Datentabelle bewerkstelligen.
Code: Alles auswählen
loop at gt_res assigning <ls_res>
  group by VBELN = <ls_res>-vbeln LABNK = <ls_res>-labnk
  assigning <ls_group>.

  APPEND INITIAL LINE TO <t_dyn_table> ASSIGNING <wa_dyn_table>.
  ASSIGN COMPONENT 'VBELN' OF STRUCTURE <wa_dyn_table> TO <vbeln>.
  <vbeln> = <ls_group>-vbeln.
 
  ASSIGN COMPONENT 'LABNK' OF STRUCTURE <wa_dyn_table> TO <labnk>.
  <labnk> = wa_res-labnk.
 
  loop at group <ls_group> assigning <ls_group_res>.
    spaltenname = ( <ls_group_res>-zmonth ).
    ASSIGN COMPONENT spaltenname OF STRUCTURE <wa_dyn_table> TO <w_field>.
    IF sy-subrc = 0.
      ADD <ls_group_res>-wmeng TO <w_field>.
    ENDIF.  
  endloop.
endloop.

Das ist Code mit Basis 7.40 sollte aber zur Veranschaulichung reichen. Es geht auch ohne die neuen Schlüsselwörter ist aber etwas aufwändiger. Wenn interesse besteht kann ich es auch "downgraden".

lg ADT
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.07
Basis: 7.40
a-dead-trousers
Top Expert
 
Beiträge: 2571
Registriert: 07.02.2011, 13:40
Dank erhalten: 581 mal
Ich bin: Entwickler/in

Re: Wert aus ITAB Spalten einer dynamischen Tabelle zuweisen

Beitragvon Akatash » 22.01.2017, 14:26

Hallo ADT,

danke für Deine Hilfe ich werd das dann später mal per VPN am System testen, aber generell würde mich so oder so die "downgrade" Version interessieren, denn sowas kann an sich nie schaden, wenn ich mal wieder auf so eine Aufgabenstellung treffen sollte. Danke schon mal im Vorraus für Deine Mühe.

LG
Akatash
ForumUser
 
Beiträge: 14
Registriert: 16.01.2017, 10:09
Dank erhalten: 0 mal
Ich bin: Berater/in

Re: Wert aus ITAB Spalten einer dynamischen Tabelle zuweisen

Beitragvon black_adept » 22.01.2017, 16:46

Akatash hat geschrieben:[...] Er fängt dann immer eine neue Zeile an und ich glaube das liegt daran, dass ich in die WHERE Klausel doch noch das Feld LABNK einbauen muss nur wenn ich das über AND verknüpfe, dann sagt er mir "nur statische Typen sind erlaubt".

Warum schreibst du auch das AND außerhalb der dynamischen WHERE-Bedingung? Alles zusammen in einen String und alles ist easy.
Code: Alles auswählen
REPORT.  " DÖF


FIELD-SYMBOLS: <gt_test> TYPE STANDARD TABLE.
DATA: gt_t005 TYPE STANDARD TABLE OF t005 WITH NON-UNIQUE DEFAULT KEY,
      begin of gs_relevant_fields,
        land1 type t005-land1,
      end of gs_relevant_fields,
      gs_t005t type t005t.

PARAMETERS: p_waers TYPE t005-waers OBLIGATORY DEFAULT 'EUR',
            p_spras TYPE t005-spras OBLIGATORY DEFAULT 'D'.

SELECT * FROM t005 INTO TABLE gt_t005.
ASSIGN gt_t005 TO <gt_test>.


*LOOP AT <gt_test> ASSIGNING FIELD-SYMBOL(<gs_line>) WHERE ('Bedingung1 AND Bedingung2').
LOOP AT <gt_test> ASSIGNING FIELD-SYMBOL(<gs_line>) WHERE ('WAERS = p_waers AND SPRAS = p_spras').
  MOVE-CORRESPONDING <gs_line> to gs_relevant_fields.
  select single *
    into gs_t005t
    from t005t
    where land1 = gs_relevant_fields-land1
      and spras = sy-langu.
  WRITE:/ gs_t005t-landx.
ENDLOOP.

Akatash hat geschrieben:Mittlerweile tendier ich fast dazu, das <wa_dyn_table> komplett aus der gt_res befüllen zu lassen mit ein paar checks und dann mit einem Append am Ende anzufügen, die Frage ist nur wie mach ich das, weil über READ TABLE nach einem bestimmten KEY kann ich es nicht lösen, da die Werte je nach Eingabe des Anwenders dynamisch generiert werden... naja evtl hat ja irgendjemand ne Idee wie man die Problemstellung am schlausten lösen kann.

Weil es keinen dynamischen READ gibt ( naja - irgendwie gibts das schon - ist aber nicht sonderlich schön das zu verwenden und Lesbarkeit leidet stark darunter ) nimm halt den dynamischen LOOP.. WHERE. EXIT. ENDLOOP. Das enstpricht dem dyn. READ und die WHERE-Bedingung kann eben auch sehr gut lesbar sein ( siehe Beispiel ) und beliebig komplex mit Mischformen aus Konstanten und Programmvariablen.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de
black_adept
Top Expert
 
Beiträge: 2574
Registriert: 08.01.2003, 13:33
Wohnort: Lehrte ( bei Hannover )
Dank erhalten: 347 mal
Ich bin: Freiberufler/in

Nächste

Zurück zu ABAP® für Anfänger

  Aktuelle Beiträge   
CL_ABAP_CLASSDESCR und Syntaxfehler
vor 4 Stunden von black_adept 1 Antw.
Parameter-ID für Z-Programme einrichten
vor 9 Stunden von wreichelt 1 Antw.
PDF-Datei nach Upgrade deutlich zu groß
Gestern von ewx 1 Antw.
Vier-Augen-Prinzip auf dem Geschäftspartner
Gestern von ralf.wenzel 3 Antw.
Zugriff mittels VBA auf Remotebaustein
Gestern von Romaniac 1 Antw.

  Ähnliche Beiträge beta
Alle Spalten durchlaufen und Wert zuweisen
12.10.2009, 08:35 von simethandreas 0 Antw.
Alle Spalten durchlaufen und Wert zuweisen
12.10.2009, 13:30 von Ratazong 3 Antw.
Werte einer int. Tabelle in einer int. Tabelle zuweisen
01.03.2007, 12:26 von JHM 1 Antw.
gelöst Datenbank Wert zuweisen
26.01.2017, 13:55 von black_adept 5 Antw.
Wert einer Tabelle ändern???
01.03.2006, 15:25 von der.bahnfahrer 8 Antw.

 

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder

Feedback ...?

Was können wir verbessern? Hinterlasse deine Kontaktdaten, wenn du eine direkte Antwort möchtest.

... Absenden!